From 36aba609fb31883cb5b5a091f1f77fc16badd7b5 Mon Sep 17 00:00:00 2001 From: pstayets Date: Sun, 2 Aug 2026 16:38:41 -0700 Subject: [PATCH 1/8] =?UTF-8?q?learn:=20Grounding=20AI=20agents=20with=20w?= =?UTF-8?q?eb=20search=20retrieval=20=E2=80=94=20best=20practices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: pstayets --- ...nding-ai-agents-web-search-retrieval.astro | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/pages/learn/grounding-ai-agents-web-search-retrieval.astro diff --git a/src/pages/learn/grounding-ai-agents-web-search-retrieval.astro b/src/pages/learn/grounding-ai-agents-web-search-retrieval.astro new file mode 100644 index 00000000..e351312e --- /dev/null +++ b/src/pages/learn/grounding-ai-agents-web-search-retrieval.astro @@ -0,0 +1,156 @@ +--- +import BlogLayout from '../../layouts/BlogLayout.astro'; + +const bodyContent = ` +

An agent that answers from its training data alone goes stale the moment the world moves. Web search retrieval is the standard fix: pull current sources, reason over them, answer. But bolting a search tool onto an agent loop does not automatically ground anything — retrieval only helps when the loop around it is designed. This page collects the best practices for grounding AI agents with web search retrieval: what grounding actually requires, the retrieval habits that hold up in production, and how to wire them into an agent today.

+ +

If you have built an agent that "searches the web" and still watched it assert a confidently wrong fact, the problem is rarely the search engine. It is usually one of the failure modes below — answering before retrieving, trusting a snippet, or losing the source by the time the answer is written.

+ +

Grounding AI agents with web search retrieval: what it actually means

+ +

Grounding means every claim the agent makes can be traced back to a source it actually retrieved. It is not the same as "having a search tool." A grounded answer carries provenance: this statement came from this document, retrieved at this time. An ungrounded answer — even a correct one — carries none.

+ +

That distinction drives every practice below. The goal is not to make the agent search more; it is to make the agent's reasoning depend on what it retrieved, and to keep the link between a claim and its source intact from retrieval through to the final answer.

+ +

Best practice 1: retrieve first, synthesize second

+ +

The most common failure is answering before the retrieval results exist. The agent sees a question, produces an answer from parametric memory, and treats the search step as optional confirmation. That inverts the dependency. Grounded reasoning should read: search, then reason over what came back.

+ +

Structure the loop so the model cannot answer from memory when retrieval is available. A two-phase shape works well:

+ +
    +
  1. Retrieval phase. The agent decides what to look up, issues queries, and collects candidate documents. No final answer is produced here.
  2. +
  3. Synthesis phase. The agent reasons over the retrieved set, with an instruction that claims must trace to a document in context — and that a claim with no supporting document is not answerable.
  4. +
+ +

Frameworks that support tool calls natively make this separation natural: the search tool returns, the model's next turn reasons over the result. The discipline is in not letting the model skip the first phase because it "already knows."

+ +

Best practice 2: treat the query as part of the loop, not a fixed string

+ +

A single query written up front rarely captures what a multi-step task actually needs. The agent should be able to issue several queries, read what comes back, and refine. Grounded retrieval is iterative: the first result set tells you which terms worked, which sources are authoritative, and what you still cannot confirm.

+ +

Practical habits:

+ + + +

Best practice 3: read the source, not the snippet

+ +

Search snippets are optimized for a human scanning a results page — a few hundred characters, sometimes truncated mid-sentence, sometimes written by the page author to describe something else entirely. An agent that synthesizes an answer from snippets alone is reasoning over fragments. It will routinely miss the one qualifying sentence two paragraphs down that changes the meaning.

+ +

Grounding gets substantially more reliable when the agent fetches the full document for the sources it intends to use, then reasons over the full text. The loop becomes: search returns candidates, the agent selects the promising ones, a fetch step pulls each page's content, and synthesis runs over the fetched text.

+ +

This is where a web-to-markdown step earns its place. Tools like plainweb — available as a Pilot app — turn any URL into clean Markdown in one call, so the agent reads the article rather than the blurb. The cost difference between snippet-level and document-level grounding is one extra step; the correctness difference is large.

+ +

Best practice 4: carry provenance through the loop

+ +

Grounding breaks the moment the answer is separated from its sources. If the retrieval step returns documents, but the synthesis step only receives a compressed summary, the link between claim and source is gone. Provenance has to be data that flows through the pipeline, not a formatting nicety applied at the end.

+ +

In practice that means:

+ + + +

Grounded search tools increasingly return this shape directly. The cosift app on Pilot's store, for example, returns an answer with a sources array alongside it, so the agent can pass citations through without re-engineering the loop.

+ +

Best practice 5: make freshness explicit

+ +

Not every question has the same recency requirement. "What is the capital of France" does not need a live query. "What is the current release of Kubernetes" does. An agent that treats all retrieval the same will either serve stale answers for time-sensitive questions or waste queries on stable facts.

+ +

Two habits keep freshness under control:

+ + + +

Structured search APIs usually expose recency controls (date ranges, sort by date). Using them is part of retrieval design, not an afterthought.

+ +

Best practice 6: verify before the agent acts on a claim

+ +

For agents that take actions — deploy, purchase, send, modify — a grounded answer is not the end of the pipeline. The retrieved evidence should be checked before the action fires, because the web is full of authoritative-looking pages that are wrong, outdated, or adversarial.

+ + + +

Wiring it up: a grounded search app in three commands

+ +

These practices are easier to keep when the retrieval layer already returns the right shape — full documents, sources attached, recency controls — instead of raw search-engine output that the agent must parse, dedupe, and cite itself. That is the design of the Pilot app store: installable capability apps that run locally on the daemon as typed IPC services — JSON in, JSON out — and follow the same discover → install → call loop.

+ +
# Discover what is installable
+pilotctl appstore catalogue
+
+# Install the grounded web search app
+pilotctl appstore install io.pilot.cosift
+
+# Call it — JSON in, JSON out, sources attached
+pilotctl appstore call io.pilot.cosift cosift.search '{"q":"current Kubernetes release","k":"5"}'
+ +

Cosift's methods map onto the practices above directly: cosift.search returns keyword + semantic results, cosift.contents fetches a full document (practice 3), cosift.answer returns a synthesized answer with its sources attached (practice 4), and cosift.research runs a multi-step loop that refines queries as it goes (practice 2). Every method is discoverable at runtime via cosift.help, which reports parameters and a latency class — so the agent can pick the cheapest method that answers the question, no docs required.

+ +

Because apps are installed locally and called over IPC, the grounding loop stays inside the agent's own machine: no new API key, no separate auth story, no browser automation to babysit. The same pattern holds across the store — plainweb for full-page Markdown, AEGIS for filtering retrieved content before it reaches the model.

+ +

The minimal grounded loop

+ +

Put together, the practices collapse into a loop an agent can run today:

+ +
    +
  1. Decide the question needs current information.
  2. +
  3. Retrieve: search, select candidate sources, fetch full documents.
  4. +
  5. Filter: drop injected or obviously adversarial content before the model sees it.
  6. +
  7. Synthesize: reason over the retrieved text only, citing each claim to a source.
  8. +
  9. Verify: corroborate consequential facts; if sources conflict, report the conflict.
  10. +
+ +

Every step is a design decision, and each one is where grounding silently fails when skipped. Get the loop right and the agent's answers carry the property users actually want: you can check them.

+ +

For a deeper walkthrough of grounded search with citations, see web search APIs for AI agents: grounded research with citations. For the underlying network that lets agents reach each other and their tools across clouds, start with what is Pilot Protocol.

+ +

Get started with one command:

+ +
curl -fsSL https://pilotprotocol.network/install.sh | sh
+`; + +const faqItems = [ + { + question: "What does grounding an AI agent with web search retrieval mean?", + answer: "Grounding means every claim the agent makes can be traced back to a source it actually retrieved. A grounded answer carries provenance — which document it came from — while an ungrounded answer comes from the model's training data and cannot be verified. Web search retrieval is the mechanism; grounding is the property that the answer depends on and cites the retrieved evidence." + }, + { + question: "Why is giving an agent a search tool not enough to ground it?", + answer: "A search tool only changes what the agent could retrieve. Grounding fails when the agent answers before searching, reasons over snippets instead of full documents, or loses the source link between retrieval and the final answer. The practices that matter are structural: retrieve first, read the full source, and carry provenance through the loop." + }, + { + question: "Should an agent read the full page or is the snippet enough?", + answer: "For anything beyond a trivial lookup, read the full document. Search snippets are truncated and optimized for humans scanning results. An agent synthesizing from snippets alone misses qualifying sentences and context. The reliable pattern is search to find candidates, then fetch the full page for the sources the agent intends to use." + }, + { + question: "How does an agent cite its sources in a grounded answer?", + answer: "Provenance should be part of the output contract, not prose. Give the agent a response schema with a sources field, keep source identifiers attached to retrieved content through the pipeline, and require that each claim trace to a document in context. Tools like the cosift app return answers with a sources array attached, which makes this easy to enforce." + }, + { + question: "Is retrieved web content safe to feed directly to an agent?", + answer: "Not always. Web pages can contain text written to manipulate AI agents — prompt-injection attempts that read like instructions. Retrieved content should pass through a filter before reaching the reasoning loop. Pilot's AEGIS app is a runtime firewall for exactly this, blocking injection and jailbreak attempts in content before the agent reads it." + } +]; +--- + + + From 45dcc9320a8f750b52fe7eb06d9a771cd39f5cae Mon Sep 17 00:00:00 2001 From: pstayets Date: Fri, 7 Aug 2026 09:52:18 -0700 Subject: [PATCH 2/8] site: add /agents.txt + /.well-known/integrations.json agent-discovery manifests Signed-off-by: pstayets --- public/.well-known/integrations.json | 46 ++++++++++++++++++++++++++++ public/agents.txt | 12 ++++++++ 2 files changed, 58 insertions(+) create mode 100644 public/.well-known/integrations.json create mode 100644 public/agents.txt diff --git a/public/.well-known/integrations.json b/public/.well-known/integrations.json new file mode 100644 index 00000000..82ffed61 --- /dev/null +++ b/public/.well-known/integrations.json @@ -0,0 +1,46 @@ +{ + "version": 3, + "summary": "Pilot Protocol is an open-source overlay network for AI agents. Integration surfaces: the pilotctl CLI (daemon, messaging, file transfer, app store), a Model Context Protocol server (pilot-mcp, run locally or self-hosted), and SDKs for Go, Python, Node, and Swift. The network is deny-by-default: bilateral trust or explicit network membership is required before traffic flows. Agent-readable docs at /llms.txt; agent skill manifest at /SKILLS.md.", + "surfaces": [ + { + "slug": "pilot-mcp-server", + "name": "pilot-mcp — Pilot Protocol MCP server", + "type": "mcp", + "url": "https://github.com/pilot-protocol/pilot-mcp", + "transports": ["stdio", "streamable-http"], + "notes": "Runs locally beside the Pilot daemon or self-hosted over SSH/HTTP; there is no Pilot-operated public MCP endpoint. Exposes agent messaging, peer discovery, trust management, and file transfer as MCP tools.", + "basis": { + "via": "declared", + "source": "https://pilotprotocol.network/.well-known/integrations.json" + }, + "auth": { + "status": "none", + "notes": "No API key or account. Requires a running local Pilot daemon; network access is governed by Pilot's bilateral trust model, not credentials.", + "basis": { + "via": "declared", + "source": "https://pilotprotocol.network/.well-known/integrations.json" + } + } + }, + { + "slug": "pilotctl-cli", + "name": "pilotctl — Pilot Protocol CLI", + "type": "cli", + "url": "https://pilotprotocol.network/docs/cli-reference", + "install": "curl -fsSL https://pilotprotocol.network/install.sh | sh", + "notes": "Single binary (Go, zero external dependencies). Covers daemon lifecycle, agent-to-agent messaging, peer discovery, trust, file transfer, and the agent app store (`pilotctl appstore catalogue|install|call`).", + "basis": { + "via": "declared", + "source": "https://pilotprotocol.network/.well-known/integrations.json" + }, + "auth": { + "status": "none", + "notes": "No signup or API key to install and join the network. Peer traffic requires bilateral trust or explicit network membership (deny by default).", + "basis": { + "via": "declared", + "source": "https://pilotprotocol.network/.well-known/integrations.json" + } + } + } + ] +} diff --git a/public/agents.txt b/public/agents.txt new file mode 100644 index 00000000..0d9568fc --- /dev/null +++ b/public/agents.txt @@ -0,0 +1,12 @@ +# agents.txt +# Standard: https://agents-txt.com +# Pilot Protocol — an open-source network layer for AI agents: +# permanent virtual addresses, encrypted UDP tunnels, NAT traversal, +# deny-by-default peer trust, and an app store of agent-native tools. + +Docs: https://pilotprotocol.network/llms.txt +MCP: https://github.com/pilot-protocol/pilot-mcp +Skills: https://pilotprotocol.network/SKILLS.md +CLI: https://pilotprotocol.network/docs/cli-reference +Install: https://pilotprotocol.network/install.sh +Integrations: https://pilotprotocol.network/.well-known/integrations.json From d20aca525bd2bb6549743a7590f453d9be5acb3a Mon Sep 17 00:00:00 2001 From: pstayets Date: Thu, 20 Aug 2026 11:39:27 -0700 Subject: [PATCH 3/8] learn: how webhooks and SSE streaming deliver long-running research job results Signed-off-by: pstayets --- src/pages/learn/mcp-tunnels-vs-vpn.astro | 2 + .../learn/nats-vs-grpc-agent-messaging.astro | 2 + ...ooks-sse-streaming-long-running-jobs.astro | 165 ++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro diff --git a/src/pages/learn/mcp-tunnels-vs-vpn.astro b/src/pages/learn/mcp-tunnels-vs-vpn.astro index c6cb3308..200e30f0 100644 --- a/src/pages/learn/mcp-tunnels-vs-vpn.astro +++ b/src/pages/learn/mcp-tunnels-vs-vpn.astro @@ -33,6 +33,8 @@ const bodyContent = `

