@agimon-ai/doompi-author 0.0.1-alpha.2 → 0.0.1-alpha.21
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/README.md +5 -1
- package/dist/apiContracts.cjs +316 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +311 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/authorCommand-B90ghX5J.mjs +226 -0
- package/dist/authorCommand-B90ghX5J.mjs.map +1 -0
- package/dist/authorCommand-Cd5dnLF7.cjs +315 -0
- package/dist/authorCommand-Cd5dnLF7.cjs.map +1 -0
- package/dist/authorFacade-B9-Re3Ga.mjs +75 -0
- package/dist/authorFacade-B9-Re3Ga.mjs.map +1 -0
- package/dist/authorFacade-BvCSzZ5K.cjs +104 -0
- package/dist/authorFacade-BvCSzZ5K.cjs.map +1 -0
- package/dist/authorFacade-RZ6EXlR5.d.mts +113 -0
- package/dist/authorFacade-RZ6EXlR5.d.mts.map +1 -0
- package/dist/authorFacade.cjs +26 -0
- package/dist/authorFacade.d.mts +3 -0
- package/dist/authorFacade.mjs +3 -0
- package/dist/extensions/pi.cjs +172 -1
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.mts +6 -2
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +167 -1
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/server.cjs +659 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +652 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/extensions/web.mjs +4231 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index-Btm_xNOb.d.mts +386 -0
- package/dist/index-Btm_xNOb.d.mts.map +1 -0
- package/dist/index.cjs +35 -1
- package/dist/index.d.mts +2 -21
- package/dist/index.mjs +4 -1
- package/dist/monitor-7T5YF6px.mjs +70 -0
- package/dist/monitor-7T5YF6px.mjs.map +1 -0
- package/dist/monitor-BxY8s_AX.cjs +81 -0
- package/dist/monitor-BxY8s_AX.cjs.map +1 -0
- package/dist/structuredDocuments-Bg6DIqu5.cjs +960 -0
- package/dist/structuredDocuments-Bg6DIqu5.cjs.map +1 -0
- package/dist/structuredDocuments-CzMYD0Bq.mjs +810 -0
- package/dist/structuredDocuments-CzMYD0Bq.mjs.map +1 -0
- package/package.json +48 -38
- package/src/types/authorPreview.ts +76 -0
- package/src/types/webAuthor.ts +1 -1
- package/dist/_virtual/_rolldown/runtime.cjs +0 -1
- package/dist/adapters/authorApi.cjs +0 -2
- package/dist/adapters/authorApi.cjs.map +0 -1
- package/dist/adapters/authorBridgeApi.cjs +0 -2
- package/dist/adapters/authorBridgeApi.cjs.map +0 -1
- package/dist/adapters/authorDocumentApi.cjs +0 -2
- package/dist/adapters/authorDocumentApi.cjs.map +0 -1
- package/dist/adapters/pi/authorBridgeClient.cjs +0 -2
- package/dist/adapters/pi/authorBridgeClient.cjs.map +0 -1
- package/dist/adapters/pi/authorTools.cjs +0 -2
- package/dist/adapters/pi/authorTools.cjs.map +0 -1
- package/dist/adapters/pi/extension.cjs +0 -2
- package/dist/adapters/pi/extension.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/common.cjs +0 -2
- package/dist/adapters/structuredDocuments/common.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/csv.cjs +0 -7
- package/dist/adapters/structuredDocuments/csv.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/index.cjs +0 -2
- package/dist/adapters/structuredDocuments/index.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/markdownSlides.cjs +0 -6
- package/dist/adapters/structuredDocuments/markdownSlides.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/ooxmlArchive.cjs +0 -2
- package/dist/adapters/structuredDocuments/ooxmlArchive.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/pptx.cjs +0 -2
- package/dist/adapters/structuredDocuments/pptx.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/xlsx.cjs +0 -2
- package/dist/adapters/structuredDocuments/xlsx.cjs.map +0 -1
- package/dist/adapters/structuredDocuments/xmlText.cjs +0 -2
- package/dist/adapters/structuredDocuments/xmlText.cjs.map +0 -1
- package/dist/adapters/webAuthorChannel.cjs +0 -2
- package/dist/adapters/webAuthorChannel.cjs.map +0 -1
- package/dist/commands/doomAuthorCommand.cjs +0 -2
- package/dist/commands/doomAuthorCommand.cjs.map +0 -1
- package/dist/container/index.cjs +0 -2
- package/dist/container/index.cjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -2
- package/dist/index.d.cts +0 -21
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/engine/helpers/union.d.cts +0 -6
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/engine/helpers/union.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/engine/helpers/union.d.mts +0 -6
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/engine/helpers/union.d.mts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/_optional.d.cts +0 -7
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/_optional.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/_optional.d.mts +0 -7
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/_optional.d.mts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/object.d.cts +0 -12
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/object.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/object.d.mts +0 -12
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/object.d.mts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/properties.d.cts +0 -12
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/properties.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/properties.d.mts +0 -12
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/properties.d.mts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/record.d.cts +0 -9
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/record.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/record.d.mts +0 -9
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/record.d.mts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/schema.d.cts +0 -4
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/schema.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/schema.d.mts +0 -4
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/schema.d.mts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/string.d.cts +0 -9
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/string.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/string.d.mts +0 -9
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/string.d.mts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/unknown.d.cts +0 -8
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/unknown.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/unknown.d.mts +0 -8
- package/dist/node_modules/.pnpm/typebox@1.3.25/node_modules/typebox/build/type/types/unknown.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorApi.d.cts +0 -15
- package/dist/packages/minor/doompi-author/src/adapters/authorApi.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorApi.d.mts +0 -15
- package/dist/packages/minor/doompi-author/src/adapters/authorApi.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorApi.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/authorApi.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorBridgeApi.d.cts +0 -6
- package/dist/packages/minor/doompi-author/src/adapters/authorBridgeApi.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorBridgeApi.d.mts +0 -6
- package/dist/packages/minor/doompi-author/src/adapters/authorBridgeApi.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorBridgeApi.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/authorBridgeApi.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorDocumentApi.d.cts +0 -11
- package/dist/packages/minor/doompi-author/src/adapters/authorDocumentApi.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorDocumentApi.d.mts +0 -11
- package/dist/packages/minor/doompi-author/src/adapters/authorDocumentApi.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/authorDocumentApi.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/authorDocumentApi.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorBridgeClient.d.cts +0 -18
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorBridgeClient.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorBridgeClient.d.mts +0 -18
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorBridgeClient.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorBridgeClient.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorBridgeClient.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorTools.d.cts +0 -9
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorTools.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorTools.d.mts +0 -9
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorTools.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorTools.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/pi/authorTools.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/extension.d.cts +0 -19
- package/dist/packages/minor/doompi-author/src/adapters/pi/extension.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/extension.d.mts +0 -19
- package/dist/packages/minor/doompi-author/src/adapters/pi/extension.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/pi/extension.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/pi/extension.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/common.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/common.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/csv.d.cts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/csv.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/csv.d.mts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/csv.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/csv.mjs +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/csv.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/index.d.cts +0 -13
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/index.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/index.d.mts +0 -13
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/index.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/index.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/index.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/markdownSlides.d.cts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/markdownSlides.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/markdownSlides.d.mts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/markdownSlides.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/markdownSlides.mjs +0 -6
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/markdownSlides.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/ooxmlArchive.d.cts +0 -13
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/ooxmlArchive.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/ooxmlArchive.d.mts +0 -13
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/ooxmlArchive.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/ooxmlArchive.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/ooxmlArchive.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/pptx.d.cts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/pptx.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/pptx.d.mts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/pptx.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/pptx.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/pptx.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xlsx.d.cts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xlsx.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xlsx.d.mts +0 -7
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xlsx.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xlsx.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xlsx.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xmlText.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/structuredDocuments/xmlText.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/webAuthorChannel.d.cts +0 -6
- package/dist/packages/minor/doompi-author/src/adapters/webAuthorChannel.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/webAuthorChannel.d.mts +0 -6
- package/dist/packages/minor/doompi-author/src/adapters/webAuthorChannel.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/adapters/webAuthorChannel.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/adapters/webAuthorChannel.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/commands/doomAuthorCommand.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/commands/doomAuthorCommand.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/container/index.d.cts +0 -5
- package/dist/packages/minor/doompi-author/src/container/index.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/container/index.d.mts +0 -5
- package/dist/packages/minor/doompi-author/src/container/index.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/container/index.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/container/index.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/schemas/authorTools.d.cts +0 -16
- package/dist/packages/minor/doompi-author/src/schemas/authorTools.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/schemas/authorTools.d.mts +0 -16
- package/dist/packages/minor/doompi-author/src/schemas/authorTools.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/schemas/authorTools.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/schemas/authorTools.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorBridgeState.d.cts +0 -31
- package/dist/packages/minor/doompi-author/src/services/authorBridgeState.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorBridgeState.d.mts +0 -31
- package/dist/packages/minor/doompi-author/src/services/authorBridgeState.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorBridgeState.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/services/authorBridgeState.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorCatalog.d.cts +0 -10
- package/dist/packages/minor/doompi-author/src/services/authorCatalog.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorCatalog.d.mts +0 -10
- package/dist/packages/minor/doompi-author/src/services/authorCatalog.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorMode.d.cts +0 -19
- package/dist/packages/minor/doompi-author/src/services/authorMode.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorMode.d.mts +0 -19
- package/dist/packages/minor/doompi-author/src/services/authorMode.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/authorMode.mjs +0 -3
- package/dist/packages/minor/doompi-author/src/services/authorMode.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/extensionService.d.cts +0 -7
- package/dist/packages/minor/doompi-author/src/services/extensionService.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/extensionService.d.mts +0 -7
- package/dist/packages/minor/doompi-author/src/services/extensionService.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/services/extensionService.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/services/extensionService.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/author.d.cts +0 -39
- package/dist/packages/minor/doompi-author/src/types/author.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/author.d.mts +0 -39
- package/dist/packages/minor/doompi-author/src/types/author.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/author.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/types/author.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/authorApi.d.cts +0 -23
- package/dist/packages/minor/doompi-author/src/types/authorApi.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/authorApi.d.mts +0 -23
- package/dist/packages/minor/doompi-author/src/types/authorApi.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/authorApi.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/types/authorApi.mjs.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/extension.d.cts +0 -16
- package/dist/packages/minor/doompi-author/src/types/extension.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/extension.d.mts +0 -16
- package/dist/packages/minor/doompi-author/src/types/extension.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/structuredDocuments.d.cts +0 -60
- package/dist/packages/minor/doompi-author/src/types/structuredDocuments.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/structuredDocuments.d.mts +0 -60
- package/dist/packages/minor/doompi-author/src/types/structuredDocuments.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/webAuthor.d.cts +0 -67
- package/dist/packages/minor/doompi-author/src/types/webAuthor.d.cts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/webAuthor.d.mts +0 -67
- package/dist/packages/minor/doompi-author/src/types/webAuthor.d.mts.map +0 -1
- package/dist/packages/minor/doompi-author/src/types/webAuthor.mjs +0 -2
- package/dist/packages/minor/doompi-author/src/types/webAuthor.mjs.map +0 -1
- package/dist/schemas/authorTools.cjs +0 -2
- package/dist/schemas/authorTools.cjs.map +0 -1
- package/dist/services/authorBridgeState.cjs +0 -2
- package/dist/services/authorBridgeState.cjs.map +0 -1
- package/dist/services/authorMode.cjs +0 -3
- package/dist/services/authorMode.cjs.map +0 -1
- package/dist/services/extensionService.cjs +0 -2
- package/dist/services/extensionService.cjs.map +0 -1
- package/dist/sessionApi.cjs +0 -1
- package/dist/sessionApi.d.cts +0 -7
- package/dist/sessionApi.d.mts +0 -7
- package/dist/sessionApi.mjs +0 -1
- package/dist/types/author.cjs +0 -2
- package/dist/types/author.cjs.map +0 -1
- package/dist/types/authorApi.cjs +0 -2
- package/dist/types/authorApi.cjs.map +0 -1
- package/dist/types/webAuthor.cjs +0 -2
- package/dist/types/webAuthor.cjs.map +0 -1
- package/dist/webHub.cjs +0 -1
- package/dist/webHub.d.cts +0 -2
- package/dist/webHub.d.mts +0 -2
- package/dist/webHub.mjs +0 -1
- package/src/exports/webClient.ts +0 -76
- package/src/web/api/authorBroker.ts +0 -14
- package/src/web/api/authorBrowserBridge.ts +0 -225
- package/src/web/api/authorFiles.ts +0 -219
- package/src/web/api/authorMedia.ts +0 -19
- package/src/web/api/authorRuntime.ts +0 -164
- package/src/web/components/AuthorDocumentPanel.tsx +0 -232
- package/src/web/components/AuthorGridOverlay.tsx +0 -81
- package/src/web/components/AuthorMediaPreview.tsx +0 -41
- package/src/web/components/AuthorMediaView.tsx +0 -356
- package/src/web/components/AuthorPanel.tsx +0 -105
- package/src/web/components/AuthorRegionDrafts.tsx +0 -102
- package/src/web/components/AuthorRequestLog.tsx +0 -179
- package/src/web/components/AuthorStructuredView.tsx +0 -121
- package/src/web/components/AuthorTextView.tsx +0 -97
- package/src/web/components/AuthorToolPalette.tsx +0 -103
- package/src/web/components/AuthorVideoControls.tsx +0 -111
- package/src/web/components/DescribeAuthorToolsToolCard.tsx +0 -50
- package/src/web/components/OpenAuthoringFileToolCard.tsx +0 -66
- package/src/web/components/UseAuthorToolsToolCard.tsx +0 -50
- package/src/web/index.ts +0 -68
- package/src/web/lib/authorGrid.ts +0 -124
- package/src/web/lib/authorRegions.ts +0 -30
- package/src/web/lib/authorViewportTypes.ts +0 -202
- package/src/web/lib/describeAuthorToolsToolRender.ts +0 -20
- package/src/web/lib/useAuthorToolsToolRender.ts +0 -20
- package/src/web/stores/authorCapture.ts +0 -322
- package/src/web/stores/authorGridTools.ts +0 -316
- package/src/web/stores/authorProfiles.ts +0 -130
- package/src/web/stores/authorRequestLifecycle.ts +0 -82
- package/src/web/stores/authorStore.ts +0 -60
- package/src/web/stores/authorWorkspaceStore.ts +0 -525
- package/src/web/tsconfig.json +0 -22
package/dist/sessionApi.d.mts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { AUTHOR_OWNER_LEASE_MS, AUTHOR_REQUEST_TIMEOUT_MS, AuthorBridgeError, AuthorBridgeState, AuthorBridgeStateOptions, createAuthorBridgeState } from "./packages/minor/doompi-author/src/services/authorBridgeState.mjs";
|
|
2
|
-
import { CsvDialect, DocumentFragment, DocumentManifest, DocumentOperation, DocumentOperationLogEntry, DocumentPreflightIssue, DocumentPreflightReport, DocumentRenderModel, ParsedStructuredDocument, SerializedStructuredDocument, StructuredDocumentFormat } from "./packages/minor/doompi-author/src/types/structuredDocuments.mjs";
|
|
3
|
-
import { API_BASE_PATH, AUTHOR_BRIDGE_ROUTES, AUTHOR_STATE_PATH, AuthorSessionView, authorStateUrl } from "./packages/minor/doompi-author/src/types/authorApi.mjs";
|
|
4
|
-
import { api, createAuthorApi } from "./packages/minor/doompi-author/src/adapters/authorApi.mjs";
|
|
5
|
-
import { createAuthorBridgeApi } from "./packages/minor/doompi-author/src/adapters/authorBridgeApi.mjs";
|
|
6
|
-
import { AUTHOR_DOCUMENT_OPEN_PATH, AUTHOR_DOCUMENT_PREFLIGHT_PATH, AUTHOR_DOCUMENT_SERIALIZE_PATH, createAuthorDocumentApi } from "./packages/minor/doompi-author/src/adapters/authorDocumentApi.mjs";
|
|
7
|
-
export { API_BASE_PATH, AUTHOR_BRIDGE_ROUTES, AUTHOR_DOCUMENT_OPEN_PATH, AUTHOR_DOCUMENT_PREFLIGHT_PATH, AUTHOR_DOCUMENT_SERIALIZE_PATH, AUTHOR_OWNER_LEASE_MS, AUTHOR_REQUEST_TIMEOUT_MS, AUTHOR_STATE_PATH, AuthorBridgeError, type AuthorBridgeState, type AuthorBridgeStateOptions, type AuthorSessionView, type CsvDialect, type DocumentFragment, type DocumentManifest, type DocumentOperation, type DocumentOperationLogEntry, type DocumentPreflightIssue, type DocumentPreflightReport, type DocumentRenderModel, type ParsedStructuredDocument, type SerializedStructuredDocument, type StructuredDocumentFormat, api, authorStateUrl, createAuthorApi, createAuthorBridgeApi, createAuthorBridgeState, createAuthorDocumentApi };
|
package/dist/sessionApi.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{AUTHOR_DOCUMENT_OPEN_PATH as e,AUTHOR_DOCUMENT_PREFLIGHT_PATH as t,AUTHOR_DOCUMENT_SERIALIZE_PATH as n,createAuthorDocumentApi as r}from"./packages/minor/doompi-author/src/adapters/authorDocumentApi.mjs";import{API_BASE_PATH as i,AUTHOR_BRIDGE_ROUTES as a,AUTHOR_STATE_PATH as o,authorStateUrl as s}from"./packages/minor/doompi-author/src/types/authorApi.mjs";import{AUTHOR_OWNER_LEASE_MS as c,AUTHOR_REQUEST_TIMEOUT_MS as l,AuthorBridgeError as u,createAuthorBridgeState as d}from"./packages/minor/doompi-author/src/services/authorBridgeState.mjs";import{createAuthorBridgeApi as f}from"./packages/minor/doompi-author/src/adapters/authorBridgeApi.mjs";import{api as p,createAuthorApi as m}from"./packages/minor/doompi-author/src/adapters/authorApi.mjs";export{i as API_BASE_PATH,a as AUTHOR_BRIDGE_ROUTES,e as AUTHOR_DOCUMENT_OPEN_PATH,t as AUTHOR_DOCUMENT_PREFLIGHT_PATH,n as AUTHOR_DOCUMENT_SERIALIZE_PATH,c as AUTHOR_OWNER_LEASE_MS,l as AUTHOR_REQUEST_TIMEOUT_MS,o as AUTHOR_STATE_PATH,u as AuthorBridgeError,p as api,s as authorStateUrl,m as createAuthorApi,f as createAuthorBridgeApi,d as createAuthorBridgeState,r as createAuthorDocumentApi};
|
package/dist/types/author.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"author.cjs","names":[],"sources":["../../src/types/author.ts"],"sourcesContent":["export const AUTHOR_MODE_ID = 'author' as const;\nexport const OPEN_AUTHORING_FILE_TOOL_NAME = 'open_authoring_file' as const;\n\nexport type AuthorModeActivation = 'inactive' | 'active';\n\nexport interface AuthorModeSnapshot {\n activation: AuthorModeActivation;\n catalogToken: string;\n capabilityCount: number;\n}\n\nexport type AuthorJsonSchema = Readonly<Record<string, unknown>>;\n\nexport interface AuthorViewportCapabilityDescriptor {\n name: string;\n label: string;\n description: string;\n inputSchema: AuthorJsonSchema;\n}\n\nexport interface AuthorViewportCapability extends AuthorViewportCapabilityDescriptor {\n execute(argumentsValue: Record<string, unknown>, signal?: AbortSignal): Promise<unknown>;\n}\n\nexport interface AuthorViewportCatalogSnapshot {\n catalogToken: string;\n tools: AuthorViewportCapabilityDescriptor[];\n}\n\nexport interface AuthorOpenFileResult {\n path: string;\n byteLength: number;\n}\n\nexport interface UseAuthorToolInput {\n catalogToken: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface AuthorToolResult {\n catalogToken: string;\n name: string;\n result: unknown;\n}\n"],"mappings":""}
|
package/dist/types/authorApi.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`author`,t=`session`,n=`/state`,r={register:`/bridge/register`,catalog:`/bridge/catalog`,next:`/bridge/next`,result:`/bridge/result`,cancelled:`/bridge/cancelled`,disconnect:`/bridge/disconnect`,describe:`/bridge/describe`,invoke:`/bridge/invoke`};function i(r){let i=new URLSearchParams({[t]:r});return`/api/plugin/${e}${n}?${i.toString()}`}exports.API_BASE_PATH=e,exports.AUTHOR_BRIDGE_ROUTES=r,exports.AUTHOR_STATE_PATH=n,exports.SESSION_QUERY_PARAM=t,exports.authorStateUrl=i;
|
|
2
|
-
//# sourceMappingURL=authorApi.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authorApi.cjs","names":[],"sources":["../../src/types/authorApi.ts"],"sourcesContent":["import type { AuthorModeActivation } from './author.ts';\n\nexport const API_BASE_PATH = 'author';\nexport const SESSION_QUERY_PARAM = 'session';\nexport const AUTHOR_STATE_PATH = '/state';\nexport const AUTHOR_BRIDGE_ROUTES = {\n register: '/bridge/register',\n catalog: '/bridge/catalog',\n next: '/bridge/next',\n result: '/bridge/result',\n cancelled: '/bridge/cancelled',\n disconnect: '/bridge/disconnect',\n describe: '/bridge/describe',\n invoke: '/bridge/invoke',\n} as const;\n\nexport function authorStateUrl(sessionId: string): string {\n const search = new URLSearchParams({ [SESSION_QUERY_PARAM]: sessionId });\n return `/api/plugin/${API_BASE_PATH}${AUTHOR_STATE_PATH}?${search.toString()}`;\n}\n\nexport interface AuthorSessionView {\n sessionId: string | null;\n activation: AuthorModeActivation;\n capabilityCount: number;\n}\n"],"mappings":"AAEA,MAAa,EAAgB,SAChB,EAAsB,UACtB,EAAoB,SACpB,EAAuB,CAClC,SAAU,mBACV,QAAS,kBACT,KAAM,eACN,OAAQ,iBACR,UAAW,oBACX,WAAY,qBACZ,SAAU,mBACV,OAAQ,gBACV,EAEA,SAAgB,EAAe,EAA2B,CACxD,IAAM,EAAS,IAAI,gBAAgB,EAAG,GAAsB,CAAU,CAAC,EACvE,MAAO,eAAe,IAAgB,EAAkB,GAAG,EAAO,SAAS,GAC7E"}
|
package/dist/types/webAuthor.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webAuthor.cjs","names":[],"sources":["../../src/types/webAuthor.ts"],"sourcesContent":["import type { AuthorViewportCapabilityDescriptor } from './author.ts';\n\nexport const authorChannelType = 'author_webmcp';\n\nexport interface AuthorRegisterMessage {\n kind: 'register';\n generation: number;\n}\n\nexport interface AuthorReleaseMessage {\n kind: 'release';\n generation: number;\n}\nexport interface AuthorCatalogMessage {\n kind: 'catalog';\n generation: number;\n ownerToken: string;\n tools: AuthorViewportCapabilityDescriptor[];\n}\n\nexport interface AuthorResultMessage {\n kind: 'result';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n result: unknown;\n}\n\nexport interface AuthorCancelledMessage {\n kind: 'cancelled';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport type AuthorBrowserMessage =\n | AuthorRegisterMessage\n | AuthorReleaseMessage\n | AuthorCatalogMessage\n | AuthorResultMessage\n | AuthorCancelledMessage;\n\nexport interface AuthorAcceptedMessage {\n kind: 'accepted';\n generation: number;\n ownerToken: string;\n catalogToken?: string;\n leaseMs: number;\n}\n\nexport interface AuthorRequestMessage {\n kind: 'request';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface AuthorCancelMessage {\n kind: 'cancel';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport interface AuthorRejectedMessage {\n kind: 'rejected';\n reason: string;\n}\n\nexport type AuthorHubMessage =\n | AuthorAcceptedMessage\n | AuthorRequestMessage\n | AuthorCancelMessage\n | AuthorRejectedMessage;\n\nexport interface AuthorWebView {\n activation: 'inactive' | 'active';\n capabilityCount: number;\n}\n"],"mappings":""}
|
package/dist/webHub.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/webAuthorChannel.cjs");exports.createAuthorChannel=e.createAuthorChannel,exports.webHubChannels=e.webHubChannels;
|
package/dist/webHub.d.cts
DELETED
package/dist/webHub.d.mts
DELETED
package/dist/webHub.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createAuthorChannel as e,webHubChannels as t}from"./packages/minor/doompi-author/src/adapters/webAuthorChannel.mjs";export{e as createAuthorChannel,t as webHubChannels};
|
package/src/exports/webClient.ts
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
export { AuthorClientBroker } from '../web/api/authorBroker.ts';
|
|
2
|
-
export { authorFileTab } from '../web/components/AuthorDocumentPanel.tsx';
|
|
3
|
-
export { AuthorRuntime, AUTHOR_RUNTIME_BINDING_IDS } from '../web/api/authorRuntime.ts';
|
|
4
|
-
export { AUTHOR_TRUSTED_PROFILES } from '../web/stores/authorProfiles.ts';
|
|
5
|
-
export {
|
|
6
|
-
AUTHOR_CAPTURE_MAX_BYTES,
|
|
7
|
-
AUTHOR_CAPTURE_MAX_DIMENSION,
|
|
8
|
-
AUTHOR_COMMENT_MAX_BYTES,
|
|
9
|
-
AUTHOR_PACKET_MAX_BYTES,
|
|
10
|
-
AUTHOR_QUOTE_MAX_BYTES,
|
|
11
|
-
attachAuthorCapture,
|
|
12
|
-
authorCaptureContext,
|
|
13
|
-
createAuthorCapturePacket,
|
|
14
|
-
imageCaptureProvider,
|
|
15
|
-
multiRegionCaptureProvider,
|
|
16
|
-
} from '../web/stores/authorCapture.ts';
|
|
17
|
-
export type {
|
|
18
|
-
AuthorCapturePacket,
|
|
19
|
-
AuthorCapturePacketRegion,
|
|
20
|
-
AuthorCaptureProvider,
|
|
21
|
-
} from '../web/stores/authorCapture.ts';
|
|
22
|
-
export {
|
|
23
|
-
AUTHOR_GRID_COLUMNS,
|
|
24
|
-
AUTHOR_GRID_SIZE,
|
|
25
|
-
authorGrid,
|
|
26
|
-
authorGridGeometry,
|
|
27
|
-
clearAuthorGridGeometry,
|
|
28
|
-
parseAuthorGridCell,
|
|
29
|
-
resolveAuthorGridCell,
|
|
30
|
-
updateAuthorGridGeometry,
|
|
31
|
-
} from '../web/lib/authorGrid.ts';
|
|
32
|
-
export type { AuthorGridCellResolution, AuthorGridGeometry } from '../web/lib/authorGrid.ts';
|
|
33
|
-
export {
|
|
34
|
-
addAuthorAnnotation,
|
|
35
|
-
addAuthorRegion,
|
|
36
|
-
authorDocument,
|
|
37
|
-
authorSessionWorkspace,
|
|
38
|
-
authorWorkspace,
|
|
39
|
-
dropAuthorSession,
|
|
40
|
-
focusAuthorDocument,
|
|
41
|
-
normalizeAuthorPath,
|
|
42
|
-
putAuthorDocument,
|
|
43
|
-
putAuthorRequest,
|
|
44
|
-
releaseAuthorDocumentFocus,
|
|
45
|
-
removeAuthorRegion,
|
|
46
|
-
requestAuthorSave,
|
|
47
|
-
reviseAuthorDocument,
|
|
48
|
-
setAuthorCrop,
|
|
49
|
-
syncAuthorDocumentFocus,
|
|
50
|
-
updateAuthorRegionComment,
|
|
51
|
-
updateAuthorRequest,
|
|
52
|
-
} from '../web/stores/authorWorkspaceStore.ts';
|
|
53
|
-
export { webPlugin } from '../web/index.ts';
|
|
54
|
-
export type {
|
|
55
|
-
AuthorAnnotation,
|
|
56
|
-
AuthorCellAnchor,
|
|
57
|
-
AuthorCrop,
|
|
58
|
-
AuthorDocumentInput,
|
|
59
|
-
AuthorDocumentKind,
|
|
60
|
-
AuthorDraftRevision,
|
|
61
|
-
AuthorFocusedDocument,
|
|
62
|
-
AuthorImageRectAnchor,
|
|
63
|
-
AuthorNativeAnchor,
|
|
64
|
-
AuthorNormalizedRect,
|
|
65
|
-
AuthorPdfPageRectAnchor,
|
|
66
|
-
AuthorRegionDraft,
|
|
67
|
-
AuthorRequestRecord,
|
|
68
|
-
AuthorRequestStatus,
|
|
69
|
-
AuthorSlideElementAnchor,
|
|
70
|
-
AuthorTextRangeAnchor,
|
|
71
|
-
AuthorTrustedProfile,
|
|
72
|
-
AuthorTrustedTool,
|
|
73
|
-
AuthorVideoTimeRectAnchor,
|
|
74
|
-
AuthorViewportSnapshot,
|
|
75
|
-
AuthorVoiceGridEvidence,
|
|
76
|
-
} from '../web/lib/authorViewportTypes.ts';
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { ModelContext } from '@agimon-ai/doompi-web-contracts';
|
|
2
|
-
|
|
3
|
-
/** Client-side broker transport. Calls always cross Model Context's execution boundary. */
|
|
4
|
-
export class AuthorClientBroker {
|
|
5
|
-
readonly #modelContext: ModelContext;
|
|
6
|
-
|
|
7
|
-
constructor(modelContext: ModelContext) {
|
|
8
|
-
this.#modelContext = modelContext;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
execute(name: string, input: unknown, signal: AbortSignal): Promise<unknown> {
|
|
12
|
-
return this.#modelContext.executeTool(name, JSON.stringify(input), { signal });
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import type { WebPluginRuntime } from '@agimon-ai/doompi-web-contracts';
|
|
2
|
-
import { Store } from '@tanstack/store';
|
|
3
|
-
import type { AuthorHubMessage } from '../../types/webAuthor.ts';
|
|
4
|
-
import { authorChannelType } from '../../types/webAuthor.ts';
|
|
5
|
-
import { AuthorRuntime } from './authorRuntime.ts';
|
|
6
|
-
import type { AuthorTrustedProfile } from '../lib/authorViewportTypes.ts';
|
|
7
|
-
|
|
8
|
-
interface ActiveViewport {
|
|
9
|
-
sessionId: string;
|
|
10
|
-
generation: number;
|
|
11
|
-
profiles: readonly AuthorTrustedProfile[];
|
|
12
|
-
release: () => void;
|
|
13
|
-
ownerToken?: string;
|
|
14
|
-
catalogToken?: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
class AuthorBrowserBridge {
|
|
18
|
-
readonly #host: WebPluginRuntime;
|
|
19
|
-
readonly #runtime: AuthorRuntime;
|
|
20
|
-
readonly #pending = new Map<string, AbortController>();
|
|
21
|
-
#active: ActiveViewport | undefined;
|
|
22
|
-
#generation = 0;
|
|
23
|
-
#disposed = false;
|
|
24
|
-
readonly #releaseConnected: () => void;
|
|
25
|
-
#leaseTimer: ReturnType<typeof setTimeout> | undefined;
|
|
26
|
-
|
|
27
|
-
constructor(host: WebPluginRuntime) {
|
|
28
|
-
this.#host = host;
|
|
29
|
-
this.#runtime = new AuthorRuntime(host);
|
|
30
|
-
this.#releaseConnected = host.onHubConnected(() => {
|
|
31
|
-
if (this.#active !== undefined) {
|
|
32
|
-
this.#active.ownerToken = undefined;
|
|
33
|
-
this.#active.catalogToken = undefined;
|
|
34
|
-
}
|
|
35
|
-
this.#register();
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async focus(sessionId: string, profiles: readonly AuthorTrustedProfile[]): Promise<() => void> {
|
|
40
|
-
if (this.#disposed) throw new Error('Author browser bridge is disposed');
|
|
41
|
-
const generation = ++this.#generation;
|
|
42
|
-
const release = await this.#runtime.replaceProfiles(profiles);
|
|
43
|
-
if (this.#disposed || generation !== this.#generation) {
|
|
44
|
-
release();
|
|
45
|
-
return () => undefined;
|
|
46
|
-
}
|
|
47
|
-
this.#clearActive();
|
|
48
|
-
this.#active = { sessionId, generation, profiles, release };
|
|
49
|
-
this.#register();
|
|
50
|
-
return () => {
|
|
51
|
-
if (this.#active?.generation !== generation) return;
|
|
52
|
-
this.#clearActive();
|
|
53
|
-
this.#generation += 1;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
drop(sessionId: string): void {
|
|
58
|
-
if (this.#active?.sessionId !== sessionId) return;
|
|
59
|
-
this.#clearActive();
|
|
60
|
-
this.#generation += 1;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
apply(sessionId: string, message: AuthorHubMessage): void {
|
|
64
|
-
const active = this.#active;
|
|
65
|
-
if (active === undefined || active.sessionId !== sessionId || message.kind === 'rejected') return;
|
|
66
|
-
if (
|
|
67
|
-
message.generation !== active.generation ||
|
|
68
|
-
(message.ownerToken !== active.ownerToken && active.ownerToken !== undefined)
|
|
69
|
-
)
|
|
70
|
-
return;
|
|
71
|
-
if (message.kind === 'accepted') {
|
|
72
|
-
active.ownerToken = message.ownerToken;
|
|
73
|
-
clearTimeout(this.#leaseTimer);
|
|
74
|
-
this.#leaseTimer = setTimeout(() => this.#register(), Math.max(1000, Math.floor(message.leaseMs / 2)));
|
|
75
|
-
if (message.catalogToken === undefined) this.#sendCatalog(active);
|
|
76
|
-
else active.catalogToken = message.catalogToken;
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
if (message.catalogToken !== active.catalogToken) return;
|
|
80
|
-
if (message.kind === 'cancel') {
|
|
81
|
-
this.#pending.get(message.requestId)?.abort(new Error('Author tool request cancelled'));
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
if (message.kind !== 'request' || this.#pending.has(message.requestId)) return;
|
|
85
|
-
const controller = new AbortController();
|
|
86
|
-
this.#pending.set(message.requestId, controller);
|
|
87
|
-
void this.#runtime
|
|
88
|
-
.execute(message.name, message.arguments, controller.signal)
|
|
89
|
-
.then((result) => {
|
|
90
|
-
if (!this.#current(active, message.requestId, controller)) return;
|
|
91
|
-
if (controller.signal.aborted) this.#sendCancelled(active, message.requestId);
|
|
92
|
-
else
|
|
93
|
-
this.#send(active.sessionId, {
|
|
94
|
-
kind: 'result',
|
|
95
|
-
generation: active.generation,
|
|
96
|
-
ownerToken: active.ownerToken!,
|
|
97
|
-
catalogToken: active.catalogToken!,
|
|
98
|
-
requestId: message.requestId,
|
|
99
|
-
result,
|
|
100
|
-
});
|
|
101
|
-
})
|
|
102
|
-
.catch((error: unknown) => {
|
|
103
|
-
if (!this.#current(active, message.requestId, controller)) return;
|
|
104
|
-
if (controller.signal.aborted) this.#sendCancelled(active, message.requestId);
|
|
105
|
-
else {
|
|
106
|
-
const messageText = error instanceof Error ? error.message : String(error);
|
|
107
|
-
const code = /^([A-Z][A-Z_]+):/u.exec(messageText)?.[1] ?? 'AUTHOR_TOOL_ERROR';
|
|
108
|
-
this.#send(active.sessionId, {
|
|
109
|
-
kind: 'result',
|
|
110
|
-
generation: active.generation,
|
|
111
|
-
ownerToken: active.ownerToken!,
|
|
112
|
-
catalogToken: active.catalogToken!,
|
|
113
|
-
requestId: message.requestId,
|
|
114
|
-
result: { error: { code, message: messageText } },
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
.finally(() => {
|
|
119
|
-
if (this.#pending.get(message.requestId) === controller) this.#pending.delete(message.requestId);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
activeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {
|
|
124
|
-
const active = this.#active;
|
|
125
|
-
return active?.sessionId === sessionId && active.catalogToken !== undefined
|
|
126
|
-
? {
|
|
127
|
-
activation: 'active',
|
|
128
|
-
capabilityCount: active.profiles.reduce((count, profile) => count + profile.tools.length, 0),
|
|
129
|
-
}
|
|
130
|
-
: { activation: 'inactive', capabilityCount: 0 };
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
dispose(): void {
|
|
134
|
-
if (this.#disposed) return;
|
|
135
|
-
this.#disposed = true;
|
|
136
|
-
clearTimeout(this.#leaseTimer);
|
|
137
|
-
this.#releaseConnected();
|
|
138
|
-
this.#clearActive();
|
|
139
|
-
this.#runtime.dispose();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
#register(): void {
|
|
143
|
-
const active = this.#active;
|
|
144
|
-
if (active !== undefined) this.#send(active.sessionId, { kind: 'register', generation: active.generation });
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
#sendCatalog(active: ActiveViewport): void {
|
|
148
|
-
this.#send(active.sessionId, {
|
|
149
|
-
kind: 'catalog',
|
|
150
|
-
generation: active.generation,
|
|
151
|
-
ownerToken: active.ownerToken!,
|
|
152
|
-
tools: active.profiles.flatMap((profile) =>
|
|
153
|
-
profile.tools.map((tool) => ({
|
|
154
|
-
name: tool.name,
|
|
155
|
-
label: tool.label ?? tool.name,
|
|
156
|
-
description: tool.description,
|
|
157
|
-
inputSchema: tool.inputSchema,
|
|
158
|
-
})),
|
|
159
|
-
),
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
#sendCancelled(active: ActiveViewport, requestId: string): void {
|
|
164
|
-
this.#send(active.sessionId, {
|
|
165
|
-
kind: 'cancelled',
|
|
166
|
-
generation: active.generation,
|
|
167
|
-
ownerToken: active.ownerToken!,
|
|
168
|
-
catalogToken: active.catalogToken!,
|
|
169
|
-
requestId,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
#send(sessionId: string, payload: Record<string, unknown>): void {
|
|
174
|
-
this.#host.sendHubFrame({ type: authorChannelType, sessionId, payload });
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
#current(active: ActiveViewport, requestId: string, controller: AbortController): boolean {
|
|
178
|
-
return this.#active === active && this.#pending.get(requestId) === controller;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
#clearActive(): void {
|
|
182
|
-
clearTimeout(this.#leaseTimer);
|
|
183
|
-
this.#leaseTimer = undefined;
|
|
184
|
-
const active = this.#active;
|
|
185
|
-
if (active !== undefined) {
|
|
186
|
-
this.#send(active.sessionId, { kind: 'release', generation: active.generation });
|
|
187
|
-
active.release();
|
|
188
|
-
}
|
|
189
|
-
this.#active = undefined;
|
|
190
|
-
for (const controller of this.#pending.values()) controller.abort(new Error('Author viewport changed'));
|
|
191
|
-
this.#pending.clear();
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const authorBridgeRuntime = new Store<AuthorBrowserBridge | undefined>(undefined);
|
|
196
|
-
|
|
197
|
-
export function startAuthorBrowserBridge(runtime: WebPluginRuntime): () => void {
|
|
198
|
-
authorBridgeRuntime.state?.dispose();
|
|
199
|
-
const next = new AuthorBrowserBridge(runtime);
|
|
200
|
-
authorBridgeRuntime.setState(() => next);
|
|
201
|
-
return () => {
|
|
202
|
-
if (authorBridgeRuntime.state !== next) return;
|
|
203
|
-
next.dispose();
|
|
204
|
-
authorBridgeRuntime.setState(() => undefined);
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
export async function focusAuthorViewport(
|
|
209
|
-
sessionId: string,
|
|
210
|
-
profiles: readonly AuthorTrustedProfile[],
|
|
211
|
-
): Promise<() => void> {
|
|
212
|
-
return (await authorBridgeRuntime.state?.focus(sessionId, profiles)) ?? (() => undefined);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export function applyAuthorHubMessage(sessionId: string, message: AuthorHubMessage): void {
|
|
216
|
-
authorBridgeRuntime.state?.apply(sessionId, message);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export function dropAuthorViewportSession(sessionId: string): void {
|
|
220
|
-
authorBridgeRuntime.state?.drop(sessionId);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export function authorBridgeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {
|
|
224
|
-
return authorBridgeRuntime.state?.activeView(sessionId) ?? { activation: 'inactive', capabilityCount: 0 };
|
|
225
|
-
}
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { sealedTransport } from '@agimon-ai/doompi-web-security/browser';
|
|
2
|
-
import type {
|
|
3
|
-
CsvDialect,
|
|
4
|
-
DocumentFragment,
|
|
5
|
-
DocumentOperation,
|
|
6
|
-
DocumentPreflightReport,
|
|
7
|
-
ParsedStructuredDocument,
|
|
8
|
-
StructuredDocumentFormat,
|
|
9
|
-
} from '../../types/structuredDocuments.ts';
|
|
10
|
-
import type { AuthorDocumentInput, AuthorDocumentKind } from '../lib/authorViewportTypes.ts';
|
|
11
|
-
|
|
12
|
-
const IMAGE_EXTENSIONS = new Set(['avif', 'bmp', 'gif', 'jpeg', 'jpg', 'png', 'svg', 'webp']);
|
|
13
|
-
const VIDEO_EXTENSIONS = new Set(['m4v', 'mov', 'mp4', 'webm']);
|
|
14
|
-
|
|
15
|
-
function structuredFormat(path: string): StructuredDocumentFormat | undefined {
|
|
16
|
-
const lower = path.toLowerCase();
|
|
17
|
-
if (lower.endsWith('.slides.md')) return 'markdown-slides';
|
|
18
|
-
if (lower.endsWith('.csv')) return 'csv';
|
|
19
|
-
if (lower.endsWith('.pptx')) return 'pptx';
|
|
20
|
-
if (lower.endsWith('.xlsx')) return 'xlsx';
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function authorKindForPath(path: string): AuthorDocumentKind {
|
|
25
|
-
const format = structuredFormat(path);
|
|
26
|
-
if (format === 'markdown-slides') return 'slides';
|
|
27
|
-
if (format !== undefined) return format;
|
|
28
|
-
const extension = path.split('.').at(-1)?.toLowerCase() ?? '';
|
|
29
|
-
if (extension === 'md') return 'markdown';
|
|
30
|
-
if (IMAGE_EXTENSIONS.has(extension)) return 'image';
|
|
31
|
-
if (VIDEO_EXTENSIONS.has(extension)) return 'video';
|
|
32
|
-
if (extension === 'pdf') return 'pdf';
|
|
33
|
-
if (['txt', 'json', 'yaml', 'yml', 'xml', 'html', 'css', 'js', 'ts', 'tsx', 'jsx'].includes(extension)) return 'text';
|
|
34
|
-
return 'opaque';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function authorSessionFileUrl(sessionId: string, path: string): string {
|
|
38
|
-
return `/api/sessions/${encodeURIComponent(sessionId)}/file?path=${encodeURIComponent(path)}`;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function authorDocumentApiUrl(sessionId: string, operation: 'open' | 'preflight' | 'serialize'): string {
|
|
42
|
-
return `/api/plugin/author/documents/${operation}?session=${encodeURIComponent(sessionId)}`;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async function jsonRequest<T>(url: string, body: Record<string, unknown>, signal?: AbortSignal): Promise<T> {
|
|
46
|
-
const response = await sealedTransport.fetch(url, {
|
|
47
|
-
method: 'POST',
|
|
48
|
-
headers: { 'Content-Type': 'application/json' },
|
|
49
|
-
body: JSON.stringify(body),
|
|
50
|
-
signal,
|
|
51
|
-
});
|
|
52
|
-
const value = (await response.json()) as T & { error?: unknown };
|
|
53
|
-
if (!response.ok)
|
|
54
|
-
throw new Error(typeof value.error === 'string' ? value.error : `Author document API failed (${response.status})`);
|
|
55
|
-
return value;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export async function loadAuthorDocument(
|
|
59
|
-
sessionId: string,
|
|
60
|
-
path: string,
|
|
61
|
-
signal?: AbortSignal,
|
|
62
|
-
): Promise<AuthorDocumentInput> {
|
|
63
|
-
const kind = authorKindForPath(path);
|
|
64
|
-
const url = authorSessionFileUrl(sessionId, path);
|
|
65
|
-
const response = await sealedTransport.fetch(url, { signal });
|
|
66
|
-
if (!response.ok) throw new Error(`Author could not open ${path} (${response.status})`);
|
|
67
|
-
const sourceSha256 = response.headers.get('X-File-SHA256') ?? undefined;
|
|
68
|
-
const format = structuredFormat(path);
|
|
69
|
-
if (format !== undefined) {
|
|
70
|
-
const parsed = await jsonRequest<ParsedStructuredDocument>(
|
|
71
|
-
authorDocumentApiUrl(sessionId, 'open'),
|
|
72
|
-
{ path, format },
|
|
73
|
-
signal,
|
|
74
|
-
);
|
|
75
|
-
const parsedDigest = parsed.manifest?.sourceDigest;
|
|
76
|
-
if (sourceSha256 !== undefined && parsedDigest !== undefined && sourceSha256 !== parsedDigest) {
|
|
77
|
-
throw new Error('Document source changed while opening. Reopen the document.');
|
|
78
|
-
}
|
|
79
|
-
const csvDialect = format === 'csv' ? csvDialectFromMetadata(parsed.manifest?.metadata) : undefined;
|
|
80
|
-
return {
|
|
81
|
-
path,
|
|
82
|
-
kind,
|
|
83
|
-
title: path.split('/').at(-1) ?? path,
|
|
84
|
-
structuredFormat: format,
|
|
85
|
-
fragments: parsed.fragments,
|
|
86
|
-
...(csvDialect === undefined ? {} : { csvDialect }),
|
|
87
|
-
originalFragments: parsed.fragments.map((fragment) => ({ ...fragment })),
|
|
88
|
-
...(sourceSha256 === undefined ? {} : { sourceSha256 }),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
const mediaUrl = kind === 'image' || kind === 'video' || kind === 'pdf' || kind === 'opaque' ? url : undefined;
|
|
92
|
-
const content = kind === 'text' || kind === 'markdown' ? await response.text() : undefined;
|
|
93
|
-
return {
|
|
94
|
-
path,
|
|
95
|
-
kind,
|
|
96
|
-
title: path.split('/').at(-1) ?? path,
|
|
97
|
-
...(content === undefined ? {} : { content }),
|
|
98
|
-
...(mediaUrl === undefined ? {} : { mediaUrl }),
|
|
99
|
-
...(sourceSha256 === undefined ? {} : { sourceSha256 }),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function operationsFor(document: AuthorDocumentInput): DocumentOperation[] {
|
|
104
|
-
const originals = new Map((document.originalFragments ?? []).map((fragment) => [fragment.id, fragment.text]));
|
|
105
|
-
return (document.fragments ?? [])
|
|
106
|
-
.filter((fragment) => !fragment.readOnly && originals.get(fragment.id) !== fragment.text)
|
|
107
|
-
.map((fragment) => ({ fragmentId: fragment.id, replacement: fragment.text }));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function decodeBase64(value: string): Uint8Array {
|
|
111
|
-
if (!/^(?:[A-Za-z\d+/]{4})*(?:[A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?$/.test(value))
|
|
112
|
-
throw new Error('Invalid serialized document bytes.');
|
|
113
|
-
const binary = atob(value);
|
|
114
|
-
return Uint8Array.from(binary, (character) => character.charCodeAt(0));
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function imageMimeType(path: string): 'image/png' | 'image/jpeg' | 'image/webp' | undefined {
|
|
118
|
-
const extension = path.split('.').at(-1)?.toLowerCase();
|
|
119
|
-
if (extension === 'png') return 'image/png';
|
|
120
|
-
if (extension === 'jpg' || extension === 'jpeg') return 'image/jpeg';
|
|
121
|
-
if (extension === 'webp') return 'image/webp';
|
|
122
|
-
return undefined;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
async function croppedImageBytes(documentInput: AuthorDocumentInput, signal?: AbortSignal): Promise<Blob> {
|
|
126
|
-
const { crop, mediaUrl } = documentInput;
|
|
127
|
-
if (crop === undefined || mediaUrl === undefined) throw new Error('This Author image has no crop source.');
|
|
128
|
-
const mimeType = imageMimeType(documentInput.path);
|
|
129
|
-
if (mimeType === undefined) throw new Error('This image format cannot preserve its encoding after crop.');
|
|
130
|
-
const response = await sealedTransport.fetch(mediaUrl, { signal, cache: 'no-store' });
|
|
131
|
-
if (!response.ok) throw new Error(`Author could not read the image before saving (${response.status})`);
|
|
132
|
-
const bitmap = await createImageBitmap(await response.blob());
|
|
133
|
-
try {
|
|
134
|
-
const sourceX = Math.round(crop.x * bitmap.width);
|
|
135
|
-
const sourceY = Math.round(crop.y * bitmap.height);
|
|
136
|
-
const sourceWidth = Math.max(1, Math.round(crop.width * bitmap.width));
|
|
137
|
-
const sourceHeight = Math.max(1, Math.round(crop.height * bitmap.height));
|
|
138
|
-
const canvas = window.document.createElement('canvas');
|
|
139
|
-
canvas.width = sourceWidth;
|
|
140
|
-
canvas.height = sourceHeight;
|
|
141
|
-
const context = canvas.getContext('2d');
|
|
142
|
-
if (context === null) throw new Error('Canvas is unavailable for image crop.');
|
|
143
|
-
context.drawImage(bitmap, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, sourceWidth, sourceHeight);
|
|
144
|
-
const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, mimeType));
|
|
145
|
-
if (blob === null || blob.type !== mimeType)
|
|
146
|
-
throw new Error('The browser cannot encode this cropped image format.');
|
|
147
|
-
return blob;
|
|
148
|
-
} finally {
|
|
149
|
-
bitmap.close();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
async function bytesToSave(sessionId: string, document: AuthorDocumentInput, signal?: AbortSignal): Promise<BodyInit> {
|
|
154
|
-
if (document.kind === 'text' || document.kind === 'markdown') return document.content ?? '';
|
|
155
|
-
if (document.kind === 'image' && document.crop !== undefined) return await croppedImageBytes(document, signal);
|
|
156
|
-
if (document.structuredFormat === undefined) throw new Error('This Author view cannot be saved.');
|
|
157
|
-
const operations = operationsFor(document);
|
|
158
|
-
const request = {
|
|
159
|
-
path: document.path,
|
|
160
|
-
format: document.structuredFormat,
|
|
161
|
-
operations,
|
|
162
|
-
...(document.csvDialect === undefined ? {} : { csvDialect: document.csvDialect }),
|
|
163
|
-
};
|
|
164
|
-
const preflight = await jsonRequest<DocumentPreflightReport>(
|
|
165
|
-
authorDocumentApiUrl(sessionId, 'preflight'),
|
|
166
|
-
request,
|
|
167
|
-
signal,
|
|
168
|
-
);
|
|
169
|
-
if (preflight.sourceDigest !== undefined && preflight.sourceDigest !== document.sourceSha256) {
|
|
170
|
-
throw new Error('Document source changed before saving. Reopen the document.');
|
|
171
|
-
}
|
|
172
|
-
if (!preflight.accepted)
|
|
173
|
-
throw new Error(preflight.issues.map((issue) => issue.message).join('\n') || 'Author preflight rejected the edit.');
|
|
174
|
-
const serialized = await jsonRequest<{ bytes: string; encoding: string }>(
|
|
175
|
-
authorDocumentApiUrl(sessionId, 'serialize'),
|
|
176
|
-
{ ...request, preflightDigest: preflight.digest },
|
|
177
|
-
signal,
|
|
178
|
-
);
|
|
179
|
-
if (serialized.encoding !== 'base64') throw new Error('Author serialize returned an unsupported encoding.');
|
|
180
|
-
const bytes = decodeBase64(serialized.bytes);
|
|
181
|
-
return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export async function saveAuthorDocument(
|
|
185
|
-
sessionId: string,
|
|
186
|
-
document: AuthorDocumentInput,
|
|
187
|
-
signal?: AbortSignal,
|
|
188
|
-
): Promise<string> {
|
|
189
|
-
if (document.sourceSha256 === undefined) throw new Error('This Author view has no source digest.');
|
|
190
|
-
const response = await sealedTransport.fetch(authorSessionFileUrl(sessionId, document.path), {
|
|
191
|
-
method: 'PUT',
|
|
192
|
-
headers: { 'Content-Type': 'application/octet-stream', 'X-Expected-SHA256': document.sourceSha256 },
|
|
193
|
-
body: await bytesToSave(sessionId, document, signal),
|
|
194
|
-
signal,
|
|
195
|
-
});
|
|
196
|
-
if (!response.ok) throw new Error(`Author save failed (${response.status})`);
|
|
197
|
-
const sha256 = response.headers.get('X-File-SHA256');
|
|
198
|
-
if (sha256 === null || !/^[a-f0-9]{64}$/.test(sha256)) throw new Error('Author save returned an invalid digest.');
|
|
199
|
-
return sha256;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
function csvDialectFromMetadata(
|
|
203
|
-
metadata: Record<string, string | number | boolean> | undefined,
|
|
204
|
-
): CsvDialect | undefined {
|
|
205
|
-
if (metadata === undefined) return undefined;
|
|
206
|
-
const { delimiter, quote, recordDelimiter } = metadata;
|
|
207
|
-
if (
|
|
208
|
-
(delimiter !== ',' && delimiter !== ';' && delimiter !== '\t' && delimiter !== '|') ||
|
|
209
|
-
(quote !== '"' && quote !== "'") ||
|
|
210
|
-
(recordDelimiter !== '\n' && recordDelimiter !== '\r\n')
|
|
211
|
-
) {
|
|
212
|
-
throw new Error('Author document API returned an invalid CSV dialect.');
|
|
213
|
-
}
|
|
214
|
-
return { delimiter, quote, recordDelimiter };
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export function editableStructuredFragments(document: AuthorDocumentInput): readonly DocumentFragment[] {
|
|
218
|
-
return document.fragments ?? [];
|
|
219
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { sealedTransport } from '@agimon-ai/doompi-web-security/browser';
|
|
2
|
-
|
|
3
|
-
/** Native media elements cannot perform the remote session's encrypted HTTP exchange. */
|
|
4
|
-
export async function loadAuthorMedia(source: string, signal: AbortSignal): Promise<{ url: string; dispose(): void }> {
|
|
5
|
-
const response = await sealedTransport.fetch(source, { signal, cache: 'no-store' });
|
|
6
|
-
if (!response.ok) throw new Error(`Author media could not be loaded (${response.status}).`);
|
|
7
|
-
const blob = await response.blob();
|
|
8
|
-
signal.throwIfAborted();
|
|
9
|
-
const url = URL.createObjectURL(blob);
|
|
10
|
-
let disposed = false;
|
|
11
|
-
return {
|
|
12
|
-
url,
|
|
13
|
-
dispose() {
|
|
14
|
-
if (disposed) return;
|
|
15
|
-
disposed = true;
|
|
16
|
-
URL.revokeObjectURL(url);
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
}
|