@getpaseo/server 0.1.104-beta.5 → 0.1.104

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 (33) hide show
  1. package/dist/server/server/agent/mcp-server.js +0 -1
  2. package/dist/server/server/agent/mcp-shared.js +1 -1
  3. package/dist/server/server/agent/tools/paseo-tools.js +2 -79
  4. package/dist/server/server/browser-tools/tools.js +0 -49
  5. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-c2eadf48e74404945431866f748641cd.js → desktop-attachment-bridge-050f4066430884830408272e3d9c9f0b.js} +1 -1
  6. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-050f4066430884830408272e3d9c9f0b.js.br +0 -0
  7. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-050f4066430884830408272e3d9c9f0b.js.gz +0 -0
  8. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-2fedddc19192dc5c2aa1f476ca8bda07.js → desktop-attachment-store-31c8a92a7d9967d424e7b11a100a0264.js} +1 -1
  9. package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-2fedddc19192dc5c2aa1f476ca8bda07.js.br → desktop-attachment-store-31c8a92a7d9967d424e7b11a100a0264.js.br} +0 -0
  10. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-31c8a92a7d9967d424e7b11a100a0264.js.gz +0 -0
  11. package/dist/server/web-ui/_expo/static/js/web/{index-94c14e94d2f9f042833a435dd50042c7.js → index-8d9d8c6fc19839009bd4e58964e2cc66.js} +44 -43
  12. package/dist/server/web-ui/_expo/static/js/web/index-8d9d8c6fc19839009bd4e58964e2cc66.js.br +0 -0
  13. package/dist/server/web-ui/_expo/static/js/web/index-8d9d8c6fc19839009bd4e58964e2cc66.js.gz +0 -0
  14. package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-81a312f940a176e8d390657c8ec2c511.js → indexeddb-attachment-store-e0f8c14c129f5fdd50da470a1f8a6360.js} +1 -1
  15. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-e0f8c14c129f5fdd50da470a1f8a6360.js.br +0 -0
  16. package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-81a312f940a176e8d390657c8ec2c511.js.gz → indexeddb-attachment-store-e0f8c14c129f5fdd50da470a1f8a6360.js.gz} +0 -0
  17. package/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-7e696fa918b73c29668de86c5c9608b7.js → native-file-attachment-store-f9d8e1b9c1e085be89c29a52a6350c2c.js} +3 -3
  18. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-f9d8e1b9c1e085be89c29a52a6350c2c.js.br +0 -0
  19. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-f9d8e1b9c1e085be89c29a52a6350c2c.js.gz +0 -0
  20. package/dist/server/web-ui/index.html +1 -1
  21. package/dist/server/web-ui/index.html.br +0 -0
  22. package/dist/server/web-ui/index.html.gz +0 -0
  23. package/package.json +6 -5
  24. package/dist/server/server/agent/wait-for-agent-tracker.d.ts +0 -15
  25. package/dist/server/server/agent/wait-for-agent-tracker.js +0 -53
  26. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-c2eadf48e74404945431866f748641cd.js.br +0 -3
  27. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-c2eadf48e74404945431866f748641cd.js.gz +0 -0
  28. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-2fedddc19192dc5c2aa1f476ca8bda07.js.gz +0 -0
  29. package/dist/server/web-ui/_expo/static/js/web/index-94c14e94d2f9f042833a435dd50042c7.js.br +0 -0
  30. package/dist/server/web-ui/_expo/static/js/web/index-94c14e94d2f9f042833a435dd50042c7.js.gz +0 -0
  31. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-81a312f940a176e8d390657c8ec2c511.js.br +0 -0
  32. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-7e696fa918b73c29668de86c5c9608b7.js.br +0 -0
  33. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-7e696fa918b73c29668de86c5c9608b7.js.gz +0 -0
@@ -59,7 +59,6 @@ export async function createAgentMcpServer(options) {
59
59
  title: tool.title,
60
60
  description: tool.description,
61
61
  inputSchema: tool.inputSchema,
62
- outputSchema: tool.outputSchema,
63
62
  }, async (args, context) => toMcpToolResult(await catalog.executeTool(tool.name, args, { signal: context?.signal })));
