@xgjktech/xg_cwork_im 1.11.1 → 1.11.4

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 (53) hide show
  1. package/README.md +25 -18
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/{index.ts → dist/index.js} +33 -37
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/auth.d.ts +25 -0
  7. package/dist/src/auth.d.ts.map +1 -0
  8. package/{src/auth.ts → dist/src/auth.js} +55 -79
  9. package/dist/src/auth.js.map +1 -0
  10. package/dist/src/channel.d.ts +13 -0
  11. package/dist/src/channel.d.ts.map +1 -0
  12. package/{src/channel.ts → dist/src/channel.js} +224 -368
  13. package/dist/src/channel.js.map +1 -0
  14. package/dist/src/connection.d.ts +51 -0
  15. package/dist/src/connection.d.ts.map +1 -0
  16. package/{src/connection.ts → dist/src/connection.js} +45 -122
  17. package/dist/src/connection.js.map +1 -0
  18. package/dist/src/group-history-tool.d.ts +23 -0
  19. package/dist/src/group-history-tool.d.ts.map +1 -0
  20. package/{src/group-history-tool.ts → dist/src/group-history-tool.js} +168 -204
  21. package/dist/src/group-history-tool.js.map +1 -0
  22. package/dist/src/inbound-media-local.d.ts +40 -0
  23. package/dist/src/inbound-media-local.d.ts.map +1 -0
  24. package/{src/inbound-media-local.ts → dist/src/inbound-media-local.js} +52 -90
  25. package/dist/src/inbound-media-local.js.map +1 -0
  26. package/dist/src/recommended-system-prompt.d.ts +3 -0
  27. package/dist/src/recommended-system-prompt.d.ts.map +1 -0
  28. package/dist/src/recommended-system-prompt.js +3 -0
  29. package/dist/src/recommended-system-prompt.js.map +1 -0
  30. package/dist/src/resource-file.d.ts +65 -0
  31. package/dist/src/resource-file.d.ts.map +1 -0
  32. package/{src/resource-file.ts → dist/src/resource-file.js} +317 -339
  33. package/dist/src/resource-file.js.map +1 -0
  34. package/dist/src/send-group-message-tool.d.ts +16 -0
  35. package/dist/src/send-group-message-tool.d.ts.map +1 -0
  36. package/{src/send-group-message-tool.ts → dist/src/send-group-message-tool.js} +17 -34
  37. package/dist/src/send-group-message-tool.js.map +1 -0
  38. package/dist/src/send-service.d.ts +34 -0
  39. package/dist/src/send-service.d.ts.map +1 -0
  40. package/dist/src/send-service.js +197 -0
  41. package/dist/src/send-service.js.map +1 -0
  42. package/{src/tool-json-result.ts → dist/src/tool-json-result.d.ts} +14 -24
  43. package/dist/src/tool-json-result.d.ts.map +1 -0
  44. package/dist/src/tool-json-result.js +20 -0
  45. package/dist/src/tool-json-result.js.map +1 -0
  46. package/{src/types.ts → dist/src/types.d.ts} +32 -96
  47. package/dist/src/types.d.ts.map +1 -0
  48. package/dist/src/types.js +32 -0
  49. package/dist/src/types.js.map +1 -0
  50. package/openclaw.plugin.json +9 -0
  51. package/package.json +7 -6
  52. package/src/recommended-system-prompt.ts +0 -3
  53. package/src/send-service.ts +0 -228
@@ -4,77 +4,74 @@
4
4
  * 目录约定:{subdir}/{userId}/{YYYY-MM-DD}/{stem}_{HHmmssmmm}{ext}
5
5
  * 时间取写入时的本地时区。
6
6
  */
7
-
8
7
  import { mkdir, stat, writeFile } from "node:fs/promises";
9
8
  import path from "node:path";
10
9
  import { pathToFileURL } from "node:url";
11
- import type { OpenClawConfig } from "openclaw/plugin-sdk";
12
- import type { Log } from "./auth.js";
13
10
  import { downloadMediaBuffer, resolveMaxAttachmentBytes } from "./resource-file.js";
14
- import type { MsgFileVO, XgImConfig } from "./types.js";
15
-
16
11
  /** 校验:非空、相对路径、不含 `..` 段 */
