@moxt-ai/mobius 0.0.167 → 0.0.168

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.
@@ -1,8 +1,12 @@
1
1
  import type { SessionUpdate } from "@agentclientprotocol/sdk";
2
2
  import type { ExternalContentStore } from "./local-external-content-store.ts";
3
+ export interface PreparedAcpUpdate {
4
+ readonly agent: SessionUpdate;
5
+ readonly event: unknown;
6
+ }
3
7
  export declare class AcpContentExternalizer {
4
8
  #private;
5
9
  constructor(store: ExternalContentStore);
6
- readonly update: (sessionId: string, update: SessionUpdate, signal: AbortSignal) => Promise<unknown>;
10
+ readonly update: (sessionId: string, update: SessionUpdate, signal: AbortSignal) => Promise<PreparedAcpUpdate>;
7
11
  }
8
12
  //# sourceMappingURL=acp-content-externalizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"acp-content-externalizer.d.ts","sourceRoot":"","sources":["../../src/external-content/acp-content-externalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,aAAa,EAAmB,MAAM,0BAA0B,CAAC;AAC7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAe9E,qBAAa,sBAAsB;;IAG/B,YAAY,KAAK,EAAE,oBAAoB,EAEtC;IAsFD,QAAQ,CAAC,MAAM,cAAqB,MAAM,UAAU,aAAa,UAAU,WAAW,KAAG,OAAO,CAAC,OAAO,CAAC,CAoCvG;CACL"}
1
+ {"version":3,"file":"acp-content-externalizer.d.ts","sourceRoot":"","sources":["../../src/external-content/acp-content-externalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,aAAa,EAAmB,MAAM,0BAA0B,CAAC;AAG7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAwB9E,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CAC3B;AAYD,qBAAa,sBAAsB;;IAG/B,YAAY,KAAK,EAAE,oBAAoB,EAEtC;IAsLD,QAAQ,CAAC,MAAM,cACA,MAAM,UACT,aAAa,UACb,WAAW,KACpB,OAAO,CAAC,iBAAiB,CAAC,CAqC3B;CACL"}
@@ -1,3 +1,5 @@
1
+ import { z } from "zod";
2
+ import { sniffRasterMime } from "../authorization/local-raster.js";
1
3
  const MAXIMUM_ENCODED_CONTENT_CHARACTERS = 4_000_000;
2
4
  function decodeBase64(data) {
3
5
  if (data.length > MAXIMUM_ENCODED_CONTENT_CHARACTERS ||
@@ -5,7 +7,19 @@ function decodeBase64(data) {
5
7
  !/^[A-Za-z0-9+/]*={0,2}$/u.test(data)) {
6
8
  throw new Error("The ACP embedded content is not valid bounded base64");
7
9
  }
8
- return Buffer.from(data, "base64");
10
+ const bytes = Buffer.from(data, "base64");
11
+ if (bytes.toString("base64") !== data) {
12
+ throw new Error("The ACP embedded content is not canonical base64");
13
+ }
14
+ return bytes;
15
+ }
16
+ const embeddedImageSchema = z.looseObject({
17
+ type: z.literal("image"),
18
+ data: z.string(),
19
+ mimeType: z.string(),
20
+ });
21
+ function isRecord(value) {
22
+ return typeof value === "object" && value !== null && !Array.isArray(value);
9
23
  }
10
24
  export class AcpContentExternalizer {
11
25
  #store;
@@ -16,32 +30,46 @@ export class AcpContentExternalizer {
16
30
  switch (content.type) {
17
31
  case "text":
18
32
  case "resource_link":
19
- return content;
33
+ return { agent: content, event: content };
20
34
  case "image": {
21
35
  if (content.data.length === 0) {
22
- return content;
36
+ return { agent: content, event: content };
37
+ }
38
+ try {
39
+ const bytes = decodeBase64(content.data);
40
+ if (sniffRasterMime(bytes) !== content.mimeType) {
41
+ throw new Error("Embedded image bytes do not match a supported image MIME type");
42
+ }
43
+ const stored = await this.#store.put({
44
+ bytes,
45
+ kind: "image",
46
+ mediaType: content.mimeType,
47
+ name: "image",
48
+ sessionId,
49
+ signal,
50
+ });
51
+ return {
52
+ agent: { ...content, data: "", uri: `mobius-content:image:${stored.key}` },
53
+ event: {
54
+ _meta: content._meta,
55
+ annotations: content.annotations,
56
+ byteLength: stored.byteLength,
57
+ imageKey: stored.key,
58
+ mimeType: content.mimeType,
59
+ type: "external_image",
60
+ uri: content.uri,
61
+ },
62
+ };
63
+ }
64
+ catch {
65
+ signal.throwIfAborted();
66
+ const unavailable = { type: "text", text: "[Image unavailable]" };
67
+ return { agent: unavailable, event: unavailable };
23
68
  }
24
- const stored = await this.#store.put({
25
- bytes: decodeBase64(content.data),
26
- kind: "image",
27
- mediaType: content.mimeType,
28
- name: "image",
29
- sessionId,
30
- signal,
31
- });
32
- return {
33
- _meta: content._meta,
34
- annotations: content.annotations,
35
- byteLength: stored.byteLength,
36
- imageKey: stored.key,
37
- mimeType: content.mimeType,
38
- type: "external_image",
39
- uri: content.uri,
40
- };
41
69
  }
42
70
  case "audio": {
43
71
  if (content.data.length === 0) {
44
- return content;
72
+ return { agent: content, event: content };
45
73
  }
46
74
  const stored = await this.#store.put({
47
75
  bytes: decodeBase64(content.data),
@@ -52,12 +80,15 @@ export class AcpContentExternalizer {
52
80
  signal,
53
81
  });
54
82
  return {
55
- _meta: content._meta,
56
- annotations: content.annotations,
57
- audioKey: stored.key,
58
- byteLength: stored.byteLength,
59
- mimeType: content.mimeType,
60
- type: "external_audio",
83
+ agent: content,
84
+ event: {
85
+ _meta: content._meta,
86
+ annotations: content.annotations,
87
+ audioKey: stored.key,
88
+ byteLength: stored.byteLength,
89
+ mimeType: content.mimeType,
90
+ type: "external_audio",
91
+ },
61
92
  };
62
93
  }
