Shared memory and context tools for agentic work.
Code Rooms
<!DOCTYPE HTML>
<html lang="en" class="navy sidebar-visible" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>Perspective Navigation - m1nd Documentation</title>
<!-- Custom HTML head -->
<meta name="description" content="Complete documentation for m1nd — the local code graph engine for MCP agents">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="../favicon-de23e50b.svg">
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
<link rel="stylesheet" href="../css/variables-8adf115d.css">
<link rel="stylesheet" href="../css/general-2459343d.css">
<link rel="stylesheet" href="../css/chrome-ae938929.css">
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
<!-- Custom theme stylesheets -->
<!-- Provide site root and default themes to javascript -->
<script>
const path_to_root = "../";
const default_light_theme = "navy";
const default_dark_theme = "navy";
window.path_to_searchindex_js = "../searchindex-f21ec352.js";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc-a37108d1.js"></script>
</head>
<body>
<div id="mdbook-help-container">
<div id="mdbook-help-popup">
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
<div>
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
<p>Press <kbd>?</kbd> to show this help</p>
<p>Press <kbd>Esc</kbd> to hide this help</p>
</div>
<div id="mdbook-body-container">
<!-- Work around some values being stored in localStorage wrapped in quotes -->
try {
let theme = localStorage.getItem('mdbook-theme');
let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
} catch (e) { }
<!-- Set the theme before any content is loaded, prevents flash -->
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
html.classList.remove('navy')
html.classList.add(theme);
html.classList.add("js");
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
let sidebar = null;
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
sidebar_toggle.checked = false;
if (sidebar === 'visible') {
sidebar_toggle.checked = true;
html.classList.remove('sidebar-visible');
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
<!-- populated by js -->
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
<noscript>
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
</noscript>
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
</nav>
<div id="mdbook-page-wrapper" class="page-wrapper">
<div class="page">
<div id="mdbook-menu-bar-hover-placeholder"></div>
<div id="mdbook-menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
</label>
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
</button>
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
</ul>
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
<h1 class="menu-title">m1nd Documentation</h1>
<div class="right-buttons">
<a href="../print.html" title="Print this book" aria-label="Print this book">
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
</a>
<a href="https://github.com/maxkle1nz/m1nd" title="Git repository" aria-label="Git repository">
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
<a href="https://github.com/maxkle1nz/m1nd/edit/main/docs/wiki/src/src/api-reference/perspectives.md" title="Suggest an edit" aria-label="Suggest an edit" rel="edit">
<span class=fa-svg id="git-edit-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M421.7 220.3l-11.3 11.3-22.6 22.6-205 205c-6.6 6.6-14.8 11.5-23.8 14.1L30.8 511c-8.4 2.5-17.5 .2-23.7-6.1S-1.5 489.7 1 481.2L38.7 353.1c2.6-9 7.5-17.2 14.1-23.8l205-205 22.6-22.6 11.3-11.3 33.9 33.9 62.1 62.1 33.9 33.9zM96 353.9l-9.3 9.3c-.9 .9-1.6 2.1-2 3.4l-25.3 86 86-25.3c1.3-.4 2.5-1.1 3.4-2l9.3-9.3H112c-8.8 0-16-7.2-16-16V353.9zM453.3 19.3l39.4 39.4c25 25 25 65.5 0 90.5l-14.5 14.5-22.6 22.6-11.3 11.3-33.9-33.9-62.1-62.1L314.3 67.7l11.3-11.3 22.6-22.6 14.5-14.5c25-25 65.5-25 90.5 0z"/></svg></span>
<div id="mdbook-search-wrapper" class="hidden">
<form id="mdbook-searchbar-outer" class="searchbar-outer">
<div class="search-wrapper">
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
<div class="spinner-wrapper">
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
</form>
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
<ul id="mdbook-searchresults">
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
<div id="mdbook-content" class="content">
<main>
<h1 id="perspective-tools"><a class="header" href="#perspective-tools">Perspective Tools</a></h1>
<p>Twelve tools for stateful, navigable exploration of the code graph. Perspectives are m1nd’s primary interface for guided codebase exploration – they synthesize routes (weighted navigation suggestions) from a query, then let you follow, inspect, branch, and compare routes.</p>
<h2 id="core-concepts"><a class="header" href="#core-concepts">Core Concepts</a></h2>
<p><strong>Perspective</strong>: A stateful exploration session. Created from a query, it synthesizes a set of <em>routes</em> from the current graph state. The agent navigates by following routes, which moves the <em>focus</em> and generates new routes.</p>
<p><strong>Route</strong>: A suggested direction of exploration. Each route points to a target node and carries a score, a family classification, and a path preview.</p>
<p><strong>Focus</strong>: The current node the perspective is centered on. Following a route moves the focus. <code>back</code> restores the previous focus.</p>
<p><strong>Mode</strong>: Either <code>"anchored"</code> (routes stay related to an anchor node) or <code>"local"</code> (routes synthesized purely from the current focus). Anchored mode degrades to local if navigation moves more than 8 hops from the anchor.</p>
<p><strong>Route Set Version</strong>: A version counter for the current route set. Clients must pass this in subsequent calls for staleness detection. If the graph changes between calls, the version changes and stale requests are rejected.</p>
<p><strong>Lens</strong>: Optional filtering configuration for perspectives (dimension weights, node type filters, etc.).</p>
<hr>
<h2 id="perspective_start"><a class="header" href="#perspective_start"><code>perspective_start</code></a></h2>
<p>Enter a perspective: creates a navigable route surface from a query. Returns the initial set of routes.</p>
<h3 id="parameters"><a class="header" href="#parameters">Parameters</a></h3>
<div class="table-wrapper">
<table>
<thead>
<tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr>
</thead>
<tbody>
<tr><td><code>agent_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Calling agent identifier.</td></tr>
<tr><td><code>query</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Seed query for route synthesis.</td></tr>
<tr><td><code>anchor_node</code></td><td><code>string</code></td><td>No</td><td>–</td><td>Anchor to a specific node. If provided, activates anchored mode where all routes maintain relevance to this node.</td></tr>
<tr><td><code>lens</code></td><td><code>object</code></td><td>No</td><td>–</td><td>Starting lens configuration. Controls dimension weights, node type filters, etc.</td></tr>
</tbody>
</table>
<h3 id="example-request"><a class="header" href="#example-request">Example Request</a></h3>
<pre><code class="language-json">{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "perspective_start",
"arguments": {
"agent_id": "agent-1",
"query": "session management and connection pooling",
"anchor_node": "file::session_pool.py"
</code></pre>
<h3 id="example-response"><a class="header" href="#example-response">Example Response</a></h3>
"perspective_id": "persp_agent1_001",
"mode": "anchored",
"anchor_node": "file::session_pool.py",
"focus_node": "file::session_pool.py",
"routes": [
{
"route_id": "R_a1b2c3",
"index": 1,
"target_node": "file::worker_pool.py",
"target_label": "worker_pool.py",
"family": "structural_neighbor",
"score": 0.89,
"path_preview": ["session_pool.py", "worker_pool.py"],
"reason": "High structural coupling with anchor"
},
"route_id": "R_d4e5f6",
"index": 2,
"target_node": "file::process_manager.py",
"target_label": "process_manager.py",
"family": "causal_downstream",
"score": 0.76,
"path_preview": ["session_pool.py", "process_manager.py"],
"reason": "Causal dependency via imports"
],
"total_routes": 12,
"page": 1,
"total_pages": 2,
"route_set_version": 100,
"cache_generation": 42,
"suggested": "inspect R_a1b2c3 for structural details"
<h3 id="when-to-use"><a class="header" href="#when-to-use">When to Use</a></h3>
<ul>
<li><strong>Guided exploration</strong> – when you want to explore a topic interactively</li>
<li><strong>Codebase navigation</strong> – start from a known file and discover related code</li>
<li><strong>Investigation</strong> – anchor to a suspicious file and follow routes to find related issues</li>
<h3 id="related-tools"><a class="header" href="#related-tools">Related Tools</a></h3>
<li><a href="activation.html#m1ndactivate"><code>m1nd.activate</code></a> – one-shot query without navigation state</li>
<li><a href="#m1ndperspectiveroutes"><code>m1nd.perspective.routes</code></a> – paginate through routes</li>
<li><a href="#m1ndperspectivefollow"><code>m1nd.perspective.follow</code></a> – follow a route to navigate</li>
<h2 id="m1ndperspectiveroutes"><a class="header" href="#m1ndperspectiveroutes"><code>m1nd.perspective.routes</code></a></h2>
<p>Browse the current route set with pagination.</p>
<h3 id="parameters-1"><a class="header" href="#parameters-1">Parameters</a></h3>
<tr><td><code>perspective_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Perspective to browse.</td></tr>
<tr><td><code>page</code></td><td><code>integer</code></td><td>No</td><td><code>1</code></td><td>Page number (1-based).</td></tr>
<tr><td><code>page_size</code></td><td><code>integer</code></td><td>No</td><td><code>6</code></td><td>Routes per page. Clamped to <code>[1, 10]</code>.</td></tr>
<tr><td><code>route_set_version</code></td><td><code>integer</code></td><td>No</td><td>–</td><td>Version from previous response for staleness check.</td></tr>
<h3 id="example-request-1"><a class="header" href="#example-request-1">Example Request</a></h3>
"id": 2,
"name": "m1nd.perspective.routes",
"page": 2,
"page_size": 6,
"route_set_version": 100
<h3 id="example-response-1"><a class="header" href="#example-response-1">Example Response</a></h3>
"mode_effective": "anchored",
"anchor": "file::session_pool.py",
"focus": "file::session_pool.py",
"lens_summary": "all dimensions, no type filter",
"route_id": "R_g7h8i9",
"index": 7,
"target_node": "file::config.py",
"target_label": "config.py",
"family": "configuration",
"score": 0.42,
"path_preview": ["session_pool.py", "config.py"],
"reason": "Shared configuration key"
"suggested": null,
"page_size_clamped": false
<h3 id="when-to-use-1"><a class="header" href="#when-to-use-1">When to Use</a></h3>
<li><strong>Pagination</strong> – browse all available routes when the first page was not enough</li>
<li><strong>Full route survey</strong> – see the complete landscape before deciding which route to follow</li>
<h3 id="related-tools-1"><a class="header" href="#related-tools-1">Related Tools</a></h3>
<li><a href="#m1ndperspectiveinspect"><code>m1nd.perspective.inspect</code></a> – expand a specific route for detail</li>
<h2 id="perspective_inspect"><a class="header" href="#perspective_inspect"><code>perspective_inspect</code></a></h2>
<p>Expand a route with fuller path, metrics, provenance, affinity candidates, and score breakdown. Does not change the perspective state – purely informational.</p>
<p>Specify the route by either <code>route_id</code> (stable, content-addressed) or <code>route_index</code> (1-based position on the current page). Exactly one must be provided.</p>
<h3 id="parameters-2"><a class="header" href="#parameters-2">Parameters</a></h3>
<tr><td><code>perspective_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Perspective containing the route.</td></tr>
<tr><td><code>route_id</code></td><td><code>string</code></td><td>No</td><td>–</td><td>Stable content-addressed route ID.</td></tr>
<tr><td><code>route_index</code></td><td><code>integer</code></td><td>No</td><td>–</td><td>1-based page-local position.</td></tr>
<tr><td><code>route_set_version</code></td><td><code>integer</code></td><td>Yes</td><td>–</td><td>Route set version for staleness check.</td></tr>
<h3 id="example-request-2"><a class="header" href="#example-request-2">Example Request</a></h3>
"id": 3,
"name": "perspective_inspect",
<h3 id="example-response-2"><a class="header" href="#example-response-2">Example Response</a></h3>
"route_index": 1,
"target_type": "file",
"path_preview": ["session_pool.py", "spawner.py", "worker_pool.py"],
"family_explanation": "Direct structural neighbor via import chain",
"score_breakdown": {
"local_activation": 0.92,
"path_coherence": 0.88,
"novelty": 0.75,
"anchor_relevance": 0.95,
"continuity": 0.82
"provenance": {
"source_path": "backend/worker_pool.py",
"line_start": 1,
"line_end": 312,
"namespace": null,
"provenance_stale": false
"peek_available": true,
"affinity_candidates": [
{ "node_id": "file::fast_pool.py", "label": "fast_pool.py", "strength": 0.72, "reason": "Similar pool pattern" }
"response_chars": 450
<h3 id="when-to-use-2"><a class="header" href="#when-to-use-2">When to Use</a></h3>
<li><strong>Before following</strong> – understand what a route leads to before committing</li>
<li><strong>Score analysis</strong> – see why a route was ranked high or low</li>
<li><strong>Provenance check</strong> – verify the source file exists and is not stale</li>
<h3 id="related-tools-2"><a class="header" href="#related-tools-2">Related Tools</a></h3>
<li><a href="#m1ndperspectivepeek"><code>perspective_peek</code></a> – extract actual code content</li>
<li><a href="#m1ndperspectivefollow"><code>perspective_follow</code></a> – navigate to the route target</li>
<li><a href="#m1ndperspectiveaffinity"><code>perspective_affinity</code></a> – deeper affinity analysis</li>
<h2 id="perspective_peek"><a class="header" href="#perspective_peek"><code>perspective_peek</code></a></h2>
<p>Extract a small relevant code or documentation slice from a route’s target node. Reads the actual source file and returns the relevant excerpt. Security-checked: only reads files within the ingested graph scope.</p>
<h3 id="parameters-3"><a class="header" href="#parameters-3">Parameters</a></h3>
<h3 id="example-request-3"><a class="header" href="#example-request-3">Example Request</a></h3>
"id": 4,
"name": "perspective_peek",
<h3 id="example-response-3"><a class="header" href="#example-response-3">Example Response</a></h3>
"content": {
"excerpt": "class WorkerPool:\n \"\"\"Manages a pool of CLI subprocess workers.\"\"\"\n def __init__(self, max_workers=8):\n self.pool = {}\n self.max_workers = max_workers\n ...",
"file_path": "backend/worker_pool.py",
"line_start": 15,
"line_end": 45,
"truncated": true
<h3 id="when-to-use-3"><a class="header" href="#when-to-use-3">When to Use</a></h3>
<li><strong>Quick preview</strong> – see the actual code at a route target without leaving m1nd</li>
<li><strong>Decision making</strong> – peek at code to decide whether to follow a route</li>
<li><strong>Investigation</strong> – read suspicious code without opening a file</li>
<h3 id="related-tools-3"><a class="header" href="#related-tools-3">Related Tools</a></h3>
<li><a href="#m1ndperspectiveinspect"><code>m1nd.perspective.inspect</code></a> – structural information about the route (no code content)</li>
<li><a href="#m1ndperspectivefollow"><code>m1nd.perspective.follow</code></a> – navigate to the route target</li>
<h2 id="m1ndperspectivefollow"><a class="header" href="#m1ndperspectivefollow"><code>m1nd.perspective.follow</code></a></h2>
<p>Follow a route: move focus to the target node and synthesize new routes from the new position. This is the primary navigation action in a perspective. Updates the navigation history for <code>back</code>.</p>
<h3 id="parameters-4"><a class="header" href="#parameters-4">Parameters</a></h3>
<tr><td><code>perspective_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Perspective to navigate within.</td></tr>
<h3 id="example-request-4"><a class="header" href="#example-request-4">Example Request</a></h3>
"id": 5,
"name": "m1nd.perspective.follow",
<h3 id="example-response-4"><a class="header" href="#example-response-4">Example Response</a></h3>
"previous_focus": "file::session_pool.py",
"new_focus": "file::worker_pool.py",
"route_id": "R_j1k2l3",
"score": 0.85,
"path_preview": ["worker_pool.py", "process_manager.py"],
"reason": "Direct caller of worker pool submit"
"route_id": "R_m4n5o6",
"target_node": "file::spawner.py",
"target_label": "spawner.py",
"score": 0.71,
"path_preview": ["worker_pool.py", "spawner.py"],
"reason": "Co-manages subprocess lifecycle"
"total_routes": 8,
"route_set_version": 101,
"suggested": "inspect R_j1k2l3 -- high causal relevance"
<h3 id="when-to-use-4"><a class="header" href="#when-to-use-4">When to Use</a></h3>
<li><strong>Navigation</strong> – this is the primary way to move through the graph</li>
<li><strong>Guided exploration</strong> – follow high-scoring routes to discover related code</li>
<li><strong>Investigation</strong> – follow causal chains to trace a bug</li>
<h3 id="related-tools-4"><a class="header" href="#related-tools-4">Related Tools</a></h3>
<li><a href="#m1ndperspectiveback"><code>m1nd.perspective.back</code></a> – undo a follow</li>
<li><a href="#m1ndperspectivebranch"><code>m1nd.perspective.branch</code></a> – fork before following to explore alternatives</li>
<h2 id="m1ndperspectivesuggest"><a class="header" href="#m1ndperspectivesuggest"><code>m1nd.perspective.suggest</code></a></h2>
<p>Get the next best move suggestion based on navigation history. Analyzes the routes, the current focus, and the history of followed routes to recommend what to do next.</p>
<h3 id="parameters-5"><a class="header" href="#parameters-5">Parameters</a></h3>
<tr><td><code>perspective_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Perspective to get a suggestion for.</td></tr>
<h3 id="example-request-5"><a class="header" href="#example-request-5">Example Request</a></h3>
"id": 6,
"name": "m1nd.perspective.suggest",
"route_set_version": 101
<h3 id="example-response-5"><a class="header" href="#example-response-5">Example Response</a></h3>
"suggestion": {
"action": "follow",
"reason": "High-scoring causal route not yet explored. process_manager.py is a hub node connecting to 47 downstream modules.",
"confidence": 0.82
<h3 id="when-to-use-5"><a class="header" href="#when-to-use-5">When to Use</a></h3>
<li><strong>Undecided</strong> – when you are not sure which route to follow</li>
<li><strong>Systematic exploration</strong> – let m1nd guide you through the most informative path</li>
<li><strong>Investigation</strong> – follow the suggestion trail to efficient root cause discovery</li>
<h3 id="related-tools-5"><a class="header" href="#related-tools-5">Related Tools</a></h3>
<li><a href="#m1ndperspectivefollow"><code>m1nd.perspective.follow</code></a> – follow the suggested route</li>
<li><a href="#m1ndperspectiveinspect"><code>m1nd.perspective.inspect</code></a> – inspect the suggested route first</li>
<h2 id="m1ndperspectiveaffinity"><a class="header" href="#m1ndperspectiveaffinity"><code>m1nd.perspective.affinity</code></a></h2>
<p>Discover probable connections a route target might have. Returns affinity candidates – nodes that are not directly connected to the target but show structural affinity (similar neighborhoods, shared patterns).</p>
<p>Epistemic notice: these are <strong>probable</strong> connections, not verified graph edges.</p>
<h3 id="parameters-6"><a class="header" href="#parameters-6">Parameters</a></h3>
<h3 id="example-request-6"><a class="header" href="#example-request-6">Example Request</a></h3>
"id": 7,
"name": "m1nd.perspective.affinity",
<h3 id="example-response-6"><a class="header" href="#example-response-6">Example Response</a></h3>
"notice": "Probable connections, not verified edges.",
"candidates": [
{ "node_id": "file::healing_manager.py", "label": "healing_manager.py", "strength": 0.68, "reason": "Similar lifecycle management pattern" },
{ "node_id": "file::autonomous_daemon.py", "label": "autonomous_daemon.py", "strength": 0.52, "reason": "Shared subprocess management trait" }
]
<h3 id="when-to-use-6"><a class="header" href="#when-to-use-6">When to Use</a></h3>
<li><strong>Discovery</strong> – find non-obvious connections that the graph does not yet have</li>
<li><strong>Architecture analysis</strong> – identify modules that should be connected but are not</li>
<li><strong>Ghost edge validation</strong> – affinity candidates often become confirmed edges after investigation</li>
<h3 id="related-tools-6"><a class="header" href="#related-tools-6">Related Tools</a></h3>
<li><a href="exploration.html#m1ndmissing"><code>m1nd.missing</code></a> – finds structural holes (broader scope)</li>
<li><a href="#m1ndperspectiveinspect"><code>m1nd.perspective.inspect</code></a> – affinity candidates are also included in inspect output</li>
<h2 id="m1ndperspectivebranch"><a class="header" href="#m1ndperspectivebranch"><code>m1nd.perspective.branch</code></a></h2>
<p>Fork the current navigation state into a new perspective branch. The branch starts at the same focus with the same route set, but future navigation in the branch is independent. Useful for exploring alternatives without losing your place.</p>
<h3 id="parameters-7"><a class="header" href="#parameters-7">Parameters</a></h3>
<tr><td><code>perspective_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Perspective to branch from.</td></tr>
<tr><td><code>branch_name</code></td><td><code>string</code></td><td>No</td><td>–</td><td>Optional branch name. Auto-generated if not provided.</td></tr>
<h3 id="example-request-7"><a class="header" href="#example-request-7">Example Request</a></h3>
"id": 8,
"name": "m1nd.perspective.branch",
"branch_name": "auth-path"
<h3 id="example-response-7"><a class="header" href="#example-response-7">Example Response</a></h3>
"branch_perspective_id": "persp_agent1_002",
"branch_name": "auth-path",
"branched_from_focus": "file::worker_pool.py"
<h3 id="when-to-use-7"><a class="header" href="#when-to-use-7">When to Use</a></h3>
<li><strong>Alternative exploration</strong> – explore two different paths from the same point</li>
<li><strong>Comparative analysis</strong> – branch, follow different routes, then compare</li>
<li><strong>Safe investigation</strong> – branch before following a risky route</li>
<h3 id="related-tools-7"><a class="header" href="#related-tools-7">Related Tools</a></h3>
<li><a href="#m1ndperspectivecompare"><code>m1nd.perspective.compare</code></a> – compare the branch with the original</li>
<li><a href="#m1ndperspectivefollow"><code>m1nd.perspective.follow</code></a> – navigate within the branch</li>
<h2 id="m1ndperspectiveback"><a class="header" href="#m1ndperspectiveback"><code>m1nd.perspective.back</code></a></h2>
<p>Navigate back to the previous focus, restoring the checkpoint state. Like browser back navigation. Pops the latest navigation event from the history stack.</p>
<h3 id="parameters-8"><a class="header" href="#parameters-8">Parameters</a></h3>
<tr><td><code>perspective_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Perspective to navigate back in.</td></tr>
<h3 id="example-request-8"><a class="header" href="#example-request-8">Example Request</a></h3>
"id": 9,
"name": "m1nd.perspective.back",
"perspective_id": "persp_agent1_001"
<h3 id="example-response-8"><a class="header" href="#example-response-8">Example Response</a></h3>
"restored_focus": "file::session_pool.py",
"restored_mode": "anchored",
"route_set_version": 102,
"cache_generation": 42
<h3 id="when-to-use-8"><a class="header" href="#when-to-use-8">When to Use</a></h3>
<li><strong>Undo navigation</strong> – go back after following a wrong route</li>
<li><strong>Breadth-first exploration</strong> – follow a route, come back, follow another</li>
<h3 id="related-tools-8"><a class="header" href="#related-tools-8">Related Tools</a></h3>
<li><a href="#m1ndperspectivefollow"><code>m1nd.perspective.follow</code></a> – the forward navigation that <code>back</code> undoes</li>
<li><a href="#m1ndperspectivebranch"><code>m1nd.perspective.branch</code></a> – alternative: branch instead of back+follow</li>
<h2 id="m1ndperspectivecompare"><a class="header" href="#m1ndperspectivecompare"><code>m1nd.perspective.compare</code></a></h2>
<p>Compare two perspectives on shared/unique nodes and dimension deltas. Both perspectives must belong to the same agent (V1 restriction).</p>
<h3 id="parameters-9"><a class="header" href="#parameters-9">Parameters</a></h3>
<tr><td><code>perspective_id_a</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>First perspective ID.</td></tr>
<tr><td><code>perspective_id_b</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Second perspective ID.</td></tr>
<tr><td><code>dimensions</code></td><td><code>string[]</code></td><td>No</td><td><code>[]</code></td><td>Dimensions to compare on. Empty = all dimensions.</td></tr>
<h3 id="example-request-9"><a class="header" href="#example-request-9">Example Request</a></h3>
"id": 10,
"name": "m1nd.perspective.compare",
"perspective_id_a": "persp_agent1_001",
"perspective_id_b": "persp_agent1_002"
<h3 id="example-response-9"><a class="header" href="#example-response-9">Example Response</a></h3>
"perspective_id_b": "persp_agent1_002",
"shared_nodes": ["worker_pool.py", "process_manager.py", "session_pool.py"],
"unique_to_a": ["spawner.py", "config.py"],
"unique_to_b": ["auth_discovery.py", "middleware.py"],
"dimension_deltas": [
{ "dimension": "structural", "score_a": 0.82, "score_b": 0.75, "delta": 0.07 },
{ "dimension": "semantic", "score_a": 0.65, "score_b": 0.88, "delta": -0.23 },
{ "dimension": "causal", "score_a": 0.71, "score_b": 0.45, "delta": 0.26 }
"response_chars": 380
<h3 id="when-to-use-9"><a class="header" href="#when-to-use-9">When to Use</a></h3>
<li><strong>Branch comparison</strong> – compare a branch perspective with the original</li>
<li><strong>Multi-approach analysis</strong> – see how two different starting queries reach different parts of the graph</li>
<li><strong>Investigation correlation</strong> – find shared nodes between two independent investigations</li>
<h3 id="related-tools-9"><a class="header" href="#related-tools-9">Related Tools</a></h3>
<li><a href="#m1ndperspectivebranch"><code>m1nd.perspective.branch</code></a> – create branches to compare</li>
<li><a href="memory.html#m1ndtrailmerge"><code>m1nd.trail.merge</code></a> – merge investigation trails (deeper than compare)</li>
<h2 id="m1ndperspectivelist"><a class="header" href="#m1ndperspectivelist"><code>m1nd.perspective.list</code></a></h2>
<p>List all perspectives for an agent. Returns compact summaries with status, focus, route count, and memory usage.</p>
<h3 id="parameters-10"><a class="header" href="#parameters-10">Parameters</a></h3>
<h3 id="example-request-10"><a class="header" href="#example-request-10">Example Request</a></h3>
"id": 11,
"name": "m1nd.perspective.list",
"agent_id": "agent-1"
<h3 id="example-response-10"><a class="header" href="#example-response-10">Example Response</a></h3>
"perspectives": [
"focus_node": "file::worker_pool.py",
"route_count": 12,
"nav_event_count": 3,
"stale": false,
"created_at_ms": 1710300000000,
"last_accessed_ms": 1710300500000
"perspective_id": "persp_agent1_002",
"focus_node": "file::auth_discovery.py",
"route_count": 8,
"nav_event_count": 1,
"created_at_ms": 1710300200000,
"last_accessed_ms": 1710300400000
"total_memory_bytes": 24576
<h3 id="when-to-use-10"><a class="header" href="#when-to-use-10">When to Use</a></h3>
<li><strong>Session overview</strong> – see all active perspectives</li>
<li><strong>Memory management</strong> – check total memory usage and close stale perspectives</li>
<li><strong>Multi-perspective work</strong> – switch between perspectives</li>
<h3 id="related-tools-10"><a class="header" href="#related-tools-10">Related Tools</a></h3>
<li><a href="#m1ndperspectiveclose"><code>m1nd.perspective.close</code></a> – close perspectives you no longer need</li>
<h2 id="m1ndperspectiveclose"><a class="header" href="#m1ndperspectiveclose"><code>m1nd.perspective.close</code></a></h2>
<p>Close a perspective and release associated locks. Frees memory and stops route caching for this perspective. Cascade-releases any locks that were associated with this perspective.</p>
<h3 id="parameters-11"><a class="header" href="#parameters-11">Parameters</a></h3>
<tr><td><code>perspective_id</code></td><td><code>string</code></td><td>Yes</td><td>–</td><td>Perspective to close.</td></tr>
<h3 id="example-request-11"><a class="header" href="#example-request-11">Example Request</a></h3>
"id": 12,
"name": "m1nd.perspective.close",
"perspective_id": "persp_agent1_002"
<h3 id="example-response-11"><a class="header" href="#example-response-11">Example Response</a></h3>
"closed": true,
"locks_released": ["lock_agent1_003"]
<h3 id="when-to-use-11"><a class="header" href="#when-to-use-11">When to Use</a></h3>
<li><strong>Cleanup</strong> – close perspectives after investigation is complete</li>
<li><strong>Memory pressure</strong> – close unused perspectives to free memory</li>
<li><strong>Session end</strong> – close all perspectives before ending a session</li>
<h3 id="related-tools-11"><a class="header" href="#related-tools-11">Related Tools</a></h3>
<li><a href="#m1ndperspectivelist"><code>m1nd.perspective.list</code></a> – find perspectives to close</li>
<h2 id="full-workflow-example"><a class="header" href="#full-workflow-example">Full Workflow Example</a></h2>
<p>A complete perspective exploration session, from start to close:</p>
<pre><code>1. START a perspective from a query
perspective_start(query="authentication and session security")
-> persp_agent1_001, 12 routes, anchored to auth_discovery.py
2. BROWSE routes (page 1 already returned by start)
Routes: R01 auth_discovery.py, R02 middleware.py, R03 principal_registry.py, ...
3. INSPECT a high-scoring route before following
m1nd.perspective.inspect(route_id="R01", route_set_version=100)
-> score_breakdown, provenance, affinity_candidates
4. FOLLOW the route to navigate
m1nd.perspective.follow(route_id="R01", route_set_version=100)
-> new focus: auth_discovery.py, 8 new routes, version=101
5. ASK for a suggestion on what to do next
m1nd.perspective.suggest(route_set_version=101)
-> "follow R_x: principal_registry.py, high causal relevance"
6. BRANCH before exploring a risky path
m1nd.perspective.branch(branch_name="session-path")
-> new persp_agent1_002, same focus
7. FOLLOW different routes in each branch
Branch 1: follow toward principal_registry.py
Branch 2: follow toward session_pool.py
8. COMPARE the two branches
m1nd.perspective.compare(perspective_id_a="persp_agent1_001", perspective_id_b="persp_agent1_002")
-> shared: [auth_discovery.py], unique_to_a: [principal_registry.py], unique_to_b: [session_pool.py]
9. BACK to undo the last follow in branch 1
m1nd.perspective.back()
-> restored focus: auth_discovery.py
10. CLOSE both perspectives when done
m1nd.perspective.close(perspective_id="persp_agent1_001")
m1nd.perspective.close(perspective_id="persp_agent1_002")
<p>This workflow demonstrates the full exploration cycle: start with a query, navigate through the graph by following routes, branch to explore alternatives, compare branches, and close when done.</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="../api-reference/exploration.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
<a rel="next prefetch" href="../api-reference/lifecycle.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
<div style="clear: both"></div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a rel="prev" href="../api-reference/exploration.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<a rel="next prefetch" href="../api-reference/lifecycle.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
window.playground_copyable = true;
<script src="../elasticlunr-ef4e11c1.min.js"></script>
<script src="../mark-09e88c2c.min.js"></script>
<script src="../searcher-c2a407aa.js"></script>
<script src="../clipboard-1626706a.min.js"></script>
<script src="../highlight-abc7f01d.js"></script>
<script src="../book-a0b12cfe.js"></script>
<!-- Custom JS scripts -->
</body>
</html>