@office-agents/sdk 0.0.1

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 (81) hide show
  1. package/dist/index.d.ts +18 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +29 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lockdown.d.ts +3 -0
  6. package/dist/lockdown.d.ts.map +1 -0
  7. package/dist/lockdown.js +103 -0
  8. package/dist/lockdown.js.map +1 -0
  9. package/dist/message-utils.d.ts +44 -0
  10. package/dist/message-utils.d.ts.map +1 -0
  11. package/dist/message-utils.js +134 -0
  12. package/dist/message-utils.js.map +1 -0
  13. package/dist/oauth/index.d.ts +44 -0
  14. package/dist/oauth/index.d.ts.map +1 -0
  15. package/dist/oauth/index.js +259 -0
  16. package/dist/oauth/index.js.map +1 -0
  17. package/dist/provider-config.d.ts +29 -0
  18. package/dist/provider-config.d.ts.map +1 -0
  19. package/dist/provider-config.js +101 -0
  20. package/dist/provider-config.js.map +1 -0
  21. package/dist/runtime.d.ts +93 -0
  22. package/dist/runtime.d.ts.map +1 -0
  23. package/dist/runtime.js +688 -0
  24. package/dist/runtime.js.map +1 -0
  25. package/dist/sandbox.d.ts +2 -0
  26. package/dist/sandbox.d.ts.map +1 -0
  27. package/dist/sandbox.js +22 -0
  28. package/dist/sandbox.js.map +1 -0
  29. package/dist/skills/index.d.ts +16 -0
  30. package/dist/skills/index.d.ts.map +1 -0
  31. package/dist/skills/index.js +96 -0
  32. package/dist/skills/index.js.map +1 -0
  33. package/dist/storage/db.d.ts +55 -0
  34. package/dist/storage/db.d.ts.map +1 -0
  35. package/dist/storage/db.js +229 -0
  36. package/dist/storage/db.js.map +1 -0
  37. package/dist/storage/index.d.ts +4 -0
  38. package/dist/storage/index.d.ts.map +1 -0
  39. package/dist/storage/index.js +3 -0
  40. package/dist/storage/index.js.map +1 -0
  41. package/dist/storage/namespace.d.ts +9 -0
  42. package/dist/storage/namespace.d.ts.map +1 -0
  43. package/dist/storage/namespace.js +14 -0
  44. package/dist/storage/namespace.js.map +1 -0
  45. package/dist/tools/bash.d.ts +2 -0
  46. package/dist/tools/bash.d.ts.map +1 -0
  47. package/dist/tools/bash.js +69 -0
  48. package/dist/tools/bash.js.map +1 -0
  49. package/dist/tools/read-file.d.ts +2 -0
  50. package/dist/tools/read-file.d.ts.map +1 -0
  51. package/dist/tools/read-file.js +116 -0
  52. package/dist/tools/read-file.js.map +1 -0
  53. package/dist/tools/types.d.ts +16 -0
  54. package/dist/tools/types.d.ts.map +1 -0
  55. package/dist/tools/types.js +28 -0
  56. package/dist/tools/types.js.map +1 -0
  57. package/dist/truncate.d.ts +19 -0
  58. package/dist/truncate.d.ts.map +1 -0
  59. package/dist/truncate.js +101 -0
  60. package/dist/truncate.js.map +1 -0
  61. package/dist/vfs/index.d.ts +35 -0
  62. package/dist/vfs/index.d.ts.map +1 -0
  63. package/dist/vfs/index.js +168 -0
  64. package/dist/vfs/index.js.map +1 -0
  65. package/dist/web/config.d.ts +12 -0
  66. package/dist/web/config.d.ts.map +1 -0
  67. package/dist/web/config.js +41 -0
  68. package/dist/web/config.js.map +1 -0
  69. package/dist/web/fetch.d.ts +5 -0
  70. package/dist/web/fetch.d.ts.map +1 -0
  71. package/dist/web/fetch.js +174 -0
  72. package/dist/web/fetch.js.map +1 -0
  73. package/dist/web/search.d.ts +9 -0
  74. package/dist/web/search.d.ts.map +1 -0
  75. package/dist/web/search.js +238 -0
  76. package/dist/web/search.js.map +1 -0
  77. package/dist/web/types.d.ts +56 -0
  78. package/dist/web/types.d.ts.map +1 -0
  79. package/dist/web/types.js +2 -0
  80. package/dist/web/types.js.map +1 -0
  81. package/package.json +47 -0
