@anuma/sdk 1.0.0

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 (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/expo/chunk-LJYAMK62.mjs +25 -0
  4. package/dist/expo/chunk-MJJIYFAX.mjs +25 -0
  5. package/dist/expo/chunk-PJCZO4BQ.mjs +25 -0
  6. package/dist/expo/clientConfig-2MI4KULF.mjs +10 -0
  7. package/dist/expo/clientConfig-QDAXFL3W.mjs +10 -0
  8. package/dist/expo/clientConfig-R4IOW7I2.mjs +10 -0
  9. package/dist/expo/index.cjs +7858 -0
  10. package/dist/expo/index.d.mts +2590 -0
  11. package/dist/expo/index.d.ts +2590 -0
  12. package/dist/expo/index.mjs +7770 -0
  13. package/dist/index.cjs +1200 -0
  14. package/dist/index.d.mts +2796 -0
  15. package/dist/index.d.ts +2796 -0
  16. package/dist/index.mjs +1138 -0
  17. package/dist/next/index.cjs +64 -0
  18. package/dist/next/index.d.mts +23 -0
  19. package/dist/next/index.d.ts +23 -0
  20. package/dist/next/index.mjs +39 -0
  21. package/dist/polyfills/index.cjs +61 -0
  22. package/dist/polyfills/index.d.mts +9 -0
  23. package/dist/polyfills/index.d.ts +9 -0
  24. package/dist/polyfills/index.mjs +34 -0
  25. package/dist/react/chunk-LJYAMK62.mjs +25 -0
  26. package/dist/react/chunk-MJJIYFAX.mjs +25 -0
  27. package/dist/react/chunk-PJCZO4BQ.mjs +25 -0
  28. package/dist/react/clientConfig-2MI4KULF.mjs +10 -0
  29. package/dist/react/clientConfig-QDAXFL3W.mjs +10 -0
  30. package/dist/react/clientConfig-R4IOW7I2.mjs +10 -0
  31. package/dist/react/index.cjs +15178 -0
  32. package/dist/react/index.d.mts +6014 -0
  33. package/dist/react/index.d.ts +6014 -0
  34. package/dist/react/index.mjs +14945 -0
  35. package/dist/tools/chunk-KDFGY4SK.mjs +13 -0
  36. package/dist/tools/clientConfig-RMDOT5YM.mjs +10 -0
  37. package/dist/tools/index.cjs +775 -0
  38. package/dist/tools/index.d.mts +121 -0
  39. package/dist/tools/index.d.ts +121 -0
  40. package/dist/tools/index.mjs +741 -0
  41. package/dist/vercel/index.cjs +86 -0
  42. package/dist/vercel/index.d.mts +149 -0
  43. package/dist/vercel/index.d.ts +149 -0
  44. package/dist/vercel/index.mjs +57 -0
  45. package/package.json +149 -0
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/vercel/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ createAssistantStream: () => createAssistantStream,
24
+ createErrorStream: () => createErrorStream,
25
+ mapMessagesToCompletionPayload: () => mapMessagesToCompletionPayload
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/vercel/messages.ts
30
+ function mapMessagesToCompletionPayload(messages) {
31
+ return messages.map((message) => {
32
+ if (message.role !== "user" && message.role !== "assistant" && message.role !== "system") {
33
+ return null;
34
+ }
35
+ const textParts = message.parts.map((part) => part.type === "text" ? part.text : void 0).filter((part) => Boolean(part && part.trim()));
36
+ const content = textParts.join("\n\n").trim();
37
+ if (!content.length) return null;
38
+ const llmMessage = {
39
+ role: message.role,
40
+ content: [{ type: "text", text: content }]
41
+ };
42
+ return llmMessage;
43
+ }).filter((m) => m !== null);
44
+ }
45
+
46
+ // src/vercel/streams.ts
47
+ function createAssistantStream(text) {
48
+ const messageId = crypto.randomUUID();
49
+ return new ReadableStream({
50
+ start(controller) {
51
+ controller.enqueue({
52
+ type: "text-start",
53
+ id: messageId
54
+ });
55
+ if (text.length > 0) {
56
+ controller.enqueue({
57
+ type: "text-delta",
58
+ id: messageId,
59
+ delta: text
60
+ });
61
+ }
62
+ controller.enqueue({
63
+ type: "text-end",
64
+ id: messageId
65
+ });
66
+ controller.close();
67
+ }
68
+ });
69
+ }
70
+ function createErrorStream(errorText) {
71
+ return new ReadableStream({
72
+ start(controller) {
73
+ controller.enqueue({
74
+ type: "error",
75
+ errorText
76
+ });
77
+ controller.close();
78
+ }
79
+ });
80
+ }
81
+ // Annotate the CommonJS export names for ESM import in node:
82
+ 0 && (module.exports = {
83
+ createAssistantStream,
84
+ createErrorStream,
85
+ mapMessagesToCompletionPayload
86
+ });
@@ -0,0 +1,149 @@
1
+ import { UIMessage } from 'ai';
2
+
3
+ /**
4
+ * Message is the generated message
5
+ */
6
+ type LlmapiMessage = {
7
+ /**
8
+ * Content is the message content
9
+ */
10
+ content?: Array<LlmapiMessageContentPart>;
11
+ role?: LlmapiRole;
12
+ /**
13
+ * ToolCallID is the ID of the tool call this message is responding to (only for tool role)
14
+ */
15
+ tool_call_id?: string;
16
+ /**
17
+ * ToolCalls contains tool/function calls made by the assistant (only for assistant role)
18
+ */
19
+ tool_calls?: Array<LlmapiToolCall>;
20
+ /**
21
+ * Type is the message type (for Responses API: "message")
22
+ */
23
+ type?: string;
24
+ };
25
+ /**
26
+ * File is used when Type=input_file (for Responses API)
27
+ */
28
+ type LlmapiMessageContentFile = {
29
+ /**
30
+ * FileData is the base64-encoded file content
31
+ */
32
+ file_data?: string;
33
+ /**
34
+ * FileID is the ID of an uploaded file
35
+ */
36
+ file_id?: string;
37
+ /**
38
+ * FileURL is the URL to the file
39
+ */
40
+ file_url?: string;
41
+ /**
42
+ * Filename is the name of the file
43
+ */
44
+ filename?: string;
45
+ };
46
+ /**
47
+ * ImageURL is used when Type=image_url or Type=input_image
48
+ */
49
+ type LlmapiMessageContentImage = {
50
+ /**
51
+ * Detail is the OpenAI detail hint (auto|low|high)
52
+ */
53
+ detail?: string;
54
+ /**
55
+ * URL is the image URL or data URI
56
+ */
57
+ url?: string;
58
+ };
59
+ type LlmapiMessageContentPart = {
60
+ file?: LlmapiMessageContentFile;
61
+ image_url?: LlmapiMessageContentImage;
62
+ /**
63
+ * Text holds the text content when Type=text or Type=input_text
64
+ */
65
+ text?: string;
66
+ /**
67
+ * Type is the block type (`text`, `image_url`, or `input_file`)
68
+ */
69
+ type?: string;
70
+ };
71
+ /**
72
+ * Role is the message role (system, user, assistant, tool)
73
+ */
74
+ type LlmapiRole = string;
75
+ type LlmapiToolCall = {
76
+ function?: LlmapiToolCallFunction;
77
+ /**
78
+ * ID is the unique identifier for this tool call
79
+ */
80
+ id?: string;
81
+ /**
82
+ * Type is the type of tool call (always "function" for now)
83
+ */
84
+ type?: string;
85
+ };
86
+ /**
87
+ * Function contains the function call details
88
+ */
89
+ type LlmapiToolCallFunction = {
90
+ /**
91
+ * Arguments is the JSON string of arguments to pass to the function
92
+ */
93
+ arguments?: string;
94
+ /**
95
+ * Name is the name of the function to call
96
+ */
97
+ name?: string;
98
+ };
99
+
100
+ /**
101
+ * Converts an array of Vercel AI {@link UIMessage} objects into the
102
+ * `LlmapiMessage` format that the Portal API expects.
103
+ *
104
+ * - Non text-only parts and unsupported roles are ignored.
105
+ * - Text parts are merged with double newlines, matching the structure that
106
+ * `postApiV1ChatCompletions` accepts.
107
+ *
108
+ * @param messages The UI layer conversation history received from `createUIMessageStreamResponse`.
109
+ * @returns A clean array of Portal-ready messages, filtered to user, assistant, and system roles.
110
+ */
111
+ declare function mapMessagesToCompletionPayload(messages: UIMessage[]): LlmapiMessage[];
112
+
113
+ type AssistantStreamEvent = {
114
+ type: "text-start";
115
+ id: string;
116
+ } | {
117
+ type: "text-delta";
118
+ id: string;
119
+ delta: string;
120
+ } | {
121
+ type: "text-end";
122
+ id: string;
123
+ } | {
124
+ type: "error";
125
+ errorText: string;
126
+ };
127
+ /**
128
+ * Creates a `ReadableStream` that emits the sequence of events expected by
129
+ * Vercel's `createUIMessageStreamResponse` helper for a successful assistant reply.
130
+ *
131
+ * The stream emits `text-start`, an optional `text-delta` containing the
132
+ * provided `text`, and finally `text-end`, allowing Portal completions to be
133
+ * piped directly into UI components that consume the AI SDK stream contract.
134
+ *
135
+ * @param text The assistant response text returned by the Portal API.
136
+ * @returns A stream ready to be passed to `createUIMessageStreamResponse`.
137
+ */
138
+ declare function createAssistantStream(text: string): ReadableStream<AssistantStreamEvent>;
139
+ /**
140
+ * Creates a `ReadableStream` that emits a single `error` event compatible
141
+ * with the Vercel AI stream contract. This allows Portal API errors to be
142
+ * surfaced directly in UI components that expect streamed assistant output.
143
+ *
144
+ * @param errorText A human-readable error message to display in the UI.
145
+ * @returns A stream that, when consumed, immediately emits the error event.
146
+ */
147
+ declare function createErrorStream(errorText: string): ReadableStream<AssistantStreamEvent>;
148
+
149
+ export { createAssistantStream, createErrorStream, mapMessagesToCompletionPayload };
@@ -0,0 +1,149 @@
1
+ import { UIMessage } from 'ai';
2
+
3
+ /**
4
+ * Message is the generated message
5
+ */
6
+ type LlmapiMessage = {
7
+ /**
8
+ * Content is the message content
9
+ */
10
+ content?: Array<LlmapiMessageContentPart>;
11
+ role?: LlmapiRole;
12
+ /**
13
+ * ToolCallID is the ID of the tool call this message is responding to (only for tool role)
14
+ */
15
+ tool_call_id?: string;
16
+ /**
17
+ * ToolCalls contains tool/function calls made by the assistant (only for assistant role)
18
+ */
19
+ tool_calls?: Array<LlmapiToolCall>;
20
+ /**
21
+ * Type is the message type (for Responses API: "message")
22
+ */
23
+ type?: string;
24
+ };
25
+ /**
26
+ * File is used when Type=input_file (for Responses API)
27
+ */
28
+ type LlmapiMessageContentFile = {
29
+ /**
30
+ * FileData is the base64-encoded file content
31
+ */
32
+ file_data?: string;
33
+ /**
34
+ * FileID is the ID of an uploaded file
35
+ */
36
+ file_id?: string;
37
+ /**
38
+ * FileURL is the URL to the file
39
+ */
40
+ file_url?: string;
41
+ /**
42
+ * Filename is the name of the file
43
+ */
44
+ filename?: string;
45
+ };
46
+ /**
47
+ * ImageURL is used when Type=image_url or Type=input_image
48
+ */
49
+ type LlmapiMessageContentImage = {
50
+ /**
51
+ * Detail is the OpenAI detail hint (auto|low|high)
52
+ */
53
+ detail?: string;
54
+ /**
55
+ * URL is the image URL or data URI
56
+ */
57
+ url?: string;
58
+ };
59
+ type LlmapiMessageContentPart = {
60
+ file?: LlmapiMessageContentFile;
61
+ image_url?: LlmapiMessageContentImage;
62
+ /**
63
+ * Text holds the text content when Type=text or Type=input_text
64
+ */
65
+ text?: string;
66
+ /**
67
+ * Type is the block type (`text`, `image_url`, or `input_file`)
68
+ */
69
+ type?: string;
70
+ };
71
+ /**
72
+ * Role is the message role (system, user, assistant, tool)
73
+ */
74
+ type LlmapiRole = string;
75
+ type LlmapiToolCall = {
76
+ function?: LlmapiToolCallFunction;
77
+ /**
78
+ * ID is the unique identifier for this tool call
79
+ */
80
+ id?: string;
81
+ /**
82
+ * Type is the type of tool call (always "function" for now)
83
+ */
84
+ type?: string;
85
+ };
86
+ /**
87
+ * Function contains the function call details
88
+ */
89
+ type LlmapiToolCallFunction = {
90
+ /**
91
+ * Arguments is the JSON string of arguments to pass to the function
92
+ */
93
+ arguments?: string;
94
+ /**
95
+ * Name is the name of the function to call
96
+ */
97
+ name?: string;
98
+ };
99
+
100
+ /**
101
+ * Converts an array of Vercel AI {@link UIMessage} objects into the
102
+ * `LlmapiMessage` format that the Portal API expects.
103
+ *
104
+ * - Non text-only parts and unsupported roles are ignored.
105
+ * - Text parts are merged with double newlines, matching the structure that
106
+ * `postApiV1ChatCompletions` accepts.
107
+ *
108
+ * @param messages The UI layer conversation history received from `createUIMessageStreamResponse`.
109
+ * @returns A clean array of Portal-ready messages, filtered to user, assistant, and system roles.
110
+ */
111
+ declare function mapMessagesToCompletionPayload(messages: UIMessage[]): LlmapiMessage[];
112
+
113
+ type AssistantStreamEvent = {
114
+ type: "text-start";
115
+ id: string;
116
+ } | {
117
+ type: "text-delta";
118
+ id: string;
119
+ delta: string;
120
+ } | {
121
+ type: "text-end";
122
+ id: string;
123
+ } | {
124
+ type: "error";
125
+ errorText: string;
126
+ };
127
+ /**
128
+ * Creates a `ReadableStream` that emits the sequence of events expected by
129
+ * Vercel's `createUIMessageStreamResponse` helper for a successful assistant reply.
130
+ *
131
+ * The stream emits `text-start`, an optional `text-delta` containing the
132
+ * provided `text`, and finally `text-end`, allowing Portal completions to be
133
+ * piped directly into UI components that consume the AI SDK stream contract.
134
+ *
135
+ * @param text The assistant response text returned by the Portal API.
136
+ * @returns A stream ready to be passed to `createUIMessageStreamResponse`.
137
+ */
138
+ declare function createAssistantStream(text: string): ReadableStream<AssistantStreamEvent>;
139
+ /**
140
+ * Creates a `ReadableStream` that emits a single `error` event compatible
141
+ * with the Vercel AI stream contract. This allows Portal API errors to be
142
+ * surfaced directly in UI components that expect streamed assistant output.
143
+ *
144
+ * @param errorText A human-readable error message to display in the UI.
145
+ * @returns A stream that, when consumed, immediately emits the error event.
146
+ */
147
+ declare function createErrorStream(errorText: string): ReadableStream<AssistantStreamEvent>;
148
+
149
+ export { createAssistantStream, createErrorStream, mapMessagesToCompletionPayload };
@@ -0,0 +1,57 @@
1
+ // src/vercel/messages.ts
2
+ function mapMessagesToCompletionPayload(messages) {
3
+ return messages.map((message) => {
4
+ if (message.role !== "user" && message.role !== "assistant" && message.role !== "system") {
5
+ return null;
6
+ }
7
+ const textParts = message.parts.map((part) => part.type === "text" ? part.text : void 0).filter((part) => Boolean(part && part.trim()));
8
+ const content = textParts.join("\n\n").trim();
9
+ if (!content.length) return null;
10
+ const llmMessage = {
11
+ role: message.role,
12
+ content: [{ type: "text", text: content }]
13
+ };
14
+ return llmMessage;
15
+ }).filter((m) => m !== null);
16
+ }
17
+
18
+ // src/vercel/streams.ts
19
+ function createAssistantStream(text) {
20
+ const messageId = crypto.randomUUID();
21
+ return new ReadableStream({
22
+ start(controller) {
23
+ controller.enqueue({
24
+ type: "text-start",
25
+ id: messageId
26
+ });
27
+ if (text.length > 0) {
28
+ controller.enqueue({
29
+ type: "text-delta",
30
+ id: messageId,
31
+ delta: text
32
+ });
33
+ }
34
+ controller.enqueue({
35
+ type: "text-end",
36
+ id: messageId
37
+ });
38
+ controller.close();
39
+ }
40
+ });
41
+ }
42
+ function createErrorStream(errorText) {
43
+ return new ReadableStream({
44
+ start(controller) {
45
+ controller.enqueue({
46
+ type: "error",
47
+ errorText
48
+ });
49
+ controller.close();
50
+ }
51
+ });
52
+ }
53
+ export {
54
+ createAssistantStream,
55
+ createErrorStream,
56
+ mapMessagesToCompletionPayload
57
+ };
package/package.json ADDED
@@ -0,0 +1,149 @@
1
+ {
2
+ "name": "@anuma/sdk",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "react-server": "./dist/index.mjs",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs",
14
+ "default": "./dist/index.cjs"
15
+ },
16
+ "./react": {
17
+ "types": "./dist/react/index.d.ts",
18
+ "react-native": "./dist/react/index.mjs",
19
+ "import": "./dist/react/index.mjs",
20
+ "require": "./dist/react/index.cjs",
21
+ "default": "./dist/react/index.cjs"
22
+ },
23
+ "./expo": {
24
+ "types": "./dist/expo/index.d.ts",
25
+ "react-native": "./dist/expo/index.mjs",
26
+ "import": "./dist/expo/index.mjs",
27
+ "require": "./dist/expo/index.cjs",
28
+ "default": "./dist/expo/index.cjs"
29
+ },
30
+ "./polyfills": {
31
+ "types": "./dist/polyfills/index.d.ts",
32
+ "react-native": "./dist/polyfills/index.mjs",
33
+ "import": "./dist/polyfills/index.mjs",
34
+ "require": "./dist/polyfills/index.cjs",
35
+ "default": "./dist/polyfills/index.cjs"
36
+ },
37
+ "./vercel": {
38
+ "types": "./dist/vercel/index.d.ts",
39
+ "react-server": "./dist/vercel/index.mjs",
40
+ "import": "./dist/vercel/index.mjs",
41
+ "require": "./dist/vercel/index.cjs",
42
+ "default": "./dist/vercel/index.cjs"
43
+ },
44
+ "./next": {
45
+ "types": "./dist/next/index.d.ts",
46
+ "import": "./dist/next/index.mjs",
47
+ "require": "./dist/next/index.cjs",
48
+ "default": "./dist/next/index.cjs"
49
+ },
50
+ "./tools": {
51
+ "types": "./dist/tools/index.d.ts",
52
+ "import": "./dist/tools/index.mjs",
53
+ "require": "./dist/tools/index.cjs",
54
+ "default": "./dist/tools/index.cjs"
55
+ }
56
+ },
57
+ "files": [
58
+ "dist"
59
+ ],
60
+ "scripts": {
61
+ "spec": "openapi-ts",
62
+ "test": "vitest run",
63
+ "build": "tsup",
64
+ "prepublishOnly": "pnpm build",
65
+ "docs": "typedoc",
66
+ "generate": "pnpm run spec && pnpm run docs",
67
+ "eval:memory": "tsx test/memory",
68
+ "eval:longmemeval": "tsx test/memory/longmemeval.ts",
69
+ "eval:longmemeval:preload": "tsx test/memory/longmemeval.ts --preload"
70
+ },
71
+ "repository": {
72
+ "type": "git",
73
+ "url": "git+https://github.com/zeta-chain/ai-sdk.git"
74
+ },
75
+ "keywords": [],
76
+ "author": "",
77
+ "license": "ISC",
78
+ "bugs": {
79
+ "url": "https://github.com/zeta-chain/ai-sdk/issues"
80
+ },
81
+ "homepage": "https://github.com/zeta-chain/ai-sdk#readme",
82
+ "dependencies": {
83
+ "@anuma/portal": "1.0.0",
84
+ "ai": "5.0.93",
85
+ "jszip": "^3.10.1",
86
+ "mammoth": "^1.11.0",
87
+ "pdfjs-dist": "^4.10.38",
88
+ "tesseract.js": "^6.0.1",
89
+ "uuid": "^13.0.0",
90
+ "xlsx": "^0.18.5"
91
+ },
92
+ "devDependencies": {
93
+ "@hey-api/openapi-ts": "0.87.2",
94
+ "@nozbe/watermelondb": "^0.28.0",
95
+ "@privy-io/react-auth": "^3.7.0",
96
+ "@testing-library/react": "^16.3.0",
97
+ "@types/node": "^25.0.3",
98
+ "@types/react": "^19.2.6",
99
+ "dotenv": "^17.2.3",
100
+ "happy-dom": "^20.0.11",
101
+ "playwright": "^1.57.0",
102
+ "react": "^19.2.1",
103
+ "react-dom": "^19.2.1",
104
+ "tsup": "^8.5.1",
105
+ "tsx": "^4.21.0",
106
+ "typedoc": "^0.28.14",
107
+ "typedoc-plugin-frontmatter": "^1.3.1",
108
+ "typedoc-plugin-markdown": "^4.9.0",
109
+ "typedoc-plugin-remark": "^2.0.1",
110
+ "typescript": "^5.9.3",
111
+ "unist-util-visit": "^5.0.0",
112
+ "vitest": "^4.0.14"
113
+ },
114
+ "peerDependencies": {
115
+ "@huggingface/transformers": "^3.0.0",
116
+ "@nozbe/watermelondb": "^0.28.0",
117
+ "@privy-io/react-auth": "^3.7.0",
118
+ "react": "^18.0.0 || ^19.0.0",
119
+ "react-dom": "^18.0.0 || ^19.0.0",
120
+ "react-native": ">=0.70.0"
121
+ },
122
+ "peerDependenciesMeta": {
123
+ "@huggingface/transformers": {
124
+ "optional": true
125
+ },
126
+ "@nozbe/watermelondb": {
127
+ "optional": true
128
+ },
129
+ "react-dom": {
130
+ "optional": true
131
+ },
132
+ "react-native": {
133
+ "optional": true
134
+ },
135
+ "@privy-io/react-auth": {
136
+ "optional": true
137
+ }
138
+ },
139
+ "pnpm": {
140
+ "overrides": {
141
+ "react": ">=19.0.1 <19.1.0 || >=19.1.2 <19.2.0 || >=19.2.1",
142
+ "react-dom": ">=19.0.1 <19.1.0 || >=19.1.2 <19.2.0 || >=19.2.1"
143
+ },
144
+ "patchedDependencies": {
145
+ "tesseract.js@6.0.1": "patches/tesseract.js@6.0.1.patch",
146
+ "pdfjs-dist@4.10.38": "patches/pdfjs-dist@4.10.38.patch"
147
+ }
148
+ }
149
+ }