63
94
  case "resource": {
@@ -65,7 +96,7 @@ export class AcpContentExternalizer {
65
96
  const encoding = "text" in embedded ? "text" : "binary";
66
97
  const bytes = "text" in embedded ? Buffer.from(embedded.text, "utf8") : decodeBase64(embedded.blob);
67
98
  if (bytes.byteLength === 0) {
68
- return content;
99
+ return { agent: content, event: content };
69
100
  }
70
101
  const mediaType = embedded.mimeType ?? "application/octet-stream";
71
102
  const stored = await this.#store.put({
@@ -77,45 +108,116 @@ export class AcpContentExternalizer {
77
108
  signal,
78
109
  });
79
110
  return {
80
- _meta: content._meta,
81
- annotations: content.annotations,
82
- byteLength: stored.byteLength,
83
- encoding,
84
- mimeType: embedded.mimeType,
85
- resourceKey: stored.key,
86
- type: "external_resource",
87
- uri: embedded.uri,
111
+ agent: content,
112
+ event: {
113
+ _meta: content._meta,
114
+ annotations: content.annotations,
115
+ byteLength: stored.byteLength,
116
+ encoding,
117
+ mimeType: embedded.mimeType,
118
+ resourceKey: stored.key,
119
+ type: "external_resource",
120
+ uri: embedded.uri,
121
+ },
88
122
  };
89
123
  }
90
124
  }
91
125
  }
