@bytetrue/byspace 0.11.3 → 0.12.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 (63) hide show
  1. package/node_modules/@getpaseo/client/dist/daemon-client.d.ts +6 -5
  2. package/node_modules/@getpaseo/client/dist/daemon-client.js +9 -1
  3. package/node_modules/@getpaseo/client/package.json +3 -3
  4. package/node_modules/@getpaseo/highlight/package.json +1 -1
  5. package/node_modules/@getpaseo/plugin/package.json +5 -5
  6. package/node_modules/@getpaseo/protocol/dist/generated/validation/ws-outbound.aot.js +3610 -3533
  7. package/node_modules/@getpaseo/protocol/dist/messages.d.ts +89 -0
  8. package/node_modules/@getpaseo/protocol/dist/messages.js +35 -0
  9. package/node_modules/@getpaseo/protocol/dist/validation/ws-outbound-schema-metadata.d.ts +14 -0
  10. package/node_modules/@getpaseo/protocol/package.json +1 -1
  11. package/node_modules/@getpaseo/relay/package.json +1 -1
  12. package/node_modules/@getpaseo/server/dist/server/server/agent/providers/pi/agent.d.ts +14 -0
  13. package/node_modules/@getpaseo/server/dist/server/server/agent/providers/pi/agent.js +79 -4
  14. package/node_modules/@getpaseo/server/dist/server/server/authorization/operation-permissions.js +2 -0
  15. package/node_modules/@getpaseo/server/dist/server/server/bootstrap.d.ts +1 -0
  16. package/node_modules/@getpaseo/server/dist/server/server/bootstrap.js +31 -8
  17. package/node_modules/@getpaseo/server/dist/server/server/config.js +5 -1
  18. package/node_modules/@getpaseo/server/dist/server/server/daemon-config-store.js +8 -0
  19. package/node_modules/@getpaseo/server/dist/server/server/persisted-config.d.ts +3 -0
  20. package/node_modules/@getpaseo/server/dist/server/server/persisted-config.js +3 -0
  21. package/node_modules/@getpaseo/server/dist/server/server/session.js +1 -0
  22. package/node_modules/@getpaseo/server/dist/server/server/websocket-server.js +4 -0
  23. package/node_modules/@getpaseo/server/dist/server/terminal/shell-detect.d.ts +51 -0
  24. package/node_modules/@getpaseo/server/dist/server/terminal/shell-detect.js +196 -0
  25. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-manager-factory.d.ts +2 -0
  26. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-manager.d.ts +1 -0
  27. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-manager.js +1 -0
  28. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-persistence.d.ts +15 -0
  29. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-persistence.js +127 -0
  30. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-controller.d.ts +4 -0
  31. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-controller.js +35 -0
  32. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-store.d.ts +19 -0
  33. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-store.js +59 -0
  34. package/node_modules/@getpaseo/server/dist/server/terminal/terminal-worker-protocol.d.ts +1 -0
  35. package/node_modules/@getpaseo/server/dist/server/terminal/worker-terminal-manager.d.ts +2 -0
  36. package/node_modules/@getpaseo/server/dist/server/terminal/worker-terminal-manager.js +2 -0
  37. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-8569047c23404e68f926a8a0f411b731.js → desktop-attachment-bridge-d6e29a06a5bfb4d50647dcdf2dfc2edc.js} +1 -1
  38. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-8569047c23404e68f926a8a0f411b731.js.br → desktop-attachment-bridge-d6e29a06a5bfb4d50647dcdf2dfc2edc.js.br} +0 -0
  39. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-d6e29a06a5bfb4d50647dcdf2dfc2edc.js.gz +0 -0
  40. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-49a16787c67d7db16d4dfbaebda6f27b.js → desktop-attachment-store-9917f2388804e462b0df3cf5f1b5df19.js} +1 -1
  41. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-49a16787c67d7db16d4dfbaebda6f27b.js.br → desktop-attachment-store-9917f2388804e462b0df3cf5f1b5df19.js.br} +0 -0
  42. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-49a16787c67d7db16d4dfbaebda6f27b.js.gz → desktop-attachment-store-9917f2388804e462b0df3cf5f1b5df19.js.gz} +0 -0
  43. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{index-dc967c46563553e5ecaba6b78fe47585.js → index-d66590127d71cde67bbb3776075bb688.js} +64 -63
  44. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-d66590127d71cde67bbb3776075bb688.js.br +0 -0
  45. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-d66590127d71cde67bbb3776075bb688.js.gz +0 -0
  46. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-b87d428d16d555a6e2a897903a24bc52.js → indexeddb-attachment-store-35cbb0fd3d120aac9caca241e4dedf6c.js} +1 -1
  47. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-b87d428d16d555a6e2a897903a24bc52.js.br → indexeddb-attachment-store-35cbb0fd3d120aac9caca241e4dedf6c.js.br} +0 -0
  48. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-35cbb0fd3d120aac9caca241e4dedf6c.js.gz +0 -0
  49. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-44c208843bd97caf1582f78c04c2fa76.js → native-file-attachment-store-278a4b844d28852fc6ef5dfde6d70583.js} +3 -3
  50. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-278a4b844d28852fc6ef5dfde6d70583.js.br +0 -0
  51. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-278a4b844d28852fc6ef5dfde6d70583.js.gz +0 -0
  52. package/node_modules/@getpaseo/server/dist/server/web-ui/index.html +1 -1
  53. package/node_modules/@getpaseo/server/dist/server/web-ui/index.html.br +0 -0
  54. package/node_modules/@getpaseo/server/dist/server/web-ui/index.html.gz +0 -0
  55. package/node_modules/@getpaseo/server/dist/src/server/persisted-config.js +3 -0
  56. package/node_modules/@getpaseo/server/package.json +6 -6
  57. package/package.json +8 -8
  58. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-8569047c23404e68f926a8a0f411b731.js.gz +0 -0
  59. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-dc967c46563553e5ecaba6b78fe47585.js.br +0 -0
  60. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-dc967c46563553e5ecaba6b78fe47585.js.gz +0 -0
  61. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b87d428d16d555a6e2a897903a24bc52.js.gz +0 -0
  62. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-44c208843bd97caf1582f78c04c2fa76.js.br +0 -0
  63. package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-44c208843bd97caf1582f78c04c2fa76.js.gz +0 -0
