mirror of
https://github.com/katanemo/plano.git
synced 2026-04-25 00:36:34 +02:00
deploy: 22f332f62d
This commit is contained in:
parent
3203240f7f
commit
75db157d92
33 changed files with 137 additions and 33 deletions
|
|
@ -267,7 +267,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -333,7 +333,7 @@ powerful abstraction for evolving your agent workflows over time.</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,7 @@ application to LLMs (API-based or hosted) via prompt targets.</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -660,7 +660,7 @@ Implement fallback logic for better reliability:</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -304,7 +304,7 @@ Use your preferred client library without changing existing code (see <a class="
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -434,7 +434,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -1190,7 +1190,7 @@ Any provider that implements the OpenAI API interface can be configured using cu
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -473,7 +473,7 @@ that you can test and modify locally for multi-turn RAG scenarios.</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -540,7 +540,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -226,7 +226,7 @@ This gives Plano several advantages:</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -337,7 +337,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -568,7 +568,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -372,7 +372,7 @@ on the stuff that matters most.</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -714,7 +714,7 @@ instead of a file.</p></li>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -248,7 +248,7 @@ Access logs can be exported to centralized logging systems (e.g., ELK stack or F
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -229,6 +229,54 @@ are some sample configuration files for both, respectively.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
<section id="brightstaff-metrics">
|
||||||
|
<h2>Brightstaff metrics<a @click.prevent="window.navigator.clipboard.writeText($el.href); $el.setAttribute('data-tooltip', 'Copied!'); setTimeout(() => $el.setAttribute('data-tooltip', 'Copy link to this element'), 2000)" aria-label="Copy link to this element" class="headerlink" data-tooltip="Copy link to this element" href="#brightstaff-metrics" x-intersect.margin.0%.0%.-70%.0%="activeSection = '#brightstaff-metrics'"><svg height="1em" viewbox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path></svg></a></h2>
|
||||||
|
<p>In addition to Envoy’s stats on <code class="docutils literal notranslate"><span class="pre">:9901</span></code>, the brightstaff dataplane
|
||||||
|
process exposes its own Prometheus endpoint on <code class="docutils literal notranslate"><span class="pre">0.0.0.0:9092</span></code> (override
|
||||||
|
with <code class="docutils literal notranslate"><span class="pre">METRICS_BIND_ADDRESS</span></code>). It publishes:</p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li><p>HTTP RED — <code class="docutils literal notranslate"><span class="pre">brightstaff_http_requests_total</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_http_request_duration_seconds</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_http_in_flight_requests</span></code> (labels: <code class="docutils literal notranslate"><span class="pre">handler</span></code>, <code class="docutils literal notranslate"><span class="pre">method</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">status_class</span></code>).</p></li>
|
||||||
|
<li><p>LLM upstream — <code class="docutils literal notranslate"><span class="pre">brightstaff_llm_upstream_requests_total</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_llm_upstream_duration_seconds</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_llm_time_to_first_token_seconds</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_llm_tokens_total</span></code> (labels: <code class="docutils literal notranslate"><span class="pre">provider</span></code>, <code class="docutils literal notranslate"><span class="pre">model</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">error_class</span></code>, <code class="docutils literal notranslate"><span class="pre">kind</span></code>).</p></li>
|
||||||
|
<li><p>Routing — <code class="docutils literal notranslate"><span class="pre">brightstaff_router_decisions_total</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_router_decision_duration_seconds</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_routing_service_requests_total</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">brightstaff_session_cache_events_total</span></code>.</p></li>
|
||||||
|
<li><p>Process & build — <code class="docutils literal notranslate"><span class="pre">process_resident_memory_bytes</span></code>,
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">process_cpu_seconds_total</span></code>, <code class="docutils literal notranslate"><span class="pre">brightstaff_build_info</span></code>.</p></li>
|
||||||
|
</ul>
|
||||||
|
<p>A self-contained Prometheus + Grafana stack is shipped under
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">config/grafana/</span></code>. With Plano already running on the host, bring it up
|
||||||
|
with one command:</p>
|
||||||
|
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><code><span id="line-1"><span class="nb">cd</span><span class="w"> </span>config/grafana
|
||||||
|
</span><span id="line-2">docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
|
||||||
|
</span><span id="line-3">open<span class="w"> </span>http://localhost:3000<span class="w"> </span><span class="c1"># admin / admin (anonymous viewer also enabled)</span>
|
||||||
|
</span></code></pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Grafana auto-loads the Prometheus datasource and the brightstaff
|
||||||
|
dashboard (look under the <em>Plano</em> folder). Prometheus scrapes the host’s
|
||||||
|
<code class="docutils literal notranslate"><span class="pre">:9092</span></code> and <code class="docutils literal notranslate"><span class="pre">:9901</span></code> via <code class="docutils literal notranslate"><span class="pre">host.docker.internal</span></code>.</p>
|
||||||
|
<p>Files:</p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li><p><code class="docutils literal notranslate"><span class="pre">config/grafana/docker-compose.yaml</span></code> — one-command Prom + Grafana
|
||||||
|
stack with provisioning.</p></li>
|
||||||
|
<li><p><code class="docutils literal notranslate"><span class="pre">config/grafana/prometheus_scrape.yaml</span></code> — complete Prometheus config
|
||||||
|
with <code class="docutils literal notranslate"><span class="pre">envoy</span></code> and <code class="docutils literal notranslate"><span class="pre">brightstaff</span></code> scrape jobs (mounted by the
|
||||||
|
compose).</p></li>
|
||||||
|
<li><p><code class="docutils literal notranslate"><span class="pre">config/grafana/brightstaff_dashboard.json</span></code> — 19-panel dashboard
|
||||||
|
across HTTP RED, LLM upstream, Routing service, and Process & Envoy
|
||||||
|
link rows. Auto-provisioned by the compose; can also be imported by
|
||||||
|
hand via <em>Dashboards → New → Import</em>.</p></li>
|
||||||
|
<li><p><code class="docutils literal notranslate"><span class="pre">config/grafana/provisioning/</span></code> — Grafana provisioning files for the
|
||||||
|
datasource and dashboard provider.</p></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
</div><div class="flex justify-between items-center pt-6 mt-12 border-t border-border gap-4">
|
</div><div class="flex justify-between items-center pt-6 mt-12 border-t border-border gap-4">
|
||||||
<div class="mr-auto">
|
<div class="mr-auto">
|
||||||
|
|
@ -252,6 +300,7 @@ are some sample configuration files for both, respectively.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a :data-current="activeSection === '#metrics-dashboard-via-grafana'" class="reference internal" href="#metrics-dashboard-via-grafana">Metrics Dashboard (via Grafana)</a></li>
|
<li><a :data-current="activeSection === '#metrics-dashboard-via-grafana'" class="reference internal" href="#metrics-dashboard-via-grafana">Metrics Dashboard (via Grafana)</a></li>
|
||||||
<li><a :data-current="activeSection === '#configure-monitoring'" class="reference internal" href="#configure-monitoring">Configure Monitoring</a></li>
|
<li><a :data-current="activeSection === '#configure-monitoring'" class="reference internal" href="#configure-monitoring">Configure Monitoring</a></li>
|
||||||
|
<li><a :data-current="activeSection === '#brightstaff-metrics'" class="reference internal" href="#brightstaff-metrics">Brightstaff metrics</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
@ -260,7 +309,7 @@ are some sample configuration files for both, respectively.</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,7 @@
|
||||||
<li class="toctree-l1"><a class="reference internal" href="monitoring.html">Monitoring</a><ul>
|
<li class="toctree-l1"><a class="reference internal" href="monitoring.html">Monitoring</a><ul>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="monitoring.html#metrics-dashboard-via-grafana">Metrics Dashboard (via Grafana)</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="monitoring.html#metrics-dashboard-via-grafana">Metrics Dashboard (via Grafana)</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="monitoring.html#configure-monitoring">Configure Monitoring</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="monitoring.html#configure-monitoring">Configure Monitoring</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="monitoring.html#brightstaff-metrics">Brightstaff metrics</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="toctree-l1"><a class="reference internal" href="access_logging.html">Access Logging</a><ul>
|
<li class="toctree-l1"><a class="reference internal" href="access_logging.html">Access Logging</a><ul>
|
||||||
|
|
@ -216,7 +217,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -792,7 +792,7 @@ tools like AWS X-Ray and Datadog, enhancing observability and facilitating faste
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -1003,7 +1003,7 @@ Plano makes it easy to build and scale these systems by managing the orchestrati
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -298,7 +298,7 @@ the agent. If validation fails (<code class="docutils literal notranslate"><span
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -453,7 +453,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
Plano Docs v0.4.20
|
Plano Docs v0.4.20
|
||||||
llms.txt (auto-generated)
|
llms.txt (auto-generated)
|
||||||
Generated (UTC): 2026-04-19T04:21:44.790991+00:00
|
Generated (UTC): 2026-04-22T18:19:37.841645+00:00
|
||||||
|
|
||||||
Table of contents
|
Table of contents
|
||||||
- Agents (concepts/agents)
|
- Agents (concepts/agents)
|
||||||
|
|
@ -4318,6 +4318,60 @@ datasources:
|
||||||
access: proxy
|
access: proxy
|
||||||
editable: true
|
editable: true
|
||||||
|
|
||||||
|
Brightstaff metrics
|
||||||
|
|
||||||
|
In addition to Envoy’s stats on :9901, the brightstaff dataplane
|
||||||
|
process exposes its own Prometheus endpoint on 0.0.0.0:9092 (override
|
||||||
|
with METRICS_BIND_ADDRESS). It publishes:
|
||||||
|
|
||||||
|
HTTP RED — brightstaff_http_requests_total,
|
||||||
|
brightstaff_http_request_duration_seconds,
|
||||||
|
brightstaff_http_in_flight_requests (labels: handler, method,
|
||||||
|
status_class).
|
||||||
|
|
||||||
|
LLM upstream — brightstaff_llm_upstream_requests_total,
|
||||||
|
brightstaff_llm_upstream_duration_seconds,
|
||||||
|
brightstaff_llm_time_to_first_token_seconds,
|
||||||
|
brightstaff_llm_tokens_total (labels: provider, model,
|
||||||
|
error_class, kind).
|
||||||
|
|
||||||
|
Routing — brightstaff_router_decisions_total,
|
||||||
|
brightstaff_router_decision_duration_seconds,
|
||||||
|
brightstaff_routing_service_requests_total,
|
||||||
|
brightstaff_session_cache_events_total.
|
||||||
|
|
||||||
|
Process & build — process_resident_memory_bytes,
|
||||||
|
process_cpu_seconds_total, brightstaff_build_info.
|
||||||
|
|
||||||
|
A self-contained Prometheus + Grafana stack is shipped under
|
||||||
|
config/grafana/. With Plano already running on the host, bring it up
|
||||||
|
with one command:
|
||||||
|
|
||||||
|
cd config/grafana
|
||||||
|
docker compose up -d
|
||||||
|
open http://localhost:3000 # admin / admin (anonymous viewer also enabled)
|
||||||
|
|
||||||
|
Grafana auto-loads the Prometheus datasource and the brightstaff
|
||||||
|
dashboard (look under the Plano folder). Prometheus scrapes the host’s
|
||||||
|
:9092 and :9901 via host.docker.internal.
|
||||||
|
|
||||||
|
Files:
|
||||||
|
|
||||||
|
config/grafana/docker-compose.yaml — one-command Prom + Grafana
|
||||||
|
stack with provisioning.
|
||||||
|
|
||||||
|
config/grafana/prometheus_scrape.yaml — complete Prometheus config
|
||||||
|
with envoy and brightstaff scrape jobs (mounted by the
|
||||||
|
compose).
|
||||||
|
|
||||||
|
config/grafana/brightstaff_dashboard.json — 19-panel dashboard
|
||||||
|
across HTTP RED, LLM upstream, Routing service, and Process & Envoy
|
||||||
|
link rows. Auto-provisioned by the compose; can also be imported by
|
||||||
|
hand via Dashboards → New → Import.
|
||||||
|
|
||||||
|
config/grafana/provisioning/ — Grafana provisioning files for the
|
||||||
|
datasource and dashboard provider.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Observability
|
Observability
|
||||||
|
|
|
||||||
|
|
@ -247,7 +247,7 @@ Resources</label><div class="sd-tab-content docutils">
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -437,7 +437,7 @@ Use this page as the canonical source for command syntax, options, and recommend
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -414,7 +414,7 @@ where prompts get routed to, apply guardrails, and enable critical agent observa
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -542,7 +542,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,7 @@ own deployments), and Plano reaches them via HTTP.</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -485,7 +485,7 @@ processing request headers and then finalized by the HCM during post-request pro
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ hardware threads on the machine.</p>
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -221,7 +221,7 @@
|
||||||
</div><footer class="py-6 border-t border-border md:py-0">
|
</div><footer class="py-6 border-t border-border md:py-0">
|
||||||
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
<div class="container flex flex-col items-center justify-between gap-4 md:h-24 md:flex-row">
|
||||||
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
<div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0">
|
||||||
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 19, 2026. </p>
|
<p class="text-sm leading-loose text-center text-muted-foreground md:text-left">© 2026, Katanemo Labs, a DigitalOcean Company Last updated: Apr 22, 2026. </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue