@amaster.ai/pi-attachments 0.1.2-beta.10 → 0.1.2-beta.12

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 (62) hide show
  1. package/README.md +48 -27
  2. package/dist/classify.d.ts +18 -7
  3. package/dist/classify.d.ts.map +1 -1
  4. package/dist/classify.js +237 -92
  5. package/dist/classify.js.map +1 -1
  6. package/dist/extension.d.ts +22 -0
  7. package/dist/extension.d.ts.map +1 -0
  8. package/dist/extension.js +251 -0
  9. package/dist/extension.js.map +1 -0
  10. package/dist/index.d.ts +2 -7
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -5
  13. package/dist/index.js.map +1 -1
  14. package/package.json +30 -5
  15. package/dist/diagnostics.d.ts +0 -8
  16. package/dist/diagnostics.d.ts.map +0 -1
  17. package/dist/diagnostics.js +0 -30
  18. package/dist/diagnostics.js.map +0 -1
  19. package/dist/http.d.ts +0 -10
  20. package/dist/http.d.ts.map +0 -1
  21. package/dist/http.js +0 -44
  22. package/dist/http.js.map +0 -1
  23. package/dist/local-store.d.ts +0 -20
  24. package/dist/local-store.d.ts.map +0 -1
  25. package/dist/local-store.js +0 -121
  26. package/dist/local-store.js.map +0 -1
  27. package/dist/multipart.d.ts +0 -9
  28. package/dist/multipart.d.ts.map +0 -1
  29. package/dist/multipart.js +0 -48
  30. package/dist/multipart.js.map +0 -1
  31. package/dist/normalize.d.ts +0 -7
  32. package/dist/normalize.d.ts.map +0 -1
  33. package/dist/normalize.js +0 -83
  34. package/dist/normalize.js.map +0 -1
  35. package/dist/parser.d.ts +0 -12
  36. package/dist/parser.d.ts.map +0 -1
  37. package/dist/parser.js +0 -168
  38. package/dist/parser.js.map +0 -1
  39. package/dist/prompt.d.ts +0 -10
  40. package/dist/prompt.d.ts.map +0 -1
  41. package/dist/prompt.js +0 -38
  42. package/dist/prompt.js.map +0 -1
  43. package/dist/remote-fetch.d.ts +0 -10
  44. package/dist/remote-fetch.d.ts.map +0 -1
  45. package/dist/remote-fetch.js +0 -35
  46. package/dist/remote-fetch.js.map +0 -1
  47. package/dist/routes.d.ts +0 -14
  48. package/dist/routes.d.ts.map +0 -1
  49. package/dist/routes.js +0 -91
  50. package/dist/routes.js.map +0 -1
  51. package/dist/service.d.ts +0 -9
  52. package/dist/service.d.ts.map +0 -1
  53. package/dist/service.js +0 -140
  54. package/dist/service.js.map +0 -1
  55. package/dist/types.d.ts +0 -85
  56. package/dist/types.d.ts.map +0 -1
  57. package/dist/types.js +0 -2
  58. package/dist/types.js.map +0 -1
  59. package/dist/upload-proxy.d.ts +0 -19
  60. package/dist/upload-proxy.d.ts.map +0 -1
  61. package/dist/upload-proxy.js +0 -105
  62. package/dist/upload-proxy.js.map +0 -1
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Pi Attachments Extension
3
+ *
4
+ * Intercepts user input containing @-references, reads referenced resources,
5
+ * and injects their content into the prompt as context.
6
+ *
7
+ * Recognized references:
8
+ * - @skill:<name> — load SKILL.md for a registered skill (project > user > global agent dir)
9
+ * - @path/to/file.ts — unquoted file reference
10
+ * - @"/path with spaces/file.pdf" — quoted file reference
11
+ * - @file.ts#L10-20 — line range (parsed but range applied by LLM tools)
12
+ *
13
+ * Image files are encoded as base64 ImageContent for multimodal input.
14
+ */
15
+ import { readFile, stat } from 'node:fs/promises';
16
+ import path from 'node:path';
17
+ import { resolveAgentDir } from '@amaster.ai/pi-shared/settings';
18
+ import { classifyAttachment, renderAttachmentContext } from './classify.js';
19
+ const SKILL_NAMESPACE = 'skill';
20
+ const NAMESPACE_AT_RE = /(^|\s)@([a-z][a-z0-9_-]*):([^\s@"]+)/gi;
21
+ const QUOTED_AT_RE = /(^|\s)@"([^"]+)"/g;
22
+ const REGULAR_AT_RE = /(^|\s)@([^\s@"]+)/g;
23
+ export default function piAttachmentsExtension(pi) {
24
+ const maxTextChars = Number(process.env.PI_ATTACHMENT_MAX_TEXT_CHARS) || 128_000;
25
+ pi.on('input', async (event, ctx) => {
26
+ const { mentions } = extractMentions(event.text);
27
+ if (mentions.length === 0)
28
+ return;
29
+ const cwd = ctx.cwd;
30
+ const attachments = [];
31
+ const images = [...(event.images ?? [])];
32
+ const skillBlocks = [];
33
+ const resolvedPaths = new Set();
34
+ const resolvedSkills = new Set();
35
+ for (const mention of mentions) {
36
+ if (mention.kind === 'skill') {
37
+ if (resolvedSkills.has(mention.name))
38
+ continue;
39
+ resolvedSkills.add(mention.name);
40
+ const block = await loadSkillBlock(mention.name, cwd);
41
+ if (block)
42
+ skillBlocks.push(block);
43
+ continue;
44
+ }
45
+ const { filename } = parseFileReference(mention.ref);
46
+ const absolutePath = path.isAbsolute(filename) ? filename : path.resolve(cwd, filename);
47
+ if (resolvedPaths.has(absolutePath))
48
+ continue;
49
+ resolvedPaths.add(absolutePath);
50
+ try {
51
+ const stats = await stat(absolutePath);
52
+ if (stats.isDirectory()) {
53
+ attachments.push({
54
+ id: absolutePath,
55
+ name: path.basename(absolutePath),
56
+ path: absolutePath,
57
+ mimeType: 'inode/directory',
58
+ });
59
+ continue;
60
+ }
61
+ const name = path.basename(absolutePath);
62
+ const mimeType = guessMimeType(name);
63
+ const kind = classifyAttachment(name, mimeType);
64
+ if (kind === 'image') {
65
+ try {
66
+ const data = await readFile(absolutePath);
67
+ images.push({
68
+ type: 'image',
69
+ mimeType: mimeType ?? 'image/png',
70
+ data: data.toString('base64'),
71
+ });
72
+ }
73
+ catch {
74
+ // skip unreadable images
75
+ }
76
+ }
77
+ else {
78
+ attachments.push({
79
+ id: absolutePath,
80
+ name,
81
+ path: absolutePath,
82
+ ...(mimeType ? { mimeType } : {}),
83
+ size: stats.size,
84
+ });
85
+ }
86
+ }
87
+ catch {
88
+ // skip files that don't exist or can't be accessed
89
+ }
90
+ }
91
+ if (attachments.length === 0 &&
92
+ skillBlocks.length === 0 &&
93
+ images.length === (event.images?.length ?? 0)) {
94
+ return;
95
+ }
96
+ const cleanText = stripMentions(event.text);
97
+ const context = await renderAttachmentContext(attachments, {
98
+ maxTextChars,
99
+ hasImages: images.length > 0,
100
+ });
101
+ const parts = [];
102
+ if (skillBlocks.length > 0)
103
+ parts.push(skillBlocks.join('\n\n'));
104
+ if (cleanText)
105
+ parts.push(cleanText);
106
+ if (context)
107
+ parts.push(`<system-reminder>\n${context}\n</system-reminder>`);
108
+ const text = parts.join('\n\n');
109
+ return {
110
+ action: 'transform',
111
+ text,
112
+ ...(images.length > 0 ? { images } : {}),
113
+ };
114
+ });
115
+ }
116
+ export function extractMentions(content) {
117
+ const mentions = [];
118
+ const raw = [];
119
+ const seenSkills = new Set();
120
+ const seenFiles = new Set();
121
+ const namespaceSpans = [];
122
+ for (const match of content.matchAll(NAMESPACE_AT_RE)) {
123
+ const ns = match[2].toLowerCase();
124
+ const value = match[3];
125
+ const start = match.index + (match[1]?.length ?? 0);
126
+ namespaceSpans.push([start, start + 1 + ns.length + 1 + value.length]);
127
+ if (ns === SKILL_NAMESPACE) {
128
+ if (!seenSkills.has(value)) {
129
+ seenSkills.add(value);
130
+ mentions.push({ kind: 'skill', name: value });
131
+ raw.push(`@${ns}:${value}`);
132
+ }
133
+ }
134
+ }
135
+ const isInsideNamespace = (start, end) => namespaceSpans.some(([s, e]) => start >= s && end <= e);
136
+ for (const match of content.matchAll(QUOTED_AT_RE)) {
137
+ const value = match[2];
138
+ const start = match.index + (match[1]?.length ?? 0);
139
+ const end = start + 2 + value.length + 1;
140
+ if (isInsideNamespace(start, end))
141
+ continue;
142
+ if (!seenFiles.has(value)) {
143
+ seenFiles.add(value);
144
+ mentions.push({ kind: 'file', ref: value });
145
+ raw.push(`@"${value}"`);
146
+ }
147
+ }
148
+ for (const match of content.matchAll(REGULAR_AT_RE)) {
149
+ const value = match[2];
150
+ const start = match.index + (match[1]?.length ?? 0);
151
+ const end = start + 1 + value.length;
152
+ if (isInsideNamespace(start, end))
153
+ continue;
154
+ if (value.startsWith('http'))
155
+ continue;
156
+ if (seenFiles.has(value))
157
+ continue;
158
+ seenFiles.add(value);
159
+ mentions.push({ kind: 'file', ref: value });
160
+ raw.push(`@${value}`);
161
+ }
162
+ return { mentions, raw };
163
+ }
164
+ export function stripMentions(content) {
165
+ return content
166
+ .replace(NAMESPACE_AT_RE, '$1')
167
+ .replace(QUOTED_AT_RE, '$1')
168
+ .replace(REGULAR_AT_RE, '$1')
169
+ .trim();
170
+ }
171
+ function parseFileReference(mention) {
172
+ const hashIdx = mention.indexOf('#L');
173
+ if (hashIdx === -1) {
174
+ return { filename: mention };
175
+ }
176
+ const filename = mention.slice(0, hashIdx);
177
+ const range = mention.slice(hashIdx + 2);
178
+ const parts = range.split('-');
179
+ const lineStart = Number(parts[0]) || undefined;
180
+ const lineEnd = parts[1] ? Number(parts[1]) || undefined : undefined;
181
+ return {
182
+ filename,
183
+ ...(lineStart ? { lineStart } : {}),
184
+ ...(lineEnd ? { lineEnd } : {}),
185
+ };
186
+ }
187
+ /**
188
+ * Search order for `@skill:<name>`: project-level (`<cwd>/.pi/skills`) before
189
+ * user-level (`<agentDir>/skills`). Matches `loadSkillsFromAllLocations` in
190
+ * the pi-coding-agent SDK so a project skill overrides a user-installed one.
191
+ */
192
+ export function skillSearchPaths(name, cwd) {
193
+ const projectDir = path.resolve(cwd, '.pi', 'skills', name);
194
+ const userDir = path.resolve(resolveAgentDir(), 'skills', name);
195
+ return [projectDir, userDir].map((dir) => path.join(dir, 'SKILL.md'));
196
+ }
197
+ async function loadSkillBlock(name, cwd) {
198
+ for (const filePath of skillSearchPaths(name, cwd)) {
199
+ try {
200
+ const content = await readFile(filePath, 'utf8');
201
+ const baseDir = path.dirname(filePath);
202
+ const body = stripFrontmatter(content).trim();
203
+ return [
204
+ `<skill name="${escapeXmlAttribute(name)}" location="${escapeXmlAttribute(filePath)}">`,
205
+ `References are relative to ${baseDir}.`,
206
+ '',
207
+ body,
208
+ '</skill>',
209
+ ].join('\n');
210
+ }
211
+ catch {
212
+ // try next candidate
213
+ }
214
+ }
215
+ return undefined;
216
+ }
217
+ function stripFrontmatter(content) {
218
+ if (!content.startsWith('---'))
219
+ return content;
220
+ const close = content.indexOf('\n---', 3);
221
+ if (close === -1)
222
+ return content;
223
+ const after = close + '\n---'.length;
224
+ return content.slice(content[after] === '\n' ? after + 1 : after);
225
+ }
226
+ function escapeXmlAttribute(value) {
227
+ return value
228
+ .replace(/&/g, '&amp;')
229
+ .replace(/"/g, '&quot;')
230
+ .replace(/</g, '&lt;')
231
+ .replace(/>/g, '&gt;');
232
+ }
233
+ const MIME_BY_EXT = {
234
+ png: 'image/png',
235
+ jpg: 'image/jpeg',
236
+ jpeg: 'image/jpeg',
237
+ gif: 'image/gif',
238
+ webp: 'image/webp',
239
+ svg: 'image/svg+xml',
240
+ bmp: 'image/bmp',
241
+ avif: 'image/avif',
242
+ heic: 'image/heic',
243
+ pdf: 'application/pdf',
244
+ json: 'application/json',
245
+ xml: 'application/xml',
246
+ };
247
+ function guessMimeType(name) {
248
+ const ext = name.toLowerCase().split('.').pop();
249
+ return ext ? MIME_BY_EXT[ext] : undefined;
250
+ }
251
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,3 @@
1
- export { type AttachmentDependencyCheck, checkAttachmentHostDependencies, } from './diagnostics.js';
2
- export { AttachmentValidationError, normalizeAttachments, } from './normalize.js';
3
- export { renderAttachmentPrompt } from './prompt.js';
4
- export { handleAttachmentRoutes } from './routes.js';
5
- export { type AttachmentService, createAttachmentService, } from './service.js';
6
- export type { AttachmentContext, AttachmentFailure, AttachmentServiceConfig, AttachmentSource, ChatAttachmentInput, NormalizedAttachment, PreparedAttachmentBundle, StoredAttachmentRecord, } from './types.js';
7
- export type { AttachmentUploadAuth } from './upload-proxy.js';
1
+ export { type AttachmentKind, type AttachmentMeta, classifyAttachment, docReadInstruction, fenceForName, renderAttachmentBlock, renderAttachmentContext, truncateText, } from './classify.js';
2
+ export { default } from './extension.js';
8
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,yBAAyB,EAC9B,+BAA+B,GAChC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,KAAK,iBAAiB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,3 @@
1
- export { checkAttachmentHostDependencies, } from './diagnostics.js';
2
- export { AttachmentValidationError, normalizeAttachments, } from './normalize.js';
3
- export { renderAttachmentPrompt } from './prompt.js';
4
- export { handleAttachmentRoutes } from './routes.js';
5
- export { createAttachmentService, } from './service.js';
1
+ export { classifyAttachment, docReadInstruction, fenceForName, renderAttachmentBlock, renderAttachmentContext, truncateText, } from './classify.js';
2
+ export { default } from './extension.js';
6
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,+BAA+B,GAChC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAEL,uBAAuB,GACxB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,15 @@
1
1
  {
2
2
  "name": "@amaster.ai/pi-attachments",
3
- "version": "0.1.2-beta.10",
3
+ "version": "0.1.2-beta.12",
4
+ "description": "Pi extension for attachment processing — classifies, parses, and renders file attachments into LLM-visible prompt context",
5
+ "keywords": [
6
+ "pi-package",
7
+ "pi",
8
+ "extension",
9
+ "attachments",
10
+ "files",
11
+ "documents"
12
+ ],
4
13
  "license": "Apache-2.0",
5
14
  "type": "module",
6
15
  "sideEffects": false,
@@ -19,21 +28,37 @@
19
28
  "dist",
20
29
  "README.md"
21
30
  ],
31
+ "pi": {
32
+ "extensions": [
33
+ "./dist/index.js"
34
+ ]
35
+ },
22
36
  "publishConfig": {
23
37
  "access": "public"
24
38
  },
25
39
  "repository": {
26
40
  "type": "git",
27
41
  "url": "https://github.com/TGYD-helige/pi.git",
28
- "directory": "packages/attachments"
42
+ "directory": "packages/pi-attachments"
29
43
  },
30
44
  "dependencies": {
31
- "@llamaindex/liteparse": "1.5.3",
32
- "jszip": "3.10.1"
45
+ "@amaster.ai/pi-shared": "0.1.2-beta.12"
46
+ },
47
+ "peerDependencies": {
48
+ "@earendil-works/pi-coding-agent": ">=0.74.0"
49
+ },
50
+ "peerDependenciesMeta": {
51
+ "@earendil-works/pi-coding-agent": {
52
+ "optional": true
53
+ }
54
+ },
55
+ "devDependencies": {
56
+ "@earendil-works/pi-coding-agent": "0.74.0",
57
+ "vitest": "^4.0.0"
33
58
  },
34
59
  "scripts": {
35
60
  "build": "tsc -b",
36
61
  "typecheck": "tsc -b --pretty false",
37
- "test": "vitest run"
62
+ "test": "vitest run src"
38
63
  }
39
64
  }
@@ -1,8 +0,0 @@
1
- export type AttachmentDependencyCheck = {
2
- name: 'libreoffice' | 'imagemagick' | 'ghostscript' | 'tesseract' | 'poppler';
3
- command: string;
4
- installed: boolean;
5
- version?: string;
6
- };
7
- export declare function checkAttachmentHostDependencies(): Promise<AttachmentDependencyCheck[]>;
8
- //# sourceMappingURL=diagnostics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAmB5F"}
@@ -1,30 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- export async function checkAttachmentHostDependencies() {
3
- const checks = [
4
- { name: 'libreoffice', command: 'soffice', args: ['--version'] },
5
- { name: 'imagemagick', command: 'magick', args: ['-version'] },
6
- { name: 'ghostscript', command: 'gs', args: ['--version'] },
7
- { name: 'tesseract', command: 'tesseract', args: ['--version'] },
8
- { name: 'poppler', command: 'pdftotext', args: ['-v'] },
9
- ];
10
- return Promise.all(checks.map(async (check) => {
11
- const result = await run(check.command, check.args);
12
- return {
13
- name: check.name,
14
- command: check.command,
15
- installed: result.code === 0,
16
- ...(result.output ? { version: result.output.split(/\r?\n/)[0] } : {}),
17
- };
18
- }));
19
- }
20
- function run(command, args) {
21
- return new Promise((resolve) => {
22
- const child = spawn(command, args, { stdio: ['ignore', 'pipe', 'pipe'] });
23
- const chunks = [];
24
- child.stdout.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
25
- child.stderr.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
26
- child.on('error', () => resolve({ code: -1, output: '' }));
27
- child.on('close', (code) => resolve({ code, output: Buffer.concat(chunks).toString('utf8').trim() }));
28
- });
29
- }
30
- //# sourceMappingURL=diagnostics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAS3C,MAAM,CAAC,KAAK,UAAU,+BAA+B;IACnD,MAAM,MAAM,GAAG;QACb,EAAE,IAAI,EAAE,aAAsB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE;QACzE,EAAE,IAAI,EAAE,aAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,aAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE;QACpE,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE;QACzE,EAAE,IAAI,EAAE,SAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE;KACjE,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,OAAe,EAAE,IAAc;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACjE,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACjE,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/http.d.ts DELETED
@@ -1,10 +0,0 @@
1
- import type { IncomingMessage, ServerResponse } from 'node:http';
2
- export declare class AttachmentHttpError extends Error {
3
- readonly statusCode: number;
4
- readonly code: string;
5
- constructor(statusCode: number, code: string, message: string);
6
- }
7
- export declare function readRequestBody(request: IncomingMessage, maxBytes: number): Promise<Buffer>;
8
- export declare function writeJson(response: ServerResponse, statusCode: number, body: unknown): void;
9
- export declare function getHeader(request: IncomingMessage, name: string): string | undefined;
10
- //# sourceMappingURL=http.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM;gBADZ,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBjG;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAS3F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKpF"}
package/dist/http.js DELETED
@@ -1,44 +0,0 @@
1
- export class AttachmentHttpError extends Error {
2
- statusCode;
3
- code;
4
- constructor(statusCode, code, message) {
5
- super(message);
6
- this.statusCode = statusCode;
7
- this.code = code;
8
- this.name = 'AttachmentHttpError';
9
- }
10
- }
11
- export async function readRequestBody(request, maxBytes) {
12
- const contentLength = Number(request.headers['content-length']);
13
- if (Number.isFinite(contentLength) && contentLength > maxBytes) {
14
- throw new AttachmentHttpError(413, 'request_body_too_large', `request body exceeds ${maxBytes} bytes`);
15
- }
16
- const chunks = [];
17
- let totalBytes = 0;
18
- for await (const chunk of request) {
19
- const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
20
- totalBytes += buffer.length;
21
- if (totalBytes > maxBytes) {
22
- throw new AttachmentHttpError(413, 'request_body_too_large', `request body exceeds ${maxBytes} bytes`);
23
- }
24
- chunks.push(buffer);
25
- }
26
- return Buffer.concat(chunks);
27
- }
28
- export function writeJson(response, statusCode, body) {
29
- if (response.headersSent) {
30
- if (!response.writableEnded) {
31
- response.end();
32
- }
33
- return;
34
- }
35
- response.writeHead(statusCode, { 'content-type': 'application/json; charset=utf-8' });
36
- response.end(`${JSON.stringify(body)}\n`);
37
- }
38
- export function getHeader(request, name) {
39
- const value = request.headers[name.toLowerCase()];
40
- const candidate = Array.isArray(value) ? value[0] : value;
41
- const trimmed = candidate?.trim();
42
- return trimmed ? trimmed : undefined;
43
- }
44
- //# sourceMappingURL=http.js.map
package/dist/http.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAEjC;IACA;IAFX,YACW,UAAkB,EAClB,IAAY,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB,EAAE,QAAgB;IAC9E,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,QAAQ,EAAE,CAAC;QAC/D,MAAM,IAAI,mBAAmB,CAC3B,GAAG,EACH,wBAAwB,EACxB,wBAAwB,QAAQ,QAAQ,CACzC,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,UAAU,GAAG,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,mBAAmB,CAC3B,GAAG,EACH,wBAAwB,EACxB,wBAAwB,QAAQ,QAAQ,CACzC,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAwB,EAAE,UAAkB,EAAE,IAAa;IACnF,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC5B,QAAQ,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;QACD,OAAO;IACT,CAAC;IACD,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,CAAC,CAAC;IACtF,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAwB,EAAE,IAAY;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC"}
@@ -1,20 +0,0 @@
1
- import type { StoredAttachmentRecord } from './types.js';
2
- export declare class LocalAttachmentStore {
3
- private readonly rootDir;
4
- constructor(rootDir: string);
5
- putFile(input: {
6
- sourcePath: string;
7
- name?: string;
8
- mimeType?: string;
9
- sessionId?: string;
10
- }): Promise<StoredAttachmentRecord>;
11
- putBuffer(input: {
12
- data: Buffer;
13
- name: string;
14
- mimeType?: string;
15
- sessionId?: string;
16
- }): Promise<StoredAttachmentRecord>;
17
- readRecord(attachmentId: string): Promise<StoredAttachmentRecord>;
18
- private attachmentDir;
19
- }
20
- //# sourceMappingURL=local-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAEtC,OAAO,CAAC,KAAK,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAuB7B,SAAS,CAAC,KAAK,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAkB7B,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAgBvE,OAAO,CAAC,aAAa;CAKtB"}
@@ -1,121 +0,0 @@
1
- import { createHash, randomUUID } from 'node:crypto';
2
- import { copyFile, mkdir, readFile, stat, writeFile } from 'node:fs/promises';
3
- import path from 'node:path';
4
- import { fileURLToPath } from 'node:url';
5
- import { mimeTypeFromFileName } from './classify.js';
6
- export class LocalAttachmentStore {
7
- rootDir;
8
- constructor(rootDir) {
9
- this.rootDir = rootDir;
10
- }
11
- async putFile(input) {
12
- const sourcePath = fileURLToPathIfNeeded(input.sourcePath);
13
- const sourceStat = await stat(sourcePath);
14
- if (!sourceStat.isFile()) {
15
- throw new Error(`attachment source is not a file: ${input.sourcePath}`);
16
- }
17
- const name = sanitizeFileName(input.name ?? path.basename(sourcePath));
18
- const attachmentId = randomUUID();
19
- const dir = this.attachmentDir(input.sessionId, attachmentId);
20
- await mkdir(dir, { recursive: true });
21
- const targetPath = path.join(dir, name);
22
- await copyFile(sourcePath, targetPath);
23
- const record = createRecord({
24
- attachmentId,
25
- name,
26
- size: sourceStat.size,
27
- path: targetPath,
28
- ...optionalMimeType(input.mimeType ?? mimeTypeFromFileName(name)),
29
- });
30
- await writeRecord(dir, record);
31
- return record;
32
- }
33
- async putBuffer(input) {
34
- const name = sanitizeFileName(input.name);
35
- const attachmentId = randomUUID();
36
- const dir = this.attachmentDir(input.sessionId, attachmentId);
37
- await mkdir(dir, { recursive: true });
38
- const targetPath = path.join(dir, name);
39
- await writeFile(targetPath, input.data);
40
- const record = createRecord({
41
- attachmentId,
42
- name,
43
- size: input.data.byteLength,
44
- path: targetPath,
45
- ...optionalMimeType(input.mimeType ?? mimeTypeFromFileName(name)),
46
- });
47
- await writeRecord(dir, record);
48
- return record;
49
- }
50
- async readRecord(attachmentId) {
51
- const safeId = sanitizeId(attachmentId);
52
- const candidates = await findRecordCandidates(this.rootDir, safeId);
53
- for (const candidate of candidates) {
54
- try {
55
- const parsed = JSON.parse(await readFile(candidate, 'utf8'));
56
- if (parsed.attachmentId === attachmentId) {
57
- return parsed;
58
- }
59
- }
60
- catch {
61
- // Keep looking for another candidate.
62
- }
63
- }
64
- throw new Error(`stored attachment not found: ${attachmentId}`);
65
- }
66
- attachmentDir(sessionId, attachmentId) {
67
- const sessionPart = sanitizeId(sessionId ?? 'global');
68
- const hash = createHash('sha256').update(attachmentId).digest('hex').slice(0, 8);
69
- return path.join(this.rootDir, sessionPart, `${hash}-${sanitizeId(attachmentId)}`);
70
- }
71
- }
72
- function createRecord(input) {
73
- return {
74
- attachmentId: input.attachmentId,
75
- name: input.name,
76
- ...(input.mimeType ? { mimeType: input.mimeType } : {}),
77
- size: input.size,
78
- path: input.path,
79
- createdAt: new Date().toISOString(),
80
- };
81
- }
82
- async function writeRecord(dir, record) {
83
- await writeFile(path.join(dir, 'attachment.json'), `${JSON.stringify(record, null, 2)}\n`, 'utf8');
84
- }
85
- async function findRecordCandidates(rootDir, attachmentId) {
86
- const { readdir } = await import('node:fs/promises');
87
- const result = [];
88
- try {
89
- for (const sessionEntry of await readdir(rootDir, { withFileTypes: true })) {
90
- if (!sessionEntry.isDirectory())
91
- continue;
92
- const sessionDir = path.join(rootDir, sessionEntry.name);
93
- for (const attachmentEntry of await readdir(sessionDir, { withFileTypes: true })) {
94
- if (attachmentEntry.isDirectory() && attachmentEntry.name.endsWith(`-${attachmentId}`)) {
95
- result.push(path.join(sessionDir, attachmentEntry.name, 'attachment.json'));
96
- }
97
- }
98
- }
99
- }
100
- catch {
101
- return [];
102
- }
103
- return result;
104
- }
105
- function sanitizeFileName(value) {
106
- const base = path
107
- .basename(value)
108
- .replace(/[^\w .@()+=[\]-]/g, '_')
109
- .trim();
110
- return base || 'attachment';
111
- }
112
- function optionalMimeType(mimeType) {
113
- return mimeType ? { mimeType } : {};
114
- }
115
- function sanitizeId(value) {
116
- return value.replace(/[^a-zA-Z0-9_.-]/g, '_').slice(0, 160) || 'attachment';
117
- }
118
- function fileURLToPathIfNeeded(value) {
119
- return value.startsWith('file://') ? fileURLToPath(value) : value;
120
- }
121
- //# sourceMappingURL=local-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-store.js","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- export type MultipartFile = {
2
- fieldName: string;
3
- fileName: string;
4
- contentType?: string;
5
- data: Buffer;
6
- };
7
- export declare function parseMultipartBoundary(contentType: string | string[] | undefined): string | undefined;
8
- export declare function parseMultipartFiles(body: Buffer, boundary: string): MultipartFile[];
9
- //# sourceMappingURL=multipart.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CA8BnF"}