diff --git a/AGENTS.md b/AGENTS.md index d5c4ccc53..64bd8a996 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -25,7 +25,7 @@ See [docs/architecture.mermaid](docs/architecture.mermaid) for a visual architec - `src/main.ts`: MCP adapter. Parses config, wires the shared session runtime, starts stdio transport, and owns process-lifetime shutdown. - `src/cli.ts`: one-shot CLI adapter for setup, diagnostics, analysis, and decompilation. - `src/config.ts`: Zod-validated parsing of environment configuration into `AppConfig`. -- `src/domain/`: pure, side-effect-free modules. `errors.ts` owns the tagged error algebra; `result.ts` owns `Result`/`ok`/`err`; `hopperValues.ts` owns shared function-dossier values plus Hopper boundary parsers; `symbolAnalysis.ts` parses Swift/ObjC names; `javascriptApplicationGraph.ts` validates and canonically commits the provider-neutral JavaScript Application Graph without performing I/O. +- `src/domain/`: pure, side-effect-free modules. `errors.ts` owns the tagged error algebra; `result.ts` owns `Result`/`ok`/`err`; `hopperValues.ts` owns shared function-dossier values plus Hopper boundary parsers; `symbolAnalysis.ts` parses Swift/ObjC names; `javascriptApplicationGraph.ts` validates and canonically commits the provider-neutral JavaScript Application Graph; `javascriptStaticAnalysis.ts` performs bounded AST-only JavaScript structure recovery. - `src/contracts/`: caller-visible schemas for 33 direct, 10 enhanced, 5 native, 2 artifact, 8 browser, 2 Electron, and 18 session tools; `enhancedInputs.ts` owns enhanced input parsing. - `src/process/`: provider-neutral process ownership and lifecycle primitives. It owns private runtime roots, absolute startup deadlines, correlated request waits, bounded output capture, and TERM-to-KILL cleanup without defining any provider wire protocol. - `src/browser/`: loopback CDP discovery, bounded WebSocket transport, exact-origin target authorization, and passive browser observation normalization. @@ -33,10 +33,10 @@ See [docs/architecture.mermaid](docs/architecture.mermaid) for a visual architec - `bridge/hopper_bridge.py`: runs inside Hopper and adapts declared operations to Hopper's public Python API. Hopper's bundled MCP server is not used. - `src/ghidra/`: exact Ghidra 12.1.2/JDK 21 inspection, analysis-profile commitment, isolated `analyzeHeadless` launch, authenticated Unix-socket client, bounded serial request queue, and strict inventory/function boundaries. - `bridge/ghidra/ReaGhidraBridge.java`: packaged read-only `HeadlessScript` loaded through Ghidra's `scriptPath`; it owns the persistent decompiler and adapts admitted inventory, function, reference, and CFG operations to public Ghidra APIs. -- `src/application/`: shared CLI/MCP session composition, setup and diagnostics, and enhanced workflows. `AnalysisProviderRegistry` discovers overlapping deep candidates without starting them; `SessionProviderRouter` binds one candidate per target and composes it with disjoint auxiliary providers. +- `src/application/`: shared CLI/MCP session composition, setup and diagnostics, and enhanced workflows. `AnalysisProviderRegistry` discovers overlapping deep candidates without starting them; `SessionProviderRouter` binds one candidate per target and composes it with disjoint auxiliary providers; `JavaScriptArtifactReconstruction.ts` safely projects local directories/ASARs and inert bundle syntax into the application graph without adding a caller-visible tool yet. - `src/server/`: MCP request translation. `createServer.ts` assembles the MCP server, `registerOfficialTools.ts`/`registerEnhancedTools.ts` register each tool set, `toolResult.ts` maps `Result` values to MCP content. - `docs/product-catalog.json`: generated package, tool-family, provider, setup-client, schema-version, and CLI facts. Regenerate it from source; do not edit it by hand. -- `tests/`: Vitest suite. `tests/fixtures/` holds reusable provider-process fixtures, a source-owned synthetic JavaScript application graph, and the fake launcher, Hopper bridge, and CDP seams. +- `tests/`: Vitest suite. `tests/fixtures/` holds reusable provider-process fixtures, source-owned synthetic JavaScript graph and Electron/Webpack/Rspack artifact trees, and the fake launcher, Hopper bridge, and CDP seams. - `scripts/verify-real-hopper.mjs`: real-Hopper end-to-end verifier. - `scripts/verify-real-ghidra.mjs`: real Linux Ghidra verifier for x86-64 debug/stripped ELF, AArch64 ELF, PE, and Mach-O function semantics plus complete cleanup. - `scripts/verify-real-browser.mjs`: real Chrome end-to-end verifier for the passive CDP provider. diff --git a/README.md b/README.md index 271307550..fec2be2f6 100644 --- a/README.md +++ b/README.md @@ -341,6 +341,7 @@ REA is already useful for native application, browser, and Electron investigatio - Attach to a user-owned Chrome-family browser over a configured loopback CDP endpoint; capture exact-origin web structure, safe metadata, approved value-free payload shapes, bundle/source-map evidence, WebMCP declarations, user-action timelines, capture diffs, and explicitly approved screenshots without navigation or JavaScript evaluation. - Inspect Electron `file://` renderer pages through a separate canonical-root permission boundary without invoking Electron APIs; script contents remain separately approved and byte bounded. - Validate and canonically serialize a provider-neutral [JavaScript Application Graph v1](docs/javascript-application-graph.md) spanning packages, ASAR entries, Electron roles, JavaScript/source-map entities, browser/runtime instances, IPC, endpoints, storage, and native add-ons. This shipped domain contract performs no extraction or I/O by itself. +- Reconstruct bounded static package, entrypoint, Webpack/Rspack module, import, worker, endpoint, storage, source-map, and native-add-on structure from a local directory or ASAR through an AST-only [application service](docs/javascript-artifact-reconstruction.md). The service does not execute bootstrap code and does not add a standalone CLI/MCP tool yet. - Traverse content-addressed artifact graphs without extraction; on macOS, read-only DMG traversal additionally requires `native_mount_approved: true` and `REA_ARTIFACT_NATIVE_MOUNT_ENABLED=true`. Materialize only approved occurrences into absent output roots. - Build bounded function dossiers with pseudocode, assembly, CFG edges, comments, calls, references, strings, and names. - Search and trace features across symbols, strings, metadata, references, and call paths. @@ -385,13 +386,13 @@ REA is growing into a toolkit for understanding software across static artifacts ### Now 1. **Maintain truthful product metadata** — extend the shipped canonical catalog and drift checks whenever versions, tools, providers, schemas, setup clients, or CLI capabilities change. -2. **JavaScript application graph extractors** — populate the shipped v1 domain graph from artifact inventories, bundle analysis, source maps, Electron boundaries, passive runtime observations, and native analysis without widening authority. +2. **Electron boundary extraction and high-level surface** — extend the shipped static artifact projector with contextBridge, IPC, utility-process, and native-export boundaries, then expose one provider-neutral CLI/MCP workflow without widening authority. 3. **Cross-provider conformance growth** — add source-owned architectures and difficult indirect/thunk cases while preserving semantic comparison and provider-specific text boundaries. ### Next 1. **Cross-layer tracing and version comparison** — trace renderer behavior through preload, IPC, main-process, storage, network, and native boundaries, then compare those paths across application versions. -2. **Deeper JavaScript and source recovery** — add bounded Webpack/Rspack module reconstruction, stable structural fingerprints, historical-source matching, and stronger static/runtime reconciliation. +2. **Deeper JavaScript and source recovery** — add historical-source matching, rechunked/minified cross-version matching, and stronger static/runtime reconciliation on top of the shipped AST-only Webpack/Rspack reconstruction. 3. **Deterministic behavior harnesses** — extend process ownership, protocol fixtures, filesystem observation, reconnects, and cross-version behavioral comparison. ### Later diff --git a/docs/api/assets/hierarchy.js b/docs/api/assets/hierarchy.js index 643dfbdbc..ee55288c3 100644 --- a/docs/api/assets/hierarchy.js +++ b/docs/api/assets/hierarchy.js @@ -1 +1 @@ -window.hierarchyData = "eJylmVFvpCoUx7+Lz6xXEUH71p307jbZ3E7a3fThppkwSqekDnjRadNs9rvfoJ0WB6xoX6aV+D/nBxwOcPwdKCnbJjj7F6EUgiSOMv0bJzGAGGUZSPIIEoBSmEEASQRzEENMMgAJynIQExLHdyBQ7L5iRculaIKz34G2pf8KumfBWXAuaPXS8OZCKakCEDxyUQZnMcxAcFBVcBYUFW0a1vxVyj3lYsP0e004kIUP7b4KQP9qcBa0TflF2/nSN4CgeOBVqZjouoIRQIhggHQXEMpzgNIY6m5ggNJE/+AIoFS/kuYxQDhCAGGYAYRRBBBOIUAYpwDpviKSIoAIxgARov/T9nKIk7s/INDOjL5+l3XN1MyeGqJZ/cRZDhDWNCQiABEYAUQSTYjSno1gxzyslWxlIauF8zGQT/B2EFnmgLgU9aFdSPCu9XGf5w73V4d2uX9D7AGQxq7FsKI13fKKty+/BH2ivKLbii3kGbflgwddMbKiomBVxcrFSKbeByNxYfzkeyYXz5Op9kHAkYGwVvKJl0zdsNfUNhPCrffBGCzao5nzktbt7MziUvsg5LGB8FXJ54apq23D1BNdMBQjBjxAcGQm13PV8ntatFc1U0s43HofDGimsAs9pKJgl6JlO8Xbl5kYbr0PBoocGD/4ns9dIbbWx/1gVz+a+JvPzluW1Mc5Tg3nl+KJNS3fdbN4K9VjU9NiLsYHRnyAiBkTv8SjkM/imu1406q5EeFS+yBkuXX0WJYxba2P+9x2v3TfcKk9EEhELISFxxuH2AcARhbANdvLdm4wWlIf54l99FwrWbBm7lnb1vq4R6nl/qalalnwvSt9XKdmz1dS3PPdYdGeYGt93GNzi/5HfuWCqperms31bkl9nBOz773+J1U7NnfcLamP88GaXzO1503Dpbhm/x24mr3sRwxMg3S3UCfJTSFr9kYAU3wk4KJl6p4W7xD1m2gtK168hCdWRjHeTA0vZDHEGdYX5Bzf9YwZHh0t1rSfpny148HZ4+RunG+Kis/DdFY8UXTdwEC5ZVu9GYtWqpdr1siD0qej+uAJ9WzIw1Fbs2eTEIjuelpoLrmbVt+vbtn2aH4BpWXDb+B0UWZ4NOfljv2gB1E8TFA8dFl2YyqYCs1Hf4RsBIGpT0Ow8cU/Mk8QpxG868jSCFo70nldV7zo0rsF6chPbsJRU9OZCmKcxK5turuYeaAMBeHJ47R/Eg3OKN8eeKmoV8jsulc3poKp0Hz0DBldOBxBmAyZaYgFIUOivkLW/WORfWe0rFjT+MTLR3indrwmiyQWj0+wDDjeouPk0cM/GtwpjsrXk6FX1NT9u5sTbei0NX+xoyzuKtFRP384HpwEy/q12OAzZtv+1Y2tCh1Nk4OXRNEgM67K+kLXfpQUM2lOZaGrbZpHV/Ndtc9j+WMt1dQOS99T3sYoAPcEToNzZ1RTZiDBiGR3r9CuevGq4mzykOJF21vyy1zdpxB3CX04n5/gmZzQkYFDMMXdxxqC+4GLx6r9nfkVFSUvaTt1WpnF/GZ0QQYmCej2xg4+IVFm3WpuWHew/GjRmLQDUTh8ml4sOgDHCGYuFEsb2i1zV4keoG6k9Ae5D4uzc2GdBhw12yXYXX7uPkXpYB1c2fe1bHjLfDKjiWsJQ7vF56PHIDMec+vyURyxEI61z51+vbV046i/Ow43aL2ZrmjdHtR0zclEdkhDV9vEaP758z+sH1dZ" \ No newline at end of file +window.hierarchyData = "eJy1mV1P3DgUhv9Lrt1s4vgj4Y6O2LarakHQqhcrhExiBquZOOt4YFHFf6+cMOBghzhBezPgKO85j+3jY/vkV6Sk1F109A9CGIIszdLU/JIE4KSgCEBCUwqyAmICEMZpCiCFOAcpLBIKIKVpDlJaoOQSRIrf1LzUQjZddPQrMhbN34bteHQUHTesfuhEd6KUVBGIfoqmio5SmINor+roKCpr1nW8+6OSOyaaK27e6+KRLL7VuzoCw6vRUaS76oOx82F4AKLyVtSV4k3fIYIAQpQAhPIcIFQUAOEUAoSh6UtmfkgCEDav4CIFiCQIIAJzgAhKACIYAkQIBojQHCCKEUCUEIAoNf8VBcAZJvTyEUTGmdXXz7JtuVrYU0u0qJ8kLwAipnc0oQBRmABEM0OI8MBGiWcezpTUspT1yvkYyWd4e4g890B8adq9Xknwog1xXxQe96d7vd6/JQ4AwKlvMWxYy65FLfTD94bdMVGz65qv5Jm2FYIHfTGyYU3J65pXq5FsfQhG5sP4JnZcrp4nWx2CQBIL4UzJO1FxdcGfUttCCL8+BGO0aA9mjivW6sWZxacOQShSC+GjkvcdV6fXHVd3bMVQTBgIACGJnVyPlRY3rNSnLVdrOPz6EAxop7ATM6RNyb80mm+V0A8LMfz6EAyUeDC+ip1YukJcbYj70a5+MPGnWJy3HGmIc4It51+aO95pse1n8YdUP7uWlUsx3jASAkTtmPje/GzkfXPOt6LTamlE+NQhCHnhHD3WZUxXG+K+cN2v3Td86gAEmlAHYeXxxiMOAYCJA3DOd1IvDUZHGuI8c4+eZ0qWvFt61na1Ie4RdtxfaKbWBd+LMsQ1tnu+kc2N2O5X7QmuNsQ9sbfov+VH0TD1cNrypd4daYhzavd90H9jasuXjrsjDXE+WvNnXO1E1wnZnPN/90ItXvYTBuZB+luol+SilC1/JjC31ycC0Wiublj5AtE+i85kLcqH+JWVSYxnU+MLWQqLFJsLMuyvX31zcrR4p99N+WQngHPAgX6cT4o174fprQSimLqBhfKDX5vNuNFSPZzzTu6VOR21+0Coe0seT9paPJu0wNnlQIszi/ZCm/vVD359ML+C0rERNnCmKJOMjuai2vKvbN+UtzMUt32WvbIVXMV2MxyBTiBw9W4IPr34J+YJEpqllwNZljo70nHb1qLs07sD6clPfsJJU/OZCpKcuGeEw8UsAGUsiF815/1TiOyc/elWVIoFhcy2f/XKVnAV283AkDGFwwmE2ZCZh1gRMhRSdDmQjXbTwexnzqqad11IvLyF99pOyGRlCXR4QoJlxPEcHa+aAf5pmnuqD08nw6CoaYd3r15pY6+tFYs9TUAf08P85chOzZuqfSo2hIzZ9fDqlauKPY9mBy9LslFm3FTtian9KNkspHkti33P5nlMTd9X+zyUP86kmtth2UvKu7IKwAOB1+DSGTWUFGSEJn09vW/6CpK14LOHlCDawVJY5uo/iPhL6OP5fAfP7IRODByCtDCfbFCCh4FDCX4DdcOaSlRMz51WFjE/G12egbMEgn5v7OGzIqPOreaC9wfLtxaNTTsSxePW/GIh41rCSL5woTja2H2ydJWYAepHynyQe7M4uxTWa8BTs12D3efn/lOUCdbRlX3Xyk5oHpIZbVxHGLtPAgrceJQZD7l1/ShOWIinni+dfrO1mHHsv83aq7zTJ9U26LJk4/7F7thFqUSrDzXxT4q1txvZaP6fjm2rS1FxClG/pvt/RjXbG65M2fd/AHZth+X3/jPu+LxjziYb1uq9mi/h2YQeaex7NhOcj4+/AVPozLw=" \ No newline at end of file diff --git a/docs/api/assets/navigation.js b/docs/api/assets/navigation.js index f0141aef8..047a55828 100644 --- a/docs/api/assets/navigation.js +++ b/docs/api/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "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" \ No newline at end of file +window.navigationData = "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" \ No newline at end of file diff --git a/docs/api/assets/search.js b/docs/api/assets/search.js index c159096ee..ec0e62bcb 100644 --- a/docs/api/assets/search.js +++ b/docs/api/assets/search.js @@ -1 +1 @@ -window.searchData = "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R1qz4rh9deWPYmsO2MFPtx4ptpXwEB1uZ92244NyuOEVR+Prn366eX1z9XbV8Tj68fpB3Q7W2vi4frzBKNCm43O8w5d5XN/QzJMe19fFP/vZdstubHu2PW8HNj/bbtmR055tL7FD659tt+/PxmfbzbtDrnj8ShJe8443ufYKs/28Dq98U2nQtscRutLWe8PylsMjxre9tWXxEeTNWnckf3n38OTdY/rZ6vvGv324eePlX7+8e5jScAl6cTNs9a3Hw3cr8LQP795cLWra6ga9+BhqS7tovOXEO1xjxSn6uCG6+rmHMkqmaQKi7x6uHj68X3NKzlbYejrGWwyPzHybW1oTH6d5U9YfsVVPcIe/XX0iHqz0dB0j3dI8wimHZfmR7ZSyxi2NPaO6ceVmnqHIcdsOnlnreO5ubil53LZjmysfz9yVTUV4m3Zley3embuyvSRv0/6cWJl35k5tq33btEMnlMCduzMrK+G27caWgrgzd8BnLL9+89maV+1VjZ8CXq1+wV7f8Pj5YeV7z9GmVt6WN98Z588KH26nOp2P06WEjwrzn65+olrYyvyAkO2s2zY5HGTDC0fj/ThqT9Vmwc/WHoWb998F8WfHALcwW3XV3uPuBNnqUzuf3DS+/pnti/4y+3z269lNTE7kp4t/oYO5nf/46qv//PHVfkLmrz5/9eOfvvjy1Y/ffP3lF5+z6acXthaG2XJUjnY1bu033379+avvvju9nccBLtDCmnotu98S7LNvv//iT599/v2Pn3/979989u0X33391cdpr7f+DT8+iv74+uPXiH1Vp/fpumyz//CXr/745auLNPqvXkz0/E3+/LMvv/zxm8++//PpTX199fbtj/vpm56riX/+7Kt/e/XHH//w6s+f/ccXX397Rkv/dnX78/WbH/96/berX2/u7p+pwX/6y1eff//F119dJBEeL6bPnwofz+pTm/rY//J5mvftq8+//uq777/9yzi2J7dy/1F7Ghrz5tmO5Xfff/b9F5//+O1fvvr+i39/dXpj3z9cPdy83j/f7AcnulBjZ3fKh7u7t1/e/fzzze3PUQsPfrL22eXt3c/7Brz6x/XrD8uPb4fBca1Vd5fDHXhiPw8RAr9AkX0mP1+7/09tjR4Gtr317eBHhjXiyaN01A+cHpigp3dwLD6/ejshUDDN9jw2rrRhh30b/+9/vfzk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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/api/classes/application_JavaScriptArtifactGraphAccumulator.JavaScriptArtifactGraphAccumulator.html b/docs/api/classes/application_JavaScriptArtifactGraphAccumulator.JavaScriptArtifactGraphAccumulator.html new file mode 100644 index 000000000..9fa86466a --- /dev/null +++ b/docs/api/classes/application_JavaScriptArtifactGraphAccumulator.JavaScriptArtifactGraphAccumulator.html @@ -0,0 +1,135 @@ +JavaScriptArtifactGraphAccumulator | rea-agents - v1.6.0
+
rea-agents - v1.6.0 + +
    +
    +
    Preparing search index...
    +
    +
    + +
    +

    Deduplicate graph entities while retaining distinct evidence observations.

    +
    +
    +
    +
    +
    Index
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
      +
    • + +
      +

      Create or replace one canonical edge by semantic identifier.

      +
      +
      +

      Parameters

      +
        +
      • input: unknown
      +

      Returns {
          edge_id: string;
          evidence: {
              artifact:
                  | { artifact_id: string; available: true; sha256: string }
                  | {
                      available: false;
                      detail: string;
                      reason:
                          | "unknown"
                          | "truncated"
                          | "unresolved"
                          | "not-applicable"
                          | "not-approved"
                          | "not-observed"
                          | "provider-unavailable";
                  };
              authority: | "unknown"
              | "controlled-replay"
              | "historical-reference"
              | "artifact-bytes"
              | "ast-static-analysis"
              | "static-relationship-inference"
              | "passive-cdp-runtime"
              | "native-analysis-provider"
              | "user-assertion";
              confidence: "unknown"
              | "exact"
              | "low"
              | "medium"
              | "high";
              coverage: {
                  limits: {
                      name: string;
                      unit:
                          | "other"
                          | "items"
                          | "bytes"
                          | "depth"
                          | "instructions"
                          | "milliseconds"
                          | "characters";
                      value: number;
                  }[];
                  omitted_count: number
                  | null;
                  status: "unknown" | "unavailable" | "complete" | "partial";
                  truncated: boolean;
              };
              evidence_ids: string[];
              extractor: {
                  executable_sha256: string
                  | null;
                  name: string;
                  operation: string;
                  version: string;
              };
              limitations: string[];
              location: | {
                  available: false;
                  detail: string;
                  reason: | "unknown"
                  | "truncated"
                  | "unresolved"
                  | "not-applicable"
                  | "not-approved"
                  | "not-observed"
                  | "provider-unavailable";
              }
              | {
                  available: true;
                  value: | {
                      end: { column: number; line: number };
                      kind: "source-range";
                      source: string;
                      start: { column: number; line: number };
                  }
                  | { end: number; kind: "file-offset-range"; start: number }
                  | { kind: "artifact-path"; path: string }
                  | { kind: "url"; url: string }
                  | {
                      capture_sha256: string;
                      frame_key: string | null;
                      kind: "runtime";
                      script_key: string | null;
                      target_key: string;
                  }
                  | { address: string; kind: "native-address"; symbol: string
                  | null }
                  | { export_path: string; kind: "package-export"; package_name: string };
              };
              state: "unknown"
              | "observed"
              | "inferred"
              | "unavailable";
          };
          identifier_strategy: {
              stability: "relationship-exact";
              strategy: "semantic-content-sha256";
          };
          properties: Record<string, JSONType>;
          relation:
              | "contains"
              | "loads"
              | "calls"
              | "imports"
              | "maps_to"
              | "exposes"
              | "sends"
              | "invokes"
              | "handles"
              | "persists_to"
              | "observed_as"
              | "changed_from";
          source_node_id: string;
          target_node_id: string;
      }

    +
    + +
      +
    • + +
      +

      Create or merge one canonical node.

      +
      +
      +

      Parameters

      +
        +
      • input: unknown
      +

      Returns {
          identity:
              | {
                  sha256: string;
                  stability: "global-exact";
                  strategy: "content-digest";
              }
              | {
                  original_source: string;
                  source_map_sha256: string;
                  source_sha256: string
                  | null;
                  stability: "source-map-exact";
                  strategy: "source-map-original";
              }
              | {
                  artifact_sha256: string;
                  path: string;
                  stability: "artifact-version";
                  strategy: "canonical-path";
              }
              | {
                  algorithm: string;
                  basis: (
                      | "imports"
                      | "exports"
                      | "control-flow"
                      | "syntax-tree"
                      | "literals"
                      | "api-usage"
                  )[];
                  fingerprint_sha256: string;
                  stability: "cross-version-inference";
                  strategy: "structural-fingerprint";
              }
              | {
                  artifact_sha256: string;
                  key: string;
                  namespace: string;
                  stability: "artifact-version";
                  strategy: "artifact-local-key";
              }
              | {
                  capture_sha256: string;
                  runtime_key: string;
                  stability: "capture-only";
                  strategy: "runtime-instance";
              }
              | {
                  observation_sha256: string;
                  scope: string;
                  stability: "observation-only";
                  strategy: "observation-fingerprint";
              };
          kind: | "unknown"
          | "target"
          | "native-addon"
          | "source-map"
          | "artifact"
          | "package"
          | "storage"
          | "worker"
          | "frame"
          | "endpoint"
          | "service-worker"
          | "installer"
          | "asar-entry"
          | "electron-main"
          | "electron-preload"
          | "electron-renderer"
          | "electron-utility"
          | "javascript-asset"
          | "javascript-chunk"
          | "javascript-module"
          | "source-module"
          | "browser-window"
          | "context-bridge-api"
          | "ipc-channel"
          | "ipc-handler"
          | "native-export"
          | "runtime-script-instance";
          node_id: string;
          observations: {
              evidence: {
                  artifact: | { artifact_id: string; available: true; sha256: string }
                  | {
                      available: false;
                      detail: string;
                      reason:
                          | "unknown"
                          | "truncated"
                          | "unresolved"
                          | "not-applicable"
                          | "not-approved"
                          | "not-observed"
                          | "provider-unavailable";
                  };
                  authority: | "unknown"
                  | "controlled-replay"
                  | "historical-reference"
                  | "artifact-bytes"
                  | "ast-static-analysis"
                  | "static-relationship-inference"
                  | "passive-cdp-runtime"
                  | "native-analysis-provider"
                  | "user-assertion";
                  confidence: "unknown"
                  | "exact"
                  | "low"
                  | "medium"
                  | "high";
                  coverage: {
                      limits: {
                          name: string;
                          unit:
                              | "other"
                              | "items"
                              | "bytes"
                              | "depth"
                              | "instructions"
                              | "milliseconds"
                              | "characters";
                          value: number;
                      }[];
                      omitted_count: number
                      | null;
                      status: "unknown" | "unavailable" | "complete" | "partial";
                      truncated: boolean;
                  };
                  evidence_ids: string[];
                  extractor: {
                      executable_sha256: string
                      | null;
                      name: string;
                      operation: string;
                      version: string;
                  };
                  limitations: string[];
                  location: | {
                      available: false;
                      detail: string;
                      reason: | "unknown"
                      | "truncated"
                      | "unresolved"
                      | "not-applicable"
                      | "not-approved"
                      | "not-observed"
                      | "provider-unavailable";
                  }
                  | {
                      available: true;
                      value: | {
                          end: { column: number; line: number };
                          kind: "source-range";
                          source: string;
                          start: { column: number; line: number };
                      }
                      | { end: number; kind: "file-offset-range"; start: number }
                      | { kind: "artifact-path"; path: string }
                      | { kind: "url"; url: string }
                      | {
                          capture_sha256: string;
                          frame_key: string | null;
                          kind: "runtime";
                          script_key: string | null;
                          target_key: string;
                      }
                      | { address: string; kind: "native-address"; symbol: string
                      | null }
                      | { export_path: string; kind: "package-export"; package_name: string };
                  };
                  state: "unknown"
                  | "observed"
                  | "inferred"
                  | "unavailable";
              };
              identifier_strategy: {
                  stability: "observation-exact";
                  strategy: "semantic-content-sha256";
              };
              label: string
              | null;
              observation_id: string;
              properties: Record<string, JSONType>;
          }[];
      }

    +
    + +
      +
    • + +
      +

      Return all accumulated canonical edges.

      +
      +

      Returns readonly {
          edge_id: string;
          evidence: {
              artifact:
                  | { artifact_id: string; available: true; sha256: string }
                  | {
                      available: false;
                      detail: string;
                      reason:
                          | "unknown"
                          | "truncated"
                          | "unresolved"
                          | "not-applicable"
                          | "not-approved"
                          | "not-observed"
                          | "provider-unavailable";
                  };
              authority: | "unknown"
              | "controlled-replay"
              | "historical-reference"
              | "artifact-bytes"
              | "ast-static-analysis"
              | "static-relationship-inference"
              | "passive-cdp-runtime"
              | "native-analysis-provider"
              | "user-assertion";
              confidence: "unknown"
              | "exact"
              | "low"
              | "medium"
              | "high";
              coverage: {
                  limits: {
                      name: string;
                      unit:
                          | "other"
                          | "items"
                          | "bytes"
                          | "depth"
                          | "instructions"
                          | "milliseconds"
                          | "characters";
                      value: number;
                  }[];
                  omitted_count: number
                  | null;
                  status: "unknown" | "unavailable" | "complete" | "partial";
                  truncated: boolean;
              };
              evidence_ids: string[];
              extractor: {
                  executable_sha256: string
                  | null;
                  name: string;
                  operation: string;
                  version: string;
              };
              limitations: string[];
              location: | {
                  available: false;
                  detail: string;
                  reason: | "unknown"
                  | "truncated"
                  | "unresolved"
                  | "not-applicable"
                  | "not-approved"
                  | "not-observed"
                  | "provider-unavailable";
              }
              | {
                  available: true;
                  value: | {
                      end: { column: number; line: number };
                      kind: "source-range";
                      source: string;
                      start: { column: number; line: number };
                  }
                  | { end: number; kind: "file-offset-range"; start: number }
                  | { kind: "artifact-path"; path: string }
                  | { kind: "url"; url: string }
                  | {
                      capture_sha256: string;
                      frame_key: string | null;
                      kind: "runtime";
                      script_key: string | null;
                      target_key: string;
                  }
                  | { address: string; kind: "native-address"; symbol: string
                  | null }
                  | { export_path: string; kind: "package-export"; package_name: string };
              };
              state: "unknown"
              | "observed"
              | "inferred"
              | "unavailable";
          };
          identifier_strategy: {
              stability: "relationship-exact";
              strategy: "semantic-content-sha256";
          };
          properties: Record<string, JSONType>;
          relation:
              | "contains"
              | "loads"
              | "calls"
              | "imports"
              | "maps_to"
              | "exposes"
              | "sends"
              | "invokes"
              | "handles"
              | "persists_to"
              | "observed_as"
              | "changed_from";
          source_node_id: string;
          target_node_id: string;
      }[]

    +
    + +
      +
    • + +
      +

      Return all accumulated canonical nodes.

      +
      +

      Returns readonly {
          identity:
              | {
                  sha256: string;
                  stability: "global-exact";
                  strategy: "content-digest";
              }
              | {
                  original_source: string;
                  source_map_sha256: string;
                  source_sha256: string
                  | null;
                  stability: "source-map-exact";
                  strategy: "source-map-original";
              }
              | {
                  artifact_sha256: string;
                  path: string;
                  stability: "artifact-version";
                  strategy: "canonical-path";
              }
              | {
                  algorithm: string;
                  basis: (
                      | "imports"
                      | "exports"
                      | "control-flow"
                      | "syntax-tree"
                      | "literals"
                      | "api-usage"
                  )[];
                  fingerprint_sha256: string;
                  stability: "cross-version-inference";
                  strategy: "structural-fingerprint";
              }
              | {
                  artifact_sha256: string;
                  key: string;
                  namespace: string;
                  stability: "artifact-version";
                  strategy: "artifact-local-key";
              }
              | {
                  capture_sha256: string;
                  runtime_key: string;
                  stability: "capture-only";
                  strategy: "runtime-instance";
              }
              | {
                  observation_sha256: string;
                  scope: string;
                  stability: "observation-only";
                  strategy: "observation-fingerprint";
              };
          kind: | "unknown"
          | "target"
          | "native-addon"
          | "source-map"
          | "artifact"
          | "package"
          | "storage"
          | "worker"
          | "frame"
          | "endpoint"
          | "service-worker"
          | "installer"
          | "asar-entry"
          | "electron-main"
          | "electron-preload"
          | "electron-renderer"
          | "electron-utility"
          | "javascript-asset"
          | "javascript-chunk"
          | "javascript-module"
          | "source-module"
          | "browser-window"
          | "context-bridge-api"
          | "ipc-channel"
          | "ipc-handler"
          | "native-export"
          | "runtime-script-instance";
          node_id: string;
          observations: {
              evidence: {
                  artifact: | { artifact_id: string; available: true; sha256: string }
                  | {
                      available: false;
                      detail: string;
                      reason:
                          | "unknown"
                          | "truncated"
                          | "unresolved"
                          | "not-applicable"
                          | "not-approved"
                          | "not-observed"
                          | "provider-unavailable";
                  };
                  authority: | "unknown"
                  | "controlled-replay"
                  | "historical-reference"
                  | "artifact-bytes"
                  | "ast-static-analysis"
                  | "static-relationship-inference"
                  | "passive-cdp-runtime"
                  | "native-analysis-provider"
                  | "user-assertion";
                  confidence: "unknown"
                  | "exact"
                  | "low"
                  | "medium"
                  | "high";
                  coverage: {
                      limits: {
                          name: string;
                          unit:
                              | "other"
                              | "items"
                              | "bytes"
                              | "depth"
                              | "instructions"
                              | "milliseconds"
                              | "characters";
                          value: number;
                      }[];
                      omitted_count: number
                      | null;
                      status: "unknown" | "unavailable" | "complete" | "partial";
                      truncated: boolean;
                  };
                  evidence_ids: string[];
                  extractor: {
                      executable_sha256: string
                      | null;
                      name: string;
                      operation: string;
                      version: string;
                  };
                  limitations: string[];
                  location: | {
                      available: false;
                      detail: string;
                      reason: | "unknown"
                      | "truncated"
                      | "unresolved"
                      | "not-applicable"
                      | "not-approved"
                      | "not-observed"
                      | "provider-unavailable";
                  }
                  | {
                      available: true;
                      value: | {
                          end: { column: number; line: number };
                          kind: "source-range";
                          source: string;
                          start: { column: number; line: number };
                      }
                      | { end: number; kind: "file-offset-range"; start: number }
                      | { kind: "artifact-path"; path: string }
                      | { kind: "url"; url: string }
                      | {
                          capture_sha256: string;
                          frame_key: string | null;
                          kind: "runtime";
                          script_key: string | null;
                          target_key: string;
                      }
                      | { address: string; kind: "native-address"; symbol: string
                      | null }
                      | { export_path: string; kind: "package-export"; package_name: string };
                  };
                  state: "unknown"
                  | "observed"
                  | "inferred"
                  | "unavailable";
              };
              identifier_strategy: {
                  stability: "observation-exact";
                  strategy: "semantic-content-sha256";
              };
              label: string
              | null;
              observation_id: string;
              properties: Record<string, JSONType>;
          }[];
      }[]

    +
    + +
    +
    + +
    +
    diff --git a/docs/api/classes/application_PermissionAuthority.PermissionPathError.html b/docs/api/classes/application_PermissionAuthority.PermissionPathError.html index 55b0cc83a..029da36b9 100644 --- a/docs/api/classes/application_PermissionAuthority.PermissionPathError.html +++ b/docs/api/classes/application_PermissionAuthority.PermissionPathError.html @@ -14,7 +14,7 @@

    Failure to establish a filesystem object's canonical authorization identity.

    -
    +

    Hierarchy

    +
  • BinarySession
  • +
  • GhidraProvider
  • +
  • HopperProvider
  • +
  • InferenceEdgeInput
  • +
  • HopperApplicationLauncher
  • +
  • CdpBrowserProvider
  • +
  • CdpElectronProvider
  • +
  • GhidraHeadlessLauncher
  • +
  • PermissionRequest
  • +
  • PermissionGrant
  • +
  • BridgeLaunch
  • +
  • GhidraLaunch
  • +
    interface AnalysisClient {
        close(): Promise<void>;
        execute(
            operation: AnalysisOperation,
            parameters: Readonly<Record<string, JsonValue>>,
            options?: ExecutionOptions,
        ): Promise<Result<AnalysisExecution, AnalysisError>>;
    }
    -
    +

    Hierarchy (View Summary)

    • AnalysisOperationPort diff --git a/docs/api/interfaces/application_AnalysisProvider.AnalysisOperationPort.html b/docs/api/interfaces/application_AnalysisProvider.AnalysisOperationPort.html index 47788f89f..913a0511f 100644 --- a/docs/api/interfaces/application_AnalysisProvider.AnalysisOperationPort.html +++ b/docs/api/interfaces/application_AnalysisProvider.AnalysisOperationPort.html @@ -15,7 +15,7 @@

      Provider-neutral application capability for one analysis operation.

    interface AnalysisOperationPort {
        execute(
            operation: AnalysisOperation,
            parameters: Readonly<Record<string, JsonValue>>,
            options?: ExecutionOptions,
        ): Promise<Result<AnalysisExecution, AnalysisError>>;
    }
    -
    +

    Hierarchy (View Summary)

    • AnalysisOperationPort diff --git a/docs/api/interfaces/application_AnalysisProvider.AnalysisProvider.html b/docs/api/interfaces/application_AnalysisProvider.AnalysisProvider.html index 37192869e..33ce3e514 100644 --- a/docs/api/interfaces/application_AnalysisProvider.AnalysisProvider.html +++ b/docs/api/interfaces/application_AnalysisProvider.AnalysisProvider.html @@ -15,7 +15,7 @@

      Factory and capability declaration for an analysis implementation.

    interface AnalysisProvider {
        capabilities(): readonly CapabilityDescriptor[];
        createClient(
            target: BinaryTarget,
            profile?: {
                digest: string;
                parameters: Record<string, JSONType>;
                provider: { id: string; name: string; version: string };
                provider_profile_schema_version: number;
                schema_version: 1;
            },
        ): AnalysisClient;
        identity(): ProviderIdentity;
        resolveAnalysisProfile?(
            target: BinaryTarget,
            options?: AnalysisProfileResolutionOptions,
        ): Promise<Result<AnalysisProfileResolution, AnalysisError>>;
    }
    -
    +

    Hierarchy (View Summary)

    • AnalysisProvider diff --git a/docs/api/interfaces/application_AnalysisProvider.AnalysisProviderCandidate.html b/docs/api/interfaces/application_AnalysisProvider.AnalysisProviderCandidate.html index c131deeef..11bcb222c 100644 --- a/docs/api/interfaces/application_AnalysisProvider.AnalysisProviderCandidate.html +++ b/docs/api/interfaces/application_AnalysisProvider.AnalysisProviderCandidate.html @@ -15,7 +15,7 @@

      Deep provider candidate discoverable before one target-bound route is chosen.

    interface AnalysisProviderCandidate {
        capabilities(): readonly CapabilityDescriptor[];
        createClient(
            target: BinaryTarget,
            profile?: {
                digest: string;
                parameters: Record<string, JSONType>;
                provider: { id: string; name: string; version: string };
                provider_profile_schema_version: number;
                schema_version: 1;
            },
        ): AnalysisClient;
        identity(): ProviderIdentity;
        inspectAvailability(): ProviderAvailability;
        inspectTargetSupport(target: BinaryTarget): ProviderTargetSupport;
        resolveAnalysisProfile(
            target: BinaryTarget,
            options?: AnalysisProfileResolutionOptions,
        ): Promise<Result<AnalysisProfileResolution, AnalysisError>>;
    }
    -
    +

    Hierarchy (View Summary)

    • AnalysisProvider diff --git a/docs/api/interfaces/application_BinarySessionPort.BinarySessionPort.html b/docs/api/interfaces/application_BinarySessionPort.BinarySessionPort.html index b69d5d0ae..e6c1271a0 100644 --- a/docs/api/interfaces/application_BinarySessionPort.BinarySessionPort.html +++ b/docs/api/interfaces/application_BinarySessionPort.BinarySessionPort.html @@ -15,7 +15,7 @@

      Target lifecycle used by CLI and MCP without exposing a concrete provider.

    interface BinarySessionPort {
        activeTarget(): BinaryTarget | undefined;
        analysisProfile(
            operation?: AnalysisOperation,
        ):
            | {
                digest: string;
                parameters: Record<string, JSONType>;
                provider: { id: string; name: string; version: string };
                provider_profile_schema_version: number;
                schema_version: 1;
            }
            | undefined;
        close(): Promise<Result<null, AnalysisError>>;
        evidenceById(
            evidenceId: string,
        ):
            | {
                analysis_profile: {
                    digest: string;
                    parameters: Record<string, JSONType>;
                    provider: { id: string; name: string; version: string };
                    provider_profile_schema_version: number;
                    schema_version: 1;
                };
                authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference";
                confidence: "observed"
                | "derived"
                | "inferred";
                environment:
                    | {
                        architecture: string;
                        id: string;
                        isolation: "process"
                        | "none"
                        | "container"
                        | "virtual-machine";
                        platform: string;
                    }
                    | null;
                evidence_id: string;
                evidence_links: string[];
                limitations: string[];
                locations: (
                    | { address: string; kind: "address" }
                    | { end: string; kind: "address-range"; start: string }
                    | { kind: "artifact-path"; path: string }
                    | { kind: "file-offset"; offset: number }
                    | { end: number; kind: "file-offset-range"; start: number }
                )[];
                normalized_result: JSONType;
                operation: string;
                parameters: Record<string, JSONType>;
                predicate_type: string;
                provider: { id: string; name: string; version: string | null };
                raw_result: JSONType;
                schema_version: 2;
                subject:
                    | {
                        architecture: "x86"
                        | "x86_64"
                        | "arm"
                        | "arm64"
                        | null;
                        digest: { sha256: string };
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                        local_path: string;
                        name: string;
                    }
                    | null;
            }
            | {
                authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference";
                confidence: "observed"
                | "derived"
                | "inferred";
                environment:
                    | {
                        architecture: string;
                        id: string;
                        isolation: "process"
                        | "none"
                        | "container"
                        | "virtual-machine";
                        platform: string;
                    }
                    | null;
                evidence_id: string;
                evidence_links: string[];
                limitations: string[];
                locations: (
                    | { address: string; kind: "address" }
                    | { end: string; kind: "address-range"; start: string }
                    | { kind: "artifact-path"; path: string }
                    | { kind: "file-offset"; offset: number }
                    | { end: number; kind: "file-offset-range"; start: number }
                )[];
                normalized_result: JSONType;
                operation: string;
                parameters: Record<string, JSONType>;
                predicate_type: string;
                provider: { id: string; name: string; version: string | null };
                raw_result: JSONType;
                schema_version: 2;
                subject:
                    | {
                        architecture: "x86"
                        | "x86_64"
                        | "arm"
                        | "arm64"
                        | null;
                        digest: { sha256: string };
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                        local_path: string;
                        name: string;
                    }
                    | null;
            }
            | undefined;
        execute(
            operation: AnalysisOperation,
            parameters: Readonly<Record<string, JsonValue>>,
            options?: ExecutionOptions,
        ): Promise<Result<AnalysisExecution, AnalysisError>>;
        exportAnalysisSnapshot(): Result<
            {
                binding: {
                    analysis_profile: {
                        digest: string;
                        parameters: Record<string, JSONType>;
                        provider: { id: string; name: string; version: string };
                        provider_profile_schema_version: number;
                        schema_version: 1;
                    };
                    provider: { id: string; name: string; version: string };
                };
                entries: {
                    execution: {
                        limitations: string[];
                        locations: (
                            | { address: string; kind: "address" }
                            | { end: string; kind: "address-range"; start: string }
                            | { kind: "artifact-path"; path: string }
                            | { kind: "file-offset"; offset: number }
                            | { end: number; kind: "file-offset-range"; start: number }
                        )[];
                        provider: { id: string; name: string; version: string };
                        raw_result: JSONType;
                        result: JSONType;
                        subject:
                            | {
                                architecture: "x86"
                                | "x86_64"
                                | "arm"
                                | "arm64"
                                | null;
                                format:
                                    | "unknown"
                                    | "file"
                                    | "directory"
                                    | "javascript"
                                    | "source-map"
                                    | "plist"
                                    | "entitlements"
                                    | "dmg"
                                    | "zip"
                                    | "pkg"
                                    | "asar"
                                    | "javascript-bundle"
                                    | "mach-o-universal"
                                    | "mach-o"
                                    | "elf"
                                    | "pe"
                                    | "hopper"
                                    | "analysis-database"
                                    | "ipa"
                                    | "apk";
                                path: string;
                                sha256: string;
                            }
                            | null;
                    };
                    operation: string;
                    parameters: Record<string, JSONType>;
                    query_id: string;
                }[];
                evidence_bundle: {
                    artifacts: {
                        architecture: "x86"
                        | "x86_64"
                        | "arm"
                        | "arm64"
                        | null;
                        digest: { sha256: string };
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                    }[];
                    bundle_version: 2;
                    captures: { evidence_id: string; predicate_type: string }[];
                    environments: {
                        architecture: string;
                        id: string;
                        isolation: "process" | "none" | "container" | "virtual-machine";
                        platform: string;
                    }[];
                    providers: { id: string; name: string; version: string
                    | null }[];
                    records: (
                        | {
                            analysis_profile: {
                                digest: string;
                                parameters: Record<string, JSONType>;
                                provider: { id: string; name: string; version: string };
                                provider_profile_schema_version: number;
                                schema_version: 1;
                            };
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                        | {
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                    )[];
                    scenarios: {
                        authority: "controlled-replay";
                        evidence_id: string;
                        operation: string;
                    }[];
                    unknowns: {
                        contradicting_evidence_ids: string[];
                        domain: string;
                        mutation_evidence_ids: string[];
                        previous_revision_digest: string
                        | null;
                        question: string;
                        recommended_probes: { operation: string; rationale: string }[];
                        registry_version: 1;
                        relationships: {
                            type: "depends-on" | "related-to" | "contradicts";
                            unknown_id: string;
                        }[];
                        required_authority: | "shipped-artifact"
                        | "controlled-replay"
                        | "historical-reference"
                        | "external-service"
                        | "analyst-inference"
                        | null;
                        required_confidence: "observed"
                        | "derived"
                        | "inferred";
                        required_environment:
                            | {
                                architecture: string
                                | null;
                                id: string | null;
                                isolation:
                                    | "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine"
                                    | null;
                                platform: string
                                | null;
                            }
                            | null;
                        resolution: | {
                            disposition: "verified";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | {
                            disposition: "withdrawn"
                            | "out-of-scope";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | null;
                        revision: number;
                        revision_digest: string;
                        scope_digest: string
                        | null;
                        severity: "low" | "medium" | "high" | "critical";
                        status:
                            | "open"
                            | "investigating"
                            | "blocked"
                            | "contradicted"
                            | "resolved";
                        supporting_evidence_ids: string[];
                        unknown_id: string;
                    }[];
                };
                snapshot_version: 2;
                target: {
                    architecture: "x86"
                    | "x86_64"
                    | "arm"
                    | "arm64"
                    | null;
                    format:
                        | "javascript"
                        | "source-map"
                        | "plist"
                        | "dmg"
                        | "zip"
                        | "pkg"
                        | "asar"
                        | "mach-o"
                        | "elf"
                        | "pe"
                        | "analysis-database"
                        | "ipa"
                        | "apk";
                    kind: "executable"
                    | "database"
                    | "archive"
                    | "artifact";
                    sha256: string;
                };
            },
            AnalysisError,
        >;
        exportEvidenceBundle(): {
            artifacts: {
                architecture: "x86"
                | "x86_64"
                | "arm"
                | "arm64"
                | null;
                digest: { sha256: string };
                format:
                    | "unknown"
                    | "file"
                    | "directory"
                    | "javascript"
                    | "source-map"
                    | "plist"
                    | "entitlements"
                    | "dmg"
                    | "zip"
                    | "pkg"
                    | "asar"
                    | "javascript-bundle"
                    | "mach-o-universal"
                    | "mach-o"
                    | "elf"
                    | "pe"
                    | "hopper"
                    | "analysis-database"
                    | "ipa"
                    | "apk";
            }[];
            bundle_version: 2;
            captures: { evidence_id: string; predicate_type: string }[];
            environments: {
                architecture: string;
                id: string;
                isolation: "process" | "none" | "container" | "virtual-machine";
                platform: string;
            }[];
            providers: { id: string; name: string; version: string
            | null }[];
            records: (
                | {
                    analysis_profile: {
                        digest: string;
                        parameters: Record<string, JSONType>;
                        provider: { id: string; name: string; version: string };
                        provider_profile_schema_version: number;
                        schema_version: 1;
                    };
                    authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference";
                    confidence: "observed"
                    | "derived"
                    | "inferred";
                    environment:
                        | {
                            architecture: string;
                            id: string;
                            isolation: "process"
                            | "none"
                            | "container"
                            | "virtual-machine";
                            platform: string;
                        }
                        | null;
                    evidence_id: string;
                    evidence_links: string[];
                    limitations: string[];
                    locations: (
                        | { address: string; kind: "address" }
                        | { end: string; kind: "address-range"; start: string }
                        | { kind: "artifact-path"; path: string }
                        | { kind: "file-offset"; offset: number }
                        | { end: number; kind: "file-offset-range"; start: number }
                    )[];
                    normalized_result: JSONType;
                    operation: string;
                    parameters: Record<string, JSONType>;
                    predicate_type: string;
                    provider: { id: string; name: string; version: string | null };
                    raw_result: JSONType;
                    schema_version: 2;
                    subject:
                        | {
                            architecture: "x86"
                            | "x86_64"
                            | "arm"
                            | "arm64"
                            | null;
                            digest: { sha256: string };
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            local_path: string;
                            name: string;
                        }
                        | null;
                }
                | {
                    authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference";
                    confidence: "observed"
                    | "derived"
                    | "inferred";
                    environment:
                        | {
                            architecture: string;
                            id: string;
                            isolation: "process"
                            | "none"
                            | "container"
                            | "virtual-machine";
                            platform: string;
                        }
                        | null;
                    evidence_id: string;
                    evidence_links: string[];
                    limitations: string[];
                    locations: (
                        | { address: string; kind: "address" }
                        | { end: string; kind: "address-range"; start: string }
                        | { kind: "artifact-path"; path: string }
                        | { kind: "file-offset"; offset: number }
                        | { end: number; kind: "file-offset-range"; start: number }
                    )[];
                    normalized_result: JSONType;
                    operation: string;
                    parameters: Record<string, JSONType>;
                    predicate_type: string;
                    provider: { id: string; name: string; version: string | null };
                    raw_result: JSONType;
                    schema_version: 2;
                    subject:
                        | {
                            architecture: "x86"
                            | "x86_64"
                            | "arm"
                            | "arm64"
                            | null;
                            digest: { sha256: string };
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            local_path: string;
                            name: string;
                        }
                        | null;
                }
            )[];
            scenarios: {
                authority: "controlled-replay";
                evidence_id: string;
                operation: string;
            }[];
            unknowns: {
                contradicting_evidence_ids: string[];
                domain: string;
                mutation_evidence_ids: string[];
                previous_revision_digest: string
                | null;
                question: string;
                recommended_probes: { operation: string; rationale: string }[];
                registry_version: 1;
                relationships: {
                    type: "depends-on" | "related-to" | "contradicts";
                    unknown_id: string;
                }[];
                required_authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference"
                | null;
                required_confidence: "observed"
                | "derived"
                | "inferred";
                required_environment:
                    | {
                        architecture: string
                        | null;
                        id: string | null;
                        isolation: "process" | "none" | "container" | "virtual-machine" | null;
                        platform: string | null;
                    }
                    | null;
                resolution: | {
                    disposition: "verified";
                    evidence_ids: string[];
                    rationale: string;
                }
                | {
                    disposition: "withdrawn"
                    | "out-of-scope";
                    evidence_ids: string[];
                    rationale: string;
                }
                | null;
                revision: number;
                revision_digest: string;
                scope_digest: string
                | null;
                severity: "low" | "medium" | "high" | "critical";
                status:
                    | "open"
                    | "investigating"
                    | "blocked"
                    | "contradicted"
                    | "resolved";
                supporting_evidence_ids: string[];
                unknown_id: string;
            }[];
        };
        hasEvidence(evidenceId: string): boolean;
        importAnalysisSnapshot(
            snapshot: {
                binding: {
                    analysis_profile: {
                        digest: string;
                        parameters: Record<string, JSONType>;
                        provider: { id: string; name: string; version: string };
                        provider_profile_schema_version: number;
                        schema_version: 1;
                    };
                    provider: { id: string; name: string; version: string };
                };
                entries: {
                    execution: {
                        limitations: string[];
                        locations: (
                            | { address: string; kind: "address" }
                            | { end: string; kind: "address-range"; start: string }
                            | { kind: "artifact-path"; path: string }
                            | { kind: "file-offset"; offset: number }
                            | { end: number; kind: "file-offset-range"; start: number }
                        )[];
                        provider: { id: string; name: string; version: string };
                        raw_result: JSONType;
                        result: JSONType;
                        subject:
                            | {
                                architecture: "x86"
                                | "x86_64"
                                | "arm"
                                | "arm64"
                                | null;
                                format:
                                    | "unknown"
                                    | "file"
                                    | "directory"
                                    | "javascript"
                                    | "source-map"
                                    | "plist"
                                    | "entitlements"
                                    | "dmg"
                                    | "zip"
                                    | "pkg"
                                    | "asar"
                                    | "javascript-bundle"
                                    | "mach-o-universal"
                                    | "mach-o"
                                    | "elf"
                                    | "pe"
                                    | "hopper"
                                    | "analysis-database"
                                    | "ipa"
                                    | "apk";
                                path: string;
                                sha256: string;
                            }
                            | null;
                    };
                    operation: string;
                    parameters: Record<string, JSONType>;
                    query_id: string;
                }[];
                evidence_bundle: {
                    artifacts: {
                        architecture: "x86"
                        | "x86_64"
                        | "arm"
                        | "arm64"
                        | null;
                        digest: { sha256: string };
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                    }[];
                    bundle_version: 2;
                    captures: { evidence_id: string; predicate_type: string }[];
                    environments: {
                        architecture: string;
                        id: string;
                        isolation: "process" | "none" | "container" | "virtual-machine";
                        platform: string;
                    }[];
                    providers: { id: string; name: string; version: string
                    | null }[];
                    records: (
                        | {
                            analysis_profile: {
                                digest: string;
                                parameters: Record<string, JSONType>;
                                provider: { id: string; name: string; version: string };
                                provider_profile_schema_version: number;
                                schema_version: 1;
                            };
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                        | {
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                    )[];
                    scenarios: {
                        authority: "controlled-replay";
                        evidence_id: string;
                        operation: string;
                    }[];
                    unknowns: {
                        contradicting_evidence_ids: string[];
                        domain: string;
                        mutation_evidence_ids: string[];
                        previous_revision_digest: string
                        | null;
                        question: string;
                        recommended_probes: { operation: string; rationale: string }[];
                        registry_version: 1;
                        relationships: {
                            type: "depends-on" | "related-to" | "contradicts";
                            unknown_id: string;
                        }[];
                        required_authority: | "shipped-artifact"
                        | "controlled-replay"
                        | "historical-reference"
                        | "external-service"
                        | "analyst-inference"
                        | null;
                        required_confidence: "observed"
                        | "derived"
                        | "inferred";
                        required_environment:
                            | {
                                architecture: string
                                | null;
                                id: string | null;
                                isolation:
                                    | "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine"
                                    | null;
                                platform: string
                                | null;
                            }
                            | null;
                        resolution: | {
                            disposition: "verified";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | {
                            disposition: "withdrawn"
                            | "out-of-scope";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | null;
                        revision: number;
                        revision_digest: string;
                        scope_digest: string
                        | null;
                        severity: "low" | "medium" | "high" | "critical";
                        status:
                            | "open"
                            | "investigating"
                            | "blocked"
                            | "contradicted"
                            | "resolved";
                        supporting_evidence_ids: string[];
                        unknown_id: string;
                    }[];
                };
                snapshot_version: 2;
                target: {
                    architecture: "x86"
                    | "x86_64"
                    | "arm"
                    | "arm64"
                    | null;
                    format:
                        | "javascript"
                        | "source-map"
                        | "plist"
                        | "dmg"
                        | "zip"
                        | "pkg"
                        | "asar"
                        | "mach-o"
                        | "elf"
                        | "pe"
                        | "analysis-database"
                        | "ipa"
                        | "apk";
                    kind: "executable"
                    | "database"
                    | "archive"
                    | "artifact";
                    sha256: string;
                };
            },
        ): Result<number, AnalysisError>;
        importEvidenceBundle(
            bundle: unknown,
        ): Result<number, EvidenceIntegrityError | EvidenceLimitError>;
        investigationWorkspace(
            workspaceId: string,
            revision: number,
        ):
            | {
                bundle: {
                    artifacts: {
                        architecture: "x86"
                        | "x86_64"
                        | "arm"
                        | "arm64"
                        | null;
                        digest: { sha256: string };
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                    }[];
                    bundle_version: 2;
                    captures: { evidence_id: string; predicate_type: string }[];
                    environments: {
                        architecture: string;
                        id: string;
                        isolation: "process" | "none" | "container" | "virtual-machine";
                        platform: string;
                    }[];
                    providers: { id: string; name: string; version: string
                    | null }[];
                    records: (
                        | {
                            analysis_profile: {
                                digest: string;
                                parameters: Record<string, JSONType>;
                                provider: { id: string; name: string; version: string };
                                provider_profile_schema_version: number;
                                schema_version: 1;
                            };
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                        | {
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                    )[];
                    scenarios: {
                        authority: "controlled-replay";
                        evidence_id: string;
                        operation: string;
                    }[];
                    unknowns: {
                        contradicting_evidence_ids: string[];
                        domain: string;
                        mutation_evidence_ids: string[];
                        previous_revision_digest: string
                        | null;
                        question: string;
                        recommended_probes: { operation: string; rationale: string }[];
                        registry_version: 1;
                        relationships: {
                            type: "depends-on" | "related-to" | "contradicts";
                            unknown_id: string;
                        }[];
                        required_authority: | "shipped-artifact"
                        | "controlled-replay"
                        | "historical-reference"
                        | "external-service"
                        | "analyst-inference"
                        | null;
                        required_confidence: "observed"
                        | "derived"
                        | "inferred";
                        required_environment:
                            | {
                                architecture: string
                                | null;
                                id: string | null;
                                isolation:
                                    | "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine"
                                    | null;
                                platform: string
                                | null;
                            }
                            | null;
                        resolution: | {
                            disposition: "verified";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | {
                            disposition: "withdrawn"
                            | "out-of-scope";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | null;
                        revision: number;
                        revision_digest: string;
                        scope_digest: string
                        | null;
                        severity: "low" | "medium" | "high" | "critical";
                        status:
                            | "open"
                            | "investigating"
                            | "blocked"
                            | "contradicted"
                            | "resolved";
                        supporting_evidence_ids: string[];
                        unknown_id: string;
                    }[];
                };
                name: string;
                previous_revision_digest: string
                | null;
                revision: number;
                revision_digest: string;
                runs: (
                    | {
                        comparison_evidence_id: string
                        | null;
                        completed_stages: (
                            | "inventory_left"
                            | "inventory_right"
                            | "compare_artifacts"
                            | "find_changed_behavior"
                        )[];
                        integrity_continue_approved: boolean;
                        integrity_policy: "fail"
                        | "record-and-continue";
                        left: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        left_inventory_evidence_ids: string[];
                        limitations: string[];
                        max_integrity_mismatches: number;
                        options: {
                            change_limit: number;
                            max_compression_ratio: number;
                            max_depth: number;
                            max_entries: number;
                            max_entry_bytes: number;
                            max_path_bytes: number;
                            max_total_bytes: number;
                            page_size: number;
                        };
                        request_sha256: string;
                        result_evidence_id: string
                        | null;
                        right: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        right_inventory_evidence_ids: string[];
                        run_id: string;
                        schema_version: 1;
                        status: "complete"
                        | "running";
                    }
                    | {
                        comparison_evidence_id: string
                        | null;
                        completed_stages: (
                            | "inventory_left"
                            | "inventory_right"
                            | "compare_artifacts"
                            | "find_changed_behavior"
                        )[];
                        integrity_continue_approved: boolean;
                        integrity_policy: "fail"
                        | "record-and-continue";
                        left: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        left_inventory_evidence_ids: string[];
                        legacy_request_identity: true;
                        limitations: string[];
                        max_integrity_mismatches: number;
                        options: {
                            change_limit: number;
                            max_compression_ratio: number;
                            max_depth: number;
                            max_entries: number;
                            max_entry_bytes: number;
                            max_path_bytes: number;
                            max_total_bytes: number;
                            page_size: number;
                        };
                        request_sha256: string;
                        result_evidence_id: string
                        | null;
                        right: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        right_inventory_evidence_ids: string[];
                        run_id: string;
                        schema_version: 1;
                        status: "complete"
                        | "running";
                    }
                )[];
                workspace_id: string;
                workspace_version: 1;
            }
            | undefined;
        investigationWorkspaces(): readonly {
            bundle: {
                artifacts: {
                    architecture: "x86"
                    | "x86_64"
                    | "arm"
                    | "arm64"
                    | null;
                    digest: { sha256: string };
                    format:
                        | "unknown"
                        | "file"
                        | "directory"
                        | "javascript"
                        | "source-map"
                        | "plist"
                        | "entitlements"
                        | "dmg"
                        | "zip"
                        | "pkg"
                        | "asar"
                        | "javascript-bundle"
                        | "mach-o-universal"
                        | "mach-o"
                        | "elf"
                        | "pe"
                        | "hopper"
                        | "analysis-database"
                        | "ipa"
                        | "apk";
                }[];
                bundle_version: 2;
                captures: { evidence_id: string; predicate_type: string }[];
                environments: {
                    architecture: string;
                    id: string;
                    isolation: "process" | "none" | "container" | "virtual-machine";
                    platform: string;
                }[];
                providers: { id: string; name: string; version: string
                | null }[];
                records: (
                    | {
                        analysis_profile: {
                            digest: string;
                            parameters: Record<string, JSONType>;
                            provider: { id: string; name: string; version: string };
                            provider_profile_schema_version: number;
                            schema_version: 1;
                        };
                        authority: | "shipped-artifact"
                        | "controlled-replay"
                        | "historical-reference"
                        | "external-service"
                        | "analyst-inference";
                        confidence: "observed"
                        | "derived"
                        | "inferred";
                        environment:
                            | {
                                architecture: string;
                                id: string;
                                isolation: "process"
                                | "none"
                                | "container"
                                | "virtual-machine";
                                platform: string;
                            }
                            | null;
                        evidence_id: string;
                        evidence_links: string[];
                        limitations: string[];
                        locations: (
                            | { address: string; kind: "address" }
                            | { end: string; kind: "address-range"; start: string }
                            | { kind: "artifact-path"; path: string }
                            | { kind: "file-offset"; offset: number }
                            | { end: number; kind: "file-offset-range"; start: number }
                        )[];
                        normalized_result: JSONType;
                        operation: string;
                        parameters: Record<string, JSONType>;
                        predicate_type: string;
                        provider: { id: string; name: string; version: string | null };
                        raw_result: JSONType;
                        schema_version: 2;
                        subject:
                            | {
                                architecture: "x86"
                                | "x86_64"
                                | "arm"
                                | "arm64"
                                | null;
                                digest: { sha256: string };
                                format:
                                    | "unknown"
                                    | "file"
                                    | "directory"
                                    | "javascript"
                                    | "source-map"
                                    | "plist"
                                    | "entitlements"
                                    | "dmg"
                                    | "zip"
                                    | "pkg"
                                    | "asar"
                                    | "javascript-bundle"
                                    | "mach-o-universal"
                                    | "mach-o"
                                    | "elf"
                                    | "pe"
                                    | "hopper"
                                    | "analysis-database"
                                    | "ipa"
                                    | "apk";
                                local_path: string;
                                name: string;
                            }
                            | null;
                    }
                    | {
                        authority: | "shipped-artifact"
                        | "controlled-replay"
                        | "historical-reference"
                        | "external-service"
                        | "analyst-inference";
                        confidence: "observed"
                        | "derived"
                        | "inferred";
                        environment:
                            | {
                                architecture: string;
                                id: string;
                                isolation: "process"
                                | "none"
                                | "container"
                                | "virtual-machine";
                                platform: string;
                            }
                            | null;
                        evidence_id: string;
                        evidence_links: string[];
                        limitations: string[];
                        locations: (
                            | { address: string; kind: "address" }
                            | { end: string; kind: "address-range"; start: string }
                            | { kind: "artifact-path"; path: string }
                            | { kind: "file-offset"; offset: number }
                            | { end: number; kind: "file-offset-range"; start: number }
                        )[];
                        normalized_result: JSONType;
                        operation: string;
                        parameters: Record<string, JSONType>;
                        predicate_type: string;
                        provider: { id: string; name: string; version: string | null };
                        raw_result: JSONType;
                        schema_version: 2;
                        subject:
                            | {
                                architecture: "x86"
                                | "x86_64"
                                | "arm"
                                | "arm64"
                                | null;
                                digest: { sha256: string };
                                format:
                                    | "unknown"
                                    | "file"
                                    | "directory"
                                    | "javascript"
                                    | "source-map"
                                    | "plist"
                                    | "entitlements"
                                    | "dmg"
                                    | "zip"
                                    | "pkg"
                                    | "asar"
                                    | "javascript-bundle"
                                    | "mach-o-universal"
                                    | "mach-o"
                                    | "elf"
                                    | "pe"
                                    | "hopper"
                                    | "analysis-database"
                                    | "ipa"
                                    | "apk";
                                local_path: string;
                                name: string;
                            }
                            | null;
                    }
                )[];
                scenarios: {
                    authority: "controlled-replay";
                    evidence_id: string;
                    operation: string;
                }[];
                unknowns: {
                    contradicting_evidence_ids: string[];
                    domain: string;
                    mutation_evidence_ids: string[];
                    previous_revision_digest: string
                    | null;
                    question: string;
                    recommended_probes: { operation: string; rationale: string }[];
                    registry_version: 1;
                    relationships: {
                        type: "depends-on" | "related-to" | "contradicts";
                        unknown_id: string;
                    }[];
                    required_authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference"
                    | null;
                    required_confidence: "observed"
                    | "derived"
                    | "inferred";
                    required_environment:
                        | {
                            architecture: string
                            | null;
                            id: string | null;
                            isolation: "process" | "none" | "container" | "virtual-machine" | null;
                            platform: string | null;
                        }
                        | null;
                    resolution: | {
                        disposition: "verified";
                        evidence_ids: string[];
                        rationale: string;
                    }
                    | {
                        disposition: "withdrawn"
                        | "out-of-scope";
                        evidence_ids: string[];
                        rationale: string;
                    }
                    | null;
                    revision: number;
                    revision_digest: string;
                    scope_digest: string
                    | null;
                    severity: "low" | "medium" | "high" | "critical";
                    status:
                        | "open"
                        | "investigating"
                        | "blocked"
                        | "contradicted"
                        | "resolved";
                    supporting_evidence_ids: string[];
                    unknown_id: string;
                }[];
            };
            name: string;
            previous_revision_digest: string
            | null;
            revision: number;
            revision_digest: string;
            runs: (
                | {
                    comparison_evidence_id: string
                    | null;
                    completed_stages: (
                        | "inventory_left"
                        | "inventory_right"
                        | "compare_artifacts"
                        | "find_changed_behavior"
                    )[];
                    integrity_continue_approved: boolean;
                    integrity_policy: "fail"
                    | "record-and-continue";
                    left: {
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                        graph_sha256: string;
                        manifest_id: string;
                        root_sha256: string;
                    };
                    left_inventory_evidence_ids: string[];
                    limitations: string[];
                    max_integrity_mismatches: number;
                    options: {
                        change_limit: number;
                        max_compression_ratio: number;
                        max_depth: number;
                        max_entries: number;
                        max_entry_bytes: number;
                        max_path_bytes: number;
                        max_total_bytes: number;
                        page_size: number;
                    };
                    request_sha256: string;
                    result_evidence_id: string
                    | null;
                    right: {
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                        graph_sha256: string;
                        manifest_id: string;
                        root_sha256: string;
                    };
                    right_inventory_evidence_ids: string[];
                    run_id: string;
                    schema_version: 1;
                    status: "complete"
                    | "running";
                }
                | {
                    comparison_evidence_id: string
                    | null;
                    completed_stages: (
                        | "inventory_left"
                        | "inventory_right"
                        | "compare_artifacts"
                        | "find_changed_behavior"
                    )[];
                    integrity_continue_approved: boolean;
                    integrity_policy: "fail"
                    | "record-and-continue";
                    left: {
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                        graph_sha256: string;
                        manifest_id: string;
                        root_sha256: string;
                    };
                    left_inventory_evidence_ids: string[];
                    legacy_request_identity: true;
                    limitations: string[];
                    max_integrity_mismatches: number;
                    options: {
                        change_limit: number;
                        max_compression_ratio: number;
                        max_depth: number;
                        max_entries: number;
                        max_entry_bytes: number;
                        max_path_bytes: number;
                        max_total_bytes: number;
                        page_size: number;
                    };
                    request_sha256: string;
                    result_evidence_id: string
                    | null;
                    right: {
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                        graph_sha256: string;
                        manifest_id: string;
                        root_sha256: string;
                    };
                    right_inventory_evidence_ids: string[];
                    run_id: string;
                    schema_version: 1;
                    status: "complete"
                    | "running";
                }
            )[];
            workspace_id: string;
            workspace_version: 1;
        }[];
        listUnknowns(
            filters?: {
                domain?: string;
                severity?: "low" | "medium" | "high" | "critical";
                status?:
                    | "open"
                    | "investigating"
                    | "blocked"
                    | "contradicted"
                    | "resolved";
            },
        ): {
            contradicting_evidence_ids: string[];
            domain: string;
            mutation_evidence_ids: string[];
            previous_revision_digest: string
            | null;
            question: string;
            recommended_probes: { operation: string; rationale: string }[];
            registry_version: 1;
            relationships: {
                type: "depends-on" | "related-to" | "contradicts";
                unknown_id: string;
            }[];
            required_authority: | "shipped-artifact"
            | "controlled-replay"
            | "historical-reference"
            | "external-service"
            | "analyst-inference"
            | null;
            required_confidence: "observed"
            | "derived"
            | "inferred";
            required_environment:
                | {
                    architecture: string
                    | null;
                    id: string | null;
                    isolation: "process" | "none" | "container" | "virtual-machine" | null;
                    platform: string | null;
                }
                | null;
            resolution: | {
                disposition: "verified";
                evidence_ids: string[];
                rationale: string;
            }
            | {
                disposition: "withdrawn"
                | "out-of-scope";
                evidence_ids: string[];
                rationale: string;
            }
            | null;
            revision: number;
            revision_digest: string;
            scope_digest: string
            | null;
            severity: "low" | "medium" | "high" | "critical";
            status: "open" | "investigating" | "blocked" | "contradicted" | "resolved";
            supporting_evidence_ids: string[];
            unknown_id: string;
        }[];
        onAvailabilityChanged?(listener: () => void | Promise<void>): () => void;
        open(
            path: string,
            options?: {
                providerId?: string;
                signal?: AbortSignal;
                snapshot?: {
                    binding: {
                        analysis_profile: {
                            digest: string;
                            parameters: Record<string, JSONType>;
                            provider: { id: string; name: string; version: string };
                            provider_profile_schema_version: number;
                            schema_version: 1;
                        };
                        provider: { id: string; name: string; version: string };
                    };
                    entries: {
                        execution: {
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            provider: { id: string; name: string; version: string };
                            raw_result: JSONType;
                            result: JSONType;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    path: string;
                                    sha256: string;
                                }
                                | null;
                        };
                        operation: string;
                        parameters: Record<string, JSONType>;
                        query_id: string;
                    }[];
                    evidence_bundle: {
                        artifacts: {
                            architecture: "x86"
                            | "x86_64"
                            | "arm"
                            | "arm64"
                            | null;
                            digest: { sha256: string };
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                        }[];
                        bundle_version: 2;
                        captures: { evidence_id: string; predicate_type: string }[];
                        environments: {
                            architecture: string;
                            id: string;
                            isolation: "process" | "none" | "container" | "virtual-machine";
                            platform: string;
                        }[];
                        providers: { id: string; name: string; version: string
                        | null }[];
                        records: (
                            | {
                                analysis_profile: {
                                    digest: string;
                                    parameters: Record<string, JSONType>;
                                    provider: { id: string; name: string; version: string };
                                    provider_profile_schema_version: number;
                                    schema_version: 1;
                                };
                                authority: | "shipped-artifact"
                                | "controlled-replay"
                                | "historical-reference"
                                | "external-service"
                                | "analyst-inference";
                                confidence: "observed"
                                | "derived"
                                | "inferred";
                                environment:
                                    | {
                                        architecture: string;
                                        id: string;
                                        isolation: (...)
                                        | (...)
                                        | (...)
                                        | (...);
                                        platform: string;
                                    }
                                    | null;
                                evidence_id: string;
                                evidence_links: string[];
                                limitations: string[];
                                locations: (
                                    | { address: ...; kind: ... }
                                    | { end: ...; kind: ...; start: ... }
                                    | { kind: ...; path: ... }
                                    | { kind: ...; offset: ... }
                                    | { end: ...; kind: ...; start: ... }
                                )[];
                                normalized_result: JSONType;
                                operation: string;
                                parameters: Record<string, JSONType>;
                                predicate_type: string;
                                provider: { id: string; name: string; version: string | null };
                                raw_result: JSONType;
                                schema_version: 2;
                                subject:
                                    | {
                                        architecture: (...)
                                        | (...)
                                        | (...)
                                        | (...)
                                        | (...);
                                        digest: { sha256: ... };
                                        format:
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...);
                                        local_path: string;
                                        name: string;
                                    }
                                    | null;
                            }
                            | {
                                authority: | "shipped-artifact"
                                | "controlled-replay"
                                | "historical-reference"
                                | "external-service"
                                | "analyst-inference";
                                confidence: "observed"
                                | "derived"
                                | "inferred";
                                environment:
                                    | {
                                        architecture: string;
                                        id: string;
                                        isolation: (...)
                                        | (...)
                                        | (...)
                                        | (...);
                                        platform: string;
                                    }
                                    | null;
                                evidence_id: string;
                                evidence_links: string[];
                                limitations: string[];
                                locations: (
                                    | { address: ...; kind: ... }
                                    | { end: ...; kind: ...; start: ... }
                                    | { kind: ...; path: ... }
                                    | { kind: ...; offset: ... }
                                    | { end: ...; kind: ...; start: ... }
                                )[];
                                normalized_result: JSONType;
                                operation: string;
                                parameters: Record<string, JSONType>;
                                predicate_type: string;
                                provider: { id: string; name: string; version: string | null };
                                raw_result: JSONType;
                                schema_version: 2;
                                subject:
                                    | {
                                        architecture: (...)
                                        | (...)
                                        | (...)
                                        | (...)
                                        | (...);
                                        digest: { sha256: ... };
                                        format:
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...)
                                            | (...);
                                        local_path: string;
                                        name: string;
                                    }
                                    | null;
                            }
                        )[];
                        scenarios: {
                            authority: "controlled-replay";
                            evidence_id: string;
                            operation: string;
                        }[];
                        unknowns: {
                            contradicting_evidence_ids: string[];
                            domain: string;
                            mutation_evidence_ids: string[];
                            previous_revision_digest: string
                            | null;
                            question: string;
                            recommended_probes: { operation: string; rationale: string }[];
                            registry_version: 1;
                            relationships: {
                                type: "depends-on" | "related-to" | "contradicts";
                                unknown_id: string;
                            }[];
                            required_authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference"
                            | null;
                            required_confidence: "observed"
                            | "derived"
                            | "inferred";
                            required_environment:
                                | {
                                    architecture: string
                                    | null;
                                    id: string | null;
                                    isolation:
                                        | "process"
                                        | "none"
                                        | "container"
                                        | "virtual-machine"
                                        | null;
                                    platform: string
                                    | null;
                                }
                                | null;
                            resolution: | {
                                disposition: "verified";
                                evidence_ids: string[];
                                rationale: string;
                            }
                            | {
                                disposition: "withdrawn"
                                | "out-of-scope";
                                evidence_ids: string[];
                                rationale: string;
                            }
                            | null;
                            revision: number;
                            revision_digest: string;
                            scope_digest: string
                            | null;
                            severity: "low" | "medium" | "high" | "critical";
                            status:
                                | "open"
                                | "investigating"
                                | "blocked"
                                | "contradicted"
                                | "resolved";
                            supporting_evidence_ids: string[];
                            unknown_id: string;
                        }[];
                    };
                    snapshot_version: 2;
                    target: {
                        architecture: "x86"
                        | "x86_64"
                        | "arm"
                        | "arm64"
                        | null;
                        format:
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                        kind: "executable"
                        | "database"
                        | "archive"
                        | "artifact";
                        sha256: string;
                    };
                };
                targetKind?: "executable"
                | "database"
                | "archive"
                | "artifact";
            },
        ): Promise<Result<BinaryTarget, AnalysisError>>;
        openCompatibility(): Readonly<Record<string, JsonValue>>;
        providerIdentity(operation?: AnalysisOperation): ProviderIdentity;
        recordEvidence(
            evidence:
                | {
                    analysis_profile: {
                        digest: string;
                        parameters: Record<string, JSONType>;
                        provider: { id: string; name: string; version: string };
                        provider_profile_schema_version: number;
                        schema_version: 1;
                    };
                    authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference";
                    confidence: "observed"
                    | "derived"
                    | "inferred";
                    environment:
                        | {
                            architecture: string;
                            id: string;
                            isolation: "process"
                            | "none"
                            | "container"
                            | "virtual-machine";
                            platform: string;
                        }
                        | null;
                    evidence_id: string;
                    evidence_links: string[];
                    limitations: string[];
                    locations: (
                        | { address: string; kind: "address" }
                        | { end: string; kind: "address-range"; start: string }
                        | { kind: "artifact-path"; path: string }
                        | { kind: "file-offset"; offset: number }
                        | { end: number; kind: "file-offset-range"; start: number }
                    )[];
                    normalized_result: JSONType;
                    operation: string;
                    parameters: Record<string, JSONType>;
                    predicate_type: string;
                    provider: { id: string; name: string; version: string | null };
                    raw_result: JSONType;
                    schema_version: 2;
                    subject:
                        | {
                            architecture: "x86"
                            | "x86_64"
                            | "arm"
                            | "arm64"
                            | null;
                            digest: { sha256: string };
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            local_path: string;
                            name: string;
                        }
                        | null;
                }
                | {
                    authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference";
                    confidence: "observed"
                    | "derived"
                    | "inferred";
                    environment:
                        | {
                            architecture: string;
                            id: string;
                            isolation: "process"
                            | "none"
                            | "container"
                            | "virtual-machine";
                            platform: string;
                        }
                        | null;
                    evidence_id: string;
                    evidence_links: string[];
                    limitations: string[];
                    locations: (
                        | { address: string; kind: "address" }
                        | { end: string; kind: "address-range"; start: string }
                        | { kind: "artifact-path"; path: string }
                        | { kind: "file-offset"; offset: number }
                        | { end: number; kind: "file-offset-range"; start: number }
                    )[];
                    normalized_result: JSONType;
                    operation: string;
                    parameters: Record<string, JSONType>;
                    predicate_type: string;
                    provider: { id: string; name: string; version: string | null };
                    raw_result: JSONType;
                    schema_version: 2;
                    subject:
                        | {
                            architecture: "x86"
                            | "x86_64"
                            | "arm"
                            | "arm64"
                            | null;
                            digest: { sha256: string };
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            local_path: string;
                            name: string;
                        }
                        | null;
                },
        ): Result<
            "added"
            | "duplicate",
            EvidenceIntegrityError | EvidenceLimitError,
        >;
        recordEvidenceWithUnknown(
            evidence:
                | {
                    analysis_profile: {
                        digest: string;
                        parameters: Record<string, JSONType>;
                        provider: { id: string; name: string; version: string };
                        provider_profile_schema_version: number;
                        schema_version: 1;
                    };
                    authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference";
                    confidence: "observed"
                    | "derived"
                    | "inferred";
                    environment:
                        | {
                            architecture: string;
                            id: string;
                            isolation: "process"
                            | "none"
                            | "container"
                            | "virtual-machine";
                            platform: string;
                        }
                        | null;
                    evidence_id: string;
                    evidence_links: string[];
                    limitations: string[];
                    locations: (
                        | { address: string; kind: "address" }
                        | { end: string; kind: "address-range"; start: string }
                        | { kind: "artifact-path"; path: string }
                        | { kind: "file-offset"; offset: number }
                        | { end: number; kind: "file-offset-range"; start: number }
                    )[];
                    normalized_result: JSONType;
                    operation: string;
                    parameters: Record<string, JSONType>;
                    predicate_type: string;
                    provider: { id: string; name: string; version: string | null };
                    raw_result: JSONType;
                    schema_version: 2;
                    subject:
                        | {
                            architecture: "x86"
                            | "x86_64"
                            | "arm"
                            | "arm64"
                            | null;
                            digest: { sha256: string };
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            local_path: string;
                            name: string;
                        }
                        | null;
                }
                | {
                    authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference";
                    confidence: "observed"
                    | "derived"
                    | "inferred";
                    environment:
                        | {
                            architecture: string;
                            id: string;
                            isolation: "process"
                            | "none"
                            | "container"
                            | "virtual-machine";
                            platform: string;
                        }
                        | null;
                    evidence_id: string;
                    evidence_links: string[];
                    limitations: string[];
                    locations: (
                        | { address: string; kind: "address" }
                        | { end: string; kind: "address-range"; start: string }
                        | { kind: "artifact-path"; path: string }
                        | { kind: "file-offset"; offset: number }
                        | { end: number; kind: "file-offset-range"; start: number }
                    )[];
                    normalized_result: JSONType;
                    operation: string;
                    parameters: Record<string, JSONType>;
                    predicate_type: string;
                    provider: { id: string; name: string; version: string | null };
                    raw_result: JSONType;
                    schema_version: 2;
                    subject:
                        | {
                            architecture: "x86"
                            | "x86_64"
                            | "arm"
                            | "arm64"
                            | null;
                            digest: { sha256: string };
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            local_path: string;
                            name: string;
                        }
                        | null;
                },
            input: {
                approved: true;
                contradicting_evidence_ids: string[];
                domain: string;
                question: string;
                recommended_probes: { operation: string; rationale: string }[];
                relationships: {
                    type: "depends-on" | "related-to" | "contradicts";
                    unknown_id: string;
                }[];
                required_authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference"
                | null;
                required_confidence: "observed"
                | "derived"
                | "inferred";
                required_environment:
                    | {
                        architecture: string
                        | null;
                        id: string | null;
                        isolation: "process" | "none" | "container" | "virtual-machine" | null;
                        platform: string | null;
                    }
                    | null;
                severity: "low"
                | "medium"
                | "high"
                | "critical";
                supporting_evidence_ids: string[];
            },
        ): Result<
            | {
                contradicting_evidence_ids: string[];
                domain: string;
                mutation_evidence_ids: string[];
                previous_revision_digest: string
                | null;
                question: string;
                recommended_probes: { operation: string; rationale: string }[];
                registry_version: 1;
                relationships: {
                    type: "depends-on" | "related-to" | "contradicts";
                    unknown_id: string;
                }[];
                required_authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference"
                | null;
                required_confidence: "observed"
                | "derived"
                | "inferred";
                required_environment:
                    | {
                        architecture: string
                        | null;
                        id: string | null;
                        isolation: "process" | "none" | "container" | "virtual-machine" | null;
                        platform: string | null;
                    }
                    | null;
                resolution: | {
                    disposition: "verified";
                    evidence_ids: string[];
                    rationale: string;
                }
                | {
                    disposition: "withdrawn"
                    | "out-of-scope";
                    evidence_ids: string[];
                    rationale: string;
                }
                | null;
                revision: number;
                revision_digest: string;
                scope_digest: string
                | null;
                severity: "low" | "medium" | "high" | "critical";
                status:
                    | "open"
                    | "investigating"
                    | "blocked"
                    | "contradicted"
                    | "resolved";
                supporting_evidence_ids: string[];
                unknown_id: string;
            }
            | null,
            AnalysisError,
        >;
        recordUnknown(
            input: {
                approved: true;
                contradicting_evidence_ids: string[];
                domain: string;
                question: string;
                recommended_probes: { operation: string; rationale: string }[];
                relationships: {
                    type: "depends-on" | "related-to" | "contradicts";
                    unknown_id: string;
                }[];
                required_authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference"
                | null;
                required_confidence: "observed"
                | "derived"
                | "inferred";
                required_environment:
                    | {
                        architecture: string
                        | null;
                        id: string | null;
                        isolation: "process" | "none" | "container" | "virtual-machine" | null;
                        platform: string | null;
                    }
                    | null;
                severity: "low"
                | "medium"
                | "high"
                | "critical";
                supporting_evidence_ids: string[];
            },
        ): Result<
            {
                contradicting_evidence_ids: string[];
                domain: string;
                mutation_evidence_ids: string[];
                previous_revision_digest: string
                | null;
                question: string;
                recommended_probes: { operation: string; rationale: string }[];
                registry_version: 1;
                relationships: {
                    type: "depends-on" | "related-to" | "contradicts";
                    unknown_id: string;
                }[];
                required_authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference"
                | null;
                required_confidence: "observed"
                | "derived"
                | "inferred";
                required_environment:
                    | {
                        architecture: string
                        | null;
                        id: string | null;
                        isolation: "process" | "none" | "container" | "virtual-machine" | null;
                        platform: string | null;
                    }
                    | null;
                resolution: | {
                    disposition: "verified";
                    evidence_ids: string[];
                    rationale: string;
                }
                | {
                    disposition: "withdrawn"
                    | "out-of-scope";
                    evidence_ids: string[];
                    rationale: string;
                }
                | null;
                revision: number;
                revision_digest: string;
                scope_digest: string
                | null;
                severity: "low" | "medium" | "high" | "critical";
                status:
                    | "open"
                    | "investigating"
                    | "blocked"
                    | "contradicted"
                    | "resolved";
                supporting_evidence_ids: string[];
                unknown_id: string;
            },
            AnalysisError,
        >;
        retainInvestigationWorkspace(
            workspace: {
                bundle: {
                    artifacts: {
                        architecture: "x86" | "x86_64" | "arm" | "arm64" | null;
                        digest: { sha256: string };
                        format:
                            | "unknown"
                            | "file"
                            | "directory"
                            | "javascript"
                            | "source-map"
                            | "plist"
                            | "entitlements"
                            | "dmg"
                            | "zip"
                            | "pkg"
                            | "asar"
                            | "javascript-bundle"
                            | "mach-o-universal"
                            | "mach-o"
                            | "elf"
                            | "pe"
                            | "hopper"
                            | "analysis-database"
                            | "ipa"
                            | "apk";
                    }[];
                    bundle_version: 2;
                    captures: { evidence_id: string; predicate_type: string }[];
                    environments: {
                        architecture: string;
                        id: string;
                        isolation: "process" | "none" | "container" | "virtual-machine";
                        platform: string;
                    }[];
                    providers: { id: string; name: string; version: string
                    | null }[];
                    records: (
                        | {
                            analysis_profile: {
                                digest: string;
                                parameters: Record<string, JSONType>;
                                provider: { id: string; name: string; version: string };
                                provider_profile_schema_version: number;
                                schema_version: 1;
                            };
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                        | {
                            authority: | "shipped-artifact"
                            | "controlled-replay"
                            | "historical-reference"
                            | "external-service"
                            | "analyst-inference";
                            confidence: "observed"
                            | "derived"
                            | "inferred";
                            environment:
                                | {
                                    architecture: string;
                                    id: string;
                                    isolation: "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine";
                                    platform: string;
                                }
                                | null;
                            evidence_id: string;
                            evidence_links: string[];
                            limitations: string[];
                            locations: (
                                | { address: string; kind: "address" }
                                | { end: string; kind: "address-range"; start: string }
                                | { kind: "artifact-path"; path: string }
                                | { kind: "file-offset"; offset: number }
                                | { end: number; kind: "file-offset-range"; start: number }
                            )[];
                            normalized_result: JSONType;
                            operation: string;
                            parameters: Record<string, JSONType>;
                            predicate_type: string;
                            provider: { id: string; name: string; version: string | null };
                            raw_result: JSONType;
                            schema_version: 2;
                            subject:
                                | {
                                    architecture: "x86"
                                    | "x86_64"
                                    | "arm"
                                    | "arm64"
                                    | null;
                                    digest: { sha256: string };
                                    format:
                                        | "unknown"
                                        | "file"
                                        | "directory"
                                        | "javascript"
                                        | "source-map"
                                        | "plist"
                                        | "entitlements"
                                        | "dmg"
                                        | "zip"
                                        | "pkg"
                                        | "asar"
                                        | "javascript-bundle"
                                        | "mach-o-universal"
                                        | "mach-o"
                                        | "elf"
                                        | "pe"
                                        | "hopper"
                                        | "analysis-database"
                                        | "ipa"
                                        | "apk";
                                    local_path: string;
                                    name: string;
                                }
                                | null;
                        }
                    )[];
                    scenarios: {
                        authority: "controlled-replay";
                        evidence_id: string;
                        operation: string;
                    }[];
                    unknowns: {
                        contradicting_evidence_ids: string[];
                        domain: string;
                        mutation_evidence_ids: string[];
                        previous_revision_digest: string
                        | null;
                        question: string;
                        recommended_probes: { operation: string; rationale: string }[];
                        registry_version: 1;
                        relationships: {
                            type: "depends-on" | "related-to" | "contradicts";
                            unknown_id: string;
                        }[];
                        required_authority: | "shipped-artifact"
                        | "controlled-replay"
                        | "historical-reference"
                        | "external-service"
                        | "analyst-inference"
                        | null;
                        required_confidence: "observed"
                        | "derived"
                        | "inferred";
                        required_environment:
                            | {
                                architecture: string
                                | null;
                                id: string | null;
                                isolation:
                                    | "process"
                                    | "none"
                                    | "container"
                                    | "virtual-machine"
                                    | null;
                                platform: string
                                | null;
                            }
                            | null;
                        resolution: | {
                            disposition: "verified";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | {
                            disposition: "withdrawn"
                            | "out-of-scope";
                            evidence_ids: string[];
                            rationale: string;
                        }
                        | null;
                        revision: number;
                        revision_digest: string;
                        scope_digest: string
                        | null;
                        severity: "low" | "medium" | "high" | "critical";
                        status:
                            | "open"
                            | "investigating"
                            | "blocked"
                            | "contradicted"
                            | "resolved";
                        supporting_evidence_ids: string[];
                        unknown_id: string;
                    }[];
                };
                name: string;
                previous_revision_digest: string
                | null;
                revision: number;
                revision_digest: string;
                runs: (
                    | {
                        comparison_evidence_id: string
                        | null;
                        completed_stages: (
                            | "inventory_left"
                            | "inventory_right"
                            | "compare_artifacts"
                            | "find_changed_behavior"
                        )[];
                        integrity_continue_approved: boolean;
                        integrity_policy: "fail"
                        | "record-and-continue";
                        left: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        left_inventory_evidence_ids: string[];
                        limitations: string[];
                        max_integrity_mismatches: number;
                        options: {
                            change_limit: number;
                            max_compression_ratio: number;
                            max_depth: number;
                            max_entries: number;
                            max_entry_bytes: number;
                            max_path_bytes: number;
                            max_total_bytes: number;
                            page_size: number;
                        };
                        request_sha256: string;
                        result_evidence_id: string
                        | null;
                        right: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        right_inventory_evidence_ids: string[];
                        run_id: string;
                        schema_version: 1;
                        status: "complete"
                        | "running";
                    }
                    | {
                        comparison_evidence_id: string
                        | null;
                        completed_stages: (
                            | "inventory_left"
                            | "inventory_right"
                            | "compare_artifacts"
                            | "find_changed_behavior"
                        )[];
                        integrity_continue_approved: boolean;
                        integrity_policy: "fail"
                        | "record-and-continue";
                        left: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        left_inventory_evidence_ids: string[];
                        legacy_request_identity: true;
                        limitations: string[];
                        max_integrity_mismatches: number;
                        options: {
                            change_limit: number;
                            max_compression_ratio: number;
                            max_depth: number;
                            max_entries: number;
                            max_entry_bytes: number;
                            max_path_bytes: number;
                            max_total_bytes: number;
                            page_size: number;
                        };
                        request_sha256: string;
                        result_evidence_id: string
                        | null;
                        right: {
                            format:
                                | "unknown"
                                | "file"
                                | "directory"
                                | "javascript"
                                | "source-map"
                                | "plist"
                                | "entitlements"
                                | "dmg"
                                | "zip"
                                | "pkg"
                                | "asar"
                                | "javascript-bundle"
                                | "mach-o-universal"
                                | "mach-o"
                                | "elf"
                                | "pe"
                                | "hopper"
                                | "analysis-database"
                                | "ipa"
                                | "apk";
                            graph_sha256: string;
                            manifest_id: string;
                            root_sha256: string;
                        };
                        right_inventory_evidence_ids: string[];
                        run_id: string;
                        schema_version: 1;
                        status: "complete"
                        | "running";
                    }
                )[];
                workspace_id: string;
                workspace_version: 1;
            },
        ): "added"
        | "duplicate";
        status(): JSONType;
        updateUnknown(
            input: {
                approved: true;
                contradicting_evidence_ids: string[];
                expected_revision: number;
                recommended_probes: { operation: string; rationale: string }[];
                relationships: {
                    type: "depends-on" | "related-to" | "contradicts";
                    unknown_id: string;
                }[];
                required_authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference"
                | null;
                required_confidence: "observed"
                | "derived"
                | "inferred";
                required_environment:
                    | {
                        architecture: string
                        | null;
                        id: string | null;
                        isolation: "process" | "none" | "container" | "virtual-machine" | null;
                        platform: string | null;
                    }
                    | null;
                resolution: | {
                    disposition: "verified";
                    evidence_ids: string[];
                    rationale: string;
                }
                | {
                    disposition: "withdrawn"
                    | "out-of-scope";
                    evidence_ids: string[];
                    rationale: string;
                }
                | null;
                severity: "low"
                | "medium"
                | "high"
                | "critical";
                status:
                    | "open"
                    | "investigating"
                    | "blocked"
                    | "contradicted"
                    | "resolved";
                supporting_evidence_ids: string[];
                unknown_id: string;
            },
        ): Result<
            {
                contradicting_evidence_ids: string[];
                domain: string;
                mutation_evidence_ids: string[];
                previous_revision_digest: string
                | null;
                question: string;
                recommended_probes: { operation: string; rationale: string }[];
                registry_version: 1;
                relationships: {
                    type: "depends-on" | "related-to" | "contradicts";
                    unknown_id: string;
                }[];
                required_authority: | "shipped-artifact"
                | "controlled-replay"
                | "historical-reference"
                | "external-service"
                | "analyst-inference"
                | null;
                required_confidence: "observed"
                | "derived"
                | "inferred";
                required_environment:
                    | {
                        architecture: string
                        | null;
                        id: string | null;
                        isolation: "process" | "none" | "container" | "virtual-machine" | null;
                        platform: string | null;
                    }
                    | null;
                resolution: | {
                    disposition: "verified";
                    evidence_ids: string[];
                    rationale: string;
                }
                | {
                    disposition: "withdrawn"
                    | "out-of-scope";
                    evidence_ids: string[];
                    rationale: string;
                }
                | null;
                revision: number;
                revision_digest: string;
                scope_digest: string
                | null;
                severity: "low" | "medium" | "high" | "critical";
                status:
                    | "open"
                    | "investigating"
                    | "blocked"
                    | "contradicted"
                    | "resolved";
                supporting_evidence_ids: string[];
                unknown_id: string;
            },
            AnalysisError,
        >;
        verifyUnknownResolution(
            unknownId: string,
        ): Result<
            {
                truthVerified: boolean;
                unknown: {
                    contradicting_evidence_ids: string[];
                    domain: string;
                    mutation_evidence_ids: string[];
                    previous_revision_digest: string
                    | null;
                    question: string;
                    recommended_probes: { operation: string; rationale: string }[];
                    registry_version: 1;
                    relationships: {
                        type: "depends-on" | "related-to" | "contradicts";
                        unknown_id: string;
                    }[];
                    required_authority: | "shipped-artifact"
                    | "controlled-replay"
                    | "historical-reference"
                    | "external-service"
                    | "analyst-inference"
                    | null;
                    required_confidence: "observed"
                    | "derived"
                    | "inferred";
                    required_environment:
                        | {
                            architecture: string
                            | null;
                            id: string | null;
                            isolation: "process" | "none" | "container" | "virtual-machine" | null;
                            platform: string | null;
                        }
                        | null;
                    resolution: | {
                        disposition: "verified";
                        evidence_ids: string[];
                        rationale: string;
                    }
                    | {
                        disposition: "withdrawn"
                        | "out-of-scope";
                        evidence_ids: string[];
                        rationale: string;
                    }
                    | null;
                    revision: number;
                    revision_digest: string;
                    scope_digest: string
                    | null;
                    severity: "low" | "medium" | "high" | "critical";
                    status:
                        | "open"
                        | "investigating"
                        | "blocked"
                        | "contradicted"
                        | "resolved";
                    supporting_evidence_ids: string[];
                    unknown_id: string;
                };
                valid: boolean;
            },
            UnknownRegistryError,
        >;
    }
    -
    +

    Hierarchy (View Summary)

    • AnalysisOperationPort diff --git a/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.AnalyzedJavaScriptArtifactFile.html b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.AnalyzedJavaScriptArtifactFile.html new file mode 100644 index 000000000..b092d4e09 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.AnalyzedJavaScriptArtifactFile.html @@ -0,0 +1,64 @@ +AnalyzedJavaScriptArtifactFile | rea-agents - v1.6.0
      +
      rea-agents - v1.6.0 + +
        +
        +
        Preparing search index...
        +
        +
        + +
        +

        One relevant file plus optional AST-only JavaScript facts.

        +
        +
        interface AnalyzedJavaScriptArtifactFile {
            file: JavaScriptArtifactFile;
            javascript: JavaScriptStaticAnalysis | null;
        }
        +
        +
        +
        +
        Index
        +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        javascript: JavaScriptStaticAnalysis | null
        +
        + +
        +
        diff --git a/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptArtifactAnalysis.html b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptArtifactAnalysis.html new file mode 100644 index 000000000..927dcd132 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptArtifactAnalysis.html @@ -0,0 +1,112 @@ +JavaScriptArtifactAnalysis | rea-agents - v1.6.0
        +
        rea-agents - v1.6.0 + +
          +
          +
          Preparing search index...
          +
          +
          + +
          +

          Complete bounded static-analysis projection before graph construction.

          +
          +
          interface JavaScriptArtifactAnalysis {
              files: readonly AnalyzedJavaScriptArtifactFile[];
              findings: number;
              html_scripts: readonly JavaScriptHtmlScriptObservation[];
              limitations: readonly string[];
              modules: number;
              packages: readonly JavaScriptPackageObservation[];
              parse_failures: number;
              source_maps: readonly JavaScriptSourceMapObservation[];
              truncated_scopes: number;
              visited_ast_nodes: number;
          }
          +
          +
          +
          +
          Index
          +
          +
          + +
          +
          + +
          +
          + +
          findings: number
          +
          + +
          html_scripts: readonly JavaScriptHtmlScriptObservation[]
          +
          + +
          limitations: readonly string[]
          +
          + +
          modules: number
          +
          + +
          packages: readonly JavaScriptPackageObservation[]
          +
          + +
          parse_failures: number
          +
          + +
          source_maps: readonly JavaScriptSourceMapObservation[]
          +
          + +
          truncated_scopes: number
          +
          + +
          visited_ast_nodes: number
          +
          + +
          +
          diff --git a/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptHtmlScriptObservation.html b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptHtmlScriptObservation.html new file mode 100644 index 000000000..f7e595431 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptHtmlScriptObservation.html @@ -0,0 +1,70 @@ +JavaScriptHtmlScriptObservation | rea-agents - v1.6.0
          +
          rea-agents - v1.6.0 + +
            +
            +
            Preparing search index...
            +
            +
            + +
            +

            One HTML script source observed without building or executing a DOM.

            +
            +
            interface JavaScriptHtmlScriptObservation {
                html_path: string;
                location: JavaScriptSourceRange;
                script_path: string;
            }
            +
            +
            +
            +
            Index
            +
            +
            + +
            +
            + +
            +
            + +
            html_path: string
            +
            + +
            +
            + +
            script_path: string
            +
            + +
            +
            diff --git a/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptPackageObservation.html b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptPackageObservation.html new file mode 100644 index 000000000..34f2506f0 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptPackageObservation.html @@ -0,0 +1,100 @@ +JavaScriptPackageObservation | rea-agents - v1.6.0
            +
            rea-agents - v1.6.0 + +
              +
              +
              Preparing search index...
              +
              +
              + +
              +

              Parsed package metadata used only for static entrypoint discovery.

              +
              +
              interface JavaScriptPackageObservation {
                  limitation: string | null;
                  main: string | null;
                  name: string | null;
                  path: string;
                  renderer: string | null;
                  sha256: string;
                  status: "unavailable" | "invalid" | "included";
                  version: string | null;
              }
              +
              +
              +
              +
              Index
              +
              +
              + +
              +
              + +
              limitation: string | null
              +
              + +
              main: string | null
              +
              + +
              name: string | null
              +
              + +
              path: string
              +
              + +
              renderer: string | null
              +
              + +
              sha256: string
              +
              + +
              status: "unavailable" | "invalid" | "included"
              +
              + +
              version: string | null
              +
              + +
              +
              diff --git a/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptSourceMapObservation.html b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptSourceMapObservation.html new file mode 100644 index 000000000..f47ebb283 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptSourceMapObservation.html @@ -0,0 +1,88 @@ +JavaScriptSourceMapObservation | rea-agents - v1.6.0
              +
              rea-agents - v1.6.0 + +
                +
                +
                Preparing search index...
                +
                +
                + +
                +

                Bounded local source-map parse result.

                +
                +
                interface JavaScriptSourceMapObservation {
                    limitation: string | null;
                    omitted_sources: number | null;
                    path: string;
                    sha256: string;
                    sources: readonly JavaScriptSourceMapOriginal[];
                    status: "truncated" | "invalid" | "included" | "not-approved";
                }
                +
                +
                +
                +
                Index
                +
                +
                + +
                +
                + +
                limitation: string | null
                +
                + +
                omitted_sources: number | null
                +
                + +
                path: string
                +
                + +
                sha256: string
                +
                + +
                sources: readonly JavaScriptSourceMapOriginal[]
                +
                + +
                status: "truncated" | "invalid" | "included" | "not-approved"
                +
                + +
                +
                diff --git a/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptSourceMapOriginal.html b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptSourceMapOriginal.html new file mode 100644 index 000000000..76a32a831 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactAnalysisTypes.JavaScriptSourceMapOriginal.html @@ -0,0 +1,70 @@ +JavaScriptSourceMapOriginal | rea-agents - v1.6.0
                +
                rea-agents - v1.6.0 + +
                  +
                  +
                  Preparing search index...
                  +
                  +
                  + +
                  +

                  One original source declared by an approved local source map.

                  +
                  +
                  interface JavaScriptSourceMapOriginal {
                      content: string | null;
                      content_sha256: string | null;
                      source: string;
                  }
                  +
                  +
                  +
                  +
                  Index
                  +
                  +
                  + +
                  +
                  + +
                  +
                  + +
                  content: string | null
                  +
                  + +
                  content_sha256: string | null
                  +
                  + +
                  source: string
                  +
                  + +
                  +
                  diff --git a/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactContainer.html b/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactContainer.html new file mode 100644 index 000000000..8aef83fb3 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactContainer.html @@ -0,0 +1,76 @@ +JavaScriptArtifactContainer | rea-agents - v1.6.0
                  +
                  rea-agents - v1.6.0 + +
                    +
                    +
                    Preparing search index...
                    +
                    +
                    +
                    + +

                    Interface JavaScriptArtifactContainer

                    +
                    +

                    One filesystem-backed ASAR nested beneath a directory input.

                    +
                    +
                    interface JavaScriptArtifactContainer {
                        bytes: number;
                        inventory_artifact_id: string;
                        path: string;
                        sha256: string;
                    }
                    +
                    +
                    +
                    +
                    Index
                    +
                    +
                    + +
                    +
                    + +
                    +
                    + +
                    bytes: number
                    +
                    + +
                    inventory_artifact_id: string
                    +
                    + +
                    path: string
                    +
                    + +
                    sha256: string
                    +
                    + +
                    +
                    diff --git a/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactFile.html b/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactFile.html new file mode 100644 index 000000000..0a2631825 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactFile.html @@ -0,0 +1,100 @@ +JavaScriptArtifactFile | rea-agents - v1.6.0
                    +
                    rea-agents - v1.6.0 + +
                      +
                      +
                      Preparing search index...
                      +
                      +
                      +
                      + +

                      Interface JavaScriptArtifactFile

                      +
                      +

                      One content-addressed local artifact file and its bounded text availability.

                      +
                      +
                      interface JavaScriptArtifactFile {
                          bytes: number;
                          container_sha256: string;
                          inventory_artifact_id: string;
                          kind: JavaScriptArtifactFileKind;
                          path: string;
                          sha256: string;
                          text:
                              | { included: true; value: string }
                              | {
                                  included: false;
                                  reason:
                                      | "not-applicable"
                                      | "not-approved"
                                      | "file-limit"
                                      | "byte-limit"
                                      | "invalid-utf8";
                              };
                          unpacked: boolean;
                      }
                      +
                      +
                      +
                      +
                      Index
                      +
                      +
                      + +
                      +
                      + +
                      bytes: number
                      +
                      + +
                      container_sha256: string
                      +
                      + +
                      inventory_artifact_id: string
                      +
                      + +
                      +
                      + +
                      path: string
                      +
                      + +
                      sha256: string
                      +
                      + +
                      text:
                          | { included: true; value: string }
                          | {
                              included: false;
                              reason:
                                  | "not-applicable"
                                  | "not-approved"
                                  | "file-limit"
                                  | "byte-limit"
                                  | "invalid-utf8";
                          }
                      +
                      + +
                      unpacked: boolean
                      +
                      + +
                      +
                      diff --git a/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactFileSet.html b/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactFileSet.html new file mode 100644 index 000000000..658e92b6b --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactFiles.JavaScriptArtifactFileSet.html @@ -0,0 +1,100 @@ +JavaScriptArtifactFileSet | rea-agents - v1.6.0
                      +
                      rea-agents - v1.6.0 + +
                        +
                        +
                        Preparing search index...
                        +
                        +
                        +
                        + +

                        Interface JavaScriptArtifactFileSet

                        +
                        +

                        Deterministic relevant-file projection plus explicit omissions.

                        +
                        +
                        interface JavaScriptArtifactFileSet {
                            containers: readonly JavaScriptArtifactContainer[];
                            files: readonly JavaScriptArtifactFile[];
                            invalid_utf8_files: number;
                            limit_omitted_text_files: number;
                            omitted_text_files: number;
                            policy_filtered_text_files: number;
                            text_bytes_read: number;
                            text_files_selected: number;
                        }
                        +
                        +
                        +
                        +
                        Index
                        +
                        +
                        + +
                        +
                        + +
                        containers: readonly JavaScriptArtifactContainer[]
                        +
                        + +
                        files: readonly JavaScriptArtifactFile[]
                        +
                        + +
                        invalid_utf8_files: number
                        +
                        + +
                        limit_omitted_text_files: number
                        +
                        + +
                        omitted_text_files: number
                        +
                        + +
                        policy_filtered_text_files: number
                        +
                        + +
                        text_bytes_read: number
                        +
                        + +
                        text_files_selected: number
                        +
                        + +
                        +
                        diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphContext.AstEdgeInput.html b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.AstEdgeInput.html new file mode 100644 index 000000000..33440f1fe --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.AstEdgeInput.html @@ -0,0 +1,94 @@ +AstEdgeInput | rea-agents - v1.6.0
                        +
                        rea-agents - v1.6.0 + +
                          +
                          +
                          Preparing search index...
                          +
                          +
                          + +
                          +

                          Exact AST containment edge values.

                          +
                          +
                          interface AstEdgeInput {
                              coverage: {
                                  limits: {
                                      name: string;
                                      unit:
                                          | "other"
                                          | "items"
                                          | "bytes"
                                          | "depth"
                                          | "instructions"
                                          | "milliseconds"
                                          | "characters";
                                      value: number;
                                  }[];
                                  omitted_count: number
                                  | null;
                                  status: "unknown" | "unavailable" | "complete" | "partial";
                                  truncated: boolean;
                              };
                              file: JavaScriptArtifactFile;
                              properties: Readonly<Record<string, unknown>>;
                              range: JavaScriptSourceRange;
                              source: {
                                  identity:
                                      | {
                                          sha256: string;
                                          stability: "global-exact";
                                          strategy: "content-digest";
                                      }
                                      | {
                                          original_source: string;
                                          source_map_sha256: string;
                                          source_sha256: string
                                          | null;
                                          stability: "source-map-exact";
                                          strategy: "source-map-original";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          path: string;
                                          stability: "artifact-version";
                                          strategy: "canonical-path";
                                      }
                                      | {
                                          algorithm: string;
                                          basis: (
                                              | "imports"
                                              | "exports"
                                              | "control-flow"
                                              | "syntax-tree"
                                              | "literals"
                                              | "api-usage"
                                          )[];
                                          fingerprint_sha256: string;
                                          stability: "cross-version-inference";
                                          strategy: "structural-fingerprint";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          key: string;
                                          namespace: string;
                                          stability: "artifact-version";
                                          strategy: "artifact-local-key";
                                      }
                                      | {
                                          capture_sha256: string;
                                          runtime_key: string;
                                          stability: "capture-only";
                                          strategy: "runtime-instance";
                                      }
                                      | {
                                          observation_sha256: string;
                                          scope: string;
                                          stability: "observation-only";
                                          strategy: "observation-fingerprint";
                                      };
                                  kind: | "unknown"
                                  | "target"
                                  | "native-addon"
                                  | "source-map"
                                  | "artifact"
                                  | "package"
                                  | "storage"
                                  | "worker"
                                  | "frame"
                                  | "endpoint"
                                  | "service-worker"
                                  | "installer"
                                  | "asar-entry"
                                  | "electron-main"
                                  | "electron-preload"
                                  | "electron-renderer"
                                  | "electron-utility"
                                  | "javascript-asset"
                                  | "javascript-chunk"
                                  | "javascript-module"
                                  | "source-module"
                                  | "browser-window"
                                  | "context-bridge-api"
                                  | "ipc-channel"
                                  | "ipc-handler"
                                  | "native-export"
                                  | "runtime-script-instance";
                                  node_id: string;
                                  observations: {
                                      evidence: {
                                          artifact: | { artifact_id: string; available: true; sha256: string }
                                          | {
                                              available: false;
                                              detail: string;
                                              reason:
                                                  | "unknown"
                                                  | "truncated"
                                                  | "unresolved"
                                                  | "not-applicable"
                                                  | "not-approved"
                                                  | "not-observed"
                                                  | "provider-unavailable";
                                          };
                                          authority: | "unknown"
                                          | "controlled-replay"
                                          | "historical-reference"
                                          | "artifact-bytes"
                                          | "ast-static-analysis"
                                          | "static-relationship-inference"
                                          | "passive-cdp-runtime"
                                          | "native-analysis-provider"
                                          | "user-assertion";
                                          confidence: "unknown"
                                          | "exact"
                                          | "low"
                                          | "medium"
                                          | "high";
                                          coverage: {
                                              limits: {
                                                  name: string;
                                                  unit:
                                                      | "other"
                                                      | "items"
                                                      | "bytes"
                                                      | "depth"
                                                      | "instructions"
                                                      | "milliseconds"
                                                      | "characters";
                                                  value: number;
                                              }[];
                                              omitted_count: number
                                              | null;
                                              status: "unknown" | "unavailable" | "complete" | "partial";
                                              truncated: boolean;
                                          };
                                          evidence_ids: string[];
                                          extractor: {
                                              executable_sha256: string
                                              | null;
                                              name: string;
                                              operation: string;
                                              version: string;
                                          };
                                          limitations: string[];
                                          location: | {
                                              available: false;
                                              detail: string;
                                              reason: | "unknown"
                                              | "truncated"
                                              | "unresolved"
                                              | "not-applicable"
                                              | "not-approved"
                                              | "not-observed"
                                              | "provider-unavailable";
                                          }
                                          | {
                                              available: true;
                                              value: | {
                                                  end: { column: number; line: number };
                                                  kind: "source-range";
                                                  source: string;
                                                  start: { column: number; line: number };
                                              }
                                              | { end: number; kind: "file-offset-range"; start: number }
                                              | { kind: "artifact-path"; path: string }
                                              | { kind: "url"; url: string }
                                              | {
                                                  capture_sha256: string;
                                                  frame_key: string | null;
                                                  kind: "runtime";
                                                  script_key: string | null;
                                                  target_key: string;
                                              }
                                              | { address: string; kind: "native-address"; symbol: string
                                              | null }
                                              | { export_path: string; kind: "package-export"; package_name: string };
                                          };
                                          state: "unknown"
                                          | "observed"
                                          | "inferred"
                                          | "unavailable";
                                      };
                                      identifier_strategy: {
                                          stability: "observation-exact";
                                          strategy: "semantic-content-sha256";
                                      };
                                      label: string
                                      | null;
                                      observation_id: string;
                                      properties: Record<string, JSONType>;
                                  }[];
                              };
                              target: {
                                  identity: | {
                                      sha256: string;
                                      stability: "global-exact";
                                      strategy: "content-digest";
                                  }
                                  | {
                                      original_source: string;
                                      source_map_sha256: string;
                                      source_sha256: string
                                      | null;
                                      stability: "source-map-exact";
                                      strategy: "source-map-original";
                                  }
                                  | {
                                      artifact_sha256: string;
                                      path: string;
                                      stability: "artifact-version";
                                      strategy: "canonical-path";
                                  }
                                  | {
                                      algorithm: string;
                                      basis: (
                                          | "imports"
                                          | "exports"
                                          | "control-flow"
                                          | "syntax-tree"
                                          | "literals"
                                          | "api-usage"
                                      )[];
                                      fingerprint_sha256: string;
                                      stability: "cross-version-inference";
                                      strategy: "structural-fingerprint";
                                  }
                                  | {
                                      artifact_sha256: string;
                                      key: string;
                                      namespace: string;
                                      stability: "artifact-version";
                                      strategy: "artifact-local-key";
                                  }
                                  | {
                                      capture_sha256: string;
                                      runtime_key: string;
                                      stability: "capture-only";
                                      strategy: "runtime-instance";
                                  }
                                  | {
                                      observation_sha256: string;
                                      scope: string;
                                      stability: "observation-only";
                                      strategy: "observation-fingerprint";
                                  };
                                  kind: | "unknown"
                                  | "target"
                                  | "native-addon"
                                  | "source-map"
                                  | "artifact"
                                  | "package"
                                  | "storage"
                                  | "worker"
                                  | "frame"
                                  | "endpoint"
                                  | "service-worker"
                                  | "installer"
                                  | "asar-entry"
                                  | "electron-main"
                                  | "electron-preload"
                                  | "electron-renderer"
                                  | "electron-utility"
                                  | "javascript-asset"
                                  | "javascript-chunk"
                                  | "javascript-module"
                                  | "source-module"
                                  | "browser-window"
                                  | "context-bridge-api"
                                  | "ipc-channel"
                                  | "ipc-handler"
                                  | "native-export"
                                  | "runtime-script-instance";
                                  node_id: string;
                                  observations: {
                                      evidence: {
                                          artifact: | { artifact_id: string; available: true; sha256: string }
                                          | {
                                              available: false;
                                              detail: string;
                                              reason:
                                                  | "unknown"
                                                  | "truncated"
                                                  | "unresolved"
                                                  | "not-applicable"
                                                  | "not-approved"
                                                  | "not-observed"
                                                  | "provider-unavailable";
                                          };
                                          authority: | "unknown"
                                          | "controlled-replay"
                                          | "historical-reference"
                                          | "artifact-bytes"
                                          | "ast-static-analysis"
                                          | "static-relationship-inference"
                                          | "passive-cdp-runtime"
                                          | "native-analysis-provider"
                                          | "user-assertion";
                                          confidence: "unknown"
                                          | "exact"
                                          | "low"
                                          | "medium"
                                          | "high";
                                          coverage: {
                                              limits: {
                                                  name: string;
                                                  unit:
                                                      | "other"
                                                      | "items"
                                                      | "bytes"
                                                      | "depth"
                                                      | "instructions"
                                                      | "milliseconds"
                                                      | "characters";
                                                  value: number;
                                              }[];
                                              omitted_count: number
                                              | null;
                                              status: "unknown" | "unavailable" | "complete" | "partial";
                                              truncated: boolean;
                                          };
                                          evidence_ids: string[];
                                          extractor: {
                                              executable_sha256: string
                                              | null;
                                              name: string;
                                              operation: string;
                                              version: string;
                                          };
                                          limitations: string[];
                                          location: | {
                                              available: false;
                                              detail: string;
                                              reason: | "unknown"
                                              | "truncated"
                                              | "unresolved"
                                              | "not-applicable"
                                              | "not-approved"
                                              | "not-observed"
                                              | "provider-unavailable";
                                          }
                                          | {
                                              available: true;
                                              value: | {
                                                  end: { column: number; line: number };
                                                  kind: "source-range";
                                                  source: string;
                                                  start: { column: number; line: number };
                                              }
                                              | { end: number; kind: "file-offset-range"; start: number }
                                              | { kind: "artifact-path"; path: string }
                                              | { kind: "url"; url: string }
                                              | {
                                                  capture_sha256: string;
                                                  frame_key: string | null;
                                                  kind: "runtime";
                                                  script_key: string | null;
                                                  target_key: string;
                                              }
                                              | { address: string; kind: "native-address"; symbol: string
                                              | null }
                                              | { export_path: string; kind: "package-export"; package_name: string };
                                          };
                                          state: "unknown"
                                          | "observed"
                                          | "inferred"
                                          | "unavailable";
                                      };
                                      identifier_strategy: {
                                          stability: "observation-exact";
                                          strategy: "semantic-content-sha256";
                                      };
                                      label: string
                                      | null;
                                      observation_id: string;
                                      properties: Record<string, JSONType>;
                                  }[];
                              };
                          }
                          +
                          +

                          Hierarchy (View Summary)

                          +
                          +
                          +
                          +
                          +
                          Index
                          +
                          +
                          + +
                          +
                          + +
                          +
                          + +
                          coverage: {
                              limits: {
                                  name: string;
                                  unit:
                                      | "other"
                                      | "items"
                                      | "bytes"
                                      | "depth"
                                      | "instructions"
                                      | "milliseconds"
                                      | "characters";
                                  value: number;
                              }[];
                              omitted_count: number
                              | null;
                              status: "unknown" | "unavailable" | "complete" | "partial";
                              truncated: boolean;
                          }
                          +
                          + +
                          +
                          + +
                          properties: Readonly<Record<string, unknown>>
                          +
                          + +
                          +
                          + +
                          source: {
                              identity:
                                  | {
                                      sha256: string;
                                      stability: "global-exact";
                                      strategy: "content-digest";
                                  }
                                  | {
                                      original_source: string;
                                      source_map_sha256: string;
                                      source_sha256: string
                                      | null;
                                      stability: "source-map-exact";
                                      strategy: "source-map-original";
                                  }
                                  | {
                                      artifact_sha256: string;
                                      path: string;
                                      stability: "artifact-version";
                                      strategy: "canonical-path";
                                  }
                                  | {
                                      algorithm: string;
                                      basis: (
                                          | "imports"
                                          | "exports"
                                          | "control-flow"
                                          | "syntax-tree"
                                          | "literals"
                                          | "api-usage"
                                      )[];
                                      fingerprint_sha256: string;
                                      stability: "cross-version-inference";
                                      strategy: "structural-fingerprint";
                                  }
                                  | {
                                      artifact_sha256: string;
                                      key: string;
                                      namespace: string;
                                      stability: "artifact-version";
                                      strategy: "artifact-local-key";
                                  }
                                  | {
                                      capture_sha256: string;
                                      runtime_key: string;
                                      stability: "capture-only";
                                      strategy: "runtime-instance";
                                  }
                                  | {
                                      observation_sha256: string;
                                      scope: string;
                                      stability: "observation-only";
                                      strategy: "observation-fingerprint";
                                  };
                              kind: | "unknown"
                              | "target"
                              | "native-addon"
                              | "source-map"
                              | "artifact"
                              | "package"
                              | "storage"
                              | "worker"
                              | "frame"
                              | "endpoint"
                              | "service-worker"
                              | "installer"
                              | "asar-entry"
                              | "electron-main"
                              | "electron-preload"
                              | "electron-renderer"
                              | "electron-utility"
                              | "javascript-asset"
                              | "javascript-chunk"
                              | "javascript-module"
                              | "source-module"
                              | "browser-window"
                              | "context-bridge-api"
                              | "ipc-channel"
                              | "ipc-handler"
                              | "native-export"
                              | "runtime-script-instance";
                              node_id: string;
                              observations: {
                                  evidence: {
                                      artifact: | { artifact_id: string; available: true; sha256: string }
                                      | {
                                          available: false;
                                          detail: string;
                                          reason:
                                              | "unknown"
                                              | "truncated"
                                              | "unresolved"
                                              | "not-applicable"
                                              | "not-approved"
                                              | "not-observed"
                                              | "provider-unavailable";
                                      };
                                      authority: | "unknown"
                                      | "controlled-replay"
                                      | "historical-reference"
                                      | "artifact-bytes"
                                      | "ast-static-analysis"
                                      | "static-relationship-inference"
                                      | "passive-cdp-runtime"
                                      | "native-analysis-provider"
                                      | "user-assertion";
                                      confidence: "unknown"
                                      | "exact"
                                      | "low"
                                      | "medium"
                                      | "high";
                                      coverage: {
                                          limits: {
                                              name: string;
                                              unit:
                                                  | "other"
                                                  | "items"
                                                  | "bytes"
                                                  | "depth"
                                                  | "instructions"
                                                  | "milliseconds"
                                                  | "characters";
                                              value: number;
                                          }[];
                                          omitted_count: number
                                          | null;
                                          status: "unknown" | "unavailable" | "complete" | "partial";
                                          truncated: boolean;
                                      };
                                      evidence_ids: string[];
                                      extractor: {
                                          executable_sha256: string
                                          | null;
                                          name: string;
                                          operation: string;
                                          version: string;
                                      };
                                      limitations: string[];
                                      location: | {
                                          available: false;
                                          detail: string;
                                          reason: | "unknown"
                                          | "truncated"
                                          | "unresolved"
                                          | "not-applicable"
                                          | "not-approved"
                                          | "not-observed"
                                          | "provider-unavailable";
                                      }
                                      | {
                                          available: true;
                                          value: | {
                                              end: { column: number; line: number };
                                              kind: "source-range";
                                              source: string;
                                              start: { column: number; line: number };
                                          }
                                          | { end: number; kind: "file-offset-range"; start: number }
                                          | { kind: "artifact-path"; path: string }
                                          | { kind: "url"; url: string }
                                          | {
                                              capture_sha256: string;
                                              frame_key: string | null;
                                              kind: "runtime";
                                              script_key: string | null;
                                              target_key: string;
                                          }
                                          | { address: string; kind: "native-address"; symbol: string
                                          | null }
                                          | { export_path: string; kind: "package-export"; package_name: string };
                                      };
                                      state: "unknown"
                                      | "observed"
                                      | "inferred"
                                      | "unavailable";
                                  };
                                  identifier_strategy: {
                                      stability: "observation-exact";
                                      strategy: "semantic-content-sha256";
                                  };
                                  label: string
                                  | null;
                                  observation_id: string;
                                  properties: Record<string, JSONType>;
                              }[];
                          }
                          +
                          + +
                          target: {
                              identity:
                                  | {
                                      sha256: string;
                                      stability: "global-exact";
                                      strategy: "content-digest";
                                  }
                                  | {
                                      original_source: string;
                                      source_map_sha256: string;
                                      source_sha256: string
                                      | null;
                                      stability: "source-map-exact";
                                      strategy: "source-map-original";
                                  }
                                  | {
                                      artifact_sha256: string;
                                      path: string;
                                      stability: "artifact-version";
                                      strategy: "canonical-path";
                                  }
                                  | {
                                      algorithm: string;
                                      basis: (
                                          | "imports"
                                          | "exports"
                                          | "control-flow"
                                          | "syntax-tree"
                                          | "literals"
                                          | "api-usage"
                                      )[];
                                      fingerprint_sha256: string;
                                      stability: "cross-version-inference";
                                      strategy: "structural-fingerprint";
                                  }
                                  | {
                                      artifact_sha256: string;
                                      key: string;
                                      namespace: string;
                                      stability: "artifact-version";
                                      strategy: "artifact-local-key";
                                  }
                                  | {
                                      capture_sha256: string;
                                      runtime_key: string;
                                      stability: "capture-only";
                                      strategy: "runtime-instance";
                                  }
                                  | {
                                      observation_sha256: string;
                                      scope: string;
                                      stability: "observation-only";
                                      strategy: "observation-fingerprint";
                                  };
                              kind: | "unknown"
                              | "target"
                              | "native-addon"
                              | "source-map"
                              | "artifact"
                              | "package"
                              | "storage"
                              | "worker"
                              | "frame"
                              | "endpoint"
                              | "service-worker"
                              | "installer"
                              | "asar-entry"
                              | "electron-main"
                              | "electron-preload"
                              | "electron-renderer"
                              | "electron-utility"
                              | "javascript-asset"
                              | "javascript-chunk"
                              | "javascript-module"
                              | "source-module"
                              | "browser-window"
                              | "context-bridge-api"
                              | "ipc-channel"
                              | "ipc-handler"
                              | "native-export"
                              | "runtime-script-instance";
                              node_id: string;
                              observations: {
                                  evidence: {
                                      artifact: | { artifact_id: string; available: true; sha256: string }
                                      | {
                                          available: false;
                                          detail: string;
                                          reason:
                                              | "unknown"
                                              | "truncated"
                                              | "unresolved"
                                              | "not-applicable"
                                              | "not-approved"
                                              | "not-observed"
                                              | "provider-unavailable";
                                      };
                                      authority: | "unknown"
                                      | "controlled-replay"
                                      | "historical-reference"
                                      | "artifact-bytes"
                                      | "ast-static-analysis"
                                      | "static-relationship-inference"
                                      | "passive-cdp-runtime"
                                      | "native-analysis-provider"
                                      | "user-assertion";
                                      confidence: "unknown"
                                      | "exact"
                                      | "low"
                                      | "medium"
                                      | "high";
                                      coverage: {
                                          limits: {
                                              name: string;
                                              unit:
                                                  | "other"
                                                  | "items"
                                                  | "bytes"
                                                  | "depth"
                                                  | "instructions"
                                                  | "milliseconds"
                                                  | "characters";
                                              value: number;
                                          }[];
                                          omitted_count: number
                                          | null;
                                          status: "unknown" | "unavailable" | "complete" | "partial";
                                          truncated: boolean;
                                      };
                                      evidence_ids: string[];
                                      extractor: {
                                          executable_sha256: string
                                          | null;
                                          name: string;
                                          operation: string;
                                          version: string;
                                      };
                                      limitations: string[];
                                      location: | {
                                          available: false;
                                          detail: string;
                                          reason: | "unknown"
                                          | "truncated"
                                          | "unresolved"
                                          | "not-applicable"
                                          | "not-approved"
                                          | "not-observed"
                                          | "provider-unavailable";
                                      }
                                      | {
                                          available: true;
                                          value: | {
                                              end: { column: number; line: number };
                                              kind: "source-range";
                                              source: string;
                                              start: { column: number; line: number };
                                          }
                                          | { end: number; kind: "file-offset-range"; start: number }
                                          | { kind: "artifact-path"; path: string }
                                          | { kind: "url"; url: string }
                                          | {
                                              capture_sha256: string;
                                              frame_key: string | null;
                                              kind: "runtime";
                                              script_key: string | null;
                                              target_key: string;
                                          }
                                          | { address: string; kind: "native-address"; symbol: string
                                          | null }
                                          | { export_path: string; kind: "package-export"; package_name: string };
                                      };
                                      state: "unknown"
                                      | "observed"
                                      | "inferred"
                                      | "unavailable";
                                  };
                                  identifier_strategy: {
                                      stability: "observation-exact";
                                      strategy: "semantic-content-sha256";
                                  };
                                  label: string
                                  | null;
                                  observation_id: string;
                                  properties: Record<string, JSONType>;
                              }[];
                          }
                          +
                          + +
                          +
                          diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphContext.ContainsEdgeInput.html b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.ContainsEdgeInput.html new file mode 100644 index 000000000..0c9c82aa4 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.ContainsEdgeInput.html @@ -0,0 +1,76 @@ +ContainsEdgeInput | rea-agents - v1.6.0
                          +
                          rea-agents - v1.6.0 + +
                            +
                            +
                            Preparing search index...
                            +
                            +
                            + +
                            +

                            Direct artifact-containment edge values.

                            +
                            +
                            interface ContainsEdgeInput {
                                file: JavaScriptArtifactFile;
                                operation: string;
                                source: {
                                    identity:
                                        | {
                                            sha256: string;
                                            stability: "global-exact";
                                            strategy: "content-digest";
                                        }
                                        | {
                                            original_source: string;
                                            source_map_sha256: string;
                                            source_sha256: string
                                            | null;
                                            stability: "source-map-exact";
                                            strategy: "source-map-original";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            path: string;
                                            stability: "artifact-version";
                                            strategy: "canonical-path";
                                        }
                                        | {
                                            algorithm: string;
                                            basis: (
                                                | "imports"
                                                | "exports"
                                                | "control-flow"
                                                | "syntax-tree"
                                                | "literals"
                                                | "api-usage"
                                            )[];
                                            fingerprint_sha256: string;
                                            stability: "cross-version-inference";
                                            strategy: "structural-fingerprint";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            key: string;
                                            namespace: string;
                                            stability: "artifact-version";
                                            strategy: "artifact-local-key";
                                        }
                                        | {
                                            capture_sha256: string;
                                            runtime_key: string;
                                            stability: "capture-only";
                                            strategy: "runtime-instance";
                                        }
                                        | {
                                            observation_sha256: string;
                                            scope: string;
                                            stability: "observation-only";
                                            strategy: "observation-fingerprint";
                                        };
                                    kind: | "unknown"
                                    | "target"
                                    | "native-addon"
                                    | "source-map"
                                    | "artifact"
                                    | "package"
                                    | "storage"
                                    | "worker"
                                    | "frame"
                                    | "endpoint"
                                    | "service-worker"
                                    | "installer"
                                    | "asar-entry"
                                    | "electron-main"
                                    | "electron-preload"
                                    | "electron-renderer"
                                    | "electron-utility"
                                    | "javascript-asset"
                                    | "javascript-chunk"
                                    | "javascript-module"
                                    | "source-module"
                                    | "browser-window"
                                    | "context-bridge-api"
                                    | "ipc-channel"
                                    | "ipc-handler"
                                    | "native-export"
                                    | "runtime-script-instance";
                                    node_id: string;
                                    observations: {
                                        evidence: {
                                            artifact: | { artifact_id: string; available: true; sha256: string }
                                            | {
                                                available: false;
                                                detail: string;
                                                reason:
                                                    | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                            };
                                            authority: | "unknown"
                                            | "controlled-replay"
                                            | "historical-reference"
                                            | "artifact-bytes"
                                            | "ast-static-analysis"
                                            | "static-relationship-inference"
                                            | "passive-cdp-runtime"
                                            | "native-analysis-provider"
                                            | "user-assertion";
                                            confidence: "unknown"
                                            | "exact"
                                            | "low"
                                            | "medium"
                                            | "high";
                                            coverage: {
                                                limits: {
                                                    name: string;
                                                    unit:
                                                        | "other"
                                                        | "items"
                                                        | "bytes"
                                                        | "depth"
                                                        | "instructions"
                                                        | "milliseconds"
                                                        | "characters";
                                                    value: number;
                                                }[];
                                                omitted_count: number
                                                | null;
                                                status: "unknown" | "unavailable" | "complete" | "partial";
                                                truncated: boolean;
                                            };
                                            evidence_ids: string[];
                                            extractor: {
                                                executable_sha256: string
                                                | null;
                                                name: string;
                                                operation: string;
                                                version: string;
                                            };
                                            limitations: string[];
                                            location: | {
                                                available: false;
                                                detail: string;
                                                reason: | "unknown"
                                                | "truncated"
                                                | "unresolved"
                                                | "not-applicable"
                                                | "not-approved"
                                                | "not-observed"
                                                | "provider-unavailable";
                                            }
                                            | {
                                                available: true;
                                                value: | {
                                                    end: { column: number; line: number };
                                                    kind: "source-range";
                                                    source: string;
                                                    start: { column: number; line: number };
                                                }
                                                | { end: number; kind: "file-offset-range"; start: number }
                                                | { kind: "artifact-path"; path: string }
                                                | { kind: "url"; url: string }
                                                | {
                                                    capture_sha256: string;
                                                    frame_key: string | null;
                                                    kind: "runtime";
                                                    script_key: string | null;
                                                    target_key: string;
                                                }
                                                | { address: string; kind: "native-address"; symbol: string
                                                | null }
                                                | { export_path: string; kind: "package-export"; package_name: string };
                                            };
                                            state: "unknown"
                                            | "observed"
                                            | "inferred"
                                            | "unavailable";
                                        };
                                        identifier_strategy: {
                                            stability: "observation-exact";
                                            strategy: "semantic-content-sha256";
                                        };
                                        label: string
                                        | null;
                                        observation_id: string;
                                        properties: Record<string, JSONType>;
                                    }[];
                                };
                                target: {
                                    identity: | {
                                        sha256: string;
                                        stability: "global-exact";
                                        strategy: "content-digest";
                                    }
                                    | {
                                        original_source: string;
                                        source_map_sha256: string;
                                        source_sha256: string
                                        | null;
                                        stability: "source-map-exact";
                                        strategy: "source-map-original";
                                    }
                                    | {
                                        artifact_sha256: string;
                                        path: string;
                                        stability: "artifact-version";
                                        strategy: "canonical-path";
                                    }
                                    | {
                                        algorithm: string;
                                        basis: (
                                            | "imports"
                                            | "exports"
                                            | "control-flow"
                                            | "syntax-tree"
                                            | "literals"
                                            | "api-usage"
                                        )[];
                                        fingerprint_sha256: string;
                                        stability: "cross-version-inference";
                                        strategy: "structural-fingerprint";
                                    }
                                    | {
                                        artifact_sha256: string;
                                        key: string;
                                        namespace: string;
                                        stability: "artifact-version";
                                        strategy: "artifact-local-key";
                                    }
                                    | {
                                        capture_sha256: string;
                                        runtime_key: string;
                                        stability: "capture-only";
                                        strategy: "runtime-instance";
                                    }
                                    | {
                                        observation_sha256: string;
                                        scope: string;
                                        stability: "observation-only";
                                        strategy: "observation-fingerprint";
                                    };
                                    kind: | "unknown"
                                    | "target"
                                    | "native-addon"
                                    | "source-map"
                                    | "artifact"
                                    | "package"
                                    | "storage"
                                    | "worker"
                                    | "frame"
                                    | "endpoint"
                                    | "service-worker"
                                    | "installer"
                                    | "asar-entry"
                                    | "electron-main"
                                    | "electron-preload"
                                    | "electron-renderer"
                                    | "electron-utility"
                                    | "javascript-asset"
                                    | "javascript-chunk"
                                    | "javascript-module"
                                    | "source-module"
                                    | "browser-window"
                                    | "context-bridge-api"
                                    | "ipc-channel"
                                    | "ipc-handler"
                                    | "native-export"
                                    | "runtime-script-instance";
                                    node_id: string;
                                    observations: {
                                        evidence: {
                                            artifact: | { artifact_id: string; available: true; sha256: string }
                                            | {
                                                available: false;
                                                detail: string;
                                                reason:
                                                    | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                            };
                                            authority: | "unknown"
                                            | "controlled-replay"
                                            | "historical-reference"
                                            | "artifact-bytes"
                                            | "ast-static-analysis"
                                            | "static-relationship-inference"
                                            | "passive-cdp-runtime"
                                            | "native-analysis-provider"
                                            | "user-assertion";
                                            confidence: "unknown"
                                            | "exact"
                                            | "low"
                                            | "medium"
                                            | "high";
                                            coverage: {
                                                limits: {
                                                    name: string;
                                                    unit:
                                                        | "other"
                                                        | "items"
                                                        | "bytes"
                                                        | "depth"
                                                        | "instructions"
                                                        | "milliseconds"
                                                        | "characters";
                                                    value: number;
                                                }[];
                                                omitted_count: number
                                                | null;
                                                status: "unknown" | "unavailable" | "complete" | "partial";
                                                truncated: boolean;
                                            };
                                            evidence_ids: string[];
                                            extractor: {
                                                executable_sha256: string
                                                | null;
                                                name: string;
                                                operation: string;
                                                version: string;
                                            };
                                            limitations: string[];
                                            location: | {
                                                available: false;
                                                detail: string;
                                                reason: | "unknown"
                                                | "truncated"
                                                | "unresolved"
                                                | "not-applicable"
                                                | "not-approved"
                                                | "not-observed"
                                                | "provider-unavailable";
                                            }
                                            | {
                                                available: true;
                                                value: | {
                                                    end: { column: number; line: number };
                                                    kind: "source-range";
                                                    source: string;
                                                    start: { column: number; line: number };
                                                }
                                                | { end: number; kind: "file-offset-range"; start: number }
                                                | { kind: "artifact-path"; path: string }
                                                | { kind: "url"; url: string }
                                                | {
                                                    capture_sha256: string;
                                                    frame_key: string | null;
                                                    kind: "runtime";
                                                    script_key: string | null;
                                                    target_key: string;
                                                }
                                                | { address: string; kind: "native-address"; symbol: string
                                                | null }
                                                | { export_path: string; kind: "package-export"; package_name: string };
                                            };
                                            state: "unknown"
                                            | "observed"
                                            | "inferred"
                                            | "unavailable";
                                        };
                                        identifier_strategy: {
                                            stability: "observation-exact";
                                            strategy: "semantic-content-sha256";
                                        };
                                        label: string
                                        | null;
                                        observation_id: string;
                                        properties: Record<string, JSONType>;
                                    }[];
                                };
                            }
                            +
                            +
                            +
                            +
                            Index
                            +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            operation: string
                            +
                            + +
                            source: {
                                identity:
                                    | {
                                        sha256: string;
                                        stability: "global-exact";
                                        strategy: "content-digest";
                                    }
                                    | {
                                        original_source: string;
                                        source_map_sha256: string;
                                        source_sha256: string
                                        | null;
                                        stability: "source-map-exact";
                                        strategy: "source-map-original";
                                    }
                                    | {
                                        artifact_sha256: string;
                                        path: string;
                                        stability: "artifact-version";
                                        strategy: "canonical-path";
                                    }
                                    | {
                                        algorithm: string;
                                        basis: (
                                            | "imports"
                                            | "exports"
                                            | "control-flow"
                                            | "syntax-tree"
                                            | "literals"
                                            | "api-usage"
                                        )[];
                                        fingerprint_sha256: string;
                                        stability: "cross-version-inference";
                                        strategy: "structural-fingerprint";
                                    }
                                    | {
                                        artifact_sha256: string;
                                        key: string;
                                        namespace: string;
                                        stability: "artifact-version";
                                        strategy: "artifact-local-key";
                                    }
                                    | {
                                        capture_sha256: string;
                                        runtime_key: string;
                                        stability: "capture-only";
                                        strategy: "runtime-instance";
                                    }
                                    | {
                                        observation_sha256: string;
                                        scope: string;
                                        stability: "observation-only";
                                        strategy: "observation-fingerprint";
                                    };
                                kind: | "unknown"
                                | "target"
                                | "native-addon"
                                | "source-map"
                                | "artifact"
                                | "package"
                                | "storage"
                                | "worker"
                                | "frame"
                                | "endpoint"
                                | "service-worker"
                                | "installer"
                                | "asar-entry"
                                | "electron-main"
                                | "electron-preload"
                                | "electron-renderer"
                                | "electron-utility"
                                | "javascript-asset"
                                | "javascript-chunk"
                                | "javascript-module"
                                | "source-module"
                                | "browser-window"
                                | "context-bridge-api"
                                | "ipc-channel"
                                | "ipc-handler"
                                | "native-export"
                                | "runtime-script-instance";
                                node_id: string;
                                observations: {
                                    evidence: {
                                        artifact: | { artifact_id: string; available: true; sha256: string }
                                        | {
                                            available: false;
                                            detail: string;
                                            reason:
                                                | "unknown"
                                                | "truncated"
                                                | "unresolved"
                                                | "not-applicable"
                                                | "not-approved"
                                                | "not-observed"
                                                | "provider-unavailable";
                                        };
                                        authority: | "unknown"
                                        | "controlled-replay"
                                        | "historical-reference"
                                        | "artifact-bytes"
                                        | "ast-static-analysis"
                                        | "static-relationship-inference"
                                        | "passive-cdp-runtime"
                                        | "native-analysis-provider"
                                        | "user-assertion";
                                        confidence: "unknown"
                                        | "exact"
                                        | "low"
                                        | "medium"
                                        | "high";
                                        coverage: {
                                            limits: {
                                                name: string;
                                                unit:
                                                    | "other"
                                                    | "items"
                                                    | "bytes"
                                                    | "depth"
                                                    | "instructions"
                                                    | "milliseconds"
                                                    | "characters";
                                                value: number;
                                            }[];
                                            omitted_count: number
                                            | null;
                                            status: "unknown" | "unavailable" | "complete" | "partial";
                                            truncated: boolean;
                                        };
                                        evidence_ids: string[];
                                        extractor: {
                                            executable_sha256: string
                                            | null;
                                            name: string;
                                            operation: string;
                                            version: string;
                                        };
                                        limitations: string[];
                                        location: | {
                                            available: false;
                                            detail: string;
                                            reason: | "unknown"
                                            | "truncated"
                                            | "unresolved"
                                            | "not-applicable"
                                            | "not-approved"
                                            | "not-observed"
                                            | "provider-unavailable";
                                        }
                                        | {
                                            available: true;
                                            value: | {
                                                end: { column: number; line: number };
                                                kind: "source-range";
                                                source: string;
                                                start: { column: number; line: number };
                                            }
                                            | { end: number; kind: "file-offset-range"; start: number }
                                            | { kind: "artifact-path"; path: string }
                                            | { kind: "url"; url: string }
                                            | {
                                                capture_sha256: string;
                                                frame_key: string | null;
                                                kind: "runtime";
                                                script_key: string | null;
                                                target_key: string;
                                            }
                                            | { address: string; kind: "native-address"; symbol: string
                                            | null }
                                            | { export_path: string; kind: "package-export"; package_name: string };
                                        };
                                        state: "unknown"
                                        | "observed"
                                        | "inferred"
                                        | "unavailable";
                                    };
                                    identifier_strategy: {
                                        stability: "observation-exact";
                                        strategy: "semantic-content-sha256";
                                    };
                                    label: string
                                    | null;
                                    observation_id: string;
                                    properties: Record<string, JSONType>;
                                }[];
                            }
                            +
                            + +
                            target: {
                                identity:
                                    | {
                                        sha256: string;
                                        stability: "global-exact";
                                        strategy: "content-digest";
                                    }
                                    | {
                                        original_source: string;
                                        source_map_sha256: string;
                                        source_sha256: string
                                        | null;
                                        stability: "source-map-exact";
                                        strategy: "source-map-original";
                                    }
                                    | {
                                        artifact_sha256: string;
                                        path: string;
                                        stability: "artifact-version";
                                        strategy: "canonical-path";
                                    }
                                    | {
                                        algorithm: string;
                                        basis: (
                                            | "imports"
                                            | "exports"
                                            | "control-flow"
                                            | "syntax-tree"
                                            | "literals"
                                            | "api-usage"
                                        )[];
                                        fingerprint_sha256: string;
                                        stability: "cross-version-inference";
                                        strategy: "structural-fingerprint";
                                    }
                                    | {
                                        artifact_sha256: string;
                                        key: string;
                                        namespace: string;
                                        stability: "artifact-version";
                                        strategy: "artifact-local-key";
                                    }
                                    | {
                                        capture_sha256: string;
                                        runtime_key: string;
                                        stability: "capture-only";
                                        strategy: "runtime-instance";
                                    }
                                    | {
                                        observation_sha256: string;
                                        scope: string;
                                        stability: "observation-only";
                                        strategy: "observation-fingerprint";
                                    };
                                kind: | "unknown"
                                | "target"
                                | "native-addon"
                                | "source-map"
                                | "artifact"
                                | "package"
                                | "storage"
                                | "worker"
                                | "frame"
                                | "endpoint"
                                | "service-worker"
                                | "installer"
                                | "asar-entry"
                                | "electron-main"
                                | "electron-preload"
                                | "electron-renderer"
                                | "electron-utility"
                                | "javascript-asset"
                                | "javascript-chunk"
                                | "javascript-module"
                                | "source-module"
                                | "browser-window"
                                | "context-bridge-api"
                                | "ipc-channel"
                                | "ipc-handler"
                                | "native-export"
                                | "runtime-script-instance";
                                node_id: string;
                                observations: {
                                    evidence: {
                                        artifact: | { artifact_id: string; available: true; sha256: string }
                                        | {
                                            available: false;
                                            detail: string;
                                            reason:
                                                | "unknown"
                                                | "truncated"
                                                | "unresolved"
                                                | "not-applicable"
                                                | "not-approved"
                                                | "not-observed"
                                                | "provider-unavailable";
                                        };
                                        authority: | "unknown"
                                        | "controlled-replay"
                                        | "historical-reference"
                                        | "artifact-bytes"
                                        | "ast-static-analysis"
                                        | "static-relationship-inference"
                                        | "passive-cdp-runtime"
                                        | "native-analysis-provider"
                                        | "user-assertion";
                                        confidence: "unknown"
                                        | "exact"
                                        | "low"
                                        | "medium"
                                        | "high";
                                        coverage: {
                                            limits: {
                                                name: string;
                                                unit:
                                                    | "other"
                                                    | "items"
                                                    | "bytes"
                                                    | "depth"
                                                    | "instructions"
                                                    | "milliseconds"
                                                    | "characters";
                                                value: number;
                                            }[];
                                            omitted_count: number
                                            | null;
                                            status: "unknown" | "unavailable" | "complete" | "partial";
                                            truncated: boolean;
                                        };
                                        evidence_ids: string[];
                                        extractor: {
                                            executable_sha256: string
                                            | null;
                                            name: string;
                                            operation: string;
                                            version: string;
                                        };
                                        limitations: string[];
                                        location: | {
                                            available: false;
                                            detail: string;
                                            reason: | "unknown"
                                            | "truncated"
                                            | "unresolved"
                                            | "not-applicable"
                                            | "not-approved"
                                            | "not-observed"
                                            | "provider-unavailable";
                                        }
                                        | {
                                            available: true;
                                            value: | {
                                                end: { column: number; line: number };
                                                kind: "source-range";
                                                source: string;
                                                start: { column: number; line: number };
                                            }
                                            | { end: number; kind: "file-offset-range"; start: number }
                                            | { kind: "artifact-path"; path: string }
                                            | { kind: "url"; url: string }
                                            | {
                                                capture_sha256: string;
                                                frame_key: string | null;
                                                kind: "runtime";
                                                script_key: string | null;
                                                target_key: string;
                                            }
                                            | { address: string; kind: "native-address"; symbol: string
                                            | null }
                                            | { export_path: string; kind: "package-export"; package_name: string };
                                        };
                                        state: "unknown"
                                        | "observed"
                                        | "inferred"
                                        | "unavailable";
                                    };
                                    identifier_strategy: {
                                        stability: "observation-exact";
                                        strategy: "semantic-content-sha256";
                                    };
                                    label: string
                                    | null;
                                    observation_id: string;
                                    properties: Record<string, JSONType>;
                                }[];
                            }
                            +
                            + +
                            +
                            diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphContext.InferenceEdgeInput.html b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.InferenceEdgeInput.html new file mode 100644 index 000000000..883a41499 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.InferenceEdgeInput.html @@ -0,0 +1,106 @@ +InferenceEdgeInput | rea-agents - v1.6.0
                            +
                            rea-agents - v1.6.0 + +
                              +
                              +
                              Preparing search index...
                              +
                              +
                              + +
                              +

                              Inferred static relationship edge values.

                              +
                              +
                              interface InferenceEdgeInput {
                                  coverage: {
                                      limits: {
                                          name: string;
                                          unit:
                                              | "other"
                                              | "items"
                                              | "bytes"
                                              | "depth"
                                              | "instructions"
                                              | "milliseconds"
                                              | "characters";
                                          value: number;
                                      }[];
                                      omitted_count: number
                                      | null;
                                      status: "unknown" | "unavailable" | "complete" | "partial";
                                      truncated: boolean;
                                  };
                                  file: JavaScriptArtifactFile;
                                  properties: Readonly<Record<string, unknown>>;
                                  range: JavaScriptSourceRange;
                                  relation:
                                      | "loads"
                                      | "calls"
                                      | "imports"
                                      | "maps_to"
                                      | "exposes"
                                      | "persists_to";
                                  source: {
                                      identity: | {
                                          sha256: string;
                                          stability: "global-exact";
                                          strategy: "content-digest";
                                      }
                                      | {
                                          original_source: string;
                                          source_map_sha256: string;
                                          source_sha256: string
                                          | null;
                                          stability: "source-map-exact";
                                          strategy: "source-map-original";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          path: string;
                                          stability: "artifact-version";
                                          strategy: "canonical-path";
                                      }
                                      | {
                                          algorithm: string;
                                          basis: (
                                              | "imports"
                                              | "exports"
                                              | "control-flow"
                                              | "syntax-tree"
                                              | "literals"
                                              | "api-usage"
                                          )[];
                                          fingerprint_sha256: string;
                                          stability: "cross-version-inference";
                                          strategy: "structural-fingerprint";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          key: string;
                                          namespace: string;
                                          stability: "artifact-version";
                                          strategy: "artifact-local-key";
                                      }
                                      | {
                                          capture_sha256: string;
                                          runtime_key: string;
                                          stability: "capture-only";
                                          strategy: "runtime-instance";
                                      }
                                      | {
                                          observation_sha256: string;
                                          scope: string;
                                          stability: "observation-only";
                                          strategy: "observation-fingerprint";
                                      };
                                      kind: | "unknown"
                                      | "target"
                                      | "native-addon"
                                      | "source-map"
                                      | "artifact"
                                      | "package"
                                      | "storage"
                                      | "worker"
                                      | "frame"
                                      | "endpoint"
                                      | "service-worker"
                                      | "installer"
                                      | "asar-entry"
                                      | "electron-main"
                                      | "electron-preload"
                                      | "electron-renderer"
                                      | "electron-utility"
                                      | "javascript-asset"
                                      | "javascript-chunk"
                                      | "javascript-module"
                                      | "source-module"
                                      | "browser-window"
                                      | "context-bridge-api"
                                      | "ipc-channel"
                                      | "ipc-handler"
                                      | "native-export"
                                      | "runtime-script-instance";
                                      node_id: string;
                                      observations: {
                                          evidence: {
                                              artifact: | { artifact_id: string; available: true; sha256: string }
                                              | {
                                                  available: false;
                                                  detail: string;
                                                  reason:
                                                      | "unknown"
                                                      | "truncated"
                                                      | "unresolved"
                                                      | "not-applicable"
                                                      | "not-approved"
                                                      | "not-observed"
                                                      | "provider-unavailable";
                                              };
                                              authority: | "unknown"
                                              | "controlled-replay"
                                              | "historical-reference"
                                              | "artifact-bytes"
                                              | "ast-static-analysis"
                                              | "static-relationship-inference"
                                              | "passive-cdp-runtime"
                                              | "native-analysis-provider"
                                              | "user-assertion";
                                              confidence: "unknown"
                                              | "exact"
                                              | "low"
                                              | "medium"
                                              | "high";
                                              coverage: {
                                                  limits: {
                                                      name: string;
                                                      unit:
                                                          | "other"
                                                          | "items"
                                                          | "bytes"
                                                          | "depth"
                                                          | "instructions"
                                                          | "milliseconds"
                                                          | "characters";
                                                      value: number;
                                                  }[];
                                                  omitted_count: number
                                                  | null;
                                                  status: "unknown" | "unavailable" | "complete" | "partial";
                                                  truncated: boolean;
                                              };
                                              evidence_ids: string[];
                                              extractor: {
                                                  executable_sha256: string
                                                  | null;
                                                  name: string;
                                                  operation: string;
                                                  version: string;
                                              };
                                              limitations: string[];
                                              location: | {
                                                  available: false;
                                                  detail: string;
                                                  reason: | "unknown"
                                                  | "truncated"
                                                  | "unresolved"
                                                  | "not-applicable"
                                                  | "not-approved"
                                                  | "not-observed"
                                                  | "provider-unavailable";
                                              }
                                              | {
                                                  available: true;
                                                  value: | {
                                                      end: { column: number; line: number };
                                                      kind: "source-range";
                                                      source: string;
                                                      start: { column: number; line: number };
                                                  }
                                                  | { end: number; kind: "file-offset-range"; start: number }
                                                  | { kind: "artifact-path"; path: string }
                                                  | { kind: "url"; url: string }
                                                  | {
                                                      capture_sha256: string;
                                                      frame_key: string | null;
                                                      kind: "runtime";
                                                      script_key: string | null;
                                                      target_key: string;
                                                  }
                                                  | { address: string; kind: "native-address"; symbol: string
                                                  | null }
                                                  | { export_path: string; kind: "package-export"; package_name: string };
                                              };
                                              state: "unknown"
                                              | "observed"
                                              | "inferred"
                                              | "unavailable";
                                          };
                                          identifier_strategy: {
                                              stability: "observation-exact";
                                              strategy: "semantic-content-sha256";
                                          };
                                          label: string
                                          | null;
                                          observation_id: string;
                                          properties: Record<string, JSONType>;
                                      }[];
                                  };
                                  target: {
                                      identity: | {
                                          sha256: string;
                                          stability: "global-exact";
                                          strategy: "content-digest";
                                      }
                                      | {
                                          original_source: string;
                                          source_map_sha256: string;
                                          source_sha256: string
                                          | null;
                                          stability: "source-map-exact";
                                          strategy: "source-map-original";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          path: string;
                                          stability: "artifact-version";
                                          strategy: "canonical-path";
                                      }
                                      | {
                                          algorithm: string;
                                          basis: (
                                              | "imports"
                                              | "exports"
                                              | "control-flow"
                                              | "syntax-tree"
                                              | "literals"
                                              | "api-usage"
                                          )[];
                                          fingerprint_sha256: string;
                                          stability: "cross-version-inference";
                                          strategy: "structural-fingerprint";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          key: string;
                                          namespace: string;
                                          stability: "artifact-version";
                                          strategy: "artifact-local-key";
                                      }
                                      | {
                                          capture_sha256: string;
                                          runtime_key: string;
                                          stability: "capture-only";
                                          strategy: "runtime-instance";
                                      }
                                      | {
                                          observation_sha256: string;
                                          scope: string;
                                          stability: "observation-only";
                                          strategy: "observation-fingerprint";
                                      };
                                      kind: | "unknown"
                                      | "target"
                                      | "native-addon"
                                      | "source-map"
                                      | "artifact"
                                      | "package"
                                      | "storage"
                                      | "worker"
                                      | "frame"
                                      | "endpoint"
                                      | "service-worker"
                                      | "installer"
                                      | "asar-entry"
                                      | "electron-main"
                                      | "electron-preload"
                                      | "electron-renderer"
                                      | "electron-utility"
                                      | "javascript-asset"
                                      | "javascript-chunk"
                                      | "javascript-module"
                                      | "source-module"
                                      | "browser-window"
                                      | "context-bridge-api"
                                      | "ipc-channel"
                                      | "ipc-handler"
                                      | "native-export"
                                      | "runtime-script-instance";
                                      node_id: string;
                                      observations: {
                                          evidence: {
                                              artifact: | { artifact_id: string; available: true; sha256: string }
                                              | {
                                                  available: false;
                                                  detail: string;
                                                  reason:
                                                      | "unknown"
                                                      | "truncated"
                                                      | "unresolved"
                                                      | "not-applicable"
                                                      | "not-approved"
                                                      | "not-observed"
                                                      | "provider-unavailable";
                                              };
                                              authority: | "unknown"
                                              | "controlled-replay"
                                              | "historical-reference"
                                              | "artifact-bytes"
                                              | "ast-static-analysis"
                                              | "static-relationship-inference"
                                              | "passive-cdp-runtime"
                                              | "native-analysis-provider"
                                              | "user-assertion";
                                              confidence: "unknown"
                                              | "exact"
                                              | "low"
                                              | "medium"
                                              | "high";
                                              coverage: {
                                                  limits: {
                                                      name: string;
                                                      unit:
                                                          | "other"
                                                          | "items"
                                                          | "bytes"
                                                          | "depth"
                                                          | "instructions"
                                                          | "milliseconds"
                                                          | "characters";
                                                      value: number;
                                                  }[];
                                                  omitted_count: number
                                                  | null;
                                                  status: "unknown" | "unavailable" | "complete" | "partial";
                                                  truncated: boolean;
                                              };
                                              evidence_ids: string[];
                                              extractor: {
                                                  executable_sha256: string
                                                  | null;
                                                  name: string;
                                                  operation: string;
                                                  version: string;
                                              };
                                              limitations: string[];
                                              location: | {
                                                  available: false;
                                                  detail: string;
                                                  reason: | "unknown"
                                                  | "truncated"
                                                  | "unresolved"
                                                  | "not-applicable"
                                                  | "not-approved"
                                                  | "not-observed"
                                                  | "provider-unavailable";
                                              }
                                              | {
                                                  available: true;
                                                  value: | {
                                                      end: { column: number; line: number };
                                                      kind: "source-range";
                                                      source: string;
                                                      start: { column: number; line: number };
                                                  }
                                                  | { end: number; kind: "file-offset-range"; start: number }
                                                  | { kind: "artifact-path"; path: string }
                                                  | { kind: "url"; url: string }
                                                  | {
                                                      capture_sha256: string;
                                                      frame_key: string | null;
                                                      kind: "runtime";
                                                      script_key: string | null;
                                                      target_key: string;
                                                  }
                                                  | { address: string; kind: "native-address"; symbol: string
                                                  | null }
                                                  | { export_path: string; kind: "package-export"; package_name: string };
                                              };
                                              state: "unknown"
                                              | "observed"
                                              | "inferred"
                                              | "unavailable";
                                          };
                                          identifier_strategy: {
                                              stability: "observation-exact";
                                              strategy: "semantic-content-sha256";
                                          };
                                          label: string
                                          | null;
                                          observation_id: string;
                                          properties: Record<string, JSONType>;
                                      }[];
                                  };
                              }
                              +
                              +

                              Hierarchy (View Summary)

                              +
                              +
                              +
                              +
                              +
                              Index
                              +
                              +
                              + +
                              +
                              + +
                              coverage: {
                                  limits: {
                                      name: string;
                                      unit:
                                          | "other"
                                          | "items"
                                          | "bytes"
                                          | "depth"
                                          | "instructions"
                                          | "milliseconds"
                                          | "characters";
                                      value: number;
                                  }[];
                                  omitted_count: number
                                  | null;
                                  status: "unknown" | "unavailable" | "complete" | "partial";
                                  truncated: boolean;
                              }
                              +
                              + +
                              +
                              + +
                              properties: Readonly<Record<string, unknown>>
                              +
                              + +
                              +
                              + +
                              relation: "loads" | "calls" | "imports" | "maps_to" | "exposes" | "persists_to"
                              +
                              + +
                              source: {
                                  identity:
                                      | {
                                          sha256: string;
                                          stability: "global-exact";
                                          strategy: "content-digest";
                                      }
                                      | {
                                          original_source: string;
                                          source_map_sha256: string;
                                          source_sha256: string
                                          | null;
                                          stability: "source-map-exact";
                                          strategy: "source-map-original";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          path: string;
                                          stability: "artifact-version";
                                          strategy: "canonical-path";
                                      }
                                      | {
                                          algorithm: string;
                                          basis: (
                                              | "imports"
                                              | "exports"
                                              | "control-flow"
                                              | "syntax-tree"
                                              | "literals"
                                              | "api-usage"
                                          )[];
                                          fingerprint_sha256: string;
                                          stability: "cross-version-inference";
                                          strategy: "structural-fingerprint";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          key: string;
                                          namespace: string;
                                          stability: "artifact-version";
                                          strategy: "artifact-local-key";
                                      }
                                      | {
                                          capture_sha256: string;
                                          runtime_key: string;
                                          stability: "capture-only";
                                          strategy: "runtime-instance";
                                      }
                                      | {
                                          observation_sha256: string;
                                          scope: string;
                                          stability: "observation-only";
                                          strategy: "observation-fingerprint";
                                      };
                                  kind: | "unknown"
                                  | "target"
                                  | "native-addon"
                                  | "source-map"
                                  | "artifact"
                                  | "package"
                                  | "storage"
                                  | "worker"
                                  | "frame"
                                  | "endpoint"
                                  | "service-worker"
                                  | "installer"
                                  | "asar-entry"
                                  | "electron-main"
                                  | "electron-preload"
                                  | "electron-renderer"
                                  | "electron-utility"
                                  | "javascript-asset"
                                  | "javascript-chunk"
                                  | "javascript-module"
                                  | "source-module"
                                  | "browser-window"
                                  | "context-bridge-api"
                                  | "ipc-channel"
                                  | "ipc-handler"
                                  | "native-export"
                                  | "runtime-script-instance";
                                  node_id: string;
                                  observations: {
                                      evidence: {
                                          artifact: | { artifact_id: string; available: true; sha256: string }
                                          | {
                                              available: false;
                                              detail: string;
                                              reason:
                                                  | "unknown"
                                                  | "truncated"
                                                  | "unresolved"
                                                  | "not-applicable"
                                                  | "not-approved"
                                                  | "not-observed"
                                                  | "provider-unavailable";
                                          };
                                          authority: | "unknown"
                                          | "controlled-replay"
                                          | "historical-reference"
                                          | "artifact-bytes"
                                          | "ast-static-analysis"
                                          | "static-relationship-inference"
                                          | "passive-cdp-runtime"
                                          | "native-analysis-provider"
                                          | "user-assertion";
                                          confidence: "unknown"
                                          | "exact"
                                          | "low"
                                          | "medium"
                                          | "high";
                                          coverage: {
                                              limits: {
                                                  name: string;
                                                  unit:
                                                      | "other"
                                                      | "items"
                                                      | "bytes"
                                                      | "depth"
                                                      | "instructions"
                                                      | "milliseconds"
                                                      | "characters";
                                                  value: number;
                                              }[];
                                              omitted_count: number
                                              | null;
                                              status: "unknown" | "unavailable" | "complete" | "partial";
                                              truncated: boolean;
                                          };
                                          evidence_ids: string[];
                                          extractor: {
                                              executable_sha256: string
                                              | null;
                                              name: string;
                                              operation: string;
                                              version: string;
                                          };
                                          limitations: string[];
                                          location: | {
                                              available: false;
                                              detail: string;
                                              reason: | "unknown"
                                              | "truncated"
                                              | "unresolved"
                                              | "not-applicable"
                                              | "not-approved"
                                              | "not-observed"
                                              | "provider-unavailable";
                                          }
                                          | {
                                              available: true;
                                              value: | {
                                                  end: { column: number; line: number };
                                                  kind: "source-range";
                                                  source: string;
                                                  start: { column: number; line: number };
                                              }
                                              | { end: number; kind: "file-offset-range"; start: number }
                                              | { kind: "artifact-path"; path: string }
                                              | { kind: "url"; url: string }
                                              | {
                                                  capture_sha256: string;
                                                  frame_key: string | null;
                                                  kind: "runtime";
                                                  script_key: string | null;
                                                  target_key: string;
                                              }
                                              | { address: string; kind: "native-address"; symbol: string
                                              | null }
                                              | { export_path: string; kind: "package-export"; package_name: string };
                                          };
                                          state: "unknown"
                                          | "observed"
                                          | "inferred"
                                          | "unavailable";
                                      };
                                      identifier_strategy: {
                                          stability: "observation-exact";
                                          strategy: "semantic-content-sha256";
                                      };
                                      label: string
                                      | null;
                                      observation_id: string;
                                      properties: Record<string, JSONType>;
                                  }[];
                              }
                              +
                              + +
                              target: {
                                  identity:
                                      | {
                                          sha256: string;
                                          stability: "global-exact";
                                          strategy: "content-digest";
                                      }
                                      | {
                                          original_source: string;
                                          source_map_sha256: string;
                                          source_sha256: string
                                          | null;
                                          stability: "source-map-exact";
                                          strategy: "source-map-original";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          path: string;
                                          stability: "artifact-version";
                                          strategy: "canonical-path";
                                      }
                                      | {
                                          algorithm: string;
                                          basis: (
                                              | "imports"
                                              | "exports"
                                              | "control-flow"
                                              | "syntax-tree"
                                              | "literals"
                                              | "api-usage"
                                          )[];
                                          fingerprint_sha256: string;
                                          stability: "cross-version-inference";
                                          strategy: "structural-fingerprint";
                                      }
                                      | {
                                          artifact_sha256: string;
                                          key: string;
                                          namespace: string;
                                          stability: "artifact-version";
                                          strategy: "artifact-local-key";
                                      }
                                      | {
                                          capture_sha256: string;
                                          runtime_key: string;
                                          stability: "capture-only";
                                          strategy: "runtime-instance";
                                      }
                                      | {
                                          observation_sha256: string;
                                          scope: string;
                                          stability: "observation-only";
                                          strategy: "observation-fingerprint";
                                      };
                                  kind: | "unknown"
                                  | "target"
                                  | "native-addon"
                                  | "source-map"
                                  | "artifact"
                                  | "package"
                                  | "storage"
                                  | "worker"
                                  | "frame"
                                  | "endpoint"
                                  | "service-worker"
                                  | "installer"
                                  | "asar-entry"
                                  | "electron-main"
                                  | "electron-preload"
                                  | "electron-renderer"
                                  | "electron-utility"
                                  | "javascript-asset"
                                  | "javascript-chunk"
                                  | "javascript-module"
                                  | "source-module"
                                  | "browser-window"
                                  | "context-bridge-api"
                                  | "ipc-channel"
                                  | "ipc-handler"
                                  | "native-export"
                                  | "runtime-script-instance";
                                  node_id: string;
                                  observations: {
                                      evidence: {
                                          artifact: | { artifact_id: string; available: true; sha256: string }
                                          | {
                                              available: false;
                                              detail: string;
                                              reason:
                                                  | "unknown"
                                                  | "truncated"
                                                  | "unresolved"
                                                  | "not-applicable"
                                                  | "not-approved"
                                                  | "not-observed"
                                                  | "provider-unavailable";
                                          };
                                          authority: | "unknown"
                                          | "controlled-replay"
                                          | "historical-reference"
                                          | "artifact-bytes"
                                          | "ast-static-analysis"
                                          | "static-relationship-inference"
                                          | "passive-cdp-runtime"
                                          | "native-analysis-provider"
                                          | "user-assertion";
                                          confidence: "unknown"
                                          | "exact"
                                          | "low"
                                          | "medium"
                                          | "high";
                                          coverage: {
                                              limits: {
                                                  name: string;
                                                  unit:
                                                      | "other"
                                                      | "items"
                                                      | "bytes"
                                                      | "depth"
                                                      | "instructions"
                                                      | "milliseconds"
                                                      | "characters";
                                                  value: number;
                                              }[];
                                              omitted_count: number
                                              | null;
                                              status: "unknown" | "unavailable" | "complete" | "partial";
                                              truncated: boolean;
                                          };
                                          evidence_ids: string[];
                                          extractor: {
                                              executable_sha256: string
                                              | null;
                                              name: string;
                                              operation: string;
                                              version: string;
                                          };
                                          limitations: string[];
                                          location: | {
                                              available: false;
                                              detail: string;
                                              reason: | "unknown"
                                              | "truncated"
                                              | "unresolved"
                                              | "not-applicable"
                                              | "not-approved"
                                              | "not-observed"
                                              | "provider-unavailable";
                                          }
                                          | {
                                              available: true;
                                              value: | {
                                                  end: { column: number; line: number };
                                                  kind: "source-range";
                                                  source: string;
                                                  start: { column: number; line: number };
                                              }
                                              | { end: number; kind: "file-offset-range"; start: number }
                                              | { kind: "artifact-path"; path: string }
                                              | { kind: "url"; url: string }
                                              | {
                                                  capture_sha256: string;
                                                  frame_key: string | null;
                                                  kind: "runtime";
                                                  script_key: string | null;
                                                  target_key: string;
                                              }
                                              | { address: string; kind: "native-address"; symbol: string
                                              | null }
                                              | { export_path: string; kind: "package-export"; package_name: string };
                                          };
                                          state: "unknown"
                                          | "observed"
                                          | "inferred"
                                          | "unavailable";
                                      };
                                      identifier_strategy: {
                                          stability: "observation-exact";
                                          strategy: "semantic-content-sha256";
                                      };
                                      label: string
                                      | null;
                                      observation_id: string;
                                      properties: Record<string, JSONType>;
                                  }[];
                              }
                              +
                              + +
                              +
                              diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphContext.JavaScriptArtifactGraphContext.html b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.JavaScriptArtifactGraphContext.html new file mode 100644 index 000000000..cd0570658 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.JavaScriptArtifactGraphContext.html @@ -0,0 +1,118 @@ +JavaScriptArtifactGraphContext | rea-agents - v1.6.0
                              +
                              rea-agents - v1.6.0 + +
                                +
                                +
                                Preparing search index...
                                +
                                +
                                +
                                + +

                                Interface JavaScriptArtifactGraphContext

                                +
                                +

                                Mutable graph-construction state scoped to one reconstruction.

                                +
                                +
                                interface JavaScriptArtifactGraphContext {
                                    accumulator: JavaScriptArtifactGraphAccumulator;
                                    analysis: JavaScriptArtifactAnalysis;
                                    assetNodes: Map<
                                        string,
                                        {
                                            identity: | {
                                                sha256: string;
                                                stability: "global-exact";
                                                strategy: "content-digest";
                                            }
                                            | {
                                                original_source: string;
                                                source_map_sha256: string;
                                                source_sha256: string
                                                | null;
                                                stability: "source-map-exact";
                                                strategy: "source-map-original";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                path: string;
                                                stability: "artifact-version";
                                                strategy: "canonical-path";
                                            }
                                            | {
                                                algorithm: string;
                                                basis: (
                                                    | "imports"
                                                    | "exports"
                                                    | "control-flow"
                                                    | "syntax-tree"
                                                    | "literals"
                                                    | "api-usage"
                                                )[];
                                                fingerprint_sha256: string;
                                                stability: "cross-version-inference";
                                                strategy: "structural-fingerprint";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                key: string;
                                                namespace: string;
                                                stability: "artifact-version";
                                                strategy: "artifact-local-key";
                                            }
                                            | {
                                                capture_sha256: string;
                                                runtime_key: string;
                                                stability: "capture-only";
                                                strategy: "runtime-instance";
                                            }
                                            | {
                                                observation_sha256: string;
                                                scope: string;
                                                stability: "observation-only";
                                                strategy: "observation-fingerprint";
                                            };
                                            kind: | "unknown"
                                            | "target"
                                            | "native-addon"
                                            | "source-map"
                                            | "artifact"
                                            | "package"
                                            | "storage"
                                            | "worker"
                                            | "frame"
                                            | "endpoint"
                                            | "service-worker"
                                            | "installer"
                                            | "asar-entry"
                                            | "electron-main"
                                            | "electron-preload"
                                            | "electron-renderer"
                                            | "electron-utility"
                                            | "javascript-asset"
                                            | "javascript-chunk"
                                            | "javascript-module"
                                            | "source-module"
                                            | "browser-window"
                                            | "context-bridge-api"
                                            | "ipc-channel"
                                            | "ipc-handler"
                                            | "native-export"
                                            | "runtime-script-instance";
                                            node_id: string;
                                            observations: {
                                                evidence: {
                                                    artifact: | { artifact_id: string; available: true; sha256: string }
                                                    | {
                                                        available: false;
                                                        detail: string;
                                                        reason:
                                                            | "unknown"
                                                            | "truncated"
                                                            | "unresolved"
                                                            | "not-applicable"
                                                            | "not-approved"
                                                            | "not-observed"
                                                            | "provider-unavailable";
                                                    };
                                                    authority: | "unknown"
                                                    | "controlled-replay"
                                                    | "historical-reference"
                                                    | "artifact-bytes"
                                                    | "ast-static-analysis"
                                                    | "static-relationship-inference"
                                                    | "passive-cdp-runtime"
                                                    | "native-analysis-provider"
                                                    | "user-assertion";
                                                    confidence: "unknown"
                                                    | "exact"
                                                    | "low"
                                                    | "medium"
                                                    | "high";
                                                    coverage: {
                                                        limits: {
                                                            name: string;
                                                            unit:
                                                                | "other"
                                                                | "items"
                                                                | "bytes"
                                                                | "depth"
                                                                | "instructions"
                                                                | "milliseconds"
                                                                | "characters";
                                                            value: number;
                                                        }[];
                                                        omitted_count: number
                                                        | null;
                                                        status: "unknown" | "unavailable" | "complete" | "partial";
                                                        truncated: boolean;
                                                    };
                                                    evidence_ids: string[];
                                                    extractor: {
                                                        executable_sha256: string
                                                        | null;
                                                        name: string;
                                                        operation: string;
                                                        version: string;
                                                    };
                                                    limitations: string[];
                                                    location: | {
                                                        available: false;
                                                        detail: string;
                                                        reason: | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                    }
                                                    | {
                                                        available: true;
                                                        value: | {
                                                            end: { column: number; line: number };
                                                            kind: "source-range";
                                                            source: string;
                                                            start: { column: number; line: number };
                                                        }
                                                        | { end: number; kind: "file-offset-range"; start: number }
                                                        | { kind: "artifact-path"; path: string }
                                                        | { kind: "url"; url: string }
                                                        | {
                                                            capture_sha256: string;
                                                            frame_key: string | null;
                                                            kind: "runtime";
                                                            script_key: string | null;
                                                            target_key: string;
                                                        }
                                                        | { address: string; kind: "native-address"; symbol: string
                                                        | null }
                                                        | {
                                                            export_path: string;
                                                            kind: "package-export";
                                                            package_name: string;
                                                        };
                                                    };
                                                    state: "unknown"
                                                    | "observed"
                                                    | "inferred"
                                                    | "unavailable";
                                                };
                                                identifier_strategy: {
                                                    stability: "observation-exact";
                                                    strategy: "semantic-content-sha256";
                                                };
                                                label: string
                                                | null;
                                                observation_id: string;
                                                properties: Record<string, JSONType>;
                                            }[];
                                        },
                                    >;
                                    containerNodes: Map<
                                        string,
                                        {
                                            identity: | {
                                                sha256: string;
                                                stability: "global-exact";
                                                strategy: "content-digest";
                                            }
                                            | {
                                                original_source: string;
                                                source_map_sha256: string;
                                                source_sha256: string
                                                | null;
                                                stability: "source-map-exact";
                                                strategy: "source-map-original";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                path: string;
                                                stability: "artifact-version";
                                                strategy: "canonical-path";
                                            }
                                            | {
                                                algorithm: string;
                                                basis: (
                                                    | "imports"
                                                    | "exports"
                                                    | "control-flow"
                                                    | "syntax-tree"
                                                    | "literals"
                                                    | "api-usage"
                                                )[];
                                                fingerprint_sha256: string;
                                                stability: "cross-version-inference";
                                                strategy: "structural-fingerprint";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                key: string;
                                                namespace: string;
                                                stability: "artifact-version";
                                                strategy: "artifact-local-key";
                                            }
                                            | {
                                                capture_sha256: string;
                                                runtime_key: string;
                                                stability: "capture-only";
                                                strategy: "runtime-instance";
                                            }
                                            | {
                                                observation_sha256: string;
                                                scope: string;
                                                stability: "observation-only";
                                                strategy: "observation-fingerprint";
                                            };
                                            kind: | "unknown"
                                            | "target"
                                            | "native-addon"
                                            | "source-map"
                                            | "artifact"
                                            | "package"
                                            | "storage"
                                            | "worker"
                                            | "frame"
                                            | "endpoint"
                                            | "service-worker"
                                            | "installer"
                                            | "asar-entry"
                                            | "electron-main"
                                            | "electron-preload"
                                            | "electron-renderer"
                                            | "electron-utility"
                                            | "javascript-asset"
                                            | "javascript-chunk"
                                            | "javascript-module"
                                            | "source-module"
                                            | "browser-window"
                                            | "context-bridge-api"
                                            | "ipc-channel"
                                            | "ipc-handler"
                                            | "native-export"
                                            | "runtime-script-instance";
                                            node_id: string;
                                            observations: {
                                                evidence: {
                                                    artifact: | { artifact_id: string; available: true; sha256: string }
                                                    | {
                                                        available: false;
                                                        detail: string;
                                                        reason:
                                                            | "unknown"
                                                            | "truncated"
                                                            | "unresolved"
                                                            | "not-applicable"
                                                            | "not-approved"
                                                            | "not-observed"
                                                            | "provider-unavailable";
                                                    };
                                                    authority: | "unknown"
                                                    | "controlled-replay"
                                                    | "historical-reference"
                                                    | "artifact-bytes"
                                                    | "ast-static-analysis"
                                                    | "static-relationship-inference"
                                                    | "passive-cdp-runtime"
                                                    | "native-analysis-provider"
                                                    | "user-assertion";
                                                    confidence: "unknown"
                                                    | "exact"
                                                    | "low"
                                                    | "medium"
                                                    | "high";
                                                    coverage: {
                                                        limits: {
                                                            name: string;
                                                            unit:
                                                                | "other"
                                                                | "items"
                                                                | "bytes"
                                                                | "depth"
                                                                | "instructions"
                                                                | "milliseconds"
                                                                | "characters";
                                                            value: number;
                                                        }[];
                                                        omitted_count: number
                                                        | null;
                                                        status: "unknown" | "unavailable" | "complete" | "partial";
                                                        truncated: boolean;
                                                    };
                                                    evidence_ids: string[];
                                                    extractor: {
                                                        executable_sha256: string
                                                        | null;
                                                        name: string;
                                                        operation: string;
                                                        version: string;
                                                    };
                                                    limitations: string[];
                                                    location: | {
                                                        available: false;
                                                        detail: string;
                                                        reason: | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                    }
                                                    | {
                                                        available: true;
                                                        value: | {
                                                            end: { column: number; line: number };
                                                            kind: "source-range";
                                                            source: string;
                                                            start: { column: number; line: number };
                                                        }
                                                        | { end: number; kind: "file-offset-range"; start: number }
                                                        | { kind: "artifact-path"; path: string }
                                                        | { kind: "url"; url: string }
                                                        | {
                                                            capture_sha256: string;
                                                            frame_key: string | null;
                                                            kind: "runtime";
                                                            script_key: string | null;
                                                            target_key: string;
                                                        }
                                                        | { address: string; kind: "native-address"; symbol: string
                                                        | null }
                                                        | {
                                                            export_path: string;
                                                            kind: "package-export";
                                                            package_name: string;
                                                        };
                                                    };
                                                    state: "unknown"
                                                    | "observed"
                                                    | "inferred"
                                                    | "unavailable";
                                                };
                                                identifier_strategy: {
                                                    stability: "observation-exact";
                                                    strategy: "semantic-content-sha256";
                                                };
                                                label: string
                                                | null;
                                                observation_id: string;
                                                properties: Record<string, JSONType>;
                                            }[];
                                        },
                                    >;
                                    fileNodes: Map<
                                        string,
                                        {
                                            identity: | {
                                                sha256: string;
                                                stability: "global-exact";
                                                strategy: "content-digest";
                                            }
                                            | {
                                                original_source: string;
                                                source_map_sha256: string;
                                                source_sha256: string
                                                | null;
                                                stability: "source-map-exact";
                                                strategy: "source-map-original";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                path: string;
                                                stability: "artifact-version";
                                                strategy: "canonical-path";
                                            }
                                            | {
                                                algorithm: string;
                                                basis: (
                                                    | "imports"
                                                    | "exports"
                                                    | "control-flow"
                                                    | "syntax-tree"
                                                    | "literals"
                                                    | "api-usage"
                                                )[];
                                                fingerprint_sha256: string;
                                                stability: "cross-version-inference";
                                                strategy: "structural-fingerprint";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                key: string;
                                                namespace: string;
                                                stability: "artifact-version";
                                                strategy: "artifact-local-key";
                                            }
                                            | {
                                                capture_sha256: string;
                                                runtime_key: string;
                                                stability: "capture-only";
                                                strategy: "runtime-instance";
                                            }
                                            | {
                                                observation_sha256: string;
                                                scope: string;
                                                stability: "observation-only";
                                                strategy: "observation-fingerprint";
                                            };
                                            kind: | "unknown"
                                            | "target"
                                            | "native-addon"
                                            | "source-map"
                                            | "artifact"
                                            | "package"
                                            | "storage"
                                            | "worker"
                                            | "frame"
                                            | "endpoint"
                                            | "service-worker"
                                            | "installer"
                                            | "asar-entry"
                                            | "electron-main"
                                            | "electron-preload"
                                            | "electron-renderer"
                                            | "electron-utility"
                                            | "javascript-asset"
                                            | "javascript-chunk"
                                            | "javascript-module"
                                            | "source-module"
                                            | "browser-window"
                                            | "context-bridge-api"
                                            | "ipc-channel"
                                            | "ipc-handler"
                                            | "native-export"
                                            | "runtime-script-instance";
                                            node_id: string;
                                            observations: {
                                                evidence: {
                                                    artifact: | { artifact_id: string; available: true; sha256: string }
                                                    | {
                                                        available: false;
                                                        detail: string;
                                                        reason:
                                                            | "unknown"
                                                            | "truncated"
                                                            | "unresolved"
                                                            | "not-applicable"
                                                            | "not-approved"
                                                            | "not-observed"
                                                            | "provider-unavailable";
                                                    };
                                                    authority: | "unknown"
                                                    | "controlled-replay"
                                                    | "historical-reference"
                                                    | "artifact-bytes"
                                                    | "ast-static-analysis"
                                                    | "static-relationship-inference"
                                                    | "passive-cdp-runtime"
                                                    | "native-analysis-provider"
                                                    | "user-assertion";
                                                    confidence: "unknown"
                                                    | "exact"
                                                    | "low"
                                                    | "medium"
                                                    | "high";
                                                    coverage: {
                                                        limits: {
                                                            name: string;
                                                            unit:
                                                                | "other"
                                                                | "items"
                                                                | "bytes"
                                                                | "depth"
                                                                | "instructions"
                                                                | "milliseconds"
                                                                | "characters";
                                                            value: number;
                                                        }[];
                                                        omitted_count: number
                                                        | null;
                                                        status: "unknown" | "unavailable" | "complete" | "partial";
                                                        truncated: boolean;
                                                    };
                                                    evidence_ids: string[];
                                                    extractor: {
                                                        executable_sha256: string
                                                        | null;
                                                        name: string;
                                                        operation: string;
                                                        version: string;
                                                    };
                                                    limitations: string[];
                                                    location: | {
                                                        available: false;
                                                        detail: string;
                                                        reason: | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                    }
                                                    | {
                                                        available: true;
                                                        value: | {
                                                            end: { column: number; line: number };
                                                            kind: "source-range";
                                                            source: string;
                                                            start: { column: number; line: number };
                                                        }
                                                        | { end: number; kind: "file-offset-range"; start: number }
                                                        | { kind: "artifact-path"; path: string }
                                                        | { kind: "url"; url: string }
                                                        | {
                                                            capture_sha256: string;
                                                            frame_key: string | null;
                                                            kind: "runtime";
                                                            script_key: string | null;
                                                            target_key: string;
                                                        }
                                                        | { address: string; kind: "native-address"; symbol: string
                                                        | null }
                                                        | {
                                                            export_path: string;
                                                            kind: "package-export";
                                                            package_name: string;
                                                        };
                                                    };
                                                    state: "unknown"
                                                    | "observed"
                                                    | "inferred"
                                                    | "unavailable";
                                                };
                                                identifier_strategy: {
                                                    stability: "observation-exact";
                                                    strategy: "semantic-content-sha256";
                                                };
                                                label: string
                                                | null;
                                                observation_id: string;
                                                properties: Record<string, JSONType>;
                                            }[];
                                        },
                                    >;
                                    filesByPath: ReadonlyMap<string, JavaScriptArtifactFile>;
                                    fileSet: JavaScriptArtifactFileSet;
                                    input: {
                                        format: "directory" | "asar" | "auto";
                                        input_path: string;
                                        limits: {
                                            max_artifact_entry_bytes: number;
                                            max_ast_nodes: number;
                                            max_compression_ratio: number;
                                            max_depth: number;
                                            max_entries: number;
                                            max_findings: number;
                                            max_modules: number;
                                            max_parse_milliseconds: number;
                                            max_path_bytes: number;
                                            max_source_map_sources: number;
                                            max_text_file_bytes: number;
                                            max_text_files: number;
                                            max_total_artifact_bytes: number;
                                            max_total_text_bytes: number;
                                        };
                                        source_map_read_approved: boolean;
                                    };
                                    moduleNodes: Map<
                                        string,
                                        {
                                            identity: | {
                                                sha256: string;
                                                stability: "global-exact";
                                                strategy: "content-digest";
                                            }
                                            | {
                                                original_source: string;
                                                source_map_sha256: string;
                                                source_sha256: string
                                                | null;
                                                stability: "source-map-exact";
                                                strategy: "source-map-original";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                path: string;
                                                stability: "artifact-version";
                                                strategy: "canonical-path";
                                            }
                                            | {
                                                algorithm: string;
                                                basis: (
                                                    | "imports"
                                                    | "exports"
                                                    | "control-flow"
                                                    | "syntax-tree"
                                                    | "literals"
                                                    | "api-usage"
                                                )[];
                                                fingerprint_sha256: string;
                                                stability: "cross-version-inference";
                                                strategy: "structural-fingerprint";
                                            }
                                            | {
                                                artifact_sha256: string;
                                                key: string;
                                                namespace: string;
                                                stability: "artifact-version";
                                                strategy: "artifact-local-key";
                                            }
                                            | {
                                                capture_sha256: string;
                                                runtime_key: string;
                                                stability: "capture-only";
                                                strategy: "runtime-instance";
                                            }
                                            | {
                                                observation_sha256: string;
                                                scope: string;
                                                stability: "observation-only";
                                                strategy: "observation-fingerprint";
                                            };
                                            kind: | "unknown"
                                            | "target"
                                            | "native-addon"
                                            | "source-map"
                                            | "artifact"
                                            | "package"
                                            | "storage"
                                            | "worker"
                                            | "frame"
                                            | "endpoint"
                                            | "service-worker"
                                            | "installer"
                                            | "asar-entry"
                                            | "electron-main"
                                            | "electron-preload"
                                            | "electron-renderer"
                                            | "electron-utility"
                                            | "javascript-asset"
                                            | "javascript-chunk"
                                            | "javascript-module"
                                            | "source-module"
                                            | "browser-window"
                                            | "context-bridge-api"
                                            | "ipc-channel"
                                            | "ipc-handler"
                                            | "native-export"
                                            | "runtime-script-instance";
                                            node_id: string;
                                            observations: {
                                                evidence: {
                                                    artifact: | { artifact_id: string; available: true; sha256: string }
                                                    | {
                                                        available: false;
                                                        detail: string;
                                                        reason:
                                                            | "unknown"
                                                            | "truncated"
                                                            | "unresolved"
                                                            | "not-applicable"
                                                            | "not-approved"
                                                            | "not-observed"
                                                            | "provider-unavailable";
                                                    };
                                                    authority: | "unknown"
                                                    | "controlled-replay"
                                                    | "historical-reference"
                                                    | "artifact-bytes"
                                                    | "ast-static-analysis"
                                                    | "static-relationship-inference"
                                                    | "passive-cdp-runtime"
                                                    | "native-analysis-provider"
                                                    | "user-assertion";
                                                    confidence: "unknown"
                                                    | "exact"
                                                    | "low"
                                                    | "medium"
                                                    | "high";
                                                    coverage: {
                                                        limits: {
                                                            name: string;
                                                            unit:
                                                                | "other"
                                                                | "items"
                                                                | "bytes"
                                                                | "depth"
                                                                | "instructions"
                                                                | "milliseconds"
                                                                | "characters";
                                                            value: number;
                                                        }[];
                                                        omitted_count: number
                                                        | null;
                                                        status: "unknown" | "unavailable" | "complete" | "partial";
                                                        truncated: boolean;
                                                    };
                                                    evidence_ids: string[];
                                                    extractor: {
                                                        executable_sha256: string
                                                        | null;
                                                        name: string;
                                                        operation: string;
                                                        version: string;
                                                    };
                                                    limitations: string[];
                                                    location: | {
                                                        available: false;
                                                        detail: string;
                                                        reason: | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                    }
                                                    | {
                                                        available: true;
                                                        value: | {
                                                            end: { column: number; line: number };
                                                            kind: "source-range";
                                                            source: string;
                                                            start: { column: number; line: number };
                                                        }
                                                        | { end: number; kind: "file-offset-range"; start: number }
                                                        | { kind: "artifact-path"; path: string }
                                                        | { kind: "url"; url: string }
                                                        | {
                                                            capture_sha256: string;
                                                            frame_key: string | null;
                                                            kind: "runtime";
                                                            script_key: string | null;
                                                            target_key: string;
                                                        }
                                                        | { address: string; kind: "native-address"; symbol: string
                                                        | null }
                                                        | {
                                                            export_path: string;
                                                            kind: "package-export";
                                                            package_name: string;
                                                        };
                                                    };
                                                    state: "unknown"
                                                    | "observed"
                                                    | "inferred"
                                                    | "unavailable";
                                                };
                                                identifier_strategy: {
                                                    stability: "observation-exact";
                                                    strategy: "semantic-content-sha256";
                                                };
                                                label: string
                                                | null;
                                                observation_id: string;
                                                properties: Record<string, JSONType>;
                                            }[];
                                        },
                                    >;
                                    root: {
                                        identity: | {
                                            sha256: string;
                                            stability: "global-exact";
                                            strategy: "content-digest";
                                        }
                                        | {
                                            original_source: string;
                                            source_map_sha256: string;
                                            source_sha256: string
                                            | null;
                                            stability: "source-map-exact";
                                            strategy: "source-map-original";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            path: string;
                                            stability: "artifact-version";
                                            strategy: "canonical-path";
                                        }
                                        | {
                                            algorithm: string;
                                            basis: (
                                                | "imports"
                                                | "exports"
                                                | "control-flow"
                                                | "syntax-tree"
                                                | "literals"
                                                | "api-usage"
                                            )[];
                                            fingerprint_sha256: string;
                                            stability: "cross-version-inference";
                                            strategy: "structural-fingerprint";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            key: string;
                                            namespace: string;
                                            stability: "artifact-version";
                                            strategy: "artifact-local-key";
                                        }
                                        | {
                                            capture_sha256: string;
                                            runtime_key: string;
                                            stability: "capture-only";
                                            strategy: "runtime-instance";
                                        }
                                        | {
                                            observation_sha256: string;
                                            scope: string;
                                            stability: "observation-only";
                                            strategy: "observation-fingerprint";
                                        };
                                        kind: | "unknown"
                                        | "target"
                                        | "native-addon"
                                        | "source-map"
                                        | "artifact"
                                        | "package"
                                        | "storage"
                                        | "worker"
                                        | "frame"
                                        | "endpoint"
                                        | "service-worker"
                                        | "installer"
                                        | "asar-entry"
                                        | "electron-main"
                                        | "electron-preload"
                                        | "electron-renderer"
                                        | "electron-utility"
                                        | "javascript-asset"
                                        | "javascript-chunk"
                                        | "javascript-module"
                                        | "source-module"
                                        | "browser-window"
                                        | "context-bridge-api"
                                        | "ipc-channel"
                                        | "ipc-handler"
                                        | "native-export"
                                        | "runtime-script-instance";
                                        node_id: string;
                                        observations: {
                                            evidence: {
                                                artifact: | { artifact_id: string; available: true; sha256: string }
                                                | {
                                                    available: false;
                                                    detail: string;
                                                    reason:
                                                        | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                };
                                                authority: | "unknown"
                                                | "controlled-replay"
                                                | "historical-reference"
                                                | "artifact-bytes"
                                                | "ast-static-analysis"
                                                | "static-relationship-inference"
                                                | "passive-cdp-runtime"
                                                | "native-analysis-provider"
                                                | "user-assertion";
                                                confidence: "unknown"
                                                | "exact"
                                                | "low"
                                                | "medium"
                                                | "high";
                                                coverage: {
                                                    limits: {
                                                        name: string;
                                                        unit:
                                                            | "other"
                                                            | "items"
                                                            | "bytes"
                                                            | "depth"
                                                            | "instructions"
                                                            | "milliseconds"
                                                            | "characters";
                                                        value: number;
                                                    }[];
                                                    omitted_count: number
                                                    | null;
                                                    status: "unknown" | "unavailable" | "complete" | "partial";
                                                    truncated: boolean;
                                                };
                                                evidence_ids: string[];
                                                extractor: {
                                                    executable_sha256: string
                                                    | null;
                                                    name: string;
                                                    operation: string;
                                                    version: string;
                                                };
                                                limitations: string[];
                                                location: | {
                                                    available: false;
                                                    detail: string;
                                                    reason: | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                                }
                                                | {
                                                    available: true;
                                                    value: | {
                                                        end: { column: number; line: number };
                                                        kind: "source-range";
                                                        source: string;
                                                        start: { column: number; line: number };
                                                    }
                                                    | { end: number; kind: "file-offset-range"; start: number }
                                                    | { kind: "artifact-path"; path: string }
                                                    | { kind: "url"; url: string }
                                                    | {
                                                        capture_sha256: string;
                                                        frame_key: string | null;
                                                        kind: "runtime";
                                                        script_key: string | null;
                                                        target_key: string;
                                                    }
                                                    | { address: string; kind: "native-address"; symbol: string
                                                    | null }
                                                    | { export_path: string; kind: "package-export"; package_name: string };
                                                };
                                                state: "unknown"
                                                | "observed"
                                                | "inferred"
                                                | "unavailable";
                                            };
                                            identifier_strategy: {
                                                stability: "observation-exact";
                                                strategy: "semantic-content-sha256";
                                            };
                                            label: string
                                            | null;
                                            observation_id: string;
                                            properties: Record<string, JSONType>;
                                        }[];
                                    };
                                    snapshot: ArtifactInventorySnapshot;
                                }
                                +
                                +
                                +
                                +
                                Index
                                +
                                +
                                + +
                                +
                                + +
                                +
                                + +
                                +
                                + +
                                assetNodes: Map<
                                    string,
                                    {
                                        identity: | {
                                            sha256: string;
                                            stability: "global-exact";
                                            strategy: "content-digest";
                                        }
                                        | {
                                            original_source: string;
                                            source_map_sha256: string;
                                            source_sha256: string
                                            | null;
                                            stability: "source-map-exact";
                                            strategy: "source-map-original";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            path: string;
                                            stability: "artifact-version";
                                            strategy: "canonical-path";
                                        }
                                        | {
                                            algorithm: string;
                                            basis: (
                                                | "imports"
                                                | "exports"
                                                | "control-flow"
                                                | "syntax-tree"
                                                | "literals"
                                                | "api-usage"
                                            )[];
                                            fingerprint_sha256: string;
                                            stability: "cross-version-inference";
                                            strategy: "structural-fingerprint";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            key: string;
                                            namespace: string;
                                            stability: "artifact-version";
                                            strategy: "artifact-local-key";
                                        }
                                        | {
                                            capture_sha256: string;
                                            runtime_key: string;
                                            stability: "capture-only";
                                            strategy: "runtime-instance";
                                        }
                                        | {
                                            observation_sha256: string;
                                            scope: string;
                                            stability: "observation-only";
                                            strategy: "observation-fingerprint";
                                        };
                                        kind: | "unknown"
                                        | "target"
                                        | "native-addon"
                                        | "source-map"
                                        | "artifact"
                                        | "package"
                                        | "storage"
                                        | "worker"
                                        | "frame"
                                        | "endpoint"
                                        | "service-worker"
                                        | "installer"
                                        | "asar-entry"
                                        | "electron-main"
                                        | "electron-preload"
                                        | "electron-renderer"
                                        | "electron-utility"
                                        | "javascript-asset"
                                        | "javascript-chunk"
                                        | "javascript-module"
                                        | "source-module"
                                        | "browser-window"
                                        | "context-bridge-api"
                                        | "ipc-channel"
                                        | "ipc-handler"
                                        | "native-export"
                                        | "runtime-script-instance";
                                        node_id: string;
                                        observations: {
                                            evidence: {
                                                artifact: | { artifact_id: string; available: true; sha256: string }
                                                | {
                                                    available: false;
                                                    detail: string;
                                                    reason:
                                                        | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                };
                                                authority: | "unknown"
                                                | "controlled-replay"
                                                | "historical-reference"
                                                | "artifact-bytes"
                                                | "ast-static-analysis"
                                                | "static-relationship-inference"
                                                | "passive-cdp-runtime"
                                                | "native-analysis-provider"
                                                | "user-assertion";
                                                confidence: "unknown"
                                                | "exact"
                                                | "low"
                                                | "medium"
                                                | "high";
                                                coverage: {
                                                    limits: {
                                                        name: string;
                                                        unit:
                                                            | "other"
                                                            | "items"
                                                            | "bytes"
                                                            | "depth"
                                                            | "instructions"
                                                            | "milliseconds"
                                                            | "characters";
                                                        value: number;
                                                    }[];
                                                    omitted_count: number
                                                    | null;
                                                    status: "unknown" | "unavailable" | "complete" | "partial";
                                                    truncated: boolean;
                                                };
                                                evidence_ids: string[];
                                                extractor: {
                                                    executable_sha256: string
                                                    | null;
                                                    name: string;
                                                    operation: string;
                                                    version: string;
                                                };
                                                limitations: string[];
                                                location: | {
                                                    available: false;
                                                    detail: string;
                                                    reason: | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                                }
                                                | {
                                                    available: true;
                                                    value: | {
                                                        end: { column: number; line: number };
                                                        kind: "source-range";
                                                        source: string;
                                                        start: { column: number; line: number };
                                                    }
                                                    | { end: number; kind: "file-offset-range"; start: number }
                                                    | { kind: "artifact-path"; path: string }
                                                    | { kind: "url"; url: string }
                                                    | {
                                                        capture_sha256: string;
                                                        frame_key: string | null;
                                                        kind: "runtime";
                                                        script_key: string | null;
                                                        target_key: string;
                                                    }
                                                    | { address: string; kind: "native-address"; symbol: string
                                                    | null }
                                                    | { export_path: string; kind: "package-export"; package_name: string };
                                                };
                                                state: "unknown"
                                                | "observed"
                                                | "inferred"
                                                | "unavailable";
                                            };
                                            identifier_strategy: {
                                                stability: "observation-exact";
                                                strategy: "semantic-content-sha256";
                                            };
                                            label: string
                                            | null;
                                            observation_id: string;
                                            properties: Record<string, JSONType>;
                                        }[];
                                    },
                                >
                                +
                                + +
                                containerNodes: Map<
                                    string,
                                    {
                                        identity: | {
                                            sha256: string;
                                            stability: "global-exact";
                                            strategy: "content-digest";
                                        }
                                        | {
                                            original_source: string;
                                            source_map_sha256: string;
                                            source_sha256: string
                                            | null;
                                            stability: "source-map-exact";
                                            strategy: "source-map-original";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            path: string;
                                            stability: "artifact-version";
                                            strategy: "canonical-path";
                                        }
                                        | {
                                            algorithm: string;
                                            basis: (
                                                | "imports"
                                                | "exports"
                                                | "control-flow"
                                                | "syntax-tree"
                                                | "literals"
                                                | "api-usage"
                                            )[];
                                            fingerprint_sha256: string;
                                            stability: "cross-version-inference";
                                            strategy: "structural-fingerprint";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            key: string;
                                            namespace: string;
                                            stability: "artifact-version";
                                            strategy: "artifact-local-key";
                                        }
                                        | {
                                            capture_sha256: string;
                                            runtime_key: string;
                                            stability: "capture-only";
                                            strategy: "runtime-instance";
                                        }
                                        | {
                                            observation_sha256: string;
                                            scope: string;
                                            stability: "observation-only";
                                            strategy: "observation-fingerprint";
                                        };
                                        kind: | "unknown"
                                        | "target"
                                        | "native-addon"
                                        | "source-map"
                                        | "artifact"
                                        | "package"
                                        | "storage"
                                        | "worker"
                                        | "frame"
                                        | "endpoint"
                                        | "service-worker"
                                        | "installer"
                                        | "asar-entry"
                                        | "electron-main"
                                        | "electron-preload"
                                        | "electron-renderer"
                                        | "electron-utility"
                                        | "javascript-asset"
                                        | "javascript-chunk"
                                        | "javascript-module"
                                        | "source-module"
                                        | "browser-window"
                                        | "context-bridge-api"
                                        | "ipc-channel"
                                        | "ipc-handler"
                                        | "native-export"
                                        | "runtime-script-instance";
                                        node_id: string;
                                        observations: {
                                            evidence: {
                                                artifact: | { artifact_id: string; available: true; sha256: string }
                                                | {
                                                    available: false;
                                                    detail: string;
                                                    reason:
                                                        | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                };
                                                authority: | "unknown"
                                                | "controlled-replay"
                                                | "historical-reference"
                                                | "artifact-bytes"
                                                | "ast-static-analysis"
                                                | "static-relationship-inference"
                                                | "passive-cdp-runtime"
                                                | "native-analysis-provider"
                                                | "user-assertion";
                                                confidence: "unknown"
                                                | "exact"
                                                | "low"
                                                | "medium"
                                                | "high";
                                                coverage: {
                                                    limits: {
                                                        name: string;
                                                        unit:
                                                            | "other"
                                                            | "items"
                                                            | "bytes"
                                                            | "depth"
                                                            | "instructions"
                                                            | "milliseconds"
                                                            | "characters";
                                                        value: number;
                                                    }[];
                                                    omitted_count: number
                                                    | null;
                                                    status: "unknown" | "unavailable" | "complete" | "partial";
                                                    truncated: boolean;
                                                };
                                                evidence_ids: string[];
                                                extractor: {
                                                    executable_sha256: string
                                                    | null;
                                                    name: string;
                                                    operation: string;
                                                    version: string;
                                                };
                                                limitations: string[];
                                                location: | {
                                                    available: false;
                                                    detail: string;
                                                    reason: | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                                }
                                                | {
                                                    available: true;
                                                    value: | {
                                                        end: { column: number; line: number };
                                                        kind: "source-range";
                                                        source: string;
                                                        start: { column: number; line: number };
                                                    }
                                                    | { end: number; kind: "file-offset-range"; start: number }
                                                    | { kind: "artifact-path"; path: string }
                                                    | { kind: "url"; url: string }
                                                    | {
                                                        capture_sha256: string;
                                                        frame_key: string | null;
                                                        kind: "runtime";
                                                        script_key: string | null;
                                                        target_key: string;
                                                    }
                                                    | { address: string; kind: "native-address"; symbol: string
                                                    | null }
                                                    | { export_path: string; kind: "package-export"; package_name: string };
                                                };
                                                state: "unknown"
                                                | "observed"
                                                | "inferred"
                                                | "unavailable";
                                            };
                                            identifier_strategy: {
                                                stability: "observation-exact";
                                                strategy: "semantic-content-sha256";
                                            };
                                            label: string
                                            | null;
                                            observation_id: string;
                                            properties: Record<string, JSONType>;
                                        }[];
                                    },
                                >
                                +
                                + +
                                fileNodes: Map<
                                    string,
                                    {
                                        identity: | {
                                            sha256: string;
                                            stability: "global-exact";
                                            strategy: "content-digest";
                                        }
                                        | {
                                            original_source: string;
                                            source_map_sha256: string;
                                            source_sha256: string
                                            | null;
                                            stability: "source-map-exact";
                                            strategy: "source-map-original";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            path: string;
                                            stability: "artifact-version";
                                            strategy: "canonical-path";
                                        }
                                        | {
                                            algorithm: string;
                                            basis: (
                                                | "imports"
                                                | "exports"
                                                | "control-flow"
                                                | "syntax-tree"
                                                | "literals"
                                                | "api-usage"
                                            )[];
                                            fingerprint_sha256: string;
                                            stability: "cross-version-inference";
                                            strategy: "structural-fingerprint";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            key: string;
                                            namespace: string;
                                            stability: "artifact-version";
                                            strategy: "artifact-local-key";
                                        }
                                        | {
                                            capture_sha256: string;
                                            runtime_key: string;
                                            stability: "capture-only";
                                            strategy: "runtime-instance";
                                        }
                                        | {
                                            observation_sha256: string;
                                            scope: string;
                                            stability: "observation-only";
                                            strategy: "observation-fingerprint";
                                        };
                                        kind: | "unknown"
                                        | "target"
                                        | "native-addon"
                                        | "source-map"
                                        | "artifact"
                                        | "package"
                                        | "storage"
                                        | "worker"
                                        | "frame"
                                        | "endpoint"
                                        | "service-worker"
                                        | "installer"
                                        | "asar-entry"
                                        | "electron-main"
                                        | "electron-preload"
                                        | "electron-renderer"
                                        | "electron-utility"
                                        | "javascript-asset"
                                        | "javascript-chunk"
                                        | "javascript-module"
                                        | "source-module"
                                        | "browser-window"
                                        | "context-bridge-api"
                                        | "ipc-channel"
                                        | "ipc-handler"
                                        | "native-export"
                                        | "runtime-script-instance";
                                        node_id: string;
                                        observations: {
                                            evidence: {
                                                artifact: | { artifact_id: string; available: true; sha256: string }
                                                | {
                                                    available: false;
                                                    detail: string;
                                                    reason:
                                                        | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                };
                                                authority: | "unknown"
                                                | "controlled-replay"
                                                | "historical-reference"
                                                | "artifact-bytes"
                                                | "ast-static-analysis"
                                                | "static-relationship-inference"
                                                | "passive-cdp-runtime"
                                                | "native-analysis-provider"
                                                | "user-assertion";
                                                confidence: "unknown"
                                                | "exact"
                                                | "low"
                                                | "medium"
                                                | "high";
                                                coverage: {
                                                    limits: {
                                                        name: string;
                                                        unit:
                                                            | "other"
                                                            | "items"
                                                            | "bytes"
                                                            | "depth"
                                                            | "instructions"
                                                            | "milliseconds"
                                                            | "characters";
                                                        value: number;
                                                    }[];
                                                    omitted_count: number
                                                    | null;
                                                    status: "unknown" | "unavailable" | "complete" | "partial";
                                                    truncated: boolean;
                                                };
                                                evidence_ids: string[];
                                                extractor: {
                                                    executable_sha256: string
                                                    | null;
                                                    name: string;
                                                    operation: string;
                                                    version: string;
                                                };
                                                limitations: string[];
                                                location: | {
                                                    available: false;
                                                    detail: string;
                                                    reason: | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                                }
                                                | {
                                                    available: true;
                                                    value: | {
                                                        end: { column: number; line: number };
                                                        kind: "source-range";
                                                        source: string;
                                                        start: { column: number; line: number };
                                                    }
                                                    | { end: number; kind: "file-offset-range"; start: number }
                                                    | { kind: "artifact-path"; path: string }
                                                    | { kind: "url"; url: string }
                                                    | {
                                                        capture_sha256: string;
                                                        frame_key: string | null;
                                                        kind: "runtime";
                                                        script_key: string | null;
                                                        target_key: string;
                                                    }
                                                    | { address: string; kind: "native-address"; symbol: string
                                                    | null }
                                                    | { export_path: string; kind: "package-export"; package_name: string };
                                                };
                                                state: "unknown"
                                                | "observed"
                                                | "inferred"
                                                | "unavailable";
                                            };
                                            identifier_strategy: {
                                                stability: "observation-exact";
                                                strategy: "semantic-content-sha256";
                                            };
                                            label: string
                                            | null;
                                            observation_id: string;
                                            properties: Record<string, JSONType>;
                                        }[];
                                    },
                                >
                                +
                                + +
                                filesByPath: ReadonlyMap<string, JavaScriptArtifactFile>
                                +
                                + +
                                +
                                + +
                                input: {
                                    format: "directory" | "asar" | "auto";
                                    input_path: string;
                                    limits: {
                                        max_artifact_entry_bytes: number;
                                        max_ast_nodes: number;
                                        max_compression_ratio: number;
                                        max_depth: number;
                                        max_entries: number;
                                        max_findings: number;
                                        max_modules: number;
                                        max_parse_milliseconds: number;
                                        max_path_bytes: number;
                                        max_source_map_sources: number;
                                        max_text_file_bytes: number;
                                        max_text_files: number;
                                        max_total_artifact_bytes: number;
                                        max_total_text_bytes: number;
                                    };
                                    source_map_read_approved: boolean;
                                }
                                +
                                + +
                                moduleNodes: Map<
                                    string,
                                    {
                                        identity: | {
                                            sha256: string;
                                            stability: "global-exact";
                                            strategy: "content-digest";
                                        }
                                        | {
                                            original_source: string;
                                            source_map_sha256: string;
                                            source_sha256: string
                                            | null;
                                            stability: "source-map-exact";
                                            strategy: "source-map-original";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            path: string;
                                            stability: "artifact-version";
                                            strategy: "canonical-path";
                                        }
                                        | {
                                            algorithm: string;
                                            basis: (
                                                | "imports"
                                                | "exports"
                                                | "control-flow"
                                                | "syntax-tree"
                                                | "literals"
                                                | "api-usage"
                                            )[];
                                            fingerprint_sha256: string;
                                            stability: "cross-version-inference";
                                            strategy: "structural-fingerprint";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            key: string;
                                            namespace: string;
                                            stability: "artifact-version";
                                            strategy: "artifact-local-key";
                                        }
                                        | {
                                            capture_sha256: string;
                                            runtime_key: string;
                                            stability: "capture-only";
                                            strategy: "runtime-instance";
                                        }
                                        | {
                                            observation_sha256: string;
                                            scope: string;
                                            stability: "observation-only";
                                            strategy: "observation-fingerprint";
                                        };
                                        kind: | "unknown"
                                        | "target"
                                        | "native-addon"
                                        | "source-map"
                                        | "artifact"
                                        | "package"
                                        | "storage"
                                        | "worker"
                                        | "frame"
                                        | "endpoint"
                                        | "service-worker"
                                        | "installer"
                                        | "asar-entry"
                                        | "electron-main"
                                        | "electron-preload"
                                        | "electron-renderer"
                                        | "electron-utility"
                                        | "javascript-asset"
                                        | "javascript-chunk"
                                        | "javascript-module"
                                        | "source-module"
                                        | "browser-window"
                                        | "context-bridge-api"
                                        | "ipc-channel"
                                        | "ipc-handler"
                                        | "native-export"
                                        | "runtime-script-instance";
                                        node_id: string;
                                        observations: {
                                            evidence: {
                                                artifact: | { artifact_id: string; available: true; sha256: string }
                                                | {
                                                    available: false;
                                                    detail: string;
                                                    reason:
                                                        | "unknown"
                                                        | "truncated"
                                                        | "unresolved"
                                                        | "not-applicable"
                                                        | "not-approved"
                                                        | "not-observed"
                                                        | "provider-unavailable";
                                                };
                                                authority: | "unknown"
                                                | "controlled-replay"
                                                | "historical-reference"
                                                | "artifact-bytes"
                                                | "ast-static-analysis"
                                                | "static-relationship-inference"
                                                | "passive-cdp-runtime"
                                                | "native-analysis-provider"
                                                | "user-assertion";
                                                confidence: "unknown"
                                                | "exact"
                                                | "low"
                                                | "medium"
                                                | "high";
                                                coverage: {
                                                    limits: {
                                                        name: string;
                                                        unit:
                                                            | "other"
                                                            | "items"
                                                            | "bytes"
                                                            | "depth"
                                                            | "instructions"
                                                            | "milliseconds"
                                                            | "characters";
                                                        value: number;
                                                    }[];
                                                    omitted_count: number
                                                    | null;
                                                    status: "unknown" | "unavailable" | "complete" | "partial";
                                                    truncated: boolean;
                                                };
                                                evidence_ids: string[];
                                                extractor: {
                                                    executable_sha256: string
                                                    | null;
                                                    name: string;
                                                    operation: string;
                                                    version: string;
                                                };
                                                limitations: string[];
                                                location: | {
                                                    available: false;
                                                    detail: string;
                                                    reason: | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                                }
                                                | {
                                                    available: true;
                                                    value: | {
                                                        end: { column: number; line: number };
                                                        kind: "source-range";
                                                        source: string;
                                                        start: { column: number; line: number };
                                                    }
                                                    | { end: number; kind: "file-offset-range"; start: number }
                                                    | { kind: "artifact-path"; path: string }
                                                    | { kind: "url"; url: string }
                                                    | {
                                                        capture_sha256: string;
                                                        frame_key: string | null;
                                                        kind: "runtime";
                                                        script_key: string | null;
                                                        target_key: string;
                                                    }
                                                    | { address: string; kind: "native-address"; symbol: string
                                                    | null }
                                                    | { export_path: string; kind: "package-export"; package_name: string };
                                                };
                                                state: "unknown"
                                                | "observed"
                                                | "inferred"
                                                | "unavailable";
                                            };
                                            identifier_strategy: {
                                                stability: "observation-exact";
                                                strategy: "semantic-content-sha256";
                                            };
                                            label: string
                                            | null;
                                            observation_id: string;
                                            properties: Record<string, JSONType>;
                                        }[];
                                    },
                                >
                                +
                                + +
                                root: {
                                    identity:
                                        | {
                                            sha256: string;
                                            stability: "global-exact";
                                            strategy: "content-digest";
                                        }
                                        | {
                                            original_source: string;
                                            source_map_sha256: string;
                                            source_sha256: string
                                            | null;
                                            stability: "source-map-exact";
                                            strategy: "source-map-original";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            path: string;
                                            stability: "artifact-version";
                                            strategy: "canonical-path";
                                        }
                                        | {
                                            algorithm: string;
                                            basis: (
                                                | "imports"
                                                | "exports"
                                                | "control-flow"
                                                | "syntax-tree"
                                                | "literals"
                                                | "api-usage"
                                            )[];
                                            fingerprint_sha256: string;
                                            stability: "cross-version-inference";
                                            strategy: "structural-fingerprint";
                                        }
                                        | {
                                            artifact_sha256: string;
                                            key: string;
                                            namespace: string;
                                            stability: "artifact-version";
                                            strategy: "artifact-local-key";
                                        }
                                        | {
                                            capture_sha256: string;
                                            runtime_key: string;
                                            stability: "capture-only";
                                            strategy: "runtime-instance";
                                        }
                                        | {
                                            observation_sha256: string;
                                            scope: string;
                                            stability: "observation-only";
                                            strategy: "observation-fingerprint";
                                        };
                                    kind: | "unknown"
                                    | "target"
                                    | "native-addon"
                                    | "source-map"
                                    | "artifact"
                                    | "package"
                                    | "storage"
                                    | "worker"
                                    | "frame"
                                    | "endpoint"
                                    | "service-worker"
                                    | "installer"
                                    | "asar-entry"
                                    | "electron-main"
                                    | "electron-preload"
                                    | "electron-renderer"
                                    | "electron-utility"
                                    | "javascript-asset"
                                    | "javascript-chunk"
                                    | "javascript-module"
                                    | "source-module"
                                    | "browser-window"
                                    | "context-bridge-api"
                                    | "ipc-channel"
                                    | "ipc-handler"
                                    | "native-export"
                                    | "runtime-script-instance";
                                    node_id: string;
                                    observations: {
                                        evidence: {
                                            artifact: | { artifact_id: string; available: true; sha256: string }
                                            | {
                                                available: false;
                                                detail: string;
                                                reason:
                                                    | "unknown"
                                                    | "truncated"
                                                    | "unresolved"
                                                    | "not-applicable"
                                                    | "not-approved"
                                                    | "not-observed"
                                                    | "provider-unavailable";
                                            };
                                            authority: | "unknown"
                                            | "controlled-replay"
                                            | "historical-reference"
                                            | "artifact-bytes"
                                            | "ast-static-analysis"
                                            | "static-relationship-inference"
                                            | "passive-cdp-runtime"
                                            | "native-analysis-provider"
                                            | "user-assertion";
                                            confidence: "unknown"
                                            | "exact"
                                            | "low"
                                            | "medium"
                                            | "high";
                                            coverage: {
                                                limits: {
                                                    name: string;
                                                    unit:
                                                        | "other"
                                                        | "items"
                                                        | "bytes"
                                                        | "depth"
                                                        | "instructions"
                                                        | "milliseconds"
                                                        | "characters";
                                                    value: number;
                                                }[];
                                                omitted_count: number
                                                | null;
                                                status: "unknown" | "unavailable" | "complete" | "partial";
                                                truncated: boolean;
                                            };
                                            evidence_ids: string[];
                                            extractor: {
                                                executable_sha256: string
                                                | null;
                                                name: string;
                                                operation: string;
                                                version: string;
                                            };
                                            limitations: string[];
                                            location: | {
                                                available: false;
                                                detail: string;
                                                reason: | "unknown"
                                                | "truncated"
                                                | "unresolved"
                                                | "not-applicable"
                                                | "not-approved"
                                                | "not-observed"
                                                | "provider-unavailable";
                                            }
                                            | {
                                                available: true;
                                                value: | {
                                                    end: { column: number; line: number };
                                                    kind: "source-range";
                                                    source: string;
                                                    start: { column: number; line: number };
                                                }
                                                | { end: number; kind: "file-offset-range"; start: number }
                                                | { kind: "artifact-path"; path: string }
                                                | { kind: "url"; url: string }
                                                | {
                                                    capture_sha256: string;
                                                    frame_key: string | null;
                                                    kind: "runtime";
                                                    script_key: string | null;
                                                    target_key: string;
                                                }
                                                | { address: string; kind: "native-address"; symbol: string
                                                | null }
                                                | { export_path: string; kind: "package-export"; package_name: string };
                                            };
                                            state: "unknown"
                                            | "observed"
                                            | "inferred"
                                            | "unavailable";
                                        };
                                        identifier_strategy: {
                                            stability: "observation-exact";
                                            strategy: "semantic-content-sha256";
                                        };
                                        label: string
                                        | null;
                                        observation_id: string;
                                        properties: Record<string, JSONType>;
                                    }[];
                                }
                                +
                                + +
                                +
                                + +
                                +
                                diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphContext.RoleAssetLinkInput.html b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.RoleAssetLinkInput.html new file mode 100644 index 000000000..31e6a0601 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.RoleAssetLinkInput.html @@ -0,0 +1,82 @@ +RoleAssetLinkInput | rea-agents - v1.6.0
                                +
                                rea-agents - v1.6.0 + +
                                  +
                                  +
                                  Preparing search index...
                                  +
                                  +
                                  + +
                                  +

                                  Resolution from an inferred Electron role to an artifact asset.

                                  +
                                  +
                                  interface RoleAssetLinkInput {
                                      anchor: JavaScriptArtifactFile;
                                      coverage?: {
                                          limits: {
                                              name: string;
                                              unit:
                                                  | "other"
                                                  | "items"
                                                  | "bytes"
                                                  | "depth"
                                                  | "instructions"
                                                  | "milliseconds"
                                                  | "characters";
                                              value: number;
                                          }[];
                                          omitted_count: number
                                          | null;
                                          status: "unknown" | "unavailable" | "complete" | "partial";
                                          truncated: boolean;
                                      };
                                      path: string
                                      | null;
                                      range?: JavaScriptSourceRange;
                                      role: {
                                          identity:
                                              | {
                                                  sha256: string;
                                                  stability: "global-exact";
                                                  strategy: "content-digest";
                                              }
                                              | {
                                                  original_source: string;
                                                  source_map_sha256: string;
                                                  source_sha256: string
                                                  | null;
                                                  stability: "source-map-exact";
                                                  strategy: "source-map-original";
                                              }
                                              | {
                                                  artifact_sha256: string;
                                                  path: string;
                                                  stability: "artifact-version";
                                                  strategy: "canonical-path";
                                              }
                                              | {
                                                  algorithm: string;
                                                  basis: (
                                                      | "imports"
                                                      | "exports"
                                                      | "control-flow"
                                                      | "syntax-tree"
                                                      | "literals"
                                                      | "api-usage"
                                                  )[];
                                                  fingerprint_sha256: string;
                                                  stability: "cross-version-inference";
                                                  strategy: "structural-fingerprint";
                                              }
                                              | {
                                                  artifact_sha256: string;
                                                  key: string;
                                                  namespace: string;
                                                  stability: "artifact-version";
                                                  strategy: "artifact-local-key";
                                              }
                                              | {
                                                  capture_sha256: string;
                                                  runtime_key: string;
                                                  stability: "capture-only";
                                                  strategy: "runtime-instance";
                                              }
                                              | {
                                                  observation_sha256: string;
                                                  scope: string;
                                                  stability: "observation-only";
                                                  strategy: "observation-fingerprint";
                                              };
                                          kind: | "unknown"
                                          | "target"
                                          | "native-addon"
                                          | "source-map"
                                          | "artifact"
                                          | "package"
                                          | "storage"
                                          | "worker"
                                          | "frame"
                                          | "endpoint"
                                          | "service-worker"
                                          | "installer"
                                          | "asar-entry"
                                          | "electron-main"
                                          | "electron-preload"
                                          | "electron-renderer"
                                          | "electron-utility"
                                          | "javascript-asset"
                                          | "javascript-chunk"
                                          | "javascript-module"
                                          | "source-module"
                                          | "browser-window"
                                          | "context-bridge-api"
                                          | "ipc-channel"
                                          | "ipc-handler"
                                          | "native-export"
                                          | "runtime-script-instance";
                                          node_id: string;
                                          observations: {
                                              evidence: {
                                                  artifact: | { artifact_id: string; available: true; sha256: string }
                                                  | {
                                                      available: false;
                                                      detail: string;
                                                      reason:
                                                          | "unknown"
                                                          | "truncated"
                                                          | "unresolved"
                                                          | "not-applicable"
                                                          | "not-approved"
                                                          | "not-observed"
                                                          | "provider-unavailable";
                                                  };
                                                  authority: | "unknown"
                                                  | "controlled-replay"
                                                  | "historical-reference"
                                                  | "artifact-bytes"
                                                  | "ast-static-analysis"
                                                  | "static-relationship-inference"
                                                  | "passive-cdp-runtime"
                                                  | "native-analysis-provider"
                                                  | "user-assertion";
                                                  confidence: "unknown"
                                                  | "exact"
                                                  | "low"
                                                  | "medium"
                                                  | "high";
                                                  coverage: {
                                                      limits: {
                                                          name: string;
                                                          unit:
                                                              | "other"
                                                              | "items"
                                                              | "bytes"
                                                              | "depth"
                                                              | "instructions"
                                                              | "milliseconds"
                                                              | "characters";
                                                          value: number;
                                                      }[];
                                                      omitted_count: number
                                                      | null;
                                                      status: "unknown" | "unavailable" | "complete" | "partial";
                                                      truncated: boolean;
                                                  };
                                                  evidence_ids: string[];
                                                  extractor: {
                                                      executable_sha256: string
                                                      | null;
                                                      name: string;
                                                      operation: string;
                                                      version: string;
                                                  };
                                                  limitations: string[];
                                                  location: | {
                                                      available: false;
                                                      detail: string;
                                                      reason: | "unknown"
                                                      | "truncated"
                                                      | "unresolved"
                                                      | "not-applicable"
                                                      | "not-approved"
                                                      | "not-observed"
                                                      | "provider-unavailable";
                                                  }
                                                  | {
                                                      available: true;
                                                      value: | {
                                                          end: { column: number; line: number };
                                                          kind: "source-range";
                                                          source: string;
                                                          start: { column: number; line: number };
                                                      }
                                                      | { end: number; kind: "file-offset-range"; start: number }
                                                      | { kind: "artifact-path"; path: string }
                                                      | { kind: "url"; url: string }
                                                      | {
                                                          capture_sha256: string;
                                                          frame_key: string | null;
                                                          kind: "runtime";
                                                          script_key: string | null;
                                                          target_key: string;
                                                      }
                                                      | { address: string; kind: "native-address"; symbol: string
                                                      | null }
                                                      | { export_path: string; kind: "package-export"; package_name: string };
                                                  };
                                                  state: "unknown"
                                                  | "observed"
                                                  | "inferred"
                                                  | "unavailable";
                                              };
                                              identifier_strategy: {
                                                  stability: "observation-exact";
                                                  strategy: "semantic-content-sha256";
                                              };
                                              label: string
                                              | null;
                                              observation_id: string;
                                              properties: Record<string, JSONType>;
                                          }[];
                                      };
                                  }
                                  +
                                  +
                                  +
                                  +
                                  Index
                                  +
                                  +
                                  + +
                                  +
                                  + +
                                  +
                                  + +
                                  +
                                  + +
                                  coverage?: {
                                      limits: {
                                          name: string;
                                          unit:
                                              | "other"
                                              | "items"
                                              | "bytes"
                                              | "depth"
                                              | "instructions"
                                              | "milliseconds"
                                              | "characters";
                                          value: number;
                                      }[];
                                      omitted_count: number
                                      | null;
                                      status: "unknown" | "unavailable" | "complete" | "partial";
                                      truncated: boolean;
                                  }
                                  +
                                  + +
                                  path: string | null
                                  +
                                  + +
                                  +
                                  + +
                                  role: {
                                      identity:
                                          | {
                                              sha256: string;
                                              stability: "global-exact";
                                              strategy: "content-digest";
                                          }
                                          | {
                                              original_source: string;
                                              source_map_sha256: string;
                                              source_sha256: string
                                              | null;
                                              stability: "source-map-exact";
                                              strategy: "source-map-original";
                                          }
                                          | {
                                              artifact_sha256: string;
                                              path: string;
                                              stability: "artifact-version";
                                              strategy: "canonical-path";
                                          }
                                          | {
                                              algorithm: string;
                                              basis: (
                                                  | "imports"
                                                  | "exports"
                                                  | "control-flow"
                                                  | "syntax-tree"
                                                  | "literals"
                                                  | "api-usage"
                                              )[];
                                              fingerprint_sha256: string;
                                              stability: "cross-version-inference";
                                              strategy: "structural-fingerprint";
                                          }
                                          | {
                                              artifact_sha256: string;
                                              key: string;
                                              namespace: string;
                                              stability: "artifact-version";
                                              strategy: "artifact-local-key";
                                          }
                                          | {
                                              capture_sha256: string;
                                              runtime_key: string;
                                              stability: "capture-only";
                                              strategy: "runtime-instance";
                                          }
                                          | {
                                              observation_sha256: string;
                                              scope: string;
                                              stability: "observation-only";
                                              strategy: "observation-fingerprint";
                                          };
                                      kind: | "unknown"
                                      | "target"
                                      | "native-addon"
                                      | "source-map"
                                      | "artifact"
                                      | "package"
                                      | "storage"
                                      | "worker"
                                      | "frame"
                                      | "endpoint"
                                      | "service-worker"
                                      | "installer"
                                      | "asar-entry"
                                      | "electron-main"
                                      | "electron-preload"
                                      | "electron-renderer"
                                      | "electron-utility"
                                      | "javascript-asset"
                                      | "javascript-chunk"
                                      | "javascript-module"
                                      | "source-module"
                                      | "browser-window"
                                      | "context-bridge-api"
                                      | "ipc-channel"
                                      | "ipc-handler"
                                      | "native-export"
                                      | "runtime-script-instance";
                                      node_id: string;
                                      observations: {
                                          evidence: {
                                              artifact: | { artifact_id: string; available: true; sha256: string }
                                              | {
                                                  available: false;
                                                  detail: string;
                                                  reason:
                                                      | "unknown"
                                                      | "truncated"
                                                      | "unresolved"
                                                      | "not-applicable"
                                                      | "not-approved"
                                                      | "not-observed"
                                                      | "provider-unavailable";
                                              };
                                              authority: | "unknown"
                                              | "controlled-replay"
                                              | "historical-reference"
                                              | "artifact-bytes"
                                              | "ast-static-analysis"
                                              | "static-relationship-inference"
                                              | "passive-cdp-runtime"
                                              | "native-analysis-provider"
                                              | "user-assertion";
                                              confidence: "unknown"
                                              | "exact"
                                              | "low"
                                              | "medium"
                                              | "high";
                                              coverage: {
                                                  limits: {
                                                      name: string;
                                                      unit:
                                                          | "other"
                                                          | "items"
                                                          | "bytes"
                                                          | "depth"
                                                          | "instructions"
                                                          | "milliseconds"
                                                          | "characters";
                                                      value: number;
                                                  }[];
                                                  omitted_count: number
                                                  | null;
                                                  status: "unknown" | "unavailable" | "complete" | "partial";
                                                  truncated: boolean;
                                              };
                                              evidence_ids: string[];
                                              extractor: {
                                                  executable_sha256: string
                                                  | null;
                                                  name: string;
                                                  operation: string;
                                                  version: string;
                                              };
                                              limitations: string[];
                                              location: | {
                                                  available: false;
                                                  detail: string;
                                                  reason: | "unknown"
                                                  | "truncated"
                                                  | "unresolved"
                                                  | "not-applicable"
                                                  | "not-approved"
                                                  | "not-observed"
                                                  | "provider-unavailable";
                                              }
                                              | {
                                                  available: true;
                                                  value: | {
                                                      end: { column: number; line: number };
                                                      kind: "source-range";
                                                      source: string;
                                                      start: { column: number; line: number };
                                                  }
                                                  | { end: number; kind: "file-offset-range"; start: number }
                                                  | { kind: "artifact-path"; path: string }
                                                  | { kind: "url"; url: string }
                                                  | {
                                                      capture_sha256: string;
                                                      frame_key: string | null;
                                                      kind: "runtime";
                                                      script_key: string | null;
                                                      target_key: string;
                                                  }
                                                  | { address: string; kind: "native-address"; symbol: string
                                                  | null }
                                                  | { export_path: string; kind: "package-export"; package_name: string };
                                              };
                                              state: "unknown"
                                              | "observed"
                                              | "inferred"
                                              | "unavailable";
                                          };
                                          identifier_strategy: {
                                              stability: "observation-exact";
                                              strategy: "semantic-content-sha256";
                                          };
                                          label: string
                                          | null;
                                          observation_id: string;
                                          properties: Record<string, JSONType>;
                                      }[];
                                  }
                                  +
                                  + +
                                  +
                                  diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphContext.RoleNodeInput.html b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.RoleNodeInput.html new file mode 100644 index 000000000..42b334584 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.RoleNodeInput.html @@ -0,0 +1,94 @@ +RoleNodeInput | rea-agents - v1.6.0
                                  +
                                  rea-agents - v1.6.0 + +
                                    +
                                    +
                                    Preparing search index...
                                    +
                                    +
                                    + +
                                    +

                                    Electron role identity and static discovery evidence.

                                    +
                                    +
                                    interface RoleNodeInput {
                                        anchor: JavaScriptArtifactFile;
                                        coverage?: {
                                            limits: {
                                                name: string;
                                                unit:
                                                    | "other"
                                                    | "items"
                                                    | "bytes"
                                                    | "depth"
                                                    | "instructions"
                                                    | "milliseconds"
                                                    | "characters";
                                                value: number;
                                            }[];
                                            omitted_count: number
                                            | null;
                                            status: "unknown" | "unavailable" | "complete" | "partial";
                                            truncated: boolean;
                                        };
                                        declaredPath: string;
                                        kind: "electron-main"
                                        | "electron-preload"
                                        | "electron-renderer";
                                        mechanism: string;
                                        range?: JavaScriptSourceRange;
                                        resolvedPath: string | null;
                                    }
                                    +
                                    +
                                    +
                                    +
                                    Index
                                    +
                                    +
                                    + +
                                    +
                                    + +
                                    +
                                    + +
                                    coverage?: {
                                        limits: {
                                            name: string;
                                            unit:
                                                | "other"
                                                | "items"
                                                | "bytes"
                                                | "depth"
                                                | "instructions"
                                                | "milliseconds"
                                                | "characters";
                                            value: number;
                                        }[];
                                        omitted_count: number
                                        | null;
                                        status: "unknown" | "unavailable" | "complete" | "partial";
                                        truncated: boolean;
                                    }
                                    +
                                    + +
                                    declaredPath: string
                                    +
                                    + +
                                    kind: "electron-main" | "electron-preload" | "electron-renderer"
                                    +
                                    + +
                                    mechanism: string
                                    +
                                    + +
                                    +
                                    + +
                                    resolvedPath: string | null
                                    +
                                    + +
                                    +
                                    diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphContext.UnavailableParseInput.html b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.UnavailableParseInput.html new file mode 100644 index 000000000..54d9debda --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphContext.UnavailableParseInput.html @@ -0,0 +1,76 @@ +UnavailableParseInput | rea-agents - v1.6.0
                                    +
                                    rea-agents - v1.6.0 + +
                                      +
                                      +
                                      Preparing search index...
                                      +
                                      +
                                      + +
                                      +

                                      Explicit package, JavaScript, or source-map parse gap.

                                      +
                                      +
                                      interface UnavailableParseInput {
                                          asset: {
                                              identity:
                                                  | {
                                                      sha256: string;
                                                      stability: "global-exact";
                                                      strategy: "content-digest";
                                                  }
                                                  | {
                                                      original_source: string;
                                                      source_map_sha256: string;
                                                      source_sha256: string
                                                      | null;
                                                      stability: "source-map-exact";
                                                      strategy: "source-map-original";
                                                  }
                                                  | {
                                                      artifact_sha256: string;
                                                      path: string;
                                                      stability: "artifact-version";
                                                      strategy: "canonical-path";
                                                  }
                                                  | {
                                                      algorithm: string;
                                                      basis: (
                                                          | "imports"
                                                          | "exports"
                                                          | "control-flow"
                                                          | "syntax-tree"
                                                          | "literals"
                                                          | "api-usage"
                                                      )[];
                                                      fingerprint_sha256: string;
                                                      stability: "cross-version-inference";
                                                      strategy: "structural-fingerprint";
                                                  }
                                                  | {
                                                      artifact_sha256: string;
                                                      key: string;
                                                      namespace: string;
                                                      stability: "artifact-version";
                                                      strategy: "artifact-local-key";
                                                  }
                                                  | {
                                                      capture_sha256: string;
                                                      runtime_key: string;
                                                      stability: "capture-only";
                                                      strategy: "runtime-instance";
                                                  }
                                                  | {
                                                      observation_sha256: string;
                                                      scope: string;
                                                      stability: "observation-only";
                                                      strategy: "observation-fingerprint";
                                                  };
                                              kind: | "unknown"
                                              | "target"
                                              | "native-addon"
                                              | "source-map"
                                              | "artifact"
                                              | "package"
                                              | "storage"
                                              | "worker"
                                              | "frame"
                                              | "endpoint"
                                              | "service-worker"
                                              | "installer"
                                              | "asar-entry"
                                              | "electron-main"
                                              | "electron-preload"
                                              | "electron-renderer"
                                              | "electron-utility"
                                              | "javascript-asset"
                                              | "javascript-chunk"
                                              | "javascript-module"
                                              | "source-module"
                                              | "browser-window"
                                              | "context-bridge-api"
                                              | "ipc-channel"
                                              | "ipc-handler"
                                              | "native-export"
                                              | "runtime-script-instance";
                                              node_id: string;
                                              observations: {
                                                  evidence: {
                                                      artifact: | { artifact_id: string; available: true; sha256: string }
                                                      | {
                                                          available: false;
                                                          detail: string;
                                                          reason:
                                                              | "unknown"
                                                              | "truncated"
                                                              | "unresolved"
                                                              | "not-applicable"
                                                              | "not-approved"
                                                              | "not-observed"
                                                              | "provider-unavailable";
                                                      };
                                                      authority: | "unknown"
                                                      | "controlled-replay"
                                                      | "historical-reference"
                                                      | "artifact-bytes"
                                                      | "ast-static-analysis"
                                                      | "static-relationship-inference"
                                                      | "passive-cdp-runtime"
                                                      | "native-analysis-provider"
                                                      | "user-assertion";
                                                      confidence: "unknown"
                                                      | "exact"
                                                      | "low"
                                                      | "medium"
                                                      | "high";
                                                      coverage: {
                                                          limits: {
                                                              name: string;
                                                              unit:
                                                                  | "other"
                                                                  | "items"
                                                                  | "bytes"
                                                                  | "depth"
                                                                  | "instructions"
                                                                  | "milliseconds"
                                                                  | "characters";
                                                              value: number;
                                                          }[];
                                                          omitted_count: number
                                                          | null;
                                                          status: "unknown" | "unavailable" | "complete" | "partial";
                                                          truncated: boolean;
                                                      };
                                                      evidence_ids: string[];
                                                      extractor: {
                                                          executable_sha256: string
                                                          | null;
                                                          name: string;
                                                          operation: string;
                                                          version: string;
                                                      };
                                                      limitations: string[];
                                                      location: | {
                                                          available: false;
                                                          detail: string;
                                                          reason: | "unknown"
                                                          | "truncated"
                                                          | "unresolved"
                                                          | "not-applicable"
                                                          | "not-approved"
                                                          | "not-observed"
                                                          | "provider-unavailable";
                                                      }
                                                      | {
                                                          available: true;
                                                          value: | {
                                                              end: { column: number; line: number };
                                                              kind: "source-range";
                                                              source: string;
                                                              start: { column: number; line: number };
                                                          }
                                                          | { end: number; kind: "file-offset-range"; start: number }
                                                          | { kind: "artifact-path"; path: string }
                                                          | { kind: "url"; url: string }
                                                          | {
                                                              capture_sha256: string;
                                                              frame_key: string | null;
                                                              kind: "runtime";
                                                              script_key: string | null;
                                                              target_key: string;
                                                          }
                                                          | { address: string; kind: "native-address"; symbol: string
                                                          | null }
                                                          | { export_path: string; kind: "package-export"; package_name: string };
                                                      };
                                                      state: "unknown"
                                                      | "observed"
                                                      | "inferred"
                                                      | "unavailable";
                                                  };
                                                  identifier_strategy: {
                                                      stability: "observation-exact";
                                                      strategy: "semantic-content-sha256";
                                                  };
                                                  label: string
                                                  | null;
                                                  observation_id: string;
                                                  properties: Record<string, JSONType>;
                                              }[];
                                          };
                                          file: JavaScriptArtifactFile;
                                          limitation: string;
                                          operation: string;
                                      }
                                      +
                                      +
                                      +
                                      +
                                      Index
                                      +
                                      +
                                      + +
                                      +
                                      + +
                                      +
                                      + +
                                      asset: {
                                          identity:
                                              | {
                                                  sha256: string;
                                                  stability: "global-exact";
                                                  strategy: "content-digest";
                                              }
                                              | {
                                                  original_source: string;
                                                  source_map_sha256: string;
                                                  source_sha256: string
                                                  | null;
                                                  stability: "source-map-exact";
                                                  strategy: "source-map-original";
                                              }
                                              | {
                                                  artifact_sha256: string;
                                                  path: string;
                                                  stability: "artifact-version";
                                                  strategy: "canonical-path";
                                              }
                                              | {
                                                  algorithm: string;
                                                  basis: (
                                                      | "imports"
                                                      | "exports"
                                                      | "control-flow"
                                                      | "syntax-tree"
                                                      | "literals"
                                                      | "api-usage"
                                                  )[];
                                                  fingerprint_sha256: string;
                                                  stability: "cross-version-inference";
                                                  strategy: "structural-fingerprint";
                                              }
                                              | {
                                                  artifact_sha256: string;
                                                  key: string;
                                                  namespace: string;
                                                  stability: "artifact-version";
                                                  strategy: "artifact-local-key";
                                              }
                                              | {
                                                  capture_sha256: string;
                                                  runtime_key: string;
                                                  stability: "capture-only";
                                                  strategy: "runtime-instance";
                                              }
                                              | {
                                                  observation_sha256: string;
                                                  scope: string;
                                                  stability: "observation-only";
                                                  strategy: "observation-fingerprint";
                                              };
                                          kind: | "unknown"
                                          | "target"
                                          | "native-addon"
                                          | "source-map"
                                          | "artifact"
                                          | "package"
                                          | "storage"
                                          | "worker"
                                          | "frame"
                                          | "endpoint"
                                          | "service-worker"
                                          | "installer"
                                          | "asar-entry"
                                          | "electron-main"
                                          | "electron-preload"
                                          | "electron-renderer"
                                          | "electron-utility"
                                          | "javascript-asset"
                                          | "javascript-chunk"
                                          | "javascript-module"
                                          | "source-module"
                                          | "browser-window"
                                          | "context-bridge-api"
                                          | "ipc-channel"
                                          | "ipc-handler"
                                          | "native-export"
                                          | "runtime-script-instance";
                                          node_id: string;
                                          observations: {
                                              evidence: {
                                                  artifact: | { artifact_id: string; available: true; sha256: string }
                                                  | {
                                                      available: false;
                                                      detail: string;
                                                      reason:
                                                          | "unknown"
                                                          | "truncated"
                                                          | "unresolved"
                                                          | "not-applicable"
                                                          | "not-approved"
                                                          | "not-observed"
                                                          | "provider-unavailable";
                                                  };
                                                  authority: | "unknown"
                                                  | "controlled-replay"
                                                  | "historical-reference"
                                                  | "artifact-bytes"
                                                  | "ast-static-analysis"
                                                  | "static-relationship-inference"
                                                  | "passive-cdp-runtime"
                                                  | "native-analysis-provider"
                                                  | "user-assertion";
                                                  confidence: "unknown"
                                                  | "exact"
                                                  | "low"
                                                  | "medium"
                                                  | "high";
                                                  coverage: {
                                                      limits: {
                                                          name: string;
                                                          unit:
                                                              | "other"
                                                              | "items"
                                                              | "bytes"
                                                              | "depth"
                                                              | "instructions"
                                                              | "milliseconds"
                                                              | "characters";
                                                          value: number;
                                                      }[];
                                                      omitted_count: number
                                                      | null;
                                                      status: "unknown" | "unavailable" | "complete" | "partial";
                                                      truncated: boolean;
                                                  };
                                                  evidence_ids: string[];
                                                  extractor: {
                                                      executable_sha256: string
                                                      | null;
                                                      name: string;
                                                      operation: string;
                                                      version: string;
                                                  };
                                                  limitations: string[];
                                                  location: | {
                                                      available: false;
                                                      detail: string;
                                                      reason: | "unknown"
                                                      | "truncated"
                                                      | "unresolved"
                                                      | "not-applicable"
                                                      | "not-approved"
                                                      | "not-observed"
                                                      | "provider-unavailable";
                                                  }
                                                  | {
                                                      available: true;
                                                      value: | {
                                                          end: { column: number; line: number };
                                                          kind: "source-range";
                                                          source: string;
                                                          start: { column: number; line: number };
                                                      }
                                                      | { end: number; kind: "file-offset-range"; start: number }
                                                      | { kind: "artifact-path"; path: string }
                                                      | { kind: "url"; url: string }
                                                      | {
                                                          capture_sha256: string;
                                                          frame_key: string | null;
                                                          kind: "runtime";
                                                          script_key: string | null;
                                                          target_key: string;
                                                      }
                                                      | { address: string; kind: "native-address"; symbol: string
                                                      | null }
                                                      | { export_path: string; kind: "package-export"; package_name: string };
                                                  };
                                                  state: "unknown"
                                                  | "observed"
                                                  | "inferred"
                                                  | "unavailable";
                                              };
                                              identifier_strategy: {
                                                  stability: "observation-exact";
                                                  strategy: "semantic-content-sha256";
                                              };
                                              label: string
                                              | null;
                                              observation_id: string;
                                              properties: Record<string, JSONType>;
                                          }[];
                                      }
                                      +
                                      + +
                                      +
                                      + +
                                      limitation: string
                                      +
                                      + +
                                      operation: string
                                      +
                                      + +
                                      +
                                      diff --git a/docs/api/interfaces/application_JavaScriptArtifactGraphEvidence.EvidenceInput.html b/docs/api/interfaces/application_JavaScriptArtifactGraphEvidence.EvidenceInput.html new file mode 100644 index 000000000..d3c3f8264 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactGraphEvidence.EvidenceInput.html @@ -0,0 +1,88 @@ +EvidenceInput | rea-agents - v1.6.0
                                      +
                                      rea-agents - v1.6.0 + +
                                        +
                                        +
                                        Preparing search index...
                                        +
                                        +
                                        + +
                                        +

                                        Shared exact artifact location and bounded coverage for static evidence.

                                        +
                                        +
                                        interface EvidenceInput {
                                            coverage: {
                                                limits: {
                                                    name: string;
                                                    unit:
                                                        | "other"
                                                        | "items"
                                                        | "bytes"
                                                        | "depth"
                                                        | "instructions"
                                                        | "milliseconds"
                                                        | "characters";
                                                    value: number;
                                                }[];
                                                omitted_count: number
                                                | null;
                                                status: "unknown" | "unavailable" | "complete" | "partial";
                                                truncated: boolean;
                                            };
                                            limitations?: readonly string[];
                                            operation: string;
                                            path: string;
                                            range?: JavaScriptSourceRange;
                                            sha256: string;
                                        }
                                        +
                                        +
                                        +
                                        +
                                        Index
                                        +
                                        +
                                        + +
                                        +
                                        + +
                                        coverage: {
                                            limits: {
                                                name: string;
                                                unit:
                                                    | "other"
                                                    | "items"
                                                    | "bytes"
                                                    | "depth"
                                                    | "instructions"
                                                    | "milliseconds"
                                                    | "characters";
                                                value: number;
                                            }[];
                                            omitted_count: number
                                            | null;
                                            status: "unknown" | "unavailable" | "complete" | "partial";
                                            truncated: boolean;
                                        }
                                        +
                                        + +
                                        limitations?: readonly string[]
                                        +
                                        + +
                                        operation: string
                                        +
                                        + +
                                        path: string
                                        +
                                        + +
                                        +
                                        + +
                                        sha256: string
                                        +
                                        + +
                                        +
                                        diff --git a/docs/api/interfaces/application_JavaScriptArtifactReconstruction.JavaScriptArtifactReconstructionResult.html b/docs/api/interfaces/application_JavaScriptArtifactReconstruction.JavaScriptArtifactReconstructionResult.html new file mode 100644 index 000000000..2b342f431 --- /dev/null +++ b/docs/api/interfaces/application_JavaScriptArtifactReconstruction.JavaScriptArtifactReconstructionResult.html @@ -0,0 +1,94 @@ +JavaScriptArtifactReconstructionResult | rea-agents - v1.6.0
                                        +
                                        rea-agents - v1.6.0 + +
                                          +
                                          +
                                          Preparing search index...
                                          +
                                          +
                                          +
                                          + +

                                          Interface JavaScriptArtifactReconstructionResult

                                          +
                                          +

                                          Application-layer result retaining local diagnostics outside the canonical graph.

                                          +
                                          +
                                          interface JavaScriptArtifactReconstructionResult {
                                              format: "directory" | "asar";
                                              graph: {
                                                  coverage: {
                                                      limits: {
                                                          name: string;
                                                          unit:
                                                              | "other"
                                                              | "items"
                                                              | "bytes"
                                                              | "depth"
                                                              | "instructions"
                                                              | "milliseconds"
                                                              | "characters";
                                                          value: number;
                                                      }[];
                                                      omitted_count: number
                                                      | null;
                                                      status: "unknown" | "unavailable" | "complete" | "partial";
                                                      truncated: boolean;
                                                  };
                                                  edges: {
                                                      edge_id: string;
                                                      evidence: {
                                                          artifact: | { artifact_id: string; available: true; sha256: string }
                                                          | {
                                                              available: false;
                                                              detail: string;
                                                              reason:
                                                                  | "unknown"
                                                                  | "truncated"
                                                                  | "unresolved"
                                                                  | "not-applicable"
                                                                  | "not-approved"
                                                                  | "not-observed"
                                                                  | "provider-unavailable";
                                                          };
                                                          authority: | "unknown"
                                                          | "controlled-replay"
                                                          | "historical-reference"
                                                          | "artifact-bytes"
                                                          | "ast-static-analysis"
                                                          | "static-relationship-inference"
                                                          | "passive-cdp-runtime"
                                                          | "native-analysis-provider"
                                                          | "user-assertion";
                                                          confidence: "unknown"
                                                          | "exact"
                                                          | "low"
                                                          | "medium"
                                                          | "high";
                                                          coverage: {
                                                              limits: {
                                                                  name: string;
                                                                  unit:
                                                                      | "other"
                                                                      | "items"
                                                                      | "bytes"
                                                                      | "depth"
                                                                      | "instructions"
                                                                      | "milliseconds"
                                                                      | "characters";
                                                                  value: number;
                                                              }[];
                                                              omitted_count: number
                                                              | null;
                                                              status: "unknown" | "unavailable" | "complete" | "partial";
                                                              truncated: boolean;
                                                          };
                                                          evidence_ids: string[];
                                                          extractor: {
                                                              executable_sha256: string
                                                              | null;
                                                              name: string;
                                                              operation: string;
                                                              version: string;
                                                          };
                                                          limitations: string[];
                                                          location: | {
                                                              available: false;
                                                              detail: string;
                                                              reason: | "unknown"
                                                              | "truncated"
                                                              | "unresolved"
                                                              | "not-applicable"
                                                              | "not-approved"
                                                              | "not-observed"
                                                              | "provider-unavailable";
                                                          }
                                                          | {
                                                              available: true;
                                                              value: | {
                                                                  end: { column: number; line: number };
                                                                  kind: "source-range";
                                                                  source: string;
                                                                  start: { column: number; line: number };
                                                              }
                                                              | { end: number; kind: "file-offset-range"; start: number }
                                                              | { kind: "artifact-path"; path: string }
                                                              | { kind: "url"; url: string }
                                                              | {
                                                                  capture_sha256: string;
                                                                  frame_key: string | null;
                                                                  kind: "runtime";
                                                                  script_key: string | null;
                                                                  target_key: string;
                                                              }
                                                              | { address: string; kind: "native-address"; symbol: string
                                                              | null }
                                                              | { export_path: string; kind: "package-export"; package_name: string };
                                                          };
                                                          state: "unknown"
                                                          | "observed"
                                                          | "inferred"
                                                          | "unavailable";
                                                      };
                                                      identifier_strategy: {
                                                          stability: "relationship-exact";
                                                          strategy: "semantic-content-sha256";
                                                      };
                                                      properties: Record<string, JSONType>;
                                                      relation:
                                                          | "contains"
                                                          | "loads"
                                                          | "calls"
                                                          | "imports"
                                                          | "maps_to"
                                                          | "exposes"
                                                          | "sends"
                                                          | "invokes"
                                                          | "handles"
                                                          | "persists_to"
                                                          | "observed_as"
                                                          | "changed_from";
                                                      source_node_id: string;
                                                      target_node_id: string;
                                                  }[];
                                                  graph_id: string;
                                                  limitations: string[];
                                                  nodes: {
                                                      identity: | {
                                                          sha256: string;
                                                          stability: "global-exact";
                                                          strategy: "content-digest";
                                                      }
                                                      | {
                                                          original_source: string;
                                                          source_map_sha256: string;
                                                          source_sha256: string
                                                          | null;
                                                          stability: "source-map-exact";
                                                          strategy: "source-map-original";
                                                      }
                                                      | {
                                                          artifact_sha256: string;
                                                          path: string;
                                                          stability: "artifact-version";
                                                          strategy: "canonical-path";
                                                      }
                                                      | {
                                                          algorithm: string;
                                                          basis: (
                                                              | "imports"
                                                              | "exports"
                                                              | "control-flow"
                                                              | "syntax-tree"
                                                              | "literals"
                                                              | "api-usage"
                                                          )[];
                                                          fingerprint_sha256: string;
                                                          stability: "cross-version-inference";
                                                          strategy: "structural-fingerprint";
                                                      }
                                                      | {
                                                          artifact_sha256: string;
                                                          key: string;
                                                          namespace: string;
                                                          stability: "artifact-version";
                                                          strategy: "artifact-local-key";
                                                      }
                                                      | {
                                                          capture_sha256: string;
                                                          runtime_key: string;
                                                          stability: "capture-only";
                                                          strategy: "runtime-instance";
                                                      }
                                                      | {
                                                          observation_sha256: string;
                                                          scope: string;
                                                          stability: "observation-only";
                                                          strategy: "observation-fingerprint";
                                                      };
                                                      kind: | "unknown"
                                                      | "target"
                                                      | "native-addon"
                                                      | "source-map"
                                                      | "artifact"
                                                      | "package"
                                                      | "storage"
                                                      | "worker"
                                                      | "frame"
                                                      | "endpoint"
                                                      | "service-worker"
                                                      | "installer"
                                                      | "asar-entry"
                                                      | "electron-main"
                                                      | "electron-preload"
                                                      | "electron-renderer"
                                                      | "electron-utility"
                                                      | "javascript-asset"
                                                      | "javascript-chunk"
                                                      | "javascript-module"
                                                      | "source-module"
                                                      | "browser-window"
                                                      | "context-bridge-api"
                                                      | "ipc-channel"
                                                      | "ipc-handler"
                                                      | "native-export"
                                                      | "runtime-script-instance";
                                                      node_id: string;
                                                      observations: {
                                                          evidence: {
                                                              artifact: | { artifact_id: string; available: true; sha256: string }
                                                              | {
                                                                  available: false;
                                                                  detail: string;
                                                                  reason:
                                                                      | "unknown"
                                                                      | "truncated"
                                                                      | "unresolved"
                                                                      | "not-applicable"
                                                                      | "not-approved"
                                                                      | "not-observed"
                                                                      | "provider-unavailable";
                                                              };
                                                              authority: | "unknown"
                                                              | "controlled-replay"
                                                              | "historical-reference"
                                                              | "artifact-bytes"
                                                              | "ast-static-analysis"
                                                              | "static-relationship-inference"
                                                              | "passive-cdp-runtime"
                                                              | "native-analysis-provider"
                                                              | "user-assertion";
                                                              confidence: "unknown"
                                                              | "exact"
                                                              | "low"
                                                              | "medium"
                                                              | "high";
                                                              coverage: {
                                                                  limits: {
                                                                      name: string;
                                                                      unit:
                                                                          | "other"
                                                                          | "items"
                                                                          | "bytes"
                                                                          | "depth"
                                                                          | "instructions"
                                                                          | "milliseconds"
                                                                          | "characters";
                                                                      value: number;
                                                                  }[];
                                                                  omitted_count: number
                                                                  | null;
                                                                  status: "unknown" | "unavailable" | "complete" | "partial";
                                                                  truncated: boolean;
                                                              };
                                                              evidence_ids: string[];
                                                              extractor: {
                                                                  executable_sha256: string
                                                                  | null;
                                                                  name: string;
                                                                  operation: string;
                                                                  version: string;
                                                              };
                                                              limitations: string[];
                                                              location: | {
                                                                  available: false;
                                                                  detail: string;
                                                                  reason: | "unknown"
                                                                  | "truncated"
                                                                  | "unresolved"
                                                                  | "not-applicable"
                                                                  | "not-approved"
                                                                  | "not-observed"
                                                                  | "provider-unavailable";
                                                              }
                                                              | {
                                                                  available: true;
                                                                  value: | {
                                                                      end: { column: ...; line: ... };
                                                                      kind: "source-range";
                                                                      source: string;
                                                                      start: { column: ...; line: ... };
                                                                  }
                                                                  | { end: number; kind: "file-offset-range"; start: number }
                                                                  | { kind: "artifact-path"; path: string }
                                                                  | { kind: "url"; url: string }
                                                                  | {
                                                                      capture_sha256: string;
                                                                      frame_key: (...) | (...);
                                                                      kind: "runtime";
                                                                      script_key: (...) | (...);
                                                                      target_key: string;
                                                                  }
                                                                  | { address: string; kind: "native-address"; symbol: (...)
                                                                  | (...) }
                                                                  | {
                                                                      export_path: string;
                                                                      kind: "package-export";
                                                                      package_name: string;
                                                                  };
                                                              };
                                                              state: "unknown"
                                                              | "observed"
                                                              | "inferred"
                                                              | "unavailable";
                                                          };
                                                          identifier_strategy: {
                                                              stability: "observation-exact";
                                                              strategy: "semantic-content-sha256";
                                                          };
                                                          label: string
                                                          | null;
                                                          observation_id: string;
                                                          properties: Record<string, JSONType>;
                                                      }[];
                                                  }[];
                                                  root_node_ids: string[];
                                                  schema: "JavaScriptApplicationGraph";
                                                  schema_version: 1;
                                              };
                                              input_path: string;
                                              inventory_graph_sha256: string;
                                              inventory_manifest_id: string;
                                              limitations: readonly string[];
                                              statistics: {
                                                  findings: number;
                                                  invalid_utf8_files: number;
                                                  limit_omitted_text_files: number;
                                                  modules: number;
                                                  nested_asar_containers: number;
                                                  omitted_text_files: number;
                                                  parse_failures: number;
                                                  parsed_javascript_files: number;
                                                  policy_filtered_text_files: number;
                                                  relevant_files: number;
                                                  text_bytes_read: number;
                                                  text_files_selected: number;
                                                  truncated_scopes: number;
                                                  visited_ast_nodes: number;
                                              };
                                          }
                                          +
                                          +
                                          +
                                          +
                                          Index
                                          +
                                          +
                                          + +
                                          +
                                          + +
                                          format: "directory" | "asar"
                                          +
                                          + +
                                          graph: {
                                              coverage: {
                                                  limits: {
                                                      name: string;
                                                      unit:
                                                          | "other"
                                                          | "items"
                                                          | "bytes"
                                                          | "depth"
                                                          | "instructions"
                                                          | "milliseconds"
                                                          | "characters";
                                                      value: number;
                                                  }[];
                                                  omitted_count: number
                                                  | null;
                                                  status: "unknown" | "unavailable" | "complete" | "partial";
                                                  truncated: boolean;
                                              };
                                              edges: {
                                                  edge_id: string;
                                                  evidence: {
                                                      artifact: | { artifact_id: string; available: true; sha256: string }
                                                      | {
                                                          available: false;
                                                          detail: string;
                                                          reason:
                                                              | "unknown"
                                                              | "truncated"
                                                              | "unresolved"
                                                              | "not-applicable"
                                                              | "not-approved"
                                                              | "not-observed"
                                                              | "provider-unavailable";
                                                      };
                                                      authority: | "unknown"
                                                      | "controlled-replay"
                                                      | "historical-reference"
                                                      | "artifact-bytes"
                                                      | "ast-static-analysis"
                                                      | "static-relationship-inference"
                                                      | "passive-cdp-runtime"
                                                      | "native-analysis-provider"
                                                      | "user-assertion";
                                                      confidence: "unknown"
                                                      | "exact"
                                                      | "low"
                                                      | "medium"
                                                      | "high";
                                                      coverage: {
                                                          limits: {
                                                              name: string;
                                                              unit:
                                                                  | "other"
                                                                  | "items"
                                                                  | "bytes"
                                                                  | "depth"
                                                                  | "instructions"
                                                                  | "milliseconds"
                                                                  | "characters";
                                                              value: number;
                                                          }[];
                                                          omitted_count: number
                                                          | null;
                                                          status: "unknown" | "unavailable" | "complete" | "partial";
                                                          truncated: boolean;
                                                      };
                                                      evidence_ids: string[];
                                                      extractor: {
                                                          executable_sha256: string
                                                          | null;
                                                          name: string;
                                                          operation: string;
                                                          version: string;
                                                      };
                                                      limitations: string[];
                                                      location: | {
                                                          available: false;
                                                          detail: string;
                                                          reason: | "unknown"
                                                          | "truncated"
                                                          | "unresolved"
                                                          | "not-applicable"
                                                          | "not-approved"
                                                          | "not-observed"
                                                          | "provider-unavailable";
                                                      }
                                                      | {
                                                          available: true;
                                                          value: | {
                                                              end: { column: number; line: number };
                                                              kind: "source-range";
                                                              source: string;
                                                              start: { column: number; line: number };
                                                          }
                                                          | { end: number; kind: "file-offset-range"; start: number }
                                                          | { kind: "artifact-path"; path: string }
                                                          | { kind: "url"; url: string }
                                                          | {
                                                              capture_sha256: string;
                                                              frame_key: string | null;
                                                              kind: "runtime";
                                                              script_key: string | null;
                                                              target_key: string;
                                                          }
                                                          | { address: string; kind: "native-address"; symbol: string
                                                          | null }
                                                          | { export_path: string; kind: "package-export"; package_name: string };
                                                      };
                                                      state: "unknown"
                                                      | "observed"
                                                      | "inferred"
                                                      | "unavailable";
                                                  };
                                                  identifier_strategy: {
                                                      stability: "relationship-exact";
                                                      strategy: "semantic-content-sha256";
                                                  };
                                                  properties: Record<string, JSONType>;
                                                  relation:
                                                      | "contains"
                                                      | "loads"
                                                      | "calls"
                                                      | "imports"
                                                      | "maps_to"
                                                      | "exposes"
                                                      | "sends"
                                                      | "invokes"
                                                      | "handles"
                                                      | "persists_to"
                                                      | "observed_as"
                                                      | "changed_from";
                                                  source_node_id: string;
                                                  target_node_id: string;
                                              }[];
                                              graph_id: string;
                                              limitations: string[];
                                              nodes: {
                                                  identity: | {
                                                      sha256: string;
                                                      stability: "global-exact";
                                                      strategy: "content-digest";
                                                  }
                                                  | {
                                                      original_source: string;
                                                      source_map_sha256: string;
                                                      source_sha256: string
                                                      | null;
                                                      stability: "source-map-exact";
                                                      strategy: "source-map-original";
                                                  }
                                                  | {
                                                      artifact_sha256: string;
                                                      path: string;
                                                      stability: "artifact-version";
                                                      strategy: "canonical-path";
                                                  }
                                                  | {
                                                      algorithm: string;
                                                      basis: (
                                                          | "imports"
                                                          | "exports"
                                                          | "control-flow"
                                                          | "syntax-tree"
                                                          | "literals"
                                                          | "api-usage"
                                                      )[];
                                                      fingerprint_sha256: string;
                                                      stability: "cross-version-inference";
                                                      strategy: "structural-fingerprint";
                                                  }
                                                  | {
                                                      artifact_sha256: string;
                                                      key: string;
                                                      namespace: string;
                                                      stability: "artifact-version";
                                                      strategy: "artifact-local-key";
                                                  }
                                                  | {
                                                      capture_sha256: string;
                                                      runtime_key: string;
                                                      stability: "capture-only";
                                                      strategy: "runtime-instance";
                                                  }
                                                  | {
                                                      observation_sha256: string;
                                                      scope: string;
                                                      stability: "observation-only";
                                                      strategy: "observation-fingerprint";
                                                  };
                                                  kind: | "unknown"
                                                  | "target"
                                                  | "native-addon"
                                                  | "source-map"
                                                  | "artifact"
                                                  | "package"
                                                  | "storage"
                                                  | "worker"
                                                  | "frame"
                                                  | "endpoint"
                                                  | "service-worker"
                                                  | "installer"
                                                  | "asar-entry"
                                                  | "electron-main"
                                                  | "electron-preload"
                                                  | "electron-renderer"
                                                  | "electron-utility"
                                                  | "javascript-asset"
                                                  | "javascript-chunk"
                                                  | "javascript-module"
                                                  | "source-module"
                                                  | "browser-window"
                                                  | "context-bridge-api"
                                                  | "ipc-channel"
                                                  | "ipc-handler"
                                                  | "native-export"
                                                  | "runtime-script-instance";
                                                  node_id: string;
                                                  observations: {
                                                      evidence: {
                                                          artifact: | { artifact_id: string; available: true; sha256: string }
                                                          | {
                                                              available: false;
                                                              detail: string;
                                                              reason:
                                                                  | "unknown"
                                                                  | "truncated"
                                                                  | "unresolved"
                                                                  | "not-applicable"
                                                                  | "not-approved"
                                                                  | "not-observed"
                                                                  | "provider-unavailable";
                                                          };
                                                          authority: | "unknown"
                                                          | "controlled-replay"
                                                          | "historical-reference"
                                                          | "artifact-bytes"
                                                          | "ast-static-analysis"
                                                          | "static-relationship-inference"
                                                          | "passive-cdp-runtime"
                                                          | "native-analysis-provider"
                                                          | "user-assertion";
                                                          confidence: "unknown"
                                                          | "exact"
                                                          | "low"
                                                          | "medium"
                                                          | "high";
                                                          coverage: {
                                                              limits: {
                                                                  name: string;
                                                                  unit:
                                                                      | "other"
                                                                      | "items"
                                                                      | "bytes"
                                                                      | "depth"
                                                                      | "instructions"
                                                                      | "milliseconds"
                                                                      | "characters";
                                                                  value: number;
                                                              }[];
                                                              omitted_count: number
                                                              | null;
                                                              status: "unknown" | "unavailable" | "complete" | "partial";
                                                              truncated: boolean;
                                                          };
                                                          evidence_ids: string[];
                                                          extractor: {
                                                              executable_sha256: string
                                                              | null;
                                                              name: string;
                                                              operation: string;
                                                              version: string;
                                                          };
                                                          limitations: string[];
                                                          location: | {
                                                              available: false;
                                                              detail: string;
                                                              reason: | "unknown"
                                                              | "truncated"
                                                              | "unresolved"
                                                              | "not-applicable"
                                                              | "not-approved"
                                                              | "not-observed"
                                                              | "provider-unavailable";
                                                          }
                                                          | {
                                                              available: true;
                                                              value: | {
                                                                  end: { column: ...; line: ... };
                                                                  kind: "source-range";
                                                                  source: string;
                                                                  start: { column: ...; line: ... };
                                                              }
                                                              | { end: number; kind: "file-offset-range"; start: number }
                                                              | { kind: "artifact-path"; path: string }
                                                              | { kind: "url"; url: string }
                                                              | {
                                                                  capture_sha256: string;
                                                                  frame_key: (...) | (...);
                                                                  kind: "runtime";
                                                                  script_key: (...) | (...);
                                                                  target_key: string;
                                                              }
                                                              | { address: string; kind: "native-address"; symbol: (...)
                                                              | (...) }
                                                              | { export_path: string; kind: "package-export"; package_name: string };
                                                          };
                                                          state: "unknown"
                                                          | "observed"
                                                          | "inferred"
                                                          | "unavailable";
                                                      };
                                                      identifier_strategy: {
                                                          stability: "observation-exact";
                                                          strategy: "semantic-content-sha256";
                                                      };
                                                      label: string
                                                      | null;
                                                      observation_id: string;
                                                      properties: Record<string, JSONType>;
                                                  }[];
                                              }[];
                                              root_node_ids: string[];
                                              schema: "JavaScriptApplicationGraph";
                                              schema_version: 1;
                                          }
                                          +
                                          + +
                                          input_path: string
                                          +
                                          + +
                                          inventory_graph_sha256: string
                                          +
                                          + +
                                          inventory_manifest_id: string
                                          +
                                          + +
                                          limitations: readonly string[]
                                          +
                                          + +
                                          statistics: {
                                              findings: number;
                                              invalid_utf8_files: number;
                                              limit_omitted_text_files: number;
                                              modules: number;
                                              nested_asar_containers: number;
                                              omitted_text_files: number;
                                              parse_failures: number;
                                              parsed_javascript_files: number;
                                              policy_filtered_text_files: number;
                                              relevant_files: number;
                                              text_bytes_read: number;
                                              text_files_selected: number;
                                              truncated_scopes: number;
                                              visited_ast_nodes: number;
                                          }
                                          +
                                          + +
                                          +
                                          diff --git a/docs/api/interfaces/domain_javascriptAstFingerprint.AstFingerprint.html b/docs/api/interfaces/domain_javascriptAstFingerprint.AstFingerprint.html new file mode 100644 index 000000000..db94daea2 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptAstFingerprint.AstFingerprint.html @@ -0,0 +1,64 @@ +AstFingerprint | rea-agents - v1.6.0
                                          +
                                          rea-agents - v1.6.0 + +
                                            +
                                            +
                                            Preparing search index...
                                            +
                                            +
                                            +
                                            + +

                                            Interface AstFingerprint

                                            +
                                            +

                                            Complete or prefix-only digest from a bounded AST traversal.

                                            +
                                            +
                                            interface AstFingerprint {
                                                sha256: string;
                                                truncated: boolean;
                                            }
                                            +
                                            +
                                            +
                                            +
                                            Index
                                            +
                                            +
                                            + +
                                            +
                                            + +
                                            +
                                            + +
                                            sha256: string
                                            +
                                            + +
                                            truncated: boolean
                                            +
                                            + +
                                            +
                                            diff --git a/docs/api/interfaces/domain_javascriptAstFingerprint.StaticExports.html b/docs/api/interfaces/domain_javascriptAstFingerprint.StaticExports.html new file mode 100644 index 000000000..31bbd93ff --- /dev/null +++ b/docs/api/interfaces/domain_javascriptAstFingerprint.StaticExports.html @@ -0,0 +1,64 @@ +StaticExports | rea-agents - v1.6.0
                                            +
                                            rea-agents - v1.6.0 + +
                                              +
                                              +
                                              Preparing search index...
                                              +
                                              +
                                              +
                                              + +

                                              Interface StaticExports

                                              +
                                              +

                                              Bounded static CommonJS export names.

                                              +
                                              +
                                              interface StaticExports {
                                                  truncated: boolean;
                                                  values: readonly string[];
                                              }
                                              +
                                              +
                                              +
                                              +
                                              Index
                                              +
                                              +
                                              + +
                                              +
                                              + +
                                              +
                                              + +
                                              truncated: boolean
                                              +
                                              + +
                                              values: readonly string[]
                                              +
                                              + +
                                              +
                                              diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptAnalysisAccumulator.html b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptAnalysisAccumulator.html new file mode 100644 index 000000000..6673d7be7 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptAnalysisAccumulator.html @@ -0,0 +1,136 @@ +JavaScriptAnalysisAccumulator | rea-agents - v1.6.0
                                              +
                                              rea-agents - v1.6.0 + +
                                                +
                                                +
                                                Preparing search index...
                                                +
                                                +
                                                +
                                                + +

                                                Interface JavaScriptAnalysisAccumulator

                                                +
                                                +

                                                Mutable bounded collections used during one inert AST traversal.

                                                +
                                                +
                                                interface JavaScriptAnalysisAccumulator {
                                                    droppedFindings: number;
                                                    endpoints: LocatedJavaScriptFinding<JavaScriptStaticEndpoint>[];
                                                    moduleCount: number;
                                                    modules: JavaScriptModuleRange[];
                                                    references: LocatedJavaScriptFinding<JavaScriptStaticReference>[];
                                                    registrations: JavaScriptBundlerRegistration[];
                                                    roles: LocatedJavaScriptFinding<JavaScriptRolePath>[];
                                                    seen: Set<string>;
                                                    sourceMaps: { declared_url: string; location: JavaScriptSourceRange }[];
                                                    storage: LocatedJavaScriptFinding<JavaScriptStaticStorage>[];
                                                    structuralTruncation: boolean;
                                                    truncated: boolean;
                                                    unknownFindings: number;
                                                    visitedNodes: number;
                                                }
                                                +
                                                +
                                                +
                                                +
                                                Index
                                                +
                                                +
                                                + +
                                                +
                                                + +
                                                droppedFindings: number
                                                +
                                                + +
                                                +
                                                + +
                                                moduleCount: number
                                                +
                                                + +
                                                +
                                                + +
                                                +
                                                + +
                                                +
                                                + +
                                                +
                                                + +
                                                seen: Set<string>
                                                +
                                                + +
                                                sourceMaps: { declared_url: string; location: JavaScriptSourceRange }[]
                                                +
                                                + +
                                                +
                                                + +
                                                structuralTruncation: boolean
                                                +
                                                + +
                                                truncated: boolean
                                                +
                                                + +
                                                unknownFindings: number
                                                +
                                                + +
                                                visitedNodes: number
                                                +
                                                + +
                                                +
                                                diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptEndpointInput.html b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptEndpointInput.html new file mode 100644 index 000000000..f6cdc5d97 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptEndpointInput.html @@ -0,0 +1,76 @@ +JavaScriptEndpointInput | rea-agents - v1.6.0
                                                +
                                                rea-agents - v1.6.0 + +
                                                  +
                                                  +
                                                  Preparing search index...
                                                  +
                                                  +
                                                  +
                                                  + +

                                                  Interface JavaScriptEndpointInput

                                                  +
                                                  +

                                                  Candidate route or network endpoint literal.

                                                  +
                                                  +
                                                  interface JavaScriptEndpointInput {
                                                      kind: "network" | "route";
                                                      mechanism: string;
                                                      node: Node;
                                                      value: string;
                                                  }
                                                  +
                                                  +
                                                  +
                                                  +
                                                  Index
                                                  +
                                                  +
                                                  + +
                                                  +
                                                  + +
                                                  +
                                                  + +
                                                  kind: "network" | "route"
                                                  +
                                                  + +
                                                  mechanism: string
                                                  +
                                                  + +
                                                  node: Node
                                                  +
                                                  + +
                                                  value: string
                                                  +
                                                  + +
                                                  +
                                                  diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptFindingContext.html b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptFindingContext.html new file mode 100644 index 000000000..a5f3cad86 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptFindingContext.html @@ -0,0 +1,70 @@ +JavaScriptFindingContext | rea-agents - v1.6.0
                                                  +
                                                  rea-agents - v1.6.0 + +
                                                    +
                                                    +
                                                    Preparing search index...
                                                    +
                                                    +
                                                    +
                                                    + +

                                                    Interface JavaScriptFindingContext

                                                    +
                                                    +

                                                    Shared source, accumulator, and finding bound for helper inspections.

                                                    +
                                                    +
                                                    interface JavaScriptFindingContext {
                                                        accumulator: JavaScriptAnalysisAccumulator;
                                                        maximum: number;
                                                        source: string;
                                                    }
                                                    +
                                                    +
                                                    +
                                                    +
                                                    Index
                                                    +
                                                    +
                                                    + +
                                                    +
                                                    + +
                                                    +
                                                    + +
                                                    +
                                                    + +
                                                    maximum: number
                                                    +
                                                    + +
                                                    source: string
                                                    +
                                                    + +
                                                    +
                                                    diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptModuleRange.html b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptModuleRange.html new file mode 100644 index 000000000..63336cf51 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptModuleRange.html @@ -0,0 +1,76 @@ +JavaScriptModuleRange | rea-agents - v1.6.0
                                                    +
                                                    rea-agents - v1.6.0 + +
                                                      +
                                                      +
                                                      Preparing search index...
                                                      +
                                                      +
                                                      +
                                                      + +

                                                      Interface JavaScriptModuleRange

                                                      +
                                                      +

                                                      Source offsets for one recovered bundle module factory.

                                                      +
                                                      +
                                                      interface JavaScriptModuleRange {
                                                          end: number;
                                                          key: string;
                                                          requireName: string | null;
                                                          start: number;
                                                      }
                                                      +
                                                      +
                                                      +
                                                      +
                                                      Index
                                                      +
                                                      +
                                                      + +
                                                      +
                                                      + +
                                                      +
                                                      + +
                                                      end: number
                                                      +
                                                      + +
                                                      key: string
                                                      +
                                                      + +
                                                      requireName: string | null
                                                      +
                                                      + +
                                                      start: number
                                                      +
                                                      + +
                                                      +
                                                      diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptReferenceInput.html b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptReferenceInput.html new file mode 100644 index 000000000..451cdfb6b --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisState.JavaScriptReferenceInput.html @@ -0,0 +1,70 @@ +JavaScriptReferenceInput | rea-agents - v1.6.0
                                                      +
                                                      rea-agents - v1.6.0 + +
                                                        +
                                                        +
                                                        Preparing search index...
                                                        +
                                                        +
                                                        +
                                                        + +

                                                        Interface JavaScriptReferenceInput

                                                        +
                                                        +

                                                        Candidate import, require, worker, or service-worker reference.

                                                        +
                                                        +
                                                        interface JavaScriptReferenceInput {
                                                            kind:
                                                                | "require"
                                                                | "worker"
                                                                | "static-import"
                                                                | "dynamic-import"
                                                                | "service-worker";
                                                            node: Node;
                                                            specifier: string
                                                            | undefined;
                                                        }
                                                        +
                                                        +
                                                        +
                                                        +
                                                        Index
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        kind:
                                                            | "require"
                                                            | "worker"
                                                            | "static-import"
                                                            | "dynamic-import"
                                                            | "service-worker"
                                                        +
                                                        + +
                                                        node: Node
                                                        +
                                                        + +
                                                        specifier: string | undefined
                                                        +
                                                        + +
                                                        +
                                                        diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisState.LocatedJavaScriptFinding.html b/docs/api/interfaces/domain_javascriptStaticAnalysisState.LocatedJavaScriptFinding.html new file mode 100644 index 000000000..c45b27a9c --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisState.LocatedJavaScriptFinding.html @@ -0,0 +1,68 @@ +LocatedJavaScriptFinding | rea-agents - v1.6.0
                                                        +
                                                        rea-agents - v1.6.0 + +
                                                          +
                                                          +
                                                          Preparing search index...
                                                          +
                                                          +
                                                          +
                                                          + +

                                                          Interface LocatedJavaScriptFinding<Value>

                                                          +
                                                          +

                                                          Static finding retained with its source offset until module attribution.

                                                          +
                                                          +
                                                          interface LocatedJavaScriptFinding<Value> {
                                                              offset: number;
                                                              value: Value;
                                                          }
                                                          +
                                                          +

                                                          Type Parameters

                                                          +
                                                            +
                                                          • Value
                                                          +
                                                          +
                                                          +
                                                          +
                                                          Index
                                                          +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          offset: number
                                                          +
                                                          + +
                                                          value: Value
                                                          +
                                                          + +
                                                          +
                                                          diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisState.LocatedJavaScriptFindingInput.html b/docs/api/interfaces/domain_javascriptStaticAnalysisState.LocatedJavaScriptFindingInput.html new file mode 100644 index 000000000..12260f0e2 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisState.LocatedJavaScriptFindingInput.html @@ -0,0 +1,80 @@ +LocatedJavaScriptFindingInput | rea-agents - v1.6.0
                                                          +
                                                          rea-agents - v1.6.0 + +
                                                            +
                                                            +
                                                            Preparing search index...
                                                            +
                                                            +
                                                            +
                                                            + +

                                                            Interface LocatedJavaScriptFindingInput<Value>

                                                            +
                                                            +

                                                            Values required to append one module-attributable static finding.

                                                            +
                                                            +
                                                            interface LocatedJavaScriptFindingInput<
                                                                Value extends { module_key: string
                                                                | null },
                                                            > {
                                                                collection: LocatedJavaScriptFinding<Value>[];
                                                                key: string;
                                                                node: Node;
                                                                value: Value;
                                                            }
                                                            +
                                                            +

                                                            Type Parameters

                                                            +
                                                              +
                                                            • Value extends { module_key: string | null }
                                                            +
                                                            +
                                                            +
                                                            +
                                                            Index
                                                            +
                                                            +
                                                            + +
                                                            +
                                                            + +
                                                            +
                                                            + +
                                                            +
                                                            + +
                                                            key: string
                                                            +
                                                            + +
                                                            node: Node
                                                            +
                                                            + +
                                                            value: Value
                                                            +
                                                            + +
                                                            +
                                                            diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptBundlerModule.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptBundlerModule.html new file mode 100644 index 000000000..3473914e3 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptBundlerModule.html @@ -0,0 +1,100 @@ +JavaScriptBundlerModule | rea-agents - v1.6.0
                                                            +
                                                            rea-agents - v1.6.0 + +
                                                              +
                                                              +
                                                              Preparing search index...
                                                              +
                                                              +
                                                              +
                                                              + +

                                                              Interface JavaScriptBundlerModule

                                                              +
                                                              +

                                                              One exact module factory recovered from a Webpack/Rspack registration.

                                                              +
                                                              +
                                                              interface JavaScriptBundlerModule {
                                                                  exports: readonly string[];
                                                                  exports_truncated: boolean;
                                                                  location: JavaScriptSourceRange;
                                                                  module_key: string;
                                                                  source_sha256: string;
                                                                  structural_fingerprint_algorithm: "babel-ast-v1" | null;
                                                                  structural_fingerprint_sha256: string | null;
                                                                  structural_fingerprint_status: "truncated" | "complete";
                                                              }
                                                              +
                                                              +
                                                              +
                                                              +
                                                              Index
                                                              +
                                                              +
                                                              + +
                                                              +
                                                              + +
                                                              exports: readonly string[]
                                                              +
                                                              + +
                                                              exports_truncated: boolean
                                                              +
                                                              + +
                                                              +
                                                              + +
                                                              module_key: string
                                                              +
                                                              + +
                                                              source_sha256: string
                                                              +
                                                              + +
                                                              structural_fingerprint_algorithm: "babel-ast-v1" | null
                                                              +
                                                              + +
                                                              structural_fingerprint_sha256: string | null
                                                              +
                                                              + +
                                                              structural_fingerprint_status: "truncated" | "complete"
                                                              +
                                                              + +
                                                              +
                                                              diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptBundlerRegistration.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptBundlerRegistration.html new file mode 100644 index 000000000..0bd314bc5 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptBundlerRegistration.html @@ -0,0 +1,94 @@ +JavaScriptBundlerRegistration | rea-agents - v1.6.0
                                                              +
                                                              rea-agents - v1.6.0 + +
                                                                +
                                                                +
                                                                Preparing search index...
                                                                +
                                                                +
                                                                +
                                                                + +

                                                                Interface JavaScriptBundlerRegistration

                                                                +
                                                                +

                                                                One statically recognized Webpack/Rspack chunk registration.

                                                                +
                                                                +
                                                                interface JavaScriptBundlerRegistration {
                                                                    bundler: "webpack" | "rspack";
                                                                    chunk_keys: readonly string[];
                                                                    location: JavaScriptSourceRange;
                                                                    modules: readonly JavaScriptBundlerModule[];
                                                                    omitted_chunk_keys: number;
                                                                    runtime: string;
                                                                    unknown_chunk_keys: number;
                                                                }
                                                                +
                                                                +
                                                                +
                                                                +
                                                                Index
                                                                +
                                                                +
                                                                + +
                                                                +
                                                                + +
                                                                bundler: "webpack" | "rspack"
                                                                +
                                                                + +
                                                                chunk_keys: readonly string[]
                                                                +
                                                                + +
                                                                +
                                                                + +
                                                                modules: readonly JavaScriptBundlerModule[]
                                                                +
                                                                + +
                                                                omitted_chunk_keys: number
                                                                +
                                                                + +
                                                                runtime: string
                                                                +
                                                                + +
                                                                unknown_chunk_keys: number
                                                                +
                                                                + +
                                                                +
                                                                diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptRolePath.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptRolePath.html new file mode 100644 index 000000000..47b788b7c --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptRolePath.html @@ -0,0 +1,82 @@ +JavaScriptRolePath | rea-agents - v1.6.0
                                                                +
                                                                rea-agents - v1.6.0 + +
                                                                  +
                                                                  +
                                                                  Preparing search index...
                                                                  +
                                                                  +
                                                                  +
                                                                  + +

                                                                  Interface JavaScriptRolePath

                                                                  +
                                                                  +

                                                                  Static Electron role paths discovered from package or JavaScript syntax.

                                                                  +
                                                                  +
                                                                  interface JavaScriptRolePath {
                                                                      location: JavaScriptSourceRange;
                                                                      mechanism: string;
                                                                      module_key: string | null;
                                                                      path: string;
                                                                      role: "renderer" | "preload";
                                                                  }
                                                                  +
                                                                  +
                                                                  +
                                                                  +
                                                                  Index
                                                                  +
                                                                  +
                                                                  + +
                                                                  +
                                                                  + +
                                                                  +
                                                                  + +
                                                                  +
                                                                  + +
                                                                  mechanism: string
                                                                  +
                                                                  + +
                                                                  module_key: string | null
                                                                  +
                                                                  + +
                                                                  path: string
                                                                  +
                                                                  + +
                                                                  role: "renderer" | "preload"
                                                                  +
                                                                  + +
                                                                  +
                                                                  diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptSourcePoint.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptSourcePoint.html new file mode 100644 index 000000000..ba88162eb --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptSourcePoint.html @@ -0,0 +1,64 @@ +JavaScriptSourcePoint | rea-agents - v1.6.0
                                                                  +
                                                                  rea-agents - v1.6.0 + +
                                                                    +
                                                                    +
                                                                    Preparing search index...
                                                                    +
                                                                    +
                                                                    +
                                                                    + +

                                                                    Interface JavaScriptSourcePoint

                                                                    +
                                                                    +

                                                                    One source coordinate produced by the JavaScript parser.

                                                                    +
                                                                    +
                                                                    interface JavaScriptSourcePoint {
                                                                        column: number;
                                                                        line: number;
                                                                    }
                                                                    +
                                                                    +
                                                                    +
                                                                    +
                                                                    Index
                                                                    +
                                                                    +
                                                                    + +
                                                                    +
                                                                    + +
                                                                    +
                                                                    + +
                                                                    column: number
                                                                    +
                                                                    + +
                                                                    line: number
                                                                    +
                                                                    + +
                                                                    +
                                                                    diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptSourceRange.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptSourceRange.html new file mode 100644 index 000000000..750eaeaf1 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptSourceRange.html @@ -0,0 +1,64 @@ +JavaScriptSourceRange | rea-agents - v1.6.0
                                                                    +
                                                                    rea-agents - v1.6.0 + +
                                                                      +
                                                                      +
                                                                      Preparing search index...
                                                                      +
                                                                      +
                                                                      +
                                                                      + +

                                                                      Interface JavaScriptSourceRange

                                                                      +
                                                                      +

                                                                      One exact source range within a bounded JavaScript artifact.

                                                                      +
                                                                      +
                                                                      interface JavaScriptSourceRange {
                                                                          end: JavaScriptSourcePoint;
                                                                          start: JavaScriptSourcePoint;
                                                                      }
                                                                      +
                                                                      +
                                                                      +
                                                                      +
                                                                      Index
                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticAnalysis.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticAnalysis.html new file mode 100644 index 000000000..f72795132 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticAnalysis.html @@ -0,0 +1,124 @@ +JavaScriptStaticAnalysis | rea-agents - v1.6.0
                                                                      +
                                                                      rea-agents - v1.6.0 + +
                                                                        +
                                                                        +
                                                                        Preparing search index...
                                                                        +
                                                                        +
                                                                        +
                                                                        + +

                                                                        Interface JavaScriptStaticAnalysis

                                                                        +
                                                                        +

                                                                        Bounded, deterministic AST-only analysis of one JavaScript source file.

                                                                        +
                                                                        +
                                                                        interface JavaScriptStaticAnalysis {
                                                                            bundler_registrations: readonly JavaScriptBundlerRegistration[];
                                                                            dropped_findings: number;
                                                                            endpoints: readonly JavaScriptStaticEndpoint[];
                                                                            limitations: readonly string[];
                                                                            parse_error_count: number;
                                                                            parse_status: "truncated" | "failed" | "complete" | "partial";
                                                                            references: readonly JavaScriptStaticReference[];
                                                                            role_paths: readonly JavaScriptRolePath[];
                                                                            source_map_urls: readonly {
                                                                                declared_url: string;
                                                                                location: JavaScriptSourceRange;
                                                                            }[];
                                                                            storage: readonly JavaScriptStaticStorage[];
                                                                            vendors: readonly string[];
                                                                            visited_ast_nodes: number;
                                                                        }
                                                                        +
                                                                        +
                                                                        +
                                                                        +
                                                                        Index
                                                                        +
                                                                        +
                                                                        + +
                                                                        +
                                                                        + +
                                                                        bundler_registrations: readonly JavaScriptBundlerRegistration[]
                                                                        +
                                                                        + +
                                                                        dropped_findings: number
                                                                        +
                                                                        + +
                                                                        endpoints: readonly JavaScriptStaticEndpoint[]
                                                                        +
                                                                        + +
                                                                        limitations: readonly string[]
                                                                        +
                                                                        + +
                                                                        parse_error_count: number
                                                                        +
                                                                        + +
                                                                        parse_status: "truncated" | "failed" | "complete" | "partial"
                                                                        +
                                                                        + +
                                                                        references: readonly JavaScriptStaticReference[]
                                                                        +
                                                                        + +
                                                                        role_paths: readonly JavaScriptRolePath[]
                                                                        +
                                                                        + +
                                                                        source_map_urls: readonly {
                                                                            declared_url: string;
                                                                            location: JavaScriptSourceRange;
                                                                        }[]
                                                                        +
                                                                        + +
                                                                        storage: readonly JavaScriptStaticStorage[]
                                                                        +
                                                                        + +
                                                                        vendors: readonly string[]
                                                                        +
                                                                        + +
                                                                        visited_ast_nodes: number
                                                                        +
                                                                        + +
                                                                        +
                                                                        diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticAnalysisLimits.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticAnalysisLimits.html new file mode 100644 index 000000000..40b4cee9b --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticAnalysisLimits.html @@ -0,0 +1,82 @@ +JavaScriptStaticAnalysisLimits | rea-agents - v1.6.0
                                                                        +
                                                                        rea-agents - v1.6.0 + +
                                                                          +
                                                                          +
                                                                          Preparing search index...
                                                                          +
                                                                          +
                                                                          +
                                                                          + +

                                                                          Interface JavaScriptStaticAnalysisLimits

                                                                          +
                                                                          +

                                                                          Hard bounds applied to one AST-only JavaScript analysis.

                                                                          +
                                                                          +
                                                                          interface JavaScriptStaticAnalysisLimits {
                                                                              deadline: number;
                                                                              maxAstNodes: number;
                                                                              maxFindings: number;
                                                                              maxModules: number;
                                                                              now: () => number;
                                                                          }
                                                                          +
                                                                          +
                                                                          +
                                                                          +
                                                                          Index
                                                                          +
                                                                          +
                                                                          + +
                                                                          +
                                                                          + +
                                                                          deadline: number
                                                                          +
                                                                          + +
                                                                          maxAstNodes: number
                                                                          +
                                                                          + +
                                                                          maxFindings: number
                                                                          +
                                                                          + +
                                                                          maxModules: number
                                                                          +
                                                                          + +
                                                                          now: () => number
                                                                          +
                                                                          + +
                                                                          +
                                                                          diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticEndpoint.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticEndpoint.html new file mode 100644 index 000000000..8c979486a --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticEndpoint.html @@ -0,0 +1,82 @@ +JavaScriptStaticEndpoint | rea-agents - v1.6.0
                                                                          +
                                                                          rea-agents - v1.6.0 + +
                                                                            +
                                                                            +
                                                                            Preparing search index...
                                                                            +
                                                                            +
                                                                            +
                                                                            + +

                                                                            Interface JavaScriptStaticEndpoint

                                                                            +
                                                                            +

                                                                            A route or network endpoint literal observed in syntax.

                                                                            +
                                                                            +
                                                                            interface JavaScriptStaticEndpoint {
                                                                                kind: "network" | "route";
                                                                                location: JavaScriptSourceRange;
                                                                                mechanism: string;
                                                                                module_key: string | null;
                                                                                value: string;
                                                                            }
                                                                            +
                                                                            +
                                                                            +
                                                                            +
                                                                            Index
                                                                            +
                                                                            +
                                                                            + +
                                                                            +
                                                                            + +
                                                                            +
                                                                            + +
                                                                            kind: "network" | "route"
                                                                            +
                                                                            + +
                                                                            +
                                                                            + +
                                                                            mechanism: string
                                                                            +
                                                                            + +
                                                                            module_key: string | null
                                                                            +
                                                                            + +
                                                                            value: string
                                                                            +
                                                                            + +
                                                                            +
                                                                            diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticReference.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticReference.html new file mode 100644 index 000000000..3f48c9d13 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticReference.html @@ -0,0 +1,82 @@ +JavaScriptStaticReference | rea-agents - v1.6.0
                                                                            +
                                                                            rea-agents - v1.6.0 + +
                                                                              +
                                                                              +
                                                                              Preparing search index...
                                                                              +
                                                                              +
                                                                              +
                                                                              + +

                                                                              Interface JavaScriptStaticReference

                                                                              +
                                                                              +

                                                                              A statically visible module, worker, or service-worker reference.

                                                                              +
                                                                              +
                                                                              interface JavaScriptStaticReference {
                                                                                  expression: string | null;
                                                                                  kind:
                                                                                      | "require"
                                                                                      | "worker"
                                                                                      | "static-import"
                                                                                      | "dynamic-import"
                                                                                      | "service-worker";
                                                                                  location: JavaScriptSourceRange;
                                                                                  module_key: string
                                                                                  | null;
                                                                                  specifier: string | null;
                                                                              }
                                                                              +
                                                                              +
                                                                              +
                                                                              +
                                                                              Index
                                                                              +
                                                                              +
                                                                              + +
                                                                              +
                                                                              + +
                                                                              expression: string | null
                                                                              +
                                                                              + +
                                                                              kind:
                                                                                  | "require"
                                                                                  | "worker"
                                                                                  | "static-import"
                                                                                  | "dynamic-import"
                                                                                  | "service-worker"
                                                                              +
                                                                              + +
                                                                              +
                                                                              + +
                                                                              module_key: string | null
                                                                              +
                                                                              + +
                                                                              specifier: string | null
                                                                              +
                                                                              + +
                                                                              +
                                                                              diff --git a/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticStorage.html b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticStorage.html new file mode 100644 index 000000000..4c68391a9 --- /dev/null +++ b/docs/api/interfaces/domain_javascriptStaticAnalysisTypes.JavaScriptStaticStorage.html @@ -0,0 +1,82 @@ +JavaScriptStaticStorage | rea-agents - v1.6.0
                                                                              +
                                                                              rea-agents - v1.6.0 + +
                                                                                +
                                                                                +
                                                                                Preparing search index...
                                                                                +
                                                                                +
                                                                                +
                                                                                + +

                                                                                Interface JavaScriptStaticStorage

                                                                                +
                                                                                +

                                                                                A storage surface observed without executing application code.

                                                                                +
                                                                                +
                                                                                interface JavaScriptStaticStorage {
                                                                                    kind:
                                                                                        | "local-storage"
                                                                                        | "session-storage"
                                                                                        | "indexed-db"
                                                                                        | "cache-storage"
                                                                                        | "sqlite";
                                                                                    location: JavaScriptSourceRange;
                                                                                    mechanism: string;
                                                                                    module_key: string
                                                                                    | null;
                                                                                    name: string | null;
                                                                                }
                                                                                +
                                                                                +
                                                                                +
                                                                                +
                                                                                Index
                                                                                +
                                                                                +
                                                                                + +
                                                                                +
                                                                                + +
                                                                                +
                                                                                + +
                                                                                kind:
                                                                                    | "local-storage"
                                                                                    | "session-storage"
                                                                                    | "indexed-db"
                                                                                    | "cache-storage"
                                                                                    | "sqlite"
                                                                                +
                                                                                + +
                                                                                +
                                                                                + +
                                                                                mechanism: string
                                                                                +
                                                                                + +
                                                                                module_key: string | null
                                                                                +
                                                                                + +
                                                                                name: string | null
                                                                                +
                                                                                + +
                                                                                +
                                                                                diff --git a/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html b/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html index d57d83229..9a2fb24a0 100644 --- a/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html +++ b/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html @@ -15,7 +15,7 @@

                                                                                Authority issued beneath the administrator ceiling.

                                                                              interface PermissionGrant {
                                                                                  capability: PermissionCapability;
                                                                                  environment_names: readonly string[];
                                                                                  executables: readonly string[];
                                                                                  expires_at: string | null;
                                                                                  grant_id: string;
                                                                                  lifetime: "once" | "session" | "project" | "administrator";
                                                                                  mount: boolean;
                                                                                  network: PermissionNetwork;
                                                                                  operation_identity: string | null;
                                                                                  origins?: readonly string[];
                                                                                  roots: readonly string[];
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • PermissionScope diff --git a/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html b/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html index ae9e851e5..e5e13fd26 100644 --- a/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html +++ b/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html @@ -15,7 +15,7 @@

                                                                                A request identity associates one-shot grants with exactly one operation.

                                                                              interface PermissionRequest {
                                                                                  capability: PermissionCapability;
                                                                                  environment_names: readonly string[];
                                                                                  executables: readonly string[];
                                                                                  mount: boolean;
                                                                                  network: PermissionNetwork;
                                                                                  operation_identity: string;
                                                                                  origins?: readonly string[];
                                                                                  roots: readonly string[];
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • PermissionScope diff --git a/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html b/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html index f83e671f2..6da0c44ed 100644 --- a/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html +++ b/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html @@ -15,7 +15,7 @@

                                                                                Exact normalized scope requested by one local operation.

                                                                              interface PermissionScope {
                                                                                  capability: PermissionCapability;
                                                                                  environment_names: readonly string[];
                                                                                  executables: readonly string[];
                                                                                  mount: boolean;
                                                                                  network: PermissionNetwork;
                                                                                  origins?: readonly string[];
                                                                                  roots: readonly string[];
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • PermissionScope diff --git a/docs/api/interfaces/domain_webInventory.StableWebResource.html b/docs/api/interfaces/domain_webInventory.StableWebResource.html index 60b4ea6b6..299bc3804 100644 --- a/docs/api/interfaces/domain_webInventory.StableWebResource.html +++ b/docs/api/interfaces/domain_webInventory.StableWebResource.html @@ -12,7 +12,7 @@
                                                                              • StableWebResource

                                                                              Interface StableWebResource

                                                                              interface StableWebResource {
                                                                                  content_size: number | null;
                                                                                  mime_type: string;
                                                                                  origin: string | null;
                                                                                  resource_key: string;
                                                                                  type: string;
                                                                                  url: string;
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • WebInventoryResourceInput diff --git a/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html b/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html index 3de2211e4..566720806 100644 --- a/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html +++ b/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html @@ -12,7 +12,7 @@
                                                                              • WebInventoryResourceInput

                                                                              Interface WebInventoryResourceInput

                                                                              interface WebInventoryResourceInput {
                                                                                  content_size: number | null;
                                                                                  mime_type: string;
                                                                                  origin: string | null;
                                                                                  type: string;
                                                                                  url: string;
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • WebInventoryResourceInput diff --git a/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html b/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html index 89f8ac60a..4e89cceab 100644 --- a/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html +++ b/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html @@ -15,7 +15,7 @@

                                                                                Process plus private log coordinates returned by a Ghidra launcher.

                                                                              interface GhidraLaunch {
                                                                                  cleanup?: () => Promise<ProcessCleanupResult>;
                                                                                  ghidraLogPath: string;
                                                                                  ownsProcessLifetime: boolean;
                                                                                  process: ChildProcess;
                                                                                  projectRoot: string;
                                                                                  scriptLogPath: string;
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • ProviderProcessLaunch diff --git a/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html b/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html index f696b06b4..689ef1919 100644 --- a/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html +++ b/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html @@ -15,7 +15,7 @@

                                                                                Additional structured context for a Ghidra session failure.

                                                                              interface GhidraSessionErrorOptions {
                                                                                  remoteCode?: string;
                                                                                  timeoutMs?: number;
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy

                                                                              • ErrorOptions diff --git a/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html b/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html index e89063308..df7376242 100644 --- a/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html +++ b/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html @@ -15,7 +15,7 @@

                                                                                Process handle returned by a bridge launcher.

                                                                              interface BridgeLaunch {
                                                                                  cleanup?: () => Promise<ProcessCleanupResult>;
                                                                                  ownsProcessLifetime: boolean;
                                                                                  process: ChildProcess;
                                                                                  shutdownByCleanup?: boolean;
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • ProviderProcessLaunch diff --git a/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html b/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html index c1ff48aa7..f48d3c36f 100644 --- a/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html +++ b/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html @@ -15,7 +15,7 @@

                                                                                Process handle returned by a provider-specific launcher.

                                                                              interface ProviderProcessLaunch {
                                                                                  cleanup?: () => Promise<ProcessCleanupResult>;
                                                                                  ownsProcessLifetime: boolean;
                                                                                  process: ChildProcess;
                                                                              }
                                                                              -
                                                                              +

                                                                              Hierarchy (View Summary)

                                                                              • ProviderProcessLaunch diff --git a/docs/api/modules/application_JavaScriptArtifactAnalysis.html b/docs/api/modules/application_JavaScriptArtifactAnalysis.html new file mode 100644 index 000000000..bd4ad62d0 --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactAnalysis.html @@ -0,0 +1,36 @@ +application/JavaScriptArtifactAnalysis | rea-agents - v1.6.0
                                                                                +
                                                                                rea-agents - v1.6.0 + +
                                                                                  +
                                                                                  +
                                                                                  Preparing search index...
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + +

                                                                                  Module application/JavaScriptArtifactAnalysis

                                                                                  +
                                                                                  +
                                                                                  analyzeJavaScriptArtifactFiles
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  diff --git a/docs/api/modules/application_JavaScriptArtifactAnalysisTypes.html b/docs/api/modules/application_JavaScriptArtifactAnalysisTypes.html new file mode 100644 index 000000000..d178b1da8 --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactAnalysisTypes.html @@ -0,0 +1,36 @@ +application/JavaScriptArtifactAnalysisTypes | rea-agents - v1.6.0
                                                                                  +
                                                                                  rea-agents - v1.6.0 + +
                                                                                    +
                                                                                    +
                                                                                    Preparing search index...
                                                                                    + +
                                                                                    diff --git a/docs/api/modules/application_JavaScriptArtifactFiles.html b/docs/api/modules/application_JavaScriptArtifactFiles.html new file mode 100644 index 000000000..3f9b931e0 --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactFiles.html @@ -0,0 +1,44 @@ +application/JavaScriptArtifactFiles | rea-agents - v1.6.0
                                                                                    +
                                                                                    rea-agents - v1.6.0 + +
                                                                                      +
                                                                                      +
                                                                                      Preparing search index...
                                                                                      +
                                                                                      + +
                                                                                      + +
                                                                                      +
                                                                                      diff --git a/docs/api/modules/application_JavaScriptArtifactGraphAccumulator.html b/docs/api/modules/application_JavaScriptArtifactGraphAccumulator.html new file mode 100644 index 000000000..960e38efa --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactGraphAccumulator.html @@ -0,0 +1,36 @@ +application/JavaScriptArtifactGraphAccumulator | rea-agents - v1.6.0
                                                                                      +
                                                                                      rea-agents - v1.6.0 + +
                                                                                        +
                                                                                        +
                                                                                        Preparing search index...
                                                                                        +
                                                                                        +
                                                                                        +
                                                                                        + +

                                                                                        Module application/JavaScriptArtifactGraphAccumulator

                                                                                        +
                                                                                        +
                                                                                        JavaScriptArtifactGraphAccumulator
                                                                                        +
                                                                                        + +
                                                                                        +
                                                                                        diff --git a/docs/api/modules/application_JavaScriptArtifactGraphBuilder.html b/docs/api/modules/application_JavaScriptArtifactGraphBuilder.html new file mode 100644 index 000000000..7f9b459e9 --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactGraphBuilder.html @@ -0,0 +1,36 @@ +application/JavaScriptArtifactGraphBuilder | rea-agents - v1.6.0
                                                                                        +
                                                                                        rea-agents - v1.6.0 + +
                                                                                          +
                                                                                          +
                                                                                          Preparing search index...
                                                                                          +
                                                                                          +
                                                                                          +
                                                                                          + +

                                                                                          Module application/JavaScriptArtifactGraphBuilder

                                                                                          +
                                                                                          +
                                                                                          buildJavaScriptArtifactGraph
                                                                                          +
                                                                                          + +
                                                                                          +
                                                                                          diff --git a/docs/api/modules/application_JavaScriptArtifactGraphContext.html b/docs/api/modules/application_JavaScriptArtifactGraphContext.html new file mode 100644 index 000000000..639b96f3c --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactGraphContext.html @@ -0,0 +1,44 @@ +application/JavaScriptArtifactGraphContext | rea-agents - v1.6.0
                                                                                          +
                                                                                          rea-agents - v1.6.0 + +
                                                                                            +
                                                                                            +
                                                                                            Preparing search index...
                                                                                            + +
                                                                                            diff --git a/docs/api/modules/application_JavaScriptArtifactGraphDocuments.html b/docs/api/modules/application_JavaScriptArtifactGraphDocuments.html new file mode 100644 index 000000000..e28af363c --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactGraphDocuments.html @@ -0,0 +1,36 @@ +application/JavaScriptArtifactGraphDocuments | rea-agents - v1.6.0
                                                                                            +
                                                                                            rea-agents - v1.6.0 + +
                                                                                              +
                                                                                              +
                                                                                              Preparing search index...
                                                                                              +
                                                                                              +
                                                                                              +
                                                                                              + +

                                                                                              Module application/JavaScriptArtifactGraphDocuments

                                                                                              +
                                                                                              +
                                                                                              addJavaScriptHtmlRoles
                                                                                              addJavaScriptSourceMapOriginals
                                                                                              +
                                                                                              + +
                                                                                              +
                                                                                              diff --git a/docs/api/modules/application_JavaScriptArtifactGraphEvidence.html b/docs/api/modules/application_JavaScriptArtifactGraphEvidence.html new file mode 100644 index 000000000..35a76215d --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactGraphEvidence.html @@ -0,0 +1,44 @@ +application/JavaScriptArtifactGraphEvidence | rea-agents - v1.6.0
                                                                                              +
                                                                                              rea-agents - v1.6.0 + +
                                                                                                +
                                                                                                +
                                                                                                Preparing search index...
                                                                                                + +
                                                                                                diff --git a/docs/api/modules/application_JavaScriptArtifactGraphFindings.html b/docs/api/modules/application_JavaScriptArtifactGraphFindings.html new file mode 100644 index 000000000..463edd078 --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactGraphFindings.html @@ -0,0 +1,36 @@ +application/JavaScriptArtifactGraphFindings | rea-agents - v1.6.0
                                                                                                +
                                                                                                rea-agents - v1.6.0 + +
                                                                                                  +
                                                                                                  +
                                                                                                  Preparing search index...
                                                                                                  +
                                                                                                  +
                                                                                                  +
                                                                                                  + +

                                                                                                  Module application/JavaScriptArtifactGraphFindings

                                                                                                  +
                                                                                                  +
                                                                                                  addJavaScriptStaticFindings
                                                                                                  +
                                                                                                  + +
                                                                                                  +
                                                                                                  diff --git a/docs/api/modules/application_JavaScriptArtifactGraphStructure.html b/docs/api/modules/application_JavaScriptArtifactGraphStructure.html new file mode 100644 index 000000000..545bfcf32 --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactGraphStructure.html @@ -0,0 +1,36 @@ +application/JavaScriptArtifactGraphStructure | rea-agents - v1.6.0
                                                                                                  +
                                                                                                  rea-agents - v1.6.0 + +
                                                                                                    +
                                                                                                    +
                                                                                                    Preparing search index...
                                                                                                    + +
                                                                                                    diff --git a/docs/api/modules/application_JavaScriptArtifactReconstruction.html b/docs/api/modules/application_JavaScriptArtifactReconstruction.html new file mode 100644 index 000000000..70d32f695 --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactReconstruction.html @@ -0,0 +1,40 @@ +application/JavaScriptArtifactReconstruction | rea-agents - v1.6.0
                                                                                                    +
                                                                                                    rea-agents - v1.6.0 + +
                                                                                                      +
                                                                                                      +
                                                                                                      Preparing search index...
                                                                                                      +
                                                                                                      +
                                                                                                      +
                                                                                                      + +

                                                                                                      Module application/JavaScriptArtifactReconstruction

                                                                                                      +
                                                                                                      +
                                                                                                      JavaScriptArtifactReconstructionResult
                                                                                                      +
                                                                                                      +
                                                                                                      reconstructJavaScriptArtifact
                                                                                                      +
                                                                                                      + +
                                                                                                      +
                                                                                                      diff --git a/docs/api/modules/application_JavaScriptArtifactReconstructionInput.html b/docs/api/modules/application_JavaScriptArtifactReconstructionInput.html new file mode 100644 index 000000000..6ecffd31c --- /dev/null +++ b/docs/api/modules/application_JavaScriptArtifactReconstructionInput.html @@ -0,0 +1,44 @@ +application/JavaScriptArtifactReconstructionInput | rea-agents - v1.6.0
                                                                                                      +
                                                                                                      rea-agents - v1.6.0 + +
                                                                                                        +
                                                                                                        +
                                                                                                        Preparing search index...
                                                                                                        +
                                                                                                        + +
                                                                                                        + +
                                                                                                        +
                                                                                                        diff --git a/docs/api/modules/domain_javascriptAstFingerprint.html b/docs/api/modules/domain_javascriptAstFingerprint.html new file mode 100644 index 000000000..528ba729f --- /dev/null +++ b/docs/api/modules/domain_javascriptAstFingerprint.html @@ -0,0 +1,40 @@ +domain/javascriptAstFingerprint | rea-agents - v1.6.0
                                                                                                        +
                                                                                                        rea-agents - v1.6.0 + +
                                                                                                          +
                                                                                                          +
                                                                                                          Preparing search index...
                                                                                                          +
                                                                                                          +
                                                                                                          +
                                                                                                          + +

                                                                                                          Module domain/javascriptAstFingerprint

                                                                                                          +
                                                                                                          +
                                                                                                          AstFingerprint
                                                                                                          StaticExports
                                                                                                          +
                                                                                                          +
                                                                                                          collectJavaScriptExports
                                                                                                          fingerprintJavaScriptAst
                                                                                                          +
                                                                                                          + +
                                                                                                          +
                                                                                                          diff --git a/docs/api/modules/domain_javascriptStaticAnalysis.html b/docs/api/modules/domain_javascriptStaticAnalysis.html new file mode 100644 index 000000000..35f584c74 --- /dev/null +++ b/docs/api/modules/domain_javascriptStaticAnalysis.html @@ -0,0 +1,36 @@ +domain/javascriptStaticAnalysis | rea-agents - v1.6.0
                                                                                                          +
                                                                                                          rea-agents - v1.6.0 + +
                                                                                                            +
                                                                                                            +
                                                                                                            Preparing search index...
                                                                                                            +
                                                                                                            +
                                                                                                            +
                                                                                                            + +

                                                                                                            Module domain/javascriptStaticAnalysis

                                                                                                            +
                                                                                                            +
                                                                                                            analyzeJavaScriptStaticSource
                                                                                                            +
                                                                                                            + +
                                                                                                            +
                                                                                                            diff --git a/docs/api/modules/domain_javascriptStaticAnalysisHelpers.html b/docs/api/modules/domain_javascriptStaticAnalysisHelpers.html new file mode 100644 index 000000000..01b6303f2 --- /dev/null +++ b/docs/api/modules/domain_javascriptStaticAnalysisHelpers.html @@ -0,0 +1,40 @@ +domain/javascriptStaticAnalysisHelpers | rea-agents - v1.6.0
                                                                                                            +
                                                                                                            rea-agents - v1.6.0 + +
                                                                                                              +
                                                                                                              +
                                                                                                              Preparing search index...
                                                                                                              + +
                                                                                                              diff --git a/docs/api/modules/domain_javascriptStaticAnalysisState.html b/docs/api/modules/domain_javascriptStaticAnalysisState.html new file mode 100644 index 000000000..17a08c3bf --- /dev/null +++ b/docs/api/modules/domain_javascriptStaticAnalysisState.html @@ -0,0 +1,40 @@ +domain/javascriptStaticAnalysisState | rea-agents - v1.6.0
                                                                                                              +
                                                                                                              rea-agents - v1.6.0 + +
                                                                                                                +
                                                                                                                +
                                                                                                                Preparing search index...
                                                                                                                + +
                                                                                                                diff --git a/docs/api/modules/domain_javascriptStaticAnalysisTypes.html b/docs/api/modules/domain_javascriptStaticAnalysisTypes.html new file mode 100644 index 000000000..050935da3 --- /dev/null +++ b/docs/api/modules/domain_javascriptStaticAnalysisTypes.html @@ -0,0 +1,36 @@ +domain/javascriptStaticAnalysisTypes | rea-agents - v1.6.0
                                                                                                                +
                                                                                                                rea-agents - v1.6.0 + +
                                                                                                                  +
                                                                                                                  +
                                                                                                                  Preparing search index...
                                                                                                                  + +
                                                                                                                  diff --git a/docs/api/types/application_JavaScriptArtifactFiles.JavaScriptArtifactFileKind.html b/docs/api/types/application_JavaScriptArtifactFiles.JavaScriptArtifactFileKind.html new file mode 100644 index 000000000..b2448b3dc --- /dev/null +++ b/docs/api/types/application_JavaScriptArtifactFiles.JavaScriptArtifactFileKind.html @@ -0,0 +1,35 @@ +JavaScriptArtifactFileKind | rea-agents - v1.6.0
                                                                                                                  +
                                                                                                                  rea-agents - v1.6.0 + +
                                                                                                                    +
                                                                                                                    +
                                                                                                                    Preparing search index...
                                                                                                                    +
                                                                                                                    +
                                                                                                                    +
                                                                                                                    + +

                                                                                                                    Type Alias JavaScriptArtifactFileKind

                                                                                                                    +
                                                                                                                    JavaScriptArtifactFileKind:
                                                                                                                        | "package-json"
                                                                                                                        | "javascript"
                                                                                                                        | "html"
                                                                                                                        | "source-map"
                                                                                                                        | "native-addon"
                                                                                                                    +

                                                                                                                    Relevant file categories projected from the complete artifact inventory.

                                                                                                                    +
                                                                                                                    +
                                                                                                                    + +
                                                                                                                    +
                                                                                                                    diff --git a/docs/api/types/application_JavaScriptArtifactGraphContext.JavaScriptArtifactGraphCoverage.html b/docs/api/types/application_JavaScriptArtifactGraphContext.JavaScriptArtifactGraphCoverage.html new file mode 100644 index 000000000..fc981b15a --- /dev/null +++ b/docs/api/types/application_JavaScriptArtifactGraphContext.JavaScriptArtifactGraphCoverage.html @@ -0,0 +1,35 @@ +JavaScriptArtifactGraphCoverage | rea-agents - v1.6.0
                                                                                                                    +
                                                                                                                    rea-agents - v1.6.0 + +
                                                                                                                      +
                                                                                                                      +
                                                                                                                      Preparing search index...
                                                                                                                      +
                                                                                                                      +
                                                                                                                      +
                                                                                                                      + +

                                                                                                                      Type Alias JavaScriptArtifactGraphCoverage

                                                                                                                      +
                                                                                                                      JavaScriptArtifactGraphCoverage: ApplicationGraphEvidence["coverage"]
                                                                                                                      +

                                                                                                                      Evidence coverage shape shared by reconstruction graph helpers.

                                                                                                                      +
                                                                                                                      +
                                                                                                                      + +
                                                                                                                      +
                                                                                                                      diff --git a/docs/api/types/application_JavaScriptArtifactGraphEvidence.ReconstructionEvidenceCoverage.html b/docs/api/types/application_JavaScriptArtifactGraphEvidence.ReconstructionEvidenceCoverage.html new file mode 100644 index 000000000..6568fb0a6 --- /dev/null +++ b/docs/api/types/application_JavaScriptArtifactGraphEvidence.ReconstructionEvidenceCoverage.html @@ -0,0 +1,35 @@ +ReconstructionEvidenceCoverage | rea-agents - v1.6.0
                                                                                                                      +
                                                                                                                      rea-agents - v1.6.0 + +
                                                                                                                        +
                                                                                                                        +
                                                                                                                        Preparing search index...
                                                                                                                        +
                                                                                                                        +
                                                                                                                        +
                                                                                                                        + +

                                                                                                                        Type Alias ReconstructionEvidenceCoverage

                                                                                                                        +
                                                                                                                        ReconstructionEvidenceCoverage: ApplicationGraphEvidence["coverage"]
                                                                                                                        +

                                                                                                                        Coverage shape accepted by reconstruction evidence helpers.

                                                                                                                        +
                                                                                                                        +
                                                                                                                        + +
                                                                                                                        +
                                                                                                                        diff --git a/docs/api/types/application_JavaScriptArtifactReconstructionInput.JavaScriptArtifactReconstructionInput.html b/docs/api/types/application_JavaScriptArtifactReconstructionInput.JavaScriptArtifactReconstructionInput.html new file mode 100644 index 000000000..d1827268d --- /dev/null +++ b/docs/api/types/application_JavaScriptArtifactReconstructionInput.JavaScriptArtifactReconstructionInput.html @@ -0,0 +1,35 @@ +JavaScriptArtifactReconstructionInput | rea-agents - v1.6.0
                                                                                                                        +
                                                                                                                        rea-agents - v1.6.0 + +
                                                                                                                          +
                                                                                                                          +
                                                                                                                          Preparing search index...
                                                                                                                          +
                                                                                                                          +
                                                                                                                          + +
                                                                                                                          JavaScriptArtifactReconstructionInput: z.infer<
                                                                                                                              typeof javascriptArtifactReconstructionInputSchema,
                                                                                                                          >
                                                                                                                          +

                                                                                                                          Parsed bounded reconstruction request.

                                                                                                                          +
                                                                                                                          +
                                                                                                                          + +
                                                                                                                          +
                                                                                                                          diff --git a/docs/api/variables/application_JavaScriptArtifactReconstructionInput.javascriptArtifactReconstructionInputSchema.html b/docs/api/variables/application_JavaScriptArtifactReconstructionInput.javascriptArtifactReconstructionInputSchema.html new file mode 100644 index 000000000..1ee196ca3 --- /dev/null +++ b/docs/api/variables/application_JavaScriptArtifactReconstructionInput.javascriptArtifactReconstructionInputSchema.html @@ -0,0 +1,35 @@ +javascriptArtifactReconstructionInputSchema | rea-agents - v1.6.0
                                                                                                                          +
                                                                                                                          rea-agents - v1.6.0 + +
                                                                                                                            +
                                                                                                                            +
                                                                                                                            Preparing search index...
                                                                                                                            +
                                                                                                                            +
                                                                                                                            +
                                                                                                                            + +

                                                                                                                            Variable javascriptArtifactReconstructionInputSchemaConst

                                                                                                                            +
                                                                                                                            javascriptArtifactReconstructionInputSchema: ZodObject<
                                                                                                                                {
                                                                                                                                    format: ZodDefault<
                                                                                                                                        ZodEnum<{ asar: "asar"; auto: "auto"; directory: "directory" }>,
                                                                                                                                    >;
                                                                                                                                    input_path: ZodString;
                                                                                                                                    limits: ZodDefault<
                                                                                                                                        ZodObject<
                                                                                                                                            {
                                                                                                                                                max_artifact_entry_bytes: ZodDefault<ZodNumber>;
                                                                                                                                                max_ast_nodes: ZodDefault<ZodNumber>;
                                                                                                                                                max_compression_ratio: ZodDefault<ZodNumber>;
                                                                                                                                                max_depth: ZodDefault<ZodNumber>;
                                                                                                                                                max_entries: ZodDefault<ZodNumber>;
                                                                                                                                                max_findings: ZodDefault<ZodNumber>;
                                                                                                                                                max_modules: ZodDefault<ZodNumber>;
                                                                                                                                                max_parse_milliseconds: ZodDefault<ZodNumber>;
                                                                                                                                                max_path_bytes: ZodDefault<ZodNumber>;
                                                                                                                                                max_source_map_sources: ZodDefault<ZodNumber>;
                                                                                                                                                max_text_file_bytes: ZodDefault<ZodNumber>;
                                                                                                                                                max_text_files: ZodDefault<ZodNumber>;
                                                                                                                                                max_total_artifact_bytes: ZodDefault<ZodNumber>;
                                                                                                                                                max_total_text_bytes: ZodDefault<ZodNumber>;
                                                                                                                                            },
                                                                                                                                            $strict,
                                                                                                                                        >,
                                                                                                                                    >;
                                                                                                                                    source_map_read_approved: ZodDefault<ZodBoolean>;
                                                                                                                                },
                                                                                                                                $strict,
                                                                                                                            > = ...
                                                                                                                            +

                                                                                                                            Local ASAR/directory reconstruction request with explicit source-map authority.

                                                                                                                            +
                                                                                                                            +
                                                                                                                            + +
                                                                                                                            +
                                                                                                                            diff --git a/docs/api/variables/domain_javascriptStaticAnalysisHelpers.STATIC_ROUTE_CALL_NAMES.html b/docs/api/variables/domain_javascriptStaticAnalysisHelpers.STATIC_ROUTE_CALL_NAMES.html new file mode 100644 index 000000000..7d25c8395 --- /dev/null +++ b/docs/api/variables/domain_javascriptStaticAnalysisHelpers.STATIC_ROUTE_CALL_NAMES.html @@ -0,0 +1,35 @@ +STATIC_ROUTE_CALL_NAMES | rea-agents - v1.6.0
                                                                                                                            +
                                                                                                                            rea-agents - v1.6.0 + +
                                                                                                                              +
                                                                                                                              +
                                                                                                                              Preparing search index...
                                                                                                                              +
                                                                                                                              +
                                                                                                                              +
                                                                                                                              + +

                                                                                                                              Variable STATIC_ROUTE_CALL_NAMESConst

                                                                                                                              +
                                                                                                                              STATIC_ROUTE_CALL_NAMES: readonly [
                                                                                                                                  "route",
                                                                                                                                  "addRoute",
                                                                                                                                  "useRoutes",
                                                                                                                                  "createBrowserRouter",
                                                                                                                                  "createHashRouter",
                                                                                                                              ] = ...
                                                                                                                              +

                                                                                                                              Recognized route-construction call suffixes.

                                                                                                                              +
                                                                                                                              +
                                                                                                                              + +
                                                                                                                              +
                                                                                                                              diff --git a/docs/architecture.mermaid b/docs/architecture.mermaid index a6b5fce6e..728ac1fc9 100644 --- a/docs/architecture.mermaid +++ b/docs/architecture.mermaid @@ -17,6 +17,7 @@ graph TD SESSION["SessionProviderRouter + BinarySession
                                                                                                                              one immutable deep binding per target
                                                                                                                              disjoint auxiliary routing"] REGISTRY["AnalysisProviderRegistry
                                                                                                                              sorted deep candidates
                                                                                                                              deterministic selection, no fallback"] WORKSPACE["Investigation workspace store
                                                                                                                              approved roots, canonical JSON
                                                                                                                              atomic CAS revisions and locks"] + JS_RECON["JavaScript artifact reconstruction
                                                                                                                              bounded directory/ASAR reads
                                                                                                                              AST-only bundle projection"] end subgraph "Provider Layers" @@ -58,6 +59,7 @@ graph TD REGISTRY --> GHIDRA SESSION --> AUX APP --> WORKSPACE + APP --> JS_RECON APP --> INSTALL SERVER --> CONTRACTS SERVER --> APP @@ -68,6 +70,8 @@ graph TD GHIDRA --> PROCESS APP --> PROCESS APP --> DOMAIN + JS_RECON --> AUX + JS_RECON --> DOMAIN CONTRACTS --> DOMAIN HOPPER --> DOMAIN GHIDRA --> DOMAIN diff --git a/docs/javascript-application-graph.md b/docs/javascript-application-graph.md index 17c4dfd27..3793603e9 100644 --- a/docs/javascript-application-graph.md +++ b/docs/javascript-application-graph.md @@ -22,8 +22,11 @@ The graph complements existing REA models instead of replacing them: | Native analysis | Provider-qualified binary functions, symbols, and references | Supplies native add-on/export observations | | JavaScript Application Graph | Cross-layer entity identity, evidence-bearing relationships, and canonical commitments | Preserves the combined application model | -An application-layer extractor may project results from those models into this -graph later. The domain module itself never reaches outward to obtain them. +The shipped [JavaScript artifact reconstruction](javascript-artifact-reconstruction.md) +service now projects bounded directory/ASAR, package, bundle, and source-map +facts into this graph. Electron IPC/security boundaries, passive runtime +reconciliation, and native-export projection remain separate later layers. The +domain module itself never reaches outward to obtain any of those facts. ## Versioned record diff --git a/docs/javascript-artifact-reconstruction.md b/docs/javascript-artifact-reconstruction.md new file mode 100644 index 000000000..18cc3e919 --- /dev/null +++ b/docs/javascript-artifact-reconstruction.md @@ -0,0 +1,98 @@ +# JavaScript artifact reconstruction + +REA can project an operator-supplied Electron/JavaScript application directory +or ASAR into [JavaScript Application Graph v1](javascript-application-graph.md) +without executing application code. This is an application-layer service used +as the static foundation for the later Electron boundary workflow. It does not +add a standalone CLI or MCP tool in this release. + +## What is reconstructed + +The projector reuses the content-addressed artifact inventory and safe artifact +readers. It retains canonical artifact-relative paths, exact byte counts, +SHA-256 digests, inventory IDs, ASAR container identity, and `.asar.unpacked` +status. Direct ASAR inputs and filesystem-backed ASAR files nested beneath a +directory are supported. + +Selected bounded text is then parsed as inert data to recover: + +- `package.json` metadata and declared main or renderer entrypoints; +- Electron preload paths and renderer files visible in static syntax; +- local HTML script entrypoints; +- Webpack and Rspack chunk registrations and module factories represented as + AST literals; +- static imports, dynamic imports, CommonJS `require` calls, workers, and + service workers; +- route, network endpoint, storage, and vendor-marker observations; +- local source-map declarations and, when separately approved, bounded original + source names and content digests; +- native `.node` linkage without parsing or executing the add-on. + +Each recovered bundle module retains the exact factory-source digest. A complete +bounded AST also receives a `babel-ast-v1` structural fingerprint that ignores +ordinary identifier names while retaining syntax, literals, operators, object +keys, and member properties. If fingerprint construction reaches its structural +bound, the fingerprint is unavailable and its status is `truncated`; a bounded +prefix is never presented as a complete stable fingerprint. + +## Authority and unknowns + +Artifact bytes and AST syntax are observations. Entrypoint resolution, imports, +loads, calls, and persistence relationships are static inferences and explicitly +say that syntax does not prove runtime execution. A malformed or unavailable +JavaScript file, package record, or source map produces an `unknown` graph scope +with `state: unavailable`; it is not treated as evidence that modules or source +are absent. + +Source-map content has a separate `source_map_read_approved` input. Without that +approval, REA inventories the map, links a static declaration when present, and +records partial non-truncated coverage plus an unavailable parse scope. With +approval, the graph stores original source names and optional content digests, +not the raw `sourcesContent` text. + +Endpoint observations preserve useful local diagnostics while removing URL +credentials, fragments, and query values. Artifact paths, digests, parse +locations, and analysis metadata remain actionable because REA is local-only. + +## Safety boundary + +The reconstruction path never uses `eval`, `Function`, `vm.runInContext`, a DOM, +bundle `push` handlers, or application bootstrap code. The Webpack/Rspack fixture +used by the test suite mutates a global and throws if executed; reconstruction +recovers its four module factories without triggering either side effect. + +Directory readers do not follow symlinks. Artifact paths pass through the shared +normalizer and collision registry, ASAR entry bytes are rechecked against the +inventory digest before parsing, and malformed ASAR operations return typed +format diagnostics that retain the local container path. Native add-ons are +represented by metadata only. + +## Bounds and coverage + +The input schema bounds artifact entries, cumulative artifact bytes, bytes per +entry, compression ratio, path depth and length, selected text files, text bytes, +AST nodes, static findings, bundle modules, source-map originals, and cooperative +parse time. Source-map original limits are shared across all maps in one +reconstruction. Combined input limits are rejected if their conservative graph +projection could exceed the v1 contract's 100,000 nodes or 200,000 edges. + +Byte, entry, path, and graph-shape bounds are hard limits. The parse deadline is +checked before and between bounded parsing and traversal phases; the synchronous +Babel and JSON parser calls cannot be preempted mid-call, so their input byte +bounds remain the hard protection for an individual call. + +Byte-identical assets share a content-digest node. At most 64 distinct +observations are retained on that node, as required by the graph contract; every +inventoried containment edge remains present, and any omitted observations make +top-level coverage partial and truncated. When an exact omission count is not +knowable, `omitted_count` is `null` rather than a guessed value. + +## Verification boundary + +The source-owned fixture covers an extracted directory, a direct ASAR with an +unpacked native add-on, and an ASAR nested beneath a directory. Tests also cover +deterministic reruns, parse-not-execute behavior, source-map approval, global +source-map limits, malformed structured data, invalid containers, traversal, +symlink escape, oversized text, cancellation, AST truncation, and repeated +content identities. These fixtures establish parser and artifact-reader claims; +they do not replace the later operator-supplied real-application benchmark. diff --git a/src/application/JavaScriptArtifactAnalysis.ts b/src/application/JavaScriptArtifactAnalysis.ts new file mode 100644 index 000000000..fe7d72534 --- /dev/null +++ b/src/application/JavaScriptArtifactAnalysis.ts @@ -0,0 +1,449 @@ +import { createHash } from "node:crypto"; + +import { analyzeJavaScriptStaticSource } from "../domain/javascriptStaticAnalysis.js"; +import type { + JavaScriptSourceRange, + JavaScriptSourcePoint, + JavaScriptStaticAnalysis, +} from "../domain/javascriptStaticAnalysisTypes.js"; +import type { + JavaScriptArtifactFile, + JavaScriptArtifactFileSet, +} from "./JavaScriptArtifactFiles.js"; +import type { + AnalyzedJavaScriptArtifactFile, + JavaScriptArtifactAnalysis, + JavaScriptHtmlScriptObservation, + JavaScriptPackageObservation, + JavaScriptSourceMapObservation, + JavaScriptSourceMapOriginal, +} from "./JavaScriptArtifactAnalysisTypes.js"; +import type { JavaScriptArtifactReconstructionInput } from "./JavaScriptArtifactReconstructionInput.js"; + +interface MutableArtifactAnalysis { + readonly files: AnalyzedJavaScriptArtifactFile[]; + readonly packages: JavaScriptPackageObservation[]; + readonly htmlScripts: JavaScriptHtmlScriptObservation[]; + readonly sourceMaps: JavaScriptSourceMapObservation[]; + visitedNodes: number; + findings: number; + modules: number; + parseFailures: number; + truncatedScopes: number; + sourceMapSources: number; +} + +interface ArtifactAnalysisContext { + readonly state: MutableArtifactAnalysis; + readonly input: JavaScriptArtifactReconstructionInput; + readonly deadline: number; + readonly now: () => number; +} + +/** Analyze selected text files under one shared AST, finding, module, and time budget. */ +export const analyzeJavaScriptArtifactFiles = ( + fileSet: JavaScriptArtifactFileSet, + input: JavaScriptArtifactReconstructionInput, + now: () => number, +): JavaScriptArtifactAnalysis => { + const state = emptyArtifactAnalysis(); + const context = { + state, + input, + deadline: now() + input.limits.max_parse_milliseconds, + now, + }; + for (const file of fileSet.files) analyzeArtifactFile(file, context); + return finalizeArtifactAnalysis(state, input); +}; + +const finalizeArtifactAnalysis = ( + state: MutableArtifactAnalysis, + input: JavaScriptArtifactReconstructionInput, +): JavaScriptArtifactAnalysis => { + const omittedHtmlFindings = Math.max( + 0, + state.htmlScripts.length + state.findings - input.limits.max_findings, + ); + const findings = Math.min( + input.limits.max_findings, + state.findings + state.htmlScripts.length, + ); + const sourceMapTruncations = state.sourceMaps.filter( + ({ status }) => status === "truncated", + ).length; + const truncatedScopes = + state.truncatedScopes + + sourceMapTruncations + + (omittedHtmlFindings > 0 ? 1 : 0); + return { + files: state.files, + packages: state.packages, + html_scripts: state.htmlScripts.slice(0, input.limits.max_findings), + source_maps: state.sourceMaps, + visited_ast_nodes: state.visitedNodes, + findings, + modules: state.modules, + parse_failures: state.parseFailures, + truncated_scopes: truncatedScopes, + limitations: [ + "JavaScript and HTML were parsed as inert text; bundle bootstrap code was never executed.", + "Static paths and relationships may remain unresolved when expressions are dynamic or obfuscated.", + ...(input.source_map_read_approved + ? [] + : [ + "Source maps were inventoried but their contents were not read without separate approval.", + ]), + ...(truncatedScopes === 0 + ? [] + : ["One or more static-analysis scopes reached an approved bound."]), + ], + }; +}; + +const analyzeArtifactFile = ( + file: JavaScriptArtifactFile, + context: ArtifactAnalysisContext, +): void => { + const { state, input } = context; + if (file.kind === "package-json") state.packages.push(parsePackage(file)); + if (file.kind === "html" && file.text.included) + state.htmlScripts.push( + ...parseHtmlScripts( + file.path, + file.text.value, + Math.max(0, input.limits.max_findings - state.findings), + ), + ); + if (file.kind === "source-map") addSourceMap(file, context); + if (file.kind !== "javascript" || !file.text.included) { + state.files.push({ file, javascript: null }); + return; + } + const remainingNodes = input.limits.max_ast_nodes - state.visitedNodes; + const remainingFindings = input.limits.max_findings - state.findings; + const remainingModules = input.limits.max_modules - state.modules; + if ( + remainingNodes <= 0 || + remainingFindings <= 0 || + remainingModules <= 0 || + context.now() > context.deadline + ) { + state.files.push({ file, javascript: null }); + state.truncatedScopes += 1; + return; + } + const analysis = analyzeJavaScriptStaticSource(file.text.value, { + maxAstNodes: remainingNodes, + maxFindings: remainingFindings, + maxModules: remainingModules, + deadline: context.deadline, + now: context.now, + }); + state.files.push({ file, javascript: analysis }); + state.visitedNodes += analysis.visited_ast_nodes; + state.findings += findingCount(analysis); + state.modules += analysis.bundler_registrations.reduce( + (count, registration) => count + registration.modules.length, + 0, + ); + if (analysis.parse_status === "failed") state.parseFailures += 1; + if (analysis.parse_status === "truncated") state.truncatedScopes += 1; +}; + +const addSourceMap = ( + file: JavaScriptArtifactFile, + context: ArtifactAnalysisContext, +): void => { + const sourceMap = parseSourceMap(file, { + deadline: context.deadline, + now: context.now, + maximumSources: Math.max( + 0, + context.input.limits.max_source_map_sources - + context.state.sourceMapSources, + ), + }); + context.state.sourceMaps.push(sourceMap); + context.state.sourceMapSources += sourceMap.sources.length; +}; + +const emptyArtifactAnalysis = (): MutableArtifactAnalysis => ({ + files: [], + packages: [], + htmlScripts: [], + sourceMaps: [], + visitedNodes: 0, + findings: 0, + modules: 0, + parseFailures: 0, + truncatedScopes: 0, + sourceMapSources: 0, +}); + +const parsePackage = ( + file: JavaScriptArtifactFile, +): JavaScriptPackageObservation => { + if (!file.text.included) + return unavailablePackage(file, "Package metadata text was unavailable."); + let value: unknown; + try { + value = JSON.parse(file.text.value); + } catch { + return invalidPackage(file, "package.json is not valid JSON."); + } + if (!isRecord(value)) + return invalidPackage(file, "package.json root is not an object."); + return { + path: file.path, + sha256: file.sha256, + status: "included", + name: boundedString(value.name), + version: boundedString(value.version), + main: boundedString(value.main), + renderer: + boundedString(value.renderer) ?? + boundedString(value.browser) ?? + boundedString(value.module), + limitation: null, + }; +}; + +const invalidPackage = ( + file: JavaScriptArtifactFile, + limitation: string, +): JavaScriptPackageObservation => ({ + ...unavailablePackage(file, limitation), + status: "invalid", +}); + +const unavailablePackage = ( + file: JavaScriptArtifactFile, + limitation: string, +): JavaScriptPackageObservation => ({ + path: file.path, + sha256: file.sha256, + status: "unavailable", + name: null, + version: null, + main: null, + renderer: null, + limitation, +}); + +const parseHtmlScripts = ( + path: string, + text: string, + maximum: number, +): JavaScriptHtmlScriptObservation[] => { + const scripts: JavaScriptHtmlScriptObservation[] = []; + const pattern = /]*\bsrc\s*=\s*(["'])([^"']+)\1[^>]*>/giu; + for (const match of text.matchAll(pattern)) { + const script = match[2]?.slice(0, 4_096); + if (script === undefined || scripts.length >= maximum) break; + const start = match.index; + scripts.push({ + html_path: path, + script_path: script, + location: rangeForOffsets(text, start, start + match[0].length), + }); + } + return scripts; +}; + +const parseSourceMap = ( + file: JavaScriptArtifactFile, + context: { + readonly deadline: number; + readonly now: () => number; + readonly maximumSources: number; + }, +): JavaScriptSourceMapObservation => { + if (!file.text.included) return unavailableSourceMap(file); + if (context.now() > context.deadline) + return truncatedSourceMap( + file, + null, + "Parse deadline reached before source-map decoding.", + ); + let value: unknown; + try { + value = JSON.parse(file.text.value); + } catch { + return invalidSourceMap(file, "Source map is not valid JSON."); + } + if (context.now() > context.deadline) + return truncatedSourceMap( + file, + null, + "Parse deadline elapsed during source-map decoding.", + ); + const maps = flattenSourceMaps(value, 10_000); + if (maps === undefined) + return invalidSourceMap(file, "Source map is not a bounded version 3 map."); + return collectSourceMapOriginals(file, maps, context); +}; + +const collectSourceMapOriginals = ( + file: JavaScriptArtifactFile, + maps: readonly Readonly>[], + context: { + readonly deadline: number; + readonly now: () => number; + readonly maximumSources: number; + }, +): JavaScriptSourceMapObservation => { + const sources: JavaScriptSourceMapOriginal[] = []; + let total = 0; + for (const map of maps) { + const names = map.sources; + if (!Array.isArray(names)) + return invalidSourceMap(file, "Source map has no sources array."); + const contents = Array.isArray(map.sourcesContent) + ? map.sourcesContent + : []; + const root = typeof map.sourceRoot === "string" ? map.sourceRoot : ""; + for (const [index, raw] of names.entries()) { + if (total % 1_024 === 0 && context.now() > context.deadline) + return { + path: file.path, + sha256: file.sha256, + status: "truncated", + sources, + omitted_sources: null, + limitation: "Parse deadline elapsed during source-map traversal.", + }; + if (typeof raw !== "string") + return invalidSourceMap( + file, + "Source map contains a non-string source name.", + ); + total += 1; + if (sources.length >= context.maximumSources) continue; + const content = + typeof contents[index] === "string" ? contents[index] : null; + sources.push({ + source: resolveSourceName(root, raw), + content, + content_sha256: content === null ? null : sha256(content), + }); + } + } + const omitted = total - sources.length; + return { + path: file.path, + sha256: file.sha256, + status: omitted === 0 ? "included" : "truncated", + sources, + omitted_sources: omitted, + limitation: + omitted === 0 + ? null + : "Original-source inventory reached the approved source-map limit.", + }; +}; + +const unavailableSourceMap = ( + file: JavaScriptArtifactFile, +): JavaScriptSourceMapObservation => { + if (file.text.included) + throw new TypeError("Expected unavailable source-map text"); + const notApproved = file.text.reason === "not-approved"; + return { + path: file.path, + sha256: file.sha256, + status: notApproved ? "not-approved" : "invalid", + sources: [], + omitted_sources: 0, + limitation: notApproved + ? "Source-map content requires separate approval." + : "Source-map text was unavailable within approved limits.", + }; +}; + +const flattenSourceMaps = ( + root: unknown, + maximum: number, +): Readonly>[] | undefined => { + if (!isRecord(root) || root.version !== 3) return undefined; + const maps: Readonly>[] = []; + const pending = [root]; + while (pending.length > 0) { + const map = pending.pop(); + if (map === undefined || map.version !== 3) return undefined; + if (Array.isArray(map.sections)) { + if (pending.length + maps.length + map.sections.length > maximum) + return undefined; + for (const section of map.sections) { + if (!isRecord(section) || !isRecord(section.map)) return undefined; + pending.push(section.map); + } + } else maps.push(map); + } + return maps; +}; + +const truncatedSourceMap = ( + file: JavaScriptArtifactFile, + omitted: number | null, + limitation: string, +): JavaScriptSourceMapObservation => ({ + path: file.path, + sha256: file.sha256, + status: "truncated", + sources: [], + omitted_sources: omitted, + limitation, +}); + +const invalidSourceMap = ( + file: JavaScriptArtifactFile, + limitation: string, +): JavaScriptSourceMapObservation => ({ + path: file.path, + sha256: file.sha256, + status: "invalid", + sources: [], + omitted_sources: 0, + limitation, +}); + +const findingCount = (analysis: JavaScriptStaticAnalysis): number => + analysis.references.length + + analysis.endpoints.length + + analysis.storage.length + + analysis.role_paths.length + + analysis.source_map_urls.length + + analysis.bundler_registrations.length; + +const rangeForOffsets = ( + text: string, + start: number, + end: number, +): JavaScriptSourceRange => ({ + start: pointForOffset(text, start), + end: pointForOffset(text, end), +}); + +const pointForOffset = ( + text: string, + offset: number, +): JavaScriptSourcePoint => { + const lines = text.slice(0, offset).split("\n"); + return { line: lines.length, column: lines.at(-1)?.length ?? 0 }; +}; + +const resolveSourceName = (root: string, source: string): string => + `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}`.slice( + 0, + 4_096, + ); + +const boundedString = (value: unknown): string | null => + typeof value === "string" && value.length > 0 ? value.slice(0, 4_096) : null; + +const sha256 = (value: string): string => + createHash("sha256").update(value).digest("hex"); + +const isRecord = (value: unknown): value is Readonly> => + typeof value === "object" && value !== null && !Array.isArray(value); diff --git a/src/application/JavaScriptArtifactAnalysisTypes.ts b/src/application/JavaScriptArtifactAnalysisTypes.ts new file mode 100644 index 000000000..ed8bf0be7 --- /dev/null +++ b/src/application/JavaScriptArtifactAnalysisTypes.ts @@ -0,0 +1,61 @@ +import type { + JavaScriptSourceRange, + JavaScriptStaticAnalysis, +} from "../domain/javascriptStaticAnalysisTypes.js"; +import type { JavaScriptArtifactFile } from "./JavaScriptArtifactFiles.js"; + +/** Parsed package metadata used only for static entrypoint discovery. */ +export interface JavaScriptPackageObservation { + readonly path: string; + readonly sha256: string; + readonly status: "included" | "invalid" | "unavailable"; + readonly name: string | null; + readonly version: string | null; + readonly main: string | null; + readonly renderer: string | null; + readonly limitation: string | null; +} + +/** One HTML script source observed without building or executing a DOM. */ +export interface JavaScriptHtmlScriptObservation { + readonly html_path: string; + readonly script_path: string; + readonly location: JavaScriptSourceRange; +} + +/** One original source declared by an approved local source map. */ +export interface JavaScriptSourceMapOriginal { + readonly source: string; + readonly content: string | null; + readonly content_sha256: string | null; +} + +/** Bounded local source-map parse result. */ +export interface JavaScriptSourceMapObservation { + readonly path: string; + readonly sha256: string; + readonly status: "included" | "truncated" | "invalid" | "not-approved"; + readonly sources: readonly JavaScriptSourceMapOriginal[]; + readonly omitted_sources: number | null; + readonly limitation: string | null; +} + +/** One relevant file plus optional AST-only JavaScript facts. */ +export interface AnalyzedJavaScriptArtifactFile { + readonly file: JavaScriptArtifactFile; + readonly javascript: JavaScriptStaticAnalysis | null; +} + +/** Complete bounded static-analysis projection before graph construction. */ +export interface JavaScriptArtifactAnalysis { + readonly files: readonly AnalyzedJavaScriptArtifactFile[]; + readonly packages: readonly JavaScriptPackageObservation[]; + readonly html_scripts: readonly JavaScriptHtmlScriptObservation[]; + readonly source_maps: readonly JavaScriptSourceMapObservation[]; + readonly visited_ast_nodes: number; + readonly findings: number; + readonly modules: number; + readonly parse_failures: number; + readonly truncated_scopes: number; + readonly limitations: readonly string[]; +} diff --git a/src/application/JavaScriptArtifactFiles.ts b/src/application/JavaScriptArtifactFiles.ts new file mode 100644 index 000000000..3f4abae03 --- /dev/null +++ b/src/application/JavaScriptArtifactFiles.ts @@ -0,0 +1,406 @@ +import { createHash } from "node:crypto"; +import { isAbsolute } from "node:path"; +import type { Readable } from "node:stream"; + +import { AsarArtifactReader } from "../artifacts/AsarArtifactReader.js"; +import { + ArtifactPathRegistry, + normalizeArtifactPath, +} from "../artifacts/ArtifactPaths.js"; +import { + ArtifactReaderFailure, + type ArtifactEntry, + type ArtifactReader, +} from "../artifacts/ArtifactReader.js"; +import { streamChunkToBuffer } from "../artifacts/StreamBytes.js"; +import type { ArtifactInventorySnapshot } from "./ArtifactInventory.js"; +import type { JavaScriptArtifactReconstructionInput } from "./JavaScriptArtifactReconstructionInput.js"; + +/** Relevant file categories projected from the complete artifact inventory. */ +export type JavaScriptArtifactFileKind = + | "package-json" + | "javascript" + | "html" + | "source-map" + | "native-addon"; + +/** One content-addressed local artifact file and its bounded text availability. */ +export interface JavaScriptArtifactFile { + readonly path: string; + readonly container_sha256: string; + readonly sha256: string; + readonly bytes: number; + readonly inventory_artifact_id: string; + readonly kind: JavaScriptArtifactFileKind; + readonly unpacked: boolean; + readonly text: + | { readonly included: true; readonly value: string } + | { + readonly included: false; + readonly reason: + | "not-applicable" + | "not-approved" + | "file-limit" + | "byte-limit" + | "invalid-utf8"; + }; +} + +/** One filesystem-backed ASAR nested beneath a directory input. */ +export interface JavaScriptArtifactContainer { + readonly path: string; + readonly sha256: string; + readonly bytes: number; + readonly inventory_artifact_id: string; +} + +/** Deterministic relevant-file projection plus explicit omissions. */ +export interface JavaScriptArtifactFileSet { + readonly files: readonly JavaScriptArtifactFile[]; + readonly containers: readonly JavaScriptArtifactContainer[]; + readonly text_files_selected: number; + readonly text_bytes_read: number; + readonly omitted_text_files: number; + readonly limit_omitted_text_files: number; + readonly policy_filtered_text_files: number; + readonly invalid_utf8_files: number; +} + +interface ExpectedFile { + readonly path: string; + readonly sha256: string; + readonly bytes: number; + readonly inventoryArtifactId: string; + readonly kind: JavaScriptArtifactFileKind; +} + +interface Selection { + readonly selected: boolean; + readonly reason: "file-limit" | "byte-limit" | "not-approved" | null; +} + +interface ReadContext { + readonly input: JavaScriptArtifactReconstructionInput; + readonly expected: ReadonlyMap; + readonly expectedContainers: ReadonlyMap; + readonly selections: ReadonlyMap; + readonly registry: ArtifactPathRegistry; + readonly files: JavaScriptArtifactFile[]; + readonly containers: JavaScriptArtifactContainer[]; + readonly signal: AbortSignal | undefined; + textBytes: number; + invalidUtf8: number; +} + +interface ReadTextInput { + readonly reader: ArtifactReader; + readonly entry: ArtifactEntry; + readonly expected: ExpectedFile; + readonly selection: Selection | undefined; +} + +/** Read only selected textual entries through an already-inventoried reader. */ +export const readJavaScriptArtifactFiles = async ( + reader: ArtifactReader, + snapshot: ArtifactInventorySnapshot, + input: JavaScriptArtifactReconstructionInput, + signal?: AbortSignal, +): Promise => { + const inventory = expectedInventory(snapshot); + const expected = inventory.files; + const selections = selectTextFiles(expected, input); + const context: ReadContext = { + input, + expected, + expectedContainers: inventory.containers, + selections, + registry: new ArtifactPathRegistry(), + files: [], + containers: [], + signal, + textBytes: 0, + invalidUtf8: 0, + }; + await visitReader(reader, "", snapshot.manifest.root_sha256, context); + const files = context.files.sort((left, right) => + compareCodePoints(left.path, right.path), + ); + assertExpectedFilesWereVisited(expected, files); + const selected = [...selections.values()].filter( + ({ selected: isSelected }) => isSelected, + ).length; + return { + files, + containers: context.containers.sort((left, right) => + compareCodePoints(left.path, right.path), + ), + text_files_selected: selected, + text_bytes_read: context.textBytes, + omitted_text_files: [...selections.values()].filter( + ({ selected: isSelected }) => !isSelected, + ).length, + limit_omitted_text_files: [...selections.values()].filter( + ({ reason }) => reason === "file-limit" || reason === "byte-limit", + ).length, + policy_filtered_text_files: [...selections.values()].filter( + ({ reason }) => reason === "not-approved", + ).length, + invalid_utf8_files: context.invalidUtf8, + }; +}; + +const visitReader = async ( + reader: ArtifactReader, + prefix: string, + containerSha256: string, + context: ReadContext, +): Promise => { + for await (const entry of reader.entries(context.signal)) { + abortIfNeeded(context.signal); + const path = normalizeArtifactPath( + prefix === "" ? entry.path : `${prefix}/${entry.path}`, + { + maxDepth: context.input.limits.max_depth, + maxPathBytes: context.input.limits.max_path_bytes, + }, + ); + const nestedAsar = isFilesystemAsar(entry, path); + context.registry.add(path, nestedAsar ? "directory" : entry.kind); + if (nestedAsar) { + await visitNestedAsar(entry, path, context); + continue; + } + const expected = context.expected.get(path); + if (expected === undefined) continue; + const selection = context.selections.get(path); + const text = await readTextIfSelected(context, { + reader, + entry, + expected, + selection, + }); + context.files.push({ + path, + container_sha256: containerSha256, + sha256: expected.sha256, + bytes: expected.bytes, + inventory_artifact_id: expected.inventoryArtifactId, + kind: expected.kind, + unpacked: entry.unpacked, + text, + }); + } +}; + +const visitNestedAsar = async ( + entry: ArtifactEntry, + path: string, + context: ReadContext, +): Promise => { + const inventory = expectedContainer(path, context); + context.containers.push(inventory); + const nested = new AsarArtifactReader(entry.adapterKey); + try { + await visitReader(nested, path, inventory.sha256, context); + } finally { + await nested.close(); + } +}; + +const expectedContainer = ( + path: string, + context: ReadContext, +): JavaScriptArtifactContainer => { + const container = context.expectedContainers.get(path); + if (container === undefined) + throw new ArtifactReaderFailure( + "integrity", + `Nested ASAR disappeared from inventory: ${path}`, + ); + return container; +}; + +const readTextIfSelected = async ( + context: ReadContext, + input: ReadTextInput, +): Promise => { + if (input.expected.kind === "native-addon") + return { included: false, reason: "not-applicable" }; + if (input.selection?.selected !== true) + return { + included: false, + reason: input.selection?.reason ?? "file-limit", + }; + const bytes = await readBounded( + await input.reader.open(input.entry, context.signal), + context.input.limits.max_text_file_bytes, + context.signal, + ); + const digest = createHash("sha256").update(bytes).digest("hex"); + if (digest !== input.expected.sha256 || bytes.length !== input.expected.bytes) + throw new ArtifactReaderFailure( + "integrity", + `Artifact entry changed after inventory: ${input.expected.path}`, + ); + context.textBytes += bytes.length; + try { + return { + included: true, + value: new TextDecoder("utf-8", { fatal: true }).decode(bytes), + }; + } catch { + context.invalidUtf8 += 1; + return { included: false, reason: "invalid-utf8" }; + } +}; + +const expectedInventory = ( + snapshot: ArtifactInventorySnapshot, +): { + readonly files: ReadonlyMap; + readonly containers: ReadonlyMap; +} => { + const nodes = new Map(snapshot.nodes.map((node) => [node.artifact_id, node])); + const files = new Map(); + const containers = new Map(); + for (const occurrence of snapshot.occurrences) { + if (occurrence.artifact_id === null || occurrence.logical_path === ".") + continue; + const node = nodes.get(occurrence.artifact_id); + if (node === undefined) + throw new ArtifactReaderFailure( + "integrity", + `Artifact inventory node is missing: ${occurrence.logical_path}`, + ); + if (occurrence.logical_path.toLowerCase().endsWith(".asar")) + containers.set(occurrence.logical_path, { + path: occurrence.logical_path, + sha256: node.sha256, + bytes: node.size, + inventory_artifact_id: node.artifact_id, + }); + const kind = relevantKind(occurrence.logical_path); + if (kind === undefined) continue; + files.set(occurrence.logical_path, { + path: occurrence.logical_path, + sha256: node.sha256, + bytes: node.size, + inventoryArtifactId: node.artifact_id, + kind, + }); + } + return { files, containers }; +}; + +const selectTextFiles = ( + files: ReadonlyMap, + input: JavaScriptArtifactReconstructionInput, +): ReadonlyMap => { + const selected = new Map(); + let fileCount = 0; + let bytes = 0; + const ordered = [...files.values()].sort((left, right) => { + const priority = filePriority(left.kind) - filePriority(right.kind); + return priority === 0 ? compareCodePoints(left.path, right.path) : priority; + }); + for (const file of ordered) { + if (file.kind === "native-addon") continue; + if (file.kind === "source-map" && !input.source_map_read_approved) { + selected.set(file.path, { selected: false, reason: "not-approved" }); + continue; + } + if ( + fileCount >= input.limits.max_text_files || + file.bytes > input.limits.max_text_file_bytes + ) { + selected.set(file.path, { selected: false, reason: "file-limit" }); + continue; + } + if (bytes + file.bytes > input.limits.max_total_text_bytes) { + selected.set(file.path, { selected: false, reason: "byte-limit" }); + continue; + } + selected.set(file.path, { selected: true, reason: null }); + fileCount += 1; + bytes += file.bytes; + } + return selected; +}; + +const readBounded = async ( + stream: Readable, + maximum: number, + signal?: AbortSignal, +): Promise => { + const chunks: Buffer[] = []; + let bytes = 0; + for await (const raw of stream) { + abortIfNeeded(signal); + const chunk = streamChunkToBuffer(raw); + bytes += chunk.length; + if (bytes > maximum) { + stream.destroy(); + throw new ArtifactReaderFailure( + "limit", + "Selected JavaScript artifact text exceeded its byte limit", + ); + } + chunks.push(chunk); + } + return Buffer.concat(chunks, bytes); +}; + +const assertExpectedFilesWereVisited = ( + expected: ReadonlyMap, + actual: readonly JavaScriptArtifactFile[], +): void => { + const observed = new Set(actual.map(({ path }) => path)); + for (const path of expected.keys()) + if (!observed.has(path)) + throw new ArtifactReaderFailure( + "integrity", + `Relevant artifact entry disappeared after inventory: ${path}`, + ); +}; + +const relevantKind = (path: string): JavaScriptArtifactFileKind | undefined => { + const lower = path.toLowerCase(); + if (lower === "package.json" || lower.endsWith("/package.json")) + return "package-json"; + if (/\.(?:cjs|mjs|js|jsx|ts|tsx)$/u.test(lower)) return "javascript"; + if (/\.html?$/u.test(lower)) return "html"; + if (lower.endsWith(".map")) return "source-map"; + if (lower.endsWith(".node")) return "native-addon"; + return undefined; +}; + +const filePriority = (kind: JavaScriptArtifactFileKind): number => { + switch (kind) { + case "package-json": + return 0; + case "html": + return 1; + case "javascript": + return 2; + case "source-map": + return 3; + case "native-addon": + return 4; + } +}; + +const isFilesystemAsar = (entry: ArtifactEntry, path: string): boolean => + entry.kind === "file" && + path.toLowerCase().endsWith(".asar") && + isAbsolute(entry.adapterKey); + +const abortIfNeeded = (signal?: AbortSignal): void => { + if (signal?.aborted === true) + throw new ArtifactReaderFailure( + "cancelled", + "JavaScript artifact reconstruction cancelled", + ); +}; + +const compareCodePoints = (left: string, right: string): number => + left < right ? -1 : left > right ? 1 : 0; diff --git a/src/application/JavaScriptArtifactGraphAccumulator.ts b/src/application/JavaScriptArtifactGraphAccumulator.ts new file mode 100644 index 000000000..6f09ff465 --- /dev/null +++ b/src/application/JavaScriptArtifactGraphAccumulator.ts @@ -0,0 +1,74 @@ +import { + createJavaScriptApplicationEdge, + createJavaScriptApplicationNode, + type ApplicationEdge, + type ApplicationNode, +} from "../domain/javascriptApplicationGraph.js"; + +/** Deduplicate graph entities while retaining distinct evidence observations. */ +export class JavaScriptArtifactGraphAccumulator { + readonly #nodes = new Map(); + readonly #edges = new Map(); + #omittedObservations = 0; + + /** Create or merge one canonical node. */ + addNode(input: unknown): ApplicationNode { + const created = createJavaScriptApplicationNode(input); + const existing = this.#nodes.get(created.node_id); + if (existing === undefined) { + this.#nodes.set(created.node_id, created); + return created; + } + const bySemanticId = new Map( + [...existing.observations, ...created.observations].map((observation) => [ + observation.observation_id, + observationInput(observation), + ]), + ); + const observations = [...bySemanticId.entries()] + .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0)) + .slice(0, 64) + .map(([, observation]) => observation); + this.#omittedObservations += Math.max(0, bySemanticId.size - 64); + const merged = createJavaScriptApplicationNode({ + kind: existing.kind, + identity: existing.identity, + observations, + }); + this.#nodes.set(merged.node_id, merged); + return merged; + } + + /** Create or replace one canonical edge by semantic identifier. */ + addEdge(input: unknown): ApplicationEdge { + const edge = createJavaScriptApplicationEdge(input); + this.#edges.set(edge.edge_id, edge); + return edge; + } + + /** Return all accumulated canonical nodes. */ + nodes(): readonly ApplicationNode[] { + return [...this.#nodes.values()]; + } + + /** Return all accumulated canonical edges. */ + edges(): readonly ApplicationEdge[] { + return [...this.#edges.values()]; + } + + /** Count distinct node observations omitted by the graph contract bound. */ + omittedObservations(): number { + return this.#omittedObservations; + } +} + +const observationInput = ( + observation: ApplicationNode["observations"][number], +) => { + const { + observation_id: _observationId, + identifier_strategy: _strategy, + ...input + } = observation; + return input; +}; diff --git a/src/application/JavaScriptArtifactGraphBuilder.ts b/src/application/JavaScriptArtifactGraphBuilder.ts new file mode 100644 index 000000000..b64876c9b --- /dev/null +++ b/src/application/JavaScriptArtifactGraphBuilder.ts @@ -0,0 +1,153 @@ +import type { ArtifactInventorySnapshot } from "./ArtifactInventory.js"; +import { + createJavaScriptApplicationGraph, + type JavaScriptApplicationGraph, +} from "../domain/javascriptApplicationGraph.js"; +import type { JavaScriptArtifactAnalysis } from "./JavaScriptArtifactAnalysisTypes.js"; +import type { JavaScriptArtifactFileSet } from "./JavaScriptArtifactFiles.js"; +import { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js"; +import { + javaScriptAnalysisLimits, + type JavaScriptArtifactGraphContext, +} from "./JavaScriptArtifactGraphContext.js"; +import { + addJavaScriptHtmlRoles, + addJavaScriptSourceMapOriginals, +} from "./JavaScriptArtifactGraphDocuments.js"; +import { addJavaScriptStaticFindings } from "./JavaScriptArtifactGraphFindings.js"; +import { + completeReconstructionCoverage, + partialReconstructionCoverage, +} from "./JavaScriptArtifactGraphEvidence.js"; +import { + addJavaScriptArtifactContainers, + addJavaScriptArtifactFiles, + addJavaScriptBundlerNodes, + addJavaScriptPackageNodes, + createJavaScriptArtifactRootNode, +} from "./JavaScriptArtifactGraphStructure.js"; +import type { JavaScriptArtifactReconstructionInput } from "./JavaScriptArtifactReconstructionInput.js"; + +/** Project bounded artifact and AST facts into JavaScript Application Graph v1. */ +export const buildJavaScriptArtifactGraph = ( + snapshot: ArtifactInventorySnapshot, + fileSet: JavaScriptArtifactFileSet, + analysis: JavaScriptArtifactAnalysis, + input: JavaScriptArtifactReconstructionInput, +): JavaScriptApplicationGraph => { + const accumulator = new JavaScriptArtifactGraphAccumulator(); + const root = createJavaScriptArtifactRootNode(accumulator, snapshot); + const context: JavaScriptArtifactGraphContext = { + accumulator, + snapshot, + fileSet, + analysis, + input, + root, + filesByPath: new Map(fileSet.files.map((file) => [file.path, file])), + fileNodes: new Map(), + assetNodes: new Map(), + moduleNodes: new Map(), + containerNodes: new Map([[snapshot.manifest.root_sha256, root]]), + }; + addJavaScriptArtifactContainers(context); + addJavaScriptArtifactFiles(context); + const packageRoots = addJavaScriptPackageNodes(context); + addJavaScriptBundlerNodes(context); + addJavaScriptStaticFindings(context); + addJavaScriptHtmlRoles(context); + addJavaScriptSourceMapOriginals(context); + const coverage = graphCoverage(context); + return createJavaScriptApplicationGraph({ + schema: "JavaScriptApplicationGraph", + schema_version: 1, + root_node_ids: + packageRoots.length === 0 + ? [root.node_id] + : packageRoots.map(({ node_id: id }) => id), + nodes: accumulator.nodes(), + edges: accumulator.edges(), + coverage, + limitations: graphLimitations(context, coverage.status), + }); +}; + +const graphCoverage = (context: JavaScriptArtifactGraphContext) => { + const exactLimitOmissions = + context.fileSet.limit_omitted_text_files + + context.accumulator.omittedObservations(); + const sourceMapPolicyGap = context.analysis.source_maps.some( + ({ status }) => status === "not-approved", + ); + const malformedStructuredData = + context.analysis.packages.some(({ status }) => status !== "included") || + context.analysis.source_maps.some(({ status }) => status === "invalid"); + const unknownGap = + context.analysis.parse_failures > 0 || + context.fileSet.invalid_utf8_files > 0 || + sourceMapPolicyGap || + malformedStructuredData; + if (context.analysis.truncated_scopes > 0) + return partialReconstructionCoverage( + reconstructionLimits(context.input), + null, + true, + ); + if (exactLimitOmissions > 0) + return partialReconstructionCoverage( + reconstructionLimits(context.input), + exactLimitOmissions, + true, + ); + if (unknownGap) + return partialReconstructionCoverage( + reconstructionLimits(context.input), + null, + false, + ); + return completeReconstructionCoverage(reconstructionLimits(context.input)); +}; + +const graphLimitations = ( + context: JavaScriptArtifactGraphContext, + coverage: "complete" | "partial" | "unknown" | "unavailable", +): string[] => [ + ...context.analysis.limitations, + "Webpack/Rspack factories were recovered from AST literals; REA did not invoke push handlers or bundle bootstrap code.", + "Static imports, entrypoints, workers, endpoints, and storage relationships do not prove runtime execution.", + ...(context.accumulator.omittedObservations() === 0 + ? [] + : [ + "Repeated content identities exceeded the per-node observation bound; containment edges still preserve inventoried paths.", + ]), + ...(coverage === "complete" + ? [] + : [ + "Graph coverage is incomplete; unavailable facts remain explicit and must not be read as absence.", + ]), +]; + +const reconstructionLimits = (input: JavaScriptArtifactReconstructionInput) => [ + { + name: "max-entries", + value: input.limits.max_entries, + unit: "items" as const, + }, + { + name: "max-total-artifact-bytes", + value: input.limits.max_total_artifact_bytes, + unit: "bytes" as const, + }, + { + name: "max-text-files", + value: input.limits.max_text_files, + unit: "items" as const, + }, + { + name: "max-total-text-bytes", + value: input.limits.max_total_text_bytes, + unit: "bytes" as const, + }, + ...javaScriptAnalysisLimits(input), + { name: "max-observations-per-node", value: 64, unit: "items" as const }, +]; diff --git a/src/application/JavaScriptArtifactGraphContext.ts b/src/application/JavaScriptArtifactGraphContext.ts new file mode 100644 index 000000000..64d3c65aa --- /dev/null +++ b/src/application/JavaScriptArtifactGraphContext.ts @@ -0,0 +1,359 @@ +import { posix } from "node:path"; + +import type { ArtifactInventorySnapshot } from "./ArtifactInventory.js"; +import type { ApplicationGraphEvidence } from "../domain/javascriptApplicationEvidenceSchemas.js"; +import type { ApplicationNode } from "../domain/javascriptApplicationGraph.js"; +import type { JavaScriptSourceRange } from "../domain/javascriptStaticAnalysisTypes.js"; +import type { JavaScriptArtifactAnalysis } from "./JavaScriptArtifactAnalysisTypes.js"; +import type { + JavaScriptArtifactFile, + JavaScriptArtifactFileSet, +} from "./JavaScriptArtifactFiles.js"; +import { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js"; +import { + artifactObservationEvidence, + astObservationEvidence, + completeReconstructionCoverage, + partialReconstructionCoverage, + staticInferenceEvidence, + unavailableAstEvidence, +} from "./JavaScriptArtifactGraphEvidence.js"; +import type { JavaScriptArtifactReconstructionInput } from "./JavaScriptArtifactReconstructionInput.js"; + +/** Mutable graph-construction state scoped to one reconstruction. */ +export interface JavaScriptArtifactGraphContext { + readonly accumulator: JavaScriptArtifactGraphAccumulator; + readonly snapshot: ArtifactInventorySnapshot; + readonly fileSet: JavaScriptArtifactFileSet; + readonly analysis: JavaScriptArtifactAnalysis; + readonly input: JavaScriptArtifactReconstructionInput; + readonly root: ApplicationNode; + readonly filesByPath: ReadonlyMap; + readonly fileNodes: Map; + readonly assetNodes: Map; + readonly moduleNodes: Map; + readonly containerNodes: Map; +} + +/** Evidence coverage shape shared by reconstruction graph helpers. */ +export type JavaScriptArtifactGraphCoverage = + ApplicationGraphEvidence["coverage"]; + +/** Direct artifact-containment edge values. */ +export interface ContainsEdgeInput { + readonly source: ApplicationNode; + readonly target: ApplicationNode; + readonly file: JavaScriptArtifactFile; + readonly operation: string; +} + +/** Exact AST containment edge values. */ +export interface AstEdgeInput { + readonly source: ApplicationNode; + readonly target: ApplicationNode; + readonly file: JavaScriptArtifactFile; + readonly range: JavaScriptSourceRange; + readonly coverage: JavaScriptArtifactGraphCoverage; + readonly properties: Readonly>; +} + +/** Inferred static relationship edge values. */ +export interface InferenceEdgeInput extends AstEdgeInput { + readonly relation: + | "imports" + | "loads" + | "maps_to" + | "exposes" + | "calls" + | "persists_to"; +} + +/** Electron role identity and static discovery evidence. */ +export interface RoleNodeInput { + readonly kind: "electron-main" | "electron-preload" | "electron-renderer"; + readonly anchor: JavaScriptArtifactFile; + readonly declaredPath: string; + readonly resolvedPath: string | null; + readonly mechanism: string; + readonly range?: JavaScriptSourceRange; + readonly coverage?: JavaScriptArtifactGraphCoverage; +} + +/** Resolution from an inferred Electron role to an artifact asset. */ +export interface RoleAssetLinkInput { + readonly role: ApplicationNode; + readonly anchor: JavaScriptArtifactFile; + readonly path: string | null; + readonly range?: JavaScriptSourceRange; + readonly coverage?: JavaScriptArtifactGraphCoverage; +} + +/** Explicit package, JavaScript, or source-map parse gap. */ +export interface UnavailableParseInput { + readonly file: JavaScriptArtifactFile; + readonly asset: ApplicationNode; + readonly operation: string; + readonly limitation: string; +} + +/** Add a direct artifact-containment edge. */ +export const addArtifactContainsEdge = ( + context: JavaScriptArtifactGraphContext, + input: ContainsEdgeInput, +): void => { + context.accumulator.addEdge({ + source_node_id: input.source.node_id, + target_node_id: input.target.node_id, + relation: "contains", + properties: { path: input.file.path }, + evidence: artifactObservationEvidence({ + sha256: + input.operation === "inventory-entry" + ? input.file.container_sha256 + : input.file.sha256, + path: input.file.path, + operation: input.operation, + coverage: completeReconstructionCoverage(), + }), + }); +}; + +/** Add an exact AST containment edge. */ +export const addAstContainsEdge = ( + context: JavaScriptArtifactGraphContext, + input: AstEdgeInput, +): void => { + context.accumulator.addEdge({ + source_node_id: input.source.node_id, + target_node_id: input.target.node_id, + relation: "contains", + properties: input.properties, + evidence: astObservationEvidence({ + sha256: input.file.sha256, + path: input.file.path, + range: input.range, + operation: "map-bundler-structure", + coverage: input.coverage, + }), + }); +}; + +/** Add an explicitly inferred static relationship edge. */ +export const addStaticInferenceEdge = ( + context: JavaScriptArtifactGraphContext, + input: InferenceEdgeInput, +): void => { + context.accumulator.addEdge({ + source_node_id: input.source.node_id, + target_node_id: input.target.node_id, + relation: input.relation, + properties: input.properties, + evidence: staticInferenceEvidence({ + sha256: input.file.sha256, + path: input.file.path, + range: input.range, + operation: "map-static-relationship", + coverage: input.coverage, + }), + }); +}; + +/** Preserve a static parse or approval gap as an explicit unknown scope. */ +export const addUnavailableStaticParseScope = ( + context: JavaScriptArtifactGraphContext, + input: UnavailableParseInput, +): void => { + const node = context.accumulator.addNode({ + kind: "unknown", + identity: artifactLocalIdentity( + input.file.sha256, + "static-parse-scope", + `${input.operation}:${input.file.path}`, + ), + observations: [ + { + label: `${input.file.path} parse scope`, + properties: { + path: input.file.path, + operation: input.operation, + limitation: input.limitation, + }, + evidence: unavailableAstEvidence({ + sha256: input.file.sha256, + path: input.file.path, + operation: input.operation, + coverage: partialReconstructionCoverage([], null, false), + limitation: input.limitation, + }), + }, + ], + }); + context.accumulator.addEdge({ + source_node_id: input.asset.node_id, + target_node_id: node.node_id, + relation: "contains", + properties: { scope: "unavailable-static-analysis" }, + evidence: artifactObservationEvidence({ + sha256: input.file.sha256, + path: input.file.path, + operation: "associate-unavailable-parse-scope", + coverage: completeReconstructionCoverage(), + }), + }); +}; + +/** Coverage for one bounded JavaScript AST analysis. */ +export const javascriptAnalysisCoverage = ( + analysis: NonNullable< + JavaScriptArtifactAnalysis["files"][number]["javascript"] + >, + input: JavaScriptArtifactReconstructionInput, +): JavaScriptArtifactGraphCoverage => + analysis.parse_status === "complete" + ? completeReconstructionCoverage(javaScriptAnalysisLimits(input)) + : { + status: "partial", + truncated: analysis.parse_status === "truncated", + omitted_count: null, + limits: javaScriptAnalysisLimits(input), + }; + +/** Stable identity for a fact scoped to one exact artifact. */ +export const artifactLocalIdentity = ( + sha256: string, + namespace: string, + key: string, +) => ({ + strategy: "artifact-local-key" as const, + stability: "artifact-version" as const, + artifact_sha256: sha256, + namespace: namespace.slice(0, 512), + key: key.slice(0, 4_096), +}); + +/** Create or merge an Electron role inferred from static syntax or metadata. */ +export const createElectronRoleNode = ( + context: JavaScriptArtifactGraphContext, + input: RoleNodeInput, +): ApplicationNode => + context.accumulator.addNode({ + kind: input.kind, + identity: artifactLocalIdentity( + input.anchor.sha256, + "electron-role", + `${input.kind}:${input.resolvedPath ?? input.declaredPath}`, + ), + observations: [ + { + label: input.resolvedPath ?? input.declaredPath, + properties: { + declared_path: input.declaredPath, + resolved_path: input.resolvedPath, + mechanism: input.mechanism, + }, + evidence: staticInferenceEvidence({ + sha256: input.anchor.sha256, + path: input.anchor.path, + operation: "discover-electron-entrypoint", + coverage: input.coverage ?? completeReconstructionCoverage(), + ...(input.range === undefined ? {} : { range: input.range }), + }), + }, + ], + }); + +/** Resolve an Electron role to an inventoried asset when available. */ +export const linkElectronRoleToAsset = ( + context: JavaScriptArtifactGraphContext, + input: RoleAssetLinkInput, +): void => { + if (input.path === null) return; + const asset = + context.assetNodes.get(input.path) ?? context.fileNodes.get(input.path); + if (asset === undefined) return; + context.accumulator.addEdge({ + source_node_id: input.role.node_id, + target_node_id: asset.node_id, + relation: "maps_to", + properties: { resolved_path: input.path }, + evidence: staticInferenceEvidence({ + sha256: input.anchor.sha256, + path: input.anchor.path, + operation: "resolve-electron-entrypoint", + coverage: input.coverage ?? completeReconstructionCoverage(), + ...(input.range === undefined ? {} : { range: input.range }), + }), + }); +}; + +/** Deterministic key for one recovered module inside a bundle asset. */ +export const moduleLookupKey = (path: string, moduleKey: string): string => + `${path}\0${moduleKey}`; + +/** Resolve a relative static specifier without escaping the artifact root. */ +export const resolveArtifactPath = ( + specifier: string, + sourcePath: string, + files: ReadonlyMap, +): string | null => { + const clean = specifier.split("#", 1)[0]?.split("?", 1)[0] ?? ""; + if (clean === "" || /^[A-Za-z][A-Za-z+.-]*:/u.test(clean)) return null; + if (!clean.startsWith(".") && !clean.startsWith("/")) return null; + const candidate = posix.normalize( + clean.startsWith("/") + ? clean.slice(1) + : posix.join(posix.dirname(sourcePath), clean), + ); + if (candidate === ".." || candidate.startsWith("../")) return null; + for (const path of pathCandidates(candidate)) + if (files.has(path)) return path; + return null; +}; + +/** Locate the recovered module that owns a static finding. */ +export const sourceNodeFor = ( + context: JavaScriptArtifactGraphContext, + path: string, + moduleKey: string | null, +): ApplicationNode | undefined => + moduleKey === null + ? undefined + : context.moduleNodes.get(moduleLookupKey(path, moduleKey)); + +const pathCandidates = (path: string): readonly string[] => [ + path, + `${path}.js`, + `${path}.mjs`, + `${path}.cjs`, + `${path}.ts`, + `${path}.tsx`, + `${path}.node`, + posix.join(path, "index.js"), + posix.join(path, "index.ts"), +]; + +/** Named AST budgets committed to graph evidence coverage. */ +export const javaScriptAnalysisLimits = ( + input: JavaScriptArtifactReconstructionInput, +) => [ + { + name: "max-ast-nodes", + value: input.limits.max_ast_nodes, + unit: "items" as const, + }, + { + name: "max-findings", + value: input.limits.max_findings, + unit: "items" as const, + }, + { + name: "max-modules", + value: input.limits.max_modules, + unit: "items" as const, + }, + { + name: "max-parse-milliseconds", + value: input.limits.max_parse_milliseconds, + unit: "milliseconds" as const, + }, +]; diff --git a/src/application/JavaScriptArtifactGraphDocuments.ts b/src/application/JavaScriptArtifactGraphDocuments.ts new file mode 100644 index 000000000..d088ad296 --- /dev/null +++ b/src/application/JavaScriptArtifactGraphDocuments.ts @@ -0,0 +1,134 @@ +import { + addArtifactContainsEdge, + addStaticInferenceEdge, + createElectronRoleNode, + resolveArtifactPath, + type JavaScriptArtifactGraphContext, +} from "./JavaScriptArtifactGraphContext.js"; +import { + artifactObservationEvidence, + completeReconstructionCoverage, + partialReconstructionCoverage, +} from "./JavaScriptArtifactGraphEvidence.js"; + +/** Project HTML renderer entrypoints and their local script assets. */ +export const addJavaScriptHtmlRoles = ( + context: JavaScriptArtifactGraphContext, +): void => { + const byHtml = new Map(); + for (const script of context.analysis.html_scripts) { + const existing = byHtml.get(script.html_path); + byHtml.set( + script.html_path, + existing === undefined ? [script] : [...existing, script], + ); + } + for (const [htmlPath, scripts] of byHtml) { + const html = context.filesByPath.get(htmlPath); + if (html === undefined) continue; + const role = createElectronRoleNode(context, { + kind: "electron-renderer", + anchor: html, + declaredPath: html.path, + resolvedPath: html.path, + mechanism: "html-script-entrypoint", + }); + addArtifactContainsEdge(context, { + source: context.root, + target: role, + file: html, + operation: "discover-html-renderer", + }); + for (const script of scripts) { + const resolvedPath = resolveArtifactPath( + script.script_path, + html.path, + context.filesByPath, + ); + if (resolvedPath === null) continue; + const resolved = context.fileNodes.get(resolvedPath); + if (resolved === undefined) continue; + addStaticInferenceEdge(context, { + source: role, + target: resolved, + file: html, + range: script.location, + coverage: completeReconstructionCoverage(), + relation: "loads", + properties: { + script_path: script.script_path, + resolved_path: resolvedPath, + }, + }); + } + } +}; + +/** Project original source names and optional content digests from approved maps. */ +export const addJavaScriptSourceMapOriginals = ( + context: JavaScriptArtifactGraphContext, +): void => { + for (const sourceMap of context.analysis.source_maps) { + const mapFile = context.filesByPath.get(sourceMap.path); + const mapNode = context.fileNodes.get(sourceMap.path); + if (mapFile === undefined || mapNode === undefined) continue; + const coverage = + sourceMap.status === "truncated" + ? partialReconstructionCoverage( + [ + { + name: "max-source-map-sources", + value: context.input.limits.max_source_map_sources, + unit: "items", + }, + ], + sourceMap.omitted_sources, + true, + ) + : completeReconstructionCoverage(); + for (const original of sourceMap.sources) { + const node = context.accumulator.addNode({ + kind: "source-module", + identity: { + strategy: "source-map-original", + stability: "source-map-exact", + source_map_sha256: mapFile.sha256, + original_source: original.source, + source_sha256: original.content_sha256, + }, + observations: [ + { + label: original.source, + properties: { + source: original.source, + content_available: original.content !== null, + source_sha256: original.content_sha256, + }, + evidence: artifactObservationEvidence({ + sha256: mapFile.sha256, + path: mapFile.path, + operation: "parse-local-source-map", + coverage, + limitations: + sourceMap.limitation === null ? [] : [sourceMap.limitation], + }), + }, + ], + }); + context.accumulator.addEdge({ + source_node_id: mapNode.node_id, + target_node_id: node.node_id, + relation: "contains", + properties: { original_source: original.source }, + evidence: artifactObservationEvidence({ + sha256: mapFile.sha256, + path: mapFile.path, + operation: "parse-local-source-map", + coverage, + limitations: + sourceMap.limitation === null ? [] : [sourceMap.limitation], + }), + }); + } + } +}; diff --git a/src/application/JavaScriptArtifactGraphEvidence.ts b/src/application/JavaScriptArtifactGraphEvidence.ts new file mode 100644 index 000000000..f99b77994 --- /dev/null +++ b/src/application/JavaScriptArtifactGraphEvidence.ts @@ -0,0 +1,130 @@ +import type { ApplicationGraphEvidence } from "../domain/javascriptApplicationEvidenceSchemas.js"; +import type { JavaScriptSourceRange } from "../domain/javascriptStaticAnalysisTypes.js"; + +const EXTRACTOR = { + name: "rea-javascript-artifact-reconstruction", + version: "1", + executable_sha256: null, +} as const; + +/** Coverage shape accepted by reconstruction evidence helpers. */ +export type ReconstructionEvidenceCoverage = + ApplicationGraphEvidence["coverage"]; + +/** Shared exact artifact location and bounded coverage for static evidence. */ +export interface EvidenceInput { + readonly sha256: string; + readonly path: string; + readonly operation: string; + readonly coverage: ReconstructionEvidenceCoverage; + readonly limitations?: readonly string[]; + readonly range?: JavaScriptSourceRange; +} + +/** Exact artifact-byte evidence for one safely inventoried local file. */ +export const artifactObservationEvidence = ( + input: EvidenceInput, +): ApplicationGraphEvidence => ({ + authority: "artifact-bytes", + state: "observed", + confidence: "exact", + artifact: artifactReference(input.sha256), + location: { + available: true, + value: { kind: "artifact-path", path: input.path }, + }, + extractor: { ...EXTRACTOR, operation: input.operation }, + coverage: input.coverage, + limitations: [...(input.limitations ?? [])], + evidence_ids: [], +}); + +/** Exact AST syntax evidence with an actionable source range. */ +export const astObservationEvidence = ( + input: EvidenceInput & { readonly range: JavaScriptSourceRange }, +): ApplicationGraphEvidence => ({ + authority: "ast-static-analysis", + state: "observed", + confidence: "exact", + artifact: artifactReference(input.sha256), + location: { + available: true, + value: { kind: "source-range", source: input.path, ...input.range }, + }, + extractor: { ...EXTRACTOR, operation: input.operation }, + coverage: input.coverage, + limitations: [...(input.limitations ?? [])], + evidence_ids: [], +}); + +/** Explicit static relationship inference; never promoted to observation. */ +export const staticInferenceEvidence = ( + input: EvidenceInput & { + readonly confidence?: "high" | "medium" | "low"; + }, +): ApplicationGraphEvidence => ({ + authority: "static-relationship-inference", + state: "inferred", + confidence: input.confidence ?? "high", + artifact: artifactReference(input.sha256), + location: + input.range === undefined + ? { available: true, value: { kind: "artifact-path", path: input.path } } + : { + available: true, + value: { kind: "source-range", source: input.path, ...input.range }, + }, + extractor: { ...EXTRACTOR, operation: input.operation }, + coverage: input.coverage, + limitations: [ + "Static syntax does not prove that this relationship executes at runtime.", + ...(input.limitations ?? []), + ], + evidence_ids: [], +}); + +/** Unavailable AST fact that preserves a parse, approval, or limit gap. */ +export const unavailableAstEvidence = ( + input: EvidenceInput & { readonly limitation: string }, +): ApplicationGraphEvidence => ({ + authority: "ast-static-analysis", + state: "unavailable", + confidence: "unknown", + artifact: artifactReference(input.sha256), + location: { + available: true, + value: { kind: "artifact-path", path: input.path }, + }, + extractor: { ...EXTRACTOR, operation: input.operation }, + coverage: input.coverage, + limitations: [input.limitation, ...(input.limitations ?? [])], + evidence_ids: [], +}); + +/** Complete local projection coverage under named hard limits. */ +export const completeReconstructionCoverage = ( + limits: ReconstructionEvidenceCoverage["limits"] = [], +): ReconstructionEvidenceCoverage => ({ + status: "complete", + truncated: false, + omitted_count: 0, + limits: [...limits], +}); + +/** Partial reconstruction coverage with either exact truncation or a policy gap. */ +export const partialReconstructionCoverage = ( + limits: ReconstructionEvidenceCoverage["limits"], + omitted: number | null, + truncated: boolean, +): ReconstructionEvidenceCoverage => ({ + status: "partial", + truncated, + omitted_count: omitted, + limits: [...limits], +}); + +const artifactReference = (sha256: string) => ({ + available: true as const, + artifact_id: `art_${sha256}`, + sha256, +}); diff --git a/src/application/JavaScriptArtifactGraphFindings.ts b/src/application/JavaScriptArtifactGraphFindings.ts new file mode 100644 index 000000000..b6aead6f2 --- /dev/null +++ b/src/application/JavaScriptArtifactGraphFindings.ts @@ -0,0 +1,380 @@ +import type { ApplicationNode } from "../domain/javascriptApplicationGraph.js"; +import type { JavaScriptStaticAnalysis } from "../domain/javascriptStaticAnalysisTypes.js"; +import type { JavaScriptArtifactFile } from "./JavaScriptArtifactFiles.js"; +import { + addStaticInferenceEdge, + artifactLocalIdentity, + createElectronRoleNode, + javascriptAnalysisCoverage, + linkElectronRoleToAsset, + moduleLookupKey, + resolveArtifactPath, + sourceNodeFor, + type JavaScriptArtifactGraphContext, + type JavaScriptArtifactGraphCoverage, +} from "./JavaScriptArtifactGraphContext.js"; +import { + astObservationEvidence, + staticInferenceEvidence, +} from "./JavaScriptArtifactGraphEvidence.js"; + +type StaticReference = JavaScriptStaticAnalysis["references"][number]; +type StaticEndpoint = JavaScriptStaticAnalysis["endpoints"][number]; +type StaticStorage = JavaScriptStaticAnalysis["storage"][number]; +type StaticRolePath = JavaScriptStaticAnalysis["role_paths"][number]; +type StaticSourceMap = JavaScriptStaticAnalysis["source_map_urls"][number]; + +interface FindingInput { + readonly file: JavaScriptArtifactFile; + readonly asset: ApplicationNode; + readonly value: Value; + readonly coverage: JavaScriptArtifactGraphCoverage; +} + +interface ResolvedReference { + readonly path: string; + readonly file: JavaScriptArtifactFile; + readonly node: ApplicationNode; +} + +/** Project imports, workers, roles, endpoints, storage, and source-map links. */ +export const addJavaScriptStaticFindings = ( + context: JavaScriptArtifactGraphContext, +): void => { + for (const analyzed of context.analysis.files) { + const { file, javascript } = analyzed; + const asset = context.assetNodes.get(file.path); + if (javascript === null || asset === undefined) continue; + const coverage = javascriptAnalysisCoverage(javascript, context.input); + for (const value of javascript.references) + addReference(context, { file, asset, value, coverage }); + for (const value of javascript.endpoints) + addEndpoint(context, { file, asset, value, coverage }); + for (const value of javascript.storage) + addStorage(context, { file, asset, value, coverage }); + for (const value of javascript.role_paths) + addDiscoveredRole(context, { file, asset, value, coverage }); + for (const value of javascript.source_map_urls) + addSourceMapEdge(context, { file, asset, value, coverage }); + } +}; + +const addReference = ( + context: JavaScriptArtifactGraphContext, + input: FindingInput, +): void => { + const source = + sourceNodeFor(context, input.file.path, input.value.module_key) ?? + input.asset; + const resolved = + input.value.specifier === null + ? null + : resolveReference(context, input.file.path, input.value.specifier); + if (input.value.kind === "worker" || input.value.kind === "service-worker") { + const worker = context.accumulator.addNode({ + kind: input.value.kind === "worker" ? "worker" : "service-worker", + identity: artifactLocalIdentity( + input.file.sha256, + input.value.kind, + input.value.specifier ?? input.value.expression ?? "[dynamic]", + ), + observations: [ + { + label: input.value.specifier, + properties: { + declared_specifier: input.value.specifier, + expression: input.value.expression, + resolved_path: resolved?.path ?? null, + }, + evidence: staticInferenceEvidence({ + sha256: input.file.sha256, + path: input.file.path, + range: input.value.location, + operation: "discover-worker", + coverage: input.coverage, + }), + }, + ], + }); + addStaticInferenceEdge(context, { + source, + target: worker, + file: input.file, + range: input.value.location, + coverage: input.coverage, + relation: "loads", + properties: { kind: input.value.kind }, + }); + if (resolved !== null) + addStaticInferenceEdge(context, { + source: worker, + target: resolved.node, + file: input.file, + range: input.value.location, + coverage: input.coverage, + relation: "maps_to", + properties: { resolved_path: resolved.path }, + }); + return; + } + const target = + resolved?.node ?? + unresolvedReferenceNode(context, input.file, input.value, input.coverage); + addStaticInferenceEdge(context, { + source, + target, + file: input.file, + range: input.value.location, + coverage: input.coverage, + relation: resolved?.file.kind === "native-addon" ? "loads" : "imports", + properties: { + kind: input.value.kind, + specifier: input.value.specifier, + expression: input.value.expression, + resolved_path: resolved?.path ?? null, + }, + }); +}; + +const addEndpoint = ( + context: JavaScriptArtifactGraphContext, + input: FindingInput, +): void => { + const source = + sourceNodeFor(context, input.file.path, input.value.module_key) ?? + input.asset; + const node = context.accumulator.addNode({ + kind: "endpoint", + identity: artifactLocalIdentity( + input.file.sha256, + input.value.kind, + input.value.value, + ), + observations: [ + { + label: input.value.value, + properties: { + endpoint_kind: input.value.kind, + value: input.value.value, + mechanism: input.value.mechanism, + }, + evidence: astObservationEvidence({ + sha256: input.file.sha256, + path: input.file.path, + range: input.value.location, + operation: "discover-static-endpoint", + coverage: input.coverage, + }), + }, + ], + }); + addStaticInferenceEdge(context, { + source, + target: node, + file: input.file, + range: input.value.location, + coverage: input.coverage, + relation: input.value.kind === "route" ? "exposes" : "calls", + properties: { mechanism: input.value.mechanism }, + }); +}; + +const addStorage = ( + context: JavaScriptArtifactGraphContext, + input: FindingInput, +): void => { + const source = + sourceNodeFor(context, input.file.path, input.value.module_key) ?? + input.asset; + const node = context.accumulator.addNode({ + kind: "storage", + identity: artifactLocalIdentity( + input.file.sha256, + input.value.kind, + input.value.name ?? input.value.mechanism, + ), + observations: [ + { + label: input.value.name ?? input.value.kind, + properties: { + storage_kind: input.value.kind, + name: input.value.name, + mechanism: input.value.mechanism, + }, + evidence: astObservationEvidence({ + sha256: input.file.sha256, + path: input.file.path, + range: input.value.location, + operation: "discover-static-storage", + coverage: input.coverage, + }), + }, + ], + }); + addStaticInferenceEdge(context, { + source, + target: node, + file: input.file, + range: input.value.location, + coverage: input.coverage, + relation: "persists_to", + properties: { mechanism: input.value.mechanism }, + }); +}; + +const addDiscoveredRole = ( + context: JavaScriptArtifactGraphContext, + input: FindingInput, +): void => { + const resolvedPath = resolveArtifactPath( + input.value.path, + input.file.path, + context.filesByPath, + ); + const role = createElectronRoleNode(context, { + kind: + input.value.role === "preload" ? "electron-preload" : "electron-renderer", + anchor: input.file, + declaredPath: input.value.path, + resolvedPath, + mechanism: input.value.mechanism, + range: input.value.location, + coverage: input.coverage, + }); + const source = + sourceNodeFor(context, input.file.path, input.value.module_key) ?? + input.asset; + addStaticInferenceEdge(context, { + source, + target: role, + file: input.file, + range: input.value.location, + coverage: input.coverage, + relation: "loads", + properties: { mechanism: input.value.mechanism }, + }); + linkElectronRoleToAsset(context, { + role, + anchor: input.file, + path: resolvedPath, + range: input.value.location, + coverage: input.coverage, + }); +}; + +const addSourceMapEdge = ( + context: JavaScriptArtifactGraphContext, + input: FindingInput, +): void => { + const resolvedPath = resolveArtifactPath( + input.value.declared_url, + input.file.path, + context.filesByPath, + ); + const resolvedFile = + resolvedPath === null ? undefined : context.filesByPath.get(resolvedPath); + const resolvedNode = + resolvedPath === null ? undefined : context.fileNodes.get(resolvedPath); + const target = + resolvedFile?.kind === "source-map" && resolvedNode !== undefined + ? resolvedNode + : context.accumulator.addNode({ + kind: "source-map", + identity: artifactLocalIdentity( + input.file.sha256, + "unresolved-source-map", + input.value.declared_url, + ), + observations: [ + { + label: input.value.declared_url, + properties: { + declared_url: input.value.declared_url, + resolved_path: resolvedPath, + available: false, + }, + evidence: staticInferenceEvidence({ + sha256: input.file.sha256, + path: input.file.path, + range: input.value.location, + operation: "discover-source-map", + coverage: input.coverage, + confidence: "medium", + limitations: [ + "The declared source map was not present in the inventoried artifact.", + ], + }), + }, + ], + }); + addStaticInferenceEdge(context, { + source: input.asset, + target, + file: input.file, + range: input.value.location, + coverage: input.coverage, + relation: "maps_to", + properties: { + declared_url: input.value.declared_url, + resolved_path: resolvedPath, + }, + }); +}; + +const resolveReference = ( + context: JavaScriptArtifactGraphContext, + sourcePath: string, + specifier: string, +): ResolvedReference | null => { + const module = context.moduleNodes.get( + moduleLookupKey(sourcePath, specifier), + ); + if (module !== undefined) { + const file = context.filesByPath.get(sourcePath); + return file === undefined + ? null + : { path: `${sourcePath}#module:${specifier}`, file, node: module }; + } + const path = resolveArtifactPath(specifier, sourcePath, context.filesByPath); + if (path === null) return null; + const file = context.filesByPath.get(path); + const node = context.fileNodes.get(path); + return file === undefined || node === undefined ? null : { path, file, node }; +}; + +const unresolvedReferenceNode = ( + context: JavaScriptArtifactGraphContext, + file: JavaScriptArtifactFile, + reference: StaticReference, + coverage: JavaScriptArtifactGraphCoverage, +): ApplicationNode => + context.accumulator.addNode({ + kind: "javascript-module", + identity: artifactLocalIdentity( + file.sha256, + "unresolved-reference", + `${reference.kind}:${reference.specifier ?? reference.expression ?? "[dynamic]"}`, + ), + observations: [ + { + label: reference.specifier, + properties: { + reference_kind: reference.kind, + specifier: reference.specifier, + expression: reference.expression, + resolution: "unresolved", + }, + evidence: staticInferenceEvidence({ + sha256: file.sha256, + path: file.path, + range: reference.location, + operation: "resolve-static-reference", + coverage, + confidence: "low", + limitations: [ + "The static reference could not be resolved within the inventoried artifact.", + ], + }), + }, + ], + }); diff --git a/src/application/JavaScriptArtifactGraphStructure.ts b/src/application/JavaScriptArtifactGraphStructure.ts new file mode 100644 index 000000000..51f7fbdf5 --- /dev/null +++ b/src/application/JavaScriptArtifactGraphStructure.ts @@ -0,0 +1,501 @@ +import type { ArtifactInventorySnapshot } from "./ArtifactInventory.js"; +import type { ApplicationNode } from "../domain/javascriptApplicationGraph.js"; +import type { JavaScriptArtifactAnalysis } from "./JavaScriptArtifactAnalysisTypes.js"; +import type { + JavaScriptArtifactContainer, + JavaScriptArtifactFile, + JavaScriptArtifactFileKind, +} from "./JavaScriptArtifactFiles.js"; +import type { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js"; +import { + addArtifactContainsEdge, + addAstContainsEdge, + addUnavailableStaticParseScope, + artifactLocalIdentity, + createElectronRoleNode, + javascriptAnalysisCoverage, + linkElectronRoleToAsset, + moduleLookupKey, + resolveArtifactPath, + type JavaScriptArtifactGraphContext, +} from "./JavaScriptArtifactGraphContext.js"; +import { + artifactObservationEvidence, + astObservationEvidence, + completeReconstructionCoverage, + staticInferenceEvidence, +} from "./JavaScriptArtifactGraphEvidence.js"; + +interface PackageRoleInput { + readonly packageNode: ApplicationNode; + readonly packageFile: JavaScriptArtifactFile; + readonly kind: "electron-main" | "electron-renderer"; + readonly declaredPath: string | null; +} + +/** Create the exact root artifact node from the inventory manifest. */ +export const createJavaScriptArtifactRootNode = ( + accumulator: JavaScriptArtifactGraphAccumulator, + snapshot: ArtifactInventorySnapshot, +): ApplicationNode => { + const root = snapshot.nodes.find( + ({ artifact_id: id }) => id === snapshot.manifest.root_artifact_id, + ); + if (root === undefined) + throw new TypeError("Artifact inventory root is missing"); + return accumulator.addNode({ + kind: "artifact", + identity: { + strategy: "content-digest", + stability: "global-exact", + sha256: root.sha256, + }, + observations: [ + { + label: "artifact root", + properties: { + format: snapshot.manifest.root_format, + bytes: root.size, + inventory_manifest_id: snapshot.manifest.manifest_id, + inventory_graph_sha256: snapshot.manifest.graph_sha256, + inventory_artifact_id: root.artifact_id, + }, + evidence: artifactObservationEvidence({ + sha256: root.sha256, + path: "artifact-root", + operation: "inventory-root", + coverage: completeReconstructionCoverage(), + limitations: [ + "artifact-root is a path-independent alias; the application result retains the canonical local input path.", + ], + }), + }, + ], + }); +}; + +/** Project nested ASAR containers inventoried inside a directory. */ +export const addJavaScriptArtifactContainers = ( + context: JavaScriptArtifactGraphContext, +): void => { + for (const container of context.fileSet.containers) { + const node = context.accumulator.addNode({ + kind: "artifact", + identity: { + strategy: "content-digest", + stability: "global-exact", + sha256: container.sha256, + }, + observations: [ + { + label: container.path, + properties: containerProperties(container), + evidence: artifactObservationEvidence({ + sha256: container.sha256, + path: container.path, + operation: "inventory-nested-asar", + coverage: completeReconstructionCoverage(), + }), + }, + ], + }); + context.containerNodes.set(container.sha256, node); + context.accumulator.addEdge({ + source_node_id: context.root.node_id, + target_node_id: node.node_id, + relation: "contains", + properties: { path: container.path, format: "asar" }, + evidence: artifactObservationEvidence({ + sha256: context.snapshot.manifest.root_sha256, + path: container.path, + operation: "inventory-nested-asar", + coverage: completeReconstructionCoverage(), + }), + }); + } +}; + +/** Project relevant files, ASAR entries, and explicit unavailable parse scopes. */ +export const addJavaScriptArtifactFiles = ( + context: JavaScriptArtifactGraphContext, +): void => { + for (const analyzed of context.analysis.files) { + const { file } = analyzed; + const target = createFileTarget(context, file, analyzed.javascript); + context.fileNodes.set(file.path, target); + if (file.kind === "javascript") context.assetNodes.set(file.path, target); + const entry = createAsarEntry(context, file); + const parent = + context.containerNodes.get(file.container_sha256) ?? context.root; + if (entry === undefined) + addArtifactContainsEdge(context, { + source: parent, + target, + file, + operation: "inventory-file", + }); + else { + addArtifactContainsEdge(context, { + source: parent, + target: entry, + file, + operation: "inventory-entry", + }); + context.accumulator.addEdge({ + source_node_id: entry.node_id, + target_node_id: target.node_id, + relation: "maps_to", + properties: { sha256: file.sha256 }, + evidence: artifactObservationEvidence({ + sha256: file.container_sha256, + path: file.path, + operation: "map-entry-content", + coverage: completeReconstructionCoverage(), + }), + }); + } + if ( + file.kind === "javascript" && + (analyzed.javascript === null || + analyzed.javascript.parse_status === "failed") + ) + addUnavailableStaticParseScope(context, { + file, + asset: target, + operation: "parse-javascript", + limitation: file.text.included + ? "JavaScript syntax could not be parsed." + : `JavaScript text was unavailable: ${file.text.reason}.`, + }); + const packageValue = context.analysis.packages.find( + ({ path }) => path === file.path, + ); + if ( + packageValue?.status !== undefined && + packageValue.status !== "included" + ) + addUnavailableStaticParseScope(context, { + file, + asset: target, + operation: "parse-package-json", + limitation: + packageValue.limitation ?? "Package metadata could not be parsed.", + }); + const sourceMap = context.analysis.source_maps.find( + ({ path }) => path === file.path, + ); + if ( + sourceMap !== undefined && + (sourceMap.status === "invalid" || sourceMap.status === "not-approved") + ) + addUnavailableStaticParseScope(context, { + file, + asset: target, + operation: "parse-local-source-map", + limitation: + sourceMap.limitation ?? "Source-map content could not be parsed.", + }); + } +}; + +/** Project package metadata and its declared Electron roles. */ +export const addJavaScriptPackageNodes = ( + context: JavaScriptArtifactGraphContext, +): ApplicationNode[] => { + const roots: ApplicationNode[] = []; + for (const packageValue of context.analysis.packages) { + const file = context.filesByPath.get(packageValue.path); + if (file === undefined) continue; + const node = context.accumulator.addNode({ + kind: "package", + identity: artifactLocalIdentity(file.sha256, "package-json", file.path), + observations: [ + { + label: packageValue.name ?? file.path, + properties: { + path: file.path, + name: packageValue.name, + version: packageValue.version, + main: packageValue.main, + renderer: packageValue.renderer, + parse_status: packageValue.status, + }, + evidence: artifactObservationEvidence({ + sha256: file.sha256, + path: file.path, + operation: "parse-package-json", + coverage: completeReconstructionCoverage(), + limitations: + packageValue.limitation === null ? [] : [packageValue.limitation], + }), + }, + ], + }); + if (roots.length === 0) { + roots.push(node); + context.accumulator.addEdge({ + source_node_id: node.node_id, + target_node_id: context.root.node_id, + relation: "contains", + properties: { basis: "package-metadata-within-artifact" }, + evidence: staticInferenceEvidence({ + sha256: file.sha256, + path: file.path, + operation: "associate-package-artifact", + coverage: completeReconstructionCoverage(), + }), + }); + } else + addArtifactContainsEdge(context, { + source: context.root, + target: node, + file, + operation: "inventory-package", + }); + addPackageRole(context, { + packageNode: node, + packageFile: file, + kind: "electron-main", + declaredPath: packageValue.main, + }); + addPackageRole(context, { + packageNode: node, + packageFile: file, + kind: "electron-renderer", + declaredPath: packageValue.renderer, + }); + } + return roots; +}; + +/** Project Webpack/Rspack chunk and factory literals recovered from AST. */ +export const addJavaScriptBundlerNodes = ( + context: JavaScriptArtifactGraphContext, +): void => { + for (const analyzed of context.analysis.files) { + const { file, javascript } = analyzed; + const asset = context.assetNodes.get(file.path); + if (javascript === null || asset === undefined) continue; + const coverage = javascriptAnalysisCoverage(javascript, context.input); + for (const registration of javascript.bundler_registrations) { + const chunkKey = `${registration.runtime}:${registration.chunk_keys.join(",")}`; + const chunk = context.accumulator.addNode({ + kind: "javascript-chunk", + identity: artifactLocalIdentity(file.sha256, "bundler-chunk", chunkKey), + observations: [ + { + label: chunkKey, + properties: { + path: file.path, + bundler: registration.bundler, + runtime: registration.runtime, + chunk_keys: registration.chunk_keys, + omitted_chunk_keys: registration.omitted_chunk_keys, + unknown_chunk_keys: registration.unknown_chunk_keys, + module_count: registration.modules.length, + }, + evidence: astObservationEvidence({ + sha256: file.sha256, + path: file.path, + range: registration.location, + operation: "extract-bundler-registration", + coverage, + limitations: javascript.limitations, + }), + }, + ], + }); + addAstContainsEdge(context, { + source: asset, + target: chunk, + file, + range: registration.location, + coverage, + properties: { bundler: registration.bundler }, + }); + for (const moduleValue of registration.modules) { + const module = context.accumulator.addNode({ + kind: "javascript-module", + identity: artifactLocalIdentity( + file.sha256, + `${registration.runtime}:module`, + moduleValue.module_key, + ), + observations: [ + { + label: moduleValue.module_key, + properties: { + path: file.path, + bundler: registration.bundler, + runtime: registration.runtime, + module_key: moduleValue.module_key, + source_sha256: moduleValue.source_sha256, + structural_fingerprint_sha256: + moduleValue.structural_fingerprint_sha256, + structural_fingerprint_algorithm: + moduleValue.structural_fingerprint_algorithm, + structural_fingerprint_status: + moduleValue.structural_fingerprint_status, + exports: moduleValue.exports, + exports_truncated: moduleValue.exports_truncated, + }, + evidence: astObservationEvidence({ + sha256: file.sha256, + path: file.path, + range: moduleValue.location, + operation: "extract-bundler-module", + coverage, + limitations: javascript.limitations, + }), + }, + ], + }); + context.moduleNodes.set( + moduleLookupKey(file.path, moduleValue.module_key), + module, + ); + addAstContainsEdge(context, { + source: chunk, + target: module, + file, + range: moduleValue.location, + coverage, + properties: { module_key: moduleValue.module_key }, + }); + } + } + } +}; + +const createFileTarget = ( + context: JavaScriptArtifactGraphContext, + file: JavaScriptArtifactFile, + javascript: JavaScriptArtifactAnalysis["files"][number]["javascript"], +): ApplicationNode => { + const kind = artifactFileNodeKind(file.kind); + return context.accumulator.addNode({ + kind, + identity: { + strategy: "content-digest", + stability: "global-exact", + sha256: file.sha256, + }, + observations: [ + { + label: file.path, + properties: { + path: file.path, + bytes: file.bytes, + inventory_artifact_id: file.inventory_artifact_id, + unpacked: file.unpacked, + file_kind: file.kind, + text_status: file.text.included ? "included" : file.text.reason, + parse_status: javascript?.parse_status ?? null, + vendor_markers: javascript?.vendors ?? [], + }, + evidence: artifactObservationEvidence({ + sha256: file.sha256, + path: file.path, + operation: "inventory-relevant-file", + coverage: completeReconstructionCoverage(), + }), + }, + ], + }); +}; + +const artifactFileNodeKind = ( + kind: JavaScriptArtifactFileKind, +): ApplicationNode["kind"] => + kind === "javascript" + ? "javascript-asset" + : kind === "source-map" + ? "source-map" + : kind === "native-addon" + ? "native-addon" + : "artifact"; + +const createAsarEntry = ( + context: JavaScriptArtifactGraphContext, + file: JavaScriptArtifactFile, +): ApplicationNode | undefined => { + const isAsar = + context.snapshot.manifest.root_format === "asar" || + file.container_sha256 !== context.snapshot.manifest.root_sha256; + if (!isAsar) return undefined; + return context.accumulator.addNode({ + kind: "asar-entry", + identity: { + strategy: "canonical-path", + stability: "artifact-version", + artifact_sha256: file.container_sha256, + path: file.path, + }, + observations: [ + { + label: file.path, + properties: { + entry_sha256: file.sha256, + bytes: file.bytes, + unpacked: file.unpacked, + inventory_artifact_id: file.inventory_artifact_id, + }, + evidence: artifactObservationEvidence({ + sha256: file.container_sha256, + path: file.path, + operation: "inventory-asar-entry", + coverage: completeReconstructionCoverage(), + }), + }, + ], + }); +}; + +const addPackageRole = ( + context: JavaScriptArtifactGraphContext, + input: PackageRoleInput, +): void => { + if (input.declaredPath === null) return; + const resolvedPath = resolveArtifactPath( + input.declaredPath, + input.packageFile.path, + context.filesByPath, + ); + const role = createElectronRoleNode(context, { + kind: input.kind, + anchor: input.packageFile, + declaredPath: input.declaredPath, + resolvedPath, + mechanism: + input.kind === "electron-main" + ? "package.json:main" + : "package.json:renderer", + }); + context.accumulator.addEdge({ + source_node_id: input.packageNode.node_id, + target_node_id: role.node_id, + relation: "loads", + properties: { + declared_path: input.declaredPath, + resolved_path: resolvedPath, + }, + evidence: staticInferenceEvidence({ + sha256: input.packageFile.sha256, + path: input.packageFile.path, + operation: "discover-package-entrypoint", + coverage: completeReconstructionCoverage(), + }), + }); + linkElectronRoleToAsset(context, { + role, + anchor: input.packageFile, + path: resolvedPath, + }); +}; + +const containerProperties = (container: JavaScriptArtifactContainer) => ({ + path: container.path, + format: "asar", + bytes: container.bytes, + inventory_artifact_id: container.inventory_artifact_id, +}); diff --git a/src/application/JavaScriptArtifactReconstruction.ts b/src/application/JavaScriptArtifactReconstruction.ts new file mode 100644 index 000000000..28e41f6b1 --- /dev/null +++ b/src/application/JavaScriptArtifactReconstruction.ts @@ -0,0 +1,152 @@ +import { lstat, realpath } from "node:fs/promises"; +import { performance } from "node:perf_hooks"; + +import { AsarArtifactReader } from "../artifacts/AsarArtifactReader.js"; +import { + ArtifactReaderFailure, + type ArtifactReader, +} from "../artifacts/ArtifactReader.js"; +import { DirectoryArtifactReader } from "../artifacts/DirectoryArtifactReader.js"; +import type { JavaScriptApplicationGraph } from "../domain/javascriptApplicationGraph.js"; +import { analyzeJavaScriptArtifactFiles } from "./JavaScriptArtifactAnalysis.js"; +import { readJavaScriptArtifactFiles } from "./JavaScriptArtifactFiles.js"; +import { buildJavaScriptArtifactGraph } from "./JavaScriptArtifactGraphBuilder.js"; +import { + artifactLimitsForReconstruction, + javascriptArtifactReconstructionInputSchema, + type JavaScriptArtifactReconstructionInput, +} from "./JavaScriptArtifactReconstructionInput.js"; +import { scanCanonicalArtifactInventory } from "./ArtifactInventory.js"; + +/** Application-layer result retaining local diagnostics outside the canonical graph. */ +export interface JavaScriptArtifactReconstructionResult { + readonly input_path: string; + readonly format: "asar" | "directory"; + readonly inventory_manifest_id: string; + readonly inventory_graph_sha256: string; + readonly graph: JavaScriptApplicationGraph; + readonly statistics: { + readonly relevant_files: number; + readonly nested_asar_containers: number; + readonly text_files_selected: number; + readonly text_bytes_read: number; + readonly omitted_text_files: number; + readonly limit_omitted_text_files: number; + readonly policy_filtered_text_files: number; + readonly invalid_utf8_files: number; + readonly parsed_javascript_files: number; + readonly visited_ast_nodes: number; + readonly findings: number; + readonly modules: number; + readonly parse_failures: number; + readonly truncated_scopes: number; + }; + readonly limitations: readonly string[]; +} + +/** Reconstruct one local ASAR or extracted directory without executing code. */ +export const reconstructJavaScriptArtifact = async ( + rawInput: unknown, + signal?: AbortSignal, +): Promise => { + const input = javascriptArtifactReconstructionInputSchema.parse(rawInput); + abortIfNeeded(signal); + const path = await realpath(input.input_path); + const format = await resolveFormat(path, input); + const snapshot = await scanCanonicalArtifactInventory( + path, + artifactLimitsForReconstruction(input), + signal, + ); + if (snapshot.manifest.root_format !== format) + throw new ArtifactReaderFailure( + "format", + `Artifact inventory classified ${path} as ${snapshot.manifest.root_format}, not ${format}`, + ); + const reader = createReader(path, format); + try { + const files = await readJavaScriptArtifactFiles( + reader, + snapshot, + input, + signal, + ); + const analysis = analyzeJavaScriptArtifactFiles(files, input, () => + performance.now(), + ); + abortIfNeeded(signal); + const graph = buildJavaScriptArtifactGraph( + snapshot, + files, + analysis, + input, + ); + return { + input_path: path, + format, + inventory_manifest_id: snapshot.manifest.manifest_id, + inventory_graph_sha256: snapshot.manifest.graph_sha256, + graph, + statistics: { + relevant_files: files.files.length, + nested_asar_containers: files.containers.length, + text_files_selected: files.text_files_selected, + text_bytes_read: files.text_bytes_read, + omitted_text_files: files.omitted_text_files, + limit_omitted_text_files: files.limit_omitted_text_files, + policy_filtered_text_files: files.policy_filtered_text_files, + invalid_utf8_files: files.invalid_utf8_files, + parsed_javascript_files: analysis.files.filter( + ({ javascript }) => javascript !== null, + ).length, + visited_ast_nodes: analysis.visited_ast_nodes, + findings: analysis.findings, + modules: analysis.modules, + parse_failures: analysis.parse_failures, + truncated_scopes: analysis.truncated_scopes, + }, + limitations: analysis.limitations, + }; + } finally { + await reader.close(); + } +}; + +const resolveFormat = async ( + path: string, + input: JavaScriptArtifactReconstructionInput, +): Promise<"asar" | "directory"> => { + const metadata = await lstat(path); + const observed = metadata.isDirectory() + ? "directory" + : metadata.isFile() && path.toLowerCase().endsWith(".asar") + ? "asar" + : undefined; + if (observed === undefined) + throw new ArtifactReaderFailure( + "format", + `JavaScript artifact reconstruction accepts only a directory or .asar file: ${path}`, + ); + if (input.format !== "auto" && input.format !== observed) + throw new ArtifactReaderFailure( + "format", + `Requested ${input.format} input but observed ${observed}: ${path}`, + ); + return observed; +}; + +const createReader = ( + path: string, + format: "asar" | "directory", +): ArtifactReader => + format === "asar" + ? new AsarArtifactReader(path) + : new DirectoryArtifactReader(path); + +const abortIfNeeded = (signal?: AbortSignal): void => { + if (signal?.aborted === true) + throw new ArtifactReaderFailure( + "cancelled", + "JavaScript artifact reconstruction cancelled", + ); +}; diff --git a/src/application/JavaScriptArtifactReconstructionInput.ts b/src/application/JavaScriptArtifactReconstructionInput.ts new file mode 100644 index 000000000..979fad326 --- /dev/null +++ b/src/application/JavaScriptArtifactReconstructionInput.ts @@ -0,0 +1,116 @@ +import { z } from "zod"; + +import type { ArtifactLimits } from "../artifacts/ArtifactReader.js"; + +const MAX_GRAPH_NODES = 100_000; +const MAX_GRAPH_EDGES = 200_000; + +const reconstructionLimitsSchema = z + .strictObject({ + max_entries: z.number().int().min(1).max(1_000_000).default(8_000), + max_total_artifact_bytes: z + .number() + .int() + .min(1) + .max(Number.MAX_SAFE_INTEGER) + .default(512 * 1_024 * 1_024), + max_artifact_entry_bytes: z + .number() + .int() + .min(1) + .max(Number.MAX_SAFE_INTEGER) + .default(128 * 1_024 * 1_024), + max_compression_ratio: z.number().min(1).max(100_000).default(1_000), + max_depth: z.number().int().min(1).max(100).default(64), + max_path_bytes: z.number().int().min(1).max(65_535).default(4_096), + max_text_files: z.number().int().min(1).max(100_000).default(5_000), + max_total_text_bytes: z + .number() + .int() + .min(1) + .max(512 * 1_024 * 1_024) + .default(128 * 1_024 * 1_024), + max_text_file_bytes: z + .number() + .int() + .min(1) + .max(64 * 1_024 * 1_024) + .default(8 * 1_024 * 1_024), + max_ast_nodes: z.number().int().min(1).max(20_000_000).default(2_000_000), + max_findings: z.number().int().min(1).max(200_000).default(10_000), + max_modules: z.number().int().min(1).max(100_000).default(20_000), + max_source_map_sources: z.number().int().min(1).max(100_000).default(5_000), + max_parse_milliseconds: z + .number() + .int() + .min(1) + .max(300_000) + .default(30_000), + }) + .superRefine((limits, context) => { + const projectedNodes = + 7 * limits.max_entries + + limits.max_findings + + limits.max_modules + + limits.max_source_map_sources + + 1; + if (projectedNodes > MAX_GRAPH_NODES) + context.addIssue({ + code: "custom", + path: ["max_entries"], + message: + "Combined reconstruction limits can exceed the 100000-node graph contract", + }); + const projectedEdges = + 9 * limits.max_entries + + 5 * limits.max_findings + + limits.max_modules + + limits.max_source_map_sources; + if (projectedEdges > MAX_GRAPH_EDGES) + context.addIssue({ + code: "custom", + path: ["max_entries"], + message: + "Combined reconstruction limits can exceed the 200000-edge graph contract", + }); + }); + +/** Local ASAR/directory reconstruction request with explicit source-map authority. */ +export const javascriptArtifactReconstructionInputSchema = z.strictObject({ + input_path: z.string().min(1).max(16_384), + format: z.enum(["auto", "asar", "directory"]).default("auto"), + source_map_read_approved: z.boolean().default(false), + limits: reconstructionLimitsSchema.default({ + max_entries: 8_000, + max_total_artifact_bytes: 512 * 1_024 * 1_024, + max_artifact_entry_bytes: 128 * 1_024 * 1_024, + max_compression_ratio: 1_000, + max_depth: 64, + max_path_bytes: 4_096, + max_text_files: 5_000, + max_total_text_bytes: 128 * 1_024 * 1_024, + max_text_file_bytes: 8 * 1_024 * 1_024, + max_ast_nodes: 2_000_000, + max_findings: 10_000, + max_modules: 20_000, + max_source_map_sources: 5_000, + max_parse_milliseconds: 30_000, + }), +}); + +/** Parsed bounded reconstruction request. */ +export type JavaScriptArtifactReconstructionInput = z.infer< + typeof javascriptArtifactReconstructionInputSchema +>; + +/** Project reconstruction limits into the shared artifact traversal policy. */ +export const artifactLimitsForReconstruction = ( + input: JavaScriptArtifactReconstructionInput, +): ArtifactLimits => ({ + maxEntries: input.limits.max_entries, + maxTotalBytes: input.limits.max_total_artifact_bytes, + maxEntryBytes: input.limits.max_artifact_entry_bytes, + maxCompressionRatio: input.limits.max_compression_ratio, + maxDepth: input.limits.max_depth, + maxPathBytes: input.limits.max_path_bytes, +}); diff --git a/src/artifacts/AsarArtifactReader.ts b/src/artifacts/AsarArtifactReader.ts index 698bc4ac3..44394c350 100644 --- a/src/artifacts/AsarArtifactReader.ts +++ b/src/artifacts/AsarArtifactReader.ts @@ -21,14 +21,24 @@ export class AsarArtifactReader implements ArtifactReader { constructor(private readonly path: string) {} async *entries(signal?: AbortSignal): AsyncIterable { - const paths = listPackage(this.path, { isPack: false }).sort( - (left, right) => left.localeCompare(right, "en"), - ); + let paths: string[]; + try { + paths = listPackage(this.path, { isPack: false }).sort((left, right) => + left.localeCompare(right, "en"), + ); + } catch (cause: unknown) { + throw asarFailure(this.path, "inventory", cause); + } for (const listed of paths) { abortIfNeeded(signal); const path = listed.replace(/^\/+|\/+$/gu, ""); if (path.length === 0) continue; - const metadata = statFile(this.path, path, false); + let metadata: ReturnType; + try { + metadata = statFile(this.path, path, false); + } catch (cause: unknown) { + throw asarFailure(this.path, `stat ${path}`, cause); + } const kind = "files" in metadata ? "directory" @@ -67,9 +77,15 @@ export class AsarArtifactReader implements ArtifactReader { return Promise.reject( new ArtifactReaderFailure("format", "ASAR entry is not a regular file"), ); - return Promise.resolve( - Readable.from(extractFile(this.path, entry.adapterKey, false)), - ); + try { + return Promise.resolve( + Readable.from(extractFile(this.path, entry.adapterKey, false)), + ); + } catch (cause: unknown) { + return Promise.reject( + asarFailure(this.path, `read ${entry.path}`, cause), + ); + } } close(): Promise { @@ -85,3 +101,16 @@ const abortIfNeeded = (signal?: AbortSignal): void => { if (signal?.aborted === true) throw new ArtifactReaderFailure("cancelled", "ASAR operation cancelled"); }; + +const asarFailure = ( + path: string, + operation: string, + cause: unknown, +): ArtifactReaderFailure => + cause instanceof ArtifactReaderFailure + ? cause + : new ArtifactReaderFailure( + "format", + `Malformed or unreadable ASAR during ${operation}: ${path}`, + { cause }, + ); diff --git a/src/domain/javascriptAstFingerprint.ts b/src/domain/javascriptAstFingerprint.ts new file mode 100644 index 000000000..9c185ac03 --- /dev/null +++ b/src/domain/javascriptAstFingerprint.ts @@ -0,0 +1,186 @@ +import { createHash } from "node:crypto"; + +import * as t from "@babel/types"; + +/** Complete or prefix-only digest from a bounded AST traversal. */ +export interface AstFingerprint { + readonly sha256: string; + readonly truncated: boolean; +} + +/** Bounded static CommonJS export names. */ +export interface StaticExports { + readonly values: readonly string[]; + readonly truncated: boolean; +} + +/** Derive a rename-resistant, bounded syntax fingerprint without code execution. */ +export const fingerprintJavaScriptAst = ( + node: t.Node, + maximumTokens: number, +): AstFingerprint => { + const tokens: string[] = []; + let truncated = false; + t.traverseFast(node, (current) => { + if (tokens.length >= maximumTokens) { + truncated = true; + return t.traverseFast.stop; + } + tokens.push(...semanticTokens(current)); + if (tokens.length > maximumTokens) { + tokens.length = maximumTokens; + truncated = true; + return t.traverseFast.stop; + } + return undefined; + }); + return { + sha256: createHash("sha256").update(JSON.stringify(tokens)).digest("hex"), + truncated, + }; +}; + +/** Collect statically declared CommonJS/bundler export names from one factory. */ +export const collectJavaScriptExports = ( + node: t.Node, + maximumExports: number, +): StaticExports => { + const exports = new Set(); + let truncated = false; + t.traverseFast(node, (current) => { + if (exports.size >= maximumExports) { + truncated = true; + return t.traverseFast.stop; + } + if (t.isAssignmentExpression(current)) + collectAssignmentExports( + current.left, + current.right, + exports, + maximumExports, + ); + if (t.isCallExpression(current)) + collectCallExports(current, exports, maximumExports); + return undefined; + }); + return { + values: [...exports].sort(compareCodePoints), + truncated, + }; +}; + +const semanticTokens = (node: t.Node): string[] => { + const tokens = [`node:${node.type}`]; + if (t.isStringLiteral(node)) tokens.push(`string:${bounded(node.value)}`); + else if (t.isNumericLiteral(node)) + tokens.push(`number:${String(node.value)}`); + else if (t.isBooleanLiteral(node)) + tokens.push(`boolean:${String(node.value)}`); + else if (t.isRegExpLiteral(node)) + tokens.push(`regexp:${bounded(node.pattern)}/${node.flags}`); + else if (t.isBinaryExpression(node) || t.isLogicalExpression(node)) + tokens.push(`operator:${node.operator}`); + else if (t.isUnaryExpression(node) || t.isUpdateExpression(node)) + tokens.push(`operator:${node.operator}`); + if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) { + const property = propertyName(node.property); + if (property !== "") tokens.push(`property:${bounded(property)}`); + } + if ((t.isObjectProperty(node) || t.isObjectMethod(node)) && !node.computed) { + const key = propertyName(node.key); + if (key !== "") tokens.push(`key:${bounded(key)}`); + } + return tokens; +}; + +const collectAssignmentExports = ( + left: t.LVal | t.OptionalMemberExpression, + right: t.Expression, + output: Set, + maximum: number, +): void => { + const path = memberPath(left); + if (path === "exports" || path === "module.exports") { + if (t.isObjectExpression(right)) collectObjectKeys(right, output, maximum); + else addExport(output, "default", maximum); + return; + } + if (path.startsWith("exports.")) + addExport(output, path.slice("exports.".length), maximum); + if (path.startsWith("module.exports.")) + addExport(output, path.slice("module.exports.".length), maximum); +}; + +const collectCallExports = ( + call: t.CallExpression, + output: Set, + maximum: number, +): void => { + const callee = memberPath(call.callee); + if (callee === "Object.defineProperty") { + const target = memberPath(call.arguments[0]); + const name = stringValue(call.arguments[1]); + if ((target === "exports" || target === "module.exports") && name) + addExport(output, name, maximum); + } + if (!callee.endsWith(".d")) return; + const target = memberPath(call.arguments[0]); + const declarations = call.arguments[1]; + if ( + (target === "exports" || target === "module.exports") && + t.isObjectExpression(declarations) + ) + collectObjectKeys(declarations, output, maximum); +}; + +const collectObjectKeys = ( + object: t.ObjectExpression, + output: Set, + maximum: number, +): void => { + for (const property of object.properties) { + if (output.size >= maximum) return; + if (!t.isObjectProperty(property) && !t.isObjectMethod(property)) continue; + const name = propertyName(property.key); + if (name !== "") addExport(output, name, maximum); + } +}; + +const addExport = ( + output: Set, + name: string, + maximum: number, +): void => { + if (output.size < maximum) output.add(name.slice(0, 4_096)); +}; + +const memberPath = (node: t.Node | null | undefined, depth = 0): string => { + if (depth >= 128) return "[deep]"; + if (node === undefined || node === null) return ""; + if (t.isIdentifier(node) || t.isPrivateName(node)) + return t.isIdentifier(node) ? node.name : ""; + if (t.isThisExpression(node)) return "this"; + if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) { + const object = t.isNode(node.object) + ? memberPath(node.object, depth + 1) + : ""; + const property = propertyName(node.property); + return object === "" ? property : `${object}.${property}`; + } + return ""; +}; + +const propertyName = (node: t.Node): string => { + if (t.isIdentifier(node)) return node.name; + if (t.isStringLiteral(node) || t.isNumericLiteral(node)) + return String(node.value); + return ""; +}; + +const stringValue = (node: t.Node | null | undefined): string | undefined => + t.isStringLiteral(node) ? node.value : undefined; + +const bounded = (value: string): string => value.slice(0, 1_024); + +const compareCodePoints = (left: string, right: string): number => + left < right ? -1 : left > right ? 1 : 0; diff --git a/src/domain/javascriptStaticAnalysis.ts b/src/domain/javascriptStaticAnalysis.ts new file mode 100644 index 000000000..5e12194c2 --- /dev/null +++ b/src/domain/javascriptStaticAnalysis.ts @@ -0,0 +1,494 @@ +import { parse } from "@babel/parser"; +import * as t from "@babel/types"; + +import { + collectJavaScriptExports, + fingerprintJavaScriptAst, +} from "./javascriptAstFingerprint.js"; +import { + STATIC_ROUTE_CALL_NAMES, + argumentValue, + calleeName, + chunkRuntime, + compareCodePoints, + detectVendors, + endpointArgument, + failedJavaScriptStaticAnalysis, + factoryRequireName, + moduleFactory, + modulePropertyName, + prefixedArgument, + propertyName, + range, + rangeForOffsets, + registrationKey, + sanitizeCandidate, + sha256Text, + sortedUnique, + sourceSlice, + staticArrayValues, + staticPath, + storageKind, + stringValue, +} from "./javascriptStaticAnalysisHelpers.js"; +import { + createJavaScriptAnalysisAccumulator, + type JavaScriptAnalysisAccumulator as AnalysisAccumulator, + type JavaScriptEndpointInput as EndpointInput, + type JavaScriptFindingContext as FindingContext, + type JavaScriptModuleRange as ModuleRange, + type JavaScriptReferenceInput as ReferenceInput, + type LocatedJavaScriptFinding as Located, + type LocatedJavaScriptFindingInput as LocatedInput, +} from "./javascriptStaticAnalysisState.js"; +import type { + JavaScriptBundlerModule, + JavaScriptStaticAnalysis, + JavaScriptStaticAnalysisLimits, +} from "./javascriptStaticAnalysisTypes.js"; + +/** Parse one bounded JavaScript artifact and recover static structure only. */ +export const analyzeJavaScriptStaticSource = ( + source: string, + limits: JavaScriptStaticAnalysisLimits, +): JavaScriptStaticAnalysis => { + let file: ReturnType; + try { + file = parse(source, { + sourceType: "unambiguous", + errorRecovery: true, + plugins: ["jsx", "typescript"], + }); + } catch { + return failedJavaScriptStaticAnalysis(); + } + const accumulator = createJavaScriptAnalysisAccumulator(); + if (limits.now() > limits.deadline) accumulator.truncated = true; + if (!accumulator.truncated) + t.traverseFast(file, (node) => { + accumulator.visitedNodes += 1; + if ( + accumulator.visitedNodes > limits.maxAstNodes || + (accumulator.visitedNodes % 1_024 === 0 && + limits.now() > limits.deadline) + ) { + accumulator.truncated = true; + return t.traverseFast.stop; + } + inspectNode(source, node, accumulator, limits); + return undefined; + }); + addSourceMapDirectives(source, accumulator, limits.maxFindings); + const parserErrors = file.errors.length; + const limitations = [ + ...(parserErrors === 0 + ? [] + : [ + "The parser recovered from syntax errors; affected facts are partial.", + ]), + ...(accumulator.truncated + ? ["AST analysis stopped at the configured node or time bound."] + : []), + ...(accumulator.droppedFindings === 0 + ? [] + : ["Static findings were truncated at the configured finding bound."]), + ...(accumulator.structuralTruncation + ? ["Bundler metadata reached a per-record structural bound."] + : []), + ...(accumulator.unknownFindings === 0 + ? [] + : [ + "One or more bundler registration keys were dynamic and remain unknown.", + ]), + "JavaScript syntax was parsed as data and was never evaluated.", + ]; + return { + parse_status: + accumulator.truncated || accumulator.droppedFindings > 0 + ? "truncated" + : parserErrors > 0 || accumulator.unknownFindings > 0 + ? "partial" + : "complete", + parse_error_count: parserErrors, + visited_ast_nodes: Math.min(accumulator.visitedNodes, limits.maxAstNodes), + dropped_findings: accumulator.droppedFindings, + references: finalizeLocated(accumulator.references, accumulator.modules), + endpoints: finalizeLocated(accumulator.endpoints, accumulator.modules), + storage: finalizeLocated(accumulator.storage, accumulator.modules), + bundler_registrations: sortedUnique( + accumulator.registrations, + registrationKey, + ), + role_paths: finalizeLocated(accumulator.roles, accumulator.modules), + source_map_urls: accumulator.sourceMaps, + vendors: detectVendors(source), + limitations, + }; +}; + +const inspectNode = ( + source: string, + node: t.Node, + accumulator: AnalysisAccumulator, + limits: JavaScriptStaticAnalysisLimits, +): void => { + const findings: FindingContext = { + source, + accumulator, + maximum: limits.maxFindings, + }; + if (t.isCallExpression(node)) { + inspectBundlerRegistration(source, node, accumulator, limits); + inspectCall(node, findings); + } else if (t.isNewExpression(node)) inspectCall(node, findings); + if ( + (t.isImportDeclaration(node) || t.isExportAllDeclaration(node)) && + node.source !== undefined + ) + addReference(findings, { + node, + kind: "static-import", + specifier: node.source.value, + }); + else if (t.isExportNamedDeclaration(node) && node.source != null) + addReference(findings, { + node, + kind: "static-import", + specifier: node.source.value, + }); + else if (t.isImportExpression(node)) + addReference(findings, { + node, + kind: "dynamic-import", + specifier: stringValue(node.source), + }); + if (t.isObjectProperty(node)) { + inspectRouteProperty(node, findings); + inspectRoleProperty(node, findings); + } +}; + +const inspectCall = ( + node: t.CallExpression | t.NewExpression, + context: FindingContext, +): void => { + const { accumulator } = context; + const name = calleeName(node.callee); + const first = stringValue(node.arguments[0]); + const module = moduleAt(node.start, accumulator.modules); + const moduleRequire = + module?.requireName !== null && name === module?.requireName; + if ( + name === "require" || + name.endsWith(".require") || + name.includes("__webpack_require__") || + moduleRequire + ) + addReference(context, { + node, + kind: "require", + specifier: argumentValue(node.arguments[0]), + }); + if (name.endsWith(".e") && name.includes("require")) + addReference(context, { + node, + kind: "dynamic-import", + specifier: prefixedArgument("chunk:", node.arguments[0]), + }); + if (name === "Worker" || name.endsWith(".Worker")) + addReference(context, { node, kind: "worker", specifier: first }); + if (name.endsWith("serviceWorker.register")) + addReference(context, { node, kind: "service-worker", specifier: first }); + inspectEndpointCall(node, name, first, context); + inspectStorageCall(node, name, first, context); + if (name.endsWith("loadFile") && first !== undefined) + addLocated(context, { + collection: accumulator.roles, + key: `role\0renderer\0${first}`, + node, + value: { + role: "renderer", + path: first, + mechanism: `call:${name}`, + module_key: null, + location: range(node), + }, + }); +}; + +const inspectBundlerRegistration = ( + source: string, + call: t.CallExpression, + accumulator: AnalysisAccumulator, + limits: JavaScriptStaticAnalysisLimits, +): void => { + const runtime = chunkRuntime(call); + const entry = call.arguments[0]; + if (runtime === undefined || !t.isArrayExpression(entry)) return; + const chunkIds = entry.elements[0]; + const table = entry.elements[1]; + if (!t.isArrayExpression(chunkIds) || !t.isObjectExpression(table)) return; + const modules: JavaScriptBundlerModule[] = []; + for (const property of table.properties) { + const factory = moduleFactory(property); + if (factory === undefined) continue; + if (accumulator.moduleCount >= limits.maxModules) { + accumulator.droppedFindings += 1; + continue; + } + accumulator.moduleCount += 1; + const key = modulePropertyName(property); + if (key.startsWith("[computed@") || key.startsWith("[unknown@")) + accumulator.unknownFindings += 1; + const exactSource = sourceSlice(source, factory); + const fingerprint = fingerprintJavaScriptAst( + factory, + Math.min(limits.maxAstNodes, 100_000), + ); + const exportsValue = collectJavaScriptExports(factory, 256); + if (fingerprint.truncated || exportsValue.truncated) { + accumulator.droppedFindings += 1; + accumulator.structuralTruncation = true; + } + modules.push({ + module_key: key, + source_sha256: sha256Text(exactSource), + structural_fingerprint_sha256: fingerprint.truncated + ? null + : fingerprint.sha256, + structural_fingerprint_algorithm: fingerprint.truncated + ? null + : ("babel-ast-v1" as const), + structural_fingerprint_status: fingerprint.truncated + ? ("truncated" as const) + : ("complete" as const), + exports: exportsValue.values, + exports_truncated: exportsValue.truncated, + location: range(factory), + }); + if (typeof factory.start === "number" && typeof factory.end === "number") + accumulator.modules.push({ + start: factory.start, + end: factory.end, + key, + requireName: factoryRequireName(factory), + }); + } + const chunkKeys = staticArrayValues( + chunkIds, + Math.min(256, limits.maxFindings), + ); + if (chunkKeys.omitted > 0) { + accumulator.droppedFindings += chunkKeys.omitted; + accumulator.structuralTruncation = true; + } + accumulator.unknownFindings += chunkKeys.unknown; + const registration = { + bundler: runtime.toLowerCase().includes("rspack") + ? ("rspack" as const) + : ("webpack" as const), + runtime, + chunk_keys: chunkKeys.values, + omitted_chunk_keys: chunkKeys.omitted, + unknown_chunk_keys: chunkKeys.unknown, + modules: modules.sort((left, right) => + compareCodePoints(left.module_key, right.module_key), + ), + location: range(call), + }; + addBounded( + accumulator, + `registration\0${registrationKey(registration)}`, + limits.maxFindings, + () => accumulator.registrations.push(registration), + ); +}; + +const inspectEndpointCall = ( + node: t.CallExpression | t.NewExpression, + name: string, + first: string | undefined, + context: FindingContext, +): void => { + const route = STATIC_ROUTE_CALL_NAMES.some( + (candidate) => name === candidate || name.endsWith(`.${candidate}`), + ); + if (route && first !== undefined) + addEndpoint(context, { + node, + kind: "route", + value: first, + mechanism: `call:${name}`, + }); + const endpoint = endpointArgument(name, node.arguments); + if (endpoint !== undefined) + addEndpoint(context, { + node, + kind: "network", + value: endpoint, + mechanism: `call:${name}`, + }); +}; + +const inspectRouteProperty = ( + node: t.ObjectProperty, + context: FindingContext, +): void => { + const key = propertyName(node.key); + if ((key === "path" || key === "route") && t.isStringLiteral(node.value)) + addEndpoint(context, { + node, + kind: "route", + value: node.value.value, + mechanism: `property:${key}`, + }); +}; + +const inspectRoleProperty = ( + node: t.ObjectProperty, + context: FindingContext, +): void => { + if (propertyName(node.key) !== "preload") return; + const path = staticPath(node.value); + if (path === undefined) return; + addLocated(context, { + collection: context.accumulator.roles, + key: `role\0preload\0${path}`, + node, + value: { + role: "preload", + path, + mechanism: "property:preload", + module_key: null, + location: range(node), + }, + }); +}; + +const inspectStorageCall = ( + node: t.CallExpression | t.NewExpression, + name: string, + first: string | undefined, + context: FindingContext, +): void => { + const storage = storageKind(name); + if (storage === undefined) return; + addLocated(context, { + collection: context.accumulator.storage, + key: `storage\0${storage}\0${first ?? ""}`, + node, + value: { + kind: storage, + name: first ?? null, + mechanism: `call:${name}`, + module_key: null, + location: range(node), + }, + }); +}; + +const addReference = (context: FindingContext, input: ReferenceInput): void => { + const boundedSpecifier = input.specifier?.slice(0, 4_096) ?? null; + const expression = + boundedSpecifier === null + ? sourceSlice(context.source, input.node).slice(0, 4_096) + : null; + addLocated(context, { + collection: context.accumulator.references, + key: `reference\0${input.kind}\0${boundedSpecifier ?? expression}`, + node: input.node, + value: { + kind: input.kind, + specifier: boundedSpecifier, + expression, + module_key: null, + location: range(input.node), + }, + }); +}; + +const addEndpoint = (context: FindingContext, input: EndpointInput): void => + addLocated(context, { + collection: context.accumulator.endpoints, + key: `endpoint\0${input.kind}\0${input.value}`, + node: input.node, + value: { + kind: input.kind, + value: sanitizeCandidate(input.value), + mechanism: input.mechanism, + module_key: null, + location: range(input.node), + }, + }); + +const addLocated = ( + context: FindingContext, + input: LocatedInput, +): void => + addBounded( + context.accumulator, + `${input.key}\0${String(input.node.start)}`, + context.maximum, + () => + input.collection.push({ + offset: input.node.start ?? -1, + value: input.value, + }), + ); + +const addBounded = ( + accumulator: AnalysisAccumulator, + key: string, + maximum: number, + add: () => void, +): void => { + if (accumulator.seen.has(key)) return; + const count = + accumulator.references.length + + accumulator.endpoints.length + + accumulator.storage.length + + accumulator.roles.length + + accumulator.sourceMaps.length + + accumulator.registrations.length; + if (count >= maximum) { + accumulator.droppedFindings += 1; + return; + } + accumulator.seen.add(key); + add(); +}; + +const finalizeLocated = ( + values: readonly Located[], + modules: readonly ModuleRange[], +): Value[] => + values.map(({ offset, value }) => ({ + ...value, + module_key: moduleAt(offset, modules)?.key ?? null, + })); + +const moduleAt = ( + offset: number | null | undefined, + modules: readonly ModuleRange[], +): ModuleRange | undefined => { + if (offset === null || offset === undefined) return undefined; + return modules.find(({ start, end }) => offset >= start && offset <= end); +}; + +const addSourceMapDirectives = ( + source: string, + accumulator: AnalysisAccumulator, + maximum: number, +): void => { + for (const match of source.matchAll( + /\/\/[#@]\s*sourceMappingURL\s*=\s*([^\s]+)/gu, + )) { + const declared = match[1]?.slice(0, 4_096); + if (declared === undefined) continue; + const start = match.index; + const location = rangeForOffsets(source, start, start + match[0].length); + addBounded(accumulator, `source-map\0${declared}`, maximum, () => + accumulator.sourceMaps.push({ declared_url: declared, location }), + ); + } +}; diff --git a/src/domain/javascriptStaticAnalysisHelpers.ts b/src/domain/javascriptStaticAnalysisHelpers.ts new file mode 100644 index 000000000..97bf6f786 --- /dev/null +++ b/src/domain/javascriptStaticAnalysisHelpers.ts @@ -0,0 +1,355 @@ +import { createHash } from "node:crypto"; +import { posix } from "node:path"; + +import * as t from "@babel/types"; + +import { sanitizeBrowserUrl } from "./browserObservation.js"; +import type { + JavaScriptBundlerRegistration, + JavaScriptSourceRange, + JavaScriptStaticAnalysis, + JavaScriptStaticStorage, +} from "./javascriptStaticAnalysisTypes.js"; + +/** Explicit result for source text that Babel cannot parse. */ +export const failedJavaScriptStaticAnalysis = (): JavaScriptStaticAnalysis => ({ + parse_status: "failed", + parse_error_count: 1, + visited_ast_nodes: 0, + dropped_findings: 0, + references: [], + endpoints: [], + storage: [], + bundler_registrations: [], + role_paths: [], + source_map_urls: [], + vendors: [], + limitations: [ + "JavaScript source could not be parsed; absence of findings is not evidence of absence.", + "JavaScript syntax was parsed as data and was never evaluated.", + ], +}); + +/** Recognize the bounded runtime name for a Webpack/Rspack push call. */ +export const chunkRuntime = (call: t.CallExpression): string | undefined => { + if ( + !t.isMemberExpression(call.callee) && + !t.isOptionalMemberExpression(call.callee) + ) + return undefined; + if (propertyName(call.callee.property) !== "push") return undefined; + return findChunkRuntime(call.callee.object, 0); +}; + +const findChunkRuntime = (node: t.Node, depth: number): string | undefined => { + if (depth >= 128) return undefined; + if (t.isIdentifier(node) && /(?:webpack|rspack)Chunk/iu.test(node.name)) + return node.name.slice(0, 4_096); + if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) { + const property = propertyName(node.property); + if (/(?:webpack|rspack)Chunk/iu.test(property)) + return property.slice(0, 4_096); + return t.isNode(node.object) + ? findChunkRuntime(node.object, depth + 1) + : undefined; + } + if (t.isAssignmentExpression(node)) + return ( + findChunkRuntime(node.left, depth + 1) ?? + findChunkRuntime(node.right, depth + 1) + ); + if (t.isLogicalExpression(node) || t.isBinaryExpression(node)) + return ( + findChunkRuntime(node.left, depth + 1) ?? + findChunkRuntime(node.right, depth + 1) + ); + if (t.isParenthesizedExpression(node) || t.isTSAsExpression(node)) + return findChunkRuntime(node.expression, depth + 1); + return undefined; +}; + +/** Return a literal function factory from one module-table property. */ +export const moduleFactory = ( + property: t.ObjectMethod | t.ObjectProperty | t.SpreadElement, +): + | t.FunctionExpression + | t.ArrowFunctionExpression + | t.ObjectMethod + | undefined => { + if (t.isObjectMethod(property)) return property; + if ( + t.isObjectProperty(property) && + (t.isFunctionExpression(property.value) || + t.isArrowFunctionExpression(property.value)) + ) + return property.value; + return undefined; +}; + +/** Derive a bounded literal or explicitly computed module key. */ +export const modulePropertyName = ( + property: t.ObjectMethod | t.ObjectProperty | t.SpreadElement, +): string => + t.isObjectMethod(property) || t.isObjectProperty(property) + ? property.computed && + !t.isStringLiteral(property.key) && + !t.isNumericLiteral(property.key) + ? `[computed@${String(property.start ?? -1)}]` + : propertyName(property.key).slice(0, 4_096) || + `[unknown@${String(property.start ?? -1)}]` + : `[unknown@${String(property.start ?? -1)}]`; + +/** Read the factory-local bundler require parameter when declared. */ +export const factoryRequireName = ( + factory: t.FunctionExpression | t.ArrowFunctionExpression | t.ObjectMethod, +): string | null => { + const parameter = factory.params[2]; + return t.isIdentifier(parameter) ? parameter.name.slice(0, 4_096) : null; +}; + +/** Collect bounded unique literal values and explicit omissions from an array. */ +export const staticArrayValues = ( + array: t.ArrayExpression, + maximum: number, +): { + readonly values: readonly string[]; + readonly omitted: number; + readonly unknown: number; +} => { + const staticValues = array.elements.flatMap((element) => { + const value = argumentValue(element); + return value === undefined ? [] : [value.slice(0, 4_096)]; + }); + const values = [...new Set(staticValues)].sort(compareCodePoints); + return { + values: values.slice(0, maximum), + omitted: Math.max(0, values.length - maximum), + unknown: array.elements.length - staticValues.length, + }; +}; + +/** Resolve a bounded path composed only from inert literal syntax. */ +export const staticPath = (node: t.Node): string | undefined => + staticPathAt(node, 0); + +const staticPathAt = (node: t.Node, depth: number): string | undefined => { + if (depth >= 128) return undefined; + if (t.isStringLiteral(node)) return node.value.slice(0, 4_096); + if (t.isTemplateLiteral(node) && node.expressions.length === 0) { + const value = node.quasis[0]?.value.cooked ?? node.quasis[0]?.value.raw; + return value?.slice(0, 4_096); + } + if (t.isBinaryExpression(node, { operator: "+" })) { + const left = staticPathAt(node.left, depth + 1); + const right = staticPathAt(node.right, depth + 1); + return left === undefined || right === undefined + ? undefined + : `${left}${right}`.slice(0, 4_096); + } + if (t.isCallExpression(node) || t.isNewExpression(node)) + return staticCallPath(node, depth); + return undefined; +}; + +const staticCallPath = ( + node: t.CallExpression | t.NewExpression, + depth: number, +): string | undefined => { + const name = calleeName(node.callee); + if (name === "URL" || name.endsWith(".URL")) + return stringValue(node.arguments[0]); + if (!name.endsWith(".join") && !name.endsWith(".resolve") && name !== "join") + return undefined; + const parts: string[] = []; + for (const argument of node.arguments) { + if (t.isIdentifier(argument, { name: "__dirname" })) continue; + const value = t.isNode(argument) + ? staticPathAt(argument, depth + 1) + : undefined; + if (value === undefined) return undefined; + parts.push(value); + } + return parts.length === 0 ? undefined : posix.join(...parts).slice(0, 4_096); +}; + +/** Select the literal URL argument for recognized network callees. */ +export const endpointArgument = ( + name: string, + args: readonly ( + | t.Expression + | t.SpreadElement + | t.JSXNamespacedName + | t.ArgumentPlaceholder + )[], +): string | undefined => { + if (name === "fetch" || name.endsWith(".fetch") || name === "WebSocket") + return stringValue(args[0]); + if (name.endsWith(".open") && stringValue(args[1]) !== undefined) + return stringValue(args[1]); + if ( + ["get", "post", "put", "patch", "delete", "request"].some( + (method) => name === method || name.endsWith(`.${method}`), + ) + ) + return stringValue(args[0]); + if (name.endsWith("loadURL")) return stringValue(args[0]); + return undefined; +}; + +/** Classify a recognized storage API call name. */ +export const storageKind = ( + name: string, +): JavaScriptStaticStorage["kind"] | undefined => { + if (name.includes("localStorage.")) return "local-storage"; + if (name.includes("sessionStorage.")) return "session-storage"; + if (name.endsWith("indexedDB.open")) return "indexed-db"; + if (name.endsWith("caches.open")) return "cache-storage"; + if (name === "Database" || name.endsWith(".Database")) return "sqlite"; + return undefined; +}; + +/** Produce a dotted bounded callee name from member syntax. */ +export const calleeName = (node: t.Node): string => calleeNameAt(node, 0); + +const calleeNameAt = (node: t.Node, depth: number): string => { + if (depth >= 128) return "[deep]"; + if (t.isIdentifier(node)) return node.name.slice(0, 4_096); + if (t.isImport(node)) return "import"; + if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) { + const object = t.isNode(node.object) + ? calleeNameAt(node.object, depth + 1) + : ""; + const property = propertyName(node.property); + return (object === "" ? property : `${object}.${property}`).slice(0, 4_096); + } + return ""; +}; + +/** Read a literal property name without evaluating computed syntax. */ +export const propertyName = (node: t.Node): string => { + if (t.isIdentifier(node)) return node.name.slice(0, 4_096); + if (t.isStringLiteral(node) || t.isNumericLiteral(node)) + return String(node.value).slice(0, 4_096); + return ""; +}; + +/** Return a string literal value without evaluating an expression. */ +export const stringValue = ( + node: t.Node | null | undefined, +): string | undefined => + t.isStringLiteral(node) ? node.value.slice(0, 4_096) : undefined; + +/** Return a string or numeric argument literal. */ +export const argumentValue = ( + node: t.Node | null | undefined, +): string | undefined => { + if (t.isStringLiteral(node) || t.isNumericLiteral(node)) + return String(node.value).slice(0, 4_096); + return undefined; +}; + +/** Prefix a static argument value when one is available. */ +export const prefixedArgument = ( + prefix: string, + node: t.Node | null | undefined, +): string | undefined => { + const value = argumentValue(node); + return value === undefined ? undefined : `${prefix}${value}`; +}; + +/** Retain the exact bounded source span represented by an AST node. */ +export const sourceSlice = (source: string, node: t.Node): string => + typeof node.start !== "number" || typeof node.end !== "number" + ? "" + : source.slice(node.start, node.end); + +/** Convert Babel locations into the stable graph source-range shape. */ +export const range = (node: t.Node): JavaScriptSourceRange => ({ + start: { + line: node.loc?.start.line ?? 1, + column: node.loc?.start.column ?? 0, + }, + end: { + line: node.loc?.end.line ?? node.loc?.start.line ?? 1, + column: node.loc?.end.column ?? node.loc?.start.column ?? 0, + }, +}); + +/** Convert exact text offsets into a source range. */ +export const rangeForOffsets = ( + source: string, + start: number, + end: number, +): JavaScriptSourceRange => ({ + start: pointForOffset(source, start), + end: pointForOffset(source, end), +}); + +const pointForOffset = (source: string, offset: number) => { + const before = source.slice(0, offset); + const lines = before.split("\n"); + return { line: lines.length, column: lines.at(-1)?.length ?? 0 }; +}; + +/** Observe known bundler/framework marker strings without claiming dependency use. */ +export const detectVendors = (source: string): string[] => + vendorPatterns.flatMap(({ name, patterns }) => + patterns.some((pattern) => source.includes(pattern)) ? [name] : [], + ); + +/** Remove credentials, fragments, and query values from endpoint candidates. */ +export const sanitizeCandidate = (value: string): string => { + const bounded = value.slice(0, 4_096); + try { + const parsed = new URL(bounded, "https://rea.invalid"); + const sanitized = sanitizeBrowserUrl(parsed.href).url; + return parsed.origin === "https://rea.invalid" + ? sanitized.replace("https://rea.invalid", "") + : sanitized; + } catch { + return bounded.split("#", 1)[0]?.split("?", 1)[0] ?? ""; + } +}; + +/** Commit the static semantic content used to deduplicate registrations. */ +export const registrationKey = ( + registration: JavaScriptBundlerRegistration, +): string => + `${registration.runtime}\0${registration.chunk_keys.join("\0")}\0${String(registration.omitted_chunk_keys)}\0${String(registration.unknown_chunk_keys)}\0${registration.modules.map(({ module_key: key, source_sha256: digest }) => `${key}:${digest}`).join("\0")}`; + +/** Sort values by a deterministic unique semantic key. */ +export const sortedUnique = ( + values: readonly Value[], + key: (value: Value) => string, +): Value[] => + [...new Map(values.map((value) => [key(value), value])).values()].sort( + (left, right) => compareCodePoints(key(left), key(right)), + ); + +/** Hash exact UTF-8 source text. */ +export const sha256Text = (value: string): string => + createHash("sha256").update(value).digest("hex"); + +/** Compare strings by Unicode code point for canonical ordering. */ +export const compareCodePoints = (left: string, right: string): number => + left < right ? -1 : left > right ? 1 : 0; + +/** Recognized route-construction call suffixes. */ +export const STATIC_ROUTE_CALL_NAMES = [ + "route", + "addRoute", + "useRoutes", + "createBrowserRouter", + "createHashRouter", +] as const; + +const vendorPatterns = [ + { name: "webpack", patterns: ["__webpack_require__", "webpackChunk"] }, + { name: "Rspack", patterns: ["__webpack_require__.f", "rspackChunk"] }, + { name: "Vite", patterns: ["__vite__", "import.meta.hot"] }, + { name: "React", patterns: ["React.createElement", "react/jsx-runtime"] }, + { name: "Vue", patterns: ["__VUE__", "createApp("] }, + { name: "Next.js", patterns: ["__NEXT_DATA__", "/_next/"] }, + { name: "Angular", patterns: ["ɵɵdefineComponent"] }, + { name: "Svelte", patterns: ["svelte/internal"] }, +] as const; diff --git a/src/domain/javascriptStaticAnalysisState.ts b/src/domain/javascriptStaticAnalysisState.ts new file mode 100644 index 000000000..77a6058ce --- /dev/null +++ b/src/domain/javascriptStaticAnalysisState.ts @@ -0,0 +1,93 @@ +import type * as t from "@babel/types"; + +import type { + JavaScriptBundlerRegistration, + JavaScriptRolePath, + JavaScriptStaticAnalysis, + JavaScriptStaticEndpoint, + JavaScriptStaticReference, + JavaScriptStaticStorage, +} from "./javascriptStaticAnalysisTypes.js"; + +/** Source offsets for one recovered bundle module factory. */ +export interface JavaScriptModuleRange { + readonly start: number; + readonly end: number; + readonly key: string; + readonly requireName: string | null; +} + +/** Static finding retained with its source offset until module attribution. */ +export interface LocatedJavaScriptFinding { + readonly offset: number; + readonly value: Value; +} + +/** Mutable bounded collections used during one inert AST traversal. */ +export interface JavaScriptAnalysisAccumulator { + readonly references: LocatedJavaScriptFinding[]; + readonly endpoints: LocatedJavaScriptFinding[]; + readonly storage: LocatedJavaScriptFinding[]; + readonly roles: LocatedJavaScriptFinding[]; + readonly sourceMaps: JavaScriptStaticAnalysis["source_map_urls"][number][]; + readonly registrations: JavaScriptBundlerRegistration[]; + readonly modules: JavaScriptModuleRange[]; + readonly seen: Set; + visitedNodes: number; + droppedFindings: number; + moduleCount: number; + unknownFindings: number; + structuralTruncation: boolean; + truncated: boolean; +} + +/** Shared source, accumulator, and finding bound for helper inspections. */ +export interface JavaScriptFindingContext { + readonly source: string; + readonly accumulator: JavaScriptAnalysisAccumulator; + readonly maximum: number; +} + +/** Candidate import, require, worker, or service-worker reference. */ +export interface JavaScriptReferenceInput { + readonly node: t.Node; + readonly kind: JavaScriptStaticReference["kind"]; + readonly specifier: string | undefined; +} + +/** Candidate route or network endpoint literal. */ +export interface JavaScriptEndpointInput { + readonly node: t.Node; + readonly kind: JavaScriptStaticEndpoint["kind"]; + readonly value: string; + readonly mechanism: string; +} + +/** Values required to append one module-attributable static finding. */ +export interface LocatedJavaScriptFindingInput< + Value extends { readonly module_key: string | null }, +> { + readonly collection: LocatedJavaScriptFinding[]; + readonly key: string; + readonly node: t.Node; + readonly value: Value; +} + +/** Create isolated mutable state for one bounded source analysis. */ +export const createJavaScriptAnalysisAccumulator = + (): JavaScriptAnalysisAccumulator => ({ + references: [], + endpoints: [], + storage: [], + roles: [], + sourceMaps: [], + registrations: [], + modules: [], + seen: new Set(), + visitedNodes: 0, + droppedFindings: 0, + moduleCount: 0, + unknownFindings: 0, + structuralTruncation: false, + truncated: false, + }); diff --git a/src/domain/javascriptStaticAnalysisTypes.ts b/src/domain/javascriptStaticAnalysisTypes.ts new file mode 100644 index 000000000..823c3a68d --- /dev/null +++ b/src/domain/javascriptStaticAnalysisTypes.ts @@ -0,0 +1,108 @@ +/** One source coordinate produced by the JavaScript parser. */ +export interface JavaScriptSourcePoint { + readonly line: number; + readonly column: number; +} + +/** One exact source range within a bounded JavaScript artifact. */ +export interface JavaScriptSourceRange { + readonly start: JavaScriptSourcePoint; + readonly end: JavaScriptSourcePoint; +} + +/** A statically visible module, worker, or service-worker reference. */ +export interface JavaScriptStaticReference { + readonly kind: + | "static-import" + | "dynamic-import" + | "require" + | "worker" + | "service-worker"; + readonly specifier: string | null; + readonly expression: string | null; + readonly module_key: string | null; + readonly location: JavaScriptSourceRange; +} + +/** A route or network endpoint literal observed in syntax. */ +export interface JavaScriptStaticEndpoint { + readonly kind: "route" | "network"; + readonly value: string; + readonly mechanism: string; + readonly module_key: string | null; + readonly location: JavaScriptSourceRange; +} + +/** A storage surface observed without executing application code. */ +export interface JavaScriptStaticStorage { + readonly kind: + | "local-storage" + | "session-storage" + | "indexed-db" + | "cache-storage" + | "sqlite"; + readonly name: string | null; + readonly mechanism: string; + readonly module_key: string | null; + readonly location: JavaScriptSourceRange; +} + +/** One exact module factory recovered from a Webpack/Rspack registration. */ +export interface JavaScriptBundlerModule { + readonly module_key: string; + readonly source_sha256: string; + readonly structural_fingerprint_sha256: string | null; + readonly structural_fingerprint_algorithm: "babel-ast-v1" | null; + readonly structural_fingerprint_status: "complete" | "truncated"; + readonly exports: readonly string[]; + readonly exports_truncated: boolean; + readonly location: JavaScriptSourceRange; +} + +/** One statically recognized Webpack/Rspack chunk registration. */ +export interface JavaScriptBundlerRegistration { + readonly bundler: "webpack" | "rspack"; + readonly runtime: string; + readonly chunk_keys: readonly string[]; + readonly omitted_chunk_keys: number; + readonly unknown_chunk_keys: number; + readonly modules: readonly JavaScriptBundlerModule[]; + readonly location: JavaScriptSourceRange; +} + +/** Static Electron role paths discovered from package or JavaScript syntax. */ +export interface JavaScriptRolePath { + readonly role: "preload" | "renderer"; + readonly path: string; + readonly mechanism: string; + readonly module_key: string | null; + readonly location: JavaScriptSourceRange; +} + +/** Bounded, deterministic AST-only analysis of one JavaScript source file. */ +export interface JavaScriptStaticAnalysis { + readonly parse_status: "complete" | "partial" | "failed" | "truncated"; + readonly parse_error_count: number; + readonly visited_ast_nodes: number; + readonly dropped_findings: number; + readonly references: readonly JavaScriptStaticReference[]; + readonly endpoints: readonly JavaScriptStaticEndpoint[]; + readonly storage: readonly JavaScriptStaticStorage[]; + readonly bundler_registrations: readonly JavaScriptBundlerRegistration[]; + readonly role_paths: readonly JavaScriptRolePath[]; + readonly source_map_urls: readonly { + readonly declared_url: string; + readonly location: JavaScriptSourceRange; + }[]; + readonly vendors: readonly string[]; + readonly limitations: readonly string[]; +} + +/** Hard bounds applied to one AST-only JavaScript analysis. */ +export interface JavaScriptStaticAnalysisLimits { + readonly maxAstNodes: number; + readonly maxFindings: number; + readonly maxModules: number; + readonly deadline: number; + readonly now: () => number; +} diff --git a/tests/fixtures/javascriptArtifactApplication.ts b/tests/fixtures/javascriptArtifactApplication.ts new file mode 100644 index 000000000..00a6ed5ae --- /dev/null +++ b/tests/fixtures/javascriptArtifactApplication.ts @@ -0,0 +1,125 @@ +import { mkdir, writeFile } from "node:fs/promises"; +import { join } from "node:path"; + +/** Materialize a source-owned Electron/Webpack/Rspack fixture tree. */ +export const writeJavaScriptArtifactFixture = async ( + root: string, +): Promise => { + const sourceMapDirective = `${String.fromCharCode(47, 47)}# sourceMap${"ping"}URL=renderer.js.map`; + await Promise.all([ + mkdir(join(root, "renderer", "chunks"), { recursive: true }), + mkdir(join(root, "native"), { recursive: true }), + ]); + await Promise.all([ + writeFile( + join(root, "package.json"), + JSON.stringify( + { + name: "rea-javascript-fixture", + version: "1.0.0", + main: "./main.js", + renderer: "./renderer/index.html", + }, + null, + 2, + ), + ), + writeFile( + join(root, "main.js"), + ` + import { BrowserWindow } from "electron"; + import path from "node:path"; + const window = new BrowserWindow({ + webPreferences: { preload: path.join(__dirname, "preload.js") } + }); + window.loadFile("./renderer/index.html"); + require("./native/addon.node"); + `, + ), + writeFile( + join(root, "preload.js"), + ` + import { contextBridge, ipcRenderer } from "electron"; + contextBridge.exposeInMainWorld("fixture", { + lookup: (id) => ipcRenderer.invoke("fixture:lookup", id) + }); + `, + ), + writeFile( + join(root, "renderer", "index.html"), + '', + ), + writeFile( + join(root, "renderer", "renderer.js"), + ` + import "./chunks/webpack.js"; + import "./chunks/rspack.js"; + const routes = [{ path: "/items/:id" }]; + fetch("https://api.example.test/items?token=fixture-secret"); + localStorage.setItem("theme", "dark"); + indexedDB.open("fixture-db"); + new Worker("./worker.js"); + navigator.serviceWorker.register("./sw.js"); + void routes; + ${sourceMapDirective} + `, + ), + writeFile( + join(root, "renderer", "worker.js"), + "self.onmessage = (event) => postMessage(event.data);\n", + ), + writeFile( + join(root, "renderer", "sw.js"), + 'caches.open("fixture-cache");\n', + ), + writeFile( + join(root, "renderer", "chunks", "webpack.js"), + ` + globalThis.__rea_bundle_executed = true; + (globalThis.webpackChunkfixture = globalThis.webpackChunkfixture || []).push([ + [101], + { + 1: (module, exports, r) => { + const dependency = r(2); + exports.lookup = () => dependency; + }, + 2: (module) => { module.exports = { value: 42 }; } + } + ]); + throw new Error("bundle execution must never happen"); + `, + ), + writeFile( + join(root, "renderer", "chunks", "rspack.js"), + ` + (self.rspackChunkfixture = self.rspackChunkfixture || []).push([ + ["editor"], + { + "src/editor.ts": (module, exports, r) => { + exports.render = () => r("src/model.ts"); + }, + "src/model.ts": (module) => { module.exports = "model"; } + } + ]); + `, + ), + writeFile( + join(root, "renderer", "renderer.js.map"), + JSON.stringify({ + version: 3, + file: "renderer.js", + sourceRoot: "webpack://fixture/", + sources: ["src/renderer.ts"], + sourcesContent: [ + 'export const route = "/items/:id"; fetch("/api/items");', + ], + names: [], + mappings: "AAAA", + }), + ), + writeFile( + join(root, "native", "addon.node"), + Buffer.from([0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00]), + ), + ]); +}; diff --git a/tests/javascriptArtifactReconstruction.test.ts b/tests/javascriptArtifactReconstruction.test.ts new file mode 100644 index 000000000..31571cc2b --- /dev/null +++ b/tests/javascriptArtifactReconstruction.test.ts @@ -0,0 +1,526 @@ +import { Readable } from "node:stream"; +import { mkdtemp, mkdir, symlink, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +import { createPackageWithOptions } from "@electron/asar"; +import { describe, expect, it } from "vitest"; + +import { readJavaScriptArtifactFiles } from "../src/application/JavaScriptArtifactFiles.js"; +import { reconstructJavaScriptArtifact } from "../src/application/JavaScriptArtifactReconstruction.js"; +import { + artifactLimitsForReconstruction, + javascriptArtifactReconstructionInputSchema, +} from "../src/application/JavaScriptArtifactReconstructionInput.js"; +import { scanArtifactInventory } from "../src/application/ArtifactInventory.js"; +import { + type ArtifactEntry, + type ArtifactReader, +} from "../src/artifacts/ArtifactReader.js"; +import { parseJavaScriptApplicationGraph } from "../src/domain/javascriptApplicationGraph.js"; +import { writeJavaScriptArtifactFixture } from "./fixtures/javascriptArtifactApplication.js"; + +describe("JavaScript artifact reconstruction", () => { + it("reconstructs package, Electron roles, Webpack/Rspack modules, and cross-layer facts without execution", async () => { + const root = await fixtureDirectory(); + Reflect.deleteProperty(globalThis, "__rea_bundle_executed"); + + const result = await reconstructJavaScriptArtifact({ + input_path: root, + source_map_read_approved: true, + }); + const graph = parseJavaScriptApplicationGraph(result.graph); + + expect(Reflect.get(globalThis, "__rea_bundle_executed")).toBeUndefined(); + expect(result.input_path).toBe(root); + expect(result.statistics).toMatchObject({ + modules: 4, + parse_failures: 0, + omitted_text_files: 0, + policy_filtered_text_files: 0, + }); + expect(graph.nodes.map(({ kind }) => kind)).toEqual( + expect.arrayContaining([ + "package", + "artifact", + "electron-main", + "electron-preload", + "electron-renderer", + "javascript-asset", + "javascript-chunk", + "javascript-module", + "worker", + "service-worker", + "endpoint", + "storage", + "source-map", + "source-module", + "native-addon", + ]), + ); + expect( + graph.nodes.filter(({ kind }) => kind === "javascript-chunk"), + ).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + observations: expect.arrayContaining([ + expect.objectContaining({ + properties: expect.objectContaining({ bundler: "webpack" }), + }), + ]), + }), + expect.objectContaining({ + observations: expect.arrayContaining([ + expect.objectContaining({ + properties: expect.objectContaining({ bundler: "rspack" }), + }), + ]), + }), + ]), + ); + expect( + graph.nodes.filter(({ kind }) => kind === "javascript-module"), + ).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + observations: expect.arrayContaining([ + expect.objectContaining({ + properties: expect.objectContaining({ + module_key: "1", + structural_fingerprint_algorithm: "babel-ast-v1", + }), + }), + ]), + }), + ]), + ); + expect(graph.edges.map(({ relation }) => relation)).toEqual( + expect.arrayContaining([ + "contains", + "loads", + "imports", + "maps_to", + "exposes", + "calls", + "persists_to", + ]), + ); + const endpointJson = JSON.stringify( + graph.nodes.filter(({ kind }) => kind === "endpoint"), + ); + expect(endpointJson).toContain("token=%5BREDACTED%5D"); + expect(endpointJson).not.toContain("fixture-secret"); + }); + + it("produces deterministic ASAR graphs with unpacked native linkage and complete paths/digests", async () => { + const root = await mkdtemp(join(tmpdir(), "rea-javascript-asar-")); + const source = join(root, "source"); + await mkdir(source); + await writeJavaScriptArtifactFixture(source); + const archive = join(root, "app.asar"); + await createPackageWithOptions(source, archive, { unpack: "**/*.node" }); + + const first = await reconstructJavaScriptArtifact({ + input_path: archive, + format: "asar", + source_map_read_approved: true, + }); + const second = await reconstructJavaScriptArtifact({ + input_path: archive, + format: "asar", + source_map_read_approved: true, + }); + + expect(first.graph).toEqual(second.graph); + expect(first.inventory_graph_sha256).toBe(second.inventory_graph_sha256); + expect(first.graph.graph_id).toBe(second.graph.graph_id); + expect(first.graph.nodes).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + kind: "asar-entry", + observations: expect.arrayContaining([ + expect.objectContaining({ + properties: expect.objectContaining({ + entry_sha256: expect.stringMatching(/^[a-f0-9]{64}$/u), + inventory_artifact_id: + expect.stringMatching(/^art_[a-f0-9]{64}$/u), + }), + }), + ]), + }), + expect.objectContaining({ + kind: "native-addon", + observations: expect.arrayContaining([ + expect.objectContaining({ + properties: expect.objectContaining({ + path: "native/addon.node", + unpacked: true, + }), + }), + ]), + }), + ]), + ); + expect(first.graph.edges).toContainEqual( + expect.objectContaining({ + relation: "loads", + properties: expect.objectContaining({ + resolved_path: "native/addon.node", + }), + }), + ); + }); + + it("recurses into filesystem-backed ASAR containers without losing container-relative paths", async () => { + const root = await mkdtemp(join(tmpdir(), "rea-javascript-nested-asar-")); + const source = await fixtureDirectory(); + const outer = join(root, "outer"); + const resources = join(outer, "resources"); + await mkdir(resources, { recursive: true }); + await createPackageWithOptions(source, join(resources, "app.asar"), { + unpack: "**/*.node", + }); + + const result = await reconstructJavaScriptArtifact({ + input_path: outer, + source_map_read_approved: true, + }); + + expect(result.statistics.nested_asar_containers).toBe(1); + expect(result.statistics.modules).toBe(4); + expect(result.graph.nodes).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + kind: "artifact", + observations: expect.arrayContaining([ + expect.objectContaining({ + label: "resources/app.asar", + properties: expect.objectContaining({ format: "asar" }), + }), + ]), + }), + expect.objectContaining({ + kind: "javascript-asset", + observations: expect.arrayContaining([ + expect.objectContaining({ + properties: expect.objectContaining({ + path: "resources/app.asar/main.js", + }), + }), + ]), + }), + ]), + ); + }); + + it("discovers source maps without reading them until separately approved", async () => { + const root = await fixtureDirectory(); + const unapproved = await reconstructJavaScriptArtifact({ + input_path: root, + source_map_read_approved: false, + }); + const approved = await reconstructJavaScriptArtifact({ + input_path: root, + source_map_read_approved: true, + }); + + expect( + unapproved.graph.nodes.some(({ kind }) => kind === "source-map"), + ).toBe(true); + expect( + unapproved.graph.nodes.some(({ kind }) => kind === "source-module"), + ).toBe(false); + expect(unapproved.graph.coverage).toMatchObject({ + status: "partial", + truncated: false, + omitted_count: null, + }); + expect(unapproved.statistics.policy_filtered_text_files).toBe(1); + expect(unapproved.graph.nodes).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + kind: "unknown", + observations: expect.arrayContaining([ + expect.objectContaining({ + properties: expect.objectContaining({ + operation: "parse-local-source-map", + }), + evidence: expect.objectContaining({ state: "unavailable" }), + }), + ]), + }), + ]), + ); + expect( + approved.graph.nodes.some(({ kind }) => kind === "source-module"), + ).toBe(true); + }); + + it("reports text and AST limits as truncation instead of absence", async () => { + const root = await fixtureDirectory(); + const result = await reconstructJavaScriptArtifact({ + input_path: root, + source_map_read_approved: true, + limits: { + max_text_file_bytes: 128, + max_total_text_bytes: 1_024, + max_ast_nodes: 50, + }, + }); + + expect(result.statistics.limit_omitted_text_files).toBeGreaterThan(0); + expect(result.graph.coverage).toMatchObject({ + status: "partial", + truncated: true, + }); + expect(result.graph.coverage.omitted_count).toBeGreaterThan(0); + expect(result.graph.nodes.some(({ kind }) => kind === "unknown")).toBe( + true, + ); + expect(result.graph.limitations.join(" ")).toMatch(/incomplete|bound/iu); + }); + + it("uses an unknown omission count when AST traversal reaches its bound", async () => { + const root = await mkdtemp(join(tmpdir(), "rea-javascript-ast-limit-")); + await writeFile( + join(root, "large.js"), + Array.from( + { length: 100 }, + (_, index) => `export const value${String(index)} = ${String(index)};`, + ).join("\n"), + ); + + const result = await reconstructJavaScriptArtifact({ + input_path: root, + limits: { max_ast_nodes: 50 }, + }); + + expect(result.statistics.limit_omitted_text_files).toBe(0); + expect(result.statistics.truncated_scopes).toBe(1); + expect(result.graph.coverage).toMatchObject({ + status: "partial", + truncated: true, + omitted_count: null, + }); + }); + + it("does not follow symlinks or read oversized JavaScript text", async () => { + const root = await fixtureDirectory(); + const outside = await mkdtemp(join(tmpdir(), "rea-javascript-outside-")); + const outsideFile = join(outside, "secret.js"); + await writeFile( + outsideFile, + 'fetch("https://outside-secret.invalid/credential");', + ); + await symlink(outsideFile, join(root, "escape.js")); + await writeFile( + join(root, "oversized.js"), + `const oversizedSecret = "${"private-marker-".repeat(256)}";`, + ); + + const result = await reconstructJavaScriptArtifact({ + input_path: root, + limits: { max_text_file_bytes: 512 }, + }); + const encoded = JSON.stringify(result); + + expect(result.statistics.limit_omitted_text_files).toBeGreaterThan(0); + expect(result.graph.coverage).toMatchObject({ + status: "partial", + truncated: true, + }); + expect(encoded).not.toContain(outsideFile); + expect(encoded).not.toContain("outside-secret.invalid"); + expect(encoded).not.toContain("private-marker-private-marker"); + }); + + it("keeps malformed JavaScript, package metadata, and source maps as explicit unknowns", async () => { + const root = await fixtureDirectory(); + await Promise.all([ + writeFile(join(root, "package.json"), "{"), + writeFile(join(root, "broken.js"), "function broken( {"), + writeFile(join(root, "renderer", "renderer.js.map"), "{"), + ]); + + const result = await reconstructJavaScriptArtifact({ + input_path: root, + source_map_read_approved: true, + }); + const unknownOperations = result.graph.nodes + .filter(({ kind }) => kind === "unknown") + .flatMap(({ observations }) => + observations.map(({ properties }) => properties.operation), + ); + + expect(result.statistics.parse_failures).toBeGreaterThan(0); + expect(result.graph.coverage).toMatchObject({ + status: "partial", + truncated: false, + omitted_count: null, + }); + expect(unknownOperations).toEqual( + expect.arrayContaining([ + "parse-javascript", + "parse-package-json", + "parse-local-source-map", + ]), + ); + }); + + it("applies one source-map source budget across every local map", async () => { + const root = await mkdtemp(join(tmpdir(), "rea-javascript-source-maps-")); + await Promise.all([ + writeFile( + join(root, "a.js.map"), + JSON.stringify({ + version: 3, + sources: ["a-one.ts", "a-two.ts"], + sourcesContent: ["one", "two"], + names: [], + mappings: "", + }), + ), + writeFile( + join(root, "b.js.map"), + JSON.stringify({ + version: 3, + sources: ["b-one.ts", "b-two.ts"], + sourcesContent: ["three", "four"], + names: [], + mappings: "", + }), + ), + ]); + + const result = await reconstructJavaScriptArtifact({ + input_path: root, + source_map_read_approved: true, + limits: { max_source_map_sources: 3 }, + }); + + expect( + result.graph.nodes.filter(({ kind }) => kind === "source-module"), + ).toHaveLength(3); + expect(result.graph.coverage).toMatchObject({ + status: "partial", + truncated: true, + omitted_count: null, + }); + }); + + it("bounds repeated content observations while retaining every containment path", async () => { + const root = await mkdtemp(join(tmpdir(), "rea-javascript-observations-")); + await Promise.all( + Array.from({ length: 70 }, (_, index) => + writeFile( + join(root, `duplicate-${String(index).padStart(2, "0")}.js`), + "export const same = 1;\n", + ), + ), + ); + + const result = await reconstructJavaScriptArtifact({ input_path: root }); + const duplicateNode = result.graph.nodes.find( + ({ kind, observations }) => + kind === "javascript-asset" && + observations.some(({ properties }) => + String(properties.path).startsWith("duplicate-"), + ), + ); + const duplicateEdges = result.graph.edges.filter( + ({ relation, properties }) => + relation === "contains" && + String(properties.path).startsWith("duplicate-"), + ); + + expect(duplicateNode?.observations).toHaveLength(64); + expect(duplicateEdges).toHaveLength(70); + expect(result.graph.coverage).toMatchObject({ + status: "partial", + truncated: true, + omitted_count: 6, + }); + }); + + it("rejects traversal from a production reader seam and malformed ASAR containers", async () => { + const root = await fixtureDirectory(); + const input = javascriptArtifactReconstructionInputSchema.parse({ + input_path: root, + }); + const snapshot = await scanArtifactInventory( + root, + artifactLimitsForReconstruction(input), + ); + await expect( + readJavaScriptArtifactFiles(new TraversalReader(), snapshot, input), + ).rejects.toMatchObject({ reason: "path" }); + + const malformed = join(root, "malformed.asar"); + await writeFile(malformed, "not an asar"); + await expect( + reconstructJavaScriptArtifact({ input_path: malformed }), + ).rejects.toMatchObject({ + name: "ArtifactReaderFailure", + reason: "format", + }); + }); + + it("preserves cancellation and explicit format diagnostics", async () => { + const root = await fixtureDirectory(); + const controller = new AbortController(); + controller.abort(); + await expect( + reconstructJavaScriptArtifact({ input_path: root }, controller.signal), + ).rejects.toMatchObject({ reason: "cancelled" }); + await expect( + reconstructJavaScriptArtifact({ input_path: root, format: "asar" }), + ).rejects.toMatchObject({ + reason: "format", + message: expect.stringContaining(root), + }); + expect(() => + javascriptArtifactReconstructionInputSchema.parse({ + input_path: root, + limits: { max_entries: 100_000 }, + }), + ).toThrow(/graph contract/iu); + }); +}); + +class TraversalReader implements ArtifactReader { + readonly format = "directory" as const; + + async *entries(): AsyncIterable { + yield { + path: "../escape.js", + kind: "file", + declaredSize: 1, + compressedSize: null, + executable: false, + encrypted: false, + byteOffset: null, + declaredSha256: null, + unpacked: false, + limitations: [], + adapterKey: "/tmp/escape.js", + }; + } + + open(): Promise { + return Promise.resolve(Readable.from("x")); + } + + close(): Promise { + return Promise.resolve(); + } + + provenance(): readonly [] { + return []; + } +} + +const fixtureDirectory = async (): Promise => { + const root = await mkdtemp(join(tmpdir(), "rea-javascript-artifact-")); + await writeJavaScriptArtifactFixture(root); + return root; +};