@arnilo/prism-tools 0.0.0-stage → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +418 -0
- package/LICENSE +21 -0
- package/README.md +44 -2
- package/browser/README.md +98 -0
- package/browser/skills/browser-automation/SKILL.md +14 -0
- package/browser/src/actions/cdp.ts +131 -0
- package/browser/src/actions/dialog.ts +25 -0
- package/browser/src/actions/download_release.ts +22 -0
- package/browser/src/actions/index.ts +37 -0
- package/browser/src/actions/locator.ts +70 -0
- package/browser/src/actions/navigate.ts +23 -0
- package/browser/src/actions/screenshot.ts +27 -0
- package/browser/src/actions/scroll.ts +24 -0
- package/browser/src/actions/select_page.ts +21 -0
- package/browser/src/actions/types.ts +114 -0
- package/browser/src/actions/upload.ts +44 -0
- package/browser/src/actions/wait.ts +45 -0
- package/browser/src/browser.ts +197 -0
- package/browser/src/cdp.ts +178 -0
- package/browser/src/checkpoint.ts +189 -0
- package/browser/src/config.ts +72 -0
- package/browser/src/downloads.ts +253 -0
- package/browser/src/errors.ts +31 -0
- package/browser/src/evaluate.ts +101 -0
- package/browser/src/index.ts +129 -0
- package/browser/src/limits.ts +271 -0
- package/browser/src/manager.ts +730 -0
- package/browser/src/network.ts +263 -0
- package/browser/src/observe.ts +178 -0
- package/browser/src/policy.ts +133 -0
- package/browser/src/screenshot.ts +107 -0
- package/browser/src/shared-sandbox.ts +53 -0
- package/browser/src/snapshot.ts +99 -0
- package/browser/src/targets.ts +165 -0
- package/browser/src/tools.ts +480 -0
- package/browser/src/types.ts +316 -0
- package/browser/src/uploads.ts +174 -0
- package/coding/README.md +337 -0
- package/coding/src/agent/acp-operations.ts +146 -0
- package/coding/src/agent/artifacts.ts +38 -0
- package/coding/src/agent/ask-user-decision.ts +623 -0
- package/coding/src/agent/atomic-write.ts +23 -0
- package/coding/src/agent/bounded-file.ts +21 -0
- package/coding/src/agent/checks.ts +301 -0
- package/coding/src/agent/coding-checkpoint.ts +828 -0
- package/coding/src/agent/delete.ts +237 -0
- package/coding/src/agent/diagnostics-tool.ts +163 -0
- package/coding/src/agent/diagnostics.ts +262 -0
- package/coding/src/agent/edit-diff.ts +382 -0
- package/coding/src/agent/edit.ts +322 -0
- package/coding/src/agent/effects.ts +102 -0
- package/coding/src/agent/env.ts +28 -0
- package/coding/src/agent/execution-policy.ts +89 -0
- package/coding/src/agent/file-mutation-queue.ts +72 -0
- package/coding/src/agent/forge/github.ts +603 -0
- package/coding/src/agent/forge/index.ts +16 -0
- package/coding/src/agent/forge/types.ts +185 -0
- package/coding/src/agent/git-aware-repository.ts +305 -0
- package/coding/src/agent/git-exec.ts +326 -0
- package/coding/src/agent/git-status.ts +177 -0
- package/coding/src/agent/git-tools.ts +360 -0
- package/coding/src/agent/git.ts +1074 -0
- package/coding/src/agent/glob-match.ts +146 -0
- package/coding/src/agent/glob.ts +182 -0
- package/coding/src/agent/goal-verify.ts +385 -0
- package/coding/src/agent/grep-worker.ts +74 -0
- package/coding/src/agent/grep.ts +459 -0
- package/coding/src/agent/identity.ts +48 -0
- package/coding/src/agent/index.ts +676 -0
- package/coding/src/agent/language/client.ts +429 -0
- package/coding/src/agent/language/framing.ts +190 -0
- package/coding/src/agent/language/index.ts +23 -0
- package/coding/src/agent/language/intelligence.ts +682 -0
- package/coding/src/agent/language/types.ts +187 -0
- package/coding/src/agent/lifecycle-events.ts +121 -0
- package/coding/src/agent/lifecycle.ts +166 -0
- package/coding/src/agent/limits.ts +214 -0
- package/coding/src/agent/move.ts +178 -0
- package/coding/src/agent/mutation-path.ts +52 -0
- package/coding/src/agent/output-accumulator.ts +304 -0
- package/coding/src/agent/path-utils.ts +120 -0
- package/coding/src/agent/process/index.ts +58 -0
- package/coding/src/agent/process/recovery.ts +508 -0
- package/coding/src/agent/process/sessions-host.ts +222 -0
- package/coding/src/agent/process/sessions-monitor.ts +141 -0
- package/coding/src/agent/process/sessions-recovery.ts +241 -0
- package/coding/src/agent/process/sessions-spawn.ts +613 -0
- package/coding/src/agent/process/sessions-teardown.ts +281 -0
- package/coding/src/agent/process/sessions.ts +30 -0
- package/coding/src/agent/process/types.ts +358 -0
- package/coding/src/agent/read-path-set.ts +126 -0
- package/coding/src/agent/read.ts +713 -0
- package/coding/src/agent/repository/glob.ts +147 -0
- package/coding/src/agent/repository/indexed-search.ts +480 -0
- package/coding/src/agent/repository/list.ts +131 -0
- package/coding/src/agent/repository/operations.ts +22 -0
- package/coding/src/agent/repository/path.ts +98 -0
- package/coding/src/agent/repository/search.ts +277 -0
- package/coding/src/agent/repository/types.ts +243 -0
- package/coding/src/agent/repository/walk.ts +126 -0
- package/coding/src/agent/repository.ts +12 -0
- package/coding/src/agent/shell-background.ts +264 -0
- package/coding/src/agent/shell-output.ts +75 -0
- package/coding/src/agent/shell.ts +526 -0
- package/coding/src/agent/todo.ts +399 -0
- package/coding/src/agent/truncate.ts +251 -0
- package/coding/src/agent/write.ts +170 -0
- package/coding/src/ask-user-host.ts +48 -0
- package/coding/src/config.ts +278 -0
- package/coding/src/hard-deny.ts +97 -0
- package/coding/src/index.ts +318 -0
- package/coding/src/principal-guard.ts +84 -0
- package/coding/src/sandbox.ts +92 -0
- package/coding/src/security/approval.ts +144 -0
- package/coding/src/security/command-rules.ts +57 -0
- package/coding/src/security/docker-cli.ts +222 -0
- package/coding/src/security/docker-sandbox.ts +1205 -0
- package/coding/src/security/e2b-sandbox.ts +853 -0
- package/coding/src/security/egress/dns-pin.ts +88 -0
- package/coding/src/security/egress/index.ts +32 -0
- package/coding/src/security/egress/limits.ts +57 -0
- package/coding/src/security/egress/policy.ts +137 -0
- package/coding/src/security/egress/proxy.ts +599 -0
- package/coding/src/security/egress/types.ts +30 -0
- package/coding/src/security/index.ts +199 -0
- package/coding/src/security/native-sandbox.ts +639 -0
- package/coding/src/security/path-containment.ts +55 -0
- package/coding/src/security/sandbox-coding-operations.ts +392 -0
- package/coding/src/security/sandbox-fs-operations.ts +644 -0
- package/coding/src/security/sandbox-limits.ts +147 -0
- package/coding/src/security/sandbox-tar.ts +308 -0
- package/coding/src/security/sandbox.ts +179 -0
- package/coding/src/security/semaphore.ts +55 -0
- package/coding/src/targets.ts +110 -0
- package/coding/src/workspace/diff.ts +78 -0
- package/coding/src/workspace/errors.ts +29 -0
- package/coding/src/workspace/index.ts +5 -0
- package/coding/src/workspace/merge.ts +151 -0
- package/coding/src/workspace/routing.ts +76 -0
- package/coding/src/workspace/service.ts +584 -0
- package/computer-use/README.md +105 -0
- package/computer-use/skills/computer-use-linux/SKILL.md +17 -0
- package/computer-use/src/classify.ts +53 -0
- package/computer-use/src/command.ts +29 -0
- package/computer-use/src/config.ts +69 -0
- package/computer-use/src/create.ts +170 -0
- package/computer-use/src/devices.ts +247 -0
- package/computer-use/src/env.ts +28 -0
- package/computer-use/src/index.ts +157 -0
- package/computer-use/src/skill.ts +21 -0
- package/openapi/README.md +97 -0
- package/openapi/src/compile.ts +386 -0
- package/openapi/src/config.ts +73 -0
- package/openapi/src/errors.ts +16 -0
- package/openapi/src/execute.ts +241 -0
- package/openapi/src/index.ts +124 -0
- package/openapi/src/limits.ts +63 -0
- package/openapi/src/specs.ts +86 -0
- package/openapi/src/tools.ts +60 -0
- package/openapi/src/types.ts +61 -0
- package/package.json +171 -4
- package/research/README.md +72 -0
- package/research/skills/research-report/SKILL.md +12 -0
- package/research/skills/research-scoping/SKILL.md +10 -0
- package/research/skills/research-synthesis/SKILL.md +10 -0
- package/research/skills/source-triage/SKILL.md +10 -0
- package/research/src/check.ts +71 -0
- package/research/src/config.ts +41 -0
- package/research/src/index.ts +147 -0
- package/research/src/ledger.ts +157 -0
- package/research/src/urls.ts +21 -0
- package/web/README.md +287 -0
- package/web/skills/web-research/SKILL.md +17 -0
- package/web/src/brave.ts +66 -0
- package/web/src/cache.ts +151 -0
- package/web/src/config.ts +210 -0
- package/web/src/controls.ts +128 -0
- package/web/src/domains.ts +114 -0
- package/web/src/exa.ts +60 -0
- package/web/src/firecrawl.ts +160 -0
- package/web/src/index.ts +387 -0
- package/web/src/kagi.ts +73 -0
- package/web/src/limits.ts +55 -0
- package/web/src/native/convert.ts +84 -0
- package/web/src/native/fetch.ts +226 -0
- package/web/src/normalize.ts +131 -0
- package/web/src/obscura/cdp.ts +201 -0
- package/web/src/obscura/classify.ts +35 -0
- package/web/src/obscura/cli.ts +254 -0
- package/web/src/obscura/errors.ts +8 -0
- package/web/src/obscura/index.ts +59 -0
- package/web/src/obscura/limits.ts +92 -0
- package/web/src/obscura/mcp.ts +104 -0
- package/web/src/obscura/playwright.ts +133 -0
- package/web/src/obscura/process.ts +235 -0
- package/web/src/obscura/search-profile.ts +73 -0
- package/web/src/obscura/types.ts +48 -0
- package/web/src/obscura/web.ts +419 -0
- package/web/src/prompt-fetch.ts +88 -0
- package/web/src/render.ts +75 -0
- package/web/src/searxng.ts +78 -0
- package/web/src/slice.ts +139 -0
- package/web/src/tavily.ts +77 -0
- package/web/src/tools.ts +182 -0
- package/web/src/transport.ts +310 -0
- package/web/src/types.ts +199 -0
- package/work/README.md +77 -0
- package/work/THIRD_PARTY_NOTICES +24 -0
- package/work/docling/ocr.py +150 -0
- package/work/sandbox/Dockerfile +36 -0
- package/work/sandbox/soffice.sh +12 -0
- package/work/src/command.ts +29 -0
- package/work/src/config.ts +138 -0
- package/work/src/connectors/cli.ts +343 -0
- package/work/src/connectors/drafts.ts +647 -0
- package/work/src/connectors/errors.ts +8 -0
- package/work/src/connectors/file-bytes.ts +149 -0
- package/work/src/connectors/google-workspace-http.ts +399 -0
- package/work/src/connectors/google-workspace.ts +465 -0
- package/work/src/connectors/gws-tools.ts +378 -0
- package/work/src/connectors/http.ts +123 -0
- package/work/src/connectors/idempotency.ts +235 -0
- package/work/src/connectors/identity.ts +34 -0
- package/work/src/connectors/index.ts +93 -0
- package/work/src/connectors/limits.ts +50 -0
- package/work/src/connectors/m365-tools.ts +308 -0
- package/work/src/connectors/microsoft365-http.ts +428 -0
- package/work/src/connectors/microsoft365.ts +402 -0
- package/work/src/connectors/normalize.ts +120 -0
- package/work/src/connectors/tool-helpers.ts +398 -0
- package/work/src/connectors/tools.ts +42 -0
- package/work/src/connectors/types.ts +399 -0
- package/work/src/diagrams/canonicalize.ts +166 -0
- package/work/src/diagrams/caps.ts +52 -0
- package/work/src/diagrams/embed.ts +340 -0
- package/work/src/diagrams/errors.ts +76 -0
- package/work/src/diagrams/index.ts +81 -0
- package/work/src/diagrams/messages.ts +150 -0
- package/work/src/diagrams/origin.ts +52 -0
- package/work/src/diagrams/telemetry.ts +34 -0
- package/work/src/diagrams/xml.ts +267 -0
- package/work/src/document-extraction/index.ts +563 -0
- package/work/src/document-reader/ambient.d.ts +2 -0
- package/work/src/document-reader/errors.ts +7 -0
- package/work/src/document-reader/index.ts +181 -0
- package/work/src/document-reader/mistral-ocr.ts +318 -0
- package/work/src/document-reader/parsers.ts +171 -0
- package/work/src/documents/caps.ts +135 -0
- package/work/src/documents/diff.ts +269 -0
- package/work/src/documents/errors.ts +44 -0
- package/work/src/documents/fidelity.ts +98 -0
- package/work/src/documents/generate.ts +96 -0
- package/work/src/documents/hash.ts +8 -0
- package/work/src/documents/index.ts +14 -0
- package/work/src/documents/model-schema.ts +639 -0
- package/work/src/documents/parse.ts +252 -0
- package/work/src/documents/patch-history.ts +81 -0
- package/work/src/documents/patch.ts +476 -0
- package/work/src/documents/preview-html.ts +245 -0
- package/work/src/documents/preview.ts +227 -0
- package/work/src/documents/telemetry.ts +36 -0
- package/work/src/documents/translate/docx.ts +292 -0
- package/work/src/documents/translate/pptx.ts +304 -0
- package/work/src/documents/translate/xlsx.ts +137 -0
- package/work/src/documents/types.ts +188 -0
- package/work/src/index.ts +311 -0
- package/work/src/runtime/worker-pool-entry.ts +102 -0
- package/work/src/runtime/worker-pool.ts +267 -0
- package/work/src/sandbox/composition.ts +212 -0
- package/work/src/sandbox/image.ts +6 -0
- package/work/src/sandbox/index.ts +14 -0
- package/work/src/sheets/caps.ts +68 -0
- package/work/src/sheets/csv.ts +351 -0
- package/work/src/sheets/decimal.ts +388 -0
- package/work/src/sheets/errors.ts +52 -0
- package/work/src/sheets/index.ts +62 -0
- package/work/src/sheets/inference.ts +378 -0
- package/work/src/sheets/telemetry.ts +34 -0
- package/work/src/sheets/types.ts +162 -0
- package/work/src/sheets/xlsx.ts +388 -0
- package/work/src/skills/index.ts +8 -0
- package/work/src/skills/load.ts +43 -0
- package/work/src/tools/filesystem.ts +21 -0
- package/work/src/tools/index.ts +1 -0
- package/work/src/tools/local-filesystem.ts +33 -0
- package/work/src/tools/office.ts +311 -0
- package/work/vendor/hermes-agent/LICENSE +21 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/LICENSE +21 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/SKILL.md +196 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_comments.py +289 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_common.py +94 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_create.py +177 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_edit.py +250 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_read.py +149 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_revisions.py +147 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_template.py +70 -0
- package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_validate.py +156 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/LICENSE +21 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/SKILL.md +125 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/_raster.py +76 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/extract_marker.py +88 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/extract_pymupdf.py +101 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_create.py +130 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_fill_form.py +97 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_form_layout.py +168 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_make_form.py +145 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_merge.py +50 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_meta.py +115 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_page_image.py +99 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_read.py +153 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_secure.py +71 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_split.py +84 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_stamp.py +143 -0
- package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_watermark.py +51 -0
- package/work/vendor/hermes-agent/skills/productivity/powerpoint/LICENSE +21 -0
- package/work/vendor/hermes-agent/skills/productivity/powerpoint/SKILL.md +220 -0
- package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_create.py +214 -0
- package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_edit.py +436 -0
- package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_from_template.py +88 -0
- package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_read.py +131 -0
- package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_render.py +93 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/LICENSE +21 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/SKILL.md +196 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/csv_to_xlsx.py +104 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_create.py +259 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_edit.py +263 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_read.py +160 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_recalc.py +111 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_restructure.py +337 -0
- package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_to_csv.py +69 -0
- package/work/vendor-lock.json +11 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { type DocumentCaps, resolveDocumentCaps, validateByteCap, validateModelCaps } from "./caps.js";
|
|
2
|
+
import { DocumentsParseError } from "./errors.js";
|
|
3
|
+
import { type ImportFidelityReport, reportImportFidelity } from "./fidelity.js";
|
|
4
|
+
import { validateDocumentModel } from "./model-schema.js";
|
|
5
|
+
import type { DocumentsTelemetry } from "./telemetry.js";
|
|
6
|
+
import { parseDocxBytes } from "./translate/docx.js";
|
|
7
|
+
import { parsePptxBytes } from "./translate/pptx.js";
|
|
8
|
+
import { parseXlsxBytes } from "./translate/xlsx.js";
|
|
9
|
+
import type {
|
|
10
|
+
CellValue,
|
|
11
|
+
DeckModel,
|
|
12
|
+
DocBlock,
|
|
13
|
+
DocModel,
|
|
14
|
+
DocRun,
|
|
15
|
+
DocumentKind,
|
|
16
|
+
DocumentModel,
|
|
17
|
+
ListItem,
|
|
18
|
+
SheetData,
|
|
19
|
+
SheetModel,
|
|
20
|
+
SlideData,
|
|
21
|
+
} from "./types.js";
|
|
22
|
+
|
|
23
|
+
export interface SecretRedactor {
|
|
24
|
+
redact(text: string): string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ParseDocumentOptions {
|
|
28
|
+
/** Expected document kind to parse from the OOXML container. */
|
|
29
|
+
readonly kind: DocumentKind;
|
|
30
|
+
/** Optional caps overrides. */
|
|
31
|
+
readonly caps?: DocumentCaps;
|
|
32
|
+
/** Optional SecretRedactor hook to sanitize extracted string content at the parse boundary. */
|
|
33
|
+
readonly redactor?: SecretRedactor;
|
|
34
|
+
/** Optional telemetry seam hook. */
|
|
35
|
+
readonly telemetry?: DocumentsTelemetry;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ImportDocumentResult {
|
|
39
|
+
readonly model: DocumentModel;
|
|
40
|
+
readonly fidelity: ImportFidelityReport;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Checks whether the binary buffer begins with standard PK zip container magic bytes (0x50, 0x4B, 0x03, 0x04).
|
|
45
|
+
*/
|
|
46
|
+
export function isZipContainer(bytes: Uint8Array): boolean {
|
|
47
|
+
return bytes.length >= 4 && bytes[0] === 0x50 && bytes[1] === 0x4b && bytes[2] === 0x03 && bytes[3] === 0x04;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function redactRun(run: DocRun, redactor: SecretRedactor): DocRun {
|
|
51
|
+
return {
|
|
52
|
+
...run,
|
|
53
|
+
text: redactor.redact(run.text),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function redactListItem(item: string | ListItem, redactor: SecretRedactor): string | ListItem {
|
|
58
|
+
if (typeof item === "string") {
|
|
59
|
+
return redactor.redact(item);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
...item,
|
|
63
|
+
text: redactor.redact(item.text),
|
|
64
|
+
runs: item.runs ? item.runs.map((r) => redactRun(r, redactor)) : undefined,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function redactCellValue(cell: CellValue, redactor: SecretRedactor): CellValue {
|
|
69
|
+
if (cell === null || cell === undefined) return cell;
|
|
70
|
+
if (typeof cell === "string") return redactor.redact(cell);
|
|
71
|
+
if (typeof cell === "number" || typeof cell === "boolean") return cell;
|
|
72
|
+
if ("type" in cell) {
|
|
73
|
+
if (cell.type === "decimal") return cell;
|
|
74
|
+
return {
|
|
75
|
+
...cell,
|
|
76
|
+
value: redactor.redact(cell.value),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if ("formula" in cell) {
|
|
80
|
+
return {
|
|
81
|
+
...cell,
|
|
82
|
+
formula: redactor.redact(cell.formula),
|
|
83
|
+
cachedValue: typeof cell.cachedValue === "string" ? redactor.redact(cell.cachedValue) : cell.cachedValue,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return cell;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function redactDocBlock(block: DocBlock, redactor: SecretRedactor): DocBlock {
|
|
90
|
+
switch (block.type) {
|
|
91
|
+
case "heading":
|
|
92
|
+
return { ...block, text: redactor.redact(block.text) };
|
|
93
|
+
case "paragraph":
|
|
94
|
+
return {
|
|
95
|
+
...block,
|
|
96
|
+
text: block.text !== undefined ? redactor.redact(block.text) : undefined,
|
|
97
|
+
runs: block.runs ? block.runs.map((r) => redactRun(r, redactor)) : undefined,
|
|
98
|
+
};
|
|
99
|
+
case "list":
|
|
100
|
+
return {
|
|
101
|
+
...block,
|
|
102
|
+
items: block.items.map((i) => redactListItem(i, redactor)),
|
|
103
|
+
};
|
|
104
|
+
case "table":
|
|
105
|
+
return {
|
|
106
|
+
...block,
|
|
107
|
+
headers: block.headers ? block.headers.map((h) => redactor.redact(h)) : undefined,
|
|
108
|
+
cells: block.cells.map((row) => row.map((c) => redactCellValue(c, redactor))),
|
|
109
|
+
};
|
|
110
|
+
case "image":
|
|
111
|
+
return {
|
|
112
|
+
...block,
|
|
113
|
+
alt: block.alt !== undefined ? redactor.redact(block.alt) : undefined,
|
|
114
|
+
};
|
|
115
|
+
case "chart":
|
|
116
|
+
return {
|
|
117
|
+
...block,
|
|
118
|
+
title: block.title !== undefined ? redactor.redact(block.title) : undefined,
|
|
119
|
+
};
|
|
120
|
+
default:
|
|
121
|
+
return block;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function redactSlide(slide: SlideData, redactor: SecretRedactor): SlideData {
|
|
126
|
+
return {
|
|
127
|
+
...slide,
|
|
128
|
+
title: slide.title !== undefined ? redactor.redact(slide.title) : undefined,
|
|
129
|
+
subtitle: slide.subtitle !== undefined ? redactor.redact(slide.subtitle) : undefined,
|
|
130
|
+
notes: slide.notes !== undefined ? redactor.redact(slide.notes) : undefined,
|
|
131
|
+
bullets: slide.bullets
|
|
132
|
+
? slide.bullets.map((b) => (typeof b === "string" ? redactor.redact(b) : (redactListItem(b, redactor) as ListItem)))
|
|
133
|
+
: undefined,
|
|
134
|
+
image: slide.image ? { ...slide.image, alt: slide.image.alt !== undefined ? redactor.redact(slide.image.alt) : undefined } : undefined,
|
|
135
|
+
chart: slide.chart
|
|
136
|
+
? { ...slide.chart, title: slide.chart.title !== undefined ? redactor.redact(slide.chart.title) : undefined }
|
|
137
|
+
: undefined,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function redactSheetData(sheet: SheetData, redactor: SecretRedactor): SheetData {
|
|
142
|
+
return {
|
|
143
|
+
...sheet,
|
|
144
|
+
name: redactor.redact(sheet.name),
|
|
145
|
+
cells: sheet.cells.map((row) => row.map((c) => redactCellValue(c, redactor))),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function redactModel(model: DocumentModel, redactor: SecretRedactor): DocumentModel {
|
|
150
|
+
if (model.kind === "doc") {
|
|
151
|
+
const doc = model as DocModel;
|
|
152
|
+
return {
|
|
153
|
+
...doc,
|
|
154
|
+
title: doc.title !== undefined ? redactor.redact(doc.title) : undefined,
|
|
155
|
+
blocks: doc.blocks.map((b) => redactDocBlock(b, redactor)),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
if (model.kind === "sheet") {
|
|
159
|
+
const sheet = model as SheetModel;
|
|
160
|
+
return {
|
|
161
|
+
...sheet,
|
|
162
|
+
title: sheet.title !== undefined ? redactor.redact(sheet.title) : undefined,
|
|
163
|
+
sheets: sheet.sheets.map((s) => redactSheetData(s, redactor)),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (model.kind === "deck") {
|
|
167
|
+
const deck = model as DeckModel;
|
|
168
|
+
return {
|
|
169
|
+
...deck,
|
|
170
|
+
title: deck.title !== undefined ? redactor.redact(deck.title) : undefined,
|
|
171
|
+
slides: deck.slides.map((s) => redactSlide(s, redactor)),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return model;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Parses OOXML bytes into a Document Model plus a ZIP-name fidelity report of
|
|
179
|
+
* structures the model does not represent (macros, comments, media, …).
|
|
180
|
+
*/
|
|
181
|
+
export async function importDocument(bytes: Uint8Array, options: ParseDocumentOptions): Promise<ImportDocumentResult> {
|
|
182
|
+
const { kind, caps: userCaps, redactor, telemetry } = options;
|
|
183
|
+
|
|
184
|
+
const span = telemetry?.startSpan("documents.parse", {
|
|
185
|
+
"documents.kind": kind,
|
|
186
|
+
"documents.bytes": bytes.byteLength,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
if (!isZipContainer(bytes)) {
|
|
191
|
+
throw new DocumentsParseError("invalid document package: missing ZIP container signature");
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const caps = resolveDocumentCaps(userCaps);
|
|
195
|
+
validateByteCap(bytes.byteLength, caps);
|
|
196
|
+
const fidelity = reportImportFidelity(bytes, kind);
|
|
197
|
+
span?.setAttribute("documents.fidelity_issues", fidelity.issues.length);
|
|
198
|
+
|
|
199
|
+
let model: DocumentModel;
|
|
200
|
+
try {
|
|
201
|
+
switch (kind) {
|
|
202
|
+
case "doc":
|
|
203
|
+
model = parseDocxBytes(bytes);
|
|
204
|
+
break;
|
|
205
|
+
case "sheet":
|
|
206
|
+
model = parseXlsxBytes(bytes);
|
|
207
|
+
break;
|
|
208
|
+
case "deck":
|
|
209
|
+
model = parsePptxBytes(bytes);
|
|
210
|
+
break;
|
|
211
|
+
default:
|
|
212
|
+
throw new DocumentsParseError(`unsupported document kind for parsing: "${String(kind)}"`);
|
|
213
|
+
}
|
|
214
|
+
} catch (err: unknown) {
|
|
215
|
+
if (err instanceof DocumentsParseError) throw err;
|
|
216
|
+
throw new DocumentsParseError(`failed to parse OOXML document package: ${err instanceof Error ? err.message : String(err)}`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
validateModelCaps(model, caps);
|
|
220
|
+
|
|
221
|
+
if (redactor) {
|
|
222
|
+
model = redactModel(model, redactor);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
validateDocumentModel(model);
|
|
226
|
+
|
|
227
|
+
if (model.kind === "doc") {
|
|
228
|
+
span?.setAttribute("documents.blocks", (model as DocModel).blocks.length);
|
|
229
|
+
} else if (model.kind === "sheet") {
|
|
230
|
+
span?.setAttribute("documents.sheets", (model as SheetModel).sheets.length);
|
|
231
|
+
} else if (model.kind === "deck") {
|
|
232
|
+
span?.setAttribute("documents.slides", (model as DeckModel).slides.length);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return { model, fidelity };
|
|
236
|
+
} catch (err) {
|
|
237
|
+
span?.recordError();
|
|
238
|
+
throw err;
|
|
239
|
+
} finally {
|
|
240
|
+
span?.end();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Parses spec-compliant or real-world OOXML package bytes into a typed Prism Document Model.
|
|
246
|
+
*
|
|
247
|
+
* Enforces ZIP magic byte verification, size & element caps, and structural validation.
|
|
248
|
+
* Supports optional P6 text sanitization via SecretRedactor hook.
|
|
249
|
+
*/
|
|
250
|
+
export async function parseDocument(bytes: Uint8Array, options: ParseDocumentOptions): Promise<DocumentModel> {
|
|
251
|
+
return (await importDocument(bytes, options)).model;
|
|
252
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { DocumentsValidationError } from "./errors.js";
|
|
2
|
+
import { type DocumentPatch, patchDocument } from "./patch.js";
|
|
3
|
+
import type { DocumentModel } from "./types.js";
|
|
4
|
+
|
|
5
|
+
export interface PatchHistory {
|
|
6
|
+
/** Returns the current document model state. */
|
|
7
|
+
getModel(): DocumentModel;
|
|
8
|
+
/** Applies one or more patch operations, pushing the prior state onto the undo stack and clearing redo history. */
|
|
9
|
+
apply(patches: readonly DocumentPatch[]): DocumentModel;
|
|
10
|
+
/** Reverts the last applied patch operation, pushing current state onto the redo stack. */
|
|
11
|
+
undo(): DocumentModel;
|
|
12
|
+
/** Reapplies the most recently reverted patch operation. */
|
|
13
|
+
redo(): DocumentModel;
|
|
14
|
+
/** Returns true if undo is available. */
|
|
15
|
+
canUndo(): boolean;
|
|
16
|
+
/** Returns true if redo is available. */
|
|
17
|
+
canRedo(): boolean;
|
|
18
|
+
/** Current number of states on the undo stack. */
|
|
19
|
+
readonly undoCount: number;
|
|
20
|
+
/** Current number of states on the redo stack. */
|
|
21
|
+
readonly redoCount: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Creates an in-memory undo/redo history manager for interactive document editing workflows.
|
|
26
|
+
*
|
|
27
|
+
* Enforces typed patch validation at each step without collaboration or CRDT overhead.
|
|
28
|
+
*/
|
|
29
|
+
export function createPatchHistory(initialModel: DocumentModel): PatchHistory {
|
|
30
|
+
let currentModel = structuredClone(initialModel);
|
|
31
|
+
const undoStack: DocumentModel[] = [];
|
|
32
|
+
let redoStack: DocumentModel[] = [];
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
getModel(): DocumentModel {
|
|
36
|
+
return structuredClone(currentModel);
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
apply(patches: readonly DocumentPatch[]): DocumentModel {
|
|
40
|
+
const next = patchDocument(currentModel, patches);
|
|
41
|
+
undoStack.push(currentModel);
|
|
42
|
+
redoStack = [];
|
|
43
|
+
currentModel = next;
|
|
44
|
+
return structuredClone(currentModel);
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
undo(): DocumentModel {
|
|
48
|
+
if (undoStack.length === 0) {
|
|
49
|
+
throw new DocumentsValidationError("cannot undo: patch history undo stack is empty");
|
|
50
|
+
}
|
|
51
|
+
redoStack.push(currentModel);
|
|
52
|
+
currentModel = undoStack.pop()!;
|
|
53
|
+
return structuredClone(currentModel);
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
redo(): DocumentModel {
|
|
57
|
+
if (redoStack.length === 0) {
|
|
58
|
+
throw new DocumentsValidationError("cannot redo: patch history redo stack is empty");
|
|
59
|
+
}
|
|
60
|
+
undoStack.push(currentModel);
|
|
61
|
+
currentModel = redoStack.pop()!;
|
|
62
|
+
return structuredClone(currentModel);
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
canUndo(): boolean {
|
|
66
|
+
return undoStack.length > 0;
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
canRedo(): boolean {
|
|
70
|
+
return redoStack.length > 0;
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
get undoCount(): number {
|
|
74
|
+
return undoStack.length;
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
get redoCount(): number {
|
|
78
|
+
return redoStack.length;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|