92
- async #toolContent(sessionId, item, signal) {
93
- return item.type === "content"
94
- ? { ...item, content: await this.#content(sessionId, item.content, signal) }
95
- : item;
126
+ async #rawOutput(sessionId, value, images, signal, depth = 0) {
127
+ signal.throwIfAborted();
128
+ if (depth > 16) {
129
+ throw new Error("ACP tool output exceeds the maximum nesting depth");
130
+ }
131
+ if (Array.isArray(value)) {
132
+ const result = [];
133
+ for (const item of value) {
134
+ result.push(await this.#rawOutput(sessionId, item, images, signal, depth + 1));
135
+ }
136
+ return result;
137
+ }
138
+ if (!isRecord(value)) {
139
+ return value;
140
+ }
141
+ const image = embeddedImageSchema.safeParse(value);
142
+ if (image.success && image.data.data.length > 0) {
143
+ const prepared = await this.#content(sessionId, image.data, signal);
144
+ if (isRecord(prepared.event) && typeof prepared.event["imageKey"] === "string") {
145
+ images.set(prepared.event["imageKey"], prepared);
146
+ }
147
+ else {
148
+ images.set(`unavailable:${images.size}`, prepared);
149
+ }
150
+ // Replace the image object itself: retaining `data` here duplicates it in
151
+ // tool JSON even when the visible ACP content already uses a reference.
152
+ return prepared.event;
153
+ }
154
+ const result = {};
155
+ for (const [key, item] of Object.entries(value)) {
156
+ result[key] = await this.#rawOutput(sessionId, item, images, signal, depth + 1);
157
+ }
158
+ return result;
159
+ }
160
+ async #toolUpdate(sessionId, update, signal) {
161
+ const images = new Map();
162
+ const rawOutput = update.rawOutput === undefined
163
+ ? undefined
164
+ : await this.#rawOutput(sessionId, update.rawOutput, images, signal);
165
+ const originalJson = images.size === 0 ? undefined : JSON.stringify(update.rawOutput);
166
+ const rewrittenJson = images.size === 0 ? undefined : JSON.stringify(rawOutput);
167
+ const agentContent = [];
168
+ const eventContent = [];
169
+ for (const item of update.content ?? []) {
170
+ if (item.type !== "content") {
171
+ agentContent.push(item);
172
+ eventContent.push(item);
173
+ continue;
174
+ }
175
+ const content = item.content.type === "text" && item.content.text === originalJson && rewrittenJson !== undefined
176
+ ? { ...item.content, text: rewrittenJson }
177
+ : item.content;
178
+ const prepared = await this.#content(sessionId, content, signal);
179
+ agentContent.push({ ...item, content: prepared.agent });
180
+ eventContent.push({ ...item, content: prepared.event });
181
+ if (isRecord(prepared.event) && typeof prepared.event["imageKey"] === "string") {
182
+ images.delete(prepared.event["imageKey"]);
183
+ }
184
+ }
185
+ for (const prepared of images.values()) {
186
+ agentContent.push({ type: "content", content: prepared.agent });
187
+ eventContent.push({ type: "content", content: prepared.event });
188
+ }
189
+ const output = update.rawOutput === undefined ? {} : { rawOutput };
190
+ const hasContent = (update.content !== undefined && update.content !== null) || agentContent.length > 0;
191
+ return {
192
+ agent: { ...update, ...output, ...(hasContent ? { content: agentContent } : {}) },
193
+ event: { ...update, ...output, ...(hasContent ? { content: eventContent } : {}) },
194
+ };
96
195
  }
97
196
  update = async (sessionId, update, signal) => {
98
197
  switch (update.sessionUpdate) {
99
198
  case "user_message_chunk":
100
199
  case "agent_message_chunk":
101
200
  case "agent_thought_chunk":
102
- case "compaction_summary_chunk":
103
- return { ...update, content: await this.#content(sessionId, update.content, signal) };
201
+ case "compaction_summary_chunk": {
202
+ const content = await this.#content(sessionId, update.content, signal);
203
+ return {
204
+ agent: { ...update, content: content.agent },
205
+ event: { ...update, content: content.event },
206
+ };
207
+ }
104
208
  case "tool_call":
105
209
  case "tool_call_update":
106
- return update.content === undefined || update.content === null
107
- ? update
108
- : {
109
- ...update,
110
- content: await Promise.all(update.content.map(async (item) => await this.#toolContent(sessionId, item, signal))),
111
- };
112
- case "compaction_update":
113
- return update.summary === undefined || update.summary === null
114
- ? update
115
- : {
116
- ...update,
117
- summary: await Promise.all(update.summary.map(async (content) => await this.#content(sessionId, content, signal))),
118
- };
210
+ return await this.#toolUpdate(sessionId, update, signal);
211
+ case "compaction_update": {
212
+ if (update.summary === undefined || update.summary === null) {
213
+ return { agent: update, event: update };
214
+ }
215
+ const content = await Promise.all(update.summary.map(async (item) => await this.#content(sessionId, item, signal)));
216
+ return {
217
+ agent: { ...update, summary: content.map((item) => item.agent) },
218
+ event: { ...update, summary: content.map((item) => item.event) },
219
+ };
220
+ }
119
221
  case "plan":
120
222
  case "plan_update":
121
223
  case "plan_removed":
@@ -124,7 +226,7 @@ export class AcpContentExternalizer {
124
226
  case "config_option_update":
125
227
  case "session_info_update":
126
228
  case "usage_update":
127
- return update;
229
+ return { agent: update, event: update };
128
230
  }
129
231
  };
130
232
  }
@@ -1 +1 @@
1
- {"version":3,"file":"acp-content-externalizer.js","sourceRoot":"","sources":["../../src/external-content/acp-content-externalizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acp-content-externalizer.js","sourceRoot":"","sources":["../../src/external-content/acp-content-externalizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,MAAM,kCAAkC,GAAG,SAAS,CAAC;AAErD,SAAS,YAAY,CAAC,IAAY;IAC9B,IACI,IAAI,CAAC,MAAM,GAAG,kCAAkC;QAChD,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QACrB,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EACvC,CAAC;QACC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAYD,MAAM,mBAAmB,GAAG,CAAC,CAAC,WAAW,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,OAAO,sBAAsB;IACtB,MAAM,CAAuB;IAEtC,YAAY,KAA2B;QACnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,OAAqB,EAAE,MAAmB;QACxE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC;YACZ,KAAK,eAAe;gBAChB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC9C,KAAK,OAAO,EAAE,CAAC;gBACX,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBAC9C,CAAC;gBACD,IAAI,CAAC;oBACD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACzC,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;wBAC9C,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;oBACrF,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACjC,KAAK;wBACL,IAAI,EAAE,OAAO;wBACb,SAAS,EAAE,OAAO,CAAC,QAAQ;wBAC3B,IAAI,EAAE,OAAO;wBACb,SAAS;wBACT,MAAM;qBACT,CAAC,CAAC;oBACH,OAAO;wBACH,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,wBAAwB,MAAM,CAAC,GAAG,EAAE,EAAE;wBAC1E,KAAK,EAAE;4BACH,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,WAAW,EAAE,OAAO,CAAC,WAAW;4BAChC,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,QAAQ,EAAE,MAAM,CAAC,GAAG;4BACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;4BAC1B,IAAI,EAAE,gBAAgB;4BACtB,GAAG,EAAE,OAAO,CAAC,GAAG;yBACnB;qBACJ,CAAC;gBACN,CAAC;gBAAC,MAAM,CAAC;oBACL,MAAM,CAAC,cAAc,EAAE,CAAC;oBACxB,MAAM,WAAW,GAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;oBAChF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;gBACtD,CAAC;YACL,CAAC;YACD,KAAK,OAAO,EAAE,CAAC;gBACX,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBAC9C,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBACjC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;oBACjC,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,OAAO,CAAC,QAAQ;oBAC3B,IAAI,EAAE,OAAO;oBACb,SAAS;oBACT,MAAM;iBACT,CAAC,CAAC;gBACH,OAAO;oBACH,KAAK,EAAE,OAAO;oBACd,KAAK,EAAE;wBACH,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,QAAQ,EAAE,MAAM,CAAC,GAAG;wBACpB,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,IAAI,EAAE,gBAAgB;qBACzB;iBACJ,CAAC;YACN,CAAC;YACD,KAAK,UAAU,EAAE,CAAC;gBACd,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACxD,MAAM,KAAK,GAAG,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACpG,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBAC9C,CAAC;gBACD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,IAAI,0BAA0B,CAAC;gBAClE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBACjC,KAAK;oBACL,IAAI,EAAE,UAAU;oBAChB,SAAS;oBACT,IAAI,EAAE,UAAU;oBAChB,SAAS;oBACT,MAAM;iBACT,CAAC,CAAC;gBACH,OAAO;oBACH,KAAK,EAAE,OAAO;oBACd,KAAK,EAAE;wBACH,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,QAAQ;wBACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ;wBAC3B,WAAW,EAAE,MAAM,CAAC,GAAG;wBACvB,IAAI,EAAE,mBAAmB;wBACzB,GAAG,EAAE,QAAQ,CAAC,GAAG;qBACpB;iBACJ,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CACZ,SAAiB,EACjB,KAAc,EACd,MAAoC,EACpC,MAAmB,EACnB,KAAK,GAAG,CAAC;QAET,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAc,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACnF,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACpE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC7E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACvD,CAAC;YACD,0EAA0E;YAC1E,wEAAwE;YACxE,OAAO,QAAQ,CAAC,KAAK,CAAC;QAC1B,CAAC;QACD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CACb,SAAiB,EACjB,MAAmF,EACnF,MAAmB;QAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;QAClD,MAAM,SAAS,GACX,MAAM,CAAC,SAAS,KAAK,SAAS;YAC1B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7E,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAChF,MAAM,YAAY,GAAsB,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAc,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC1B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,SAAS;YACb,CAAC;YACD,MAAM,OAAO,GACT,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,aAAa,KAAK,SAAS;gBAC7F,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE;gBAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACjE,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YACxD,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC7E,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAChE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACnE,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxG,OAAO;YACH,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YACjF,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SACpF,CAAC;IACN,CAAC;IAEQ,MAAM,GAAG,KAAK,EACnB,SAAiB,EACjB,MAAqB,EACrB,MAAmB,EACO,EAAE;QAC5B,QAAQ,MAAM,CAAC,aAAa,EAAE,CAAC;YAC3B,KAAK,oBAAoB,CAAC;YAC1B,KAAK,qBAAqB,CAAC;YAC3B,KAAK,qBAAqB,CAAC;YAC3B,KAAK,0BAA0B,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACvE,OAAO;oBACH,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE;oBAC5C,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE;iBAC/C,CAAC;YACN,CAAC;YACD,KAAK,WAAW,CAAC;YACjB,KAAK,kBAAkB;gBACnB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7D,KAAK,mBAAmB,EAAE,CAAC;gBACvB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBAC5C,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CACnF,CAAC;gBACF,OAAO;oBACH,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBAChE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;iBACnE,CAAC;YACN,CAAC;YACD,KAAK,MAAM,CAAC;YACZ,KAAK,aAAa,CAAC;YACnB,KAAK,cAAc,CAAC;YACpB,KAAK,2BAA2B,CAAC;YACjC,KAAK,qBAAqB,CAAC;YAC3B,KAAK,sBAAsB,CAAC;YAC5B,KAAK,qBAAqB,CAAC;YAC3B,KAAK,cAAc;gBACf,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAChD,CAAC;IACL,CAAC,CAAC;CACL"}
@@ -23,10 +23,12 @@ export declare class UnretainedExternalContentStore implements ExternalContentSt
23
23
  readonly put: ExternalContentStore["put"];
24
24
  readonly resolve: ExternalContentStore["resolve"];
25
25
  }
26
- export declare class LocalExternalContentStore implements ExternalContentStore {
26
+ /** Files are disposable; authorization grants and metadata never leave memory. */
27
+ export declare class LocalExternalContentStore implements ExternalContentStore, AsyncDisposable {
27
28
  #private;
28
29
  constructor(stateDirectory: string);
29
30
  readonly put: ExternalContentStore["put"];
30
31
  readonly resolve: ExternalContentStore["resolve"];
32
+ readonly [Symbol.asyncDispose]: () => Promise<void>;
31
33
  }
32
34
  //# sourceMappingURL=local-external-content-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-external-content-store.d.ts","sourceRoot":"","sources":["../../src/external-content/local-external-content-store.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;QACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;KAChC,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,KAClB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,qBAAa,8BAA+B,YAAW,oBAAoB;IACvE,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAGvC;IAEF,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAG/C;CACL;AAiBD,qBAAa,yBAA0B,YAAW,oBAAoB;;IAGlE,YAAY,cAAc,EAAE,MAAM,EAEjC;IAED,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAcvC;IAEF,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CA8B/C;CACL"}
1
+ {"version":3,"file":"local-external-content-store.d.ts","sourceRoot":"","sources":["../../src/external-content/local-external-content-store.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;QACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;KAChC,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,KAClB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,qBAAa,8BAA+B,YAAW,oBAAoB;IACvE,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAGvC;IAEF,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAG/C;CACL;AAmBD,kFAAkF;AAClF,qBAAa,yBAA0B,YAAW,oBAAoB,EAAE,eAAe;;IAQnF,YAAY,cAAc,EAAE,MAAM,EAOjC;IAkDD,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAkD;IAsC3F,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAC0D;IAkC3G,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAa,OAAO,CAAC,IAAI,CAAC,CAMtD;CACL"}
@@ -1,8 +1,9 @@
1
1
  import { createHash, randomUUID } from "node:crypto";
2
- import { lstat, mkdir, readFile, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
2
+ import { lstat, mkdir, readdir, realpath, rename, rm, stat, utimes, writeFile } from "node:fs/promises";
3
3
  import { dirname, join } from "node:path";
4
4
  import { z } from "zod";
5
5
  const contentRequest = /^mobius-content:(image|audio|resource):([a-f0-9]{64})$/u;
6
+ const CONTENT_LIFETIME_MILLISECONDS = 24 * 60 * 60 * 1_000;
6
7
  const metadataSchema = z.strictObject({
7
8
  kind: z.enum(["image", "audio", "resource"]),
8
9
  mediaType: z
@@ -22,9 +23,6 @@ export class UnretainedExternalContentStore {
22
23
  return Promise.resolve(null);
23
24
  };
24
25
  }
25
- function sessionScope(sessionId) {
26
- return createHash("sha256").update(sessionId).digest("hex");
27
- }
28
26
  async function atomicWrite(path, bytes, signal) {
29
27
  const temporary = `${path}.${randomUUID()}.tmp`;
30
28
  try {
@@ -36,53 +34,141 @@ async function atomicWrite(path, bytes, signal) {
36
34
  await rm(temporary, { force: true });
37
35
  }
38
36
  }
37
+ /** Files are disposable; authorization grants and metadata never leave memory. */
39
38
  export class LocalExternalContentStore {
40
39
  #root;
40
+ #entries = new Map();
41
+ #operations = new Set();
42
+ #lifetime = new AbortController();
43
+ #expirationTimer;
44
+ #cleanup = Promise.resolve();
41
45
  constructor(stateDirectory) {
42
- this.#root = join(stateDirectory, "tmp", "session-content");
46
+ this.#root = join(stateDirectory, "tmp", "session-content", randomUUID());
47
+ this.#expirationTimer = setInterval(() => {
48
+ // A cleanup failure must not interrupt Agent output. The next pass retries.
49
+ void this.#expire().catch(() => undefined);
50
+ }, 60_000);
51
+ this.#expirationTimer.unref();
43
52
  }
44
- put = async ({ bytes, kind, mediaType, name, sessionId, signal }) => {
45
- signal.throwIfAborted();
53
+ #expire = () => {
54
+ this.#cleanup = this.#cleanup
55
+ .catch(() => undefined)
56
+ .then(async () => {
57
+ // Refresh the owner directory lease. A later daemon can remove directories
58
+ // left by a crash without deleting another running daemon's files.
59
+ await mkdir(this.#root, { mode: 0o700, recursive: true });
60
+ const now = new Date();
61
+ await utimes(this.#root, now, now);
62
+ for (const directory of await readdir(dirname(this.#root), { withFileTypes: true })) {
63
+ if (!directory.isDirectory() || !/^[a-f0-9-]{36}$/u.test(directory.name)) {
64
+ continue;
65
+ }
66
+ const path = join(dirname(this.#root), directory.name);
67
+ if (path === this.#root) {
68
+ continue;
69
+ }
70
+ // Another daemon may remove its own directory during this scan.
71
+ const modified = await stat(path).then((entry) => entry.mtimeMs, () => Date.now());
72
+ if (modified + CONTENT_LIFETIME_MILLISECONDS <= Date.now()) {
73
+ await rm(path, { force: true, recursive: true });
74
+ }
75
+ }
76
+ for (const [request, entry] of this.#entries) {
77
+ if (entry.expiresAt > Date.now()) {
78
+ continue;
79
+ }
80
+ await rm(entry.path, { force: true });
81
+ this.#entries.delete(request);
82
+ }
83
+ });
84
+ return this.#cleanup;
85
+ };
86
+ #track = async (operation) => {
87
+ this.#lifetime.signal.throwIfAborted();
88
+ const pending = operation();
89
+ this.#operations.add(pending);
90
+ try {
91
+ return await pending;
92
+ }
93
+ finally {
94
+ this.#operations.delete(pending);
95
+ }
96
+ };
97
+ put = (input) => this.#track(() => this.#put(input));
98
+ #put = async ({ bytes, kind, mediaType, name, sessionId, signal }) => {
99
+ const active = AbortSignal.any([signal, this.#lifetime.signal]);
100
+ active.throwIfAborted();
101
+ const metadata = metadataSchema.parse({ kind, mediaType, name });
46
102
  const key = createHash("sha256").update(bytes).digest("hex");
47
- const directory = join(this.#root, sessionScope(sessionId), kind);
103
+ const request = `mobius-content:${kind}:${key}`;
104
+ const existing = this.#entries.get(request);
105
+ if (existing !== undefined && existing.expiresAt > Date.now()) {
106
+ this.#entries.set(request, {
107
+ ...existing,
108
+ expiresAt: Date.now() + CONTENT_LIFETIME_MILLISECONDS,
109
+ sessions: new Set([...existing.sessions, sessionId]),
110
+ });
111
+ return { byteLength: existing.byteLength, key };
112
+ }
113
+ await this.#expire();
114
+ active.throwIfAborted();
115
+ const directory = join(this.#root, kind);
48
116
  await mkdir(directory, { mode: 0o700, recursive: true });
49
- signal.throwIfAborted();
117
+ active.throwIfAborted();
50
118
  const path = join(directory, key);
51
- await atomicWrite(path, bytes, signal);
52
- await atomicWrite(`${path}.json`, Buffer.from(JSON.stringify(metadataSchema.parse({ kind, mediaType, name })), "utf8"), signal);
119
+ const write = atomicWrite(path, bytes, active);
120
+ await write;
121
+ active.throwIfAborted();
122
+ const retained = this.#entries.get(request);
123
+ this.#entries.set(request, {
124
+ byteLength: bytes.byteLength,
125
+ expiresAt: Date.now() + CONTENT_LIFETIME_MILLISECONDS,
126
+ mediaType: metadata.mediaType,
127
+ name: metadata.name,
128
+ path,
129
+ sessions: new Set([...(retained?.sessions ?? []), sessionId]),
130
+ });
53
131
  return { byteLength: bytes.byteLength, key };
54
132
  };
55
- resolve = async (sessionId, request, signal) => {
56
- const matched = contentRequest.exec(request);
57
- if (matched === null) {
133
+ resolve = (sessionId, request, signal) => this.#track(() => this.#resolve(sessionId, request, AbortSignal.any([signal, this.#lifetime.signal])));
134
+ #resolve = async (sessionId, request, signal) => {
135
+ signal.throwIfAborted();
136
+ this.#lifetime.signal.throwIfAborted();
137
+ if (!contentRequest.test(request)) {
58
138
  return null;
59
139
  }
60
- const kind = matched[1];
61
- const key = matched[2];
62
- if ((kind !== "image" && kind !== "audio" && kind !== "resource") || key === undefined) {
140
+ const entry = this.#entries.get(request);
141
+ if (entry === undefined || !entry.sessions.has(sessionId)) {
142
+ return null;
143
+ }
144
+ if (entry.expiresAt <= Date.now()) {
145
+ await this.#expire();
146
+ signal.throwIfAborted();
63
147
  return null;
64
148
  }
65
- const directory = join(this.#root, sessionScope(sessionId), kind);
66
- const path = join(directory, key);
67
149
  try {
68
- const [resolvedDirectory, resolvedPath, file, metadata] = await Promise.all([
69
- realpath(directory),
70
- realpath(path),
71
- lstat(path),
72
- readFile(`${path}.json`, "utf8").then((value) => metadataSchema.parse(JSON.parse(value))),
150
+ const [resolvedDirectory, resolvedPath, file] = await Promise.all([
151
+ realpath(dirname(entry.path)),
152
+ realpath(entry.path),
153
+ lstat(entry.path),
73
154
  ]);
74
155
  signal.throwIfAborted();
75
- if (!file.isFile() || dirname(resolvedPath) !== resolvedDirectory || metadata.kind !== kind) {
156
+ if (!file.isFile() || file.isSymbolicLink() || dirname(resolvedPath) !== resolvedDirectory) {
76
157
  return null;
77
158
  }
78
- await stat(resolvedPath);
79
- signal.throwIfAborted();
80
- return { mediaType: metadata.mediaType, name: metadata.name, path: resolvedPath };
159
+ return { mediaType: entry.mediaType, name: entry.name, path: resolvedPath };
81
160
  }
82
161
  catch {
83
162
  signal.throwIfAborted();
84
163
  return null;
85
164
  }
86
165
  };
166
+ [Symbol.asyncDispose] = async () => {
167
+ clearInterval(this.#expirationTimer);
168
+ this.#lifetime.abort();
169
+ await Promise.allSettled([...this.#operations, this.#cleanup]);
170
+ this.#entries.clear();
171
+ await rm(this.#root, { force: true, recursive: true });
172
+ };
87
173
  }
88
174
  //# sourceMappingURL=local-external-content-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-external-content-store.js","sourceRoot":"","sources":["../../src/external-content/local-external-content-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-external-content-store.js","sourceRoot":"","sources":["../../src/external-content/local-external-content-store.ts"],"names":[],"mappings":"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"}