@agent-canvas/cli 0.8.0 → 0.9.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/dist/commands/__tests__/add-arrow.test.d.ts +1 -0
- package/dist/commands/__tests__/add-arrow.test.js +186 -0
- package/dist/commands/__tests__/add-image.test.d.ts +1 -0
- package/dist/commands/__tests__/add-image.test.js +170 -0
- package/dist/commands/__tests__/add-line.test.d.ts +1 -0
- package/dist/commands/__tests__/add-line.test.js +138 -0
- package/dist/commands/__tests__/add-polygon.test.d.ts +1 -0
- package/dist/commands/__tests__/add-polygon.test.js +147 -0
- package/dist/commands/__tests__/add-shape.test.d.ts +1 -0
- package/dist/commands/__tests__/add-shape.test.js +193 -0
- package/dist/commands/__tests__/add-text.test.d.ts +1 -0
- package/dist/commands/__tests__/add-text.test.js +144 -0
- package/dist/commands/__tests__/clear.test.d.ts +1 -0
- package/dist/commands/__tests__/clear.test.js +65 -0
- package/dist/commands/__tests__/delete-elements.test.d.ts +1 -0
- package/dist/commands/__tests__/delete-elements.test.js +103 -0
- package/dist/commands/__tests__/export.test.d.ts +1 -0
- package/dist/commands/__tests__/export.test.js +187 -0
- package/dist/commands/__tests__/group-elements.test.d.ts +1 -0
- package/dist/commands/__tests__/group-elements.test.js +93 -0
- package/dist/commands/__tests__/list.test.d.ts +1 -0
- package/dist/commands/__tests__/list.test.js +134 -0
- package/dist/commands/__tests__/load.test.d.ts +1 -0
- package/dist/commands/__tests__/load.test.js +158 -0
- package/dist/commands/__tests__/move-elements.test.d.ts +1 -0
- package/dist/commands/__tests__/move-elements.test.js +117 -0
- package/dist/commands/__tests__/new-canvas.test.d.ts +1 -0
- package/dist/commands/__tests__/new-canvas.test.js +113 -0
- package/dist/commands/__tests__/read.test.d.ts +1 -0
- package/dist/commands/__tests__/read.test.js +247 -0
- package/dist/commands/__tests__/rename-canvas.test.d.ts +1 -0
- package/dist/commands/__tests__/rename-canvas.test.js +86 -0
- package/dist/commands/__tests__/resize-elements.test.d.ts +1 -0
- package/dist/commands/__tests__/resize-elements.test.js +150 -0
- package/dist/commands/__tests__/rotate-elements.test.d.ts +1 -0
- package/dist/commands/__tests__/rotate-elements.test.js +114 -0
- package/dist/commands/__tests__/save.test.d.ts +1 -0
- package/dist/commands/__tests__/save.test.js +105 -0
- package/dist/commands/__tests__/ungroup-element.test.d.ts +1 -0
- package/dist/commands/__tests__/ungroup-element.test.js +93 -0
- package/dist/commands/__tests__/use-canvas.test.d.ts +1 -0
- package/dist/commands/__tests__/use-canvas.test.js +86 -0
- package/dist/commands/add-arrow.d.ts +40 -0
- package/dist/commands/add-arrow.js +52 -0
- package/dist/commands/add-image.d.ts +26 -0
- package/dist/commands/add-image.js +66 -0
- package/dist/commands/add-line.d.ts +27 -0
- package/dist/commands/add-line.js +35 -0
- package/dist/commands/add-polygon.d.ts +26 -0
- package/dist/commands/add-polygon.js +44 -0
- package/dist/commands/add-shape.d.ts +32 -0
- package/dist/commands/add-shape.js +41 -0
- package/dist/commands/add-text.d.ts +28 -0
- package/dist/commands/add-text.js +35 -0
- package/dist/commands/clear.d.ts +17 -0
- package/dist/commands/clear.js +23 -0
- package/dist/commands/delete-elements.d.ts +20 -0
- package/dist/commands/delete-elements.js +26 -0
- package/dist/commands/export.d.ts +26 -0
- package/dist/commands/export.js +45 -0
- package/dist/commands/group-elements.d.ts +20 -0
- package/dist/commands/group-elements.js +28 -0
- package/dist/commands/list.d.ts +23 -0
- package/dist/commands/list.js +50 -0
- package/dist/commands/load.d.ts +20 -0
- package/dist/commands/load.js +67 -0
- package/dist/commands/move-elements.d.ts +22 -0
- package/dist/commands/move-elements.js +26 -0
- package/dist/commands/new-canvas.d.ts +21 -0
- package/dist/commands/new-canvas.js +29 -0
- package/dist/commands/read.d.ts +23 -0
- package/dist/commands/read.js +49 -0
- package/dist/commands/rename-canvas.d.ts +20 -0
- package/dist/commands/rename-canvas.js +27 -0
- package/dist/commands/resize-elements.d.ts +24 -0
- package/dist/commands/resize-elements.js +41 -0
- package/dist/commands/rotate-elements.d.ts +21 -0
- package/dist/commands/rotate-elements.js +26 -0
- package/dist/commands/save.d.ts +18 -0
- package/dist/commands/save.js +27 -0
- package/dist/commands/start.d.ts +0 -1
- package/dist/commands/start.js +0 -41
- package/dist/commands/ungroup-element.d.ts +20 -0
- package/dist/commands/ungroup-element.js +28 -0
- package/dist/commands/use-canvas.d.ts +20 -0
- package/dist/commands/use-canvas.js +27 -0
- package/dist/index.js +124 -518
- package/dist/lib/__tests__/image-utils.test.d.ts +1 -0
- package/dist/lib/__tests__/image-utils.test.js +123 -0
- package/dist/lib/__tests__/toon-converter.test.d.ts +1 -0
- package/dist/lib/__tests__/toon-converter.test.js +586 -0
- package/dist/lib/__tests__/ws-client.test.d.ts +1 -0
- package/dist/lib/__tests__/ws-client.test.js +22 -0
- package/dist/lib/image-utils.d.ts +3 -0
- package/dist/lib/image-utils.js +21 -0
- package/dist/lib/protocol.d.ts +24 -0
- package/dist/lib/toon-converter.d.ts +104 -0
- package/dist/lib/toon-converter.js +221 -0
- package/dist/static/assets/{ar-SA-G6X2FPQ2-DrFZc17I.js → ar-SA-G6X2FPQ2-DBOnFzSe.js} +1 -1
- package/dist/static/assets/{arc-BE4RRWho.js → arc-bbUtBUEI.js} +1 -1
- package/dist/static/assets/{az-AZ-76LH7QW2-DgHo0c8x.js → az-AZ-76LH7QW2-Cc10aZ9u.js} +1 -1
- package/dist/static/assets/{bg-BG-XCXSNQG7-D6Qfq7sN.js → bg-BG-XCXSNQG7-Ccf7m1dz.js} +1 -1
- package/dist/static/assets/{blockDiagram-38ab4fdb-j4QCKNBJ.js → blockDiagram-38ab4fdb-fpHXuuqC.js} +1 -1
- package/dist/static/assets/{bn-BD-2XOGV67Q-DtD_GeTA.js → bn-BD-2XOGV67Q-DUsn1OkS.js} +1 -1
- package/dist/static/assets/{c4Diagram-3d4e48cf-BmQ9mE4L.js → c4Diagram-3d4e48cf-R8YUsP4D.js} +1 -1
- package/dist/static/assets/{ca-ES-6MX7JW3Y-pqblEVH2.js → ca-ES-6MX7JW3Y-hu4EsJg6.js} +1 -1
- package/dist/static/assets/channel-DOejQ6Zr.js +1 -0
- package/dist/static/assets/{classDiagram-70f12bd4-CUF5vm_X.js → classDiagram-70f12bd4-Bd-nCoOe.js} +1 -1
- package/dist/static/assets/{classDiagram-v2-f2320105-Cpj_A_lB.js → classDiagram-v2-f2320105-BSqlF2Ya.js} +1 -1
- package/dist/static/assets/clone-BACvnIVb.js +1 -0
- package/dist/static/assets/{createText-2e5e7dd3-pnM7Sebc.js → createText-2e5e7dd3-DDxcRLmM.js} +1 -1
- package/dist/static/assets/{cs-CZ-2BRQDIVT-CybzkHZt.js → cs-CZ-2BRQDIVT-CvZtKTE7.js} +1 -1
- package/dist/static/assets/{da-DK-5WZEPLOC-pqELhXiQ.js → da-DK-5WZEPLOC-Bo6-ltfA.js} +1 -1
- package/dist/static/assets/{de-DE-XR44H4JA-ZL76WiIL.js → de-DE-XR44H4JA-Rki2qM_x.js} +1 -1
- package/dist/static/assets/{edges-e0da2a9e-B9extNmC.js → edges-e0da2a9e-DWJxCouB.js} +1 -1
- package/dist/static/assets/{el-GR-BZB4AONW-rKEdKItN.js → el-GR-BZB4AONW-BRy2rrt9.js} +1 -1
- package/dist/static/assets/{erDiagram-9861fffd-Bf-1lr9-.js → erDiagram-9861fffd-DXldiM4J.js} +1 -1
- package/dist/static/assets/{es-ES-U4NZUMDT-BB6riLIk.js → es-ES-U4NZUMDT-hCKbxwHs.js} +1 -1
- package/dist/static/assets/{eu-ES-A7QVB2H4-ChqJNrpA.js → eu-ES-A7QVB2H4-CmZGwoa5.js} +1 -1
- package/dist/static/assets/{fa-IR-HGAKTJCU--KEd62Xu.js → fa-IR-HGAKTJCU-C6DRPcaF.js} +1 -1
- package/dist/static/assets/{fi-FI-Z5N7JZ37-CdB0adCJ.js → fi-FI-Z5N7JZ37-DBaspnIB.js} +1 -1
- package/dist/static/assets/{flowDb-956e92f1-Dbca38tY.js → flowDb-956e92f1-C48Cmgvd.js} +1 -1
- package/dist/static/assets/{flowDiagram-66a62f08-DpQc0ZQB.js → flowDiagram-66a62f08-DV7f8TtG.js} +1 -1
- package/dist/static/assets/flowDiagram-v2-96b9c2cf-MnAxlKb6.js +1 -0
- package/dist/static/assets/{flowchart-elk-definition-4a651766-CAxl2EAj.js → flowchart-elk-definition-4a651766-C2muEpzy.js} +1 -1
- package/dist/static/assets/{fr-FR-RHASNOE6-LEJbMD3b.js → fr-FR-RHASNOE6-D1dEEEfS.js} +1 -1
- package/dist/static/assets/{ganttDiagram-c361ad54-BsKueDb1.js → ganttDiagram-c361ad54-CrooqCzc.js} +1 -1
- package/dist/static/assets/{gitGraphDiagram-72cf32ee-BySoTKcT.js → gitGraphDiagram-72cf32ee-x7BVIo_3.js} +1 -1
- package/dist/static/assets/{gl-ES-HMX3MZ6V-Bi3P3M7W.js → gl-ES-HMX3MZ6V-Czkw2ahx.js} +1 -1
- package/dist/static/assets/{graph-B_0qOa-k.js → graph-Bv0C_szp.js} +1 -1
- package/dist/static/assets/{he-IL-6SHJWFNN-DE7_aRwg.js → he-IL-6SHJWFNN-BLwbN3CV.js} +1 -1
- package/dist/static/assets/{hi-IN-IWLTKZ5I-CjARmJ8i.js → hi-IN-IWLTKZ5I-BJh3HrXc.js} +1 -1
- package/dist/static/assets/{hu-HU-A5ZG7DT2-d79urL5L.js → hu-HU-A5ZG7DT2-D00s-8EN.js} +1 -1
- package/dist/static/assets/{id-ID-SAP4L64H-bxo8Q0Jv.js → id-ID-SAP4L64H-BmyuzwXV.js} +1 -1
- package/dist/static/assets/{index-3862675e-BLm8h60G.js → index-3862675e-mZlepZqF.js} +1 -1
- package/dist/static/assets/{index-BkW4NM9R.js → index-Bnmyv9TE.js} +4 -4
- package/dist/static/assets/index-jjzEa4oB.js +316 -0
- package/dist/static/assets/{infoDiagram-f8f76790-CZ4J5sjk.js → infoDiagram-f8f76790-w7FUTsVV.js} +1 -1
- package/dist/static/assets/{it-IT-JPQ66NNP-D41R3uEK.js → it-IT-JPQ66NNP-CeVq0l8v.js} +1 -1
- package/dist/static/assets/{ja-JP-DBVTYXUO-zK8NUJnS.js → ja-JP-DBVTYXUO-BUNKxxGA.js} +1 -1
- package/dist/static/assets/{journeyDiagram-49397b02-DtFcZaIk.js → journeyDiagram-49397b02-DYjDqkQG.js} +1 -1
- package/dist/static/assets/{kaa-6HZHGXH3-CbGIc6V6.js → kaa-6HZHGXH3-BIKwULqb.js} +1 -1
- package/dist/static/assets/{kab-KAB-ZGHBKWFO-BweHPuX1.js → kab-KAB-ZGHBKWFO-BDpRo7IX.js} +1 -1
- package/dist/static/assets/{kk-KZ-P5N5QNE5-DSokMm7h.js → kk-KZ-P5N5QNE5-bI2LN3W0.js} +1 -1
- package/dist/static/assets/{km-KH-HSX4SM5Z-LYiEs3ge.js → km-KH-HSX4SM5Z-gtwrLJn5.js} +1 -1
- package/dist/static/assets/{ko-KR-MTYHY66A-BzgMEtcU.js → ko-KR-MTYHY66A-BVcwVELq.js} +1 -1
- package/dist/static/assets/{ku-TR-6OUDTVRD-D1FtjbSs.js → ku-TR-6OUDTVRD-COvDJH7d.js} +1 -1
- package/dist/static/assets/{layout-CQWIZrii.js → layout-HBWJ9_zM.js} +1 -1
- package/dist/static/assets/{line-BryEd-Ku.js → line-DxrK6d-_.js} +1 -1
- package/dist/static/assets/{linear-SXhM57Mz.js → linear-TwnxNDQ0.js} +1 -1
- package/dist/static/assets/{lt-LT-XHIRWOB4-BPrhIUrC.js → lt-LT-XHIRWOB4-BxYB7tM6.js} +1 -1
- package/dist/static/assets/{lv-LV-5QDEKY6T-CXJse_rs.js → lv-LV-5QDEKY6T-CGURbwyW.js} +1 -1
- package/dist/static/assets/{mindmap-definition-fc14e90a-C8giDsiX.js → mindmap-definition-fc14e90a-CWJfWF5a.js} +1 -1
- package/dist/static/assets/{mr-IN-CRQNXWMA-Clab-bAO.js → mr-IN-CRQNXWMA-65brZPyQ.js} +1 -1
- package/dist/static/assets/{my-MM-5M5IBNSE-Dp08JzEw.js → my-MM-5M5IBNSE-DaCAmQNv.js} +1 -1
- package/dist/static/assets/{nb-NO-T6EIAALU-CiaXJA-W.js → nb-NO-T6EIAALU-BiSJhu0W.js} +1 -1
- package/dist/static/assets/{nl-NL-IS3SIHDZ-D-9KUTnx.js → nl-NL-IS3SIHDZ-D3rj4Vme.js} +1 -1
- package/dist/static/assets/{nn-NO-6E72VCQL-Bg5gsQ4h.js → nn-NO-6E72VCQL-rxxP7Cwf.js} +1 -1
- package/dist/static/assets/{oc-FR-POXYY2M6-G4iqllhL.js → oc-FR-POXYY2M6-6emd2NQX.js} +1 -1
- package/dist/static/assets/{pa-IN-N4M65BXN-l6Lk41uX.js → pa-IN-N4M65BXN-CXwT_z_m.js} +1 -1
- package/dist/static/assets/{pica-CtkejCRD.js → pica-CtyIOuSv.js} +1 -1
- package/dist/static/assets/{pieDiagram-8a3498a8-CG6gQ14H.js → pieDiagram-8a3498a8-Ccff4vHz.js} +1 -1
- package/dist/static/assets/{pl-PL-T2D74RX3-BZPbB8S3.js → pl-PL-T2D74RX3-DMx_ZmIC.js} +1 -1
- package/dist/static/assets/{pt-BR-5N22H2LF-CIC4vRyd.js → pt-BR-5N22H2LF-D9nz7afr.js} +1 -1
- package/dist/static/assets/{pt-PT-UZXXM6DQ-rkGTBEI0.js → pt-PT-UZXXM6DQ-DeFH3geX.js} +1 -1
- package/dist/static/assets/{quadrantDiagram-120e2f19-BL9eFu4M.js → quadrantDiagram-120e2f19-RF2ZGF1U.js} +1 -1
- package/dist/static/assets/{requirementDiagram-deff3bca-crxdUpVK.js → requirementDiagram-deff3bca-CvnD9QLg.js} +1 -1
- package/dist/static/assets/{ro-RO-JPDTUUEW-GDhpTKBO.js → ro-RO-JPDTUUEW-Cy22QAjW.js} +1 -1
- package/dist/static/assets/{ru-RU-B4JR7IUQ-BzHvMwjC.js → ru-RU-B4JR7IUQ-Cw2rH2nW.js} +1 -1
- package/dist/static/assets/{sankeyDiagram-04a897e0-bM05WQw3.js → sankeyDiagram-04a897e0-CWfRjMv0.js} +1 -1
- package/dist/static/assets/{sequenceDiagram-704730f1-DjknV0Qp.js → sequenceDiagram-704730f1-pAE8N_Ym.js} +1 -1
- package/dist/static/assets/{si-LK-N5RQ5JYF-D3P3TNDH.js → si-LK-N5RQ5JYF-DmXIZ3i0.js} +1 -1
- package/dist/static/assets/{sk-SK-C5VTKIMK-CM8yTXlZ.js → sk-SK-C5VTKIMK-CboHDpHd.js} +1 -1
- package/dist/static/assets/{sl-SI-NN7IZMDC-CxoGm3aM.js → sl-SI-NN7IZMDC-8XnCHmN4.js} +1 -1
- package/dist/static/assets/{stateDiagram-587899a1-CmWqIdF5.js → stateDiagram-587899a1-B4nuLay6.js} +1 -1
- package/dist/static/assets/{stateDiagram-v2-d93cdb3a-CgzNTiHW.js → stateDiagram-v2-d93cdb3a-9cMNxr_8.js} +1 -1
- package/dist/static/assets/{styles-6aaf32cf-CI4s6NIA.js → styles-6aaf32cf-CynMMkPq.js} +1 -1
- package/dist/static/assets/{styles-9a916d00-ZcdN6rtW.js → styles-9a916d00-BTmAnC2j.js} +1 -1
- package/dist/static/assets/{styles-c10674c1-ZFkD6ta7.js → styles-c10674c1-DQ_pTuGr.js} +1 -1
- package/dist/static/assets/{subset-shared.chunk-B4F4dEPr.js → subset-shared.chunk-DPGuz0R6.js} +1 -1
- package/dist/static/assets/{subset-worker.chunk-CmgaOgn3.js → subset-worker.chunk-CMiOYLER.js} +1 -1
- package/dist/static/assets/{sv-SE-XGPEYMSR-CnVZlafq.js → sv-SE-XGPEYMSR-ATPKfqXs.js} +1 -1
- package/dist/static/assets/{svgDrawCommon-08f97a94-DbN3OiBf.js → svgDrawCommon-08f97a94-qY4BnSWc.js} +1 -1
- package/dist/static/assets/{ta-IN-2NMHFXQM-Bl-eCjzL.js → ta-IN-2NMHFXQM-Ct5-Fher.js} +1 -1
- package/dist/static/assets/{th-TH-HPSO5L25-CNIGPjSR.js → th-TH-HPSO5L25-5a6bUzcv.js} +1 -1
- package/dist/static/assets/{timeline-definition-85554ec2-Cmr82Iq1.js → timeline-definition-85554ec2-Bgexbl3C.js} +1 -1
- package/dist/static/assets/{tr-TR-DEFEU3FU-Cx7HbGIA.js → tr-TR-DEFEU3FU-WsK7dnwA.js} +1 -1
- package/dist/static/assets/{uk-UA-QMV73CPH-BxcA50Ze.js → uk-UA-QMV73CPH-B_P61mnc.js} +1 -1
- package/dist/static/assets/{vi-VN-M7AON7JQ-BvGuRh0c.js → vi-VN-M7AON7JQ-qdiQcney.js} +1 -1
- package/dist/static/assets/{xychartDiagram-e933f94c-BcWLDEHu.js → xychartDiagram-e933f94c-vkQjFADD.js} +1 -1
- package/dist/static/assets/{zh-CN-LNUGB5OW-SQH8i3l5.js → zh-CN-LNUGB5OW-DQ3BQjPe.js} +1 -1
- package/dist/static/assets/{zh-HK-E62DVLB3-COWoLNur.js → zh-HK-E62DVLB3-Ynj07W9J.js} +1 -1
- package/dist/static/assets/{zh-TW-RAJ6MFWO-Cm5B69ig.js → zh-TW-RAJ6MFWO-DNkcasuo.js} +1 -1
- package/dist/static/index.html +1 -1
- package/package.json +5 -2
- package/dist/static/assets/channel-DjiT9qJ0.js +0 -1
- package/dist/static/assets/clone-nkJpLn4s.js +0 -1
- package/dist/static/assets/flowDiagram-v2-96b9c2cf-Dlfh8z7R.js +0 -1
- package/dist/static/assets/index-B6CTdFKu.js +0 -311
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
4
|
+
export const defaultDeps = {
|
|
5
|
+
connectToCanvas,
|
|
6
|
+
generateId,
|
|
7
|
+
readFile: readFileSync,
|
|
8
|
+
existsSync,
|
|
9
|
+
resolvePath: resolve,
|
|
10
|
+
log: console.log,
|
|
11
|
+
error: console.error,
|
|
12
|
+
exit: process.exit,
|
|
13
|
+
};
|
|
14
|
+
export async function load(filepath, deps = defaultDeps) {
|
|
15
|
+
// Validate filepath is provided
|
|
16
|
+
if (!filepath) {
|
|
17
|
+
deps.error('Usage: agent-canvas load <filepath>');
|
|
18
|
+
deps.exit(1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Resolve to absolute path
|
|
22
|
+
const absolutePath = deps.resolvePath(filepath);
|
|
23
|
+
// Check file exists
|
|
24
|
+
if (!deps.existsSync(absolutePath)) {
|
|
25
|
+
deps.error(`File not found: ${absolutePath}`);
|
|
26
|
+
deps.exit(1);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Read and parse file
|
|
30
|
+
let content;
|
|
31
|
+
let data;
|
|
32
|
+
try {
|
|
33
|
+
content = deps.readFile(absolutePath, 'utf-8');
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
deps.error(`Failed to read file: ${err instanceof Error ? err.message : err}`);
|
|
37
|
+
deps.exit(1);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
data = JSON.parse(content);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
deps.error(`Failed to parse file: ${err instanceof Error ? err.message : err}`);
|
|
45
|
+
deps.exit(1);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Connect and send loadScene message
|
|
49
|
+
const client = await deps.connectToCanvas();
|
|
50
|
+
const result = await client.send({
|
|
51
|
+
type: 'loadScene',
|
|
52
|
+
id: deps.generateId(),
|
|
53
|
+
params: {
|
|
54
|
+
elements: data.elements || [],
|
|
55
|
+
appState: data.appState,
|
|
56
|
+
files: data.files,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
if (result.success) {
|
|
60
|
+
deps.log(`Loaded ${result.elementCount} elements from ${filepath}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
deps.error(`Failed to load file: ${result.error}`);
|
|
64
|
+
deps.exit(1);
|
|
65
|
+
}
|
|
66
|
+
client.close();
|
|
67
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface MoveElementsOptions {
|
|
2
|
+
elementIds: string;
|
|
3
|
+
deltaX: number;
|
|
4
|
+
deltaY: number;
|
|
5
|
+
}
|
|
6
|
+
export interface MoveElementsClient {
|
|
7
|
+
send: <T>(request: {
|
|
8
|
+
type: string;
|
|
9
|
+
id: string;
|
|
10
|
+
params?: unknown;
|
|
11
|
+
}) => Promise<T>;
|
|
12
|
+
close: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface MoveElementsDeps {
|
|
15
|
+
connectToCanvas: () => Promise<MoveElementsClient>;
|
|
16
|
+
generateId: () => string;
|
|
17
|
+
log: (msg: string) => void;
|
|
18
|
+
error: (msg: string) => void;
|
|
19
|
+
exit: (code: number) => never | void;
|
|
20
|
+
}
|
|
21
|
+
export declare const defaultDeps: MoveElementsDeps;
|
|
22
|
+
export declare function moveElements(options: MoveElementsOptions, deps?: MoveElementsDeps): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
export const defaultDeps = {
|
|
3
|
+
connectToCanvas,
|
|
4
|
+
generateId,
|
|
5
|
+
log: console.log,
|
|
6
|
+
error: console.error,
|
|
7
|
+
exit: process.exit,
|
|
8
|
+
};
|
|
9
|
+
export async function moveElements(options, deps = defaultDeps) {
|
|
10
|
+
const client = await deps.connectToCanvas();
|
|
11
|
+
// Parse comma-separated element IDs
|
|
12
|
+
const elementIds = options.elementIds.split(',').map((s) => s.trim());
|
|
13
|
+
const result = await client.send({
|
|
14
|
+
type: 'moveElements',
|
|
15
|
+
id: deps.generateId(),
|
|
16
|
+
params: { elementIds, deltaX: options.deltaX, deltaY: options.deltaY },
|
|
17
|
+
});
|
|
18
|
+
if (result.success) {
|
|
19
|
+
deps.log(`Moved ${result.movedCount} element(s)`);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
deps.error(`Failed: ${result.error}`);
|
|
23
|
+
deps.exit(1);
|
|
24
|
+
}
|
|
25
|
+
client.close();
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface NewCanvasOptions {
|
|
2
|
+
name: string;
|
|
3
|
+
use?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface NewCanvasClient {
|
|
6
|
+
send: <T>(request: {
|
|
7
|
+
type: string;
|
|
8
|
+
id: string;
|
|
9
|
+
params?: unknown;
|
|
10
|
+
}) => Promise<T>;
|
|
11
|
+
close: () => void;
|
|
12
|
+
}
|
|
13
|
+
export interface NewCanvasDeps {
|
|
14
|
+
connectToCanvas: () => Promise<NewCanvasClient>;
|
|
15
|
+
generateId: () => string;
|
|
16
|
+
log: (msg: string) => void;
|
|
17
|
+
error: (msg: string) => void;
|
|
18
|
+
exit: (code: number) => never | void;
|
|
19
|
+
}
|
|
20
|
+
export declare const defaultDeps: NewCanvasDeps;
|
|
21
|
+
export declare function newCanvas(options: NewCanvasOptions, deps?: NewCanvasDeps): Promise<void>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
export const defaultDeps = {
|
|
3
|
+
connectToCanvas,
|
|
4
|
+
generateId,
|
|
5
|
+
log: console.log,
|
|
6
|
+
error: console.error,
|
|
7
|
+
exit: process.exit,
|
|
8
|
+
};
|
|
9
|
+
export async function newCanvas(options, deps = defaultDeps) {
|
|
10
|
+
const client = await deps.connectToCanvas();
|
|
11
|
+
const params = {
|
|
12
|
+
name: options.name,
|
|
13
|
+
switchTo: options.use ?? false,
|
|
14
|
+
};
|
|
15
|
+
const result = await client.send({
|
|
16
|
+
type: 'createCanvas',
|
|
17
|
+
id: deps.generateId(),
|
|
18
|
+
params,
|
|
19
|
+
});
|
|
20
|
+
if (result.success && result.canvas) {
|
|
21
|
+
const switched = options.use ? ' and switched to it' : '';
|
|
22
|
+
deps.log(`Canvas "${result.canvas.name}" created${switched}`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
deps.error(`Failed: ${result.error}`);
|
|
26
|
+
deps.exit(1);
|
|
27
|
+
}
|
|
28
|
+
client.close();
|
|
29
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { encode as toToon } from '@toon-format/toon';
|
|
2
|
+
export interface ReadClient {
|
|
3
|
+
send: <T>(request: {
|
|
4
|
+
type: string;
|
|
5
|
+
id: string;
|
|
6
|
+
params?: unknown;
|
|
7
|
+
}) => Promise<T>;
|
|
8
|
+
close: () => void;
|
|
9
|
+
}
|
|
10
|
+
export interface ReadDeps {
|
|
11
|
+
connectToCanvas: () => Promise<ReadClient>;
|
|
12
|
+
generateId: () => string;
|
|
13
|
+
toToon: typeof toToon;
|
|
14
|
+
log: (msg: string) => void;
|
|
15
|
+
error: (msg: string) => void;
|
|
16
|
+
exit: (code: number) => never | void;
|
|
17
|
+
}
|
|
18
|
+
export declare const defaultDeps: ReadDeps;
|
|
19
|
+
export interface ReadOptions {
|
|
20
|
+
json?: boolean;
|
|
21
|
+
withStyle?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function read(options: ReadOptions, deps?: ReadDeps): Promise<void>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { encode as toToon } from '@toon-format/toon';
|
|
2
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
3
|
+
import { convertElementsToToon } from '../lib/toon-converter.js';
|
|
4
|
+
export const defaultDeps = {
|
|
5
|
+
connectToCanvas,
|
|
6
|
+
generateId,
|
|
7
|
+
toToon,
|
|
8
|
+
log: console.log,
|
|
9
|
+
error: console.error,
|
|
10
|
+
exit: process.exit,
|
|
11
|
+
};
|
|
12
|
+
export async function read(options, deps = defaultDeps) {
|
|
13
|
+
const client = await deps.connectToCanvas();
|
|
14
|
+
if (options.json) {
|
|
15
|
+
// Return raw Excalidraw scene data
|
|
16
|
+
const result = await client.send({
|
|
17
|
+
type: 'saveScene',
|
|
18
|
+
id: deps.generateId(),
|
|
19
|
+
});
|
|
20
|
+
if (result.success && result.data) {
|
|
21
|
+
deps.log(JSON.stringify(result.data, null, 2));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
deps.error(`Failed: ${result.error}`);
|
|
25
|
+
deps.exit(1);
|
|
26
|
+
}
|
|
27
|
+
client.close();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Default: TOON format
|
|
31
|
+
const result = await client.send({
|
|
32
|
+
type: 'readScene',
|
|
33
|
+
id: deps.generateId(),
|
|
34
|
+
});
|
|
35
|
+
if (result.success && result.elements) {
|
|
36
|
+
const toonData = convertElementsToToon(result.elements, options.withStyle ?? false);
|
|
37
|
+
deps.log(deps.toToon(toonData));
|
|
38
|
+
// Output selected elements
|
|
39
|
+
const selectedIds = result.selectedElementIds ?? [];
|
|
40
|
+
if (selectedIds.length > 0) {
|
|
41
|
+
deps.log(`\nSelected: ${selectedIds.join(', ')}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
deps.error(`Failed: ${result.error}`);
|
|
46
|
+
deps.exit(1);
|
|
47
|
+
}
|
|
48
|
+
client.close();
|
|
49
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface RenameCanvasOptions {
|
|
2
|
+
newName: string;
|
|
3
|
+
}
|
|
4
|
+
export interface RenameCanvasClient {
|
|
5
|
+
send: <T>(request: {
|
|
6
|
+
type: string;
|
|
7
|
+
id: string;
|
|
8
|
+
params?: unknown;
|
|
9
|
+
}) => Promise<T>;
|
|
10
|
+
close: () => void;
|
|
11
|
+
}
|
|
12
|
+
export interface RenameCanvasDeps {
|
|
13
|
+
connectToCanvas: () => Promise<RenameCanvasClient>;
|
|
14
|
+
generateId: () => string;
|
|
15
|
+
log: (msg: string) => void;
|
|
16
|
+
error: (msg: string) => void;
|
|
17
|
+
exit: (code: number) => never | void;
|
|
18
|
+
}
|
|
19
|
+
export declare const defaultDeps: RenameCanvasDeps;
|
|
20
|
+
export declare function renameCanvas(options: RenameCanvasOptions, deps?: RenameCanvasDeps): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
export const defaultDeps = {
|
|
3
|
+
connectToCanvas,
|
|
4
|
+
generateId,
|
|
5
|
+
log: console.log,
|
|
6
|
+
error: console.error,
|
|
7
|
+
exit: process.exit,
|
|
8
|
+
};
|
|
9
|
+
export async function renameCanvas(options, deps = defaultDeps) {
|
|
10
|
+
const client = await deps.connectToCanvas();
|
|
11
|
+
const params = {
|
|
12
|
+
newName: options.newName,
|
|
13
|
+
};
|
|
14
|
+
const result = await client.send({
|
|
15
|
+
type: 'renameCanvas',
|
|
16
|
+
id: deps.generateId(),
|
|
17
|
+
params,
|
|
18
|
+
});
|
|
19
|
+
if (result.success && result.canvas) {
|
|
20
|
+
deps.log(`Canvas renamed to "${result.canvas.name}"`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
deps.error(`Failed: ${result.error}`);
|
|
24
|
+
deps.exit(1);
|
|
25
|
+
}
|
|
26
|
+
client.close();
|
|
27
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface ResizeElementsOptions {
|
|
2
|
+
elementIds: string[];
|
|
3
|
+
top?: number;
|
|
4
|
+
bottom?: number;
|
|
5
|
+
left?: number;
|
|
6
|
+
right?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ResizeClient {
|
|
9
|
+
send: <T>(request: {
|
|
10
|
+
type: string;
|
|
11
|
+
id: string;
|
|
12
|
+
params?: unknown;
|
|
13
|
+
}) => Promise<T>;
|
|
14
|
+
close: () => void;
|
|
15
|
+
}
|
|
16
|
+
export interface ResizeElementsDeps {
|
|
17
|
+
connectToCanvas: () => Promise<ResizeClient>;
|
|
18
|
+
generateId: () => string;
|
|
19
|
+
log: (msg: string) => void;
|
|
20
|
+
error: (msg: string) => void;
|
|
21
|
+
exit: (code: number) => never | void;
|
|
22
|
+
}
|
|
23
|
+
export declare const defaultDeps: ResizeElementsDeps;
|
|
24
|
+
export declare function resizeElements(options: ResizeElementsOptions, deps?: ResizeElementsDeps): Promise<void>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
export const defaultDeps = {
|
|
3
|
+
connectToCanvas,
|
|
4
|
+
generateId,
|
|
5
|
+
log: console.log,
|
|
6
|
+
error: console.error,
|
|
7
|
+
exit: process.exit,
|
|
8
|
+
};
|
|
9
|
+
export async function resizeElements(options, deps = defaultDeps) {
|
|
10
|
+
const top = options.top ?? 0;
|
|
11
|
+
const bottom = options.bottom ?? 0;
|
|
12
|
+
const left = options.left ?? 0;
|
|
13
|
+
const right = options.right ?? 0;
|
|
14
|
+
if (top === 0 && bottom === 0 && left === 0 && right === 0) {
|
|
15
|
+
deps.error('At least one of --top, --bottom, --left, --right must be specified');
|
|
16
|
+
deps.exit(1);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const client = await deps.connectToCanvas();
|
|
20
|
+
// Build params
|
|
21
|
+
const params = {
|
|
22
|
+
elementIds: options.elementIds,
|
|
23
|
+
top,
|
|
24
|
+
bottom,
|
|
25
|
+
left,
|
|
26
|
+
right,
|
|
27
|
+
};
|
|
28
|
+
const result = await client.send({
|
|
29
|
+
type: 'resizeElements',
|
|
30
|
+
id: deps.generateId(),
|
|
31
|
+
params,
|
|
32
|
+
});
|
|
33
|
+
if (result.success) {
|
|
34
|
+
deps.log(`Resized ${result.resizedCount} element(s)`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
deps.error(`Failed: ${result.error}`);
|
|
38
|
+
deps.exit(1);
|
|
39
|
+
}
|
|
40
|
+
client.close();
|
|
41
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface RotateElementsOptions {
|
|
2
|
+
elementIds: string;
|
|
3
|
+
angle: number;
|
|
4
|
+
}
|
|
5
|
+
export interface RotateElementsClient {
|
|
6
|
+
send: <T>(request: {
|
|
7
|
+
type: string;
|
|
8
|
+
id: string;
|
|
9
|
+
params?: unknown;
|
|
10
|
+
}) => Promise<T>;
|
|
11
|
+
close: () => void;
|
|
12
|
+
}
|
|
13
|
+
export interface RotateElementsDeps {
|
|
14
|
+
connectToCanvas: () => Promise<RotateElementsClient>;
|
|
15
|
+
generateId: () => string;
|
|
16
|
+
log: (msg: string) => void;
|
|
17
|
+
error: (msg: string) => void;
|
|
18
|
+
exit: (code: number) => never | void;
|
|
19
|
+
}
|
|
20
|
+
export declare const defaultDeps: RotateElementsDeps;
|
|
21
|
+
export declare function rotateElements(options: RotateElementsOptions, deps?: RotateElementsDeps): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
export const defaultDeps = {
|
|
3
|
+
connectToCanvas,
|
|
4
|
+
generateId,
|
|
5
|
+
log: console.log,
|
|
6
|
+
error: console.error,
|
|
7
|
+
exit: process.exit,
|
|
8
|
+
};
|
|
9
|
+
export async function rotateElements(options, deps = defaultDeps) {
|
|
10
|
+
const client = await deps.connectToCanvas();
|
|
11
|
+
// Parse comma-separated element IDs
|
|
12
|
+
const elementIds = options.elementIds.split(',').map((s) => s.trim());
|
|
13
|
+
const result = await client.send({
|
|
14
|
+
type: 'rotateElements',
|
|
15
|
+
id: deps.generateId(),
|
|
16
|
+
params: { elementIds, angle: options.angle },
|
|
17
|
+
});
|
|
18
|
+
if (result.success) {
|
|
19
|
+
deps.log(`Rotated ${result.rotatedCount} element(s)`);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
deps.error(`Failed: ${result.error}`);
|
|
23
|
+
deps.exit(1);
|
|
24
|
+
}
|
|
25
|
+
client.close();
|
|
26
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SaveClient {
|
|
2
|
+
send: <T>(request: {
|
|
3
|
+
type: string;
|
|
4
|
+
id: string;
|
|
5
|
+
params?: unknown;
|
|
6
|
+
}) => Promise<T>;
|
|
7
|
+
close: () => void;
|
|
8
|
+
}
|
|
9
|
+
export interface SaveDeps {
|
|
10
|
+
connectToCanvas: () => Promise<SaveClient>;
|
|
11
|
+
generateId: () => string;
|
|
12
|
+
writeFile: (path: string, data: string) => void;
|
|
13
|
+
log: (msg: string) => void;
|
|
14
|
+
error: (msg: string) => void;
|
|
15
|
+
exit: (code: number) => never | void;
|
|
16
|
+
}
|
|
17
|
+
export declare const defaultDeps: SaveDeps;
|
|
18
|
+
export declare function save(filepath: string, deps?: SaveDeps): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
import { writeFileSync } from 'node:fs';
|
|
3
|
+
export const defaultDeps = {
|
|
4
|
+
connectToCanvas,
|
|
5
|
+
generateId,
|
|
6
|
+
writeFile: writeFileSync,
|
|
7
|
+
log: console.log,
|
|
8
|
+
error: console.error,
|
|
9
|
+
exit: process.exit,
|
|
10
|
+
};
|
|
11
|
+
export async function save(filepath, deps = defaultDeps) {
|
|
12
|
+
const client = await deps.connectToCanvas();
|
|
13
|
+
const result = await client.send({
|
|
14
|
+
type: 'saveScene',
|
|
15
|
+
id: deps.generateId(),
|
|
16
|
+
});
|
|
17
|
+
if (result.success && result.data) {
|
|
18
|
+
const outputPath = filepath.endsWith('.excalidraw') ? filepath : `${filepath}.excalidraw`;
|
|
19
|
+
deps.writeFile(outputPath, JSON.stringify(result.data, null, 2));
|
|
20
|
+
deps.log(`Saved to ${outputPath}`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
deps.error(`Failed: ${result.error}`);
|
|
24
|
+
deps.exit(1);
|
|
25
|
+
}
|
|
26
|
+
client.close();
|
|
27
|
+
}
|
package/dist/commands/start.d.ts
CHANGED
package/dist/commands/start.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { exec } from 'child_process';
|
|
2
|
-
import { resolve } from 'path';
|
|
3
|
-
import { readFileSync, existsSync } from 'fs';
|
|
4
2
|
import { promisify } from 'util';
|
|
5
|
-
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
6
3
|
import { startServer, isBrowserServerRunning, isBrowserConnected } from '../server/index.js';
|
|
7
4
|
const execAsync = promisify(exec);
|
|
8
5
|
async function openBrowser(url) {
|
|
@@ -22,44 +19,6 @@ async function openBrowser(url) {
|
|
|
22
19
|
console.log(`Please open ${url} in your browser`);
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
export async function loadFile(filePath) {
|
|
26
|
-
if (!filePath) {
|
|
27
|
-
console.error('Usage: agent-canvas load <filepath>');
|
|
28
|
-
process.exit(1);
|
|
29
|
-
}
|
|
30
|
-
const absolutePath = resolve(filePath);
|
|
31
|
-
if (!existsSync(absolutePath)) {
|
|
32
|
-
console.error(`File not found: ${absolutePath}`);
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
console.log(`Loading file: ${absolutePath}`);
|
|
36
|
-
try {
|
|
37
|
-
const content = readFileSync(absolutePath, 'utf-8');
|
|
38
|
-
const data = JSON.parse(content);
|
|
39
|
-
const client = await connectToCanvas();
|
|
40
|
-
const result = await client.send({
|
|
41
|
-
type: 'loadScene',
|
|
42
|
-
id: generateId(),
|
|
43
|
-
params: {
|
|
44
|
-
elements: data.elements || [],
|
|
45
|
-
appState: data.appState,
|
|
46
|
-
files: data.files,
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
if (result.success) {
|
|
50
|
-
console.log(`Loaded ${result.elementCount} elements from ${filePath}`);
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
console.error(`Failed to load file: ${result.error}`);
|
|
54
|
-
process.exit(1);
|
|
55
|
-
}
|
|
56
|
-
client.close();
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
console.error(`Failed to parse file: ${err instanceof Error ? err.message : err}`);
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
22
|
export async function start() {
|
|
64
23
|
const running = await isBrowserServerRunning();
|
|
65
24
|
if (!running) {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface UngroupElementOptions {
|
|
2
|
+
elementId: string;
|
|
3
|
+
}
|
|
4
|
+
export interface UngroupClient {
|
|
5
|
+
send: <T>(request: {
|
|
6
|
+
type: string;
|
|
7
|
+
id: string;
|
|
8
|
+
params?: unknown;
|
|
9
|
+
}) => Promise<T>;
|
|
10
|
+
close: () => void;
|
|
11
|
+
}
|
|
12
|
+
export interface UngroupElementDeps {
|
|
13
|
+
connectToCanvas: () => Promise<UngroupClient>;
|
|
14
|
+
generateId: () => string;
|
|
15
|
+
log: (msg: string) => void;
|
|
16
|
+
error: (msg: string) => void;
|
|
17
|
+
exit: (code: number) => never | void;
|
|
18
|
+
}
|
|
19
|
+
export declare const defaultDeps: UngroupElementDeps;
|
|
20
|
+
export declare function ungroupElement(options: UngroupElementOptions, deps?: UngroupElementDeps): Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
export const defaultDeps = {
|
|
3
|
+
connectToCanvas,
|
|
4
|
+
generateId,
|
|
5
|
+
log: console.log,
|
|
6
|
+
error: console.error,
|
|
7
|
+
exit: process.exit,
|
|
8
|
+
};
|
|
9
|
+
export async function ungroupElement(options, deps = defaultDeps) {
|
|
10
|
+
const client = await deps.connectToCanvas();
|
|
11
|
+
// Build params
|
|
12
|
+
const params = {
|
|
13
|
+
elementId: options.elementId,
|
|
14
|
+
};
|
|
15
|
+
const result = await client.send({
|
|
16
|
+
type: 'ungroupElement',
|
|
17
|
+
id: deps.generateId(),
|
|
18
|
+
params,
|
|
19
|
+
});
|
|
20
|
+
if (result.success) {
|
|
21
|
+
deps.log('Element ungrouped');
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
deps.error(`Failed: ${result.error}`);
|
|
25
|
+
deps.exit(1);
|
|
26
|
+
}
|
|
27
|
+
client.close();
|
|
28
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface UseCanvasOptions {
|
|
2
|
+
name: string;
|
|
3
|
+
}
|
|
4
|
+
export interface UseCanvasClient {
|
|
5
|
+
send: <T>(request: {
|
|
6
|
+
type: string;
|
|
7
|
+
id: string;
|
|
8
|
+
params?: unknown;
|
|
9
|
+
}) => Promise<T>;
|
|
10
|
+
close: () => void;
|
|
11
|
+
}
|
|
12
|
+
export interface UseCanvasDeps {
|
|
13
|
+
connectToCanvas: () => Promise<UseCanvasClient>;
|
|
14
|
+
generateId: () => string;
|
|
15
|
+
log: (msg: string) => void;
|
|
16
|
+
error: (msg: string) => void;
|
|
17
|
+
exit: (code: number) => never | void;
|
|
18
|
+
}
|
|
19
|
+
export declare const defaultDeps: UseCanvasDeps;
|
|
20
|
+
export declare function useCanvas(options: UseCanvasOptions, deps?: UseCanvasDeps): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { connectToCanvas, generateId } from '../lib/ws-client.js';
|
|
2
|
+
export const defaultDeps = {
|
|
3
|
+
connectToCanvas,
|
|
4
|
+
generateId,
|
|
5
|
+
log: console.log,
|
|
6
|
+
error: console.error,
|
|
7
|
+
exit: process.exit,
|
|
8
|
+
};
|
|
9
|
+
export async function useCanvas(options, deps = defaultDeps) {
|
|
10
|
+
const client = await deps.connectToCanvas();
|
|
11
|
+
const params = {
|
|
12
|
+
name: options.name,
|
|
13
|
+
};
|
|
14
|
+
const result = await client.send({
|
|
15
|
+
type: 'switchCanvas',
|
|
16
|
+
id: deps.generateId(),
|
|
17
|
+
params,
|
|
18
|
+
});
|
|
19
|
+
if (result.success && result.canvas) {
|
|
20
|
+
deps.log(`Switched to canvas "${result.canvas.name}"`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
deps.error(`Failed: ${result.error}`);
|
|
24
|
+
deps.exit(1);
|
|
25
|
+
}
|
|
26
|
+
client.close();
|
|
27
|
+
}
|