)]}'
{
  "commit": "2ed6477051834b54db04e6a9de4c02ba3c317620",
  "tree": "c2543cd017c3489300394bb7c9df6482308c19b0",
  "parents": [
    "be51fb9f4bef8a26d0e57e9fa610c443efd6b63f"
  ],
  "author": {
    "name": "Mayzner",
    "email": "mayzner@google.com",
    "time": "Wed Feb 18 13:25:16 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Feb 18 13:25:16 2026 +0000"
  },
  "message": "de: Split explore_page.ts (#4825)\n\nDecomposes the monolithic `explore_page.ts` (~1600 lines) into focused\npure-function\nmodules with explicit dependency injection, improving testability,\nreadability, and\nseparation of concerns. The file is reduced to ~560 lines while\nretaining its\norchestration role.\n\n## Changes\n\n- **`clipboard_operations.ts`** — Extract `copySelectedNodes()` and\n`pasteClipboardNodes()`\nas pure functions operating on minimal state interfaces\n(`CopyableState`, `PastableState`)\n- **`datagrid_node_creation.ts`** — Extract datagrid-triggered node\ncreation (`addFilter`,\n`addColumnFromJoinid`, `parseJoinidColumnField`,\n`findMatchingAddColumnsNode`)\n- **`node_crud_operations.ts`** — Extract node\nadd/delete/duplicate/connect/disconnect\n  operations with a `NodeCrudDeps` interface\n- **`graph_io.ts`** — Extract import/export, JSON loading, template\ninitialization, and\n  explore graph creation with a `GraphIODeps` interface\n- **`node_actions.ts`** — Extract `NodeActions` wiring into\n`createNodeActions()`,\n  `createDeferredNodeActions()`, and `ensureAllNodeActions()`; unify\n`handleInsertModifyColumnsNode`/`handleInsertCounterToIntervalsNode`\ninto a single\n  generic `insertNodeAtPort()` function\n- **`GraphCallbacks` interface** — Group 14 graph callbacks in\n`graph.ts`, passed as a\nsingle `graphCallbacks` field through `BuilderAttrs`, eliminating manual\nforwarding\n- Add comprehensive unit tests for `clipboard_operations`,\n`datagrid_node_creation`,\n  and `node_actions`\n- Update architecture design doc to reflect the new modular structure",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "0df003e9edd2204b505891a7c7c465a170b1799f",
      "old_mode": 33188,
      "old_path": "docs/design-docs/explore-page-architecture.md",
      "new_id": "6b7477a9528d3d79837587a053b4c132ba317f6c",
      "new_mode": 33188,
      "new_path": "docs/design-docs/explore-page-architecture.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3ecc993c1ed347b6cf4a667a4cf9e389fede41d9",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/clipboard_operations.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "56db225ea9131b91f545da82458f471d6122c0a7",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/clipboard_operations_unittest.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "046e0296d525c2a0052cdeabc05cb3803eddecea",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/datagrid_node_creation.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "df5f1427980d9168ca86545194de3ba1e9325a20",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/datagrid_node_creation_unittest.ts"
    },
    {
      "type": "modify",
      "old_id": "549a27f34d7e13ea9b2bca1397eef82fc1dd9f73",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/dev.perfetto.ExplorePage/explore_page.ts",
      "new_id": "d285eb48a226ab40e956154cc2856c7c901148e3",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/explore_page.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f56a5803d32e308a1104ed40afc784b20a9c7dfe",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/graph_io.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "caa6158f8253bf32075e1793df7efb379996179d",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/node_actions.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0a4968b9339b6ff64e84af4c9f7239a0d69bf1ec",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/node_actions_unittest.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3f749a6b1264568a516a608cd164e14ca6a20bec",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/node_crud_operations.ts"
    },
    {
      "type": "modify",
      "old_id": "cd6cd3a4d0667a46fbfd131435412b3cb7103472",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/dev.perfetto.ExplorePage/query_builder/builder.ts",
      "new_id": "aa885486785b7d317473e85e04dc777cc39ada06",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/query_builder/builder.ts"
    },
    {
      "type": "modify",
      "old_id": "eea44c0454d6937cce6671da355daf03328eb1bb",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/dev.perfetto.ExplorePage/query_builder/graph/graph.ts",
      "new_id": "17dd6109e7c4dc9ea003c1b55cf629fdb1107a8e",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.ExplorePage/query_builder/graph/graph.ts"
    }
  ]
}