17
- export function normalizeInboundWorkspaceSubdir(subdir: string): string | null {
12
+ export function normalizeInboundWorkspaceSubdir(subdir) {
18
13
  const t = subdir.trim().replace(/\\/g, "/");
19
- if (!t || t === "." || t === "..") return null;
14
+ if (!t || t === "." || t === "..")
15
+ return null;
20
16
  const parts = t.split("/").filter(Boolean);
21
17
  for (const p of parts) {
22
- if (p === "..") return null;
18
+ if (p === "..")
19
+ return null;
23
20
  }
24
- if (path.isAbsolute(t)) return null;
21
+ if (path.isAbsolute(t))
22
+ return null;
25
23
  return parts.join("/");
26
24
  }
27
-
28
- export function resolveAgentWorkspaceDirFromRuntime(rt: unknown, cfg: OpenClawConfig): string | undefined {
29
- const agent = (rt as { agent?: { resolveAgentWorkspaceDir?: (c: OpenClawConfig) => unknown } })?.agent;
25
+ export function resolveAgentWorkspaceDirFromRuntime(rt, cfg) {
26
+ const agent = rt?.agent;
30
27
  const fn = agent?.resolveAgentWorkspaceDir;
31
- if (typeof fn !== "function") return undefined;
28
+ if (typeof fn !== "function")
29
+ return undefined;
32
30
  try {
33
31
  const out = fn(cfg);
34
- if (typeof out === "string" && out.trim()) return path.resolve(out.trim());
35
- } catch {
32
+ if (typeof out === "string" && out.trim())
33
+ return path.resolve(out.trim());
34
+ }
35
+ catch {
36
36
  /* ignore */
37
37
  }
38
38
  return undefined;
39
39
  }
40
-
41
- export async function ensureAgentWorkspaceFromRuntime(rt: unknown, cfg: OpenClawConfig): Promise<void> {
42
- const agent = (rt as { agent?: { ensureAgentWorkspace?: (c: OpenClawConfig) => Promise<void> } })?.agent;
40
+ export async function ensureAgentWorkspaceFromRuntime(rt, cfg) {
41
+ const agent = rt?.agent;
43
42
  const fn = agent?.ensureAgentWorkspace;
44
- if (typeof fn !== "function") return;
43
+ if (typeof fn !== "function")
44
+ return;
45
45
  try {
46
46
  await fn(cfg);
47
- } catch {
47
+ }
48
+ catch {
48
49
  /* 落盘前仍会 mkdir,不阻断 */
49
50
  }
50
51
  }
51
-
52
- function sanitizeUserIdForPath(id: string): string {
52
+ function sanitizeUserIdForPath(id) {
53
53
  const t = id.trim();
54
- if (/^-?\d+$/.test(t) && t.length <= 32) return t;
54
+ if (/^-?\d+$/.test(t) && t.length <= 32)
55
+ return t;
55
56
  const safe = t.replace(/[^\w.-]/g, "_").replace(/_+/g, "_").replace(/^_|_$/g, "");
56
57
  return safe.slice(0, 64) || "unknown";
57
58
  }
58
-
59
- function formatDateFolderLocal(d: Date): string {
59
+ function formatDateFolderLocal(d) {
60
60
  const y = d.getFullYear();
61
61
  const m = String(d.getMonth() + 1).padStart(2, "0");
62
62
  const day = String(d.getDate()).padStart(2, "0");
63
63
  return `${y}-${m}-${day}`;
64
64
  }
65
-
66
65
  /** `HHmmss` + 三位毫秒,如 `120459237` */
67
- export function formatInboundTimeSuffix(d: Date): string {
66
+ export function formatInboundTimeSuffix(d) {
68
67
  const h = String(d.getHours()).padStart(2, "0");
69
68
  const min = String(d.getMinutes()).padStart(2, "0");
70
69
  const s = String(d.getSeconds()).padStart(2, "0");
71
70
  const ms = String(d.getMilliseconds()).padStart(3, "0");
72
71
  return `${h}${min}${s}${ms}`;
73
72
  }
74
-
75
73
  const MAX_STEM_LEN = 120;
76
-
77
- function sanitizeStem(stem: string): string {
74
+ function sanitizeStem(stem) {
78
75
  const s = stem
79
76
  .replace(/[<>:"/\\|?*\u0000-\u001f]/g, "_")
80
77
  .replace(/_+/g, "_")
@@ -83,45 +80,33 @@ function sanitizeStem(stem: string): string {
83
80
  const out = s || "file";
84
81
  return out.length > MAX_STEM_LEN ? out.slice(0, MAX_STEM_LEN) : out;
85
82
  }
86
-
87
83
  /**
88
84
  * 将落盘绝对路径转为 OpenClaw / 沙箱可用的 workspace 相对引用(POSIX 风格,带 `./` 前缀)。
89
85
  * 若文件不在 workspaceRoot 之下则返回 null(调用方应回退 file:// 或报错)。
90
86
  */
91
- export function absPathToWorkspaceRelativeOpenClawRef(workspaceRoot: string, absPath: string): string | null {
87
+ export function absPathToWorkspaceRelativeOpenClawRef(workspaceRoot, absPath) {
92
88
  const root = path.resolve(workspaceRoot.trim());
93
89
  const abs = path.resolve(absPath);
94
90
  const rel = path.relative(root, abs);
95
- if (rel.startsWith("..") || path.isAbsolute(rel)) return null;
91
+ if (rel.startsWith("..") || path.isAbsolute(rel))
92
+ return null;
96
93
  const piece = rel.length > 0 ? rel : path.basename(abs);
97
94
  const posix = piece.split(path.sep).join("/");
98
95
  return posix.startsWith("./") ? posix : `./${posix}`;
99
96
  }
100
-
101
97
  /**
102
98
  * 沙箱内常用挂载点(如 `/workspace`)+ 相对 workspace 的路径,供 read 等工具按「绝对路径」解析。
103
99
  * 若未配置 sandboxRootPrefix,则仍用 `./xg_im_inbound/...`(相对当前 cwd,部分沙箱工具会误判为不可访问)。
104
100
  */
105
- export function sandboxWorkspaceMediaRef(
106
- workspaceRoot: string,
107
- absPath: string,
108
- sandboxRootPrefix: string,
109
- ): string | null {
101
+ export function sandboxWorkspaceMediaRef(workspaceRoot, absPath, sandboxRootPrefix) {
110
102
  const rel = absPathToWorkspaceRelativeOpenClawRef(workspaceRoot, absPath);
111
- if (!rel) return null;
103
+ if (!rel)
104
+ return null;
112
105
  const root = sandboxRootPrefix.trim().replace(/\/+$/, "") || "/workspace";
113
106
  const relStrip = rel.replace(/^\.\/+/, "").replace(/^\/+/, "");
114
107
  return `${root}/${relStrip}`;
115
108
  }
116
-
117
- function openClawMediaRefForSavedFile(args: {
118
- workspaceRoot: string;
119
- absPath: string;
120
- style: "workspaceRelative" | "absoluteFileUrl" | undefined;
121
- /** 非空且 style 为 workspaceRelative 时,用 `/workspace/...` 形式代替 `./...` */
122
- sandboxRootPrefix?: string;
123
- log?: Log;
124
- }): string {
109
+ function openClawMediaRefForSavedFile(args) {
125
110
  const { workspaceRoot, absPath, style, sandboxRootPrefix, log } = args;
126
111
  if (style === "absoluteFileUrl") {
127
112
  return pathToFileURL(absPath).href;
@@ -129,62 +114,44 @@ function openClawMediaRefForSavedFile(args: {
129
114
  const prefix = sandboxRootPrefix?.trim();
130
115
  if (prefix) {
131
116
  const boxed = sandboxWorkspaceMediaRef(workspaceRoot, absPath, prefix);
132
- if (boxed) return boxed;
117
+ if (boxed)
118
+ return boxed;
133
119
  }
134
120
  const rel = absPathToWorkspaceRelativeOpenClawRef(workspaceRoot, absPath);
135
- if (rel) return rel;
136
- log?.warn?.(
137
- `[cwork_im:inbound-local] file not under workspace root, fallback to file:// absPath=${absPath.slice(0, 120)}`,
138
- );
121
+ if (rel)
122
+ return rel;
123
+ log?.warn?.(`[cwork_im:inbound-local] file not under workspace root, fallback to file:// absPath=${absPath.slice(0, 120)}`);
139
124
  return pathToFileURL(absPath).href;
140
125
  }
141
-
142
126
  /** `report_120459237.pdf` */
143
- export function buildInboundStoredFilename(originalFilename: string, at: Date): string {
127
+ export function buildInboundStoredFilename(originalFilename, at) {
144
128
  const base = path.basename(originalFilename) || "file";
145
129
  const ext = path.extname(base);
146
130
  const stem = ext ? base.slice(0, -ext.length) : base;
147
131
  const suffix = formatInboundTimeSuffix(at);
148
132
  return `${sanitizeStem(stem)}_${suffix}${ext.toLowerCase()}`;
149
133
  }
150
-
151
134
  /**
152
135
  * 将入站附件下载到 workspace 下子目录;失败项保留原 URL。
153
136
  */
154
- export async function saveInboundFilesToWorkspace(args: {
155
- rt: unknown;
156
- cfg: OpenClawConfig;
157
- config: XgImConfig;
158
- workspaceSubdir: string;
159
- senderUserId: string | undefined;
160
- fileItems: MsgFileVO[];
161
- log?: Log;
162
- }): Promise<MsgFileVO[]> {
137
+ export async function saveInboundFilesToWorkspace(args) {
163
138
  const { rt, cfg, config, workspaceSubdir, senderUserId, fileItems, log } = args;
164
139
  const normalized = normalizeInboundWorkspaceSubdir(workspaceSubdir);
165
- if (!normalized || fileItems.length === 0) return fileItems;
166
-
140
+ if (!normalized || fileItems.length === 0)
141
+ return fileItems;
167
142
  const workspaceRoot = resolveAgentWorkspaceDirFromRuntime(rt, cfg);
168
143
  if (!workspaceRoot) {
169
- log?.warn?.(
170
- "[cwork_im:inbound-local] resolveAgentWorkspaceDir unavailable, skip inbound download; keep remote URLs",
171
- );
144
+ log?.warn?.("[cwork_im:inbound-local] resolveAgentWorkspaceDir unavailable, skip inbound download; keep remote URLs");
172
145
  return fileItems;
173
146
  }
174
-
175
147
  await ensureAgentWorkspaceFromRuntime(rt, cfg);
176
-
177
148
  const maxBytes = resolveMaxAttachmentBytes(config);
178
149
  const userSeg = sanitizeUserIdForPath(senderUserId ?? "unknown");
179
150
  const relParts = normalized.split("/");
180
151
  const pathStyle = config.inboundMediaOpenClawPath ?? "workspaceRelative";
181
152
  const sandboxPrefix = config.inboundMediaSandboxRootPrefix?.trim() || "";
182
-
183
- log?.info?.(
184
- `[cwork_im:inbound-local] begin files=${fileItems.length} cwd=${process.cwd()} workspaceRoot=${workspaceRoot} subdir=${normalized} user=${userSeg} style=${pathStyle} sandboxPrefix=${sandboxPrefix || "(none)"}`,
185
- );
186
-
187
- const out: MsgFileVO[] = [];
153
+ log?.info?.(`[cwork_im:inbound-local] begin files=${fileItems.length} cwd=${process.cwd()} workspaceRoot=${workspaceRoot} subdir=${normalized} user=${userSeg} style=${pathStyle} sandboxPrefix=${sandboxPrefix || "(none)"}`);
154
+ const out = [];
188
155
  for (const item of fileItems) {
189
156
  const srcUrl = item.url?.trim();
190
157
  if (!srcUrl) {
@@ -196,11 +163,8 @@ export async function saveInboundFilesToWorkspace(args: {
196
163
  const localName = buildInboundStoredFilename(item.name?.trim() || "file", now);
197
164
  const dir = path.join(workspaceRoot, ...relParts, userSeg, dateFolder);
198
165
  const absPath = path.join(dir, localName);
199
-
200
166
  try {
201
- log?.info?.(
202
- `[cwork_im:inbound-local] prepare src=${srcUrl.slice(0, 120)} dir=${dir} abs=${absPath}`,
203
- );
167
+ log?.info?.(`[cwork_im:inbound-local] prepare src=${srcUrl.slice(0, 120)} dir=${dir} abs=${absPath}`);
204
168
  await mkdir(dir, { recursive: true });
205
169
  const { buffer } = await downloadMediaBuffer(srcUrl, maxBytes, log);
206
170
  await writeFile(absPath, buffer);
@@ -212,21 +176,19 @@ export async function saveInboundFilesToWorkspace(args: {
212
176
  log,
213
177
  });
214
178
  const st = await stat(absPath);
215
- log?.info?.(
216
- `[cwork_im:inbound-local] saved ${localName} bytes=${buffer.length} stat.size=${st.size} stat.mtime=${st.mtime.toISOString()} abs=${absPath} openclawRef=${mediaRef}`,
217
- );
179
+ log?.info?.(`[cwork_im:inbound-local] saved ${localName} bytes=${buffer.length} stat.size=${st.size} stat.mtime=${st.mtime.toISOString()} abs=${absPath} openclawRef=${mediaRef}`);
218
180
  out.push({
219
181
  ...item,
220
182
  url: mediaRef,
221
183
  size: buffer.length,
222
184
  name: localName,
223
185
  });
224
- } catch (e: unknown) {
225
- log?.warn?.(
226
- `[cwork_im:inbound-local] download/save failed, keep original URL: ${String(e)} ref=${srcUrl.slice(0, 80)}`,
227
- );
186
+ }
187
+ catch (e) {
188
+ log?.warn?.(`[cwork_im:inbound-local] download/save failed, keep original URL: ${String(e)} ref=${srcUrl.slice(0, 80)}`);
228
189
  out.push(item);
229
190
  }
230
191
  }
231
192
  return out;
232
193
  }
194
+ //# sourceMappingURL=inbound-media-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-media-local.js","sourceRoot":"","sources":["../../src/inbound-media-local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** 建议复制到 `channels.xg_cwork_im.systemPrompt`。 */
2
+ export declare const XG_IM_RECOMMENDED_CHANNEL_SYSTEM_PROMPT = "\u53D1\u6587\u4EF6\u7ED9\u7528\u6237\u65F6\uFF0C\u5728\u56DE\u590D\u6B63\u6587\u91CC\u5355\u72EC\u5199\u4E00\u884C `MEDIA:<\u8DEF\u5F84>`\uFF0C\u4F8B\u5982\uFF1AMEDIA:/workspace/report.pdf\u3002\u8DEF\u5F84\u652F\u6301 /workspace/\u2026\u3001file://\u2026\u3001http(s)://\u2026\u3002OpenClaw \u4F1A\u81EA\u52A8\u8BFB\u53D6\u8BE5\u8DEF\u5F84\u5E76\u8BA9\u901A\u9053\u4E0A\u4F20\uFF0C\u7528\u6237\u53EF\u76F4\u63A5\u5728 IM \u4E2D\u4E0B\u8F7D\u3002\u4E0D\u8981\u628A\u8DEF\u5F84\u5F53\u4F5C\u5DF2\u53D1\u9001\uFF1B\u4E5F\u4E0D\u8981\u4E0A\u4F20\u5230\u5916\u90E8\u7F51\u7AD9\u3002";
3
+ //# sourceMappingURL=recommended-system-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommended-system-prompt.d.ts","sourceRoot":"","sources":["../../src/recommended-system-prompt.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,eAAO,MAAM,uCAAuC,ukBACqH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** 建议复制到 `channels.xg_cwork_im.systemPrompt`。 */
2
+ export const XG_IM_RECOMMENDED_CHANNEL_SYSTEM_PROMPT = "发文件给用户时,在回复正文里单独写一行 `MEDIA:<路径>`,例如:MEDIA:/workspace/report.pdf。路径支持 /workspace/…、file://…、http(s)://…。OpenClaw 会自动读取该路径并让通道上传,用户可直接在 IM 中下载。不要把路径当作已发送;也不要上传到外部网站。";
3
+ //# sourceMappingURL=recommended-system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommended-system-prompt.js","sourceRoot":"","sources":["../../src/recommended-system-prompt.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,MAAM,CAAC,MAAM,uCAAuC,GAChD,qKAAqK,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * 资源中心整文件上传 + OpenClaw deliver 媒体 URL 拉取
3
+ *
4
+ * 上传地址固定为 `baseUrl + /file/upDownload/uploadWholeFile`,与 IM 同域,使用与发消息相同的 access-token。
5
+ */
6
+ import type { Log } from "./auth.js";
7
+ /** 整文件上传接口路径(拼在 channels.xg_cwork_im.baseUrl 上) */
8
+ export declare const RESOURCE_UPLOAD_PATH = "/file/upDownload/uploadWholeFile";
9
+ export declare function resolveResourceUploadUrl(baseUrl: string): string;
10
+ /** 从上传接口 JSON 中解析 fileId(兼容常见嵌套 data) */
11
+ export declare function extractFileIdFromUploadResponse(data: unknown): string | undefined;
12
+ export declare function formatFromFilename(filename: string): string;
13
+ /** 仅当含 %XX 序列时 decodeURIComponent,避免对已解码的 Unicode 再 decode 抛错 */
14
+ export declare function safeDecodeUriFilenameSegment(segment: string): string;
15
+ /**
16
+ * 从 HTTP Content-Disposition 解析文件名(优先 RFC 5987 `filename*=` UTF-8,再普通 filename=)。
17
+ */
18
+ export declare function parseFilenameFromContentDisposition(header: string | undefined): string | undefined;
19
+ export declare function displayNameFromUrl(url: string): string;
20
+ /** 日志用:截断过长路径/URL */
21
+ export declare function summarizeMediaRef(ref: string, maxLen?: number): string;
22
+ /**
23
+ * 将字符串解析为可交给 readFile 的本机路径(兼容 Windows / macOS / Linux)。
24
+ * - 使用当前进程的 path.isAbsolute(各 OS 语义正确)。
25
+ * - Windows:Git Bash / MSYS 的 `/c/Users/...`、Cygwin `/cygdrive/c/...`。
26
+ * - 非 Windows:若传入 `D:\...` 形式仍做一次规范化(多用于日志/失败提示,读文件通常会失败)。
27
+ */
28
+ export declare function resolveLocalFsPath(ref: string): {
29
+ fsPath: string;
30
+ via: string;
31
+ } | null;
32
+ /**
33
+ * 将 OpenClaw 约定的 `/workspace/<rel>` 路径解析为本机绝对路径(跨平台)。
34
+ *
35
+ * OpenClaw 在所有平台启动时均会 chdir 到 workspace 目录,因此
36
+ * `process.cwd()` 即为 workspace 根,/workspace/<rel> 等价于 cwd/<rel>:
37
+ * - Windows : C:\Users\..\.openclaw\workspace\<rel>
38
+ * - macOS : ~/.openclaw/workspace/<rel>
39
+ * - Linux容器: /workspace/<rel>(cwd=/workspace,path.join 结果不变)
40
+ *
41
+ * 返回 null 表示路径不符合 /workspace/ 格式。
42
+ */
43
+ export declare function resolveWorkspacePrefixPath(raw: string): string | null;
44
+ export declare function downloadMediaBuffer(url: string, maxBytes: number, log?: Log): Promise<{
45
+ buffer: Buffer;
46
+ filename: string;
47
+ }>;
48
+ /**
49
+ * multipart 上传整文件,返回 fileId 与字节数。
50
+ */
51
+ export declare function uploadWholeResourceFile(args: {
52
+ fileUploadUrl: string;
53
+ token: string;
54
+ buffer: Buffer;
55
+ filename: string;
56
+ formField: string;
57
+ log?: Log;
58
+ }): Promise<{
59
+ fileId: string;
60
+ size: number;
61
+ }>;
62
+ export declare function resolveMaxAttachmentBytes(config: {
63
+ maxAttachmentBytes?: number;
64
+ }): number;
65
+ //# sourceMappingURL=resource-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-file.d.ts","sourceRoot":"","sources":["../../src/resource-file.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIrC,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,qCAAqC,CAAC;AAEvE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,yCAAyC;AACzC,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAcjF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,iEAAiE;AACjE,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASpE;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CA0BlG;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED,qBAAqB;AACrB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,MAAM,CAInE;AAWD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiCtF;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKrE;AAED,wBAAsB,mBAAmB,CACrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,GAAG,GACV,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA6E/C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,GAAG,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA+C5C;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEzF"}