@dxos/plugin-file 0.9.1-staging.ee54ba693a → 0.11.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.
Files changed (174) hide show
  1. package/PLUGIN.mdl +86 -77
  2. package/dist/lib/FilePlugin.mjs +37 -0
  3. package/dist/lib/FilePlugin.mjs.map +1 -0
  4. package/dist/lib/FilePlugin.node.mjs +12 -0
  5. package/dist/lib/FilePlugin.node.mjs.map +1 -0
  6. package/dist/lib/capabilities/node.mjs +8 -0
  7. package/dist/lib/capabilities/node.mjs.map +1 -0
  8. package/dist/lib/capabilities.mjs +15 -0
  9. package/dist/lib/capabilities.mjs.map +1 -0
  10. package/dist/lib/chunk-FileArticle.mjs +62 -0
  11. package/dist/lib/chunk-FileArticle.mjs.map +1 -0
  12. package/dist/lib/chunk-create-object.mjs +28 -0
  13. package/dist/lib/chunk-create-object.mjs.map +1 -0
  14. package/dist/lib/chunk-create.mjs +78 -0
  15. package/dist/lib/chunk-create.mjs.map +1 -0
  16. package/dist/lib/chunk-edge-backend.mjs +18 -0
  17. package/dist/lib/chunk-edge-backend.mjs.map +1 -0
  18. package/dist/lib/chunk-file-uploader.mjs +37 -0
  19. package/dist/lib/chunk-file-uploader.mjs.map +1 -0
  20. package/dist/lib/chunk-inline-backend.mjs +19 -0
  21. package/dist/lib/chunk-inline-backend.mjs.map +1 -0
  22. package/dist/lib/chunk-markdown-extension.mjs +182 -0
  23. package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
  24. package/dist/lib/chunk-meta.mjs +44 -0
  25. package/dist/lib/chunk-meta.mjs.map +1 -0
  26. package/dist/lib/chunk-operation-handler.mjs +11 -0
  27. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  28. package/dist/lib/chunk-react-surface.mjs +55 -0
  29. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  30. package/dist/lib/chunk-read.mjs +32 -0
  31. package/dist/lib/chunk-read.mjs.map +1 -0
  32. package/dist/lib/chunk-settings.mjs +23 -0
  33. package/dist/lib/chunk-settings.mjs.map +1 -0
  34. package/dist/lib/chunk-skill-definition.mjs +10 -0
  35. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  36. package/dist/lib/chunk-skills.mjs +28 -0
  37. package/dist/lib/chunk-skills.mjs.map +1 -0
  38. package/dist/lib/chunk-types.mjs +98 -0
  39. package/dist/lib/chunk-types.mjs.map +1 -0
  40. package/dist/lib/components.mjs +57 -0
  41. package/dist/lib/components.mjs.map +1 -0
  42. package/dist/lib/containers.mjs +56 -0
  43. package/dist/lib/containers.mjs.map +1 -0
  44. package/dist/lib/index.mjs +4 -0
  45. package/dist/lib/meta.mjs +2 -0
  46. package/dist/lib/operations.mjs +7 -0
  47. package/dist/lib/operations.mjs.map +1 -0
  48. package/dist/lib/plugin.mjs +9 -0
  49. package/dist/lib/plugin.mjs.map +1 -0
  50. package/dist/lib/skills.mjs +2 -0
  51. package/dist/lib/translations.mjs +30 -0
  52. package/dist/lib/translations.mjs.map +1 -0
  53. package/dist/lib/types.mjs +2 -0
  54. package/dist/types/src/FilePlugin.d.ts.map +1 -1
  55. package/dist/types/src/FilePlugin.node.d.ts.map +1 -1
  56. package/dist/types/src/capabilities/FileUploadField.d.ts +12 -0
  57. package/dist/types/src/capabilities/FileUploadField.d.ts.map +1 -0
  58. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  59. package/dist/types/src/capabilities/edge-backend.d.ts +5 -0
  60. package/dist/types/src/capabilities/edge-backend.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/file-uploader.d.ts +1 -1
  62. package/dist/types/src/capabilities/file-uploader.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/index.d.ts +1 -0
  64. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/inline-backend.d.ts +2 -2
  66. package/dist/types/src/capabilities/inline-backend.d.ts.map +1 -1
  67. package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
  68. package/dist/types/src/capabilities/node.d.ts +5 -0
  69. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  71. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  72. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/settings.d.ts +1 -1
  74. package/dist/types/src/components/FileInput/FileInput.d.ts.map +1 -1
  75. package/dist/types/src/components/FilePreview/FilePreview.d.ts +1 -1
  76. package/dist/types/src/components/FilePreview/FilePreview.d.ts.map +1 -1
  77. package/dist/types/src/containers/FileArticle/FileArticle.d.ts +4 -1
  78. package/dist/types/src/containers/FileArticle/FileArticle.d.ts.map +1 -1
  79. package/dist/types/src/containers/FileSettings/FileSettings.d.ts +5 -3
  80. package/dist/types/src/containers/FileSettings/FileSettings.d.ts.map +1 -1
  81. package/dist/types/src/extensions/image.d.ts +0 -2
  82. package/dist/types/src/extensions/image.d.ts.map +1 -1
  83. package/dist/types/src/operations/create.d.ts +14 -5
  84. package/dist/types/src/operations/create.d.ts.map +1 -1
  85. package/dist/types/src/operations/read.d.ts.map +1 -1
  86. package/dist/types/src/types/FileCapabilities.d.ts +10 -28
  87. package/dist/types/src/types/FileCapabilities.d.ts.map +1 -1
  88. package/dist/types/src/types/Settings.d.ts +1 -1
  89. package/dist/types/src/types/Settings.d.ts.map +1 -1
  90. package/dist/types/src/types/limits.d.ts +0 -1
  91. package/dist/types/src/types/limits.d.ts.map +1 -1
  92. package/dist/types/tsconfig.tsbuildinfo +1 -1
  93. package/dx.config.ts +10 -6
  94. package/package.json +45 -41
  95. package/src/FilePlugin.node.ts +2 -1
  96. package/src/FilePlugin.tsx +8 -1
  97. package/src/capabilities/FileUploadField.tsx +37 -0
  98. package/src/capabilities/edge-backend.ts +27 -0
  99. package/src/capabilities/file-uploader.ts +6 -4
  100. package/src/capabilities/index.ts +1 -0
  101. package/src/capabilities/inline-backend.ts +4 -21
  102. package/src/capabilities/markdown-extension.ts +3 -8
  103. package/src/capabilities/node.ts +16 -0
  104. package/src/capabilities/react-surface.ts +46 -0
  105. package/src/components/FileInput/FileInput.tsx +3 -2
  106. package/src/containers/FileArticle/FileArticle.tsx +49 -42
  107. package/src/containers/FileSettings/FileSettings.tsx +19 -14
  108. package/src/extensions/image.tsx +49 -28
  109. package/src/operations/create.test.ts +122 -32
  110. package/src/operations/create.ts +44 -24
  111. package/src/operations/read.ts +24 -6
  112. package/src/types/FileCapabilities.ts +10 -31
  113. package/src/types/Settings.ts +1 -1
  114. package/src/types/limits.ts +0 -2
  115. package/dist/lib/neutral/FileArticle-YU6NN3KN.mjs +0 -80
  116. package/dist/lib/neutral/FileArticle-YU6NN3KN.mjs.map +0 -7
  117. package/dist/lib/neutral/FilePlugin.mjs +0 -58
  118. package/dist/lib/neutral/FilePlugin.mjs.map +0 -7
  119. package/dist/lib/neutral/FilePlugin.node.mjs +0 -23
  120. package/dist/lib/neutral/FilePlugin.node.mjs.map +0 -7
  121. package/dist/lib/neutral/capabilities/index.mjs +0 -23
  122. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  123. package/dist/lib/neutral/chunk-DKGTSUUH.mjs +0 -8
  124. package/dist/lib/neutral/chunk-DKGTSUUH.mjs.map +0 -7
  125. package/dist/lib/neutral/chunk-GMYSEHV4.mjs +0 -40
  126. package/dist/lib/neutral/chunk-GMYSEHV4.mjs.map +0 -7
  127. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  128. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  129. package/dist/lib/neutral/chunk-LBZ4MCLI.mjs +0 -45
  130. package/dist/lib/neutral/chunk-LBZ4MCLI.mjs.map +0 -7
  131. package/dist/lib/neutral/chunk-YODPX62X.mjs +0 -136
  132. package/dist/lib/neutral/chunk-YODPX62X.mjs.map +0 -7
  133. package/dist/lib/neutral/chunk-ZUXUTRAJ.mjs +0 -80
  134. package/dist/lib/neutral/chunk-ZUXUTRAJ.mjs.map +0 -7
  135. package/dist/lib/neutral/components/index.mjs +0 -74
  136. package/dist/lib/neutral/components/index.mjs.map +0 -7
  137. package/dist/lib/neutral/containers/index.mjs +0 -59
  138. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  139. package/dist/lib/neutral/create-IUUG7RI6.mjs +0 -17
  140. package/dist/lib/neutral/create-IUUG7RI6.mjs.map +0 -7
  141. package/dist/lib/neutral/create-object-V667G4ZL.mjs +0 -30
  142. package/dist/lib/neutral/create-object-V667G4ZL.mjs.map +0 -7
  143. package/dist/lib/neutral/file-uploader-BCJH6TUL.mjs +0 -41
  144. package/dist/lib/neutral/file-uploader-BCJH6TUL.mjs.map +0 -7
  145. package/dist/lib/neutral/index.mjs +0 -32
  146. package/dist/lib/neutral/index.mjs.map +0 -7
  147. package/dist/lib/neutral/inline-backend-FGGGDYRB.mjs +0 -37
  148. package/dist/lib/neutral/inline-backend-FGGGDYRB.mjs.map +0 -7
  149. package/dist/lib/neutral/markdown-extension-RA5YNMTW.mjs +0 -230
  150. package/dist/lib/neutral/markdown-extension-RA5YNMTW.mjs.map +0 -7
  151. package/dist/lib/neutral/meta.json +0 -1
  152. package/dist/lib/neutral/meta.mjs +0 -8
  153. package/dist/lib/neutral/meta.mjs.map +0 -7
  154. package/dist/lib/neutral/operation-handler-CPDANWGH.mjs +0 -13
  155. package/dist/lib/neutral/operation-handler-CPDANWGH.mjs.map +0 -7
  156. package/dist/lib/neutral/operations/index.mjs +0 -8
  157. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  158. package/dist/lib/neutral/plugin.mjs +0 -16
  159. package/dist/lib/neutral/plugin.mjs.map +0 -7
  160. package/dist/lib/neutral/react-surface-5BXKSHD2.mjs +0 -60
  161. package/dist/lib/neutral/react-surface-5BXKSHD2.mjs.map +0 -7
  162. package/dist/lib/neutral/read-HG6CSWKR.mjs +0 -28
  163. package/dist/lib/neutral/read-HG6CSWKR.mjs.map +0 -7
  164. package/dist/lib/neutral/settings-RR3RESL2.mjs +0 -28
  165. package/dist/lib/neutral/settings-RR3RESL2.mjs.map +0 -7
  166. package/dist/lib/neutral/skill-definition-YHBGWBUS.mjs +0 -15
  167. package/dist/lib/neutral/skill-definition-YHBGWBUS.mjs.map +0 -7
  168. package/dist/lib/neutral/skills/index.mjs +0 -11
  169. package/dist/lib/neutral/skills/index.mjs.map +0 -7
  170. package/dist/lib/neutral/translations.mjs +0 -36
  171. package/dist/lib/neutral/translations.mjs.map +0 -7
  172. package/dist/lib/neutral/types/index.mjs +0 -22
  173. package/dist/lib/neutral/types/index.mjs.map +0 -7
  174. package/src/capabilities/react-surface.tsx +0 -61