The Model Context Protocol (MCP) defines a client-server protocol for AI agents to access tools and data. An MCP client (the agent) connects to an MCP server (a process that wraps a tool or data source) and invokes tools through a JSON-RPC interface. The transport between client and server can be stdio (same process) or HTTP+SSE (network).

+

For a closer look at how webhooks and SSE streaming deliver results for long-running research jobs — and where the reachable-endpoint requirement gets fragile — see how webhooks and SSE streaming work for long-running jobs.

+

When people refer to "MCP tunnels," they are usually talking about the transport layer between an MCP client and server over a network — a persistent or long-lived HTTP connection (often using Server-Sent Events) through which tool calls and results flow. Some implementations wrap this in WebSocket connections for bidirectional streaming. The key property is that MCP tunnels connect an agent to its tools — databases, APIs, file systems, search engines — not to other agents.

MCP tunnels give you:

diff --git a/src/pages/learn/nats-vs-grpc-agent-messaging.astro b/src/pages/learn/nats-vs-grpc-agent-messaging.astro index 2e6dddac..5ac53bd1 100644 --- a/src/pages/learn/nats-vs-grpc-agent-messaging.astro +++ b/src/pages/learn/nats-vs-grpc-agent-messaging.astro @@ -39,6 +39,8 @@ const bodyContent = `

You are building agents that need to talk to each other.

gRPC organizes communication around service definitions in Protocol Buffers. You define a service with methods — some unary (one request, one response), some server-streaming (one request, stream of responses), some bidirectional.

+

Server-streaming is how gRPC handles long-running work: the client opens one call and receives a stream of responses. The same shape appears over plain HTTP as Server-Sent Events, with webhooks covering the completion case — see how webhooks and SSE streaming work for long-running research jobs for how those patterns behave under parallel task fan-out.

+

The contract-first approach is a practical advantage for teams: the .proto file is a single source of truth for the API surface. Code generation produces client and server stubs in twelve-plus languages, so you cannot accidentally send the wrong type. For structured agent interactions — submit a task, get a result — gRPC is ergonomic.

The limit is that gRPC assumes you know who you are calling. Service discovery, load balancing, and failover are not part of the framework — they come from infrastructure (DNS SRV, Consul, Kubernetes Services). If you have 200 agents and any one of them can call any other, you need a way for them to discover each other's addresses and health status.

diff --git a/src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro b/src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro new file mode 100644 index 00000000..89af868e --- /dev/null +++ b/src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro @@ -0,0 +1,165 @@ +--- +import BlogLayout from "../../layouts/BlogLayout.astro"; + +const bodyContent = ` +

Parallel task webhooks and SSE streaming: how long-running research jobs deliver results

+ +
+
+

TL;DR:

+
    +
  • Webhooks deliver the finished result: the job runs asynchronously, then POSTs the result to a callback URL you registered when you started it. They are ideal for completion events, retries, and fan-in from parallel subtasks.
  • +
  • SSE (Server-Sent Events) streams progress: the server holds an HTTP connection open and pushes progress events and partial results down it as they appear. One-way, server to client, built for live updates.
  • +
  • Parallel research jobs combine them: a coordinator fans out subtasks, each worker streams progress over SSE, and results fan back in through a shared callback — or per-task callbacks with correlation IDs.
  • +
  • Both approaches assume the receiving end is publicly reachable. When the receiver is an AI agent behind NAT, that assumption is the fragile part — a persistent tunnel with a stable address removes it.
  • +
+
+
+ +

If you are building a research system where jobs run for minutes to hours — deep research, document analysis, codebase investigation — you will eventually ask how parallel task webhooks and SSE streaming work for long-running research jobs. The short answer: webhooks deliver the finished result to a callback URL, SSE streams progress over a connection the server keeps open, and production systems usually combine both. The longer answer is about fan-out, retries, idempotency, and one requirement both approaches quietly share: something has to be reachable at the end of the call.

+ +

This post walks through the mechanics of each pattern, how they behave under parallel task fan-out, where they break in agent-based systems, and what a persistent delivery layer changes.

+ +

Table of Contents

+ + +

What webhooks do for long-running jobs

+ +

A webhook is a callback over HTTP. The flow looks like this: your client submits a job to a worker or job API and gets back a job ID. The worker runs the job asynchronously — this is the part that takes minutes or hours. When the job finishes, the worker makes an outbound POST to the callback URL you supplied at submit time, with the result in the body. Your side acknowledges the POST, and the job is complete.

+ +

Three details make webhooks work in practice:

+
    +
  • Authentication. The callback URL carries a token, or the request includes a signature the receiver can verify. Without one, anyone who learns the URL can POST fake results.
  • +
  • Retries with backoff. Delivery is best-effort. If the POST fails, the worker retries with exponential backoff. The receiver must be idempotent — the same result arriving twice should be harmless, so results carry a job ID or idempotency key.
  • +
  • Timeout handling. The callback should complete quickly. If the receiver is slow, the worker may retry or give up; long processing belongs in the job, not in the callback handler.
  • +
+ +

Parallel tasks: per-task callbacks or fan-in

+ +

