@canaryai/cli 0.2.2 → 0.2.3
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/dist/{chunk-TO66FC4R.js → chunk-JMI7WWPF.js} +2 -2
- package/dist/chunk-OE6O7H45.js +92 -0
- package/dist/chunk-OE6O7H45.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-ZTWHPIXU.js +42798 -0
- package/dist/chunk-ZTWHPIXU.js.map +1 -0
- package/dist/{debug-workflow-EHKNO7BJ.js → debug-workflow-PMLMWKWI.js} +4 -3
- package/dist/{debug-workflow-EHKNO7BJ.js.map → debug-workflow-PMLMWKWI.js.map} +1 -1
- package/dist/dist-6NXLJYRZ.js +335 -0
- package/dist/dist-6NXLJYRZ.js.map +1 -0
- package/dist/{feature-flag-ZDLDYRSF.js → feature-flag-D3QTHGL6.js} +2 -2
- package/dist/index.js +10 -10
- package/dist/{issues-FI3RIWGV.js → issues-6MHRFKTU.js} +2 -2
- package/dist/{knobs-3MKMOXIV.js → knobs-ED6LXBVM.js} +2 -2
- package/dist/{local-browser-GG5GUXDS.js → local-browser-YSE3XCUW.js} +4 -3
- package/dist/{local-browser-GG5GUXDS.js.map → local-browser-YSE3XCUW.js.map} +1 -1
- package/dist/{mcp-AD67OLQM.js → mcp-LKHFYMA6.js} +4 -3
- package/dist/{mcp-AD67OLQM.js.map → mcp-LKHFYMA6.js.map} +1 -1
- package/dist/pdf-extract-YIDRKYUD.js +12 -0
- package/dist/pdf-extract-YIDRKYUD.js.map +1 -0
- package/dist/pdfjs-44AOKLEM.js +35242 -0
- package/dist/pdfjs-44AOKLEM.js.map +1 -0
- package/dist/{psql-IVAPNYZV.js → psql-U5LF6ELS.js} +2 -2
- package/dist/{redis-LWY7L6AS.js → redis-PBQZGU6T.js} +2 -2
- package/dist/{release-KQFCTAXA.js → release-QBSP474D.js} +2 -2
- package/dist/runner/preload.js +2 -2
- package/dist/test.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-DGUM43GV.js +0 -11
- package/dist/chunk-UEOXNF5X.js +0 -371
- package/dist/chunk-UEOXNF5X.js.map +0 -1
- /package/dist/{chunk-TO66FC4R.js.map → chunk-JMI7WWPF.js.map} +0 -0
- /package/dist/{chunk-DGUM43GV.js.map → chunk-PLDDJCW6.js.map} +0 -0
- /package/dist/{feature-flag-ZDLDYRSF.js.map → feature-flag-D3QTHGL6.js.map} +0 -0
- /package/dist/{issues-FI3RIWGV.js.map → issues-6MHRFKTU.js.map} +0 -0
- /package/dist/{knobs-3MKMOXIV.js.map → knobs-ED6LXBVM.js.map} +0 -0
- /package/dist/{psql-IVAPNYZV.js.map → psql-U5LF6ELS.js.map} +0 -0
- /package/dist/{redis-LWY7L6AS.js.map → redis-PBQZGU6T.js.map} +0 -0
- /package/dist/{release-KQFCTAXA.js.map → release-QBSP474D.js.map} +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
LocalBrowserHost
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZTWHPIXU.js";
|
|
4
4
|
import {
|
|
5
5
|
getArgValue,
|
|
6
6
|
hasFlag,
|
|
7
7
|
resolveConfig
|
|
8
8
|
} from "./chunk-7R4YFGP6.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-OE6O7H45.js";
|
|
10
|
+
import "./chunk-PLDDJCW6.js";
|
|
10
11
|
|
|
11
12
|
// src/debug-workflow.ts
|
|
12
13
|
import process from "process";
|
|
@@ -237,4 +238,4 @@ async function runDebugWorkflow(argv) {
|
|
|
237
238
|
export {
|
|
238
239
|
runDebugWorkflow
|
|
239
240
|
};
|
|
240
|
-
//# sourceMappingURL=debug-workflow-
|
|
241
|
+
//# sourceMappingURL=debug-workflow-PMLMWKWI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/debug-workflow.ts"],"sourcesContent":["/**\n * Debug Workflow Command\n *\n * Runs a workflow in a local headed browser for debugging. Replays cached\n * actions where possible and falls back to the agent for uncached steps.\n * The browser stays open after execution so the user can inspect page state.\n *\n * Usage:\n * canary debug <workflowId> [--to-step N] [--api-url URL] [--env local|dev|prod]\n *\n * @module debug-workflow\n */\n\nimport process from \"node:process\";\nimport { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport { resolveConfig, getArgValue, hasFlag } from \"./auth\";\nimport { LocalBrowserHost } from \"./local-browser/host\";\n\ninterface CreateSessionResponse {\n ok: boolean;\n sessionId: string;\n wsToken: string;\n wsUrl: string;\n expiresAt: string;\n error?: string;\n}\n\ninterface DebugSessionResponse {\n ok: boolean;\n sessionId?: string;\n workflowName?: string;\n nodes?: Array<{\n index: number;\n id: string;\n name: string;\n type: string;\n }>;\n error?: string;\n}\n\ninterface StepStartedEvent {\n type: \"step-started\";\n stepIndex: number;\n totalSteps: number;\n stepName: string;\n nodeType: string;\n nodeId: string;\n}\n\ninterface NodeCompletedEvent {\n type: \"completed\";\n stepIndex?: number;\n result: { success: boolean; errorMessage?: string; source?: string };\n}\n\ninterface RunCompleteEvent {\n type: \"run-complete\";\n stepsExecuted: number;\n totalSteps: number;\n stoppedEarly: boolean;\n reason?: string;\n}\n\ntype DebugEvent =\n | StepStartedEvent\n | NodeCompletedEvent\n | RunCompleteEvent\n | { type: string; [key: string]: unknown };\n\nexport async function runDebugWorkflow(argv: string[]): Promise<void> {\n const workflowId = argv.find((arg) => !arg.startsWith(\"-\"));\n\n if (!workflowId) {\n console.error(\"Usage: canary debug <workflowId> [--to-step N] [--env local|dev|prod]\");\n process.exit(1);\n }\n\n const toStepStr = getArgValue(argv, \"--to-step\");\n const toStep = toStepStr ? parseInt(toStepStr, 10) : undefined;\n const verbose = hasFlag(argv, \"--verbose\", \"-v\");\n\n if (toStep !== undefined && (isNaN(toStep) || toStep < 1)) {\n console.error(\"Error: --to-step must be a positive integer\");\n process.exit(1);\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n // 1. Create local browser session\n console.log(\"Creating local browser session...\");\n\n let localSession: CreateSessionResponse;\n try {\n const res = await fetch(`${apiUrl}/local-browser/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ browserMode: \"playwright\" }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n console.error(`Failed to create local browser session: ${res.status} ${text}`);\n process.exit(1);\n }\n\n localSession = (await res.json()) as CreateSessionResponse;\n if (!localSession.ok) {\n console.error(`Failed to create session: ${localSession.error}`);\n process.exit(1);\n }\n } catch (err) {\n console.error(`Failed to connect to API: ${err}`);\n process.exit(1);\n }\n\n // 2. Launch headed browser and connect WebSocket\n console.log(\"Launching headed browser...\");\n\n const host = new LocalBrowserHost({\n apiUrl,\n wsToken: localSession.wsToken,\n sessionId: localSession.sessionId,\n browserMode: \"playwright\",\n headless: false,\n onLog: (level, message, data) => {\n if (verbose) {\n const prefix = `[${level.toUpperCase()}]`;\n if (data) {\n console.log(prefix, message, data);\n } else {\n console.log(prefix, message);\n }\n }\n },\n });\n\n // Set up cleanup\n let debugSessionId: string | null = null;\n\n const cleanup = async () => {\n console.log(\"\\nShutting down...\");\n\n if (debugSessionId) {\n try {\n await fetch(`${apiUrl}/cli/debug/sessions/${debugSessionId}`, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${token}` },\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n await host.stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => void cleanup());\n process.on(\"SIGTERM\", () => void cleanup());\n\n try {\n await host.start();\n } catch (err) {\n console.error(`Failed to start local browser: ${err}`);\n await host.stop();\n process.exit(1);\n }\n\n console.log(\"Browser connected.\");\n console.log();\n\n // 3. Create debug session\n console.log(\"Loading workflow...\");\n\n let debugSession: DebugSessionResponse;\n try {\n const res = await fetch(`${apiUrl}/cli/debug/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n workflowId,\n localBrowserSessionId: localSession.sessionId,\n }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n console.error(`Failed to create debug session: ${res.status} ${text}`);\n await host.stop();\n process.exit(1);\n }\n\n debugSession = (await res.json()) as DebugSessionResponse;\n if (!debugSession.ok || !debugSession.sessionId) {\n console.error(`Failed to create debug session: ${debugSession.error}`);\n await host.stop();\n process.exit(1);\n }\n } catch (err) {\n console.error(`Failed to create debug session: ${err}`);\n await host.stop();\n process.exit(1);\n }\n\n debugSessionId = debugSession.sessionId;\n const nodes = debugSession.nodes ?? [];\n const totalSteps = nodes.length;\n const effectiveToStep = toStep ? Math.min(toStep, totalSteps) : totalSteps;\n\n console.log(`Debugging: \"${debugSession.workflowName}\" (${totalSteps} steps)`);\n if (toStep) {\n console.log(`Running steps 1-${effectiveToStep} of ${totalSteps}`);\n }\n console.log();\n\n // 4. Run steps via SSE\n let runRes: Response;\n try {\n runRes = await fetch(`${apiUrl}/cli/debug/sessions/${debugSessionId}/run`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify({ toStep: effectiveToStep }),\n });\n } catch (err) {\n console.error(`Failed to start execution: ${err}`);\n await cleanup();\n return;\n }\n\n if (!runRes.ok || !runRes.body) {\n console.error(`Failed to start execution: ${runRes.status}`);\n await cleanup();\n return;\n }\n\n // Track execution state\n let currentStep = 0;\n let hasError = false;\n const stepResults = new Map<number, { name: string; success: boolean; source?: string }>();\n\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data) return;\n\n try {\n const data = JSON.parse(event.data) as DebugEvent;\n\n if (verbose) {\n console.log(`[SSE] ${JSON.stringify(data)}`);\n }\n\n if (data.type === \"step-started\") {\n const e = data as StepStartedEvent;\n currentStep = e.stepIndex;\n process.stdout.write(`[${e.stepIndex}/${e.totalSteps}] ${e.stepName} `);\n }\n\n if (data.type === \"completed\") {\n const e = data as NodeCompletedEvent;\n const stepIndex = e.stepIndex ?? currentStep;\n const success = e.result.success;\n const source = e.result.source;\n\n if (success) {\n const sourceLabel = source === \"cache\" ? \"(cache)\" : source === \"agent\" ? \"(agent)\" : \"\";\n console.log(`\\u2713 ${sourceLabel}`);\n } else {\n console.log(\"\\u2717\");\n if (e.result.errorMessage) {\n console.log(` Error: ${e.result.errorMessage.slice(0, 200)}`);\n }\n hasError = true;\n }\n\n stepResults.set(stepIndex, {\n name: `Step ${stepIndex}`,\n success,\n source,\n });\n }\n\n if (data.type === \"run-complete\") {\n const e = data as RunCompleteEvent;\n console.log();\n if (e.stoppedEarly) {\n console.log(\n `Stopped at step ${e.stepsExecuted} of ${e.totalSteps}. ${e.reason === \"step-failed\" ? \"Step failed.\" : \"Error occurred.\"}`\n );\n } else {\n console.log(\n `All ${e.stepsExecuted} step(s) completed.`\n );\n }\n }\n\n if (data.type === \"run-error\") {\n const errorData = data as { error?: string };\n console.log(`\\u2717`);\n if (errorData.error) {\n console.log(` Error: ${String(errorData.error).slice(0, 200)}`);\n }\n hasError = true;\n }\n } catch {\n // Ignore parse errors\n }\n },\n });\n\n const reader = runRes.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n\n // 5. Keep browser open for inspection\n console.log();\n console.log(\"Browser is open for inspection.\");\n console.log(\"Press Ctrl+C to close.\");\n\n // Keep the process running until Ctrl+C\n await new Promise(() => {});\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/debug-workflow.ts"],"sourcesContent":["/**\n * Debug Workflow Command\n *\n * Runs a workflow in a local headed browser for debugging. Replays cached\n * actions where possible and falls back to the agent for uncached steps.\n * The browser stays open after execution so the user can inspect page state.\n *\n * Usage:\n * canary debug <workflowId> [--to-step N] [--api-url URL] [--env local|dev|prod]\n *\n * @module debug-workflow\n */\n\nimport process from \"node:process\";\nimport { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport { resolveConfig, getArgValue, hasFlag } from \"./auth\";\nimport { LocalBrowserHost } from \"./local-browser/host\";\n\ninterface CreateSessionResponse {\n ok: boolean;\n sessionId: string;\n wsToken: string;\n wsUrl: string;\n expiresAt: string;\n error?: string;\n}\n\ninterface DebugSessionResponse {\n ok: boolean;\n sessionId?: string;\n workflowName?: string;\n nodes?: Array<{\n index: number;\n id: string;\n name: string;\n type: string;\n }>;\n error?: string;\n}\n\ninterface StepStartedEvent {\n type: \"step-started\";\n stepIndex: number;\n totalSteps: number;\n stepName: string;\n nodeType: string;\n nodeId: string;\n}\n\ninterface NodeCompletedEvent {\n type: \"completed\";\n stepIndex?: number;\n result: { success: boolean; errorMessage?: string; source?: string };\n}\n\ninterface RunCompleteEvent {\n type: \"run-complete\";\n stepsExecuted: number;\n totalSteps: number;\n stoppedEarly: boolean;\n reason?: string;\n}\n\ntype DebugEvent =\n | StepStartedEvent\n | NodeCompletedEvent\n | RunCompleteEvent\n | { type: string; [key: string]: unknown };\n\nexport async function runDebugWorkflow(argv: string[]): Promise<void> {\n const workflowId = argv.find((arg) => !arg.startsWith(\"-\"));\n\n if (!workflowId) {\n console.error(\"Usage: canary debug <workflowId> [--to-step N] [--env local|dev|prod]\");\n process.exit(1);\n }\n\n const toStepStr = getArgValue(argv, \"--to-step\");\n const toStep = toStepStr ? parseInt(toStepStr, 10) : undefined;\n const verbose = hasFlag(argv, \"--verbose\", \"-v\");\n\n if (toStep !== undefined && (isNaN(toStep) || toStep < 1)) {\n console.error(\"Error: --to-step must be a positive integer\");\n process.exit(1);\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n // 1. Create local browser session\n console.log(\"Creating local browser session...\");\n\n let localSession: CreateSessionResponse;\n try {\n const res = await fetch(`${apiUrl}/local-browser/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ browserMode: \"playwright\" }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n console.error(`Failed to create local browser session: ${res.status} ${text}`);\n process.exit(1);\n }\n\n localSession = (await res.json()) as CreateSessionResponse;\n if (!localSession.ok) {\n console.error(`Failed to create session: ${localSession.error}`);\n process.exit(1);\n }\n } catch (err) {\n console.error(`Failed to connect to API: ${err}`);\n process.exit(1);\n }\n\n // 2. Launch headed browser and connect WebSocket\n console.log(\"Launching headed browser...\");\n\n const host = new LocalBrowserHost({\n apiUrl,\n wsToken: localSession.wsToken,\n sessionId: localSession.sessionId,\n browserMode: \"playwright\",\n headless: false,\n onLog: (level, message, data) => {\n if (verbose) {\n const prefix = `[${level.toUpperCase()}]`;\n if (data) {\n console.log(prefix, message, data);\n } else {\n console.log(prefix, message);\n }\n }\n },\n });\n\n // Set up cleanup\n let debugSessionId: string | null = null;\n\n const cleanup = async () => {\n console.log(\"\\nShutting down...\");\n\n if (debugSessionId) {\n try {\n await fetch(`${apiUrl}/cli/debug/sessions/${debugSessionId}`, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${token}` },\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n await host.stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => void cleanup());\n process.on(\"SIGTERM\", () => void cleanup());\n\n try {\n await host.start();\n } catch (err) {\n console.error(`Failed to start local browser: ${err}`);\n await host.stop();\n process.exit(1);\n }\n\n console.log(\"Browser connected.\");\n console.log();\n\n // 3. Create debug session\n console.log(\"Loading workflow...\");\n\n let debugSession: DebugSessionResponse;\n try {\n const res = await fetch(`${apiUrl}/cli/debug/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n workflowId,\n localBrowserSessionId: localSession.sessionId,\n }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n console.error(`Failed to create debug session: ${res.status} ${text}`);\n await host.stop();\n process.exit(1);\n }\n\n debugSession = (await res.json()) as DebugSessionResponse;\n if (!debugSession.ok || !debugSession.sessionId) {\n console.error(`Failed to create debug session: ${debugSession.error}`);\n await host.stop();\n process.exit(1);\n }\n } catch (err) {\n console.error(`Failed to create debug session: ${err}`);\n await host.stop();\n process.exit(1);\n }\n\n debugSessionId = debugSession.sessionId;\n const nodes = debugSession.nodes ?? [];\n const totalSteps = nodes.length;\n const effectiveToStep = toStep ? Math.min(toStep, totalSteps) : totalSteps;\n\n console.log(`Debugging: \"${debugSession.workflowName}\" (${totalSteps} steps)`);\n if (toStep) {\n console.log(`Running steps 1-${effectiveToStep} of ${totalSteps}`);\n }\n console.log();\n\n // 4. Run steps via SSE\n let runRes: Response;\n try {\n runRes = await fetch(`${apiUrl}/cli/debug/sessions/${debugSessionId}/run`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify({ toStep: effectiveToStep }),\n });\n } catch (err) {\n console.error(`Failed to start execution: ${err}`);\n await cleanup();\n return;\n }\n\n if (!runRes.ok || !runRes.body) {\n console.error(`Failed to start execution: ${runRes.status}`);\n await cleanup();\n return;\n }\n\n // Track execution state\n let currentStep = 0;\n let hasError = false;\n const stepResults = new Map<number, { name: string; success: boolean; source?: string }>();\n\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data) return;\n\n try {\n const data = JSON.parse(event.data) as DebugEvent;\n\n if (verbose) {\n console.log(`[SSE] ${JSON.stringify(data)}`);\n }\n\n if (data.type === \"step-started\") {\n const e = data as StepStartedEvent;\n currentStep = e.stepIndex;\n process.stdout.write(`[${e.stepIndex}/${e.totalSteps}] ${e.stepName} `);\n }\n\n if (data.type === \"completed\") {\n const e = data as NodeCompletedEvent;\n const stepIndex = e.stepIndex ?? currentStep;\n const success = e.result.success;\n const source = e.result.source;\n\n if (success) {\n const sourceLabel = source === \"cache\" ? \"(cache)\" : source === \"agent\" ? \"(agent)\" : \"\";\n console.log(`\\u2713 ${sourceLabel}`);\n } else {\n console.log(\"\\u2717\");\n if (e.result.errorMessage) {\n console.log(` Error: ${e.result.errorMessage.slice(0, 200)}`);\n }\n hasError = true;\n }\n\n stepResults.set(stepIndex, {\n name: `Step ${stepIndex}`,\n success,\n source,\n });\n }\n\n if (data.type === \"run-complete\") {\n const e = data as RunCompleteEvent;\n console.log();\n if (e.stoppedEarly) {\n console.log(\n `Stopped at step ${e.stepsExecuted} of ${e.totalSteps}. ${e.reason === \"step-failed\" ? \"Step failed.\" : \"Error occurred.\"}`\n );\n } else {\n console.log(\n `All ${e.stepsExecuted} step(s) completed.`\n );\n }\n }\n\n if (data.type === \"run-error\") {\n const errorData = data as { error?: string };\n console.log(`\\u2717`);\n if (errorData.error) {\n console.log(` Error: ${String(errorData.error).slice(0, 200)}`);\n }\n hasError = true;\n }\n } catch {\n // Ignore parse errors\n }\n },\n });\n\n const reader = runRes.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n\n // 5. Keep browser open for inspection\n console.log();\n console.log(\"Browser is open for inspection.\");\n console.log(\"Press Ctrl+C to close.\");\n\n // Keep the process running until Ctrl+C\n await new Promise(() => {});\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import "./chunk-PLDDJCW6.js";
|
|
2
|
+
|
|
3
|
+
// ../../node_modules/.bun/unpdf@1.4.0/node_modules/unpdf/dist/index.mjs
|
|
4
|
+
var resolvedModule;
|
|
5
|
+
var isNode = globalThis.process?.release?.name === "node";
|
|
6
|
+
var isBrowser = typeof window !== "undefined";
|
|
7
|
+
async function getDocumentProxy(data, options = {}) {
|
|
8
|
+
const { getDocument } = await getResolvedPDFJS();
|
|
9
|
+
const pdf = await getDocument({
|
|
10
|
+
data,
|
|
11
|
+
isEvalSupported: false,
|
|
12
|
+
// See: https://github.com/mozilla/pdf.js/issues/4244#issuecomment-1479534301
|
|
13
|
+
useSystemFonts: true,
|
|
14
|
+
...options
|
|
15
|
+
}).promise;
|
|
16
|
+
return pdf;
|
|
17
|
+
}
|
|
18
|
+
async function getResolvedPDFJS() {
|
|
19
|
+
if (!resolvedModule) {
|
|
20
|
+
await resolvePDFJSImport();
|
|
21
|
+
}
|
|
22
|
+
return resolvedModule;
|
|
23
|
+
}
|
|
24
|
+
async function resolvePDFJSImport(pdfjsResolver, { reload = false } = {}) {
|
|
25
|
+
if (resolvedModule && !reload) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (pdfjsResolver) {
|
|
29
|
+
try {
|
|
30
|
+
resolvedModule = await interopDefault(pdfjsResolver());
|
|
31
|
+
return;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
throw new Error(`PDF.js could not be resolved: ${error}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
resolvedModule = await import("./pdfjs-44AOKLEM.js");
|
|
38
|
+
} catch (error) {
|
|
39
|
+
throw new Error(`Serverless PDF.js bundle could not be resolved: ${error}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isPDFDocumentProxy(data) {
|
|
43
|
+
return typeof data === "object" && data !== null && "_pdfInfo" in data;
|
|
44
|
+
}
|
|
45
|
+
async function interopDefault(m) {
|
|
46
|
+
const resolved = await m;
|
|
47
|
+
return resolved.default || resolved;
|
|
48
|
+
}
|
|
49
|
+
var resolvedCanvasModule;
|
|
50
|
+
var BaseCanvasFactory = class {
|
|
51
|
+
#enableHWA = false;
|
|
52
|
+
constructor({ enableHWA = false } = {}) {
|
|
53
|
+
this.#enableHWA = enableHWA;
|
|
54
|
+
}
|
|
55
|
+
create(width, height) {
|
|
56
|
+
const canvas = this._createCanvas(width, height);
|
|
57
|
+
return {
|
|
58
|
+
canvas,
|
|
59
|
+
context: canvas.getContext("2d", {
|
|
60
|
+
willReadFrequently: !this.#enableHWA
|
|
61
|
+
})
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
reset({ canvas }, width, height) {
|
|
65
|
+
if (!canvas) {
|
|
66
|
+
throw new Error("Canvas is not specified");
|
|
67
|
+
}
|
|
68
|
+
canvas.width = width;
|
|
69
|
+
canvas.height = height;
|
|
70
|
+
}
|
|
71
|
+
destroy(context) {
|
|
72
|
+
if (!context.canvas) {
|
|
73
|
+
throw new Error("Canvas is not specified");
|
|
74
|
+
}
|
|
75
|
+
context.canvas.width = 0;
|
|
76
|
+
context.canvas.height = 0;
|
|
77
|
+
context.canvas = void 0;
|
|
78
|
+
context.context = void 0;
|
|
79
|
+
}
|
|
80
|
+
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
81
|
+
_createCanvas(width, height) {
|
|
82
|
+
throw new Error("Not implemented");
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var DOMCanvasFactory = class extends BaseCanvasFactory {
|
|
86
|
+
_document;
|
|
87
|
+
constructor({ ownerDocument = globalThis.document, enableHWA = false } = {}) {
|
|
88
|
+
super({ enableHWA });
|
|
89
|
+
this._document = ownerDocument;
|
|
90
|
+
}
|
|
91
|
+
_createCanvas(width, height) {
|
|
92
|
+
const canvas = this._document.createElement("canvas");
|
|
93
|
+
canvas.width = width;
|
|
94
|
+
canvas.height = height;
|
|
95
|
+
return canvas;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var NodeCanvasFactory = class extends BaseCanvasFactory {
|
|
99
|
+
constructor({ enableHWA = false } = {}) {
|
|
100
|
+
super({ enableHWA });
|
|
101
|
+
}
|
|
102
|
+
_createCanvas(width, height) {
|
|
103
|
+
if (!resolvedCanvasModule) {
|
|
104
|
+
throw new Error("@napi-rs/canvas module is not resolved");
|
|
105
|
+
}
|
|
106
|
+
return resolvedCanvasModule.createCanvas(width, height);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
async function resolveCanvasModule(canvasImport) {
|
|
110
|
+
resolvedCanvasModule ??= await interopDefault(canvasImport());
|
|
111
|
+
}
|
|
112
|
+
function injectCanvasConstructors() {
|
|
113
|
+
if (!resolvedCanvasModule)
|
|
114
|
+
return;
|
|
115
|
+
if (typeof globalThis.DOMMatrix === "undefined")
|
|
116
|
+
globalThis.DOMMatrix = resolvedCanvasModule.DOMMatrix;
|
|
117
|
+
if (typeof globalThis.ImageData === "undefined")
|
|
118
|
+
globalThis.ImageData = resolvedCanvasModule.ImageData;
|
|
119
|
+
if (typeof globalThis.Path2D === "undefined")
|
|
120
|
+
globalThis.Path2D = resolvedCanvasModule.Path2D;
|
|
121
|
+
}
|
|
122
|
+
async function extractImages$1(data, pageNumber) {
|
|
123
|
+
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
124
|
+
if (pageNumber < 1 || pageNumber > pdf.numPages) {
|
|
125
|
+
throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);
|
|
126
|
+
}
|
|
127
|
+
const page = await pdf.getPage(pageNumber);
|
|
128
|
+
const operatorList = await page.getOperatorList();
|
|
129
|
+
const { OPS } = await getResolvedPDFJS();
|
|
130
|
+
const images = [];
|
|
131
|
+
for (let i = 0; i < operatorList.fnArray.length; i++) {
|
|
132
|
+
const op = operatorList.fnArray[i];
|
|
133
|
+
if (op !== OPS.paintImageXObject) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const imageKey = operatorList.argsArray[i][0];
|
|
137
|
+
const image = await new Promise(
|
|
138
|
+
(resolve) => (imageKey.startsWith("g_") ? page.commonObjs : page.objs).get(imageKey, resolve)
|
|
139
|
+
);
|
|
140
|
+
if (!image || !image.data || !image.width || !image.height) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const { width, height, data: data2 } = image;
|
|
144
|
+
const calculatedChannels = data2.length / (width * height);
|
|
145
|
+
if (![1, 3, 4].includes(calculatedChannels)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const channels = calculatedChannels;
|
|
149
|
+
images.push({
|
|
150
|
+
data: data2,
|
|
151
|
+
width,
|
|
152
|
+
height,
|
|
153
|
+
channels,
|
|
154
|
+
key: imageKey
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return images;
|
|
158
|
+
}
|
|
159
|
+
async function renderPageAsImage$1(data, pageNumber, options = {}) {
|
|
160
|
+
const CanvasFactory = await createIsomorphicCanvasFactory(options.canvasImport);
|
|
161
|
+
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data, { CanvasFactory });
|
|
162
|
+
const page = await pdf.getPage(pageNumber);
|
|
163
|
+
if (pageNumber < 1 || pageNumber > pdf.numPages) {
|
|
164
|
+
throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);
|
|
165
|
+
}
|
|
166
|
+
const defaultViewport = page.getViewport({ scale: 1 });
|
|
167
|
+
let scale = options.scale || 1;
|
|
168
|
+
if (options.width) {
|
|
169
|
+
scale = options.width / defaultViewport.width;
|
|
170
|
+
} else if (options.height) {
|
|
171
|
+
scale = options.height / defaultViewport.height;
|
|
172
|
+
}
|
|
173
|
+
const viewport = page.getViewport({ scale: Math.max(0, scale) });
|
|
174
|
+
const drawingContext = new CanvasFactory().create(viewport.width, viewport.height);
|
|
175
|
+
await page.render({
|
|
176
|
+
canvas: drawingContext.canvas,
|
|
177
|
+
canvasContext: drawingContext.context,
|
|
178
|
+
viewport
|
|
179
|
+
}).promise;
|
|
180
|
+
const dataUrl = drawingContext.canvas.toDataURL();
|
|
181
|
+
if (options.toDataURL) {
|
|
182
|
+
return dataUrl;
|
|
183
|
+
}
|
|
184
|
+
const response = await fetch(dataUrl);
|
|
185
|
+
return await response.arrayBuffer();
|
|
186
|
+
}
|
|
187
|
+
async function createIsomorphicCanvasFactory(canvasImport) {
|
|
188
|
+
if (isBrowser)
|
|
189
|
+
return DOMCanvasFactory;
|
|
190
|
+
if (isNode) {
|
|
191
|
+
if (!canvasImport) {
|
|
192
|
+
throw new Error('Parameter "canvasImport" is required in Node.js environment.');
|
|
193
|
+
}
|
|
194
|
+
await resolveCanvasModule(canvasImport);
|
|
195
|
+
injectCanvasConstructors();
|
|
196
|
+
return NodeCanvasFactory;
|
|
197
|
+
}
|
|
198
|
+
throw new Error("Unsupported environment for canvas creation.");
|
|
199
|
+
}
|
|
200
|
+
async function extractLinks$1(data) {
|
|
201
|
+
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
202
|
+
const pageLinks = await Promise.all(
|
|
203
|
+
Array.from({ length: pdf.numPages }, (_, i) => getPageLinks(pdf, i + 1))
|
|
204
|
+
);
|
|
205
|
+
return {
|
|
206
|
+
totalPages: pdf.numPages,
|
|
207
|
+
links: pageLinks.flat()
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function getPageLinks(document, pageNumber) {
|
|
211
|
+
const page = await document.getPage(pageNumber);
|
|
212
|
+
const annotations = await page.getAnnotations();
|
|
213
|
+
const links = [];
|
|
214
|
+
for (const annotation of annotations) {
|
|
215
|
+
if (annotation.subtype === "Link" && annotation.url) {
|
|
216
|
+
links.push(annotation.url);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return links;
|
|
220
|
+
}
|
|
221
|
+
var XMP_DATE_PROPERTIES = [
|
|
222
|
+
"xmp:createdate",
|
|
223
|
+
"xmp:modifydate",
|
|
224
|
+
"xmp:metadatadate",
|
|
225
|
+
"xap:createdate",
|
|
226
|
+
"xap:modifydate",
|
|
227
|
+
"xap:metadatadate"
|
|
228
|
+
];
|
|
229
|
+
async function getMeta$1(data, options = {}) {
|
|
230
|
+
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
231
|
+
const meta = await pdf.getMetadata();
|
|
232
|
+
const info = meta?.info || {};
|
|
233
|
+
if (options.parseDates) {
|
|
234
|
+
const { PDFDateString } = await getResolvedPDFJS();
|
|
235
|
+
if (info?.CreationDate) {
|
|
236
|
+
info.CreationDate = PDFDateString.toDateObject(info?.CreationDate);
|
|
237
|
+
}
|
|
238
|
+
if (info?.ModDate) {
|
|
239
|
+
info.ModDate = PDFDateString.toDateObject(info?.ModDate);
|
|
240
|
+
}
|
|
241
|
+
if (meta.metadata) {
|
|
242
|
+
meta.metadata = new Proxy(meta.metadata, {
|
|
243
|
+
get(target, prop) {
|
|
244
|
+
if (prop === "get") {
|
|
245
|
+
return (name) => {
|
|
246
|
+
const value = target.get(name);
|
|
247
|
+
if (XMP_DATE_PROPERTIES.includes(name) && value) {
|
|
248
|
+
return parseISODateString(value);
|
|
249
|
+
}
|
|
250
|
+
return value;
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
return target[prop];
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
info,
|
|
260
|
+
metadata: meta?.metadata || {}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
function parseISODateString(isoDateString) {
|
|
264
|
+
if (!isoDateString)
|
|
265
|
+
return;
|
|
266
|
+
const parsedDate = Date.parse(isoDateString);
|
|
267
|
+
if (!Number.isNaN(parsedDate)) {
|
|
268
|
+
return new Date(parsedDate);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async function extractText$1(data, options = {}) {
|
|
272
|
+
const { mergePages = false } = options;
|
|
273
|
+
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
274
|
+
const texts = await Promise.all(
|
|
275
|
+
Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
|
|
276
|
+
);
|
|
277
|
+
return {
|
|
278
|
+
totalPages: pdf.numPages,
|
|
279
|
+
text: mergePages ? texts.join("\n").replace(/\s+/g, " ") : texts
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
async function getPageText(document, pageNumber) {
|
|
283
|
+
const page = await document.getPage(pageNumber);
|
|
284
|
+
const content = await page.getTextContent();
|
|
285
|
+
return content.items.filter((item) => item.str != null).map((item) => item.str + (item.hasEOL ? "\n" : "")).join("");
|
|
286
|
+
}
|
|
287
|
+
async function definePDFJSModule(pdfjs) {
|
|
288
|
+
await resolvePDFJSImport(pdfjs, { reload: true });
|
|
289
|
+
}
|
|
290
|
+
async function configureUnPDF(options) {
|
|
291
|
+
await resolvePDFJSImport(options.pdfjs, { reload: true });
|
|
292
|
+
}
|
|
293
|
+
var getMeta = async (...args) => {
|
|
294
|
+
await resolvePDFJSImport();
|
|
295
|
+
return await getMeta$1(...args);
|
|
296
|
+
};
|
|
297
|
+
var extractText = async (...args) => {
|
|
298
|
+
await resolvePDFJSImport();
|
|
299
|
+
return await extractText$1(...args);
|
|
300
|
+
};
|
|
301
|
+
var extractImages = async (...args) => {
|
|
302
|
+
await resolvePDFJSImport();
|
|
303
|
+
return await extractImages$1(...args);
|
|
304
|
+
};
|
|
305
|
+
var renderPageAsImage = async (...args) => {
|
|
306
|
+
await resolvePDFJSImport();
|
|
307
|
+
return await renderPageAsImage$1(...args);
|
|
308
|
+
};
|
|
309
|
+
var extractLinks = async (...args) => {
|
|
310
|
+
await resolvePDFJSImport();
|
|
311
|
+
return await extractLinks$1(...args);
|
|
312
|
+
};
|
|
313
|
+
export {
|
|
314
|
+
configureUnPDF,
|
|
315
|
+
createIsomorphicCanvasFactory,
|
|
316
|
+
definePDFJSModule,
|
|
317
|
+
extractImages,
|
|
318
|
+
extractLinks,
|
|
319
|
+
extractText,
|
|
320
|
+
getDocumentProxy,
|
|
321
|
+
getMeta,
|
|
322
|
+
getResolvedPDFJS,
|
|
323
|
+
renderPageAsImage,
|
|
324
|
+
resolvePDFJSImport
|
|
325
|
+
};
|
|
326
|
+
/*! Bundled license information:
|
|
327
|
+
|
|
328
|
+
unpdf/dist/index.mjs:
|
|
329
|
+
(**
|
|
330
|
+
* Derived from the PDF.js project by the Mozilla Foundation.
|
|
331
|
+
* @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18
|
|
332
|
+
* @license Apache-2.0
|
|
333
|
+
*)
|
|
334
|
+
*/
|
|
335
|
+
//# sourceMappingURL=dist-6NXLJYRZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.bun/unpdf@1.4.0/node_modules/unpdf/dist/index.mjs"],"sourcesContent":["let resolvedModule;\nconst isNode = globalThis.process?.release?.name === \"node\";\nconst isBrowser = typeof window !== \"undefined\";\nasync function getDocumentProxy(data, options = {}) {\n const { getDocument } = await getResolvedPDFJS();\n const pdf = await getDocument({\n data,\n isEvalSupported: false,\n // See: https://github.com/mozilla/pdf.js/issues/4244#issuecomment-1479534301\n useSystemFonts: true,\n ...options\n }).promise;\n return pdf;\n}\nasync function getResolvedPDFJS() {\n if (!resolvedModule) {\n await resolvePDFJSImport();\n }\n return resolvedModule;\n}\nasync function resolvePDFJSImport(pdfjsResolver, { reload = false } = {}) {\n if (resolvedModule && !reload) {\n return;\n }\n if (pdfjsResolver) {\n try {\n resolvedModule = await interopDefault(pdfjsResolver());\n return;\n } catch (error) {\n throw new Error(`PDF.js could not be resolved: ${error}`);\n }\n }\n try {\n resolvedModule = await import('unpdf/pdfjs');\n } catch (error) {\n throw new Error(`Serverless PDF.js bundle could not be resolved: ${error}`);\n }\n}\nfunction isPDFDocumentProxy(data) {\n return typeof data === \"object\" && data !== null && \"_pdfInfo\" in data;\n}\nasync function interopDefault(m) {\n const resolved = await m;\n return resolved.default || resolved;\n}\n\nlet resolvedCanvasModule;\n/**\n * Derived from the PDF.js project by the Mozilla Foundation.\n * @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18\n * @license Apache-2.0\n */\nclass BaseCanvasFactory {\n #enableHWA = false;\n constructor({ enableHWA = false } = {}) {\n this.#enableHWA = enableHWA;\n }\n create(width, height) {\n const canvas = this._createCanvas(width, height);\n return {\n canvas,\n context: canvas.getContext(\"2d\", {\n willReadFrequently: !this.#enableHWA\n })\n };\n }\n reset({ canvas }, width, height) {\n if (!canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n canvas.width = width;\n canvas.height = height;\n }\n destroy(context) {\n if (!context.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n context.canvas.width = 0;\n context.canvas.height = 0;\n context.canvas = void 0;\n context.context = void 0;\n }\n // eslint-disable-next-line unused-imports/no-unused-vars\n _createCanvas(width, height) {\n throw new Error(\"Not implemented\");\n }\n}\n/**\n * Derived from the PDF.js project by the Mozilla Foundation.\n * @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18\n * @license Apache-2.0\n */\nclass DOMCanvasFactory extends BaseCanvasFactory {\n _document;\n constructor({ ownerDocument = globalThis.document, enableHWA = false } = {}) {\n super({ enableHWA });\n this._document = ownerDocument;\n }\n _createCanvas(width, height) {\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n}\nclass NodeCanvasFactory extends BaseCanvasFactory {\n constructor({ enableHWA = false } = {}) {\n super({ enableHWA });\n }\n _createCanvas(width, height) {\n if (!resolvedCanvasModule) {\n throw new Error(\"@napi-rs/canvas module is not resolved\");\n }\n return resolvedCanvasModule.createCanvas(width, height);\n }\n}\nasync function resolveCanvasModule(canvasImport) {\n resolvedCanvasModule ??= await interopDefault(canvasImport());\n}\nfunction injectCanvasConstructors() {\n if (!resolvedCanvasModule)\n return;\n if (typeof globalThis.DOMMatrix === \"undefined\")\n globalThis.DOMMatrix = resolvedCanvasModule.DOMMatrix;\n if (typeof globalThis.ImageData === \"undefined\")\n globalThis.ImageData = resolvedCanvasModule.ImageData;\n if (typeof globalThis.Path2D === \"undefined\")\n globalThis.Path2D = resolvedCanvasModule.Path2D;\n}\n\nasync function extractImages$1(data, pageNumber) {\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n if (pageNumber < 1 || pageNumber > pdf.numPages) {\n throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);\n }\n const page = await pdf.getPage(pageNumber);\n const operatorList = await page.getOperatorList();\n const { OPS } = await getResolvedPDFJS();\n const images = [];\n for (let i = 0; i < operatorList.fnArray.length; i++) {\n const op = operatorList.fnArray[i];\n if (op !== OPS.paintImageXObject) {\n continue;\n }\n const imageKey = operatorList.argsArray[i][0];\n const image = await new Promise(\n (resolve) => (imageKey.startsWith(\"g_\") ? page.commonObjs : page.objs).get(imageKey, resolve)\n );\n if (!image || !image.data || !image.width || !image.height) {\n continue;\n }\n const { width, height, data: data2 } = image;\n const calculatedChannels = data2.length / (width * height);\n if (![1, 3, 4].includes(calculatedChannels)) {\n continue;\n }\n const channels = calculatedChannels;\n images.push({\n data: data2,\n width,\n height,\n channels,\n key: imageKey\n });\n }\n return images;\n}\nasync function renderPageAsImage$1(data, pageNumber, options = {}) {\n const CanvasFactory = await createIsomorphicCanvasFactory(options.canvasImport);\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data, { CanvasFactory });\n const page = await pdf.getPage(pageNumber);\n if (pageNumber < 1 || pageNumber > pdf.numPages) {\n throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);\n }\n const defaultViewport = page.getViewport({ scale: 1 });\n let scale = options.scale || 1;\n if (options.width) {\n scale = options.width / defaultViewport.width;\n } else if (options.height) {\n scale = options.height / defaultViewport.height;\n }\n const viewport = page.getViewport({ scale: Math.max(0, scale) });\n const drawingContext = new CanvasFactory().create(viewport.width, viewport.height);\n await page.render({\n canvas: drawingContext.canvas,\n canvasContext: drawingContext.context,\n viewport\n }).promise;\n const dataUrl = drawingContext.canvas.toDataURL();\n if (options.toDataURL) {\n return dataUrl;\n }\n const response = await fetch(dataUrl);\n return await response.arrayBuffer();\n}\nasync function createIsomorphicCanvasFactory(canvasImport) {\n if (isBrowser)\n return DOMCanvasFactory;\n if (isNode) {\n if (!canvasImport) {\n throw new Error('Parameter \"canvasImport\" is required in Node.js environment.');\n }\n await resolveCanvasModule(canvasImport);\n injectCanvasConstructors();\n return NodeCanvasFactory;\n }\n throw new Error(\"Unsupported environment for canvas creation.\");\n}\n\nasync function extractLinks$1(data) {\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n const pageLinks = await Promise.all(\n Array.from({ length: pdf.numPages }, (_, i) => getPageLinks(pdf, i + 1))\n );\n return {\n totalPages: pdf.numPages,\n links: pageLinks.flat()\n };\n}\nasync function getPageLinks(document, pageNumber) {\n const page = await document.getPage(pageNumber);\n const annotations = await page.getAnnotations();\n const links = [];\n for (const annotation of annotations) {\n if (annotation.subtype === \"Link\" && annotation.url) {\n links.push(annotation.url);\n }\n }\n return links;\n}\n\nconst XMP_DATE_PROPERTIES = [\n \"xmp:createdate\",\n \"xmp:modifydate\",\n \"xmp:metadatadate\",\n \"xap:createdate\",\n \"xap:modifydate\",\n \"xap:metadatadate\"\n];\nasync function getMeta$1(data, options = {}) {\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n const meta = await pdf.getMetadata();\n const info = meta?.info || {};\n if (options.parseDates) {\n const { PDFDateString } = await getResolvedPDFJS();\n if (info?.CreationDate) {\n info.CreationDate = PDFDateString.toDateObject(info?.CreationDate);\n }\n if (info?.ModDate) {\n info.ModDate = PDFDateString.toDateObject(info?.ModDate);\n }\n if (meta.metadata) {\n meta.metadata = new Proxy(meta.metadata, {\n get(target, prop) {\n if (prop === \"get\") {\n return (name) => {\n const value = target.get(name);\n if (XMP_DATE_PROPERTIES.includes(name) && value) {\n return parseISODateString(value);\n }\n return value;\n };\n }\n return target[prop];\n }\n });\n }\n }\n return {\n info,\n metadata: meta?.metadata || {}\n };\n}\nfunction parseISODateString(isoDateString) {\n if (!isoDateString)\n return;\n const parsedDate = Date.parse(isoDateString);\n if (!Number.isNaN(parsedDate)) {\n return new Date(parsedDate);\n }\n}\n\nasync function extractText$1(data, options = {}) {\n const { mergePages = false } = options;\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n const texts = await Promise.all(\n Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))\n );\n return {\n totalPages: pdf.numPages,\n text: mergePages ? texts.join(\"\\n\").replace(/\\s+/g, \" \") : texts\n };\n}\nasync function getPageText(document, pageNumber) {\n const page = await document.getPage(pageNumber);\n const content = await page.getTextContent();\n return content.items.filter((item) => item.str != null).map((item) => item.str + (item.hasEOL ? \"\\n\" : \"\")).join(\"\");\n}\n\nasync function definePDFJSModule(pdfjs) {\n await resolvePDFJSImport(pdfjs, { reload: true });\n}\nasync function configureUnPDF(options) {\n await resolvePDFJSImport(options.pdfjs, { reload: true });\n}\n\nconst getMeta = async (...args) => {\n await resolvePDFJSImport();\n return await getMeta$1(...args);\n};\nconst extractText = async (...args) => {\n await resolvePDFJSImport();\n return await extractText$1(...args);\n};\nconst extractImages = async (...args) => {\n await resolvePDFJSImport();\n return await extractImages$1(...args);\n};\nconst renderPageAsImage = async (...args) => {\n await resolvePDFJSImport();\n return await renderPageAsImage$1(...args);\n};\nconst extractLinks = async (...args) => {\n await resolvePDFJSImport();\n return await extractLinks$1(...args);\n};\n\nexport { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };\n"],"mappings":"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","names":[]}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
hasFlag,
|
|
10
10
|
resolveConfig
|
|
11
11
|
} from "./chunk-7R4YFGP6.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-PLDDJCW6.js";
|
|
13
13
|
|
|
14
14
|
// src/feature-flag.ts
|
|
15
15
|
import process from "process";
|
|
@@ -232,4 +232,4 @@ async function runFeatureFlag(argv) {
|
|
|
232
232
|
export {
|
|
233
233
|
runFeatureFlag
|
|
234
234
|
};
|
|
235
|
-
//# sourceMappingURL=feature-flag-
|
|
235
|
+
//# sourceMappingURL=feature-flag-D3QTHGL6.js.map
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
} from "./chunk-7R4YFGP6.js";
|
|
19
19
|
import {
|
|
20
20
|
__require
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-PLDDJCW6.js";
|
|
22
22
|
|
|
23
23
|
// src/index.ts
|
|
24
24
|
import { spawnSync as spawnSync2 } from "child_process";
|
|
@@ -909,9 +909,9 @@ function isSuperadminToken(token) {
|
|
|
909
909
|
// src/index.ts
|
|
910
910
|
var require2 = createRequire2(import.meta.url);
|
|
911
911
|
var pkg = require2("../package.json");
|
|
912
|
-
var loadMcp = () => import("./mcp-
|
|
913
|
-
var loadLocalBrowser = () => import("./local-browser-
|
|
914
|
-
var loadDebugWorkflow = () => import("./debug-workflow-
|
|
912
|
+
var loadMcp = () => import("./mcp-LKHFYMA6.js").then((m) => m.runMcp);
|
|
913
|
+
var loadLocalBrowser = () => import("./local-browser-YSE3XCUW.js").then((m) => m.runLocalBrowser);
|
|
914
|
+
var loadDebugWorkflow = () => import("./debug-workflow-PMLMWKWI.js").then((m) => m.runDebugWorkflow);
|
|
915
915
|
var canary = { run };
|
|
916
916
|
var baseDir = typeof __dirname !== "undefined" ? __dirname : path4.dirname(fileURLToPath2(import.meta.url));
|
|
917
917
|
var preloadPath = path4.join(baseDir, "runner", "preload.js");
|
|
@@ -1174,32 +1174,32 @@ async function main(argv) {
|
|
|
1174
1174
|
return;
|
|
1175
1175
|
}
|
|
1176
1176
|
if (command === "psql") {
|
|
1177
|
-
const { runPsql } = await import("./psql-
|
|
1177
|
+
const { runPsql } = await import("./psql-U5LF6ELS.js");
|
|
1178
1178
|
await runPsql(rest);
|
|
1179
1179
|
return;
|
|
1180
1180
|
}
|
|
1181
1181
|
if (command === "redis") {
|
|
1182
|
-
const { runRedis } = await import("./redis-
|
|
1182
|
+
const { runRedis } = await import("./redis-PBQZGU6T.js");
|
|
1183
1183
|
await runRedis(rest);
|
|
1184
1184
|
return;
|
|
1185
1185
|
}
|
|
1186
1186
|
if (command === "release") {
|
|
1187
|
-
const { runRelease } = await import("./release-
|
|
1187
|
+
const { runRelease } = await import("./release-QBSP474D.js");
|
|
1188
1188
|
await runRelease(rest);
|
|
1189
1189
|
return;
|
|
1190
1190
|
}
|
|
1191
1191
|
if (command === "feature-flag") {
|
|
1192
|
-
const { runFeatureFlag } = await import("./feature-flag-
|
|
1192
|
+
const { runFeatureFlag } = await import("./feature-flag-D3QTHGL6.js");
|
|
1193
1193
|
await runFeatureFlag(rest);
|
|
1194
1194
|
return;
|
|
1195
1195
|
}
|
|
1196
1196
|
if (command === "knobs") {
|
|
1197
|
-
const { runKnobs } = await import("./knobs-
|
|
1197
|
+
const { runKnobs } = await import("./knobs-ED6LXBVM.js");
|
|
1198
1198
|
await runKnobs(rest);
|
|
1199
1199
|
return;
|
|
1200
1200
|
}
|
|
1201
1201
|
if (command === "issues") {
|
|
1202
|
-
const { runIssues } = await import("./issues-
|
|
1202
|
+
const { runIssues } = await import("./issues-6MHRFKTU.js");
|
|
1203
1203
|
await runIssues(rest);
|
|
1204
1204
|
return;
|
|
1205
1205
|
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
hasFlag,
|
|
7
7
|
resolveConfig
|
|
8
8
|
} from "./chunk-7R4YFGP6.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-PLDDJCW6.js";
|
|
10
10
|
|
|
11
11
|
// src/issues.ts
|
|
12
12
|
import process from "process";
|
|
@@ -359,4 +359,4 @@ async function runIssues(argv) {
|
|
|
359
359
|
export {
|
|
360
360
|
runIssues
|
|
361
361
|
};
|
|
362
|
-
//# sourceMappingURL=issues-
|
|
362
|
+
//# sourceMappingURL=issues-6MHRFKTU.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
hasFlag,
|
|
10
10
|
resolveConfig
|
|
11
11
|
} from "./chunk-7R4YFGP6.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-PLDDJCW6.js";
|
|
13
13
|
|
|
14
14
|
// src/knobs.ts
|
|
15
15
|
import process from "process";
|
|
@@ -284,4 +284,4 @@ async function runKnobs(argv) {
|
|
|
284
284
|
export {
|
|
285
285
|
runKnobs
|
|
286
286
|
};
|
|
287
|
-
//# sourceMappingURL=knobs-
|
|
287
|
+
//# sourceMappingURL=knobs-ED6LXBVM.js.map
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
LocalBrowserHost
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZTWHPIXU.js";
|
|
4
4
|
import {
|
|
5
5
|
readStoredToken
|
|
6
6
|
} from "./chunk-7R4YFGP6.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-OE6O7H45.js";
|
|
8
|
+
import "./chunk-PLDDJCW6.js";
|
|
8
9
|
|
|
9
10
|
// src/local-browser/index.ts
|
|
10
11
|
import process from "process";
|
|
@@ -137,4 +138,4 @@ async function runLocalBrowser(args) {
|
|
|
137
138
|
export {
|
|
138
139
|
runLocalBrowser
|
|
139
140
|
};
|
|
140
|
-
//# sourceMappingURL=local-browser-
|
|
141
|
+
//# sourceMappingURL=local-browser-YSE3XCUW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-browser/index.ts"],"sourcesContent":["/**\n * Local Browser Command\n *\n * Starts a local browser that can be controlled by the cloud agent.\n *\n * Usage:\n * canary browser [options]\n *\n * Options:\n * --mode <playwright|cdp> Browser mode (default: playwright)\n * --cdp-url <url> CDP endpoint for existing Chrome\n * --headless Run headless (default: true for playwright)\n * --storage-state <path> Path to storage state JSON\n * --api-url <url> API URL (default: https://api.trycanary.ai)\n * --instructions <text> Instructions for the cloud agent\n */\n\nimport process from \"node:process\";\nimport { readStoredToken } from \"../auth\";\nimport { LocalBrowserHost } from \"./host\";\nimport type { LocalBrowserMode } from \"./protocol\";\n\nconst DEFAULT_API_URL = \"https://api.trycanary.ai\";\n\ninterface LocalBrowserOptions {\n mode: LocalBrowserMode;\n cdpUrl?: string;\n headless: boolean;\n storageStatePath?: string;\n apiUrl: string;\n instructions?: string;\n}\n\nfunction parseArgs(args: string[]): LocalBrowserOptions {\n const options: LocalBrowserOptions = {\n mode: \"playwright\",\n headless: true,\n apiUrl: process.env.CANARY_API_URL ?? DEFAULT_API_URL,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n switch (arg) {\n case \"--mode\":\n if (nextArg === \"playwright\" || nextArg === \"cdp\") {\n options.mode = nextArg;\n i++;\n }\n break;\n case \"--cdp-url\":\n options.cdpUrl = nextArg;\n options.mode = \"cdp\";\n i++;\n break;\n case \"--headless\":\n options.headless = true;\n break;\n case \"--no-headless\":\n options.headless = false;\n break;\n case \"--storage-state\":\n options.storageStatePath = nextArg;\n i++;\n break;\n case \"--api-url\":\n options.apiUrl = nextArg;\n i++;\n break;\n case \"--instructions\":\n options.instructions = nextArg;\n i++;\n break;\n }\n }\n\n return options;\n}\n\nasync function resolveToken(): Promise<string> {\n const token = process.env.CANARY_API_TOKEN ?? (await readStoredToken());\n if (!token) {\n throw new Error(\"Missing token. Run `canary login` first or set CANARY_API_TOKEN.\");\n }\n return token;\n}\n\ninterface CreateSessionResponse {\n ok: boolean;\n sessionId: string;\n wsToken: string;\n wsUrl: string;\n expiresAt: string;\n error?: string;\n}\n\nasync function createSession(\n apiUrl: string,\n token: string,\n options: LocalBrowserOptions\n): Promise<CreateSessionResponse> {\n const response = await fetch(`${apiUrl}/local-browser/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n browserMode: options.mode,\n instructions: options.instructions ?? null,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to create session: ${response.status} ${text}`);\n }\n\n return response.json();\n}\n\nexport async function runLocalBrowser(args: string[]): Promise<void> {\n const options = parseArgs(args);\n\n console.log(\"Starting local browser...\");\n console.log(` Mode: ${options.mode}`);\n if (options.cdpUrl) {\n console.log(` CDP URL: ${options.cdpUrl}`);\n }\n console.log(` Headless: ${options.headless}`);\n console.log(` API URL: ${options.apiUrl}`);\n console.log();\n\n // Get auth token\n const token = await resolveToken();\n\n // Create session with cloud API\n console.log(\"Creating session with cloud API...\");\n const session = await createSession(options.apiUrl, token, options);\n\n if (!session.ok) {\n throw new Error(`Failed to create session: ${session.error}`);\n }\n\n console.log(`Session created: ${session.sessionId}`);\n console.log(`Expires at: ${session.expiresAt}`);\n console.log();\n\n // Start the local browser host\n const host = new LocalBrowserHost({\n apiUrl: options.apiUrl,\n wsToken: session.wsToken,\n sessionId: session.sessionId,\n browserMode: options.mode,\n cdpUrl: options.cdpUrl,\n headless: options.headless,\n storageStatePath: options.storageStatePath,\n onLog: (level, message, data) => {\n const prefix = `[${level.toUpperCase()}]`;\n if (data) {\n console.log(prefix, message, data);\n } else {\n console.log(prefix, message);\n }\n },\n });\n\n // Handle shutdown\n const shutdown = async () => {\n console.log(\"\\nShutting down...\");\n await host.stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n try {\n await host.start();\n console.log();\n console.log(\"Local browser is ready and connected to cloud.\");\n console.log(\"Press Ctrl+C to stop.\");\n console.log();\n\n // Keep the process running\n await new Promise(() => {});\n } catch (error) {\n console.error(\"Failed to start local browser:\", error);\n await host.stop();\n process.exit(1);\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/local-browser/index.ts"],"sourcesContent":["/**\n * Local Browser Command\n *\n * Starts a local browser that can be controlled by the cloud agent.\n *\n * Usage:\n * canary browser [options]\n *\n * Options:\n * --mode <playwright|cdp> Browser mode (default: playwright)\n * --cdp-url <url> CDP endpoint for existing Chrome\n * --headless Run headless (default: true for playwright)\n * --storage-state <path> Path to storage state JSON\n * --api-url <url> API URL (default: https://api.trycanary.ai)\n * --instructions <text> Instructions for the cloud agent\n */\n\nimport process from \"node:process\";\nimport { readStoredToken } from \"../auth\";\nimport { LocalBrowserHost } from \"./host\";\nimport type { LocalBrowserMode } from \"./protocol\";\n\nconst DEFAULT_API_URL = \"https://api.trycanary.ai\";\n\ninterface LocalBrowserOptions {\n mode: LocalBrowserMode;\n cdpUrl?: string;\n headless: boolean;\n storageStatePath?: string;\n apiUrl: string;\n instructions?: string;\n}\n\nfunction parseArgs(args: string[]): LocalBrowserOptions {\n const options: LocalBrowserOptions = {\n mode: \"playwright\",\n headless: true,\n apiUrl: process.env.CANARY_API_URL ?? DEFAULT_API_URL,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n switch (arg) {\n case \"--mode\":\n if (nextArg === \"playwright\" || nextArg === \"cdp\") {\n options.mode = nextArg;\n i++;\n }\n break;\n case \"--cdp-url\":\n options.cdpUrl = nextArg;\n options.mode = \"cdp\";\n i++;\n break;\n case \"--headless\":\n options.headless = true;\n break;\n case \"--no-headless\":\n options.headless = false;\n break;\n case \"--storage-state\":\n options.storageStatePath = nextArg;\n i++;\n break;\n case \"--api-url\":\n options.apiUrl = nextArg;\n i++;\n break;\n case \"--instructions\":\n options.instructions = nextArg;\n i++;\n break;\n }\n }\n\n return options;\n}\n\nasync function resolveToken(): Promise<string> {\n const token = process.env.CANARY_API_TOKEN ?? (await readStoredToken());\n if (!token) {\n throw new Error(\"Missing token. Run `canary login` first or set CANARY_API_TOKEN.\");\n }\n return token;\n}\n\ninterface CreateSessionResponse {\n ok: boolean;\n sessionId: string;\n wsToken: string;\n wsUrl: string;\n expiresAt: string;\n error?: string;\n}\n\nasync function createSession(\n apiUrl: string,\n token: string,\n options: LocalBrowserOptions\n): Promise<CreateSessionResponse> {\n const response = await fetch(`${apiUrl}/local-browser/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n browserMode: options.mode,\n instructions: options.instructions ?? null,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to create session: ${response.status} ${text}`);\n }\n\n return response.json();\n}\n\nexport async function runLocalBrowser(args: string[]): Promise<void> {\n const options = parseArgs(args);\n\n console.log(\"Starting local browser...\");\n console.log(` Mode: ${options.mode}`);\n if (options.cdpUrl) {\n console.log(` CDP URL: ${options.cdpUrl}`);\n }\n console.log(` Headless: ${options.headless}`);\n console.log(` API URL: ${options.apiUrl}`);\n console.log();\n\n // Get auth token\n const token = await resolveToken();\n\n // Create session with cloud API\n console.log(\"Creating session with cloud API...\");\n const session = await createSession(options.apiUrl, token, options);\n\n if (!session.ok) {\n throw new Error(`Failed to create session: ${session.error}`);\n }\n\n console.log(`Session created: ${session.sessionId}`);\n console.log(`Expires at: ${session.expiresAt}`);\n console.log();\n\n // Start the local browser host\n const host = new LocalBrowserHost({\n apiUrl: options.apiUrl,\n wsToken: session.wsToken,\n sessionId: session.sessionId,\n browserMode: options.mode,\n cdpUrl: options.cdpUrl,\n headless: options.headless,\n storageStatePath: options.storageStatePath,\n onLog: (level, message, data) => {\n const prefix = `[${level.toUpperCase()}]`;\n if (data) {\n console.log(prefix, message, data);\n } else {\n console.log(prefix, message);\n }\n },\n });\n\n // Handle shutdown\n const shutdown = async () => {\n console.log(\"\\nShutting down...\");\n await host.stop();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n try {\n await host.start();\n console.log();\n console.log(\"Local browser is ready and connected to cloud.\");\n console.log(\"Press Ctrl+C to stop.\");\n console.log();\n\n // Keep the process running\n await new Promise(() => {});\n } catch (error) {\n console.error(\"Failed to start local browser:\", error);\n await host.stop();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,11 +5,12 @@ import {
|
|
|
5
5
|
} from "./chunk-HOYYXZPV.js";
|
|
6
6
|
import {
|
|
7
7
|
LocalBrowserHost
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZTWHPIXU.js";
|
|
9
9
|
import {
|
|
10
10
|
readStoredToken
|
|
11
11
|
} from "./chunk-7R4YFGP6.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-OE6O7H45.js";
|
|
13
|
+
import "./chunk-PLDDJCW6.js";
|
|
13
14
|
|
|
14
15
|
// src/mcp.ts
|
|
15
16
|
import process from "process";
|
|
@@ -381,4 +382,4 @@ function formatReport(input) {
|
|
|
381
382
|
export {
|
|
382
383
|
runMcp
|
|
383
384
|
};
|
|
384
|
-
//# sourceMappingURL=mcp-
|
|
385
|
+
//# sourceMappingURL=mcp-LKHFYMA6.js.map
|