{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "814b9103-b8dc-42eb-8b11-af37a0a67b6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import groggy as gr\n",
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5b3e37c5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting API Meta-Graph extraction...\n",
      "API Meta-Graph Extraction\n",
      "==================================================\n",
      "Discovering Groggy API structure...\n",
      "  Checking groggy module for available types...\n",
      "    Found AggregationFunction class (could not instantiate)\n",
      "    Found AggregationResult class (could not instantiate)\n",
      "    Created AttrName instance\n",
      "    Found AttrValue class (could not instantiate)\n",
      "    Found AttributeFilter class (could not instantiate)\n",
      "    Found BaseArray class (could not instantiate)\n",
      "    Created BaseTable instance\n",
      "    Found BranchInfo class (could not instantiate)\n",
      "    Created BranchName instance\n",
      "    Found Commit class (could not instantiate)\n",
      "    Found ComponentsArray class (could not instantiate)\n",
      "    Created DisplayConfig instance\n",
      "    Found EdgeFilter class (could not instantiate)\n",
      "    Created EdgeId instance\n",
      "    Found EdgeNotFoundError class (could not instantiate)\n",
      "    Found EdgesArray class (could not instantiate)\n",
      "    Found EdgesTable class (could not instantiate)\n",
      "    Found GraphMatrix class (could not instantiate)\n",
      "    Found GraphTable class (could not instantiate)\n",
      "    Created GroggyError instance\n",
      "    Found GroupedAggregationResult class (could not instantiate)\n",
      "    Found HistoricalView class (could not instantiate)\n",
      "    Found HistoryStatistics class (could not instantiate)\n",
      "    Created InvalidInputError instance\n",
      "    Found MetaNode class (could not instantiate)\n",
      "    Found MetaNodeArray class (could not instantiate)\n",
      "    Found NodeFilter class (could not instantiate)\n",
      "    Created NodeId instance\n",
      "    Found NodeNotFoundError class (could not instantiate)\n",
      "    Found NodesArray class (could not instantiate)\n",
      "    Found NodesTable class (could not instantiate)\n",
      "    Found NotImplementedError class (could not instantiate)\n",
      "    Found NumArray class (could not instantiate)\n",
      "    Found PyAttributeCollection class (could not instantiate)\n",
      "    Found PyResultHandle class (could not instantiate)\n",
      "    Created StateId instance\n",
      "    Found StatsArray class (could not instantiate)\n",
      "    Found Subgraph class (could not instantiate)\n",
      "    Found SubgraphArray class (could not instantiate)\n",
      "    Found TableFormatter class (could not instantiate)\n",
      "  Creating objects through Graph API usage...\n",
      "    Found NodesAccessor: <class 'builtins.NodesAccessor'>\n",
      "    Found EdgesAccessor: <class 'builtins.EdgesAccessor'>\n",
      "    Found GraphTable: <class 'groggy.GraphTable'>\n",
      "    Found NodesTable: <class 'groggy.NodesTable'>\n",
      "    Found EdgesTable: <class 'groggy.EdgesTable'>\n",
      "    Found NodesArray: <class 'builtins.NodesArray'>\n",
      "    Found NumArray: <class 'builtins.NumArray'>\n",
      "    Found SubgraphArray: <class 'builtins.SubgraphArray'>\n",
      "    Found TableArray: <class 'builtins.TableArray'>\n",
      "    Found Subgraph: <class 'builtins.Subgraph'>\n",
      "    Found GraphMatrix: <class 'builtins.GraphMatrix'>\n",
      "    Found ComponentsArray: <class 'builtins.ComponentsArray'>\n",
      "  Total objects discovered: 22\n",
      "  Object types: Graph, AttrName, BaseTable, BranchName, DisplayConfig, EdgeId, GroggyError, InvalidInputError, NodeId, StateId, NodesAccessor, EdgesAccessor, GraphTable, NodesTable, EdgesTable, NodesArray, NumArray, SubgraphArray, TableArray, Subgraph, GraphMatrix, ComponentsArray\n",
      "  Analyzing Graph...\n",
      "  Analyzing AttrName...\n",
      "    Warning: Could not analyze AttrName.count: no signature found for builtin <built-in method count of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.endswith: no signature found for builtin <built-in method endswith of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.find: no signature found for builtin <built-in method find of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.format: no signature found for builtin <built-in method format of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.format_map: no signature found for builtin <built-in method format_map of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.index: no signature found for builtin <built-in method index of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.maketrans: <built-in method maketrans of type object at 0x1014b9110> builtin has invalid signature\n",
      "    Warning: Could not analyze AttrName.rfind: no signature found for builtin <built-in method rfind of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.rindex: no signature found for builtin <built-in method rindex of str object at 0x100a70670>\n",
      "    Warning: Could not analyze AttrName.startswith: no signature found for builtin <built-in method startswith of str object at 0x100a70670>\n",
      "  Analyzing BaseTable...\n",
      "  Analyzing BranchName...\n",
      "    Warning: Could not analyze BranchName.count: no signature found for builtin <built-in method count of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.endswith: no signature found for builtin <built-in method endswith of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.find: no signature found for builtin <built-in method find of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.format: no signature found for builtin <built-in method format of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.format_map: no signature found for builtin <built-in method format_map of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.index: no signature found for builtin <built-in method index of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.maketrans: <built-in method maketrans of type object at 0x1014b9110> builtin has invalid signature\n",
      "    Warning: Could not analyze BranchName.rfind: no signature found for builtin <built-in method rfind of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.rindex: no signature found for builtin <built-in method rindex of str object at 0x100a70670>\n",
      "    Warning: Could not analyze BranchName.startswith: no signature found for builtin <built-in method startswith of str object at 0x100a70670>\n",
      "  Analyzing DisplayConfig...\n",
      "  Analyzing EdgeId...\n",
      "    Warning: Could not analyze EdgeId.conjugate: no signature found for builtin <built-in method conjugate of int object at 0x100a42910>\n",
      "  Analyzing GroggyError...\n",
      "    Warning: Could not analyze GroggyError.with_traceback: no signature found for builtin <built-in method with_traceback of GroggyError object at 0x1037d5be0>\n",
      "  Analyzing InvalidInputError...\n",
      "    Warning: Could not analyze InvalidInputError.with_traceback: no signature found for builtin <built-in method with_traceback of InvalidInputError object at 0x1037d5ca0>\n",
      "  Analyzing NodeId...\n",
      "    Warning: Could not analyze NodeId.conjugate: no signature found for builtin <built-in method conjugate of int object at 0x100a42910>\n",
      "  Analyzing StateId...\n",
      "    Warning: Could not analyze StateId.conjugate: no signature found for builtin <built-in method conjugate of int object at 0x100a42910>\n",
      "  Analyzing NodesAccessor...\n",
      "  Analyzing EdgesAccessor...\n",
      "  Analyzing GraphTable...\n",
      "  Analyzing NodesTable...\n",
      "  Analyzing EdgesTable...\n",
      "  Analyzing NodesArray...\n",
      "  Analyzing NumArray...\n",
      "  Analyzing SubgraphArray...\n",
      "  Analyzing TableArray...\n",
      "  Analyzing Subgraph...\n",
      "  Analyzing GraphMatrix...\n",
      "  Analyzing ComponentsArray...\n",
      "Discovered 525 methods across 22 object types\n",
      "Found 41 unique types\n",
      "\n",
      "Building meta-graph...\n",
      "  Adding 41 type nodes...\n",
      "  Adding 525 method edges...\n",
      "Meta-graph created: 41 nodes, 525 edges\n",
      "\n",
      "🎉 Successfully created meta-graph!\n",
      "   Nodes (Types): 41\n",
      "   Edges (Methods): 525\n",
      "   Types discovered: 41\n",
      "\n",
      "Graph object: Graph(nodes=41, edges=525)\n",
      "Node count: 41\n",
      "Edge count: 525\n"
     ]
    }
   ],
   "source": [
    "# Streamlined API Meta-Graph Creation\n",
    "# This replaces the complex 3-step process with a single focused extraction\n",
    "\n",
    "import sys\n",
    "sys.path.append('.')\n",
    "\n",
    "# Import our streamlined extractor\n",
    "from api_meta_graph_extractor import APIMetaGraphExtractor\n",
    "\n",
    "# Create the extractor\n",
    "extractor = APIMetaGraphExtractor()\n",
    "\n",
    "# Extract the complete meta-graph\n",
    "print(\"Starting API Meta-Graph extraction...\")\n",
    "meta_graph, summary = extractor.extract_complete_meta_graph()\n",
    "\n",
    "print(f\"\\n🎉 Successfully created meta-graph!\")\n",
    "print(f\"   Nodes (Types): {summary['meta_graph_stats']['nodes']}\")\n",
    "print(f\"   Edges (Methods): {summary['meta_graph_stats']['edges']}\")\n",
    "print(f\"   Types discovered: {summary['meta_graph_stats']['types_discovered']}\")\n",
    "\n",
    "# Show the graph structure\n",
    "print(f\"\\nGraph object: {meta_graph}\")\n",
    "print(f\"Node count: {meta_graph.node_count()}\")\n",
    "print(f\"Edge count: {meta_graph.edge_count()}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e46bad6f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-string\" data-type=\"string\" title=\"Column: category (string)\">category</th><th class=\"col-string\" data-type=\"string\" title=\"Column: class_name (string)\">class_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: description (string)\">description</th><th class=\"col-string\" data-type=\"string\" title=\"Column: docstring (string)\">docstring</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: methods_count (integer)\">methods_count</th><th class=\"col-string\" data-type=\"string\" title=\"Column: module (string)\">module</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: node_id (integer)\">node_id</th><th class=\"col-string\" data-type=\"string\" title=\"Column: type_name (string)\">type_name</th></tr></thead><tbody><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">inferred</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">11</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">str</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">core</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesAccessor</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Wrapper for g.edges that supports indexing syntax: g.edges[id] -&gt; EdgeView  \">Wrapper for g.edges that supports indexing syntax: g.edges[id] -&gt; EdgeView  </td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">7</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">builtins</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">17</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesAccessor</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">inferred</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">29</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Table</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">core</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">SubgraphArray</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Specialized array for PySubgraph objects\">Specialized array for PySubgraph objects</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">7</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">builtins</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">14</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">SubgraphArray</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">inferred</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">7</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Transformed</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">core</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">TableArray</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Specialized array for table objects (PyObject wrapper for tables)\">Specialized array for table objects (PyObject wrapper for tables)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">6</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">builtins</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">23</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">TableArray</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">core</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Python wrapper for BaseTable\">Python wrapper for BaseTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">92</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">groggy</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">34</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">inferred</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\"></td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">nan</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">32</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphAnalysis</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>41 rows x 8 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (41 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "NodesTable[41 x 8]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta_graph.nodes.table()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "fb158a8b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['doc',\n",
       " 'edge_id',\n",
       " 'enhanced_signature',\n",
       " 'is_property',\n",
       " 'method_full_name',\n",
       " 'name',\n",
       " 'object_type',\n",
       " 'parameter_types',\n",
       " 'parameters_count',\n",
       " 'relationship',\n",
       " 'requires_parameters',\n",
       " 'return_type',\n",
       " 'signature',\n",
       " 'source',\n",
       " 'source_object',\n",
       " 'source_type',\n",
       " 'target']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta_graph.edges.table().column_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3dc55f0e-0b82-4c2e-8fd4-c297d425ef37",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-unknown\" data-type=\"unknown\" title=\"Column: doc (unknown)\">doc</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: edge_id (integer)\">edge_id</th><th class=\"col-string\" data-type=\"string\" title=\"Column: enhanced_signature (string)\">enhanced_signature</th><th class=\"col-boolean\" data-type=\"boolean\" title=\"Column: is_property (boolean)\">is_property</th><th class=\"col-string\" data-type=\"string\" title=\"Column: method_full_name (string)\">method_full_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: name (string)\">name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: object_type (string)\">object_type</th><th class=\"col-string\" data-type=\"string\" title=\"Column: parameter_types (string)\">parameter_types</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: parameters_count (integer)\">parameters_count</th><th class=\"col-string\" data-type=\"string\" title=\"Column: relationship (string)\">relationship</th><th class=\"col-string\" data-type=\"string\" title=\"Column: requires_parameters (string)\">requires_parameters</th><th class=\"col-string\" data-type=\"string\" title=\"Column: return_type (string)\">return_type</th><th class=\"col-string\" data-type=\"string\" title=\"Column: signature (string)\">signature</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: source (integer)\">source</th><th class=\"col-string\" data-type=\"string\" title=\"Column: source_object (string)\">source_object</th><th class=\"col-string\" data-type=\"string\" title=\"Column: source_type (string)\">source_type</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: target (integer)\">target</th></tr></thead><tbody><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Repeat elements of the matrix along a specified axis\n",
       "Args: repeats - number of times to repeat, axis - 0 for rows, 1 for columns\">Repeat elements of the matrix along a specified axis\n",
       "Args: repeats - number of times to repeat, axis - 0 for rows, 1 for columns</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">485</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(repeats, axis)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix.repeat</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">repeat</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix -&gt; float</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;repeats&quot;, &quot;axis&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">float</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(repeats, axis)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td></tr><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Return a copy with all occurrences of substring old replaced by new.\n",
       "\n",
       "  count\n",
       "    Maximum number of occurrences to replace.\n",
       "    -1 (the default value) means replace all occurrences.\n",
       "\n",
       "If the optional argument count is given, only the first count occurrences are\n",
       "replaced.\">Return a copy with all occurrences of substring old replaced by new.\n",
       "\n",
       "  count\n",
       "    Maximum number of occurrences to replace.\n",
       "    -1 (the default value) means replace all occurrences.\n",
       "\n",
       "If the optional argument count is given, only the first count occurrences are\n",
       "replaced.</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">211</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(old, new, count=-1)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName.replace</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">replace</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">3</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName -&gt; float</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;old&quot;, &quot;new&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">float</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: (old, new, count=-1, /)\">(old, new, count=-1, /)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">16</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td></tr><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Check if there are uncommitted changes (FFI wrapper around core history system)\">Check if there are uncommitted changes (FFI wrapper around core history system)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">34</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Graph.has_uncommitted_changes\">Graph.has_uncommitted_changes</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: has_uncommitted_changes\">has_uncommitted_changes</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph -&gt; Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">37</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td></tr><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Get a NodesTable representation of accessible nodes  \n",
       "Implements: g.nodes.table()\">Get a NodesTable representation of accessible nodes  \n",
       "Implements: g.nodes.table()</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">244</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor.table</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">table</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: NodesAccessor -&gt; NodesTable\">NodesAccessor -&gt; NodesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">20</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">28</td></tr><tr><td class=\"cell-unknown\" data-type=\"unknown\" title=\"unknown value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td></tr><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Return a copy of the string with trailing whitespace removed.\n",
       "\n",
       "If chars is given and not None, remove characters in chars instead.\">Return a copy of the string with trailing whitespace removed.\n",
       "\n",
       "If chars is given and not None, remove characters in chars instead.</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">215</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(chars=None)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName.rstrip</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">rstrip</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName -&gt; str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(chars=None, /)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">16</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">11</td></tr><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Get the last NodesAccessor  \">Get the last NodesAccessor  </td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">346</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesArray.last</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">last</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesArray</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: NodesArray -&gt; NodesAccessor\">NodesArray -&gt; NodesAccessor</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">39</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesArray</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesArray</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">20</td></tr><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Drop rows by indices\n",
       "\n",
       "# Arguments\n",
       "* `indices` - List of row indices to drop\n",
       "\n",
       "# Examples\n",
       "```python\n",
       "new_table = table.drop_rows([0, 2, 4])  # Drop rows at indices 0, 2, and 4\n",
       "```\">Drop rows by indices\n",
       "\n",
       "# Arguments\n",
       "* `indices` - List of row indices to drop\n",
       "\n",
       "# Examples\n",
       "```python\n",
       "new_table = table.drop_rows([0, 2, 4])  # Drop rows at indices 0, 2, and 4\n",
       "```</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">118</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(indices)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable.drop_rows</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">drop_rows</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable -&gt; list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;indices&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(indices)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">34</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">22</td></tr><tr><td class=\"cell-unknown cell-truncated\" data-type=\"unknown\" title=\"Full value: Check if column exists\">Check if column exists</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">139</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(name)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable.has_column</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">has_column</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable -&gt; Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;name&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(name)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">34</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>525 rows x 17 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (525 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "EdgesTable[525 x 17]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta_graph.edges.table()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "46ce6184",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-integer\" data-type=\"integer\" title=\"Column: edge_id (integer)\">edge_id</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: source (integer)\">source</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: target (integer)\">target</th><th class=\"col-string\" data-type=\"string\" title=\"Column: name (string)\">name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: source_type (string)\">source_type</th><th class=\"col-string\" data-type=\"string\" title=\"Column: return_type (string)\">return_type</th></tr></thead><tbody><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">485</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">repeat</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">float</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">211</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">16</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">replace</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">float</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">34</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">37</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: has_uncommitted_changes\">has_uncommitted_changes</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">244</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">20</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">28</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">table</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesTable</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">215</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">16</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">11</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">rstrip</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BranchName</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">str</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">346</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">39</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">20</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">last</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesArray</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">118</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">34</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">22</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">drop_rows</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">139</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">34</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">has_column</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>525 rows x 6 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (525 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "EdgesTable[525 x 6]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta_graph.edges.table()[['name', 'source_type', 'return_type']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "48762d2d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-integer\" data-type=\"integer\" title=\"Column: edge_id (integer)\">edge_id</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: source (integer)\">source</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: target (integer)\">target</th><th class=\"col-string\" data-type=\"string\" title=\"Column: name (string)\">name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: source_type (string)\">source_type</th><th class=\"col-string\" data-type=\"string\" title=\"Column: return_type (string)\">return_type</th></tr></thead><tbody><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">446</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">elementwise_multiply</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">466</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">log</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">479</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">38</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">ones</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Matrix</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">511</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">to_pandas</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">492</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">38</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">softmax</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Matrix</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">445</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: eigenvalue_decomposition\">eigenvalue_decomposition</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">476</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">38</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">norm</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Matrix</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">509</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">38</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: to_normalized_laplacian\">to_normalized_laplacian</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Matrix</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>82 rows x 6 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (82 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "EdgesTable[82 x 6]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta_graph.edges[meta_graph.edges['source_type'] == 'GraphMatrix'].edges.table()[['name', 'source_type', 'return_type']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3d70eb59",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Error accessing nodes: 'builtins.NodesAccessor' object is not callable\n",
      "Showing discovered types from summary instead:\n",
      "  1. AttrName (Core)\n",
      "  2. BaseArray (Inferred)\n",
      "  3. BaseTable (Core)\n",
      "  4. BranchName (Core)\n",
      "  5. Commit (Inferred)\n"
     ]
    }
   ],
   "source": [
    "# Access nodes table properly\n",
    "try:\n",
    "    nodes_table = meta_graph.nodes()\n",
    "    print(f\"Nodes table shape: {nodes_table.shape()}\")\n",
    "    print(\"\\nFirst 5 type nodes:\")\n",
    "    nodes_table.head(5)\n",
    "except Exception as e:\n",
    "    print(f\"Error accessing nodes: {e}\")\n",
    "    print(\"Showing discovered types from summary instead:\")\n",
    "    for i, type_name in enumerate(sorted(summary['discovery_data']['types'])[:5]):\n",
    "        status = \"Core\" if type_name in summary['type_info'] else \"Inferred\"\n",
    "        print(f\"  {i+1}. {type_name} ({status})\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e10c7bd6-11a3-489c-845f-1e6b00803dac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-string\" data-type=\"string\" title=\"Column: doc (string)\">doc</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: edge_id (integer)\">edge_id</th><th class=\"col-string\" data-type=\"string\" title=\"Column: enhanced_signature (string)\">enhanced_signature</th><th class=\"col-boolean\" data-type=\"boolean\" title=\"Column: is_property (boolean)\">is_property</th><th class=\"col-string\" data-type=\"string\" title=\"Column: method_full_name (string)\">method_full_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: name (string)\">name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: object_type (string)\">object_type</th><th class=\"col-string\" data-type=\"string\" title=\"Column: parameter_types (string)\">parameter_types</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: parameters_count (integer)\">parameters_count</th><th class=\"col-string\" data-type=\"string\" title=\"Column: relationship (string)\">relationship</th><th class=\"col-string\" data-type=\"string\" title=\"Column: requires_parameters (string)\">requires_parameters</th><th class=\"col-string\" data-type=\"string\" title=\"Column: return_type (string)\">return_type</th><th class=\"col-string\" data-type=\"string\" title=\"Column: signature (string)\">signature</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: source (integer)\">source</th><th class=\"col-string\" data-type=\"string\" title=\"Column: source_object (string)\">source_object</th><th class=\"col-string\" data-type=\"string\" title=\"Column: source_type (string)\">source_type</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: target (integer)\">target</th></tr></thead><tbody><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Get unique values for an attribute\">Get unique values for an attribute</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">338</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(attr_name)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: EdgesTable.unique_attr_values\">EdgesTable.unique_attr_values</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">unique_attr_values</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: EdgesTable -&gt; Unknown\">EdgesTable -&gt; Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;attr_name&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(attr_name)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td></tr><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Launch interactive visualization for this EdgesTable (new visualization system)\n",
       "\n",
       "# Arguments\n",
       "* `port` - Optional port number (0 for auto-assign)\n",
       "* `layout` - Layout algorithm: \\&quot;force-directed\\&quot;, \\&quot;circular\\&quot;, \\&quot;grid\\&quot;, \\&quot;hierarchical\\&quot;\n",
       "* `theme` - Visual theme: \\&quot;light\\&quot;, \\&quot;dark\\&quot;, \\&quot;publication\\&quot;, \\&quot;minimal\\&quot;\n",
       "* `width` - Canvas width in pixels\n",
       "* `height` - Canvas height in pixels\n",
       "\n",
       "# Returns\n",
       "VizAccessor for launching interactive visualization\">Launch interactive visualization for this EdgesTable (new visualization system)\n",
       "\n",
       "# Arguments\n",
       "* `port` - Optional port number (0 for auto-assign)\n",
       "* `layout` - Layout algorithm: \\&quot;force-directed\\&quot;, \\&quot;circular\\&quot;, \\&quot;grid\\&quot;, \\&quot;hierarchical\\&quot;\n",
       "* `theme` - Visual theme: \\&quot;light\\&quot;, \\&quot;dark\\&quot;, \\&quot;publication\\&quot;, \\&quot;minimal\\&quot;\n",
       "* `width` - Canvas width in pixels\n",
       "* `height` - Canvas height in pixels\n",
       "\n",
       "# Returns\n",
       "VizAccessor for launching interactive visualization</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">320</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: (port=None, layout=None, theme=None, width=None, height=None)\">(port=None, layout=None, theme=None, width=None, height=None)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: EdgesTable.interactive_viz\">EdgesTable.interactive_viz</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">interactive_viz</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">5</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable -&gt; float</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">float</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: (port=None, layout=None, theme=None, width=None, height=None)\">(port=None, layout=None, theme=None, width=None, height=None)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td></tr><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Drop columns from the table (cannot drop edge_id, source, or target)\n",
       "\n",
       "Args:\n",
       "    columns: List of column names to drop\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new table without the specified columns\">Drop columns from the table (cannot drop edge_id, source, or target)\n",
       "\n",
       "Args:\n",
       "    columns: List of column names to drop\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new table without the specified columns</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">306</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(columns)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: EdgesTable.drop_columns\">EdgesTable.drop_columns</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">drop_columns</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable -&gt; list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;columns&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(columns)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">22</td></tr><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Select specific columns to create a new table\n",
       "\n",
       "Args:\n",
       "    columns: List of column names to select\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new table with only the selected columns\">Select specific columns to create a new table\n",
       "\n",
       "Args:\n",
       "    columns: List of column names to select\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new table with only the selected columns</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">326</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(columns)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable.select</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">select</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable -&gt; list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;columns&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(columns)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">22</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td></tr><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Filter rows using a query expression or Python function\n",
       "\n",
       "Args:\n",
       "    predicate: Either a string query expression (e.g. &quot;weight &gt; 0.5&quot;) or a Python function\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new table with filtered rows\">Filter rows using a query expression or Python function\n",
       "\n",
       "Args:\n",
       "    predicate: Either a string query expression (e.g. &quot;weight &gt; 0.5&quot;) or a Python function\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new table with filtered rows</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">308</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(predicate)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable.filter</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">filter</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable -&gt; str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;predicate&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">(predicate)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">11</td></tr><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Launch interactive streaming table view in browser\n",
       "\n",
       "Returns the URL where the interactive table can be viewed.\n",
       "The table will be available for real-time exploration with virtual scrolling,\n",
       "filtering, and other interactive features.\n",
       "\n",
       "Returns:\n",
       "    str: URL of the interactive table interface\">Launch interactive streaming table view in browser\n",
       "\n",
       "Returns the URL where the interactive table can be viewed.\n",
       "The table will be available for real-time exploration with virtual scrolling,\n",
       "filtering, and other interactive features.\n",
       "\n",
       "Returns:\n",
       "    str: URL of the interactive table interface</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">318</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: EdgesTable.interactive\">EdgesTable.interactive</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">interactive</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable -&gt; str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">11</td></tr><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Convert to pandas DataFrame\">Convert to pandas DataFrame</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">336</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable.to_pandas</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">to_pandas</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: EdgesTable -&gt; Unknown\">EdgesTable -&gt; Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Unknown</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">()</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td></tr><tr><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Sort table by column\n",
       "\n",
       "Args:\n",
       "    column: Name of the column to sort by\n",
       "    ascending: If True, sort in ascending order; if False, descending\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new sorted table\">Sort table by column\n",
       "\n",
       "Args:\n",
       "    column: Name of the column to sort by\n",
       "    ascending: If True, sort in ascending order; if False, descending\n",
       "\n",
       "Returns:\n",
       "    PyEdgesTable: A new sorted table</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">329</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: (column, ascending=True)\">(column, ascending=True)</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable.sort_by</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">sort_by</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">{}</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: EdgesTable -&gt; EdgesTable\">EdgesTable -&gt; EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">[&quot;column&quot;]</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: (column, ascending=True)\">(column, ascending=True)</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">21</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>36 rows x 17 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (36 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "EdgesTable[36 x 17]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta_graph.edges.group_by('source_object')[7].edges.table()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "864af2cc-64e9-4bf0-a9c6-6b4b60f2b02e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x107134d30>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "[encoded data, 10744 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.imshow(meta_graph.adj().data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "3891a908-6991-4bdb-aa18-1c5d51a941f3",
   "metadata": {},
   "outputs": [],
   "source": [
    "meta_graph.table().save_bundle('./meta_graph_bundle/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b4639bb-c927-43ac-8c0e-ae082dba6861",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