When a research job fans out into parallel subtasks, you have two designs. In per-task callbacks, each subtask POSTs its own result to the callback URL. The receiver correlates results by subtask ID and waits until the expected set arrives. This is simple but chatty, and results arrive out of order — ordering must be reconstructed by the receiver.

+ +

In fan-in, subtasks report to a coordinator inside the job, and the coordinator POSTs one aggregate callback when the whole job completes. Fewer endpoints, deterministic ordering, one place to implement retries and idempotency. Most production research pipelines use fan-in with a per-subtask progress channel on top — which is where SSE enters.

+ +

How SSE streaming works for long-running research jobs

+ +

Server-Sent Events is the standard way to stream one-way updates over plain HTTP. The client opens a GET request with Accept: text/event-stream. The server keeps the connection open and writes events as frames: event: names the event type, data: carries the payload, id: marks the position in the stream, and comment lines (starting with a colon) act as heartbeats to keep intermediaries from closing idle connections.

+ +

Two properties make SSE attractive for research workloads:

+
    +
  • Automatic reconnection. If the connection drops, the browser or client reconnects on its own and sends Last-Event-ID, letting the server resume from where the client left off.
  • +
  • No polling. Progress arrives when it happens — stage changes, sources found, tokens generated, partial results — without the client repeatedly asking.
  • +
+ +

SSE is one-way by design: server to client. The client cannot push messages back over the same connection; it uses ordinary requests for that. And SSE is still HTTP — it runs through reverse proxies and load balancers, which means those layers must be configured for long-lived connections: buffering off, read and idle timeouts raised, and connection limits accounted for. Each open SSE connection occupies a socket on both ends for the entire job.

+ +

In a parallel research job, SSE typically carries progress from each worker to the coordinator, while the final result arrives through the webhook path. The two patterns complement each other: SSE for the live view, webhook for the authoritative completion signal.

+ +

Webhooks vs SSE vs polling for parallel research tasks

+ + + + + + + + + + + +
MechanismBest forWhat it assumes
PollingShort jobs, simple clients, no push infrastructureThe client can keep asking; wasted requests are acceptable
WebhookCompletion of long jobs, fan-in from parallel subtasksThe callback receiver is publicly reachable and the URL survives the job
SSELive progress, partial results, dashboardsThe connection stays open; proxies and load balancers cooperate
Hybrid (SSE + webhook)Production research pipelinesBoth of the above, plus a coordinator to join the two paths
+ +

The table makes the tradeoff visible: the more live feedback you want, the more infrastructure you need to keep connections and endpoints healthy. For long-running research jobs, the hybrid is the common answer — and its failure modes are almost never in the transport choice.

+ +

Where webhooks and SSE break for agent-based research systems

+ +

Every pattern above shares one assumption: the receiving end is reachable at a stable URL. That assumption fails in specific, predictable ways:

+ +
    +
  • NAT and firewalls. A webhook is an inbound connection from the worker to your callback URL. An agent running on a laptop, behind a home router, or in a container with no public IP cannot accept that connection unless something — port forwarding, a reverse proxy, a public host — stands in front of it.
  • +
  • Restarts. The callback URL dies with the process that hosts it. If the receiver restarts mid-job, retries hit nothing until the endpoint is back — and a fresh process often means a fresh address.
  • +
  • Ephemeral addresses. VMs and containers get new IPs on every deployment. The URL you registered at submit time may not be yours by completion time.
  • +
  • Ordering and correlation. With per-task callbacks, results arrive out of order. Correlation IDs and idempotency keys are mandatory, and the receiver has to reconstruct the expected set.
  • +
  • Attack surface. A public callback endpoint is an open door. Anyone who learns the URL can POST fabricated results, so tokens or signatures are not optional.
  • +
+ +

None of this is a criticism of webhooks or SSE — they are the right tools inside a trusted boundary with reachable endpoints. The problems start exactly where agent-based systems live: distributed, behind NAT, and restarted without ceremony.

+ +

The alternative: deliver results to a stable agent address

+ +

If the fragile part is public reachability, the fix is a delivery layer that does not require it. That is the problem an agent-native overlay network is built to solve. Pilot Protocol gives every agent a permanent virtual address that survives restarts, IP changes, and moves across clouds. Traffic travels over encrypted UDP tunnels — X25519 key exchange with AES-GCM — and NAT traversal (STUN with hole-punching and a relay fallback) means agents behind NAT are reachable without port forwarding or a public host.

+ +

The research pipeline looks different on this layer. The coordinator agent registers its stable address. Workers connect to it — outbound, like a webhook client — and the tunnel stays up for the life of the job. Progress streams through the tunnel the way SSE events would, and the final result lands on the coordinator's address, which does not change when the process restarts. Trust is explicit: agents approve a mutual handshake before any traffic flows, so there is no open callback endpoint for an attacker to discover.

+ +

Discovery is part of the same layer. A rendezvous registry lets agents find each other by name or tag, so the coordinator does not need to hand out URLs — workers resolve the agent they are working for. For builders, the Pilot app store adds installable capability apps — grounded search, web-to-markdown, runtime security — that run locally on the daemon, discovered and installed with a single command.

+ +

For a deeper look at when replacing webhooks with persistent tunnels makes sense, see network tunnels for AI agent communication. For how this layer compares with the HTTP+SSE transport that MCP tunnels use, see MCP tunnels vs VPN for AI agents.

+ +

Get started with one command:

+ +
curl -fsSL https://pilotprotocol.network/install.sh | sh
+ +

Frequently asked questions

+ +

What is the difference between a webhook and SSE?

+

A webhook is a one-way HTTP POST sent by the server to a callback URL when something completes — one request, one response. SSE is a long-lived HTTP connection over which the server pushes many events over time. Webhooks answer "is it done?", SSE answers "what is happening right now?"

+ +

Can webhooks handle parallel tasks?

+

Yes, in two shapes: per-task callbacks (each subtask POSTs its own result, correlated by subtask ID) or fan-in (subtasks report to a coordinator that POSTs one aggregate callback when the whole job finishes). Fan-in is simpler to make idempotent and ordered.

+ +

Is SSE good for delivering the final result of a long job?

+

SSE is designed for live progress and partial results. Delivering the authoritative final result over a long-lived connection is risky — proxies and load balancers can close idle or long-lived connections, and a dropped connection after an hour of work is a bad place to lose the result. Most systems stream progress over SSE and deliver the final result over a webhook or a dedicated fetch.

+ +

Why do webhooks fail for agents behind NAT?

+

A webhook delivery is an inbound connection: the worker initiates a connection to your callback URL. Behind NAT, inbound connections cannot reach the agent unless port forwarding or a reverse proxy is configured. An agent-native overlay with NAT traversal removes this requirement — the tunnel is established from the agent's side and inbound traffic arrives through it.

+ +

Does Pilot Protocol replace webhooks and SSE?

+

No. Webhooks and SSE are delivery patterns — they remain the right choice inside a trusted boundary with reachable endpoints. Pilot Protocol replaces the fragile assumption under them: it gives each agent a stable virtual address and an encrypted tunnel that works across NAT and survives restarts, so results can be delivered to the agent itself instead of to a public URL that may not exist anymore.

+ +

What is a fan-in callback?

+

A fan-in callback is a single webhook posted after a parallel job completes: subtasks report their results to a coordinator inside the job, the coordinator aggregates them, and one POST carries the combined result to the callback URL. It reduces endpoint churn, makes ordering deterministic, and centralizes retry and idempotency logic.