64
63
  }
65
64
  return server;
@@ -106,7 +106,7 @@ export async function waitForAgentWithTimeout(agentManager, agentId, options) {
106
106
  });
107
107
  const recentActivity = curateAgentActivity(recent.items);
108
108
  const waitedSeconds = Math.round(AGENT_WAIT_TIMEOUT_MS / 1000);
109
- const message = `Awaiting the agent timed out after ${waitedSeconds}s. This does not mean the agent failed - call wait_for_agent again to continue waiting.\n\nRecent activity:\n${recentActivity}`;
109
+ const message = `Awaiting the agent timed out after ${waitedSeconds}s. This does not mean the agent failed - it is still running. Call get_agent_status to check on it, or continue with other work if you will receive a finish notification.\n\nRecent activity:\n${recentActivity}`;
110
110
  return {
111
111
  status: snapshot?.lifecycle ?? "idle",
112
112
  permission: null,
@@ -7,7 +7,6 @@ import { selectItemsByProjectedLimit } from "../timeline-projection.js";
7
7
  import { ensureAgentLoaded } from "../agent-loading.js";
8
8
  import { isStoredAgentProviderAvailable } from "../../persistence-hooks.js";
9
9
  import { killTerminalsForWorkspace, } from "../../workspace-archive-service.js";
10
- import { WaitForAgentTracker } from "../wait-for-agent-tracker.js";
11
10
  import { createAgentCommand } from "../create-agent/create.js";
12
11
  import { expandUserPath, isSameOrDescendantPath, resolvePathFromBase } from "../../path-utils.js";
13
12
  import { ScheduleRunSchema, ScheduleSummarySchema, StoredScheduleSchema, } from "@getpaseo/protocol/schedule/types";
@@ -231,7 +230,6 @@ function resolveTerminalKeyToken(key, literal) {
231
230
  export function createPaseoToolCatalog(options) {
232
231
  const { agentManager, agentStorage, terminalManager, scheduleService, providerSnapshotManager, callerAgentId, resolveSpeakHandler, resolveCallerContext, logger, } = options;
233
232
  const childLogger = logger.child({ module: "agent", component: "paseo-tool-catalog" });
234
- const waitTracker = new WaitForAgentTracker(logger);
235
233
  const callerContext = callerAgentId ? (resolveCallerContext?.(callerAgentId) ?? null) : null;
236
234
  const parseToolInput = async (tool, input) => {
237
235
  const inputSchema = tool.inputSchema;
@@ -848,7 +846,7 @@ export function createPaseoToolCatalog(options) {
848
846
  // Return immediately for async creation.
849
847
  const currentSnapshot = agentManager.getAgent(snapshot.id) ?? snapshot;
850
848
  const guidance = callerAgentId && notifyOnFinish && initialPromptStarted
851
- ? "You will get notified when the created agent finishes, errors, or needs permission. Do not call wait_for_agent or poll for status; continue with other work until the notification arrives."
849
+ ? "You will get notified when the created agent finishes, errors, or needs permission. Do not poll for status; continue with other work until the notification arrives."
852
850
  : undefined;
853
851
  const response = {
854
852
  content: [],
@@ -1047,73 +1045,6 @@ export function createPaseoToolCatalog(options) {
1047
1045
  throw new Error("unreachable");
1048
1046
  }
1049
1047
  }
1050
- registerTool("wait_for_agent", {
1051
- title: "Wait for agent",
1052
- description: "Block until the agent requests permission or the current run completes. Returns the pending permission (if any) and recent activity summary.",
1053
- inputSchema: {
1054
- agentId: z.string().describe("Agent identifier returned by the create_agent tool"),
1055
- },
1056
- outputSchema: {
1057
- agentId: z.string(),
1058
- status: AgentStatusEnum,
1059
- permission: AgentPermissionRequestPayloadSchema.nullable(),
1060
- lastMessage: z.string().nullable(),
1061
- },
1062
- }, async ({ agentId }, { signal }) => {
1063
- const abortController = new AbortController();
1064
- const cleanupFns = [];
1065
- const cleanup = () => {
1066
- while (cleanupFns.length) {
1067
- const fn = cleanupFns.pop();
1068
- try {
1069
- fn?.();
1070
- }
1071
- catch {
1072
- // ignore cleanup errors
1073
- }
1074
- }
1075
- };
1076
- const forwardExternalAbort = () => {
1077
- if (!abortController.signal.aborted) {
1078
- const reason = signal?.reason ?? new Error("wait_for_agent aborted");
1079
- abortController.abort(reason);
1080
- }
1081
- };
1082
- if (signal) {
1083
- if (signal.aborted) {
1084
- forwardExternalAbort();
1085
- }
1086
- else {
1087
- signal.addEventListener("abort", forwardExternalAbort, { once: true });
1088
- cleanupFns.push(() => signal.removeEventListener("abort", forwardExternalAbort));
1089
- }
1090
- }
1091
- const unregister = waitTracker.register(agentId, (reason) => {
1092
- if (!abortController.signal.aborted) {
1093
- abortController.abort(new Error(reason ?? "wait_for_agent cancelled"));
1094
- }
1095
- });
1096
- cleanupFns.push(unregister);
1097
- try {
1098
- const result = await waitForAgentWithTimeout(agentManager, agentId, {
1099
- signal: abortController.signal,
1100
- });
1101
- const validJson = ensureValidJson({
1102
- agentId,
1103
- status: result.status,
1104
- permission: sanitizePermissionRequest(result.permission),
1105
- lastMessage: result.lastMessage,
1106
- });
1107
- const response = {
1108
- content: [],
1109
- structuredContent: validJson,
1110
- };
1111
- return response;
1112
- }
1113
- finally {
1114
- cleanup();
1115
- }
1116
- });
1117
1048
  registerTool("send_agent_prompt", {
1118
1049
  title: "Send agent prompt",
1119
1050
  description: "Send a task to a running agent. Agent-scoped callers run in background by default; top-level callers wait by default.",
@@ -1126,9 +1057,6 @@ export function createPaseoToolCatalog(options) {
1126
1057
  guidance: z.string().optional(),
1127
1058
  },
1128
1059
  }, async ({ agentId, prompt, sessionMode, background = Boolean(callerAgentId), notifyOnFinish = Boolean(callerAgentId), }) => {
1129
- if (agentManager.hasInFlightRun(agentId)) {
1130
- waitTracker.cancel(agentId, "Agent run interrupted by new prompt");
1131
- }
1132
1060
  const shouldNotifyOnFinish = Boolean(callerAgentId && notifyOnFinish && background);
1133
1061
  await sendPromptToAgent({
1134
1062
  agentManager,
@@ -1175,7 +1103,7 @@ export function createPaseoToolCatalog(options) {
1175
1103
  permission: null,
1176
1104
  ...(shouldNotifyOnFinish
1177
1105
  ? {
1178
- guidance: "You will get notified when the prompted agent finishes, errors, or needs permission. Do not call wait_for_agent or poll for status; continue with other work until the notification arrives.",
1106
+ guidance: "You will get notified when the prompted agent finishes, errors, or needs permission. Do not poll for status; continue with other work until the notification arrives.",
1179
1107
  }
1180
1108
  : {}),
1181
1109
  };
@@ -1278,9 +1206,6 @@ export function createPaseoToolCatalog(options) {
1278
1206
  },
1279
1207
  }, async ({ agentId }) => {
1280
1208
  const { cancelled } = await cancelAgentRunCommand({ agentManager, logger: childLogger }, agentId);
1281
- if (cancelled) {
1282
- waitTracker.cancel(agentId, "Agent run cancelled");
1283
- }
1284
1209
  return {
1285
1210
  content: [],
1286
1211
  structuredContent: ensureValidJson({ success: cancelled }),
@@ -1301,7 +1226,6 @@ export function createPaseoToolCatalog(options) {
1301
1226
  agentStorage,
1302
1227
  logger: childLogger,
1303
1228
  }, agentId);
1304
- waitTracker.cancel(agentId, "Agent archived");
1305
1229
  return {
1306
1230
  content: [],
1307
1231
  structuredContent: ensureValidJson({ success: true }),
@@ -1318,7 +1242,6 @@ export function createPaseoToolCatalog(options) {
1318
1242
  },
1319
1243
  }, async ({ agentId }) => {
1320
1244
  await closeAgentCommand({ agentManager }, agentId);
1321
- waitTracker.cancel(agentId, "Agent terminated");
1322
1245
  return {
1323
1246
  content: [],
1324
1247
  structuredContent: ensureValidJson({ success: true }),
@@ -4,35 +4,6 @@ const HTTP_URL_ONLY_MESSAGE = "URL must use http/https only";
4
4
  const WORKSPACE_CONTEXT_MESSAGE = "This browser tool needs a workspace. Start the agent from a Paseo workspace before calling browser_new_tab or browser_list_tabs.";
5
5
  const URL_WHITESPACE_PATTERN = /\s/;
6
6
  const NON_HTTP_EXPLICIT_SCHEME_PATTERN = /^(?!https?:\/\/)[a-z][a-z0-9+.-]*:\/\//i;
7
- const BrowserToolOutputSchema = {
8
- ok: z.boolean(),
9
- result: z.unknown().optional(),
10
- error: z
11
- .object({
12
- code: z.string(),
13
- message: z.string(),
14
- retryable: z.boolean(),
15
- })
16
- .optional(),
17
- dialogs: z
18
- .array(z.object({
19
- type: z.enum(["alert", "confirm", "prompt", "beforeunload"]),
20
- message: z.string(),
21
- defaultValue: z.string().optional(),
22
- action: z.enum(["accepted", "dismissed"]),
23
- promptText: z.string().optional(),
24
- timestamp: z.number(),
25
- }))
26
- .optional(),
27
- context: z
28
- .object({
29
- agentId: z.string().optional(),
30
- cwd: z.string().optional(),
31
- workspaceId: z.string().optional(),
32
- browserId: z.string().optional(),
33
- })
34
- .optional(),
35
- };
36
7
  const BrowserHttpUrlInputSchema = z
37
8
  .string()
38
9
  .trim()
@@ -65,7 +36,6 @@ export function registerBrowserTools(options) {
65
36
  title: "List browser tabs",
66
37
  description: "List open Paseo browser tabs for this agent's workspace across connected browser automation hosts. Use returned browserId values with tab-scoped tools.",
67
38
  inputSchema: {},
68
- outputSchema: BrowserToolOutputSchema,
69
39
  }, async () => {
70
40
  const context = resolveBrowserToolContext(options);
71
41
  const missingWorkspace = requireWorkspaceContext(context);
@@ -89,7 +59,6 @@ export function registerBrowserTools(options) {
89
59
  inputSchema: {
90
60
  url: BrowserHttpUrlInputSchema.optional(),
91
61
  },
92
- outputSchema: BrowserToolOutputSchema,
93
62
  }, async ({ url }) => {
94
63
  const context = resolveBrowserToolContext(options);
95
64
  const missingWorkspace = requireWorkspaceContext(context);
@@ -113,7 +82,6 @@ export function registerBrowserTools(options) {
113
82
  inputSchema: {
114
83
  browserId: BrowserAutomationBrowserIdSchema,
115
84
  },
116
- outputSchema: BrowserToolOutputSchema,
117
85
  }, async ({ browserId }) => {
118
86
  const context = resolveBrowserToolContext(options);
119
87
  const payload = await options.broker.execute({
@@ -139,7 +107,6 @@ export function registerBrowserTools(options) {
139
107
  doubleClick: z.boolean().optional(),
140
108
  modifiers: z.array(BrowserClickModifierInputSchema).optional(),
141
109
  },
142
- outputSchema: BrowserToolOutputSchema,
143
110
  }, async ({ ref, browserId, button, doubleClick, modifiers }) => {
144
111
  const context = resolveBrowserToolContext(options);
145
112
  const payload = await options.broker.execute({
@@ -167,7 +134,6 @@ export function registerBrowserTools(options) {
167
134
  value: z.string(),
168
135
  browserId: BrowserAutomationBrowserIdSchema,
169
136
  },
170
- outputSchema: BrowserToolOutputSchema,
171
137
  }, async ({ ref, value, browserId }) => {
172
138
  const context = resolveBrowserToolContext(options);
173
139
  const payload = await options.broker.execute({
@@ -189,7 +155,6 @@ export function registerBrowserTools(options) {
189
155
  title: "Wait for browser condition",
190
156
  description: "Wait until a Paseo browser tab contains text or reaches a URL fragment. Use browserId from browser_new_tab or browser_list_tabs; waits up to 5s by default on the browser host.",
191
157
  inputSchema: BrowserWaitInputSchema,
192
- outputSchema: BrowserToolOutputSchema,
193
158
  }, async ({ text, url, timeoutMs, browserId }) => {
194
159
  const context = resolveBrowserToolContext(options);
195
160
  const payload = await options.broker.execute({
@@ -217,7 +182,6 @@ export function registerBrowserTools(options) {
217
182
  ref: BrowserRefInputSchema.optional(),
218
183
  browserId: BrowserAutomationBrowserIdSchema,
219
184
  },
220
- outputSchema: BrowserToolOutputSchema,
221
185
  }, async ({ text, ref, browserId }) => {
222
186
  const context = resolveBrowserToolContext(options);
223
187
  const payload = await options.broker.execute({
@@ -243,7 +207,6 @@ export function registerBrowserTools(options) {
243
207
  ref: BrowserRefInputSchema.optional(),
244
208
  browserId: BrowserAutomationBrowserIdSchema,
245
209
  },
246
- outputSchema: BrowserToolOutputSchema,
247
210
  }, async ({ key, ref, browserId }) => {
248
211
  const context = resolveBrowserToolContext(options);
249
212
  const payload = await options.broker.execute({
@@ -265,7 +228,6 @@ export function registerBrowserTools(options) {
265
228
  title: "Navigate browser",
266
229
  description: "Navigate a Paseo browser tab to a URL. Use browserId from browser_new_tab or browser_list_tabs; pass an http(s) URL or a scheme-less host URL, which is treated as http.",
267
230
  inputSchema: { url: BrowserHttpUrlInputSchema, browserId: BrowserAutomationBrowserIdSchema },
268
- outputSchema: BrowserToolOutputSchema,
269
231
  }, async ({ url, browserId }) => {
270
232
  const context = resolveBrowserToolContext(options);
271
233
  const payload = await options.broker.execute({
@@ -306,7 +268,6 @@ export function registerBrowserTools(options) {
306
268
  title: toolConfig.title,
307
269
  description: toolConfig.description,
308
270
  inputSchema: { browserId: BrowserAutomationBrowserIdSchema },
309
- outputSchema: BrowserToolOutputSchema,
310
271
  }, async ({ browserId }) => {
311
272
  const context = resolveBrowserToolContext(options);
312
273
  const payload = await options.broker.execute({
@@ -330,7 +291,6 @@ export function registerBrowserTools(options) {
330
291
  browserId: BrowserAutomationBrowserIdSchema,
331
292
  fullPage: z.boolean().default(false),
332
293
  },
333
- outputSchema: BrowserToolOutputSchema,
334
294
  }, async ({ browserId, fullPage }) => {
335
295
  const context = resolveBrowserToolContext(options);
336
296
  const payload = await options.broker.execute({
@@ -355,7 +315,6 @@ export function registerBrowserTools(options) {
355
315
  filePaths: z.array(z.string().min(1)).min(1),
356
316
  browserId: BrowserAutomationBrowserIdSchema,
357
317
  },
358
- outputSchema: BrowserToolOutputSchema,
359
318
  }, async ({ ref, filePaths, browserId }) => {
360
319
  const context = resolveBrowserToolContext(options);
361
320
  const payload = await options.broker.execute({
@@ -385,7 +344,6 @@ export function registerBrowserTools(options) {
385
344
  title: toolConfig.title,
386
345
  description: toolConfig.description,
387
346
  inputSchema: { ref: BrowserRefInputSchema, browserId: BrowserAutomationBrowserIdSchema },
388
- outputSchema: BrowserToolOutputSchema,
389
347
  }, async ({ ref, browserId }) => {
390
348
  const context = resolveBrowserToolContext(options);
391
349
  const payload = await options.broker.execute({
@@ -411,7 +369,6 @@ export function registerBrowserTools(options) {
411
369
  value: z.string(),
412
370
  browserId: BrowserAutomationBrowserIdSchema,
413
371
  },
414
- outputSchema: BrowserToolOutputSchema,
415
372
  }, async ({ ref, value, browserId }) => {
416
373
  const context = resolveBrowserToolContext(options);
417
374
  const payload = await options.broker.execute({
@@ -437,7 +394,6 @@ export function registerBrowserTools(options) {
437
394
  targetRef: BrowserRefInputSchema,
438
395
  browserId: BrowserAutomationBrowserIdSchema,
439
396
  },
440
- outputSchema: BrowserToolOutputSchema,
441
397
  }, async ({ sourceRef, targetRef, browserId }) => {
442
398
  const context = resolveBrowserToolContext(options);
443
399
  const payload = await options.broker.execute({
@@ -462,7 +418,6 @@ export function registerBrowserTools(options) {
462
418
  maxEntries: z.number().int().positive().max(200).optional(),
463
419
  browserId: BrowserAutomationBrowserIdSchema,
464
420
  },
465
- outputSchema: BrowserToolOutputSchema,
466
421
  }, async ({ maxEntries, browserId }) => {
467
422
  const context = resolveBrowserToolContext(options);
468
423
  const payload = await options.broker.execute({
@@ -487,7 +442,6 @@ export function registerBrowserTools(options) {
487
442
  ref: BrowserRefInputSchema.optional(),
488
443
  browserId: BrowserAutomationBrowserIdSchema,
489
444
  },
490
- outputSchema: BrowserToolOutputSchema,
491
445
  }, async ({ function: functionSource, ref, browserId }) => {
492
446
  const context = resolveBrowserToolContext(options);
493
447
  const payload = await options.broker.execute({
@@ -514,7 +468,6 @@ export function registerBrowserTools(options) {
514
468
  deltaX: z.number(),
515
469
  deltaY: z.number(),
516
470
  },
517
- outputSchema: BrowserToolOutputSchema,
518
471
  }, async ({ browserId, ref, deltaX, deltaY }) => {
519
472
  const context = resolveBrowserToolContext(options);
520
473
  const payload = await options.broker.execute({
@@ -541,7 +494,6 @@ export function registerBrowserTools(options) {
541
494
  width: z.number().int().positive(),
542
495
  height: z.number().int().positive(),
543
496
  },
544
- outputSchema: BrowserToolOutputSchema,
545
497
  }, async ({ browserId, width, height }) => {
546
498
  const context = resolveBrowserToolContext(options);
547
499
  const payload = await options.broker.execute({
@@ -565,7 +517,6 @@ export function registerBrowserTools(options) {
565
517
  inputSchema: {
566
518
  browserId: BrowserAutomationBrowserIdSchema,
567
519
  },
568
- outputSchema: BrowserToolOutputSchema,
569
520
  }, async ({ browserId }) => {
570
521
  const context = resolveBrowserToolContext(options);
571
522
  const payload = await options.broker.execute({
@@ -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])},4436,[3935,3936]);
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])},4437,[3935,3936]);
@@ -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}'.`)}},4435,[3937]);
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}'.`)}},4436,[3937]);