@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.
- package/node_modules/@getpaseo/client/dist/daemon-client.d.ts +6 -5
- package/node_modules/@getpaseo/client/dist/daemon-client.js +9 -1
- package/node_modules/@getpaseo/client/package.json +3 -3
- package/node_modules/@getpaseo/highlight/package.json +1 -1
- package/node_modules/@getpaseo/plugin/package.json +5 -5
- package/node_modules/@getpaseo/protocol/dist/generated/validation/ws-outbound.aot.js +3610 -3533
- package/node_modules/@getpaseo/protocol/dist/messages.d.ts +89 -0
- package/node_modules/@getpaseo/protocol/dist/messages.js +35 -0
- package/node_modules/@getpaseo/protocol/dist/validation/ws-outbound-schema-metadata.d.ts +14 -0
- package/node_modules/@getpaseo/protocol/package.json +1 -1
- package/node_modules/@getpaseo/relay/package.json +1 -1
- package/node_modules/@getpaseo/server/dist/server/server/agent/providers/pi/agent.d.ts +14 -0
- package/node_modules/@getpaseo/server/dist/server/server/agent/providers/pi/agent.js +79 -4
- package/node_modules/@getpaseo/server/dist/server/server/authorization/operation-permissions.js +2 -0
- package/node_modules/@getpaseo/server/dist/server/server/bootstrap.d.ts +1 -0
- package/node_modules/@getpaseo/server/dist/server/server/bootstrap.js +31 -8
- package/node_modules/@getpaseo/server/dist/server/server/config.js +5 -1
- package/node_modules/@getpaseo/server/dist/server/server/daemon-config-store.js +8 -0
- package/node_modules/@getpaseo/server/dist/server/server/persisted-config.d.ts +3 -0
- package/node_modules/@getpaseo/server/dist/server/server/persisted-config.js +3 -0
- package/node_modules/@getpaseo/server/dist/server/server/session.js +1 -0
- package/node_modules/@getpaseo/server/dist/server/server/websocket-server.js +4 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/shell-detect.d.ts +51 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/shell-detect.js +196 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-manager-factory.d.ts +2 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-manager.d.ts +1 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-manager.js +1 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-persistence.d.ts +15 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-persistence.js +127 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-controller.d.ts +4 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-controller.js +35 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-store.d.ts +19 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-session-store.js +59 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/terminal-worker-protocol.d.ts +1 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/worker-terminal-manager.d.ts +2 -0
- package/node_modules/@getpaseo/server/dist/server/terminal/worker-terminal-manager.js +2 -0
- 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
- 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
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-d6e29a06a5bfb4d50647dcdf2dfc2edc.js.gz +0 -0
- 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
- 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
- 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
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/{index-dc967c46563553e5ecaba6b78fe47585.js → index-d66590127d71cde67bbb3776075bb688.js} +64 -63
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-d66590127d71cde67bbb3776075bb688.js.br +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-d66590127d71cde67bbb3776075bb688.js.gz +0 -0
- 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
- 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
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-35cbb0fd3d120aac9caca241e4dedf6c.js.gz +0 -0
- 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
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-278a4b844d28852fc6ef5dfde6d70583.js.br +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-278a4b844d28852fc6ef5dfde6d70583.js.gz +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/index.html +1 -1
- package/node_modules/@getpaseo/server/dist/server/web-ui/index.html.br +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/index.html.gz +0 -0
- package/node_modules/@getpaseo/server/dist/src/server/persisted-config.js +3 -0
- package/node_modules/@getpaseo/server/package.json +6 -6
- package/package.json +8 -8
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-8569047c23404e68f926a8a0f411b731.js.gz +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-dc967c46563553e5ecaba6b78fe47585.js.br +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/index-dc967c46563553e5ecaba6b78fe47585.js.gz +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b87d428d16d555a6e2a897903a24bc52.js.gz +0 -0
- package/node_modules/@getpaseo/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-44c208843bd97caf1582f78c04c2fa76.js.br +0 -0
- 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
|
|
@@ -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])},
|
|
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]);
|
|
Binary file
|
|
@@ -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}'.`)}},
|
|
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]);
|