+`; + +const faqItems = [ + { + question: "What is the difference between a webhook and SSE?", + answer: "A webhook is a one-way HTTP POST sent by the server to a callback URL when something completes — one request, one response. SSE is a long-lived HTTP connection over which the server pushes many events over time. Webhooks answer \"is it done?\", SSE answers \"what is happening right now?\"", + }, + { + question: "Can webhooks handle parallel tasks?", + answer: "Yes, in two shapes: per-task callbacks (each subtask POSTs its own result, correlated by subtask ID) or fan-in (subtasks report to a coordinator that POSTs one aggregate callback when the whole job finishes). Fan-in is simpler to make idempotent and ordered.", + }, + { + question: "Is SSE good for delivering the final result of a long job?", + answer: "SSE is designed for live progress and partial results. Delivering the authoritative final result over a long-lived connection is risky — proxies and load balancers can close long-lived connections, and a dropped connection after an hour of work is a bad place to lose the result. Most systems stream progress over SSE and deliver the final result over a webhook or a dedicated fetch.", + }, + { + question: "Why do webhooks fail for agents behind NAT?", + answer: "A webhook delivery is an inbound connection: the worker initiates a connection to your callback URL. Behind NAT, inbound connections cannot reach the agent unless port forwarding or a reverse proxy is configured. An agent-native overlay with NAT traversal removes this requirement — the tunnel is established from the agent's side and inbound traffic arrives through it.", + }, + { + question: "Does Pilot Protocol replace webhooks and SSE?", + answer: "No. Webhooks and SSE are delivery patterns — they remain the right choice inside a trusted boundary with reachable endpoints. Pilot Protocol replaces the fragile assumption under them: it gives each agent a stable virtual address and an encrypted tunnel that works across NAT and survives restarts, so results can be delivered to the agent itself instead of to a public URL that may not exist anymore.", + }, + { + question: "What is a fan-in callback?", + answer: "A fan-in callback is a single webhook posted after a parallel job completes: subtasks report their results to a coordinator inside the job, the coordinator aggregates them, and one POST carries the combined result to the callback URL. It reduces endpoint churn, makes ordering deterministic, and centralizes retry and idempotency logic.", + }, +]; +--- + + + From de6d83fdb87b4faa9ec2cbb78365c6a1161aa83b Mon Sep 17 00:00:00 2001 From: Teodor Calin Date: Thu, 3 Sep 2026 12:46:47 +0300 Subject: [PATCH 4/8] Improve technical guides and repair plain docs --- package-lock.json | 1209 +++-------------- package.json | 2 +- public/.well-known/integrations.json | 2 +- public/agents.txt | 4 +- src/components/ManagedPlainDoc.astro | 20 + src/data/learnGuides.ts | 16 + ...nding-ai-agents-web-search-retrieval.astro | 6 +- src/pages/learn/index.astro | 2 +- ...ooks-sse-streaming-long-running-jobs.astro | 14 +- src/pages/plain/docs/managed-accounts.astro | 36 +- .../plain/docs/managed-agent-adoption.astro | 23 +- .../plain/docs/managed-control-plane.astro | 39 +- src/pages/plain/docs/managed-fleet.astro | 38 +- src/pages/plain/docs/managed-harnesses.astro | 50 +- src/pages/plain/docs/managed-policies.astro | 23 +- src/pages/plain/docs/managed-readiness.astro | 59 +- 16 files changed, 277 insertions(+), 1266 deletions(-) create mode 100644 src/components/ManagedPlainDoc.astro diff --git a/package-lock.json b/package-lock.json index c70c36a4..0f1c260e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "dependencies": { "astro": "^7.1.6", "posthog-js": "^1.372.3", - "puppeteer": "^24.39.0", + "puppeteer": "^25.9.0", "sharp": "^0.35.3" }, "engines": { @@ -247,20 +247,6 @@ "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -490,27 +476,6 @@ "node": ">= 20.12.0" } }, - "node_modules/@emnapi/core": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", - "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "2.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emnapi/wasi-threads": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", @@ -1505,24 +1470,31 @@ "license": "MIT" }, "node_modules/@puppeteer/browsers": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", - "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.1.tgz", + "integrity": "sha512-KDz+3qDRdBAlRlMjmKyj6dEs33YHTk/xRHEENSXq6TNnhgoU15ruSHtEBeVF6OZ9tBDY55Se4P0nFMNsipzU9A==", "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.3", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.4", - "tar-fs": "^3.1.1", - "yargs": "^17.7.2" + "modern-tar": "^0.8.0", + "yargs": "^18.0.0" }, "bin": { - "browsers": "lib/cjs/main-cli.js" + "browsers": "lib/main-cli.js" }, "engines": { - "node": ">=18" + "node": ">=22.12.0" + }, + "peerDependencies": { + "proxy-agent": ">=8.0.1", + "yauzl": "^2.10.0 || ^3.4.0" + }, + "peerDependenciesMeta": { + "proxy-agent": { + "optional": true + }, + "yauzl": { + "optional": true + } } }, "node_modules/@rolldown/binding-android-arm64": { @@ -1908,12 +1880,6 @@ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "license": "MIT" }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, "node_modules/@tybys/wasm-util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", @@ -1966,16 +1932,6 @@ "@types/unist": "*" } }, - "node_modules/@types/node": { - "version": "26.1.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", - "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", - "license": "MIT", - "optional": true, - "dependencies": { - "undici-types": "~8.3.0" - } - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -1989,31 +1945,12 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/am-i-vibing": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", @@ -2026,6 +1963,30 @@ "am-i-vibing": "dist/cli.mjs" } }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2066,18 +2027,6 @@ "node": ">= 0.4" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/astro": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/astro/-/astro-7.1.6.tgz", @@ -2162,15 +2111,6 @@ } } }, - "node_modules/astro/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, "node_modules/astro/node_modules/zod": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", @@ -2189,20 +2129,6 @@ "node": ">= 0.4" } }, - "node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -2213,126 +2139,12 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.5.tgz", - "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", - "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", - "license": "Apache-2.0", - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.1.tgz", - "integrity": "sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==", - "license": "Apache-2.0", - "dependencies": { - "streamx": "^2.21.0", - "teex": "^1.0.1" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", - "license": "Apache-2.0", - "dependencies": { - "bare-path": "^3.0.0" - } - }, - "node_modules/basic-ftp": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", - "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -2379,14 +2191,17 @@ } }, "node_modules/chromium-bidi": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", - "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-17.0.2.tgz", + "integrity": "sha512-5v9GQFhTktFvotn/OFNJBmKLKRAb6n9r0bVCwf7sHgWc3/JryK0bj1nn93L3pHFrfgcsu6Be6EWsDi+1XHTGDg==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, + "engines": { + "node": ">=20.19.0 <22.0.0 || >=22.12.0" + }, "peerDependencies": { "devtools-protocol": "*" } @@ -2407,90 +2222,34 @@ } }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=20" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/clsx": { @@ -2502,24 +2261,6 @@ "node": ">=6" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -2578,32 +2319,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/cosmiconfig": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/crossws": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", @@ -2687,52 +2402,12 @@ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "license": "CC0-1.0" }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/defu": { "version": "6.1.7", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2777,10 +2452,11 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1581282", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz", - "integrity": "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==", - "license": "BSD-3-Clause" + "version": "0.0.1666840", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1666840.tgz", + "integrity": "sha512-gCcO42XCHKEs7Ag0S7aGYsnJ7hlgrO3qderYqeiY0Eqk+0GFfuvT13IA0hHreJTa2KCdDVyGMeOhdMNmrrTjVg==", + "license": "BSD-3-Clause", + "peer": true }, "node_modules/diff": { "version": "8.0.3", @@ -2845,9 +2521,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", - "integrity": "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==", + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -2876,14 +2552,11 @@ "node": ">=4" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, "node_modules/entities": { "version": "6.0.1", @@ -2897,24 +2570,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-module-lexer": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", @@ -2927,6 +2582,7 @@ "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -2971,105 +2627,18 @@ "node": ">=6" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, "node_modules/fast-string-truncated-width": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", @@ -3094,15 +2663,6 @@ "fast-string-width": "^3.0.2" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -3179,16 +2739,13 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3209,20 +2766,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", @@ -3372,57 +2915,6 @@ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ip-address": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", - "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -3432,12 +2924,6 @@ "url": "https://github.com/sponsors/brc-dd" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, "node_modules/is-docker": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", @@ -3453,15 +2939,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -3474,16 +2951,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "funding": [ { "type": "github", @@ -3502,12 +2973,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, "node_modules/jsonc-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", @@ -3763,19 +3228,16 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/magic-string": { @@ -3920,6 +3382,15 @@ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, + "node_modules/modern-tar": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.4.tgz", + "integrity": "sha512-gN54ddmyzEg10orwZ2u4OOv+bjpMWdIl5jIkodK97bMq8QBSL5c0D7YX0lT1Ooz+99S7+PvFbnxzdjgHo1r41g==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -3929,16 +3400,10 @@ "node": ">=10" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", @@ -3962,15 +3427,6 @@ "node": ">= 10" } }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/nlcst-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", @@ -4047,15 +3503,6 @@ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/oniguruma-parser": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", @@ -4116,74 +3563,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/package-manager-detector": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", "license": "MIT" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse5": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", @@ -4196,12 +3581,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, "node_modules/piccolore": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", @@ -4307,15 +3686,6 @@ "node": ">=18.0.0" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/property-information": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", @@ -4326,78 +3696,42 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/puppeteer": { - "version": "24.39.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.39.1.tgz", - "integrity": "sha512-68Zc9QpcVvfxp2C+3UL88TyUogEAn5tSylXidbEuEXvhiqK1+v65zeBU5ubinAgEHMGr3dcSYqvYrGtdzsPI3w==", + "version": "25.9.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.9.0.tgz", + "integrity": "sha512-2JqQszD2pyDTpIvBH1ZCXdrHgENVNdJIeOM6asbwHRgWknFiaLd1gNB91w/B/0hQHNpafkpxa90lPpBaJM87Hw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.13.0", - "chromium-bidi": "14.0.0", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1581282", - "puppeteer-core": "24.39.1", - "typed-query-selector": "^2.12.1" + "@puppeteer/browsers": "3.2.1", + "chromium-bidi": "17.0.2", + "devtools-protocol": "0.0.1666840", + "lilconfig": "^3.1.3", + "puppeteer-core": "25.9.0", + "typed-query-selector": "^2.12.2" }, "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" + "puppeteer": "lib/puppeteer/node/cli.js" }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, "node_modules/puppeteer-core": { - "version": "24.39.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.39.1.tgz", - "integrity": "sha512-AMqQIKoEhPS6CilDzw0Gd1brLri3emkC+1N2J6ZCCuY1Cglo56M63S0jOeBZDQlemOiRd686MYVMl9ELJBzN3A==", + "version": "25.9.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.9.0.tgz", + "integrity": "sha512-U61rCwSMha62CA/Opy6tCx2Fx+ck7ouiKnbpEApzSoLYMoEu9F71nuFpHL55vmIt33/GYm6eKZVhH2ev0nAIeg==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.13.0", - "chromium-bidi": "14.0.0", - "debug": "^4.4.3", - "devtools-protocol": "0.0.1581282", - "typed-query-selector": "^2.12.1", - "webdriver-bidi-protocol": "0.4.1", - "ws": "^8.19.0" + "@puppeteer/browsers": "3.2.1", + "chromium-bidi": "17.0.2", + "devtools-protocol": "0.0.1666840", + "typed-query-selector": "^2.12.2", + "webdriver-bidi-protocol": "0.4.2", + "ws": "^8.21.3" }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, "node_modules/query-selector-shadow-dom": { @@ -4449,24 +3783,6 @@ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "license": "MIT" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -4642,16 +3958,6 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/smol-toml": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz", @@ -4664,44 +3970,6 @@ "url": "https://github.com/sponsors/cyyynthia" } }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4721,15 +3989,20 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "license": "MIT", "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/stringify-entities": { @@ -4746,6 +4019,21 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/svgo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", @@ -4771,50 +4059,6 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/tar-fs": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", - "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", - "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", @@ -4879,12 +4123,13 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "optional": true }, "node_modules/typed-query-selector": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz", - "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz", + "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==", "license": "MIT" }, "node_modules/ufo": { @@ -4905,13 +4150,6 @@ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "license": "MIT" }, - "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "license": "MIT", - "optional": true - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -5162,6 +4400,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", "license": "MIT", + "peer": true, "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", @@ -5270,21 +4509,49 @@ "license": "Apache-2.0" }, "node_modules/webdriver-bidi-protocol": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", - "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.2.tgz", + "integrity": "sha512-VSV+fzfChirL3e7jay2yUC7B4HQCGtEWEg/MSSQbK+qWbqeGlRLlXTzPpYr3XGUvbpDHumWZBJxgesg4N7dbtA==", "license": "Apache-2.0" }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/ws": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", - "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5318,81 +4585,29 @@ } }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^8.2.1", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yocto-queue": { diff --git a/package.json b/package.json index 10648de1..4a411635 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "dependencies": { "astro": "^7.1.6", "posthog-js": "^1.372.3", - "puppeteer": "^24.39.0", + "puppeteer": "^25.9.0", "sharp": "^0.35.3" } } diff --git a/public/.well-known/integrations.json b/public/.well-known/integrations.json index 82ffed61..5cad7fac 100644 --- a/public/.well-known/integrations.json +++ b/public/.well-known/integrations.json @@ -28,7 +28,7 @@ "type": "cli", "url": "https://pilotprotocol.network/docs/cli-reference", "install": "curl -fsSL https://pilotprotocol.network/install.sh | sh", - "notes": "Single binary (Go, zero external dependencies). Covers daemon lifecycle, agent-to-agent messaging, peer discovery, trust, file transfer, and the agent app store (`pilotctl appstore catalogue|install|call`).", + "notes": "Statically linked Go CLI and daemon. Covers daemon lifecycle, agent-to-agent messaging, peer discovery, trust, file transfer, and the agent app store (`pilotctl appstore catalogue|install|call`).", "basis": { "via": "declared", "source": "https://pilotprotocol.network/.well-known/integrations.json" diff --git a/public/agents.txt b/public/agents.txt index 0d9568fc..7220b4de 100644 --- a/public/agents.txt +++ b/public/agents.txt @@ -1,6 +1,6 @@ # agents.txt -# Standard: https://agents-txt.com -# Pilot Protocol — an open-source network layer for AI agents: +# Agent-readable entry points for Pilot Protocol, an open-source +# network layer for AI agents: # permanent virtual addresses, encrypted UDP tunnels, NAT traversal, # deny-by-default peer trust, and an app store of agent-native tools. diff --git a/src/components/ManagedPlainDoc.astro b/src/components/ManagedPlainDoc.astro new file mode 100644 index 00000000..22641bda --- /dev/null +++ b/src/components/ManagedPlainDoc.astro @@ -0,0 +1,20 @@ +--- +import PlainLayout from '../layouts/PlainLayout.astro'; +import { managedDocs } from '../data/managedDocs'; + +interface Props { + slug: string; +} + +const { slug } = Astro.props; +const doc = managedDocs[slug]; +if (!doc) throw new Error(`Unknown managed documentation slug: ${slug}`); +--- + +

← Docs index

+ +
diff --git a/src/data/learnGuides.ts b/src/data/learnGuides.ts index 4dea81a1..c4693f7d 100644 --- a/src/data/learnGuides.ts +++ b/src/data/learnGuides.ts @@ -24,6 +24,14 @@ export const learnGuides: LearnGuide[] = [ isoDate: '2026-07-22', track: 'Foundations', }, + { + slug: 'grounding-ai-agents-web-search-retrieval', + title: 'Grounding AI Agents with Web Search', + description: 'Design a retrieval loop that reads full sources, preserves provenance, verifies consequential claims, and treats retrieved text as untrusted input.', + date: 'August 2, 2026', + isoDate: '2026-08-02', + track: 'Foundations', + }, { slug: 'ai-in-networking-for-multicloud', title: 'AI Networking Across Multiple Clouds', @@ -56,6 +64,14 @@ export const learnGuides: LearnGuide[] = [ isoDate: '2026-07-25', track: 'Transport', }, + { + slug: 'webhooks-sse-streaming-long-running-jobs', + title: 'Webhooks and SSE for Long-Running Jobs', + description: 'Compare callbacks, event streams, polling, fan-in, retries, and stable agent delivery without promising connection permanence.', + date: 'August 20, 2026', + isoDate: '2026-08-20', + track: 'Transport', + }, { slug: 'how-are-network-agent-tokens-different', title: 'How Network Agent Tokens Differ', diff --git a/src/pages/learn/grounding-ai-agents-web-search-retrieval.astro b/src/pages/learn/grounding-ai-agents-web-search-retrieval.astro index e351312e..96e02fd9 100644 --- a/src/pages/learn/grounding-ai-agents-web-search-retrieval.astro +++ b/src/pages/learn/grounding-ai-agents-web-search-retrieval.astro @@ -79,7 +79,7 @@ const bodyContent = `
  • Corroborate consequential claims. If the agent is about to act on a fact (a version number, a rate, an endpoint), a second independent source is cheap insurance. One source can be a hallucinated-looking page; two agreeing sources are far less likely to be.
  • -
  • Watch for injected instructions in retrieved content. Web pages can contain text that reads as an instruction to an AI agent — "ignore previous instructions" and friends. Retrieved content should pass through a filter before it reaches the reasoning loop. AEGIS, another Pilot app, is a runtime firewall for exactly this: it blocks prompt-injection and jailbreak attempts in content before the agent reads it.
  • +
  • Watch for injected instructions in retrieved content. Web pages can contain text that reads as an instruction to an AI agent — "ignore previous instructions" and friends. Retrieved content should pass through a filter before it reaches the reasoning loop. AEGIS, another Pilot app, can scan staged files and directories for prompt-injection and jailbreak patterns before an agent consumes them.
  • When sources conflict, say so. An agent that silently picks one side of a contradiction is not grounded; it is guessing. The honest output is "sources disagree" plus both citations.