@@ -1,4 +1,6 @@
1
1
  import { killTerminalsForWorkspace as killWorkspaceTerminals } from "../server/workspace-archive-service.js";
2
+ import { detectInstalledShells } from "./shell-detect.js";
3
+ import { resolveDefaultTerminalShell } from "./terminal.js";
2
4
  import { TerminalStreamOpcode, decodeTerminalResizePayload, encodeTerminalStreamFrame, } from "@getpaseo/protocol/binary-frames/index";
3
5
  import { TerminalOutputCoalescer } from "./terminal-output-coalescer.js";
4
6
  import { MAX_CLIENT_BUFFERED_BYTES, MAX_TERMINAL_OUTPUT_FRAME_BYTES, encodeLegacyTerminalSnapshotFrame, encodeTerminalRestoreFrame, resolveRestoreAfterOutputOverflow, resolveTerminalRestoreSnapshotOptions, resolveTerminalSubscriptionSnapshotMode, } from "./terminal-restore.js";
@@ -16,6 +18,7 @@ const TERMINAL_MESSAGE_TYPES = new Set([
16
18
  "kill_terminal_request",
17
19
  "capture_terminal_request",
18
20
  "terminal.rename.request",
21
+ "terminal.shell.detect.request",
19
22
  ]);
20
23
  export class TerminalSessionController {
21
24
  constructor(options) {
@@ -43,6 +46,7 @@ export class TerminalSessionController {
43
46
  (async () => (await this.listTerminalWorkspaceRefs()).map((workspace) => workspace.cwd));
44
47
  this.clientSupportsWrapReflow = options.clientSupportsWrapReflow ?? (() => false);
45
48
  this.getClientBufferedAmount = options.getClientBufferedAmount ?? (() => 0);
49
+ this.getConfiguredDefaultShell = options.getConfiguredDefaultShell ?? (() => undefined);
46
50
  }
47
51
  start() {
48
52
  if (!this.terminalManager) {
@@ -103,6 +107,8 @@ export class TerminalSessionController {
103
107
  return this.handleCaptureTerminalRequest(msg);
104
108
  case "terminal.rename.request":
105
109
  return this.handleRenameTerminalRequest(msg);
110
+ case "terminal.shell.detect.request":
111
+ return this.handleShellDetectRequest(msg);
106
112
  default:
107
113
  return undefined;
108
114
  }
@@ -442,6 +448,35 @@ export class TerminalSessionController {
442
448
  const renamed = this.terminalManager.setTerminalTitle(msg.terminalId, title);
443
449
  respond(renamed, renamed ? null : "Terminal not found");
444
450
  }
451
+ async handleShellDetectRequest(msg) {
452
+ const respond = (payload) => {
453
+ this.emit({
454
+ type: "terminal.shell.detect.response",
455
+ payload: { ...payload, requestId: msg.requestId },
456
+ });
457
+ };
458
+ try {
459
+ const configured = this.getConfiguredDefaultShell() ?? undefined;
460
+ const [shells, resolvedDefault] = await Promise.all([
461
+ detectInstalledShells(),
462
+ Promise.resolve(resolveDefaultTerminalShell()),
463
+ ]);
464
+ respond({
465
+ shells,
466
+ resolvedDefault,
467
+ ...(configured !== undefined ? { configured } : {}),
468
+ error: null,
469
+ });
470
+ }
471
+ catch (error) {
472
+ this.sessionLogger.error({ err: error }, "Failed to detect installed shells");
473
+ respond({
474
+ shells: [],
475
+ resolvedDefault: resolveDefaultTerminalShell(),
476
+ error: error instanceof Error ? error.message : String(error),
477
+ });
478
+ }
479
+ }
445
480
  async handleSubscribeTerminalRequest(msg) {
446
481
  if (!this.terminalManager) {
447
482
  this.emit({
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const PersistedTerminalSessionSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ cwd: z.ZodString;
5
+ workspaceId: z.ZodString;
6
+ name: z.ZodString;
7
+ command: z.ZodOptional<z.ZodString>;
8
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ }, z.core.$strict>;
10
+ export type PersistedTerminalSession = z.infer<typeof PersistedTerminalSessionSchema>;
11
+ export declare class TerminalSessionStore {
12
+ private readonly filePath;
13
+ private writeQueue;
14
+ constructor(filePath: string);
15
+ load(): Promise<PersistedTerminalSession[]>;
16
+ loadOrNull(): Promise<PersistedTerminalSession[] | null>;
17
+ replace(records: readonly PersistedTerminalSession[]): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=terminal-session-store.d.ts.map
@@ -0,0 +1,59 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { z } from "zod";
3
+ import { writeJsonFileAtomic } from "../server/atomic-file.js";
4
+ // Terminal sessions live only in the daemon (and its terminal worker) process.
5
+ // This store persists just enough metadata to recreate the tabs — not the
6
+ // processes or their scrollback — after a daemon restart. Written on every
7
+ // membership change (create/exit/kill) via the persisting manager wrapper.
8
+ export const PersistedTerminalSessionSchema = z.strictObject({
9
+ id: z.string().min(1),
10
+ cwd: z.string().min(1),
11
+ workspaceId: z.string().min(1),
12
+ name: z.string().min(1),
13
+ command: z.string().min(1).optional(),
14
+ args: z.array(z.string()).optional(),
15
+ });
16
+ const PersistedTerminalSessionFileSchema = z.array(PersistedTerminalSessionSchema);
17
+ export class TerminalSessionStore {
18
+ constructor(filePath) {
19
+ this.writeQueue = Promise.resolve();
20
+ this.filePath = filePath;
21
+ }
22
+ async load() {
23
+ let raw;
24
+ try {
25
+ raw = await fs.readFile(this.filePath, "utf8");
26
+ }
27
+ catch (error) {
28
+ if (error.code === "ENOENT") {
29
+ return [];
30
+ }
31
+ throw error;
32
+ }
33
+ try {
34
+ return PersistedTerminalSessionFileSchema.parse(JSON.parse(raw));
35
+ }
36
+ catch (error) {
37
+ // A corrupt file must never block daemon startup; the next membership
38
+ // change rewrites it from the live mirror.
39
+ throw new Error(`Corrupt terminal session store at ${this.filePath}: ${String(error)}`, {
40
+ cause: error,
41
+ });
42
+ }
43
+ }
44
+ async loadOrNull() {
45
+ try {
46
+ return await this.load();
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ replace(records) {
53
+ const next = this.writeQueue.then(() => writeJsonFileAtomic(this.filePath, records));
54
+ // Keep the queue alive after a failed write so later writes still run.
55
+ this.writeQueue = next.catch(() => undefined);
56
+ return next;
57
+ }
58
+ }
59
+ //# sourceMappingURL=terminal-session-store.js.map
@@ -17,6 +17,7 @@ export interface WorkerCreateTerminalOptions {
17
17
  name?: string;
18
18
  title?: string;
19
19
  env?: Record<string, string>;
20
+ shell?: string;
20
21
  command?: string;
21
22
  args?: string[];
22
23
  rows?: number;
@@ -13,6 +13,8 @@ interface WorkerTerminalManagerOptions {
13
13
  requestTimeoutMs?: number;
14
14
  forkWorker?: () => TerminalWorkerProcess;
15
15
  getTerminalActivityUrl?: () => string | null;
16
+ /** Reads daemon.terminalDefaultShell; nullish means auto. */
17
+ getDefaultShell?: () => string | null | undefined;
16
18
  }
17
19
  export declare function createWorkerTerminalManager(managerOptions?: WorkerTerminalManagerOptions): TerminalManager;
18
20
  export declare function terminateWorkerTerminalManager(manager: TerminalManager): void;
@@ -552,6 +552,7 @@ export function createWorkerTerminalManager(managerOptions = {}) {
552
552
  const terminalId = options.id ?? randomUUID();
553
553
  const activityToken = createActivityToken();
554
554
  const terminalActivityUrl = managerOptions.getTerminalActivityUrl?.() ?? null;
555
+ const configuredShell = options.shell ?? managerOptions.getDefaultShell?.() ?? undefined;
555
556
  terminalActivityTokenById.set(terminalId, activityToken);
556
557
  let result;
557
558
  try {
@@ -560,6 +561,7 @@ export function createWorkerTerminalManager(managerOptions = {}) {
560
561
  options: {
561
562
  ...options,
562
563
  id: terminalId,
564
+ ...(configuredShell !== undefined ? { shell: configuredShell } : {}),
563
565
  activityToken,
564
566
  activityUrl: terminalActivityUrl,
565
567
  },
@@ -1 +1 @@
1
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.createDesktopAttachmentBridge=function(){const l=(0,s.createDesktopPreviewUrlResolver)({reader:(0,s.createDesktopFileReader)(),objectUrls:(0,s.createBrowserObjectUrlMinter)()});return{copyFile:t.copyDesktopAttachmentFile,writeBase64:t.writeDesktopAttachmentBase64,writeBytes:t.writeDesktopAttachmentBytes,deleteFile:t.deleteDesktopAttachmentFile,garbageCollect:t.garbageCollectDesktopAttachmentFiles,readFileBase64:s.readDesktopFileBase64,resolvePreviewUrl:t=>l.resolve(t),releasePreviewUrl:t=>l.release(t)}};var t=r(d[0]),s=r(d[1])},4984,[4351,4352]);
1
+ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.createDesktopAttachmentBridge=function(){const l=(0,s.createDesktopPreviewUrlResolver)({reader:(0,s.createDesktopFileReader)(),objectUrls:(0,s.createBrowserObjectUrlMinter)()});return{copyFile:t.copyDesktopAttachmentFile,writeBase64:t.writeDesktopAttachmentBase64,writeBytes:t.writeDesktopAttachmentBytes,deleteFile:t.deleteDesktopAttachmentFile,garbageCollect:t.garbageCollectDesktopAttachmentFiles,readFileBase64:s.readDesktopFileBase64,resolvePreviewUrl:t=>l.resolve(t),releasePreviewUrl:t=>l.release(t)}};var t=r(d[0]),s=r(d[1])},4985,[4351,4352]);
@@ -1 +1 @@
1
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.createDesktopAttachmentStore=function(n){return{storageType:"desktop-file",async save(s){const o=s.id??(0,t.generateAttachmentId)(),l=s.fileName??null;if("file_uri"===s.source.kind)return await c(n,{id:o,uri:s.source.uri,mimeType:s.mimeType,fileName:l});if("data_url"===s.source.kind){const c=(0,t.parseDataUrl)(s.source.dataUrl),p=(0,t.normalizeMimeType)(s.mimeType??c.mimeType);return await y(n,{id:o,base64:c.base64,mimeType:p,fileName:l})}if("bytes"===s.source.kind){const c=(0,t.normalizeMimeType)(s.mimeType);return await p(n,{id:o,bytes:s.source.bytes,mimeType:c,fileName:l})}const f=(0,t.normalizeMimeType)(s.mimeType??s.source.blob.type),u=await(0,t.blobToBase64)(s.source.blob);return await y(n,{id:o,base64:u,mimeType:f,fileName:l})},encodeBase64:async({attachment:t})=>(f(t),await n.readFileBase64(t.storageKey)),resolvePreviewUrl:async({attachment:t})=>(f(t),await n.resolvePreviewUrl(t)),async releasePreviewUrl({attachment:t,url:s}){f(t),await n.releasePreviewUrl({url:s})},async delete({attachment:t}){f(t),await n.deleteFile({path:t.storageKey})},async garbageCollect({referencedIds:t}){await n.garbageCollect({referencedIds:Array.from(t)})}}};var t=r(d[0]);const n={"image/png":".png","image/jpeg":".jpg","image/jpg":".jpg","image/gif":".gif","image/webp":".webp","image/avif":".avif","image/heic":".heic","image/heif":".heif","image/tiff":".tiff","image/bmp":".bmp","image/svg+xml":".svg"};function s(t){const n=t.replace(/\\/g,"/").split("/"),s=n[n.length-1];return s&&s.length>0?s:null}function o(s){const o=(0,t.getFileExtensionFromName)(s.fileName);if(o)return o;const l=(0,t.getFileExtensionFromName)(s.sourcePath);return l||(n[s.mimeType]??".img")}function l(t){return{id:t.id,mimeType:t.mimeType,storageType:"desktop-file",storageKey:t.storagePath,fileName:t.fileName??null,byteSize:t.byteSize,createdAt:Date.now()}}async function c(n,c){const y=(0,t.fileUriToPath)(c.uri),p=c.fileName??s(y),f=(0,t.normalizeMimeType)(c.mimeType),u=o({fileName:p,sourcePath:y,mimeType:f}),T=await n.copyFile({attachmentId:c.id,sourcePath:y,extension:u});return l({id:c.id,mimeType:f,storagePath:T.path,byteSize:T.byteSize,fileName:p})}async function y(t,n){const s=o({fileName:n.fileName,mimeType:n.mimeType}),c=await t.writeBase64({attachmentId:n.id,base64:n.base64,extension:s});return l({id:n.id,mimeType:n.mimeType,storagePath:c.path,byteSize:c.byteSize,fileName:n.fileName})}async function p(t,n){const s=o({fileName:n.fileName,mimeType:n.mimeType}),c=await t.writeBytes({attachmentId:n.id,bytes:n.bytes,extension:s});return l({id:n.id,mimeType:n.mimeType,storagePath:c.path,byteSize:c.byteSize,fileName:n.fileName})}function f(t){if("desktop-file"!==t.storageType)throw new Error(`Unsupported desktop attachment storage type '${t.storageType}'.`)}},4983,[4345]);
1
+ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.createDesktopAttachmentStore=function(n){return{storageType:"desktop-file",async save(s){const o=s.id??(0,t.generateAttachmentId)(),l=s.fileName??null;if("file_uri"===s.source.kind)return await c(n,{id:o,uri:s.source.uri,mimeType:s.mimeType,fileName:l});if("data_url"===s.source.kind){const c=(0,t.parseDataUrl)(s.source.dataUrl),p=(0,t.normalizeMimeType)(s.mimeType??c.mimeType);return await y(n,{id:o,base64:c.base64,mimeType:p,fileName:l})}if("bytes"===s.source.kind){const c=(0,t.normalizeMimeType)(s.mimeType);return await p(n,{id:o,bytes:s.source.bytes,mimeType:c,fileName:l})}const f=(0,t.normalizeMimeType)(s.mimeType??s.source.blob.type),u=await(0,t.blobToBase64)(s.source.blob);return await y(n,{id:o,base64:u,mimeType:f,fileName:l})},encodeBase64:async({attachment:t})=>(f(t),await n.readFileBase64(t.storageKey)),resolvePreviewUrl:async({attachment:t})=>(f(t),await n.resolvePreviewUrl(t)),async releasePreviewUrl({attachment:t,url:s}){f(t),await n.releasePreviewUrl({url:s})},async delete({attachment:t}){f(t),await n.deleteFile({path:t.storageKey})},async garbageCollect({referencedIds:t}){await n.garbageCollect({referencedIds:Array.from(t)})}}};var t=r(d[0]);const n={"image/png":".png","image/jpeg":".jpg","image/jpg":".jpg","image/gif":".gif","image/webp":".webp","image/avif":".avif","image/heic":".heic","image/heif":".heif","image/tiff":".tiff","image/bmp":".bmp","image/svg+xml":".svg"};function s(t){const n=t.replace(/\\/g,"/").split("/"),s=n[n.length-1];return s&&s.length>0?s:null}function o(s){const o=(0,t.getFileExtensionFromName)(s.fileName);if(o)return o;const l=(0,t.getFileExtensionFromName)(s.sourcePath);return l||(n[s.mimeType]??".img")}function l(t){return{id:t.id,mimeType:t.mimeType,storageType:"desktop-file",storageKey:t.storagePath,fileName:t.fileName??null,byteSize:t.byteSize,createdAt:Date.now()}}async function c(n,c){const y=(0,t.fileUriToPath)(c.uri),p=c.fileName??s(y),f=(0,t.normalizeMimeType)(c.mimeType),u=o({fileName:p,sourcePath:y,mimeType:f}),T=await n.copyFile({attachmentId:c.id,sourcePath:y,extension:u});return l({id:c.id,mimeType:f,storagePath:T.path,byteSize:T.byteSize,fileName:p})}async function y(t,n){const s=o({fileName:n.fileName,mimeType:n.mimeType}),c=await t.writeBase64({attachmentId:n.id,base64:n.base64,extension:s});return l({id:n.id,mimeType:n.mimeType,storagePath:c.path,byteSize:c.byteSize,fileName:n.fileName})}async function p(t,n){const s=o({fileName:n.fileName,mimeType:n.mimeType}),c=await t.writeBytes({attachmentId:n.id,bytes:n.bytes,extension:s});return l({id:n.id,mimeType:n.mimeType,storagePath:c.path,byteSize:c.byteSize,fileName:n.fileName})}function f(t){if("desktop-file"!==t.storageType)throw new Error(`Unsupported desktop attachment storage type '${t.storageType}'.`)}},4984,[4345]);