@intelligentelectron/pdf-analyzer 0.1.6 → 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.
- package/README.md +4 -9
- package/dist/cli/commands.d.ts +9 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +96 -25
- package/dist/cli/commands.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/keychain.d.ts +34 -0
- package/dist/keychain.d.ts.map +1 -0
- package/dist/keychain.js +208 -0
- package/dist/keychain.js.map +1 -0
- package/dist/pdf-utils.d.ts +28 -0
- package/dist/pdf-utils.d.ts.map +1 -0
- package/dist/pdf-utils.js +93 -0
- package/dist/pdf-utils.js.map +1 -0
- package/dist/providers/anthropic.d.ts +9 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +69 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/google.d.ts +13 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +120 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/openai.d.ts +9 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +70 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +23 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +44 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +70 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +27 -35
- package/dist/server.js.map +1 -1
- package/dist/service.d.ts +7 -35
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +99 -302
- package/dist/service.js.map +1 -1
- package/dist/types.d.ts +20 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +15 -45
- package/dist/types.js.map +1 -1
- package/package.json +12 -4
package/README.md
CHANGED
|
@@ -75,7 +75,7 @@ After installing the MCP with one of the methods above, you can connect it to yo
|
|
|
75
75
|
Install [Claude Code](https://docs.anthropic.com/en/docs/claude-code), then run:
|
|
76
76
|
|
|
77
77
|
```bash
|
|
78
|
-
claude mcp add --scope user pdf-analyzer --
|
|
78
|
+
claude mcp add --scope user pdf-analyzer -- pdf-analyzer
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
### OpenAI Codex
|
|
@@ -83,7 +83,7 @@ claude mcp add --scope user pdf-analyzer --env GEMINI_API_KEY=your-key -- pdf-an
|
|
|
83
83
|
Install [OpenAI Codex](https://developers.openai.com/codex/cli/), then run:
|
|
84
84
|
|
|
85
85
|
```bash
|
|
86
|
-
codex mcp add pdf-analyzer --
|
|
86
|
+
codex mcp add pdf-analyzer -- pdf-analyzer
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
### Gemini CLI
|
|
@@ -91,7 +91,7 @@ codex mcp add pdf-analyzer --env GEMINI_API_KEY=your-key -- pdf-analyzer
|
|
|
91
91
|
Install [Gemini CLI](https://geminicli.com/docs/get-started/installation/), then run:
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
|
-
gemini mcp add --scope user
|
|
94
|
+
gemini mcp add --scope user pdf-analyzer pdf-analyzer
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
### VS Code (GitHub Copilot)
|
|
@@ -105,10 +105,7 @@ Add to `.vscode/mcp.json` in your project:
|
|
|
105
105
|
"servers": {
|
|
106
106
|
"pdf-analyzer": {
|
|
107
107
|
"type": "stdio",
|
|
108
|
-
"command": "pdf-analyzer"
|
|
109
|
-
"env": {
|
|
110
|
-
"GEMINI_API_KEY": "your-key"
|
|
111
|
-
}
|
|
108
|
+
"command": "pdf-analyzer"
|
|
112
109
|
}
|
|
113
110
|
}
|
|
114
111
|
}
|
|
@@ -116,8 +113,6 @@ Add to `.vscode/mcp.json` in your project:
|
|
|
116
113
|
|
|
117
114
|
Then enable it in **Configure Tools** (click the tools icon in Copilot chat).
|
|
118
115
|
|
|
119
|
-
> **Warning:** Do not commit `.vscode/mcp.json` to version control — it contains your API key. Add it to your `.gitignore`.
|
|
120
|
-
|
|
121
116
|
## Usage
|
|
122
117
|
|
|
123
118
|
Once connected, ask your AI assistant to analyze any PDF:
|
package/dist/cli/commands.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI command handlers for --version, --help, --update, and --uninstall.
|
|
2
|
+
* CLI command handlers for --version, --help, --setup, --update, and --uninstall.
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* Print version information.
|
|
@@ -9,6 +9,14 @@ export declare const printVersion: () => void;
|
|
|
9
9
|
* Print help message.
|
|
10
10
|
*/
|
|
11
11
|
export declare const printHelp: () => void;
|
|
12
|
+
/**
|
|
13
|
+
* Handle the --setup flag: choose provider and store API key.
|
|
14
|
+
*/
|
|
15
|
+
export declare const handleSetupCommand: () => Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Handle the deprecated --set-key flag.
|
|
18
|
+
*/
|
|
19
|
+
export declare const handleSetKeyCommand: () => Promise<void>;
|
|
12
20
|
/**
|
|
13
21
|
* Handle the --update flag: check and apply updates interactively.
|
|
14
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;GAEG;AACH,eAAO,MAAM,YAAY,QAAO,IAE/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,QAAO,IA0C5B,CAAC;AAYF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,IAAI,CAmEvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAAC,IAAI,CAGxD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAAC,IAAI,CAmCxD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,IAAI,CAoD3D,CAAC"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI command handlers for --version, --help, --update, and --uninstall.
|
|
2
|
+
* CLI command handlers for --version, --help, --setup, --update, and --uninstall.
|
|
3
3
|
*/
|
|
4
4
|
import * as fs from "node:fs";
|
|
5
5
|
import * as path from "node:path";
|
|
6
6
|
import * as os from "node:os";
|
|
7
|
+
import * as clack from "@clack/prompts";
|
|
7
8
|
import { VERSION, GITHUB_REPO, BINARY_NAME } from "../version.js";
|
|
8
9
|
import { checkForUpdate, performUpdate } from "./updater.js";
|
|
9
10
|
import { removeFromPath } from "./shell.js";
|
|
11
|
+
import { getApiKey, setApiKey, getActiveProvider, setActiveProvider, getModel, setModel, deleteAllCredentials, } from "../keychain.js";
|
|
12
|
+
import { providerList } from "../providers/registry.js";
|
|
10
13
|
/**
|
|
11
14
|
* Print version information.
|
|
12
15
|
*/
|
|
@@ -20,19 +23,26 @@ export const printHelp = () => {
|
|
|
20
23
|
console.log(`
|
|
21
24
|
${BINARY_NAME} v${VERSION}
|
|
22
25
|
|
|
23
|
-
MCP server for analyzing PDF documents using
|
|
26
|
+
MCP server for analyzing PDF documents using AI.
|
|
27
|
+
Supports Google Gemini, Anthropic Claude, and OpenAI.
|
|
24
28
|
|
|
25
29
|
USAGE:
|
|
26
30
|
${BINARY_NAME} [OPTIONS]
|
|
27
31
|
|
|
28
32
|
OPTIONS:
|
|
29
33
|
--version, -v Print version and exit
|
|
34
|
+
--setup Choose an LLM provider and store your API key
|
|
35
|
+
--set-key Alias for --setup (deprecated)
|
|
30
36
|
--update Check for updates and apply if available
|
|
31
37
|
--uninstall Remove ${BINARY_NAME} from the system
|
|
32
38
|
--help, -h Show this help message
|
|
33
39
|
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
PROVIDER SETUP:
|
|
41
|
+
${BINARY_NAME} --setup
|
|
42
|
+
|
|
43
|
+
Lets you choose a provider (Google Gemini, Anthropic Claude, or OpenAI)
|
|
44
|
+
and stores your API key in the OS credential store (macOS Keychain,
|
|
45
|
+
Windows Credential Manager, or Linux secret-tool).
|
|
36
46
|
|
|
37
47
|
INSTALLATION:
|
|
38
48
|
curl -fsSL https://raw.githubusercontent.com/${GITHUB_REPO}/main/install.sh | bash
|
|
@@ -41,10 +51,7 @@ MCP CONFIGURATION:
|
|
|
41
51
|
{
|
|
42
52
|
"mcpServers": {
|
|
43
53
|
"pdf-analyzer": {
|
|
44
|
-
"command": "${BINARY_NAME}"
|
|
45
|
-
"env": {
|
|
46
|
-
"GEMINI_API_KEY": "your-api-key-here"
|
|
47
|
-
}
|
|
54
|
+
"command": "${BINARY_NAME}"
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
}
|
|
@@ -54,21 +61,80 @@ MORE INFO:
|
|
|
54
61
|
`.trim());
|
|
55
62
|
};
|
|
56
63
|
/**
|
|
57
|
-
*
|
|
64
|
+
* Check if a clack prompt was cancelled (Ctrl+C).
|
|
65
|
+
*/
|
|
66
|
+
function assertNotCancelled(value) {
|
|
67
|
+
if (clack.isCancel(value)) {
|
|
68
|
+
clack.cancel("Setup cancelled.");
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Handle the --setup flag: choose provider and store API key.
|
|
58
74
|
*/
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
export const handleSetupCommand = async () => {
|
|
76
|
+
clack.intro("pdf-analyzer setup");
|
|
77
|
+
const existingProvider = getActiveProvider();
|
|
78
|
+
const existingKey = getApiKey();
|
|
79
|
+
const existingModel = getModel();
|
|
80
|
+
if (existingProvider && existingKey) {
|
|
81
|
+
const providerConfig = providerList.find((p) => p.id === existingProvider);
|
|
82
|
+
const providerName = providerConfig?.displayName ?? existingProvider;
|
|
83
|
+
const modelName = providerConfig?.models.find((m) => m.id === existingModel)?.displayName ?? existingModel;
|
|
84
|
+
const shouldReconfigure = await clack.confirm({
|
|
85
|
+
message: `Already configured with ${providerName} (${modelName}). Reconfigure?`,
|
|
86
|
+
});
|
|
87
|
+
assertNotCancelled(shouldReconfigure);
|
|
88
|
+
if (!shouldReconfigure) {
|
|
89
|
+
clack.outro("No changes made.");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const providerId = await clack.select({
|
|
94
|
+
message: "Choose your LLM provider",
|
|
95
|
+
options: providerList.map((p) => ({
|
|
96
|
+
value: p.id,
|
|
97
|
+
label: p.displayName,
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
assertNotCancelled(providerId);
|
|
101
|
+
const selected = providerList.find((p) => p.id === providerId);
|
|
102
|
+
const modelId = await clack.select({
|
|
103
|
+
message: "Choose a model",
|
|
104
|
+
options: selected.models.map((m) => ({
|
|
105
|
+
value: m.id,
|
|
106
|
+
label: `${m.displayName} - ${m.hint}`,
|
|
107
|
+
})),
|
|
71
108
|
});
|
|
109
|
+
assertNotCancelled(modelId);
|
|
110
|
+
const selectedModel = selected.models.find((m) => m.id === modelId);
|
|
111
|
+
clack.note(`Model: ${selectedModel.displayName} (${modelId})\nGet your API key from: ${selected.apiKeyUrl}`, selected.displayName);
|
|
112
|
+
const key = await clack.password({
|
|
113
|
+
message: "Enter your API key",
|
|
114
|
+
validate: (value) => {
|
|
115
|
+
if (!value)
|
|
116
|
+
return "API key is required";
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
assertNotCancelled(key);
|
|
120
|
+
try {
|
|
121
|
+
setActiveProvider(selected.id);
|
|
122
|
+
setModel(modelId);
|
|
123
|
+
setApiKey(key);
|
|
124
|
+
clack.outro(`${selected.displayName} (${selectedModel.displayName}) configured successfully.`);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
128
|
+
clack.cancel(`Failed to store credentials: ${message}`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Handle the deprecated --set-key flag.
|
|
134
|
+
*/
|
|
135
|
+
export const handleSetKeyCommand = async () => {
|
|
136
|
+
clack.log.warn("--set-key is deprecated. Use --setup instead.");
|
|
137
|
+
await handleSetupCommand();
|
|
72
138
|
};
|
|
73
139
|
/**
|
|
74
140
|
* Handle the --update flag: check and apply updates interactively.
|
|
@@ -89,15 +155,13 @@ export const handleUpdateCommand = async () => {
|
|
|
89
155
|
console.error("Update available but no download URL found for your platform");
|
|
90
156
|
process.exit(1);
|
|
91
157
|
}
|
|
92
|
-
console.log(`Update available: ${VERSION}
|
|
158
|
+
console.log(`Update available: ${VERSION} -> ${check.latestVersion}`);
|
|
93
159
|
console.log("Downloading...");
|
|
94
160
|
const result = await performUpdate(check.downloadUrl, check.latestVersion);
|
|
95
161
|
if (!result.success) {
|
|
96
162
|
console.error(`Update failed: ${result.error}`);
|
|
97
163
|
process.exit(1);
|
|
98
164
|
}
|
|
99
|
-
// On Windows, we need to ensure stdout is flushed before exiting
|
|
100
|
-
// because replacing the running executable can cause issues
|
|
101
165
|
const message = `Successfully updated to ${result.newVersion}\n`;
|
|
102
166
|
await new Promise((resolve) => {
|
|
103
167
|
process.stdout.write(message, () => resolve());
|
|
@@ -115,13 +179,20 @@ export const handleUninstallCommand = async () => {
|
|
|
115
179
|
console.log(` - Binary: ${binaryPath}`);
|
|
116
180
|
console.log(` - Directory: ${installDir}`);
|
|
117
181
|
console.log(" - PATH entries from shell config files");
|
|
182
|
+
console.log(" - Stored credentials from OS credential store");
|
|
118
183
|
console.log("");
|
|
119
|
-
const confirmed = await confirm(
|
|
184
|
+
const confirmed = await clack.confirm({
|
|
185
|
+
message: "Are you sure you want to uninstall?",
|
|
186
|
+
});
|
|
187
|
+
assertNotCancelled(confirmed);
|
|
120
188
|
if (!confirmed) {
|
|
121
189
|
console.log("Uninstall cancelled.");
|
|
122
190
|
return;
|
|
123
191
|
}
|
|
124
192
|
console.log("");
|
|
193
|
+
// Remove all stored credentials
|
|
194
|
+
deleteAllCredentials();
|
|
195
|
+
console.log("Removed stored credentials");
|
|
125
196
|
// Remove PATH entries from shell rc files
|
|
126
197
|
const modifiedFiles = removeFromPath();
|
|
127
198
|
if (modifiedFiles.length > 0) {
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,12 +7,11 @@
|
|
|
7
7
|
*
|
|
8
8
|
* CLI flags:
|
|
9
9
|
* --version, -v Print version and exit
|
|
10
|
+
* --setup Choose LLM provider and store API key
|
|
11
|
+
* --set-key Deprecated alias for --setup
|
|
10
12
|
* --update Check for updates and apply if available
|
|
11
13
|
* --uninstall Remove pdf-analyzer from the system
|
|
12
14
|
* --help, -h Show help
|
|
13
|
-
*
|
|
14
|
-
* Environment variables:
|
|
15
|
-
* GEMINI_API_KEY Required. Your Gemini API key.
|
|
16
15
|
*/
|
|
17
16
|
export {};
|
|
18
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
|
package/dist/index.js
CHANGED
|
@@ -7,15 +7,14 @@
|
|
|
7
7
|
*
|
|
8
8
|
* CLI flags:
|
|
9
9
|
* --version, -v Print version and exit
|
|
10
|
+
* --setup Choose LLM provider and store API key
|
|
11
|
+
* --set-key Deprecated alias for --setup
|
|
10
12
|
* --update Check for updates and apply if available
|
|
11
13
|
* --uninstall Remove pdf-analyzer from the system
|
|
12
14
|
* --help, -h Show help
|
|
13
|
-
*
|
|
14
|
-
* Environment variables:
|
|
15
|
-
* GEMINI_API_KEY Required. Your Gemini API key.
|
|
16
15
|
*/
|
|
17
16
|
import { autoUpdate, reexec } from "./cli/updater.js";
|
|
18
|
-
import { printVersion, printHelp, handleUpdateCommand, handleUninstallCommand, } from "./cli/commands.js";
|
|
17
|
+
import { printVersion, printHelp, handleSetupCommand, handleSetKeyCommand, handleUpdateCommand, handleUninstallCommand, } from "./cli/commands.js";
|
|
19
18
|
import { runServer } from "./server.js";
|
|
20
19
|
/**
|
|
21
20
|
* Main entry point for the PDF Analyzer MCP server.
|
|
@@ -32,6 +31,16 @@ const main = async () => {
|
|
|
32
31
|
printHelp();
|
|
33
32
|
return;
|
|
34
33
|
}
|
|
34
|
+
// Handle --setup
|
|
35
|
+
if (args.includes("--setup")) {
|
|
36
|
+
await handleSetupCommand();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Handle --set-key (deprecated alias)
|
|
40
|
+
if (args.includes("--set-key")) {
|
|
41
|
+
await handleSetKeyCommand();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
35
44
|
// Handle --update
|
|
36
45
|
if (args.includes("--update")) {
|
|
37
46
|
await handleUpdateCommand();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AACH,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,wBAAwB;IACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,YAAY,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,kBAAkB,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,MAAM,mBAAmB,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,kBAAkB;IAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,mBAAmB,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,sBAAsB,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,mFAAmF;IACnF,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;IACX,CAAC;IAED,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-native credential storage.
|
|
3
|
+
*
|
|
4
|
+
* Uses platform CLI tools (no native addons) so it works with Bun-compiled binaries.
|
|
5
|
+
* - macOS: `security` CLI (Keychain Access)
|
|
6
|
+
* - Windows: `cmdkey` + PowerShell (Credential Manager)
|
|
7
|
+
* - Linux: `secret-tool` (libsecret), if available
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Escape a string for safe use as a shell argument.
|
|
11
|
+
* Wraps in single quotes and escapes any embedded single quotes.
|
|
12
|
+
*/
|
|
13
|
+
export declare function escapeShellArg(arg: string): string;
|
|
14
|
+
/** Read a value from the OS credential store. */
|
|
15
|
+
export declare function getStoredValue(account: string, service?: string): string | null;
|
|
16
|
+
/** Write a value to the OS credential store. */
|
|
17
|
+
export declare function setStoredValue(account: string, value: string, service?: string): void;
|
|
18
|
+
/** Remove a value from the OS credential store (best-effort). */
|
|
19
|
+
export declare function deleteStoredValue(account: string, service?: string): void;
|
|
20
|
+
/** Get the active provider ID. Returns null if not set. */
|
|
21
|
+
export declare function getActiveProvider(): string | null;
|
|
22
|
+
/** Store the active provider ID. */
|
|
23
|
+
export declare function setActiveProvider(providerId: string): void;
|
|
24
|
+
/** Get the stored API key. Returns null if not found. */
|
|
25
|
+
export declare function getApiKey(): string | null;
|
|
26
|
+
/** Store the API key. */
|
|
27
|
+
export declare function setApiKey(key: string): void;
|
|
28
|
+
/** Get the stored model ID. Returns null if not set. */
|
|
29
|
+
export declare function getModel(): string | null;
|
|
30
|
+
/** Store the selected model ID. */
|
|
31
|
+
export declare function setModel(modelId: string): void;
|
|
32
|
+
/** Delete all stored credentials (provider + API key + model). Best-effort. */
|
|
33
|
+
export declare function deleteAllCredentials(): void;
|
|
34
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AA2ID,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAwB,GAAG,MAAM,GAAG,IAAI,CAWhG;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAwB,GAChC,IAAI,CAcN;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAwB,GAAG,IAAI,CAe1F;AAUD,2DAA2D;AAC3D,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED,oCAAoC;AACpC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,yDAAyD;AACzD,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzC;AAED,yBAAyB;AACzB,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wDAAwD;AACxD,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAExC;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
|
package/dist/keychain.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-native credential storage.
|
|
3
|
+
*
|
|
4
|
+
* Uses platform CLI tools (no native addons) so it works with Bun-compiled binaries.
|
|
5
|
+
* - macOS: `security` CLI (Keychain Access)
|
|
6
|
+
* - Windows: `cmdkey` + PowerShell (Credential Manager)
|
|
7
|
+
* - Linux: `secret-tool` (libsecret), if available
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from "node:child_process";
|
|
10
|
+
const DEFAULT_SERVICE = "pdf-analyzer";
|
|
11
|
+
/** Stdio config that prevents credential leaks to MCP stdio transport. */
|
|
12
|
+
const SILENT_STDIO = ["pipe", "pipe", "pipe"];
|
|
13
|
+
/**
|
|
14
|
+
* Escape a string for safe use as a shell argument.
|
|
15
|
+
* Wraps in single quotes and escapes any embedded single quotes.
|
|
16
|
+
*/
|
|
17
|
+
export function escapeShellArg(arg) {
|
|
18
|
+
return `'${arg.replace(/'/g, "'\\''")}'`;
|
|
19
|
+
}
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// macOS (Keychain)
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
function getMacOS(service, account) {
|
|
24
|
+
try {
|
|
25
|
+
return execSync(`security find-generic-password -s ${escapeShellArg(service)} -a ${escapeShellArg(account)} -w`, { stdio: SILENT_STDIO, encoding: "utf-8" }).trim();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function setMacOS(service, account, value) {
|
|
32
|
+
execSync(`security add-generic-password -s ${escapeShellArg(service)} -a ${escapeShellArg(account)} -w ${escapeShellArg(value)} -U`, { stdio: SILENT_STDIO });
|
|
33
|
+
}
|
|
34
|
+
function deleteMacOS(service, account) {
|
|
35
|
+
try {
|
|
36
|
+
execSync(`security delete-generic-password -s ${escapeShellArg(service)} -a ${escapeShellArg(account)}`, { stdio: SILENT_STDIO });
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Credential may not exist; ignore
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Windows (Credential Manager)
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/** Build a Windows credential target from service + account. */
|
|
46
|
+
function winTarget(service, account) {
|
|
47
|
+
return `${service}/${account}`;
|
|
48
|
+
}
|
|
49
|
+
function getWindows(service, account) {
|
|
50
|
+
try {
|
|
51
|
+
const target = winTarget(service, account);
|
|
52
|
+
const script = `
|
|
53
|
+
Add-Type -Namespace Win32 -Name Cred -MemberDefinition @'
|
|
54
|
+
[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
|
|
55
|
+
public static extern bool CredRead(string target, int type, int flags, out IntPtr cred);
|
|
56
|
+
[DllImport("advapi32.dll")]
|
|
57
|
+
public static extern void CredFree(IntPtr cred);
|
|
58
|
+
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
|
|
59
|
+
public struct CREDENTIAL {
|
|
60
|
+
public int Flags; public int Type; public string TargetName;
|
|
61
|
+
public string Comment; public long LastWritten; public int CredentialBlobSize;
|
|
62
|
+
public IntPtr CredentialBlob; public int Persist; public int AttributeCount;
|
|
63
|
+
public IntPtr Attributes; public string TargetAlias; public string UserName;
|
|
64
|
+
}
|
|
65
|
+
'@
|
|
66
|
+
$ptr = [IntPtr]::Zero
|
|
67
|
+
if ([Win32.Cred]::CredRead("${target}", 1, 0, [ref]$ptr)) {
|
|
68
|
+
$c = [Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [Type][Win32.Cred+CREDENTIAL])
|
|
69
|
+
$secret = [Runtime.InteropServices.Marshal]::PtrToStringUni($c.CredentialBlob, $c.CredentialBlobSize/2)
|
|
70
|
+
[Win32.Cred]::CredFree($ptr)
|
|
71
|
+
Write-Output $secret
|
|
72
|
+
}`;
|
|
73
|
+
return (execSync(`powershell -NoProfile -Command "${script.replace(/"/g, '\\"')}"`, {
|
|
74
|
+
stdio: SILENT_STDIO,
|
|
75
|
+
encoding: "utf-8",
|
|
76
|
+
}).trim() || null);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function setWindows(service, account, value) {
|
|
83
|
+
const target = winTarget(service, account);
|
|
84
|
+
execSync(`cmdkey /generic:${target} /user:${account} /pass:${escapeShellArg(value)}`, {
|
|
85
|
+
stdio: SILENT_STDIO,
|
|
86
|
+
shell: "cmd.exe",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function deleteWindows(service, account) {
|
|
90
|
+
try {
|
|
91
|
+
const target = winTarget(service, account);
|
|
92
|
+
execSync(`cmdkey /delete:${target}`, {
|
|
93
|
+
stdio: SILENT_STDIO,
|
|
94
|
+
shell: "cmd.exe",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Credential may not exist; ignore
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Linux (libsecret / secret-tool)
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
function getLinux(service, account) {
|
|
105
|
+
try {
|
|
106
|
+
return (execSync(`secret-tool lookup service ${escapeShellArg(service)} username ${escapeShellArg(account)}`, { stdio: SILENT_STDIO, encoding: "utf-8" }).trim() || null);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function setLinux(service, account, value) {
|
|
113
|
+
execSync(`echo -n ${escapeShellArg(value)} | secret-tool store --label=${escapeShellArg(service)} service ${escapeShellArg(service)} username ${escapeShellArg(account)}`, { stdio: SILENT_STDIO });
|
|
114
|
+
}
|
|
115
|
+
function deleteLinux(service, account) {
|
|
116
|
+
try {
|
|
117
|
+
execSync(`secret-tool clear service ${escapeShellArg(service)} username ${escapeShellArg(account)}`, { stdio: SILENT_STDIO });
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Credential may not exist or secret-tool unavailable; ignore
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Generic credential operations
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
/** Read a value from the OS credential store. */
|
|
127
|
+
export function getStoredValue(account, service = DEFAULT_SERVICE) {
|
|
128
|
+
switch (process.platform) {
|
|
129
|
+
case "darwin":
|
|
130
|
+
return getMacOS(service, account);
|
|
131
|
+
case "win32":
|
|
132
|
+
return getWindows(service, account);
|
|
133
|
+
case "linux":
|
|
134
|
+
return getLinux(service, account);
|
|
135
|
+
default:
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Write a value to the OS credential store. */
|
|
140
|
+
export function setStoredValue(account, value, service = DEFAULT_SERVICE) {
|
|
141
|
+
switch (process.platform) {
|
|
142
|
+
case "darwin":
|
|
143
|
+
setMacOS(service, account, value);
|
|
144
|
+
break;
|
|
145
|
+
case "win32":
|
|
146
|
+
setWindows(service, account, value);
|
|
147
|
+
break;
|
|
148
|
+
case "linux":
|
|
149
|
+
setLinux(service, account, value);
|
|
150
|
+
break;
|
|
151
|
+
default:
|
|
152
|
+
throw new Error(`Credential storage is not supported on ${process.platform}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Remove a value from the OS credential store (best-effort). */
|
|
156
|
+
export function deleteStoredValue(account, service = DEFAULT_SERVICE) {
|
|
157
|
+
switch (process.platform) {
|
|
158
|
+
case "darwin":
|
|
159
|
+
deleteMacOS(service, account);
|
|
160
|
+
break;
|
|
161
|
+
case "win32":
|
|
162
|
+
deleteWindows(service, account);
|
|
163
|
+
break;
|
|
164
|
+
case "linux":
|
|
165
|
+
deleteLinux(service, account);
|
|
166
|
+
break;
|
|
167
|
+
default:
|
|
168
|
+
// No-op on unsupported platforms
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// Convenience API for provider and API key storage
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
const PROVIDER_ACCOUNT = "PROVIDER";
|
|
176
|
+
const API_KEY_ACCOUNT = "API_KEY";
|
|
177
|
+
const MODEL_ACCOUNT = "MODEL";
|
|
178
|
+
/** Get the active provider ID. Returns null if not set. */
|
|
179
|
+
export function getActiveProvider() {
|
|
180
|
+
return getStoredValue(PROVIDER_ACCOUNT);
|
|
181
|
+
}
|
|
182
|
+
/** Store the active provider ID. */
|
|
183
|
+
export function setActiveProvider(providerId) {
|
|
184
|
+
setStoredValue(PROVIDER_ACCOUNT, providerId);
|
|
185
|
+
}
|
|
186
|
+
/** Get the stored API key. Returns null if not found. */
|
|
187
|
+
export function getApiKey() {
|
|
188
|
+
return getStoredValue(API_KEY_ACCOUNT);
|
|
189
|
+
}
|
|
190
|
+
/** Store the API key. */
|
|
191
|
+
export function setApiKey(key) {
|
|
192
|
+
setStoredValue(API_KEY_ACCOUNT, key);
|
|
193
|
+
}
|
|
194
|
+
/** Get the stored model ID. Returns null if not set. */
|
|
195
|
+
export function getModel() {
|
|
196
|
+
return getStoredValue(MODEL_ACCOUNT);
|
|
197
|
+
}
|
|
198
|
+
/** Store the selected model ID. */
|
|
199
|
+
export function setModel(modelId) {
|
|
200
|
+
setStoredValue(MODEL_ACCOUNT, modelId);
|
|
201
|
+
}
|
|
202
|
+
/** Delete all stored credentials (provider + API key + model). Best-effort. */
|
|
203
|
+
export function deleteAllCredentials() {
|
|
204
|
+
deleteStoredValue(PROVIDER_ACCOUNT);
|
|
205
|
+
deleteStoredValue(API_KEY_ACCOUNT);
|
|
206
|
+
deleteStoredValue(MODEL_ACCOUNT);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC,0EAA0E;AAC1E,MAAM,YAAY,GAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAExE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,OAAe,EAAE,OAAe;IAChD,IAAI,CAAC;QACH,OAAO,QAAQ,CACb,qCAAqC,cAAc,CAAC,OAAO,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,KAAK,EAC/F,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAC3C,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,OAAe,EAAE,KAAa;IAC/D,QAAQ,CACN,oCAAoC,cAAc,CAAC,OAAO,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,OAAO,cAAc,CAAC,KAAK,CAAC,KAAK,EAC1H,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,QAAQ,CACN,uCAAuC,cAAc,CAAC,OAAO,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,EAAE,EAC9F,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E,gEAAgE;AAChE,SAAS,SAAS,CAAC,OAAe,EAAE,OAAe;IACjD,OAAO,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,OAAe;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;8BAeW,MAAM;;;;;EAKlC,CAAC;QAEC,OAAO,CACL,QAAQ,CAAC,mCAAmC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE;YAC1E,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAClB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,OAAe,EAAE,KAAa;IACjE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,mBAAmB,MAAM,UAAU,OAAO,UAAU,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE;QACpF,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,OAAe;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,QAAQ,CAAC,kBAAkB,MAAM,EAAE,EAAE;YACnC,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,OAAe,EAAE,OAAe;IAChD,IAAI,CAAC;QACH,OAAO,CACL,QAAQ,CACN,8BAA8B,cAAc,CAAC,OAAO,CAAC,aAAa,cAAc,CAAC,OAAO,CAAC,EAAE,EAC3F,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAC3C,CAAC,IAAI,EAAE,IAAI,IAAI,CACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,OAAe,EAAE,KAAa;IAC/D,QAAQ,CACN,WAAW,cAAc,CAAC,KAAK,CAAC,gCAAgC,cAAc,CAAC,OAAO,CAAC,YAAY,cAAc,CAAC,OAAO,CAAC,aAAa,cAAc,CAAC,OAAO,CAAC,EAAE,EAChK,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,QAAQ,CACN,6BAA6B,cAAc,CAAC,OAAO,CAAC,aAAa,cAAc,CAAC,OAAO,CAAC,EAAE,EAC1F,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;IAChE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,iDAAiD;AACjD,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,UAAkB,eAAe;IAC/E,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,KAAK,OAAO;YACV,OAAO,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,KAAa,EACb,UAAkB,eAAe;IAEjC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM;QACR,KAAK,OAAO;YACV,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,OAAO;YACV,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,UAAkB,eAAe;IAClF,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,OAAO;YACV,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,OAAO;YACV,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM;QACR;YACE,iCAAiC;YACjC,MAAM;IACV,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC,gBAAgB,CAAC,CAAC;AAC1C,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,cAAc,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,SAAS;IACvB,OAAO,cAAc,CAAC,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,cAAc,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,QAAQ;IACtB,OAAO,cAAc,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,oBAAoB;IAClC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACpC,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACnC,iBAAiB,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared PDF utility functions.
|
|
3
|
+
*
|
|
4
|
+
* Contains URL validation, path validation, and PDF fetching logic
|
|
5
|
+
* used by both the service layer and provider implementations.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a string is a Gemini File API URI.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isGeminiFileUri(source: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a string is a URL (excluding Gemini File API URIs).
|
|
13
|
+
*/
|
|
14
|
+
export declare function isUrl(source: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Validates a local PDF file path.
|
|
17
|
+
* Throws descriptive errors for common issues.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateLocalPath(pdfPath: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Fetch PDF content from a URL with timeout.
|
|
22
|
+
*/
|
|
23
|
+
export declare function fetchPdfFromUrl(url: string): Promise<Buffer>;
|
|
24
|
+
/**
|
|
25
|
+
* Read PDF bytes from a local file path.
|
|
26
|
+
*/
|
|
27
|
+
export declare function readPdfBytes(pdfPath: string): Buffer;
|
|
28
|
+
//# sourceMappingURL=pdf-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-utils.d.ts","sourceRoot":"","sources":["../src/pdf-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAU7C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAmBvD;AAKD;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGpD"}
|