@@ -140,12 +140,12 @@ const faqItems = [ }, { question: "Is retrieved web content safe to feed directly to an agent?", - answer: "Not always. Web pages can contain text written to manipulate AI agents — prompt-injection attempts that read like instructions. Retrieved content should pass through a filter before reaching the reasoning loop. Pilot's AEGIS app is a runtime firewall for exactly this, blocking injection and jailbreak attempts in content before the agent reads it." + answer: "Not always. Web pages can contain text written to manipulate AI agents — prompt-injection attempts that read like instructions. Retrieved content should pass through a filter before reaching the reasoning loop. Pilot's AEGIS app can scan staged files and directories for these patterns before an agent consumes them." } ]; ---
Guide library -

Eight focused
technical guides.

+

{learnGuides.length} focused
technical guides.

{tracks.map((track) => (
diff --git a/src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro b/src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro index 89af868e..6eac667e 100644 --- a/src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro +++ b/src/pages/learn/webhooks-sse-streaming-long-running-jobs.astro @@ -11,7 +11,7 @@ const bodyContent = `
  • Webhooks deliver the finished result: the job runs asynchronously, then POSTs the result to a callback URL you registered when you started it. They are ideal for completion events, retries, and fan-in from parallel subtasks.
  • SSE (Server-Sent Events) streams progress: the server holds an HTTP connection open and pushes progress events and partial results down it as they appear. One-way, server to client, built for live updates.
  • Parallel research jobs combine them: a coordinator fans out subtasks, each worker streams progress over SSE, and results fan back in through a shared callback — or per-task callbacks with correlation IDs.
  • -
  • Both approaches assume the receiving end is publicly reachable. When the receiver is an AI agent behind NAT, that assumption is the fragile part — a persistent tunnel with a stable address removes it.
  • +
  • Both approaches require a reachable receiving path. A conventional webhook needs a public callback. When both endpoints are agents, a stable overlay address can replace that public-URL assumption; a conventional SaaS sender still needs an HTTP gateway or public receiver.

  • @@ -93,9 +93,9 @@ const bodyContent = `

    The alternative: deliver results to a stable agent address

    -

    If the fragile part is public reachability, the fix is a delivery layer that does not require it. That is the problem an agent-native overlay network is built to solve. Pilot Protocol gives every agent a permanent virtual address that survives restarts, IP changes, and moves across clouds. Traffic travels over encrypted UDP tunnels — X25519 key exchange with AES-GCM — and NAT traversal (STUN with hole-punching and a relay fallback) means agents behind NAT are reachable without port forwarding or a public host.

    +

    If both sides of the exchange are agents, an overlay can remove the need to expose the receiving agent as a public HTTP server. Pilot Protocol gives a node a persistent virtual address that remains its reconnection target across daemon restarts and network-path changes. Traffic uses encrypted UDP tunnels, with STUN discovery, hole-punching, and relay fallback when a direct path is unavailable.

    -

    The research pipeline looks different on this layer. The coordinator agent registers its stable address. Workers connect to it — outbound, like a webhook client — and the tunnel stays up for the life of the job. Progress streams through the tunnel the way SSE events would, and the final result lands on the coordinator's address, which does not change when the process restarts. Trust is explicit: agents approve a mutual handshake before any traffic flows, so there is no open callback endpoint for an attacker to discover.

    +

    The research pipeline looks different on this layer. The coordinator registers its stable address and workers resolve that address before connecting. Progress and results can travel over the agent channel without publishing a callback URL. The address is durable; an individual connection is not, so applications still need correlation IDs, idempotency, retry, and resume behavior when either process or path restarts. Admission is governed by bilateral trust or explicit network membership policy rather than possession of a public callback URL.

    Discovery is part of the same layer. A rendezvous registry lets agents find each other by name or tag, so the coordinator does not need to hand out URLs — workers resolve the agent they are working for. For builders, the Pilot app store adds installable capability apps — grounded search, web-to-markdown, runtime security — that run locally on the daemon, discovered and installed with a single command.

    @@ -120,7 +120,7 @@ const bodyContent = `

    A webhook delivery is an inbound connection: the worker initiates a connection to your callback URL. Behind NAT, inbound connections cannot reach the agent unless port forwarding or a reverse proxy is configured. An agent-native overlay with NAT traversal removes this requirement — the tunnel is established from the agent's side and inbound traffic arrives through it.

    Does Pilot Protocol replace webhooks and SSE?

    -

    No. Webhooks and SSE are delivery patterns — they remain the right choice inside a trusted boundary with reachable endpoints. Pilot Protocol replaces the fragile assumption under them: it gives each agent a stable virtual address and an encrypted tunnel that works across NAT and survives restarts, so results can be delivered to the agent itself instead of to a public URL that may not exist anymore.

    +

    No. Webhooks and SSE remain useful when an HTTP endpoint is reachable. For agent-to-agent delivery, Pilot provides a stable address and an encrypted path across NAT; after a restart the path is re-established rather than magically preserved. A conventional SaaS webhook sender still needs an HTTP gateway or public receiver.

    What is a fan-in callback?

    A fan-in callback is a single webhook posted after a parallel job completes: subtasks report their results to a coordinator inside the job, the coordinator aggregates them, and one POST carries the combined result to the callback URL. It reduces endpoint churn, makes ordering deterministic, and centralizes retry and idempotency logic.

    @@ -145,7 +145,7 @@ const faqItems = [ }, { question: "Does Pilot Protocol replace webhooks and SSE?", - answer: "No. Webhooks and SSE are delivery patterns — they remain the right choice inside a trusted boundary with reachable endpoints. Pilot Protocol replaces the fragile assumption under them: it gives each agent a stable virtual address and an encrypted tunnel that works across NAT and survives restarts, so results can be delivered to the agent itself instead of to a public URL that may not exist anymore.", + answer: "No. Webhooks and SSE remain useful when an HTTP endpoint is reachable. For agent-to-agent delivery, Pilot provides a stable address and an encrypted path across NAT; after a restart the path is re-established rather than magically preserved. A conventional SaaS webhook sender still needs an HTTP gateway or public receiver.", }, { question: "What is a fan-in callback?", @@ -154,8 +154,8 @@ const faqItems = [ ]; --- - -

    ← Docs index

    - -

    Managed Accounts

    - -

    A managed account provides a dedicated, managed Teleport cluster. This document describes account setup, billing, and connecting infrastructure.

    - -

    Account Setup

    -

    A new cluster is provisioned when signing up for a managed service. The first user is granted administrator privileges. Other team members can be invited, and roles and permissions can be configured.

    - -

    Billing and Subscriptions

    -

    The subscription is managed through a customer dashboard. Several tiers are offered.

    -
      -
    • Free Tier: Limited users, community support.
    • -
    • Pro Tier: Unlimited users, business hours support.
    • -
    • Enterprise Tier: Custom features, dedicated support, SLAs.
    • -
    - -

    Connecting Infrastructure

    -

    The Teleport agent is required to connect servers, databases, or Kubernetes clusters. The agent establishes a reverse tunnel to the managed Teleport cluster.

    -
    teleport start --roles=node --token=YOUR_JOIN_TOKEN --auth-server=your-cluster.teleport.sh:443
    - -

    Related

    - - - + diff --git a/src/pages/plain/docs/managed-agent-adoption.astro b/src/pages/plain/docs/managed-agent-adoption.astro index 85a22b6c..c174c88d 100644 --- a/src/pages/plain/docs/managed-agent-adoption.astro +++ b/src/pages/plain/docs/managed-agent-adoption.astro @@ -1,23 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-agent-adoption.astro -// plain-source-sha256: b12d0f51096e90d8d8c42a9484a3939f058c3dd2d15cb8ca9b33c238cd7c337a -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    - -

    - - - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-control-plane.astro b/src/pages/plain/docs/managed-control-plane.astro index 0188d343..eb8b8346 100644 --- a/src/pages/plain/docs/managed-control-plane.astro +++ b/src/pages/plain/docs/managed-control-plane.astro @@ -1,39 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-control-plane.astro -// plain-source-sha256: f3dfc21b561e0fb2dbe147a2446d55101e8c1f2f6e0ad1f3bc42a1b43869c815 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Control Plane

    - -

    The Netlify Managed Control Plane is a dedicated, single-tenant instance of Netlify’s control plane for enterprise teams. It provides the developer experience of the multi-tenant platform with additional security, compliance, and performance features.

    - -

    Key Features

    -
      -
    • Single-tenant architecture: Isolates data and operations from other tenants.
    • -
    • Enhanced security: Includes private connectivity options, dedicated IP ranges, and advanced access controls.
    • -
    • Compliance-ready: Supports regulatory requirements such as SOC 2, HIPAA, and GDPR with dedicated infrastructure and data residency options.
    • -
    • Guaranteed performance: Provides Service Level Agreements (SLAs) for uptime and performance.
    • -
    • Custom integrations: Integrates with enterprise systems such as private Git repositories, identity providers (IdPs), and observability tools.
    • -
    - -

    How it works

    -

    The Managed Control Plane is deployed in a dedicated environment within a chosen cloud region. Netlify manages the infrastructure, updates, and maintenance.

    -

    Developers interact with the Managed Control Plane through the Netlify UI, CLI, and API. The underlying infrastructure is dedicated to a single organization.

    - -

    Getting Started

    -

    The Managed Control Plane requires an Enterprise plan. Netlify provisions a dedicated instance and provides a unique URL to access it, for example:

    -
    https://app.your-company.netlify.com
    -

    After setup, team members can be invited, Git repositories connected, and sites deployed from the control plane.

    - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-fleet.astro b/src/pages/plain/docs/managed-fleet.astro index 9d413682..5b7e2147 100644 --- a/src/pages/plain/docs/managed-fleet.astro +++ b/src/pages/plain/docs/managed-fleet.astro @@ -1,38 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-fleet.astro -// plain-source-sha256: 2d897ffca786983b40b756af2aa3f289af0c00ff558f6788fcdfc4dbe87a2c55 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Fleet

    - -

    Tailscale coordinates key rotation, node registration, and user authentication for devices. When a device is added to a tailnet, Tailscale generates a unique identity for it and handles key rotation.

    - -

    Device inventory

    -

    The machines page of the admin console provides a central inventory of all devices in a tailnet. For each device, it shows:

    -
      -
    • The device name and its owner
    • -
    • The Tailscale IP address
    • -
    • The OS version
    • -
    • The Tailscale client version
    • -
    • When the device was last seen on the network
    • -
    -

    This page can also be used to perform actions on devices, such as disabling key expiry or deleting a device from a tailnet.

    - -

    Tagging devices

    -

    Tags can be used to apply policies to groups of devices. For example, a tag called `prod` could be created for production servers. A policy could then be created that only allows users with the `prod` tag to access those servers.

    - -

    Pre-authorizing devices

    -

    Auth keys can be used to pre-authorize devices to join a tailnet. This is useful for automating the process of adding new devices, such as when provisioning new servers.

    - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-harnesses.astro b/src/pages/plain/docs/managed-harnesses.astro index a579c9b2..14afbbe2 100644 --- a/src/pages/plain/docs/managed-harnesses.astro +++ b/src/pages/plain/docs/managed-harnesses.astro @@ -1,50 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-harnesses.astro -// plain-source-sha256: e0336c8c55f5e17dc8cca1e19ff98c1514de5ddff928e82197f86df9b34fcab0 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Harnesses

    - -

    Managed Harnesses define a set of environment variables and volumes that are automatically applied to a local development environment when connecting to a cluster. This feature is part of the Telepresence Pro plan.

    - -

    How it works

    -

    When connecting to a cluster with a Managed Harness, Telepresence automatically mounts specified volumes to the local machine and sets specified environment variables in the local shell. This provides a consistent development environment across a team without requiring manual configuration on each developer's machine.

    - -

    Creating a Managed Harness

    -

    To create a Managed Harness, create a `harness.yaml` file in the project root. This file defines the environment variables and volumes to be applied.

    -
    env:
    -  - name: DATABASE_URL
    -    value: postgresql://user:password@localhost:5432/mydb
    -  - name: REDIS_URL
    -    value: redis://localhost:6379
    -volumes:
    -  - name: my-volume
    -    mountPath: /app/data
    -

    Apply the file to the cluster:

    -
    telepresence harness apply harness.yaml
    - -

    Using a Managed Harness

    -

    A Managed Harness is automatically used by any Telepresence client connecting to a cluster where the harness has been applied. No client-side configuration is needed.

    -

    The connection output shows the harness being applied:

    -
    telepresence connect
    -...
    -Applying managed harness...
    -  - Setting environment variable DATABASE_URL
    -  - Setting environment variable REDIS_URL
    -  - Mounting volume my-volume
    -...
    -Connected to cluster
    -

    Verify the environment variables and volumes in the local shell.

    - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-policies.astro b/src/pages/plain/docs/managed-policies.astro index 236a6566..9cd20b9b 100644 --- a/src/pages/plain/docs/managed-policies.astro +++ b/src/pages/plain/docs/managed-policies.astro @@ -1,23 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-policies.astro -// plain-source-sha256: b7645c5c6c5e480e6cc4b9c6dba5dcb91683473b62b2238bc73f61f7d596ece1 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    managed-policies

    - -

    - - - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-readiness.astro b/src/pages/plain/docs/managed-readiness.astro index 3506b925..ab61b07d 100644 --- a/src/pages/plain/docs/managed-readiness.astro +++ b/src/pages/plain/docs/managed-readiness.astro @@ -1,59 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-readiness.astro -// plain-source-sha256: 1f6e87e861c2cf0595649390a556fc0256d64c56e1a09f4684a112822a1765e1 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Teleport Readiness

    - -

    Before connecting the first host to Teleport, the cluster must be ready to accept connections. This guide explains how to ensure the cluster is properly configured.

    - -

    Prerequisites

    -

    The following are required before beginning:

    -
      -
    • A running Teleport cluster.
    • -
    • Administrative privileges on the Teleport cluster.
    • -
    - -

    Check Cluster Health

    -

    Check the health of the Teleport cluster by running the tctl status command on the Teleport Auth Service node.

    -
    tctl status
    -Cluster  teleport.example.com
    -Version  v15.1.2
    -CA pin   sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef123456
    -

    The output shows the cluster name, Teleport version, and CA pin. Any errors must be resolved before proceeding.

    - -

    Configure Public Addr

    -

    Agents require a publicly accessible cluster address to connect. This is configured in the teleport.yaml file on Teleport Proxy Service nodes.

    -
    proxy_service:
    -  enabled: "yes"
    -  public_addr: "teleport.example.com:443"
    -

    The public_addr must be set to the address nodes use to connect to the Teleport Proxy Service. This is often a load balancer or a DNS record pointing to the proxy nodes.

    - -

    Next Steps

    -

    After the cluster is ready, infrastructure can be connected. Guides are available for adding:

    -
      -
    • SSH Servers
    • -
    • Kubernetes Clusters
    • -
    • Web Applications
    • -
    • Databases
    • -
    • Windows Desktops
    • -
    - -

    Related

    - - -
    + From 908fb739eddd401e2f5aa8da57833f9f9cc0d922 Mon Sep 17 00:00:00 2001 From: Teodor Calin Date: Thu, 3 Sep 2026 12:48:47 +0300 Subject: [PATCH 5/8] Regenerate lockfile for CI npm compatibility --- package-lock.json | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f1c260e..55778d79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -476,6 +476,27 @@ "node": ">= 20.12.0" } }, + "node_modules/@emnapi/core": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", + "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "2.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", @@ -2455,8 +2476,7 @@ "version": "0.0.1666840", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1666840.tgz", "integrity": "sha512-gCcO42XCHKEs7Ag0S7aGYsnJ7hlgrO3qderYqeiY0Eqk+0GFfuvT13IA0hHreJTa2KCdDVyGMeOhdMNmrrTjVg==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/diff": { "version": "8.0.3", @@ -2582,7 +2602,6 @@ "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -4400,7 +4419,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", From d410ff3ed63db703e71deee086a7002dc348bd53 Mon Sep 17 00:00:00 2001 From: pilot-plain-bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 09:53:28 +0000 Subject: [PATCH 6/8] chore(plain): auto-regenerate stale machine-UI twins --- src/pages/plain/docs/managed-accounts.astro | 23 ++++++++- .../plain/docs/managed-agent-adoption.astro | 23 ++++++++- .../plain/docs/managed-control-plane.astro | 23 ++++++++- src/pages/plain/docs/managed-fleet.astro | 39 ++++++++++++++- src/pages/plain/docs/managed-harnesses.astro | 23 ++++++++- src/pages/plain/docs/managed-policies.astro | 23 ++++++++- src/pages/plain/docs/managed-readiness.astro | 47 ++++++++++++++++++- 7 files changed, 187 insertions(+), 14 deletions(-) diff --git a/src/pages/plain/docs/managed-accounts.astro b/src/pages/plain/docs/managed-accounts.astro index 3f3669a2..2e7e7f25 100644 --- a/src/pages/plain/docs/managed-accounts.astro +++ b/src/pages/plain/docs/managed-accounts.astro @@ -1,4 +1,23 @@ --- -import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; +// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. +// plain-source: src/pages/docs/managed-accounts.astro +// plain-source-sha256: 4d88e5ad027ff566d795f6aa68e9cb3901aded932eb519d0eeb4b838caa1a431 +import PlainLayout from '../../../layouts/PlainLayout.astro'; --- - + + +

    ← Docs index

    + +

    Managed Accounts

    + +

    + + + +

    Related

    + + +
    diff --git a/src/pages/plain/docs/managed-agent-adoption.astro b/src/pages/plain/docs/managed-agent-adoption.astro index c174c88d..970e7094 100644 --- a/src/pages/plain/docs/managed-agent-adoption.astro +++ b/src/pages/plain/docs/managed-agent-adoption.astro @@ -1,4 +1,23 @@ --- -import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; +// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. +// plain-source: src/pages/docs/managed-agent-adoption.astro +// plain-source-sha256: b12d0f51096e90d8d8c42a9484a3939f058c3dd2d15cb8ca9b33c238cd7c337a +import PlainLayout from '../../../layouts/PlainLayout.astro'; --- - + + +

    ← Docs index

    + +

    Managed Agent Adoption

    + +

    + + + +

    Related

    + + +
    diff --git a/src/pages/plain/docs/managed-control-plane.astro b/src/pages/plain/docs/managed-control-plane.astro index eb8b8346..cb403b4e 100644 --- a/src/pages/plain/docs/managed-control-plane.astro +++ b/src/pages/plain/docs/managed-control-plane.astro @@ -1,4 +1,23 @@ --- -import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; +// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. +// plain-source: src/pages/docs/managed-control-plane.astro +// plain-source-sha256: f3dfc21b561e0fb2dbe147a2446d55101e8c1f2f6e0ad1f3bc42a1b43869c815 +import PlainLayout from '../../../layouts/PlainLayout.astro'; --- - + + +

    ← Docs index

    + +

    Managed Control Plane

    + +

    This page describes the managed control plane.

    + + + +

    Related

    + + +
    diff --git a/src/pages/plain/docs/managed-fleet.astro b/src/pages/plain/docs/managed-fleet.astro index 5b7e2147..6996a599 100644 --- a/src/pages/plain/docs/managed-fleet.astro +++ b/src/pages/plain/docs/managed-fleet.astro @@ -1,4 +1,39 @@ --- -import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; +// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. +// plain-source: src/pages/docs/managed-fleet.astro +// plain-source-sha256: 2d897ffca786983b40b756af2aa3f289af0c00ff558f6788fcdfc4dbe87a2c55 +import PlainLayout from '../../../layouts/PlainLayout.astro'; --- - + + +

    ← Docs index

    + +

    Managed Fleet

    + +

    A managed fleet provides administrative control over devices in a tailnet. It enables features like device approval, access control, and key expiry.

    + +

    Overview

    +

    When a device is part of a managed fleet, administrators can enforce security policies, require approval for new devices, and monitor network activity. This applies to all devices within the tailnet.

    + +

    Enabling a managed fleet

    +

    A managed fleet is enabled from the 'Settings' page in the admin console. Toggling the 'Managed Fleet' option on will apply the setting to all devices in the tailnet.

    + +

    Features

    +
      +
    • Device Approval: Require admin approval for new devices joining the tailnet.
    • +
    • Access Control Lists (ACLs): Define network access policies for devices.
    • +
    • Key Expiry: Set automatic key expiration policies.
    • +
    + +

    API Access

    +

    Fleet management is available via the API. The /api/v2/tailnet/:tailnet/devices endpoint can be used to list and manage devices.

    +
    curl -X GET "https://api.tailscale.com/api/v2/tailnet/your-tailnet/devices" \
    +  -u "$TOKEN:"
    + +

    Related

    + + +
    diff --git a/src/pages/plain/docs/managed-harnesses.astro b/src/pages/plain/docs/managed-harnesses.astro index 14afbbe2..845f7f0d 100644 --- a/src/pages/plain/docs/managed-harnesses.astro +++ b/src/pages/plain/docs/managed-harnesses.astro @@ -1,4 +1,23 @@ --- -import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; +// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. +// plain-source: src/pages/docs/managed-harnesses.astro +// plain-source-sha256: e0336c8c55f5e17dc8cca1e19ff98c1514de5ddff928e82197f86df9b34fcab0 +import PlainLayout from '../../../layouts/PlainLayout.astro'; --- - + + +

    ← Docs index

    + +

    doc.title

    + +

    doc.description

    + + + +

    Related

    + + +
    diff --git a/src/pages/plain/docs/managed-policies.astro b/src/pages/plain/docs/managed-policies.astro index 9cd20b9b..c24b6601 100644 --- a/src/pages/plain/docs/managed-policies.astro +++ b/src/pages/plain/docs/managed-policies.astro @@ -1,4 +1,23 @@ --- -import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; +// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. +// plain-source: src/pages/docs/managed-policies.astro +// plain-source-sha256: b7645c5c6c5e480e6cc4b9c6dba5dcb91683473b62b2238bc73f61f7d596ece1 +import PlainLayout from '../../../layouts/PlainLayout.astro'; --- - + + +

    ← Docs index

    + +

    Managed Policies

    + +

    This document describes managed policies.

    + + + +

    Related

    + + +
    diff --git a/src/pages/plain/docs/managed-readiness.astro b/src/pages/plain/docs/managed-readiness.astro index ab61b07d..c71be900 100644 --- a/src/pages/plain/docs/managed-readiness.astro +++ b/src/pages/plain/docs/managed-readiness.astro @@ -1,4 +1,47 @@ --- -import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; +// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. +// plain-source: src/pages/docs/managed-readiness.astro +// plain-source-sha256: 1f6e87e861c2cf0595649390a556fc0256d64c56e1a09f4684a112822a1765e1 +import PlainLayout from '../../../layouts/PlainLayout.astro'; --- - + + +

    ← Docs index

    + +

    Managed Readiness

    + +

    Managed readiness checks verify that a service is ready to accept traffic before it is added to a load balancer. Checks are used during deployments and scaling events.

    + +

    How Readiness Checks Work

    +

    The platform performs readiness checks based on the configuration in the service definition. A check is successful if it meets the defined conditions within a specified timeout period. If a check fails, the platform retries according to the configured policy. Persistent failure marks the deployment as failed.

    +
      +
    • Initial Delay: A grace period before the first check is performed, allowing the application time to start.
    • +
    • Period: The interval between consecutive checks.
    • +
    • Timeout: The time allowed for a single check to complete.
    • +
    • Success Threshold: The number of successful checks required to mark the container as ready.
    • +
    • Failure Threshold: The number of failed checks after which the container is considered not ready.
    • +
    + +

    Configuration

    +

    A readiness check is configured in the service's configuration file. HTTP and TCP checks are supported.

    +

    An HTTP check sends a GET request to a specified path. A 2xx or 3xx status code response is considered a success.

    +
    readinessProbe:
    +  httpGet:
    +    path: /healthz
    +    port: 8080
    +  initialDelaySeconds: 5
    +  periodSeconds: 10
    +

    A TCP check attempts to open a socket to a container on a specified port. A successful connection is considered a success.

    +
    readinessProbe:
    +  tcpSocket:
    +    port: 5432
    +  initialDelaySeconds: 15
    +  periodSeconds: 20
    + +

    Related

    + + +
    From 5781be24edde41e0b3b26b2a1a85ea0110f8eb7d Mon Sep 17 00:00:00 2001 From: Teodor Calin Date: Thu, 3 Sep 2026 12:55:45 +0300 Subject: [PATCH 7/8] Revert "chore(plain): auto-regenerate stale machine-UI twins" This reverts commit d410ff3ed63db703e71deee086a7002dc348bd53. --- src/pages/plain/docs/managed-accounts.astro | 23 +-------- .../plain/docs/managed-agent-adoption.astro | 23 +-------- .../plain/docs/managed-control-plane.astro | 23 +-------- src/pages/plain/docs/managed-fleet.astro | 39 +-------------- src/pages/plain/docs/managed-harnesses.astro | 23 +-------- src/pages/plain/docs/managed-policies.astro | 23 +-------- src/pages/plain/docs/managed-readiness.astro | 47 +------------------ 7 files changed, 14 insertions(+), 187 deletions(-) diff --git a/src/pages/plain/docs/managed-accounts.astro b/src/pages/plain/docs/managed-accounts.astro index 2e7e7f25..3f3669a2 100644 --- a/src/pages/plain/docs/managed-accounts.astro +++ b/src/pages/plain/docs/managed-accounts.astro @@ -1,23 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-accounts.astro -// plain-source-sha256: 4d88e5ad027ff566d795f6aa68e9cb3901aded932eb519d0eeb4b838caa1a431 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Accounts

    - -

    - - - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-agent-adoption.astro b/src/pages/plain/docs/managed-agent-adoption.astro index 970e7094..c174c88d 100644 --- a/src/pages/plain/docs/managed-agent-adoption.astro +++ b/src/pages/plain/docs/managed-agent-adoption.astro @@ -1,23 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-agent-adoption.astro -// plain-source-sha256: b12d0f51096e90d8d8c42a9484a3939f058c3dd2d15cb8ca9b33c238cd7c337a -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Agent Adoption

    - -

    - - - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-control-plane.astro b/src/pages/plain/docs/managed-control-plane.astro index cb403b4e..eb8b8346 100644 --- a/src/pages/plain/docs/managed-control-plane.astro +++ b/src/pages/plain/docs/managed-control-plane.astro @@ -1,23 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-control-plane.astro -// plain-source-sha256: f3dfc21b561e0fb2dbe147a2446d55101e8c1f2f6e0ad1f3bc42a1b43869c815 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Control Plane

    - -

    This page describes the managed control plane.

    - - - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-fleet.astro b/src/pages/plain/docs/managed-fleet.astro index 6996a599..5b7e2147 100644 --- a/src/pages/plain/docs/managed-fleet.astro +++ b/src/pages/plain/docs/managed-fleet.astro @@ -1,39 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-fleet.astro -// plain-source-sha256: 2d897ffca786983b40b756af2aa3f289af0c00ff558f6788fcdfc4dbe87a2c55 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Fleet

    - -

    A managed fleet provides administrative control over devices in a tailnet. It enables features like device approval, access control, and key expiry.

    - -

    Overview

    -

    When a device is part of a managed fleet, administrators can enforce security policies, require approval for new devices, and monitor network activity. This applies to all devices within the tailnet.

    - -

    Enabling a managed fleet

    -

    A managed fleet is enabled from the 'Settings' page in the admin console. Toggling the 'Managed Fleet' option on will apply the setting to all devices in the tailnet.

    - -

    Features

    -
      -
    • Device Approval: Require admin approval for new devices joining the tailnet.
    • -
    • Access Control Lists (ACLs): Define network access policies for devices.
    • -
    • Key Expiry: Set automatic key expiration policies.
    • -
    - -

    API Access

    -

    Fleet management is available via the API. The /api/v2/tailnet/:tailnet/devices endpoint can be used to list and manage devices.

    -
    curl -X GET "https://api.tailscale.com/api/v2/tailnet/your-tailnet/devices" \
    -  -u "$TOKEN:"
    - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-harnesses.astro b/src/pages/plain/docs/managed-harnesses.astro index 845f7f0d..14afbbe2 100644 --- a/src/pages/plain/docs/managed-harnesses.astro +++ b/src/pages/plain/docs/managed-harnesses.astro @@ -1,23 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-harnesses.astro -// plain-source-sha256: e0336c8c55f5e17dc8cca1e19ff98c1514de5ddff928e82197f86df9b34fcab0 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    doc.title

    - -

    doc.description

    - - - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-policies.astro b/src/pages/plain/docs/managed-policies.astro index c24b6601..9cd20b9b 100644 --- a/src/pages/plain/docs/managed-policies.astro +++ b/src/pages/plain/docs/managed-policies.astro @@ -1,23 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-policies.astro -// plain-source-sha256: b7645c5c6c5e480e6cc4b9c6dba5dcb91683473b62b2238bc73f61f7d596ece1 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Policies

    - -

    This document describes managed policies.

    - - - -

    Related

    - - -
    + diff --git a/src/pages/plain/docs/managed-readiness.astro b/src/pages/plain/docs/managed-readiness.astro index c71be900..ab61b07d 100644 --- a/src/pages/plain/docs/managed-readiness.astro +++ b/src/pages/plain/docs/managed-readiness.astro @@ -1,47 +1,4 @@ --- -// Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. -// plain-source: src/pages/docs/managed-readiness.astro -// plain-source-sha256: 1f6e87e861c2cf0595649390a556fc0256d64c56e1a09f4684a112822a1765e1 -import PlainLayout from '../../../layouts/PlainLayout.astro'; +import ManagedPlainDoc from '../../../components/ManagedPlainDoc.astro'; --- - - -

    ← Docs index

    - -

    Managed Readiness

    - -

    Managed readiness checks verify that a service is ready to accept traffic before it is added to a load balancer. Checks are used during deployments and scaling events.

    - -

    How Readiness Checks Work

    -

    The platform performs readiness checks based on the configuration in the service definition. A check is successful if it meets the defined conditions within a specified timeout period. If a check fails, the platform retries according to the configured policy. Persistent failure marks the deployment as failed.

    -
      -
    • Initial Delay: A grace period before the first check is performed, allowing the application time to start.
    • -
    • Period: The interval between consecutive checks.
    • -
    • Timeout: The time allowed for a single check to complete.
    • -
    • Success Threshold: The number of successful checks required to mark the container as ready.
    • -
    • Failure Threshold: The number of failed checks after which the container is considered not ready.
    • -
    - -

    Configuration

    -

    A readiness check is configured in the service's configuration file. HTTP and TCP checks are supported.

    -

    An HTTP check sends a GET request to a specified path. A 2xx or 3xx status code response is considered a success.

    -
    readinessProbe:
    -  httpGet:
    -    path: /healthz
    -    port: 8080
    -  initialDelaySeconds: 5
    -  periodSeconds: 10
    -

    A TCP check attempts to open a socket to a container on a specified port. A successful connection is considered a success.

    -
    readinessProbe:
    -  tcpSocket:
    -    port: 5432
    -  initialDelaySeconds: 15
    -  periodSeconds: 20
    - -

    Related

    - - -
    + From 33beeaca1ce1980819894838285b54b5a5c7b341 Mon Sep 17 00:00:00 2001 From: Teodor Calin Date: Thu, 3 Sep 2026 12:56:02 +0300 Subject: [PATCH 8/8] Exclude data-driven managed docs from prose regeneration --- scripts/regen-plain.mjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/regen-plain.mjs b/scripts/regen-plain.mjs index 18c256ab..e32a8e7f 100644 --- a/scripts/regen-plain.mjs +++ b/scripts/regen-plain.mjs @@ -132,6 +132,11 @@ async function loadDocManifest() { const source = `src/pages/docs/${file}`; const dest = `src/pages/plain/docs/${file}`; const full = await readFile(join(REPO_ROOT, source), 'utf8'); + // Managed documentation renders from src/data/managedDocs.ts on both the + // human and plain routes. Feeding the thin route wrapper to the prose + // generator loses the authoritative content and produces placeholders. + // Its plain wrapper is intentionally unstamped and data-driven. + if (full.includes("from '../../data/managedDocs'")) continue; const meta = readDocMeta(full); const isIndex = slugPart === 'index'; const canonical = isIndex