@@ -1,80 +0,0 @@
1
- import {
2
- File,
3
- FileCapabilities_exports,
4
- FileOperation_exports,
5
- MAX_FILE_SIZE,
6
- Settings_exports,
7
- isAcceptedMimeType
8
- } from "./chunk-YODPX62X.mjs";
9
-
10
- // src/operations/create.ts
11
- import * as Effect from "effect/Effect";
12
- import { Capabilities, Capability } from "@dxos/app-framework";
13
- import { Operation } from "@dxos/compute";
14
- var UnsupportedFileTypeError = class extends Error {
15
- type;
16
- constructor(type) {
17
- super(`Unsupported file type: ${type}`), this.type = type;
18
- this.name = "UnsupportedFileTypeError";
19
- }
20
- };
21
- var FileTooLargeError = class extends Error {
22
- size;
23
- limit;
24
- constructor(size, limit = MAX_FILE_SIZE) {
25
- super(`File is too large: ${size} bytes (limit: ${limit} bytes)`), this.size = size, this.limit = limit;
26
- this.name = "FileTooLargeError";
27
- }
28
- };
29
- var NoBackendError = class extends Error {
30
- constructor() {
31
- super("No file storage backend is registered.");
32
- this.name = "NoBackendError";
33
- }
34
- };
35
- var resolveActiveBackend = Effect.gen(function* () {
36
- const backends = yield* Capability.getAll(FileCapabilities_exports.Backend);
37
- if (backends.length === 0) {
38
- return yield* Effect.fail(new NoBackendError());
39
- }
40
- const settingsAtomOpt = yield* Capability.get(FileCapabilities_exports.SettingsAtom).pipe(Effect.option);
41
- const registryOpt = yield* Capability.get(Capabilities.AtomRegistry).pipe(Effect.option);
42
- if (settingsAtomOpt._tag === "Some" && registryOpt._tag === "Some") {
43
- const settings = registryOpt.value.get(settingsAtomOpt.value);
44
- const id = settings.backend ?? Settings_exports.DEFAULT_BACKEND_ID;
45
- const match = backends.find((b) => b.id === id);
46
- if (match) {
47
- return match;
48
- }
49
- }
50
- return backends.find((b) => b.id === Settings_exports.DEFAULT_BACKEND_ID) ?? backends[0];
51
- });
52
- var handler = FileOperation_exports.Create.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ file, db }) {
53
- if (!isAcceptedMimeType(file.type)) {
54
- return yield* Effect.fail(new UnsupportedFileTypeError(file.type));
55
- }
56
- if (file.size > MAX_FILE_SIZE) {
57
- return yield* Effect.fail(new FileTooLargeError(file.size));
58
- }
59
- const backend = yield* resolveActiveBackend;
60
- const info = yield* Effect.promise(() => backend.upload(file, db));
61
- return {
62
- object: File.make({
63
- name: info.name,
64
- type: info.type,
65
- size: info.size,
66
- data: info.data,
67
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
68
- })
69
- };
70
- })));
71
- var create_default = handler;
72
-
73
- export {
74
- UnsupportedFileTypeError,
75
- FileTooLargeError,
76
- NoBackendError,
77
- resolveActiveBackend,
78
- create_default
79
- };
80
- //# sourceMappingURL=chunk-ZUXUTRAJ.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/operations/create.ts"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\n\nimport { File, FileCapabilities, FileOperation, MAX_FILE_SIZE, Settings, isAcceptedMimeType } from '../types';\n\nexport class UnsupportedFileTypeError extends Error {\n constructor(public readonly type: string) {\n super(`Unsupported file type: ${type}`);\n this.name = 'UnsupportedFileTypeError';\n }\n}\n\nexport class FileTooLargeError extends Error {\n constructor(\n public readonly size: number,\n public readonly limit: number = MAX_FILE_SIZE,\n ) {\n super(`File is too large: ${size} bytes (limit: ${limit} bytes)`);\n this.name = 'FileTooLargeError';\n }\n}\n\nexport class NoBackendError extends Error {\n constructor() {\n super('No file storage backend is registered.');\n this.name = 'NoBackendError';\n }\n}\n\n/**\n * Resolve the configured {@link FileCapabilities.Backend} from the plugin\n * settings atom. Falls back to the inline backend (or the first registered\n * one) if the configured id is missing or settings aren't available.\n */\nexport const resolveActiveBackend = Effect.gen(function* () {\n const backends = yield* Capability.getAll(FileCapabilities.Backend);\n if (backends.length === 0) {\n return yield* Effect.fail(new NoBackendError());\n }\n\n const settingsAtomOpt = yield* Capability.get(FileCapabilities.SettingsAtom).pipe(Effect.option);\n const registryOpt = yield* Capability.get(Capabilities.AtomRegistry).pipe(Effect.option);\n\n if (settingsAtomOpt._tag === 'Some' && registryOpt._tag === 'Some') {\n const settings = registryOpt.value.get(settingsAtomOpt.value) as Settings.Settings;\n const id = settings.backend ?? Settings.DEFAULT_BACKEND_ID;\n const match = backends.find((b) => b.id === id);\n if (match) {\n return match;\n }\n }\n\n return backends.find((b) => b.id === Settings.DEFAULT_BACKEND_ID) ?? backends[0];\n});\n\nconst handler: Operation.WithHandler<typeof FileOperation.Create> = FileOperation.Create.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ file, db }) {\n // Validate before hitting the backend so the contract is consistent regardless of backend.\n if (!isAcceptedMimeType(file.type)) {\n return yield* Effect.fail(new UnsupportedFileTypeError(file.type));\n }\n if (file.size > MAX_FILE_SIZE) {\n return yield* Effect.fail(new FileTooLargeError(file.size));\n }\n const backend = yield* resolveActiveBackend;\n const info = yield* Effect.promise(() => backend.upload(file, db));\n return {\n object: File.make({\n name: info.name,\n type: info.type,\n size: info.size,\n data: info.data,\n timestamp: new Date().toISOString(),\n }),\n };\n }),\n ),\n);\n\nexport default handler;\n"],
5
- "mappings": ";;;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,iBAAiB;AAInB,IAAMC,2BAAN,cAAuCC,MAAAA;;EAC5C,YAA4BC,MAAc;AACxC,UAAM,0BAA0BA,IAAAA,EAAM,GAAA,KADZA,OAAAA;AAE1B,SAAKC,OAAO;EACd;AACF;AAEO,IAAMC,oBAAN,cAAgCH,MAAAA;;;EACrC,YACkBI,MACAC,QAAgBC,eAChC;AACA,UAAM,sBAAsBF,IAAAA,kBAAsBC,KAAAA,SAAc,GAAA,KAHhDD,OAAAA,MAAAA,KACAC,QAAAA;AAGhB,SAAKH,OAAO;EACd;AACF;AAEO,IAAMK,iBAAN,cAA6BP,MAAAA;EAClC,cAAc;AACZ,UAAM,wCAAA;AACN,SAAKE,OAAO;EACd;AACF;AAOO,IAAMM,uBAA8BC,WAAI,aAAA;AAC7C,QAAMC,WAAW,OAAOC,WAAWC,OAAOC,yBAAiBC,OAAO;AAClE,MAAIJ,SAASK,WAAW,GAAG;AACzB,WAAO,OAAcC,YAAK,IAAIT,eAAAA,CAAAA;EAChC;AAEA,QAAMU,kBAAkB,OAAON,WAAWO,IAAIL,yBAAiBM,YAAY,EAAEC,KAAYC,aAAM;AAC/F,QAAMC,cAAc,OAAOX,WAAWO,IAAIK,aAAaC,YAAY,EAAEJ,KAAYC,aAAM;AAEvF,MAAIJ,gBAAgBQ,SAAS,UAAUH,YAAYG,SAAS,QAAQ;AAClE,UAAMC,WAAWJ,YAAYK,MAAMT,IAAID,gBAAgBU,KAAK;AAC5D,UAAMC,KAAKF,SAASG,WAAWC,iBAASC;AACxC,UAAMC,QAAQtB,SAASuB,KAAK,CAACC,MAAMA,EAAEN,OAAOA,EAAAA;AAC5C,QAAII,OAAO;AACT,aAAOA;IACT;EACF;AAEA,SAAOtB,SAASuB,KAAK,CAACC,MAAMA,EAAEN,OAAOE,iBAASC,kBAAkB,KAAKrB,SAAS,CAAA;AAChF,CAAA;AAEA,IAAMyB,UAA8DC,sBAAcC,OAAOjB,KACvFkB,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,GAAE,GAAE;AAEvC,MAAI,CAACC,mBAAmBF,KAAKxC,IAAI,GAAG;AAClC,WAAO,OAAce,YAAK,IAAIjB,yBAAyB0C,KAAKxC,IAAI,CAAA;EAClE;AACA,MAAIwC,KAAKrC,OAAOE,eAAe;AAC7B,WAAO,OAAcU,YAAK,IAAIb,kBAAkBsC,KAAKrC,IAAI,CAAA;EAC3D;AACA,QAAMyB,UAAU,OAAOrB;AACvB,QAAMoC,OAAO,OAAcC,eAAQ,MAAMhB,QAAQiB,OAAOL,MAAMC,EAAAA,CAAAA;AAC9D,SAAO;IACLK,QAAQC,KAAKC,KAAK;MAChB/C,MAAM0C,KAAK1C;MACXD,MAAM2C,KAAK3C;MACXG,MAAMwC,KAAKxC;MACX8C,MAAMN,KAAKM;MACXC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;IACnC,CAAA;EACF;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,iBAAelB;",
6
- "names": ["Effect", "Capabilities", "Capability", "Operation", "UnsupportedFileTypeError", "Error", "type", "name", "FileTooLargeError", "size", "limit", "MAX_FILE_SIZE", "NoBackendError", "resolveActiveBackend", "gen", "backends", "Capability", "getAll", "FileCapabilities", "Backend", "length", "fail", "settingsAtomOpt", "get", "SettingsAtom", "pipe", "option", "registryOpt", "Capabilities", "AtomRegistry", "_tag", "settings", "value", "id", "backend", "Settings", "DEFAULT_BACKEND_ID", "match", "find", "b", "handler", "FileOperation", "Create", "Operation", "withHandler", "fnUntraced", "file", "db", "isAcceptedMimeType", "info", "promise", "upload", "object", "File", "make", "data", "timestamp", "Date", "toISOString"]
7
- }
@@ -1,74 +0,0 @@
1
- import "../chunk-J5LGTIGS.mjs";
2
-
3
- // src/components/FileInput/FileInput.tsx
4
- import React, { useCallback } from "react";
5
- import { useDropzone } from "react-dropzone";
6
- import { SchemaEx } from "@dxos/effect";
7
- import { useTranslation } from "@dxos/react-ui";
8
- import { mx } from "@dxos/ui-theme";
9
- import { meta } from "#meta";
10
- import { FileAction, MAX_FILE_SIZE } from "#types";
11
- var FileInput = ({ schema, onChange }) => {
12
- const { t } = useTranslation(meta.profile.key);
13
- const accept = SchemaEx.findAnnotation(schema.ast, FileAction.UploadAnnotationId);
14
- const onDropAccepted = useCallback((files) => onChange?.(files[0]), [
15
- onChange
16
- ]);
17
- const { acceptedFiles, getRootProps, getInputProps, isFocused, isDragAccept, isDragReject } = useDropzone({
18
- multiple: false,
19
- accept,
20
- maxSize: MAX_FILE_SIZE,
21
- onDropAccepted
22
- });
23
- return /* @__PURE__ */ React.createElement("div", {
24
- ...getRootProps(),
25
- className: mx("flex flex-col items-center p-8 border border-separator", isFocused && "focus-ring", isDragAccept && "bg-attention-surface", isDragReject && "border-rose-bg")
26
- }, /* @__PURE__ */ React.createElement("input", getInputProps()), acceptedFiles[0] ? /* @__PURE__ */ React.createElement("p", null, acceptedFiles[0].name) : /* @__PURE__ */ React.createElement("p", null, t("file-input.placeholder")));
27
- };
28
-
29
- // src/components/FilePreview/FilePreview.tsx
30
- import React2 from "react";
31
- import { composable, composableProps } from "@dxos/react-ui";
32
- var FilePreview = composable(({ type, url, children, ...props }, forwardedRef) => {
33
- if (type.startsWith("image/")) {
34
- return /* @__PURE__ */ React2.createElement("img", {
35
- ...composableProps(props, {
36
- classNames: "h-full w-full object-contain"
37
- }),
38
- src: url,
39
- ref: forwardedRef
40
- });
41
- } else if (type.startsWith("video/")) {
42
- return /* @__PURE__ */ React2.createElement("video", {
43
- ...composableProps(props, {
44
- classNames: "h-full w-full object-contain"
45
- }),
46
- src: url,
47
- controls: true,
48
- ref: forwardedRef
49
- });
50
- } else if (type === "application/pdf") {
51
- return /* @__PURE__ */ React2.createElement("iframe", {
52
- ...composableProps(props, {
53
- classNames: "h-full w-full overflow-auto"
54
- }),
55
- src: url,
56
- title: "PDF preview",
57
- ref: forwardedRef
58
- });
59
- } else {
60
- return /* @__PURE__ */ React2.createElement("a", {
61
- ...composableProps(props, {
62
- classNames: "p-4 underline"
63
- }),
64
- href: url,
65
- download: true,
66
- ref: forwardedRef
67
- }, "Download file");
68
- }
69
- });
70
- export {
71
- FileInput,
72
- FilePreview
73
- };
74
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/components/FileInput/FileInput.tsx", "../../../../src/components/FilePreview/FilePreview.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\nimport React, { useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { SchemaEx } from '@dxos/effect';\nimport { useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\nimport { FileAction, MAX_FILE_SIZE } from '#types';\n\nexport type FileInputProps = {\n schema: Schema.Schema.AnyNoContext;\n onChange: (file: File) => void;\n};\n\nexport const FileInput = ({ schema, onChange }: FileInputProps) => {\n const { t } = useTranslation(meta.profile.key);\n const accept = SchemaEx.findAnnotation<Record<string, string[]>>(schema.ast, FileAction.UploadAnnotationId);\n\n const onDropAccepted = useCallback((files: File[]) => onChange?.(files[0]), [onChange]);\n\n const { acceptedFiles, getRootProps, getInputProps, isFocused, isDragAccept, isDragReject } = useDropzone({\n multiple: false,\n accept,\n maxSize: MAX_FILE_SIZE,\n onDropAccepted,\n });\n\n return (\n <div\n {...getRootProps()}\n className={mx(\n 'flex flex-col items-center p-8 border border-separator',\n isFocused && 'focus-ring',\n isDragAccept && 'bg-attention-surface',\n isDragReject && 'border-rose-bg',\n )}\n >\n <input {...getInputProps()} />\n {acceptedFiles[0] ? <p>{acceptedFiles[0].name}</p> : <p>{t('file-input.placeholder')}</p>}\n </div>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { ForwardedRef } from 'react';\n\nimport { composable, composableProps } from '@dxos/react-ui';\n\nexport type FilePreviewProps = { type: string; url: string };\n\n/**\n * File/content preview — image, video, PDF (iframe), or fallback download link.\n */\nexport const FilePreview = composable<HTMLElement, FilePreviewProps>(\n ({ type, url, children, ...props }, forwardedRef) => {\n if (type.startsWith('image/')) {\n return (\n <img\n {...composableProps(props, { classNames: 'h-full w-full object-contain' })}\n src={url}\n ref={forwardedRef as ForwardedRef<HTMLImageElement>}\n />\n );\n } else if (type.startsWith('video/')) {\n return (\n <video\n {...composableProps(props, { classNames: 'h-full w-full object-contain' })}\n src={url}\n controls\n ref={forwardedRef as ForwardedRef<HTMLVideoElement>}\n />\n );\n } else if (type === 'application/pdf') {\n return (\n <iframe\n {...composableProps(props, { classNames: 'h-full w-full overflow-auto' })}\n src={url}\n title='PDF preview'\n ref={forwardedRef as ForwardedRef<HTMLIFrameElement>}\n />\n );\n } else {\n return (\n <a\n {...composableProps(props, { classNames: 'p-4 underline' })}\n href={url}\n download\n ref={forwardedRef as ForwardedRef<HTMLAnchorElement>}\n >\n Download file\n </a>\n );\n }\n },\n);\n"],
5
- "mappings": ";;;AAKA,OAAOA,SAASC,mBAAmB;AACnC,SAASC,mBAAmB;AAE5B,SAASC,gBAAgB;AACzB,SAASC,sBAAsB;AAC/B,SAASC,UAAU;AAEnB,SAASC,YAAY;AACrB,SAASC,YAAYC,qBAAqB;AAOnC,IAAMC,YAAY,CAAC,EAAEC,QAAQC,SAAQ,MAAkB;AAC5D,QAAM,EAAEC,EAAC,IAAKR,eAAeE,KAAKO,QAAQC,GAAG;AAC7C,QAAMC,SAASZ,SAASa,eAAyCN,OAAOO,KAAKV,WAAWW,kBAAkB;AAE1G,QAAMC,iBAAiBlB,YAAY,CAACmB,UAAkBT,WAAWS,MAAM,CAAA,CAAE,GAAG;IAACT;GAAS;AAEtF,QAAM,EAAEU,eAAeC,cAAcC,eAAeC,WAAWC,cAAcC,aAAY,IAAKxB,YAAY;IACxGyB,UAAU;IACVZ;IACAa,SAASpB;IACTW;EACF,CAAA;AAEA,SACE,sBAAA,cAACU,OAAAA;IACE,GAAGP,aAAAA;IACJQ,WAAWzB,GACT,0DACAmB,aAAa,cACbC,gBAAgB,wBAChBC,gBAAgB,gBAAA;KAGlB,sBAAA,cAACK,SAAUR,cAAAA,CAAAA,GACVF,cAAc,CAAA,IAAK,sBAAA,cAACW,KAAAA,MAAGX,cAAc,CAAA,EAAGY,IAAI,IAAQ,sBAAA,cAACD,KAAAA,MAAGpB,EAAE,wBAAA,CAAA,CAAA;AAGjE;;;AC3CA,OAAOsB,YAA6B;AAEpC,SAASC,YAAYC,uBAAuB;AAOrC,IAAMC,cAAcF,WACzB,CAAC,EAAEG,MAAMC,KAAKC,UAAU,GAAGC,MAAAA,GAASC,iBAAAA;AAClC,MAAIJ,KAAKK,WAAW,QAAA,GAAW;AAC7B,WACE,gBAAAT,OAAA,cAACU,OAAAA;MACE,GAAGR,gBAAgBK,OAAO;QAAEI,YAAY;MAA+B,CAAA;MACxEC,KAAKP;MACLQ,KAAKL;;EAGX,WAAWJ,KAAKK,WAAW,QAAA,GAAW;AACpC,WACE,gBAAAT,OAAA,cAACc,SAAAA;MACE,GAAGZ,gBAAgBK,OAAO;QAAEI,YAAY;MAA+B,CAAA;MACxEC,KAAKP;MACLU,UAAAA;MACAF,KAAKL;;EAGX,WAAWJ,SAAS,mBAAmB;AACrC,WACE,gBAAAJ,OAAA,cAACgB,UAAAA;MACE,GAAGd,gBAAgBK,OAAO;QAAEI,YAAY;MAA8B,CAAA;MACvEC,KAAKP;MACLY,OAAM;MACNJ,KAAKL;;EAGX,OAAO;AACL,WACE,gBAAAR,OAAA,cAACkB,KAAAA;MACE,GAAGhB,gBAAgBK,OAAO;QAAEI,YAAY;MAAgB,CAAA;MACzDQ,MAAMd;MACNe,UAAAA;MACAP,KAAKL;OACN,eAAA;EAIL;AACF,CAAA;",
6
- "names": ["React", "useCallback", "useDropzone", "SchemaEx", "useTranslation", "mx", "meta", "FileAction", "MAX_FILE_SIZE", "FileInput", "schema", "onChange", "t", "profile", "key", "accept", "findAnnotation", "ast", "UploadAnnotationId", "onDropAccepted", "files", "acceptedFiles", "getRootProps", "getInputProps", "isFocused", "isDragAccept", "isDragReject", "multiple", "maxSize", "div", "className", "input", "p", "name", "React", "composable", "composableProps", "FilePreview", "type", "url", "children", "props", "forwardedRef", "startsWith", "img", "classNames", "src", "ref", "video", "controls", "iframe", "title", "a", "href", "download"]
7
- }
@@ -1,59 +0,0 @@
1
- import "../chunk-J5LGTIGS.mjs";
2
-
3
- // src/containers/index.ts
4
- import { lazy } from "react";
5
-
6
- // src/containers/FileSettings/FileSettings.tsx
7
- import React, { useCallback } from "react";
8
- import { useCapabilities } from "@dxos/app-framework/ui";
9
- import { Select, useTranslation } from "@dxos/react-ui";
10
- import { Form } from "@dxos/react-ui-form";
11
- import { meta } from "#meta";
12
- import { FileCapabilities, Settings } from "#types";
13
- var FileSettings = ({ settings, onSettingsChange }) => {
14
- const { t } = useTranslation(meta.profile.key);
15
- const backends = useCapabilities(FileCapabilities.Backend);
16
- const requestedId = settings.backend ?? Settings.DEFAULT_BACKEND_ID;
17
- const active = backends.find((b) => b.id === requestedId) ?? backends.find((b) => b.id === Settings.DEFAULT_BACKEND_ID);
18
- const activeId = active?.id ?? Settings.DEFAULT_BACKEND_ID;
19
- const handleChange = useCallback((value) => onSettingsChange?.((current) => ({
20
- ...current,
21
- backend: value
22
- })), [
23
- onSettingsChange
24
- ]);
25
- return /* @__PURE__ */ React.createElement(Form.Root, {
26
- schema: Settings.Settings,
27
- values: settings,
28
- variant: "settings",
29
- readonly: !onSettingsChange,
30
- onValuesChanged: (values) => onSettingsChange?.((current) => ({
31
- ...current,
32
- ...values
33
- }))
34
- }, /* @__PURE__ */ React.createElement(Form.Viewport, {
35
- scroll: true
36
- }, /* @__PURE__ */ React.createElement(Form.Content, null, /* @__PURE__ */ React.createElement(Form.Section, {
37
- title: meta.profile.name ?? meta.profile.key
38
- }, /* @__PURE__ */ React.createElement(Form.Row, {
39
- label: t("settings.backend.label"),
40
- description: active?.description ?? t("settings.backend.description")
41
- }, /* @__PURE__ */ React.createElement(Select.Root, {
42
- value: activeId,
43
- onValueChange: handleChange,
44
- disabled: !onSettingsChange
45
- }, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
46
- placeholder: t("settings.backend.placeholder")
47
- }), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, backends.map((backend) => /* @__PURE__ */ React.createElement(Select.Option, {
48
- key: backend.id,
49
- value: backend.id
50
- }, backend.name))), /* @__PURE__ */ React.createElement(Select.Arrow, null)))))))));
51
- };
52
-
53
- // src/containers/index.ts
54
- var FileArticle = lazy(() => import("../FileArticle-YU6NN3KN.mjs"));
55
- export {
56
- FileArticle,
57
- FileSettings
58
- };
59
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/containers/index.ts", "../../../../src/containers/FileSettings/FileSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const FileArticle: ComponentType<any> = lazy(() => import('./FileArticle'));\n\nexport * from './FileSettings';\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Select, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { FileCapabilities, Settings } from '#types';\n\nexport type FileSettingsProps = AppSurface.SettingsProps<Settings.Settings>;\n\nexport const FileSettings = ({ settings, onSettingsChange }: FileSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n const backends = useCapabilities(FileCapabilities.Backend);\n const requestedId = settings.backend ?? Settings.DEFAULT_BACKEND_ID;\n const active =\n backends.find((b) => b.id === requestedId) ?? backends.find((b) => b.id === Settings.DEFAULT_BACKEND_ID);\n // Use the resolved backend id so the Select never shows a missing/stale value.\n const activeId = active?.id ?? Settings.DEFAULT_BACKEND_ID;\n\n const handleChange = useCallback(\n (value: string) => onSettingsChange?.((current) => ({ ...current, backend: value })),\n [onSettingsChange],\n );\n\n return (\n <Form.Root\n schema={Settings.Settings}\n values={settings}\n variant='settings'\n readonly={!onSettingsChange}\n onValuesChanged={(values) => onSettingsChange?.((current) => ({ ...current, ...values }))}\n >\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n <Form.Row\n label={t('settings.backend.label')}\n description={active?.description ?? t('settings.backend.description')}\n >\n <Select.Root value={activeId} onValueChange={handleChange} disabled={!onSettingsChange}>\n <Select.TriggerButton placeholder={t('settings.backend.placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {backends.map((backend) => (\n <Select.Option key={backend.id} value={backend.id}>\n {backend.name}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Form.Row>\n </Form.Section>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n"],
5
- "mappings": ";;;AAIA,SAA6BA,YAAY;;;ACAzC,OAAOC,SAASC,mBAAmB;AAEnC,SAASC,uBAAuB;AAEhC,SAASC,QAAQC,sBAAsB;AACvC,SAASC,YAAY;AAErB,SAASC,YAAY;AACrB,SAASC,kBAAkBC,gBAAgB;AAIpC,IAAMC,eAAe,CAAC,EAAEC,UAAUC,iBAAgB,MAAqB;AAC5E,QAAM,EAAEC,EAAC,IAAKR,eAAeE,KAAKO,QAAQC,GAAG;AAC7C,QAAMC,WAAWb,gBAAgBK,iBAAiBS,OAAO;AACzD,QAAMC,cAAcP,SAASQ,WAAWV,SAASW;AACjD,QAAMC,SACJL,SAASM,KAAK,CAACC,MAAMA,EAAEC,OAAON,WAAAA,KAAgBF,SAASM,KAAK,CAACC,MAAMA,EAAEC,OAAOf,SAASW,kBAAkB;AAEzG,QAAMK,WAAWJ,QAAQG,MAAMf,SAASW;AAExC,QAAMM,eAAexB,YACnB,CAACyB,UAAkBf,mBAAmB,CAACgB,aAAa;IAAE,GAAGA;IAAST,SAASQ;EAAM,EAAA,GACjF;IAACf;GAAiB;AAGpB,SACE,sBAAA,cAACN,KAAKuB,MAAI;IACRC,QAAQrB,SAASA;IACjBsB,QAAQpB;IACRqB,SAAQ;IACRC,UAAU,CAACrB;IACXsB,iBAAiB,CAACH,WAAWnB,mBAAmB,CAACgB,aAAa;MAAE,GAAGA;MAAS,GAAGG;IAAO,EAAA;KAEtF,sBAAA,cAACzB,KAAK6B,UAAQ;IAACC,QAAAA;KACb,sBAAA,cAAC9B,KAAK+B,SAAO,MACX,sBAAA,cAAC/B,KAAKgC,SAAO;IAACC,OAAOhC,KAAKO,QAAQ0B,QAAQjC,KAAKO,QAAQC;KACrD,sBAAA,cAACT,KAAKmC,KAAG;IACPC,OAAO7B,EAAE,wBAAA;IACT8B,aAAatB,QAAQsB,eAAe9B,EAAE,8BAAA;KAEtC,sBAAA,cAACT,OAAOyB,MAAI;IAACF,OAAOF;IAAUmB,eAAelB;IAAcmB,UAAU,CAACjC;KACpE,sBAAA,cAACR,OAAO0C,eAAa;IAACC,aAAalC,EAAE,8BAAA;MACrC,sBAAA,cAACT,OAAO4C,QAAM,MACZ,sBAAA,cAAC5C,OAAOiC,SAAO,MACb,sBAAA,cAACjC,OAAO+B,UAAQ,MACbnB,SAASiC,IAAI,CAAC9B,YACb,sBAAA,cAACf,OAAO8C,QAAM;IAACnC,KAAKI,QAAQK;IAAIG,OAAOR,QAAQK;KAC5CL,QAAQqB,IAAI,CAAA,CAAA,GAInB,sBAAA,cAACpC,OAAO+C,OAAK,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAUjC;;;AD5DO,IAAMC,cAAkCC,KAAK,MAAM,OAAO,6BAAA,CAAA;",
6
- "names": ["lazy", "React", "useCallback", "useCapabilities", "Select", "useTranslation", "Form", "meta", "FileCapabilities", "Settings", "FileSettings", "settings", "onSettingsChange", "t", "profile", "key", "backends", "Backend", "requestedId", "backend", "DEFAULT_BACKEND_ID", "active", "find", "b", "id", "activeId", "handleChange", "value", "current", "Root", "schema", "values", "variant", "readonly", "onValuesChanged", "Viewport", "scroll", "Content", "Section", "title", "name", "Row", "label", "description", "onValueChange", "disabled", "TriggerButton", "placeholder", "Portal", "map", "Option", "Arrow", "FileArticle", "lazy"]
7
- }
@@ -1,17 +0,0 @@
1
- import {
2
- FileTooLargeError,
3
- NoBackendError,
4
- UnsupportedFileTypeError,
5
- create_default,
6
- resolveActiveBackend
7
- } from "./chunk-ZUXUTRAJ.mjs";
8
- import "./chunk-YODPX62X.mjs";
9
- import "./chunk-J5LGTIGS.mjs";
10
- export {
11
- FileTooLargeError,
12
- NoBackendError,
13
- UnsupportedFileTypeError,
14
- create_default as default,
15
- resolveActiveBackend
16
- };
17
- //# sourceMappingURL=create-IUUG7RI6.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,30 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/capabilities/create-object.ts
4
- import * as Effect from "effect/Effect";
5
- import { Capability } from "@dxos/app-framework";
6
- import { Operation } from "@dxos/compute";
7
- import { Type } from "@dxos/echo";
8
- import { SpaceCapabilities, SpaceOperation } from "@dxos/plugin-space";
9
- import { File, FileAction, FileOperation } from "#types";
10
- var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
11
- return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
12
- id: Type.getTypename(File.File),
13
- inputSchema: FileAction.CreateFileSchema,
14
- createObject: (props, options) => Effect.gen(function* () {
15
- const { object } = yield* Operation.invoke(FileOperation.Create, {
16
- ...props,
17
- db: options.db
18
- });
19
- return yield* Operation.invoke(SpaceOperation.AddObject, {
20
- object,
21
- target: options.target,
22
- targetNodeId: options.targetNodeId
23
- });
24
- })
25
- });
26
- }));
27
- export {
28
- create_object_default as default
29
- };
30
- //# sourceMappingURL=create-object-V667G4ZL.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/create-object.ts"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceCapabilities, SpaceOperation } from '@dxos/plugin-space';\n\nimport { File, FileAction, FileOperation } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(File.File),\n inputSchema: FileAction.CreateFileSchema,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const { object } = yield* Operation.invoke(FileOperation.Create, { ...props, db: options.db });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
5
- "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,mBAAmBC,sBAAsB;AAElD,SAASC,MAAMC,YAAYC,qBAAqB;AAEhD,IAAA,wBAAeP,WAAWQ,WACjBC,kBAAW,aAAA;AAChB,SAAOT,WAAWU,YAAYP,kBAAkBQ,mBAAmB;IACjEC,IAAIV,KAAKW,YAAYR,KAAKA,IAAI;IAC9BS,aAAaR,WAAWS;IACxBC,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAM,EAAEC,OAAM,IAAK,OAAOnB,UAAUoB,OAAOd,cAAce,QAAQ;QAAE,GAAGL;QAAOM,IAAIL,QAAQK;MAAG,CAAA;AAC5F,aAAO,OAAOtB,UAAUoB,OAAOjB,eAAeoB,WAAW;QACvDJ;QACAK,QAAQP,QAAQO;QAChBC,cAAcR,QAAQQ;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "Operation", "Type", "SpaceCapabilities", "SpaceOperation", "File", "FileAction", "FileOperation", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "getTypename", "inputSchema", "CreateFileSchema", "createObject", "props", "options", "gen", "object", "invoke", "Create", "db", "AddObject", "target", "targetNodeId"]
7
- }
@@ -1,41 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/capabilities/file-uploader.ts
4
- import * as Effect from "effect/Effect";
5
- import { Capabilities, Capability } from "@dxos/app-framework";
6
- import { AppCapabilities } from "@dxos/app-toolkit";
7
- import { EffectEx } from "@dxos/effect";
8
- import { SpaceOperation } from "@dxos/plugin-space";
9
- import { FileOperation } from "#types";
10
- var file_uploader_default = Capability.makeModule(Effect.fnUntraced(function* () {
11
- const capabilities = yield* Capability.Service;
12
- return Capability.contributes(AppCapabilities.FileUploader, (db, file) => {
13
- const { invoke } = capabilities.get(Capabilities.OperationInvoker);
14
- const program = Effect.gen(function* () {
15
- const { object } = yield* invoke(FileOperation.Create, {
16
- db,
17
- file
18
- });
19
- yield* invoke(SpaceOperation.AddObject, {
20
- target: db,
21
- object
22
- });
23
- const external = object.data._tag === "external" ? object.data : void 0;
24
- return {
25
- name: object.name ?? file.name,
26
- type: object.type,
27
- ...external?.url ? {
28
- url: external.url
29
- } : {},
30
- ...external?.cid ? {
31
- cid: external.cid
32
- } : {}
33
- };
34
- });
35
- return EffectEx.runAndForwardErrors(program);
36
- });
37
- }));
38
- export {
39
- file_uploader_default as default
40
- };
41
- //# sourceMappingURL=file-uploader-BCJH6TUL.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/file-uploader.ts"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { EffectEx } from '@dxos/effect';\nimport { SpaceOperation } from '@dxos/plugin-space';\n\nimport { FileOperation } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n\n return Capability.contributes(AppCapabilities.FileUploader, (db, file) => {\n const { invoke } = capabilities.get(Capabilities.OperationInvoker);\n const program = Effect.gen(function* () {\n const { object } = yield* invoke(FileOperation.Create, { db, file });\n yield* invoke(SpaceOperation.AddObject, { target: db, object });\n const external = object.data._tag === 'external' ? object.data : undefined;\n return {\n name: object.name ?? file.name,\n type: object.type,\n ...(external?.url ? { url: external.url } : {}),\n ...(external?.cid ? { cid: external.cid } : {}),\n };\n });\n\n return EffectEx.runAndForwardErrors(program);\n });\n }),\n);\n"],
5
- "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,SAASC,gBAAgB;AACzB,SAASC,sBAAsB;AAE/B,SAASC,qBAAqB;AAE9B,IAAA,wBAAeJ,WAAWK,WACjBC,kBAAW,aAAA;AAChB,QAAMC,eAAe,OAAOP,WAAWQ;AAEvC,SAAOR,WAAWS,YAAYR,gBAAgBS,cAAc,CAACC,IAAIC,SAAAA;AAC/D,UAAM,EAAEC,OAAM,IAAKN,aAAaO,IAAIf,aAAagB,gBAAgB;AACjE,UAAMC,UAAiBC,WAAI,aAAA;AACzB,YAAM,EAAEC,OAAM,IAAK,OAAOL,OAAOT,cAAce,QAAQ;QAAER;QAAIC;MAAK,CAAA;AAClE,aAAOC,OAAOV,eAAeiB,WAAW;QAAEC,QAAQV;QAAIO;MAAO,CAAA;AAC7D,YAAMI,WAAWJ,OAAOK,KAAKC,SAAS,aAAaN,OAAOK,OAAOE;AACjE,aAAO;QACLC,MAAMR,OAAOQ,QAAQd,KAAKc;QAC1BC,MAAMT,OAAOS;QACb,GAAIL,UAAUM,MAAM;UAAEA,KAAKN,SAASM;QAAI,IAAI,CAAC;QAC7C,GAAIN,UAAUO,MAAM;UAAEA,KAAKP,SAASO;QAAI,IAAI,CAAC;MAC/C;IACF,CAAA;AAEA,WAAO3B,SAAS4B,oBAAoBd,OAAAA;EACtC,CAAA;AACF,CAAA,CAAA;",
6
- "names": ["Effect", "Capabilities", "Capability", "AppCapabilities", "EffectEx", "SpaceOperation", "FileOperation", "makeModule", "fnUntraced", "capabilities", "Service", "contributes", "FileUploader", "db", "file", "invoke", "get", "OperationInvoker", "program", "gen", "object", "Create", "AddObject", "target", "external", "data", "_tag", "undefined", "name", "type", "url", "cid", "runAndForwardErrors"]
7
- }
@@ -1,32 +0,0 @@
1
- import {
2
- SKILL_KEY,
3
- file_skill_default
4
- } from "./chunk-GMYSEHV4.mjs";
5
- import {
6
- ACCEPTED_MIME,
7
- File,
8
- FileAction,
9
- FileCapabilities_exports,
10
- FileOperation_exports,
11
- MAX_FILE_SIZE,
12
- Settings_exports,
13
- isAcceptedMimeType
14
- } from "./chunk-YODPX62X.mjs";
15
- import {
16
- meta
17
- } from "./chunk-LBZ4MCLI.mjs";
18
- import "./chunk-J5LGTIGS.mjs";
19
- export {
20
- ACCEPTED_MIME,
21
- File,
22
- FileAction,
23
- FileCapabilities_exports as FileCapabilities,
24
- FileOperation_exports as FileOperation,
25
- file_skill_default as FileSkill,
26
- MAX_FILE_SIZE,
27
- SKILL_KEY,
28
- Settings_exports as Settings,
29
- isAcceptedMimeType,
30
- meta
31
- };
32
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,37 +0,0 @@
1
- import {
2
- FileTooLargeError,
3
- UnsupportedFileTypeError
4
- } from "./chunk-ZUXUTRAJ.mjs";
5
- import "./chunk-YODPX62X.mjs";
6
- import "./chunk-J5LGTIGS.mjs";
7
-
8
- // src/capabilities/inline-backend.ts
9
- import * as Effect from "effect/Effect";
10
- import { Capability } from "@dxos/app-framework";
11
- import { File, FileCapabilities, MAX_FILE_SIZE, Settings, isAcceptedMimeType } from "#types";
12
- var inlineBackend = {
13
- id: Settings.DEFAULT_BACKEND_ID,
14
- name: "Inline (ECHO)",
15
- description: "Store the file bytes directly inside the ECHO document. Capped at 4MB; images, videos, and PDFs only.",
16
- upload: async (file) => {
17
- if (!isAcceptedMimeType(file.type)) {
18
- throw new UnsupportedFileTypeError(file.type);
19
- }
20
- if (file.size > MAX_FILE_SIZE) {
21
- throw new FileTooLargeError(file.size);
22
- }
23
- const bytes = new Uint8Array(await file.arrayBuffer());
24
- return {
25
- name: file.name,
26
- type: file.type,
27
- size: bytes.byteLength,
28
- data: File.inlineData(bytes)
29
- };
30
- }
31
- };
32
- var inline_backend_default = Capability.makeModule(() => Effect.succeed(Capability.contributes(FileCapabilities.Backend, inlineBackend)));
33
- export {
34
- inline_backend_default as default,
35
- inlineBackend
36
- };
37
- //# sourceMappingURL=inline-backend-FGGGDYRB.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/inline-backend.ts"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\n\nimport { File, FileCapabilities, MAX_FILE_SIZE, Settings, isAcceptedMimeType } from '#types';\n\nimport { FileTooLargeError, UnsupportedFileTypeError } from '../operations/create';\n\n/**\n * Inline backend: file bytes are stored on the ECHO object itself.\n * Exported standalone for direct testing.\n */\nexport const inlineBackend: FileCapabilities.Backend = {\n id: Settings.DEFAULT_BACKEND_ID,\n name: 'Inline (ECHO)',\n description: 'Store the file bytes directly inside the ECHO document. Capped at 4MB; images, videos, and PDFs only.',\n upload: async (file) => {\n if (!isAcceptedMimeType(file.type)) {\n throw new UnsupportedFileTypeError(file.type);\n }\n // Check size before reading into memory to avoid allocating a large buffer.\n if (file.size > MAX_FILE_SIZE) {\n throw new FileTooLargeError(file.size);\n }\n const bytes = new Uint8Array(await file.arrayBuffer());\n return {\n name: file.name,\n type: file.type,\n size: bytes.byteLength,\n data: File.inlineData(bytes),\n };\n },\n};\n\nexport default Capability.makeModule(() =>\n Effect.succeed(Capability.contributes(FileCapabilities.Backend, inlineBackend)),\n);\n"],
5
- "mappings": ";;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAE3B,SAASC,MAAMC,kBAAkBC,eAAeC,UAAUC,0BAA0B;AAQ7E,IAAMC,gBAA0C;EACrDC,IAAIC,SAASC;EACbC,MAAM;EACNC,aAAa;EACbC,QAAQ,OAAOC,SAAAA;AACb,QAAI,CAACC,mBAAmBD,KAAKE,IAAI,GAAG;AAClC,YAAM,IAAIC,yBAAyBH,KAAKE,IAAI;IAC9C;AAEA,QAAIF,KAAKI,OAAOC,eAAe;AAC7B,YAAM,IAAIC,kBAAkBN,KAAKI,IAAI;IACvC;AACA,UAAMG,QAAQ,IAAIC,WAAW,MAAMR,KAAKS,YAAW,CAAA;AACnD,WAAO;MACLZ,MAAMG,KAAKH;MACXK,MAAMF,KAAKE;MACXE,MAAMG,MAAMG;MACZC,MAAMC,KAAKC,WAAWN,KAAAA;IACxB;EACF;AACF;AAEA,IAAA,yBAAeO,WAAWC,WAAW,MAC5BC,eAAQF,WAAWG,YAAYC,iBAAiBC,SAAS1B,aAAAA,CAAAA,CAAAA;",
6
- "names": ["Effect", "Capability", "File", "FileCapabilities", "MAX_FILE_SIZE", "Settings", "isAcceptedMimeType", "inlineBackend", "id", "Settings", "DEFAULT_BACKEND_ID", "name", "description", "upload", "file", "isAcceptedMimeType", "type", "UnsupportedFileTypeError", "size", "MAX_FILE_SIZE", "FileTooLargeError", "bytes", "Uint8Array", "arrayBuffer", "byteLength", "data", "File", "inlineData", "Capability", "makeModule", "succeed", "contributes", "FileCapabilities", "Backend"]
7
- }