@@ -0,0 +1,69 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateTail, } from "../truncate";
3
+ import { getBash } from "../vfs";
4
+ import { defineTool, toolError, toolSuccess } from "./types";
5
+ export const bashTool = defineTool({
6
+ name: "bash",
7
+ label: "Bash",
8
+ description: "Execute bash commands in a sandboxed virtual environment. " +
9
+ `Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). ` +
10
+ "The filesystem is in-memory with user uploads in /home/user/uploads/. " +
11
+ "Useful for: file operations (ls, cat, grep, find), text processing (awk, sed, jq, sort, uniq), " +
12
+ "data analysis (wc, cut, paste), and general scripting. " +
13
+ "Network access is disabled. No external runtimes (node, python, etc.) are available.",
14
+ parameters: Type.Object({
15
+ command: Type.String({
16
+ description: "Bash command(s) to execute. Can be a single command or a script with multiple lines. " +
17
+ "Supports pipes (|), redirections (>, >>), command chaining (&&, ||, ;), " +
18
+ "variables, loops, conditionals, and functions.",
19
+ }),
20
+ explanation: Type.Optional(Type.String({
21
+ description: "Brief explanation (max 50 chars)",
22
+ maxLength: 50,
23
+ })),
24
+ }),
25
+ execute: async (_toolCallId, params) => {
26
+ try {
27
+ const bash = getBash();
28
+ const result = await bash.exec(params.command);
29
+ let output = "";
30
+ if (result.stdout) {
31
+ output += result.stdout;
32
+ }
33
+ if (result.stderr) {
34
+ if (output && !output.endsWith("\n"))
35
+ output += "\n";
36
+ output += `stderr: ${result.stderr}`;
37
+ }
38
+ if (result.exitCode !== 0) {
39
+ if (output && !output.endsWith("\n"))
40
+ output += "\n";
41
+ output += `[exit code: ${result.exitCode}]`;
42
+ }
43
+ if (!output) {
44
+ output = "[no output]";
45
+ }
46
+ output = output.trim();
47
+ const truncation = truncateTail(output);
48
+ let outputText = truncation.content;
49
+ if (truncation.truncated) {
50
+ const startLine = truncation.totalLines - truncation.outputLines + 1;
51
+ const endLine = truncation.totalLines;
52
+ if (truncation.truncatedBy === "lines") {
53
+ outputText += `\n\n[Showing last ${truncation.outputLines} of ${truncation.totalLines} lines. Output truncated.]`;
54
+ }
55
+ else {
56
+ outputText += `\n\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Output truncated.]`;
57
+ }
58
+ }
59
+ return toolSuccess({ output: outputText, exitCode: result.exitCode });
60
+ }
61
+ catch (error) {
62
+ const message = error instanceof Error
63
+ ? error.message
64
+ : "Unknown error executing bash command";
65
+ return toolError(message);
66
+ }
67
+ },
68
+ });
69
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const readTool: import("@mariozechner/pi-agent-core").AgentTool<import("@sinclair/typebox").TSchema, any>;
2
+ //# sourceMappingURL=read-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,QAAQ,2FAoInB,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, } from "../truncate";
3
+ import { fileExists, getFileType, listUploads, readFileBuffer, toBase64, } from "../vfs";
4
+ import { defineTool, toolError, toolText } from "./types";
5
+ export const readTool = defineTool({
6
+ name: "read",
7
+ label: "Read",
8
+ description: "Read a file from the virtual filesystem. " +
9
+ "Files are uploaded by the user to /home/user/uploads/. " +
10
+ "For images (png, jpg, gif, webp), returns the image for you to analyze visually. " +
11
+ `For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). ` +
12
+ "Use offset/limit for large files. When you need the full file, continue with offset until complete. " +
13
+ "Use 'bash ls /home/user/uploads' to see available files.",
14
+ parameters: Type.Object({
15
+ path: Type.String({
16
+ description: "Path to the file. Can be absolute (starting with /) or relative to /home/user/uploads/. Example: 'image.png' or '/home/user/uploads/data.csv'",
17
+ }),
18
+ offset: Type.Optional(Type.Number({
19
+ description: "Line number to start reading from (1-indexed)",
20
+ })),
21
+ limit: Type.Optional(Type.Number({
22
+ description: "Maximum number of lines to read",
23
+ })),
24
+ explanation: Type.Optional(Type.String({
25
+ description: "Brief explanation (max 50 chars)",
26
+ maxLength: 50,
27
+ })),
28
+ }),
29
+ execute: async (_toolCallId, params) => {
30
+ try {
31
+ const path = params.path;
32
+ const fullPath = path.startsWith("/")
33
+ ? path
34
+ : `/home/user/uploads/${path}`;
35
+ // Check if file exists
36
+ if (!(await fileExists(fullPath))) {
37
+ // List available files to help the user
38
+ const uploads = await listUploads();
39
+ const hint = uploads.length > 0
40
+ ? `Available files: ${uploads.join(", ")}`
41
+ : "No files uploaded yet.";
42
+ return toolError(`File not found: ${fullPath}. ${hint}`);
43
+ }
44
+ const filename = fullPath.split("/").pop() || "";
45
+ const { isImage, mimeType } = getFileType(filename);
46
+ if (isImage) {
47
+ // Return image as base64 for vision models
48
+ const data = await readFileBuffer(fullPath);
49
+ const base64 = toBase64(data);
50
+ return {
51
+ content: [
52
+ {
53
+ type: "text",
54
+ text: `Read image file: ${filename} [${mimeType}]`,
55
+ },
56
+ { type: "image", data: base64, mimeType },
57
+ ],
58
+ details: undefined,
59
+ };
60
+ }
61
+ // For text files, apply truncation
62
+ const data = await readFileBuffer(fullPath);
63
+ const decoder = new TextDecoder();
64
+ const text = decoder.decode(data);
65
+ const allLines = text.split("\n");
66
+ const totalFileLines = allLines.length;
67
+ // Apply offset (1-indexed to 0-indexed)
68
+ const startLine = params.offset ? Math.max(0, params.offset - 1) : 0;
69
+ const startLineDisplay = startLine + 1;
70
+ if (startLine >= allLines.length) {
71
+ return toolError(`Offset ${params.offset} is beyond end of file (${allLines.length} lines total)`);
72
+ }
73
+ // Apply limit param if specified
74
+ let selectedContent;
75
+ let userLimitedLines;
76
+ if (params.limit !== undefined) {
77
+ const endLine = Math.min(startLine + params.limit, allLines.length);
78
+ selectedContent = allLines.slice(startLine, endLine).join("\n");
79
+ userLimitedLines = endLine - startLine;
80
+ }
81
+ else {
82
+ selectedContent = allLines.slice(startLine).join("\n");
83
+ }
84
+ // Apply truncation
85
+ const truncation = truncateHead(selectedContent);
86
+ let outputText;
87
+ if (truncation.truncated) {
88
+ const endLineDisplay = startLineDisplay + truncation.outputLines - 1;
89
+ const nextOffset = endLineDisplay + 1;
90
+ outputText = truncation.content;
91
+ if (truncation.truncatedBy === "lines") {
92
+ outputText += `\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;
93
+ }
94
+ else {
95
+ outputText += `\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;
96
+ }
97
+ }
98
+ else if (userLimitedLines !== undefined &&
99
+ startLine + userLimitedLines < allLines.length) {
100
+ const remaining = allLines.length - (startLine + userLimitedLines);
101
+ const nextOffset = startLine + userLimitedLines + 1;
102
+ outputText = truncation.content;
103
+ outputText += `\n\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;
104
+ }
105
+ else {
106
+ outputText = truncation.content;
107
+ }
108
+ return toolText(outputText);
109
+ }
110
+ catch (error) {
111
+ const message = error instanceof Error ? error.message : "Unknown error reading file";
112
+ return toolError(message);
113
+ }
114
+ },
115
+ });
116
+ //# sourceMappingURL=read-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core";
2
+ import type { Static, TObject } from "@sinclair/typebox";
3
+ export type ToolResult = AgentToolResult<undefined>;
4
+ interface ToolConfig<T extends TObject> {
5
+ name: string;
6
+ label: string;
7
+ description: string;
8
+ parameters: T;
9
+ execute: (toolCallId: string, params: Static<T>, signal?: AbortSignal) => Promise<ToolResult>;
10
+ }
11
+ export declare function defineTool<T extends TObject>(config: ToolConfig<T>): AgentTool;
12
+ export declare function toolSuccess(data: unknown): ToolResult;
13
+ export declare function toolError(message: string): ToolResult;
14
+ export declare function toolText(text: string): ToolResult;
15
+ export {};
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;AAEpD,UAAU,UAAU,CAAC,CAAC,SAAS,OAAO;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,CAAC;IACd,OAAO,EAAE,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,EAC1C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GACpB,SAAS,CAEX;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAOrD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAUrD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAKjD"}
@@ -0,0 +1,28 @@
1
+ export function defineTool(config) {
2
+ return config;
3
+ }
4
+ export function toolSuccess(data) {
5
+ const result = typeof data === "object" && data !== null ? { ...data } : { result: data };
6
+ return {
7
+ content: [{ type: "text", text: JSON.stringify(result) }],
8
+ details: undefined,
9
+ };
10
+ }
11
+ export function toolError(message) {
12
+ return {
13
+ content: [
14
+ {
15
+ type: "text",
16
+ text: JSON.stringify({ success: false, error: message }),
17
+ },
18
+ ],
19
+ details: undefined,
20
+ };
21
+ }
22
+ export function toolText(text) {
23
+ return {
24
+ content: [{ type: "text", text }],
25
+ details: undefined,
26
+ };
27
+ }
28
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,UAAU,CACxB,MAAqB;IAErB,OAAO,MAA8B,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,MAAM,MAAM,GACV,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7E,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,SAAS;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACzD;SACF;QACD,OAAO,EAAE,SAAS;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,SAAS;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const DEFAULT_MAX_LINES = 2000;
2
+ export declare const DEFAULT_MAX_BYTES: number;
3
+ export interface TruncationResult {
4
+ content: string;
5
+ truncated: boolean;
6
+ truncatedBy: "lines" | "bytes" | null;
7
+ totalLines: number;
8
+ totalBytes: number;
9
+ outputLines: number;
10
+ outputBytes: number;
11
+ }
12
+ export interface TruncationOptions {
13
+ maxLines?: number;
14
+ maxBytes?: number;
15
+ }
16
+ export declare function formatSize(bytes: number): string;
17
+ export declare function truncateHead(content: string, options?: TruncationOptions): TruncationResult;
18
+ export declare function truncateTail(content: string, options?: TruncationOptions): TruncationResult;
19
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAMD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAgDlB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAgDlB"}
@@ -0,0 +1,101 @@
1
+ export const DEFAULT_MAX_LINES = 2000;
2
+ export const DEFAULT_MAX_BYTES = 50 * 1024; // 50KB
3
+ export function formatSize(bytes) {
4
+ if (bytes < 1024)
5
+ return `${bytes}B`;
6
+ if (bytes < 1024 * 1024)
7
+ return `${(bytes / 1024).toFixed(1)}KB`;
8
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
9
+ }
10
+ function byteLength(str) {
11
+ return new TextEncoder().encode(str).byteLength;
12
+ }
13
+ export function truncateHead(content, options = {}) {
14
+ const maxLines = options.maxLines ?? DEFAULT_MAX_LINES;
15
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
16
+ const totalBytes = byteLength(content);
17
+ const lines = content.split("\n");
18
+ const totalLines = lines.length;
19
+ if (totalLines <= maxLines && totalBytes <= maxBytes) {
20
+ return {
21
+ content,
22
+ truncated: false,
23
+ truncatedBy: null,
24
+ totalLines,
25
+ totalBytes,
26
+ outputLines: totalLines,
27
+ outputBytes: totalBytes,
28
+ };
29
+ }
30
+ const outputLines = [];
31
+ let outputBytesCount = 0;
32
+ let truncatedBy = "lines";
33
+ for (let i = 0; i < lines.length && i < maxLines; i++) {
34
+ const line = lines[i];
35
+ const lb = byteLength(line) + (i > 0 ? 1 : 0);
36
+ if (outputBytesCount + lb > maxBytes) {
37
+ truncatedBy = "bytes";
38
+ break;
39
+ }
40
+ outputLines.push(line);
41
+ outputBytesCount += lb;
42
+ }
43
+ if (outputLines.length >= maxLines && outputBytesCount <= maxBytes) {
44
+ truncatedBy = "lines";
45
+ }
46
+ const outputContent = outputLines.join("\n");
47
+ return {
48
+ content: outputContent,
49
+ truncated: true,
50
+ truncatedBy,
51
+ totalLines,
52
+ totalBytes,
53
+ outputLines: outputLines.length,
54
+ outputBytes: byteLength(outputContent),
55
+ };
56
+ }
57
+ export function truncateTail(content, options = {}) {
58
+ const maxLines = options.maxLines ?? DEFAULT_MAX_LINES;
59
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
60
+ const totalBytes = byteLength(content);
61
+ const lines = content.split("\n");
62
+ const totalLines = lines.length;
63
+ if (totalLines <= maxLines && totalBytes <= maxBytes) {
64
+ return {
65
+ content,
66
+ truncated: false,
67
+ truncatedBy: null,
68
+ totalLines,
69
+ totalBytes,
70
+ outputLines: totalLines,
71
+ outputBytes: totalBytes,
72
+ };
73
+ }
74
+ const outputLines = [];
75
+ let outputBytesCount = 0;
76
+ let truncatedBy = "lines";
77
+ for (let i = lines.length - 1; i >= 0 && outputLines.length < maxLines; i--) {
78
+ const line = lines[i];
79
+ const lb = byteLength(line) + (outputLines.length > 0 ? 1 : 0);
80
+ if (outputBytesCount + lb > maxBytes) {
81
+ truncatedBy = "bytes";
82
+ break;
83
+ }
84
+ outputLines.unshift(line);
85
+ outputBytesCount += lb;
86
+ }
87
+ if (outputLines.length >= maxLines && outputBytesCount <= maxBytes) {
88
+ truncatedBy = "lines";
89
+ }
90
+ const outputContent = outputLines.join("\n");
91
+ return {
92
+ content: outputContent,
93
+ truncated: true,
94
+ truncatedBy,
95
+ totalLines,
96
+ totalBytes,
97
+ outputLines: outputLines.length,
98
+ outputBytes: byteLength(outputContent),
99
+ };
100
+ }
101
+ //# sourceMappingURL=truncate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Virtual Filesystem (VFS) for the agent
3
+ *
4
+ * Provides an in-memory filesystem using just-bash that allows:
5
+ * - Users to upload files (images, CSVs, etc.)
6
+ * - Agent to read files via read_file tool
7
+ * - Agent to execute bash commands via bash tool
8
+ */
9
+ import { Bash, type CustomCommand, InMemoryFs } from "just-bash/browser";
10
+ export declare function setSkillFiles(files: Record<string, Uint8Array | string>): void;
11
+ export declare function setStaticFiles(files: Record<string, string>): void;
12
+ export declare function setCustomCommands(factory: () => CustomCommand[]): void;
13
+ export declare function getVfs(): InMemoryFs;
14
+ export declare function getBash(): Bash;
15
+ export declare function resetVfs(): void;
16
+ export declare function snapshotVfs(): Promise<{
17
+ path: string;
18
+ data: Uint8Array;
19
+ }[]>;
20
+ export declare function restoreVfs(files: {
21
+ path: string;
22
+ data: Uint8Array;
23
+ }[]): Promise<void>;
24
+ export declare function writeFile(path: string, content: string | Uint8Array): Promise<void>;
25
+ export declare function readFile(path: string): Promise<string>;
26
+ export declare function readFileBuffer(path: string): Promise<Uint8Array>;
27
+ export declare function fileExists(path: string): Promise<boolean>;
28
+ export declare function deleteFile(path: string): Promise<void>;
29
+ export declare function listUploads(): Promise<string[]>;
30
+ export declare function getFileType(filename: string): {
31
+ isImage: boolean;
32
+ mimeType: string;
33
+ };
34
+ export declare function toBase64(data: Uint8Array): string;
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vfs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAUzE,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,GACzC,IAAI,CAEN;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAElE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,aAAa,EAAE,GAAG,IAAI,CAEtE;AAED,wBAAgB,MAAM,IAAI,UAAU,CASnC;AAED,wBAAgB,OAAO,IAAI,IAAI,CAS9B;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAG/B;AAED,wBAAsB,WAAW,IAAI,OAAO,CAC1C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,EAAE,CACrC,CAmBA;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,EAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5D;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAItE;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQrD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAkCA;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAMjD"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Virtual Filesystem (VFS) for the agent
3
+ *
4
+ * Provides an in-memory filesystem using just-bash that allows:
5
+ * - Users to upload files (images, CSVs, etc.)
6
+ * - Agent to read files via read_file tool
7
+ * - Agent to execute bash commands via bash tool
8
+ */
9
+ import { Bash, InMemoryFs } from "just-bash/browser";
10
+ let fs = null;
11
+ let bash = null;
12
+ let skillFilesCache = {};
13
+ let staticFiles = {};
14
+ let customCommandsFactory = null;
15
+ export function setSkillFiles(files) {
16
+ skillFilesCache = files;
17
+ }
18
+ export function setStaticFiles(files) {
19
+ staticFiles = files;
20
+ }
21
+ export function setCustomCommands(factory) {
22
+ customCommandsFactory = factory;
23
+ }
24
+ export function getVfs() {
25
+ if (!fs) {
26
+ fs = new InMemoryFs({
27
+ "/home/user/uploads/.keep": "",
28
+ ...staticFiles,
29
+ ...skillFilesCache,
30
+ });
31
+ }
32
+ return fs;
33
+ }
34
+ export function getBash() {
35
+ if (!bash) {
36
+ bash = new Bash({
37
+ fs: getVfs(),
38
+ cwd: "/home/user",
39
+ customCommands: customCommandsFactory?.() ?? [],
40
+ });
41
+ }
42
+ return bash;
43
+ }
44
+ export function resetVfs() {
45
+ fs = null;
46
+ bash = null;
47
+ }
48
+ export async function snapshotVfs() {
49
+ const vfs = getVfs();
50
+ const allPaths = vfs.getAllPaths();
51
+ const files = [];
52
+ for (const p of allPaths) {
53
+ if (p.startsWith("/home/skills/"))
54
+ continue;
55
+ try {
56
+ const stat = await vfs.stat(p);
57
+ if (stat.isFile) {
58
+ const data = await vfs.readFileBuffer(p);
59
+ files.push({ path: p, data });
60
+ }
61
+ }
62
+ catch {
63
+ // skip unreadable entries
64
+ }
65
+ }
66
+ return files;
67
+ }
68
+ export async function restoreVfs(files) {
69
+ resetVfs();
70
+ if (files.length === 0) {
71
+ getVfs();
72
+ return;
73
+ }
74
+ const initialFiles = {
75
+ "/home/user/uploads/.keep": "",
76
+ ...staticFiles,
77
+ ...skillFilesCache,
78
+ };
79
+ for (const f of files) {
80
+ initialFiles[f.path] = f.data;
81
+ }
82
+ fs = new InMemoryFs(initialFiles);
83
+ bash = null;
84
+ }
85
+ export async function writeFile(path, content) {
86
+ const vfs = getVfs();
87
+ const fullPath = path.startsWith("/") ? path : `/home/user/uploads/${path}`;
88
+ const dir = fullPath.substring(0, fullPath.lastIndexOf("/"));
89
+ if (dir && dir !== "/") {
90
+ try {
91
+ await vfs.mkdir(dir, { recursive: true });
92
+ }
93
+ catch {
94
+ // Directory might already exist
95
+ }
96
+ }
97
+ await vfs.writeFile(fullPath, content);
98
+ }
99
+ export async function readFile(path) {
100
+ const vfs = getVfs();
101
+ const fullPath = path.startsWith("/") ? path : `/home/user/uploads/${path}`;
102
+ return vfs.readFile(fullPath);
103
+ }
104
+ export async function readFileBuffer(path) {
105
+ const vfs = getVfs();
106
+ const fullPath = path.startsWith("/") ? path : `/home/user/uploads/${path}`;
107
+ return vfs.readFileBuffer(fullPath);
108
+ }
109
+ export async function fileExists(path) {
110
+ const vfs = getVfs();
111
+ const fullPath = path.startsWith("/") ? path : `/home/user/uploads/${path}`;
112
+ return vfs.exists(fullPath);
113
+ }
114
+ export async function deleteFile(path) {
115
+ const vfs = getVfs();
116
+ const fullPath = path.startsWith("/") ? path : `/home/user/uploads/${path}`;
117
+ await vfs.rm(fullPath);
118
+ }
119
+ export async function listUploads() {
120
+ const vfs = getVfs();
121
+ try {
122
+ const entries = await vfs.readdir("/home/user/uploads");
123
+ return entries.filter((e) => e !== ".keep");
124
+ }
125
+ catch {
126
+ return [];
127
+ }
128
+ }
129
+ export function getFileType(filename) {
130
+ const ext = filename.toLowerCase().split(".").pop() || "";
131
+ const imageExts = {
132
+ png: "image/png",
133
+ jpg: "image/jpeg",
134
+ jpeg: "image/jpeg",
135
+ gif: "image/gif",
136
+ webp: "image/webp",
137
+ svg: "image/svg+xml",
138
+ bmp: "image/bmp",
139
+ ico: "image/x-icon",
140
+ };
141
+ if (ext in imageExts) {
142
+ return { isImage: true, mimeType: imageExts[ext] };
143
+ }
144
+ const mimeTypes = {
145
+ txt: "text/plain",
146
+ csv: "text/csv",
147
+ json: "application/json",
148
+ xml: "application/xml",
149
+ html: "text/html",
150
+ css: "text/css",
151
+ js: "application/javascript",
152
+ ts: "application/typescript",
153
+ md: "text/markdown",
154
+ pdf: "application/pdf",
155
+ };
156
+ return {
157
+ isImage: false,
158
+ mimeType: mimeTypes[ext] || "application/octet-stream",
159
+ };
160
+ }
161
+ export function toBase64(data) {
162
+ let binary = "";
163
+ for (let i = 0; i < data.length; i++) {
164
+ binary += String.fromCharCode(data[i]);
165
+ }
166
+ return btoa(binary);
167
+ }
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vfs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAsB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEzE,IAAI,EAAE,GAAsB,IAAI,CAAC;AACjC,IAAI,IAAI,GAAgB,IAAI,CAAC;AAE7B,IAAI,eAAe,GAAwC,EAAE,CAAC;AAC9D,IAAI,WAAW,GAA2B,EAAE,CAAC;AAE7C,IAAI,qBAAqB,GAAmC,IAAI,CAAC;AAEjE,MAAM,UAAU,aAAa,CAC3B,KAA0C;IAE1C,eAAe,GAAG,KAAK,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAA6B;IAC1D,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA8B;IAC9D,qBAAqB,GAAG,OAAO,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,EAAE,GAAG,IAAI,UAAU,CAAC;YAClB,0BAA0B,EAAE,EAAE;YAC9B,GAAG,WAAW;YACd,GAAG,eAAe;SACnB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,IAAI,CAAC;YACd,EAAE,EAAE,MAAM,EAAE;YACZ,GAAG,EAAE,YAAY;YACjB,cAAc,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,EAAE,GAAG,IAAI,CAAC;IACV,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAG/B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,KAAK,GAAyC,EAAE,CAAC;IAEvD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAA2C;IAE3C,QAAQ,EAAE,CAAC;IAEX,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAwC;QACxD,0BAA0B,EAAE,EAAE;QAC9B,GAAG,WAAW;QACd,GAAG,eAAe;KACnB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,EAAE,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;IAClC,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,OAA4B;IAE5B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAE5E,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAC5E,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAC5E,OAAO,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAC5E,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAC5E,MAAM,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAI1C,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC1D,MAAM,SAAS,GAA2B;QACxC,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,YAAY;QACjB,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,eAAe;QACpB,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,cAAc;KACpB,CAAC;IAEF,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,SAAS,GAA2B;QACxC,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE,iBAAiB;QACtB,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,UAAU;QACf,EAAE,EAAE,wBAAwB;QAC5B,EAAE,EAAE,wBAAwB;QAC5B,EAAE,EAAE,eAAe;QACnB,GAAG,EAAE,iBAAiB;KACvB,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,0BAA0B;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface WebConfig {
2
+ searchProvider: string;
3
+ fetchProvider: string;
4
+ apiKeys: {
5
+ exa?: string;
6
+ brave?: string;
7
+ serper?: string;
8
+ };
9
+ }
10
+ export declare function loadWebConfig(): WebConfig;
11
+ export declare function saveWebConfig(config: Partial<WebConfig>): void;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/web/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAcD,wBAAgB,aAAa,IAAI,SAAS,CAiBzC;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,QAWvD"}