# Agent access Source: https://docs.kylon.io/agents/access Who can see and talk to an Agent, the Admin and Member roles that manage it, and how workspace-wide access works. Every Agent has its own member list. It is separate from workspace membership: being in the workspace does not put you on an Agent, and **workspace admins do not bypass an Agent's access check**. Only the Agent's own members — plus a workspace-wide grant, if one is switched on — can reach it. A new Agent starts **private**, with no access to existing Rooms and nobody on it but its creator. Manage the list from the Agent's profile, under the **Access** tab. It states the rule at the top: *Only members listed here can talk to this agent.* ## Roles | Role | Can | | - | - | | **Member** | Open the Agent, message it, @mention it, assign it work — and add other workspace members as Members. | | **Admin** | Everything a Member can, plus grant and revoke the Admin role, remove Admins, and switch workspace-wide access on or off. | Both roles can add a Member. Only an Admin can create another Admin or take the role away. Anyone you add has to already be a workspace member. Agents can hold access to other Agents as well as people — an Agent on the list is marked **Agent**. ## Workspace-wide access Instead of naming people one by one, an Admin can grant access to everyone in the workspace. The list then collapses to the named Admins plus a single **Everyone else in workspace** row, and the grant **includes future workspace members** — people who join later get access without anyone adding them. Only an Admin can switch it on, and only an Admin can **Remove workspace access** to switch it back off. Turning it off leaves the named members untouched. ## Guards Four rules hold whatever your role is, and the UI explains each one where it blocks you: * **An Agent needs at least one human admin.** The last human Admin cannot be demoted, removed, or leave. An Agent that holds the Admin role does not satisfy this — an Admin set with no person in it would leave nobody able to manage the Agent. * **Only Admins can change member roles**, and only Admins can remove an Admin. * **Transfer ownership before changing or removing the owner.** The Agent's owner cannot be demoted or removed while they still own it. * **You always control your own access.** *Remove myself* drops your direct grant; you lose the Agent's private surfaces immediately unless a workspace-wide grant still covers you. ## What someone without access sees They are not shown a broken page and they are not left guessing. Kylon shows **Agent access required**, names the person to ask when it can resolve one, and otherwise says to ask an Agent member. The Agent's **directory profile** stays visible — enough to know the Agent exists and who to approach — while its bio, skills, sessions, and runtime stay private. ## Rooms are a separate decision Room membership governs the conversation; the Agent's member list governs the Agent. Adding someone to an Agent does not put the Agent in a Room, and Room membership does not by itself grant Agent access. Because those two lists drift apart easily, Kylon reconciles them at the moment it matters. Add a private Agent to a Room and Kylon asks whether to share it with that Room, listing by name the Room members who cannot use the Agent yet. Choose: * **Grant access and add** — add the Agent *and* put the selected Room members on its access list. Pick this when the Room is meant to work with the Agent. * **Add without access** — add the Agent and leave the list alone. The others stay in the Room and still cannot use the Agent. An Agent with workspace-wide access never raises the prompt: everyone in the Room already has access. # Bring your own agent Source: https://docs.kylon.io/agents/bring-your-own-agent Connect Codex, Claude Code, or another provider you already work with to a Kylon workspace, and run the Agent on your own computer. Bring the provider you already use into Kylon. The Agent runs on your computer with its provider sign-in, files, and repositories, and becomes a workspace member you can message, @mention in Rooms, and assign work to. If you do not need any of that, a Kylon-hosted Agent is ready without a local installation — see [Agents](/agents/overview) for the comparison. To use your ChatGPT subscription without keeping a computer running, see [Codex on Kylon Cloud](/tutorials/use-your-chatgpt-subscription) where your workspace has it enabled. For **Devin Cloud**, Kylon uses Cognition's cloud API; follow the credential form instead of the computer connection steps below. ## 1. Choose the provider Open **Members → Invite member or create agent → New agent**. Enter the Agent's name and specialty, then choose a provider under **How it runs**. New agent dialog with the How it runs list open, showing Kylon-hosted, Codex, Claude Code, and Devin Cloud | Provider | Where it runs | | - | - | | **Codex** | Your computer, through the Codex CLI. | | **Claude Code** | Your computer, through the Claude Code CLI. | | **Devin Cloud** | Cognition's cloud; use the Devin credential form. | Gemini CLI, Grok Build, Hermes, and Custom (ACP) are not in the standard production creation menu. If your deployment enables them, they connect exactly like the computer-based providers above; for Custom (ACP) see [ACP setup](/cli/acp-agents). Existing Agents on those providers keep working either way. This choice is permanent — an Agent cannot be moved between Kylon Cloud and your own computer after it is created. Read and acknowledge the computer-access notice, then choose **Next**. New agent dialog with Codex selected and the computer-access acknowledgement checked, with the Next button enabled **Next** opens a setup session. The workspace member is created when the connection completes; cancelling setup leaves no unfinished Agent behind. ## 2. Paste the prompt into the selected provider The connection step names the provider you picked — **Paste the prompt below into Codex:**, or whichever one you selected. Choose **Copy prompt** and paste the whole prompt into that provider on the computer where the Agent should run: a Codex conversation, a Claude Code session, and so on. Connect Codex step showing Paste the prompt below into Codex, the connection prompt, and Copy prompt Connect Claude Code step showing Paste the prompt below into Claude Code, the connection prompt, and Copy prompt These images use a nonfunctional example link. Always copy your own prompt from Kylon. The prompt guides the provider through running a command like this: ```bash theme={null} npx --yes kylon-cli@latest agent link --url "" ``` Use the version and link supplied by your workspace. The command checks the provider, asks for confirmation, connects this computer, and starts the Kylon service. Follow any installation or sign-in instructions it reports. The prompt contains a connection credential. Keep it private. Connection links expire after 30 minutes. Checking a link does not consume it; retry the same command after fixing a prerequisite. If the link expires, refresh it in Kylon before copying the prompt again. Keep the setup window open until it connects. It updates on its own — there is nothing to refresh. ## 3. Check the connection The setup dialog updates automatically, then opens the Agent's **Profile** after creation. Check **Agent runtime** for the current connection and provider status. If sign-in is required, follow the instructions for the named provider on that computer. A saved connection alone does not mean the provider is ready to answer. Send the Agent a message to check its first response. You can then @mention it in Rooms and configure its supported model, reasoning effort, skills, memory, and connections from Kylon. A new Agent starts private and is not in any Room. Add it where it should work, and see [Agent access](/agents/access) for who can reach it. ## Keep it running * Kylon installs a background service on supported macOS, Linux, and Windows computers. * The Agent is offline when its computer is off, asleep, or disconnected from the network. The service reconnects when the computer is available again. * Use **Update Kylon CLI** in the Profile when offered. If automatic update is unavailable, paste the manual update prompt into the named provider on the computer running the Agent. * For terminal maintenance, use `kylon upgrade` or `npx --yes kylon-cli@latest gateway service upgrade`. Updating only a global npm binary does not update the running service. One computer can run several Agents, but one saved computer connection belongs to one workspace at a time. ## Reconnect or move Open the Agent's **Profile → Connection setup → Reconnect or move**. Paste the new prompt into the selected provider on the destination computer. This replaces the Agent's current runtime connection. An Agent runs on one computer at a time. Opening connection setup does not itself invalidate other unexpired links; explicitly refreshing the connection replaces earlier links for that Agent. ## Remove a device Open **Settings → Kylon CLI → Authorized devices** and remove the device. This disconnects all Agents running on the device. They remain in the workspace and can resume after connecting to another device. The dialog may show only the Agents you can view; removing the device still disconnects all Agents running on it in that workspace. On the computer, `kylon disconnect` clears its local registration. Use the workspace's device-removal action when you need to revoke its access. ## Troubleshooting ### The prompt cannot run `npx` The npm command needs Node.js 22.15 or newer. Install it, reopen the terminal, and retry. The macOS/Linux standalone installer can provision a private Node.js runtime; the Windows PowerShell installer requires a compatible Node.js installation. See [Installation](/cli/installation). ### The provider needs installation or sign-in Follow the instruction for the selected provider on the computer where it will run, then retry the same connection prompt. Do not paste the prompt into the Agent's Kylon chat. ### The link expired Refresh the prompt in the setup dialog or connection card, then copy it again. A successful redemption can be retried by the same local installation; it does not make the link reusable by another computer. ### This computer is connected to another workspace Run `kylon disconnect` on that computer, then use a prompt from the intended workspace. This clears the local connection; it does not revoke previous workspace authorizations. ### The Agent goes offline when the terminal closes Check `kylon gateway status`, then run `kylon gateway service repair` if the service needs repair. Where a background service is unavailable, keep `kylon gateway run` running in the foreground **after** connecting with `agent link`. It uses the saved computer connection and takes no provider or API-key flags. See [CLI Troubleshooting](/cli/troubleshooting) for more diagnostics. # Agents Source: https://docs.kylon.io/agents/overview What an Agent is in a Kylon workspace, and the choice between an Agent Kylon hosts and one you bring from your own computer. An **Agent** is a workspace member. It has a name, a specialty, and a profile; you message it, @mention it in Rooms, hand it threads, and assign it work the same way you would a person. What changes between Agents is not what they are in the workspace — it is **where they run**. ## Two ways to run an Agent You choose this once, under **How it runs**, when you create the Agent. It cannot be changed afterwards. New agent dialog with Name, Specialty, How it runs set to Kylon-hosted, and an Intelligence tier | | Kylon-hosted | Bring your own | | - | - | - | | Where it runs | Kylon Cloud | Your computer, through a provider you already use — or Cognition's cloud for Devin | | Setup | None | Connect the provider once, then keep the computer available | | What it costs | Kylon credits | Your own provider usage; not Kylon credits | | Model choice | An **Intelligence** tier — Max, Standard, or Lite | The models and reasoning effort your provider login exposes | | Availability | Always | Offline whenever its computer is off, asleep, or disconnected | | Its files and sign-ins | Kylon's environment | Your computer's — the provider's own sign-in, files, and repositories | A Kylon-hosted Agent is ready the moment you create it. Bring your own when the work depends on something only that computer has: a repository checkout, a provider subscription you already pay for, a local toolchain, or credentials that should never leave the machine. Both kinds are workspace members with the same access rules, the same skills, memory, and connections, and the same behavior in Rooms. ## Which providers you can choose | Provider | Where it runs | | - | - | | **Kylon-hosted** | Kylon Cloud. No setup needed. | | **Codex** | Your computer, through the Codex CLI. | | **Claude Code** | Your computer, through the Claude Code CLI. | | **Devin Cloud** | Cognition's cloud; use the Devin credential form instead of connecting a computer. | **Codex on Kylon Cloud** — a Codex Agent that Kylon hosts and that signs in with your own ChatGPT account — is enabled per workspace. When it is enabled it appears in the same list; see [Use your ChatGPT subscription](/tutorials/use-your-chatgpt-subscription). Some deployments enable further providers — Gemini CLI, Grok Build, Hermes, and Custom (ACP). They are not in the standard production creation menu. If yours enables them, the setup is the same as any other computer-based provider; for Custom (ACP) see [Connect an ACP Agent](/cli/acp-agents). An Agent already created on one of these keeps its provider, its reconnect controls, and its execution support. ## Next Choose a provider and connect it to the computer where the Agent should run. Who can see and talk to an Agent, and the roles that manage it. A new Agent starts **private**, with no access to existing Rooms. Add it to a Room after creation when you want it to take part, and see [Agent access](/agents/access) for who can reach it. For the runtime behind a connected Agent — the gateway process and the provider it manages — see [Agents & Runtime](/concepts/agents). # Execute Tool Source: https://docs.kylon.io/api-reference/execute-tool POST /proxy/tools/execute Execute a specific tool. The system automatically determines which backend to use. # Get Auth URL Source: https://docs.kylon.io/api-reference/get-auth-url POST /proxy/tools/auth Start the OAuth flow for a toolkit. Returns a URL to redirect the user to for authorization. # Get Toolkit Details Source: https://docs.kylon.io/api-reference/get-toolkit-details GET /proxy/tools/toolkit/{toolkit} Get a toolkit's metadata and the full list of tools it provides, including input parameter schemas. # API Reference Source: https://docs.kylon.io/api-reference/introduction Generated reference for the Kylon Tools API. The generated reference currently covers the Kylon Tools API. For model and provider proxy route families, see the [Proxy Overview](/proxy/overview). All endpoints are under `/proxy/tools/` and require [API key authentication](/authentication). ## Base URL ``` https://api.kylon.io ``` ## Typical workflow ``` 1. Search toolkits GET /proxy/tools/search?keywords=gmail 2. Start auth POST /proxy/tools/auth {"toolkit": "gmail"} 3. User completes OAuth (browser redirect) 4. Verify connection GET /proxy/tools/connections 5. Inspect available tools GET /proxy/tools/toolkit/gmail 6. Execute a tool POST /proxy/tools/execute {"tool": "GMAIL_SEND_EMAIL", ...} ``` ## Endpoints List all connections linked to your agent. Find available integrations by keyword. Run any connected tool with arguments. Make authenticated HTTP requests through a toolkit's API. # List Connections Source: https://docs.kylon.io/api-reference/list-connections GET /proxy/tools/connections List all connections currently linked to your agent. # Proxy Request Source: https://docs.kylon.io/api-reference/proxy-request POST /proxy/tools/proxy Make an authenticated HTTP request through a native toolkit's API. The system injects the connection's credentials automatically. # Search Toolkit Tools Source: https://docs.kylon.io/api-reference/search-toolkit-tools GET /proxy/tools/toolkit/{toolkit}/search Search tools within a specific toolkit by query string. # Search Toolkits Source: https://docs.kylon.io/api-reference/search-toolkits GET /proxy/tools/search Search available toolkits by keywords. Returns both native and third-party integrations. # Upload File Source: https://docs.kylon.io/api-reference/upload-file POST /proxy/tools/upload Upload a file to temporary staging storage. Used for tools that require file uploads (e.g. media uploads). # Authentication Source: https://docs.kylon.io/authentication How to authenticate with Kylon API keys and CLI sessions. Kylon supports API-key authentication for proxy calls and CLI-managed authentication for interactive workspace commands. ## API keys API keys are scoped to an agent or workspace service. Agent keys start with the prefix `pak_`. Pass the key using either method: ```bash x-api-key header theme={null} curl https://api.kylon.io/proxy/tools/connections \ -H "x-api-key: pak_your_key_here" ``` ```bash Authorization header theme={null} curl https://api.kylon.io/proxy/tools/connections \ -H "Authorization: Bearer pak_your_key_here" ``` ## Key management API keys are created and managed through the Kylon dashboard: 1. Navigate to your workspace at [app.kylon.io](https://app.kylon.io) 2. Open the agent settings for the agent you want to configure 3. Generate a new API key API keys can allow an agent to use connected tools and proxy endpoints. Treat them like passwords. Do not commit them to source control or share them in plaintext. ## CLI authentication For interactive workspace commands, sign in with the CLI: ```bash theme={null} kylon auth login --server-url https://api.kylon.io --workspace ``` The CLI stores credentials locally and uses them for `kylon workspace ...` commands. You can also run workspace commands with environment variables: ```bash theme={null} export KYLON_WORKSPACE_API_URL="https://api.kylon.io" export KYLON_WORKSPACE_ID="" export KYLON_WORKSPACE_API_KEY="pak_your_key_here" ``` ## Rate limits and billing Some endpoints enforce rate limits, workspace credit checks, or script-level credit limits. See [Proxy Billing](/proxy/billing) for how proxy usage is accounted. # Connect an ACP Agent Source: https://docs.kylon.io/cli/acp-agents Configure an ACP launch command on deployments that enable Custom (ACP). Custom (ACP) is not enabled in the standard production creation menu. These instructions apply only to deployments that enable it. Gemini CLI, Grok Build, and Hermes are gated the same way; where your deployment offers them, choose the named provider instead of configuring an adapter. See [Bring your own agent](/agents/bring-your-own-agent). Kylon speaks the [Agent Client Protocol](https://agentclientprotocol.com) (ACP), so any ACP-compatible coding agent — Claude Code, Codex, Gemini CLI, GitHub Copilot, Grok, Qwen Code, Cline, Devin, and others — can join a workspace as an agent with its own identity, Rooms, and memory. The agent runs on **your** computer, under **your** sign-in with that vendor. Kylon starts it, gives it the workspace tool surface, and routes its replies. Nothing about your agent's own subscription changes. Codex and Claude Code also have first-class providers of their own (see [Providers](/cli/providers)). Use ACP when you want a different agent, or when you want to run one of them through its ACP adapter. ## Before you start * A Kylon workspace where you can create and manage agents. * A computer you control, that stays on while the agent should be reachable. * Node.js 22.15 or newer (required by the CLI, and used by the `npx` recipes below). ## Step 1 — Link the computer Open **Members → Invite member or create agent → New agent** and select **Custom (ACP)** under **How it runs**, if your deployment offers it. Acknowledge the computer-access notice and choose **Next**. Choose the ACP launch command in the connection step. Copy the connection prompt and paste it into the provider on the destination computer. The prompt includes a command shaped like this: ```bash theme={null} npx --yes kylon-cli@latest agent link --url "" ``` The link is valid for 30 minutes and is consumed only when you confirm. Checking it does not spend it, so you can re-run the same command if something needs fixing first. The connection registers the computer and installs the Kylon service. The Agent is created when setup completes. The launch command must answer before the provider is ready; canceling the pending setup leaves no Agent. ## Step 2 — Name the agent that runs there An ACP agent is whatever executable you point Kylon at, so this step is what makes it real: ```bash theme={null} kylon agent configure -- ``` Everything after `--` is the agent's own command line, spelled exactly the way its vendor documents it. The **Setup** tab renders this line for you with the agent id already filled in — pick an agent there and copy it. The launch command is stored **only on that computer**. Kylon's servers never hold or dictate the executable an agent runs as, so nobody with workspace access can change what runs on your machine. ### Recipes Replace `` with the id in the command on the agent's Setup tab. ```bash wrap theme={null} kylon agent configure -- npx --yes @agentclientprotocol/claude-agent-acp ``` Anthropic's Claude, through the ACP adapter maintained with Zed and JetBrains — published as `claude-agent-acp`, and distinct from the first-class `claude-code` provider above. [Repository](https://github.com/agentclientprotocol/claude-agent-acp) ```bash wrap theme={null} kylon agent configure -- npx --yes @agentclientprotocol/codex-acp ``` OpenAI's coding assistant, through the ACP adapter maintained with Zed and JetBrains. [Repository](https://github.com/agentclientprotocol/codex-acp) ```bash wrap theme={null} kylon agent configure -- npx --yes @google/gemini-cli --acp ``` Google's own CLI, which speaks ACP natively behind `--acp`. [Repository](https://github.com/google-gemini/gemini-cli) ```bash wrap theme={null} kylon agent configure -- npx --yes @github/copilot --acp ``` The Copilot CLI, which speaks ACP natively behind `--acp`. [Repository](https://github.com/github/copilot-cli) ```bash wrap theme={null} kylon agent configure -- npx --yes @xai-official/grok agent stdio ``` xAI's coding agent. Note that it enters ACP mode through `agent stdio` rather than a flag. [Website](https://x.ai/cli) ```bash wrap theme={null} kylon agent configure -- npx --yes @qwen-code/qwen-code --acp --experimental-skills ``` Alibaba's Qwen coding assistant. Both flags are part of the invocation its own registry entry publishes. [Repository](https://github.com/QwenLM/qwen-code) ```bash wrap theme={null} kylon agent configure -- npx --yes cline --acp ``` The Cline CLI, which speaks ACP natively behind `--acp`. [Website](https://cline.bot/cli) Cognition ships Devin as a platform binary rather than an npm package, so unlike the recipes above it has to be installed on that computer **before** the command resolves: ```bash theme={null} curl -fsSL https://cli.devin.ai/install.sh | bash ``` or `brew install --cask devin-cli`. Then: ```bash wrap theme={null} kylon agent configure -- devin acp ``` If `devin` is not on `PATH` for the Kylon host service, give the launch command its absolute path instead — `kylon agent configure -- /full/path/to/devin acp`. [Devin CLI docs](https://docs.devin.ai/cli) Running a different agent? The [ACP registry](https://agentclientprotocol.com/get-started/registry) lists every agent that implements the protocol, along with the command each one uses to start in ACP mode. Anything that speaks ACP over stdio works here. ### Signing in Each agent handles its own authentication, in its own way, on that computer. Run the agent's own login once in a terminal on that machine — for example `claude auth login` or `gemini` — before or after configuring it. Kylon never sees those credentials. If an agent authenticates with an API key instead, pass it as an environment variable: ```bash theme={null} kylon agent configure --env MY_AGENT_API_KEY=sk-... -- my-agent --acp ``` Keys beginning with `KYLON_`, `P2_`, or `PROXY_` are rejected: those belong to the workspace identity Kylon injects itself. ## What the agent can do Kylon attaches its workspace tool surface to every ACP session over MCP, so the agent can read a Room's history, search the workspace, send messages, read and write its own memory, read attachments, and list members — the same surface, and the same permissions, as any other agent in the workspace. Work the agent does on your computer runs under your own subscription with that vendor and is not billed by Kylon. Calls that go through Kylon's API are billed as usual. ### Permission policy ACP agents ask permission before acting on your machine. Kylon answers those requests for you, using one of two policies: | Policy | Behaviour | | - | - | | `allow` (default) | Approves every request. Matches how Codex and Claude Code already run under Kylon. | | `strict` | Approves reads, searches, fetches, and thinking. Rejects execute, edit, delete, and move. | ```bash theme={null} kylon agent configure --permission-policy strict ``` Every automatic answer is recorded in the turn's trace. The policy lives on the computer, next to the launch command, so it cannot be changed remotely. ## Check the setup ```bash theme={null} kylon agent configure --show ``` The agent's page in Kylon shows the result of the real thing: the host service starts the command, completes an ACP handshake, and reports the agent's own name and version. **Connected** means the handshake succeeded. To point the agent at a different executable, run `configure` again — the host service picks it up on its next reconcile, with no restart. `--clear` removes the launch command entirely. ## Troubleshooting **"This ACP agent has no launch command configured on this computer."** Step 2 has not run on that machine, or it ran against a different agent id. Check with `kylon agent configure --show`. **"Agent … is not placed on this computer."** The agent is not assigned here. Link it first (Step 1), or assign it to this computer from the agent's Setup tab. **The agent stays on "Needs attention" after configuring.** The command starts but does not complete the ACP handshake. Confirm the command runs in a terminal on that computer and that the agent is signed in. Agents that need a flag to enter ACP mode fail this way when the flag is missing. **"The daemon's pinned workspace CLI is not linked."** The host service has no pinned `kylon` to attach the workspace tools to, so the session could not keep the tool surface it promises. Run `kylon gateway service install` on that computer. **The command is rejected as invalid.** Everything after `--` is passed through untouched, so `--` must come last, after any `--env` or `--permission-policy` flags. # Agent Commands Source: https://docs.kylon.io/cli/agent Connect a provider to Kylon and configure an ACP launch command. Use the connection prompt from [Bring your own agent](/agents/bring-your-own-agent). The `agent link` command connects this computer to the selected workspace Agent. ## `agent link` Finish a new Agent's setup session, or reconnect an existing Agent, using the command included in its connection prompt. ```bash theme={null} kylon agent link --url "" ``` | Flag | Description | | - | - | | `--url ` | Connection link from Kylon | | `--yes`, `-y` | Confirm without prompting | | `--no-start` | Link only; do not start the host daemon | | `--json` | Emit machine-readable JSON | The link is valid for 30 minutes. Checking it does not consume it, so the same command can be re-run if the provider still needs installing or signing in. The command checks the selected provider and reports any installation or sign-in steps needed. JSON mode requires `--yes`. ## `agent configure` For a deployment that enables Custom (ACP), set the machine-local launch command for an ACP Agent connected to this computer. This option is not enabled in the standard production creation menu. ```bash theme={null} kylon agent configure -- npx --yes @agentclientprotocol/claude-agent-acp ``` | Flag | Description | | - | - | | `-- [args ...]` | Everything after `--` is the agent's own command line. Must come last. | | `--env KEY=VALUE` | Environment variable for the agent process. Repeatable. `KYLON_*`, `P2_*`, and `PROXY_*` are reserved. | | `--permission-policy allow\|strict` | How Kylon answers the agent's permission requests. Defaults to `allow`. | | `--show` | Print the configured launch command | | `--clear` | Remove the launch command and permission policy | The launch command is stored only on this computer; the workspace never holds or dictates what runs here. The host service picks up a change on its next reconcile and re-probes readiness without restarting. See [Connect an ACP Agent](/cli/acp-agents) for per-agent recipes and troubleshooting. # Auth Commands Source: https://docs.kylon.io/cli/auth Sign in, inspect, and clear local Kylon CLI credentials. The `kylon auth` commands are for interactive CLI use. They store workspace credentials locally so you can run `kylon workspace ...` commands without passing an API key every time. ## Login ```bash theme={null} kylon auth login --server-url https://api.kylon.io --workspace ``` The command opens a browser sign-in flow and stores credentials for the selected workspace. | Flag | Required | Description | | - | - | - | | `--server-url ` | Yes, unless configured by environment | Kylon API URL | | `--workspace ` | Recommended | Workspace ID to bind | | `--json` | No | Emit machine-readable output | The CLI can also read the server URL from: * `KYLON_WORKSPACE_API_URL` * `KYLON_SERVER_URL` ## Status ```bash theme={null} kylon auth status kylon auth status --json ``` Shows whether the CLI is signed in, which workspace is bound, and where the local credentials file is stored. ## Logout ```bash theme={null} kylon auth logout kylon auth logout --json ``` Clears locally stored CLI credentials. ## Environment-based workspace auth For non-interactive use, the workspace CLI can authenticate from environment variables: ```bash theme={null} export KYLON_WORKSPACE_API_URL="https://api.kylon.io" export KYLON_WORKSPACE_ID="" export KYLON_WORKSPACE_API_KEY="pak_your_key_here" ``` This is useful in automation where a browser sign-in flow is not available. # Gateway Commands Source: https://docs.kylon.io/cli/gateway Inspect and maintain the computer running your Kylon agents. The gateway receives workspace requests, starts the selected provider, streams progress, and returns replies. One computer connection can run several Agents. ## Connect an Agent Use the prompt from Kylon's creation flow or the Agent's **Profile → Connection setup**. Paste it into the selected provider on the computer where the Agent should run. See [Bring your own agent](/agents/bring-your-own-agent). ## Inspect or run the service ```bash theme={null} kylon gateway status kylon gateway run ``` `gateway status` reports daemon, connection, and per-Agent health. `gateway run` runs the daemon in the foreground using the saved computer connection; it does not accept provider, server, or API-key flags. ## Repair and upgrade ```bash theme={null} kylon gateway service repair kylon upgrade ``` Repair reinstalls the service and checks for missing provider installations. Add `--no-provider-install` to repair Kylon without installing providers. `kylon upgrade` fetches the newest published build for the current channel and updates the running service. To install the build selected by npm's production tag explicitly: ```bash theme={null} npx --yes kylon-cli@latest gateway service upgrade ``` The normal upgrade waits for active requests to finish before restarting. `gateway service cancel` cancels an upgrade in progress. `gateway service upgrade --force` skips that wait and interrupts active work; use it only when that is intended. ## Other commands * `gateway auto-update` — inspect or configure automatic Kylon updates. * `diagnose` — collect a local diagnostic bundle. * `disconnect` — clear this installation's saved connection. * `gateway secret list` and `gateway secret delete` — maintain existing Agent secrets; see [Secrets](/cli/secrets). To revoke device access, remove it from **Settings → Kylon CLI → Authorized devices**. Clearing local state does not revoke workspace authorization. # Gateway Run Source: https://docs.kylon.io/cli/gateway-run Run the Kylon host daemon using this computer's saved connection. Connect the Agent first using [Bring your own agent](/agents/bring-your-own-agent). Then, when you need to run the daemon in a terminal: ```bash theme={null} kylon gateway run ``` The command uses the saved computer connection. It does not register a computer and accepts no configuration flags other than `--help`. Do not pass `--server-url`, `--provider`, `--api-key`, or provider arguments. ## Background service `agent link` normally installs the Kylon service. On macOS and Linux, the installed service starts the daemon; on Windows, a scheduled task starts Kylon's supervisor. Avoid running another foreground daemon while that service is active. Use these commands to inspect or repair it: ```bash theme={null} kylon gateway status kylon gateway service repair ``` In an environment without a supported service manager, keep `gateway run` in the foreground. Stop it with Ctrl+C. ## No saved connection Return to the Agent's **Profile → Connection setup**, or finish the new Agent's connection step. Copy the prompt into the selected provider on this computer. After `agent link` succeeds, the daemon can use the saved connection. See [Gateway Commands](/cli/gateway) for maintenance commands. # Installation Source: https://docs.kylon.io/cli/installation Install the Kylon CLI, sign in, and run your first command. Install the Kylon CLI with the standalone installer for macOS and Linux — no Node.js required, nothing outside `~/.kylon` except a `PATH` line, no `sudo`. **Install Kylon** ```bash theme={null} curl -fsSL https://api.kylon.io/install.sh | sh ``` **Update Kylon** Rerun the same command any time — it updates the installed CLI in place, or run `kylon upgrade`. ```bash theme={null} curl -fsSL https://api.kylon.io/install.sh | sh ``` One command in PowerShell (Node.js 22.15+ required — the script tells you how to get it if missing): ```powershell theme={null} powershell -c "irm https://api.kylon.io/install.ps1 | iex" ``` It records the server, verifies Node.js, and opens your browser to sign in. Prefer the full macOS/Linux installer? Use WSL. The npm spelling also works: ```bash theme={null} npx --yes kylon-cli@latest login ``` The CLI is published to npm as [`kylon-cli`](https://www.npmjs.com/package/kylon-cli). Prefer the installer script on macOS and Linux — it pins the exact build the local agent runtime executes instead of leaving a separate npm-global binary to drift. ```bash theme={null} npm install -g kylon-cli@latest ``` Installing from a non-production environment? Use that environment's API origin (for example `https://api.purework.ai/install.sh` for dev). The script records its origin as the CLI's default server, so `kylon login` needs no flags there either. The installer chains straight into the browser sign-in. On a machine that already has Kylon, run: ```bash theme={null} kylon login ``` In the browser, confirm the code matches the one in your terminal, then approve the device. Your current workspace is preselected; expanding the list lets one approval authorize several workspaces at once, each with its own independent, revocable credential. The browser never receives the credential — the CLI retrieves and stores it directly. ```bash theme={null} kylon status ``` Then explore what your workspace exposes: ```bash theme={null} kylon workspace help ``` ## Remote and headless machines Both install commands work over SSH. Two ways to finish the sign-in when the machine cannot open a browser: * **Approve from your own browser** — run the install command as usual. When no browser can open, the CLI prints the authorization URL and a pairing code; open that URL on any device, check the code matches, and approve. The remote CLI picks the credential up itself. * **Zero browser involvement** — install with `KYLON_INSTALL_NO_LOGIN=1`, then paste the single-use setup-token command from **Settings → Developer tools → Kylon CLI** — the **Advanced** section on the web, or **Sign in a remote machine** in the desktop app — (generated on your own machine, expires in 30 minutes) into the remote shell. It authorizes the device with no browser step at all. ## Good to know * **Verified downloads** — the installer checks the CLI package's integrity hash from the npm registry and, when it provisions Node.js, the official `SHASUMS256` manifest. * **macOS/Linux: works without Node.js** — a machine without Node.js 22.15+ gets a private, checksum-verified runtime under `~/.kylon/runtime` that only Kylon uses. It never changes which `node` your own shell resolves. * **Safe to rerun** — the script converges: it refreshes the environment wiring, repairs an interrupted install, updates the installed CLI through the CLI's own update path (never by overwriting files behind a running agent), and skips the sign-in when the device already has credentials. ### Script options | Environment variable | Effect | | - | - | | `KYLON_INSTALL_NO_LOGIN=1` | Install only; print the next step instead of starting the sign-in. | | `KYLON_INSTALL_NO_MODIFY_PATH=1` | Never edit shell profiles; print the `PATH` line to add manually. | ### Uninstall Remove the credential from **Settings → Developer tools → Kylon CLI → Authorized devices**, then delete the directory and the `PATH` block it added: ```bash theme={null} rm -rf ~/.kylon ``` (The `PATH` line lives between the `# >>> kylon >>>` markers in your shell profile, or in `~/.config/fish/conf.d/kylon.fish`.) # CLI Overview Source: https://docs.kylon.io/cli/overview Connect local agent runtimes and workspace operations to Kylon. The Kylon CLI (`kylon`) has two main jobs: * Run a gateway daemon that bridges local agent providers such as Codex, Claude Code, or custom runtimes to a Kylon workspace. * Provide `kylon workspace ...` commands so agents can inspect and update workspace resources. ## How it works ``` ┌──────────────┐ Gateway connection ┌──────────────┐ │ Local Agent │ ◄──────────────► │ Kylon │ │ (Codex, CC) │ │ Platform │ └──────────────┘ └──────────────┘ ▲ │ │ ▼ Your machine Tools, OAuth, Memory ``` When the gateway is running, your local agent can: * Receive tasks from the Kylon workspace * Execute tools through connected integrations * Use workspace CLI commands for rooms, threads, files, tables, workflows, and web projects * Resume provider sessions for ongoing work ## Quick start Choose a provider in Kylon and paste its connection prompt into that provider on your computer. The prompt runs `agent link`, which connects this computer and starts the service. See [Bring your own agent](/agents/bring-your-own-agent). For an already connected computer, `kylon gateway status` checks its health and `kylon gateway run` runs the saved connection in the foreground. Install the CLI on macOS, Linux, or Windows. Use workspace resources from the command line. Supported agent providers and configuration. Common errors and fixes. # Providers Source: https://docs.kylon.io/cli/providers Choose the provider your Kylon agent runs through. Choose a provider in the **How it runs** field when creating an Agent. Kylon includes that choice in the connection prompt; you do not pass a `--provider` flag to `gateway run`. | Provider | Connection | Offered | | - | - | - | | **Codex** | Paste the prompt into Codex on your computer. | Everywhere | | **Claude Code** | Paste the prompt into Claude Code on your computer. | Everywhere | | **Devin Cloud** | Enter the Devin organization and service-user credentials in Kylon's form. | Everywhere | | **Gemini CLI** | Paste the prompt into Gemini CLI on your computer. | Deployments that enable it | | **Grok Build** | Paste the prompt into Grok Build on your computer. | Deployments that enable it | | **Hermes** | Paste the prompt into Hermes on your computer. | Deployments that enable it | The **Offered** column is about creating a new Agent. An Agent already created on one of the gated providers keeps its provider, its reconnect controls, and its execution support everywhere. Follow [Bring your own agent](/agents/bring-your-own-agent) for the full setup. Computer-based providers use the sign-in and files available on the connected computer. Devin Cloud runs through Cognition's cloud API. ## ACP configurations Gemini CLI, Grok Build, and Hermes have named integrations that use ACP internally. Where they are offered, you select them directly and never configure a custom adapter. The general **Custom (ACP)** creation option is not enabled in the standard production menu. Deployments that explicitly enable it can use [ACP setup](/cli/acp-agents) to configure a launch command. The old `generic` provider and directory-local registration commands are no longer the setup path. # Secrets Source: https://docs.kylon.io/cli/secrets Set up credentials securely and manage existing Agent secret keys. Create or replace credentials through a **Custom API Service** in Kylon's **Connections**, or ask a Kylon Agent to start its secure Connection setup flow. Grant the connection to the Agent that needs it; the Agent then receives the credentials in its environment. Secret creation through CLI commands has been retired. Do not paste secret values into command arguments or chat. ## Existing Agent secrets These commands list key names or remove an existing key: ```bash theme={null} kylon gateway secret list kylon gateway secret delete MY_KEY ``` Use the saved gateway identity, or select an Agent using `--agent ` when needed. Listing keys does not print their values. The workspace command surface also supports listing and deleting existing keys: ```bash theme={null} kylon workspace secret list --agent kylon workspace secret delete MY_KEY --agent ``` See [workspace secret commands](/cli/workspace/secret) for their current options. # CLI Troubleshooting Source: https://docs.kylon.io/cli/troubleshooting Common Kylon CLI errors and fixes. ## `command not found: kylon` Install the CLI from npm, then make sure npm's global bin directory is on `PATH`: ```bash theme={null} npm install -g kylon-cli@latest ``` If `kylon` still isn't found after installing, npm's global bin directory isn't on your `PATH`. Print the prefix with `npm prefix -g` (the binary lives in that directory's `bin`) and add it to `PATH`. ## No workspace auth found Sign in: ```bash theme={null} kylon auth login --server-url https://api.kylon.io --workspace ``` Or set workspace auth environment variables: ```bash theme={null} export KYLON_WORKSPACE_API_URL="https://api.kylon.io" export KYLON_WORKSPACE_ID="" export KYLON_WORKSPACE_API_KEY="pak_your_key_here" ``` ## No workspace bound Pass the workspace explicitly: ```bash theme={null} kylon workspace search "contracts" --scope-workspace ``` Or sign in with `--workspace`. ## No saved computer connection Use the prompt from the Agent's **Profile → Connection setup**, or finish the new Agent's setup dialog. Paste it into the selected provider on this computer. See [Bring your own agent](/agents/bring-your-own-agent). ## Provider needs attention Follow the installation or sign-in instruction for the provider named in Kylon. Complete sign-in on the computer running the Agent, then send it a message again. ## The computer is offline Check the computer's power and network connection, then inspect the service: ```bash theme={null} kylon gateway status kylon gateway service repair ``` Repair also installs missing provider CLIs unless you add `--no-provider-install`. In an environment without a service manager, keep `kylon gateway run` in the foreground after linking the computer. ## Workspace mismatch One saved computer connection belongs to one workspace at a time. Run `kylon disconnect` on the computer, then use a connection prompt from the intended workspace. To revoke access to a previous workspace, remove the device from that workspace's Kylon CLI settings. ## An old guide shows an unknown command Use the current connection prompt. Directory-local registration and gateway registration commands from older releases have been removed. `gateway run` now starts an existing computer connection and accepts no provider or API-key flags. For further diagnosis, run `kylon diagnose` to collect a local bundle. # Workspace commands Source: https://docs.kylon.io/cli/workspace All `kylon workspace` subcommands and their reference pages. `kylon workspace` gives agents and operators a command-line interface for workspace resources. Each subcommand below has a dedicated reference page generated from the CLI's own help. ```text theme={null} kylon workspace — manage workspace resources Runtime and output flags (room-scoped commands require --scope-workspace and --scope-room): --scope-workspace target workspace (defaults to saved gateway session) --scope-room target room (no default — must be passed explicitly) --json emit machine-readable output Subcommands: room, search, icons, member, agent, connection, secret, thread, message, ui, reaction, emoji, table, row, field, view, credit, workflow, followup, file, tab, skill, bundled-skill, app, private-nav, profile, settings, history, timeline, memory, context-audit, billing, referral, feedback, issue. Commands use caller permissions by default (the Agent's for Agent calls). Some support --current-user for the Human requesting this turn, or do so implicitly. Run `kylon workspace help ` to check support. Unsupported --current-user fails; it never falls back to the Agent. Structured data: create new data in Database Apps. Existing legacy Tables remain available until their per-resource cutover; after cutover, use the replacement App. Run `kylon workspace help ` to see the full syntax, flags, and examples for one subcommand. Run `kylon workspace help` (no argument) for this index. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # agent Source: https://docs.kylon.io/cli/workspace/agent `kylon workspace agent` command reference. ```text theme={null} kylon workspace agent — kylon workspace help detail agent — workspace agent directory kylon workspace agent directory [--query ] [--id ] List workspace agents with their display name, avatar URL, access relation, and linked connection metadata (provider/toolkit and account name). This is a directory projection for discovery and auditability; it does not grant agent profile access, bio access, skill access, or connection execution permission. Use --query to match agent names, agent IDs, connection providers, toolkits, and account names. Use --id for one agent. Agent-template preparation is available only in dev/preview Eval Workspace (or isolated local testing). kylon workspace agent template prepare --path Export yourself for the requesting Human to template.json (portable package) and publication.json (private source provenance and sanitization summary). No database draft. Never overwrite the working Agent. The new directory must not exist. Use ordinary filesystem tools to inspect and edit the files. kylon workspace agent template skill --path --skill Include or refresh a complete skill with both Agent read access and Human export rights. kylon workspace agent template validate --path [--visibility private|unlisted|listed] Validate exact package bytes and return a private immutable reviewPath for Human authorization/submission. Remove private names, ids, memory, history, credentials, account bindings and source documents. Replace dependencies with recipient setup requirements. Choose the appropriate persona/customPersona; defaults are only a starting point. Keep skill metadata consistent with SKILL.md. Keep publication.json private; only template.json is portable. Do not claim publication until the Human submits. Resume by reopening your files. Editing requires validation and Human review again. To publish another version, choose the existing slug and a higher semantic version in template.json; a withdrawn slug requires a new slug at 1.0.0. kylon workspace agent create --agents-json '' Create 1-3 workspace agents in one batch, or propose connecting one local Agent. Each spec: {"name", "specialty", "proposal_reason"?, "bio"?, "avatar_url"?, "visibility", "persona"?, "connect"?}. Agent callers must set visibility explicitly or the whole batch is rejected. Human-direct calls may omit it (legacy public default). Public grants current and future workspace members access. Agents: use private for personal, private, or unspecified audiences; public only for clearly shared workspace use. Invent a fresh, distinctive short nickname for the workspace teammate, inspired by its role and matching the user's language setting (otherwise the conversation language), e.g. "小墨" in Chinese or "Pip" in English. Use a supplied name when the user explicitly asks to call this teammate by that name. Give each agent a concise specialty role label (2-4 words, ideally under 25 chars; 60 max), e.g. "Product Ops" or "SEO". Avoid lists of skills or tasks. Optional proposal_reason: one short sentence (240 chars max) naming the selected task and what this agent will own or review. It appears below the name and specialty on the approval card; keep task details here and expertise/perspective in bio. A Human caller creates the whole batch directly under their own permissions. An Agent caller posts ONE approval card showing every proposed agent (avatar, name, specialty, proposal reason). Only the member whose message triggered the Agent turn can act on it; they approve once, become the creator and admin of each new agent, and the server then creates the whole batch. To connect the user's existing local Agent, add "connect":{"provider":"codex"} to exactly ONE spec. Also supports claude-code, gemini-cli, hermes, grok-build. The local application named in the request determines connect.provider; invent its teammate nickname using the naming guidance above. For example, connecting a local coding assistant can use name "Pip" and specialty "Software development"; choose similarly personal names in the user's language. Set specialty to the work this Agent does (e.g. "Software development"), never its owner, local computer, or application name. Use a known role from context; for these coding applications with no narrower role, use software development. Do not ask the user to fill in a specialty. Connection specs contain name, specialty, visibility, connect, and optionally proposal_reason and avatar_url. Bio and persona belong to newly created workspace Agents; omit both when connecting an existing Agent. Connect one Agent at a time. Ask which local application they use if unclear. Say "connect your local Agent to Kylon"; do not describe implementation runtime categories to the user. The card opens private connection instructions for the user to give to their local Agent. Never run those instructions yourself or promise to import local conversation history. This branch is Agent-initiated only; Human CLI callers use the existing workspace setup. Opening instructions prepares the connection while approval stays pending. Binding completes approval. Opening or closing instructions does not resume your turn; wait for the binding completion callback. Binding and online status differ. Agent callers: after sending the card, stop and wait. The outcome, including the new agent ids, reaches you in a later turn. Do not retry the command while the card is pending, and never retry a rejected card. Foreground room/thread turns only. For ordinary creation, use this proposal flow for a single Agent or a team. Derive name, specialty, bio, and proposal_reason from the conversation; use the default avatar pool and model. For connection proposals, use the connection-specific fields above and the default avatar pool. Ask in conversation only when essential task details are missing. Approval creates agents directly without a DM, introduction, or handoff. Continue in the original conversation using the returned ids to assign Rooms, Threads, or tasks. kylon workspace agent wait --id [--condition ready] [--timeout-ms ] Wait for a user-submitted private-agent creation to finish bootstrapping, without polling. Returns a terminal status: ready, failed, timeout, not_found, or aborted, plus the DM link when ready. Use when an activation context says an agent creation is still completing. Not needed after ordinary agent create approvals — those agents are ready when the approval outcome arrives. Foreground room/thread turns only. kylon workspace agent get Show one agent's profile: name, specialty, visibility, runtime and provider, Agent Intelligence tier, owner, and creation time. kylon workspace agent model get Show the agent's Agent Intelligence tier and whether it can be changed. kylon workspace agent model list List the Agent Intelligence tiers this workspace can choose from and the live default. kylon workspace agent access list List who can run the agent and whether every workspace member can. kylon workspace agent status [--refresh] Show a connected Agent's connection, local application health, credentials, and provider quota windows. --refresh asks the connected machine to re-check first. kylon workspace agent usage [--refresh] Show a connected Agent's provider usage windows and meters as last reported. --refresh asks the connected machine for a fresh snapshot; re-run to read it. kylon workspace agent update [--name ] [--specialty |--clear-specialty] Rename an agent or change its specialty label. kylon workspace agent delete Delete an agent you administer. kylon workspace agent model set --tier default|high|medium|low Change the agent's Agent Intelligence tier (default follows the workspace default). kylon workspace agent avatar set --file Upload a local image (png, jpg, gif, webp, svg; 2 MB max) as the agent's avatar. kylon workspace agent access grant --user [--role member|admin] kylon workspace agent access grant --workspace Let one person, or every workspace member, run the agent. kylon workspace agent access revoke --user kylon workspace agent access revoke --workspace Take that access away again. kylon workspace agent transfer-owner Make another member the agent's owner. kylon workspace agent leave Remove yourself from the agent's member list. These commands act as you, under your own access to the agent. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # app Source: https://docs.kylon.io/cli/workspace/app Build and operate Database and Custom Apps. ```text theme={null} kylon workspace app — kylon workspace help detail app — canonical data applications Resolve target: prefer an explicit App id, link, or name; then current app/app_record thread context, App shell, or Room tab. Otherwise run app list; ask only when multiple Apps remain plausible. For records: app docs plus documented app api operations. Data Viewer UI cannot operate records; app data-view is only for platform view config. Confirm destructive/bulk/external/hard-to-reverse operations before executing. Verify writes through the documented API. For simple creates/deletes, use a documented batch endpoint; report count unless IDs were requested. Before lifecycle work, read current build-app and deploy-app skills end to end. Mutations fail closed until both reads are complete/current. kylon workspace app list List visible Apps with id, Room, created_by, URL, visibility, DB, and contract status. kylon workspace app show Show status, owning Room, discussion root, URL, visibility, DB, and contract. kylon workspace app move --to-room [--detach-discussions] Move a database App and its declared Automations to another writable Room. Custom Apps and legacy Table replacements are refused. If source-Room discussions are linked to the App, its records, or owned Automations, retry with --detach-discussions only after confirming those links may be removed; the messages and replies stay in the source Room. Declare Automations for either App kind in the registration document's "automations" array; app register applies it. Never edit generated/app-registration.json: builds replace it. A git build's uploaded "automations" contract wins, so publish/rollback follow its commit. [{"key":"daily","name":"Daily","trigger":{"kind":"cron","expr":"0 2 * * *","timezone":"UTC"},"target":{"kind":"prompt","message":"Close invoices"},"delivery":{"publish":true}}] key is stable: lowercase letters, digits, hyphens. Renaming name preserves it; changing key retires it and creates another. trigger: {"kind":"cron","expr":"..."} or {"kind":"record_change","entity":"","events":["insert","update","delete"],"when":{"where":{"status":"blocked"}}}. Cron meets the workflow-create minimum and needs a future run. Entities must be in this manifest; when narrows which changes fire. target: {"kind":"prompt","message":"..."} or {"kind":"code","source":"..."}; code requires @kylon/workflow-sdk. delivery: {"publish":true} posts results; omit for internal-only. New declarations are PAUSED; workflow resume enables them. Omit "automations" to preserve declarations; [] retires all. Declaration errors do not fail register/publish; output names them and --check reports drift. kylon workspace app automations [--check true] Compare declarations with live Automations. Live Room rows bill individually; pause/resume/manual trigger need no deploy. workflow update/rollback/delete cannot change declaration-owned definitions. States: in sync; stale (live definition older; apply again); missing (declared not live; reason named); orphaned (live undeclared; apply to archive). --check true reports drift only. Draft rows are inspectable, never auto-fire, and retire on publish/discard. Manual triggers use PRODUCTION records, not preview DB; treat them as real runs. kylon workspace app manifest Print manifest fields and OpenAPI URL; no human mode or --json. kylon workspace app docs [--entity ] [--method ] [--path ] [--raw-openapi] [--output ] Print App API contract/skeletons; --raw-openapi returns full OpenAPI JSON. kylon workspace app api get [--query key=value] kylon workspace app api post [--body | --body-file ] kylon workspace app api put [--body | --body-file ] kylon workspace app api patch [--body | --body-file ] kylon workspace app api delete [--body | --body-file ] Call documented METHOD + PATH. Use --body-file for larger JSON payloads and import/bulk endpoints. Successful POST/PUT/PATCH/DELETE calls automatically refresh views. Create endpoints auto-attach unless api.create sets autoLinkDiscussion:false. Kylon attaches the created App record to the top-level trigger thread when the response has record_id; repair: thread attach --target app_record:// --root current|. kylon workspace app register (--json | --file ) [--check] Replace full registration, not a patch. Omitted docs/custom-App model clear; omitted automations preserve. Validates shape, tables, columns and zero-row reads before saving; 4s DB budget. Failure saves nothing; --check never saves. JSON fields take JSON values. kylon workspace app registration status Show stored setup, not live database health. kylon workspace app registration template [--output ] Export stored registration/mappings (manage access); unregistered Apps get a scaffold. Fill placeholders first. kylon workspace app refresh Publish a soft refresh for open App views; normally unnecessary after app api writes. kylon workspace app data-view list --entity List default/saved views and manifest fields. kylon workspace app data-view show --entity [--view |--default true] Inspect config before updating. kylon workspace app data-view update-default --entity (--config | --config-file ) Replace shared default config. kylon workspace app data-view create --entity --name [--view-type table|board|calendar] [--config | --config-file ] Create a view. kylon workspace app data-view update --entity [--name ] [--view-type table|board|calendar] [--config | --config-file ] Update a saved view. Filters, sorts, group_by, fields, and layout are platform view config; use app data-view, not App OpenAPI. Config JSON uses snake_case keys: {"filters":[{"field_id":"priority","operator":"eq","value":"P0"}],"sorts":[{"field_id":"amount","direction":"desc"}],"group_by":{"field_id":"region"},"visible_field_ids":[],"field_order":[],"field_widths":{}}. Use exact manifest field IDs; do not use fieldId/sortBy camelCase keys. visible_field_ids and field_order reject duplicates. field_order is partial: listed fields pin first; unlisted fields keep default order. kylon workspace app data-view delete --entity Delete a view. kylon workspace app template pull --path [--ref ] [--force true] Copy an approved private template into the local writable App source directory printed by app checkout. Use data-app or general-website normally; line-inbox for a LINE Inbox backed by a Kylon LINE connection. A draft checkout's .git alone is not existing content and is always preserved; --force true replaces other content. kylon workspace app template pull line-inbox --path Start a LINE Inbox custom App using its server-side /api/line-events route and Kylon LINE connection API; do not create App-owned raw LINE message/event tables. kylon workspace app template pull data-app --database-app --path Start from a database App's registered entities/mapping. kylon workspace app template release > [--template ] List versions or show notes/upgrade steps; --template selects a track. kylon workspace app template upgrade-plan --template --from [--to ] Print per-version steps to the target (default latest); app show gives the current template id/version. kylon workspace app template prepare --source --path Make a filtered, separately editable staging copy and run an advisory safety preflight. The original App checkout is never modified; submit re-runs the authoritative review on the staged bytes. kylon workspace app template submit --slug --title "" --path [--description ...] [--category ] [--version 1.0.0] Share sanitized App source as a preview template from a live user request. A new id lands active/listed at 1.0.0; later versions are exact-addressable and do not change the owner-controlled default. Needs template.yaml; credentials, real contacts and deploy URLs reject it. kylon workspace app template bundle | audit > [--shared true] Inspect staged/shared bundles; owner audit preserves consent, review and hash provenance. kylon workspace app template bundle share @ Direct Human request only. The URL allows unsigned cross-environment downloads; revocation cannot recall them. Never share private data. kylon workspace app template bundle links List link metadata without revealing bearer tokens. kylon workspace app template bundle revoke Revoke future downloads; direct Human request only. kylon workspace app template pull --bundle [@version] --path [--force true] Copy a shared bundle; --force replaces existing source. Omit @version for its default. kylon workspace app template pull --share-url --path [--force true] Import only from a canonical P2 API URL; verifies size, format, hash and safety before writing. Unlisting hides discovery but preserves direct pulls. Withdrawal invalidates all references and cleans up snapshots. kylon workspace app create --name [--icon ] [--provider-project-name ] [--runtime-kind ] [--draft-slug --draft-title ""] [--pin] Omitting --runtime-kind creates a database App: no source repository, draft, or deployment; provision/register/use Data Viewer. Use --runtime-kind custom_app for custom UI, App-owned workflow APIs, or server logic. Draft flags create a Git-backed custom App and also register it, materialize the first draft checkout, and start its preview DB fork. The title is a human change name (for example "My issues count"); never include Draft, draft/, or branch/status prefixes; the product adds the "Draft:" label. Pass --pin only when the user asked for a personal sidebar shortcut. kylon workspace app checkout <app_id> [--draft-slug <slug> --draft-title "<title>"] [--branch <branch>] Materialize a draft worktree. New flags create draft/<slug>, follow the title rule above, and start its preview DB fork. git push on the draft branch creates a preview after pending db/migrations/*.sql; ship schema/seeds there, not manual SQL. Reuse an existing draft with --branch <branch> from app draft list. No flags opens the publish-only default branch for inspection. Never use plain git; the server rejects unregistered branches. kylon workspace app draft list <app_id> List active drafts with preview status and links. Reuse the active draft for the current piece of work when one exists. kylon workspace app draft update <app_id> --draft <draft_id> --preview-path <route> Set the draft link/screenshot route (for example /integrations); "" resets root. A READY preview is recaptured. kylon workspace app draft discard <app_id> --draft <draft_id> Archive an active unpublished draft and remove its preview DB fork. Publish also archives it; app checkout --branch can re-open the source branch. kylon workspace app preview list <app_id> kylon workspace app preview get <app_id> <deployment_id> kylon workspace app preview logs <app_id> <deployment_id> [--limit <n>] kylon workspace app preview docs <app_id> --draft <draft_id> [--entity <entity_id>] [--method <GET|POST|PUT|PATCH|DELETE>] [--path <api_path>] [--raw-openapi] [--output <path>] Print the API contract from the latest READY preview snapshot. kylon workspace app preview api get <app_id> --draft <draft_id> <api_path> [--query key=value] kylon workspace app preview api post <app_id> --draft <draft_id> <api_path> [--body <json> | --body-file <path>] kylon workspace app preview api put <app_id> --draft <draft_id> <api_path> [--body <json> | --body-file <path>] kylon workspace app preview api patch <app_id> --draft <draft_id> <api_path> [--body <json> | --body-file <path>] kylon workspace app preview api delete <app_id> --draft <draft_id> <api_path> [--body <json> | --body-file <path>] Call a documented draft-preview API, never production; read app preview docs first. kylon workspace app preview db query <app_id> --draft <draft_id> (--sql <sql> | --sql-file <path>) Ready previews include a draft link. Preview db query executes SQL against the draft's preview database, never production; --sql-file accepts multiple statements. The fork starts from production at checkout; retry in about a minute if preparing. Put schema/initial data in db/migrations; use this for reads, test cleanup, or migration repair. kylon workspace app publish <app_id> <preview_deployment_id> [--visibility <private|workspace|public>] Publish a reviewed READY preview's exact commit and archive its draft, never a branch name. Run only from a later user message confirming that preview and its access scope. Preflight the default branch before approval. If stale, it creates no approval: sync, push, share the replacement, then stop and wait for a new request. Pending production migrations run once; seeds never replay. kylon workspace app approval revoke <app_id> [--agent <agent_id>] Revoke standing App publish approval. A Human caller executes directly under their own RBAC; an Agent sends the triggering Human a bound action that revokes this Agent's approval. --agent disambiguates Human calls when more than one Agent has approval for the App and is invalid for Agent calls. kylon workspace app update <app_id> [--name <name>] [--icon <icon-name>] kylon workspace app visibility set <app_id> <private|workspace|public> kylon workspace app browser-auth <app_id> [--draft <draft_id>] [--path <app-path>] One-time same-origin URL for a private App. Default: release; --draft: READY preview and required if unpublished. Open immediately with agent-browser; do not make the App public just to smoke-test it. kylon workspace app delete <app_id> Delete hosting and hide the App. Its database and data remain until workspace deletion. kylon workspace app db provision <app_id> Provision the per-App PostgreSQL DB and DATABASE_URL. kylon workspace app db check <app_id> Check the production database and print its connection URI for migration. Treat the URI as sensitive. kylon workspace app db reset <app_id> --draft <draft_id> Reset an unpublished preview DB to latest production state. Push applies migrations to preview; publish to production; a per-DB journal runs each once. Applied migration files are immutable by checksum: add a numbered file, or reset the draft to rewrite them against a clean preview. kylon workspace app db query <app_id> (--sql <sql> | --sql-file <path>) Raw SQL for diagnostics/maintenance and database App schema. custom_app schema/seeds belong in db/migrations, never ad-hoc DDL. Do NOT import records by looping one app db query call per row. --sql-file may contain multiple semicolon-terminated statements; it runs them in order. For bulk, prefer app api --body-file; otherwise use one --sql-file with multi-row INSERT statements or a short ordered schema/seed script. kylon workspace app domain add <app_id> <domain> Bind a bare hostname; the default remains. Return DNS steps or Entri link. On conflict, the error names that App and its room so app domain remove can move it. kylon workspace app domain check <app_id> Recheck DNS: pending_dns or ready. app show/list do not recheck. kylon workspace app domain remove <app_id> Return to default. The custom domain immediately stops serving this App, so confirm with the user first; requires Room write access. kylon workspace app env set <app_id> <KEY=VALUE>... Set env vars. DATABASE_URL is set automatically by app db provision; redeploy to apply. kylon workspace app connections list <app_id> List grants; server routes use only these, and new Apps have none. kylon workspace app connections grant <app_id> <connection_id> Grant a source-agent connection; the agent must already be able to run it. kylon workspace app connections revoke <app_id> <connection_id> Stop server access; revocation is idempotent. kylon workspace app deployment list <app_id> kylon workspace app deployment get <app_id> <deployment_id> kylon workspace app deployment wait <app_id> <deployment_id> [--timeout-seconds 600] [--interval-seconds 5] kylon workspace app deployment logs <app_id> <deployment_id> [--limit <n>] kylon workspace app deployment rollback <app_id> <deployment_id> Before mutating a new App's files, schema, deployment, or generated contracts, propose its objects/relations, user and agent/API flows, default data/status behavior, custom UI/logic need, access, and whether to release now; get user confirmation. Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. Otherwise substitute known IDs into the relevant format below; do not guess a path. - App: `[name](/workspaces/{workspaceId}/rooms/{roomId}/apps/{appId})`; URL-encode the `appId` path segment. - App page: `[page name](/workspaces/{workspaceId}/rooms/{roomId}/apps/{appId}/p/{appPath})`; URL-encode each App-path segment, plus the whole query in `?app_query=` and fragment in `?app_hash=`. Share this instead of a raw `*.kylon.app` URL: raw URLs leave Kylon, skip App authorization, and send private-App recipients to sign-in. - App draft: `[draft title](/workspaces/{workspaceId}/rooms/{roomId}/apps/{appId}/drafts/{draftId})`; use this to share a preview. - App record discussion: `[title](/workspaces/{workspaceId}/rooms/{roomId}/threads/pending/app_record/{encodedAppId%2FentityId%2FrecordId})`; URL-encode the entire `appId/entityId/recordId` compound target. Prefer its title/name or a specific entity-name label such as `this issue` or `this client`. Never use `recordId` as the label; omit parenthetical raw IDs unless the user explicitly asks. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # billing Source: https://docs.kylon.io/cli/workspace/billing View billing summary, activity, and usage exports. ```text theme={null} kylon workspace billing — kylon workspace help detail billing — workspace billing and user-facing usage kylon workspace billing summary Show billing status, plan, subscription period and scheduled changes, payment method, trial or free-month state, credit balance by source, and credit health. kylon workspace billing plans List the plan catalog: prices, monthly credits, trial terms, entitlements, and credit packs. The workspace's current plan is marked. kylon workspace billing invoices List recent payment-provider invoices with status, amounts, and view/PDF links. Workspace Admin only. kylon workspace billing activity [--limit <n>] List recent billing activity with credits and money plus invoice links. Default 20, max 100. kylon workspace billing usage [--from <date>] [--to <date>] [--granularity hour|day|week|month] [--sections <list|all>] [--include-tools] [--format text|json|csv] Show the same user-facing usage available in Billing & usage. Default sections: summary, source, rooms, agents, people, automation. Resource-labeled sections may be omitted when the caller lacks workspace management access. --sections can include summary, source, rooms, agents, people, automation, tools. The tools section is sanitized and never exposes model or provider details. kylon workspace billing usage detail [--from <date>] [--to <date>] [--person <user_id>] [--room <room_id>] [--agent <agent_def_id>] [--automation <workflow_id>] [--breakdown people|rooms|agents|automation] [--limit <n>] [--offset <n>] [--format text|json] Drill into the same scoped Billing & usage details as the settings UI. Workspace Admin only; agent conversations use live or delegated human authority. Use returned row keys for follow-up queries. Defaults to the last 30 days, a natural breakdown for the current scope, limit 10, and offset 0. kylon workspace billing usage export [--from <date>] [--to <date>] [--granularity hour|day|week|month] [--sections <list|all>] [--include-tools] [--format json|csv] [--path </workspace/shared/...>] Emit a JSON or normalized CSV report for analysis. --path writes the export to a workspace file; otherwise the export is printed. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # bundled-skill Source: https://docs.kylon.io/cli/workspace/bundled-skill `kylon workspace bundled-skill` command reference. ```text theme={null} kylon workspace bundled-skill — kylon workspace help detail bundled-skill — read and manage skills provided by Kylon kylon workspace bundled-skill get <skill_key> [--file <relative-path>] kylon workspace bundled-skill list --agent <agent_id> [--status allowed|disabled] kylon workspace bundled-skill enable <skill_key> [<skill_key> ...] --agent <agent_id> kylon workspace bundled-skill disable <skill_key> [<skill_key> ...] --agent <agent_id> Print a bundled skill's complete SKILL.md. In a bounded invocation, when it routes to a reference or text script, pass that exact relative path with --file. Read these files before using a provider's endpoints rather than guessing them. The printed version is the skill's own; re-read when it differs from a version you read earlier in this conversation. Enable and disable update one agent's assignment status without deleting the bundled skill. Pass every target key explicitly; duplicate keys are ignored. The new assignment set takes effect on that agent's next activation. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # connection Source: https://docs.kylon.io/cli/workspace/connection Manage connection webhooks and contacts; read events and drafts. ```text theme={null} kylon workspace connection — kylon workspace help detail connection — inbound webhooks, contacts, activity, and drafts for connected services A Connection attaches an external data source to the workspace: an account you call out to, or a webhook that pushes events in. Contacts identify addressable recipients. Events are locally persisted Email and IM activity and may be incomplete. Drafts are canonical, editable outbound messages shown as Draft Cards. kylon workspace connection list List connections usable by this activation, including verified delegated access, with stable Connection IDs for later commands. kylon workspace connection search --query <keywords> [--limit <n>] [--cursor <cursor>] Search supported outbound and inbound providers. Results identify backend, toolkit, setup kind, and runtime credential constraints. kylon workspace connection owner discover --toolkit <toolkit> [--limit <n>] Find workspace users who own a matching connection and whether they are in the current room. Returns routing metadata only, never connection IDs or account details. kylon workspace connection run --connection <connection_id> [--activity-label <display_label>] -- <command> [args...] Run exactly one local child command with environment variables from one persistently granted native Connection. Use --activity-label only for a concise, non-sensitive Connection display name shown in execution activity; account identifiers, URLs, resource IDs, credentials, shell expressions, and opaque tokens are rejected. It does not rename the Connection. The live external assignment and gateway are revalidated before each command, and resolved values are redacted from child output. Never print, echo, inspect, or interpolate them. kylon workspace connection tool search --toolkit <toolkit> --query <keywords> [--connection <connection_id>] [--limit <n>] [--cursor <cursor>] Search exact tool slugs and JSON input schemas. MCP toolkits require --connection because each server exposes its own tools. kylon workspace connection tool execute --tool <slug> [--connection <connection_id>] [--json <arguments_json>] Execute connected-tool calls in interactive chat, including multiple calls that run in parallel. Run tool search first. Execution uses the assignment's delegated authority and is metered by the connection proxy. Draft and Email results are presented as cards. Raw JSON must be an object shaped like the returned schema. kylon workspace connection create --toolkit <toolkit> [--intent <kind>] [--task-summary <text>] [--cadence <text>] Send the current user an authorization card for an exact auth-link toolkit. Run connection search first. Classify the task as one_off_access, realtime_delivery, scheduled_digest, context_discovery, or unknown; scheduled_digest requires cadence. Omitted intent stays fail-closed. The live assignment determines the connection owner and card audience; do not repeat the fallback URL after the card is sent. kylon workspace connection secret add --name <name> --key <ENV_VAR[,ENV_VAR...]> --provider-url <url> [--usage <text>] Send the current user one prefilled secure card for adding an API service. List every environment variable the SDK or CLI reads in --key (comma-separated) so the user pastes all values into one form; never send one card per key. Resolve the service name, the variables, and the official provider URL from the user's request or verified official documentation found through web search; ask only if they cannot be confirmed reliably. When the user saves, the service is granted to this agent. Never ask for or accept a value in chat or another command. kylon workspace connection secret update --connection <connection_id> Send the owner a secure card for rotating an API Key Connection already granted to this agent. Use its exact connection id. Missing or unauthorized targets fail and never fall back to create. Never ask for or accept the value in chat or another command. kylon workspace connection mcp add --url <server_url> Send the current user a card for configuring a Remote MCP server with the exact Streamable HTTP endpoint prefilled. If the user did not provide it, resolve it from verified official provider documentation found through web search. Ask the user only if it cannot be confirmed reliably; never invent one or substitute a homepage or documentation URL. The user reviews it and supplies authentication. It is available only inside a live human-triggered assignment and sends the card to the current room. kylon workspace connection webhook create --name <name> [--room <room_id>] Create an inbound webhook and return its URL once. Any system that can POST JSON can send events to it; each event opens its own thread in the bound room and activates that room's main agent. Defaults to the current room. Use this — not a webhook-triggered workflow — when inbound events should be handled as conversations. Payload: required "title", optional "_content" body, optional "_event_id" for idempotency; all other fields are preserved for the agent. The URL carries the token and is never shown again: give it once to the person who asked, then do not repeat it in a later message, a file, or another command. kylon workspace connection webhook list List this agent's webhooks with their bound room, status, and last event time. kylon workspace connection webhook rotate --id <endpoint_id> Issue a new URL and invalidate the old one. Use after a leak or a lost URL; the room binding and existing threads are unaffected. The new URL needs the same handling as the original. kylon workspace connection webhook revoke --id <endpoint_id> Stop accepting events. Threads the webhook already opened are unchanged. kylon workspace connection understand <connection_id> With the owner's consent, analyze an Email Connection to learn their writing style. Run only when the owner asks. The result becomes available on a later turn. kylon workspace connection meeting-prep prepare --json <setup_json> Dev Eval setup preview only. In a private owner-and-Agent conversation, suggest categories from authorized calendar context and send the setup card. JSON: {connectionId, preferences?: {categories: ["customers", "partners"], conditions: "", readyBeforeMinutes: 60}}. Other categories: recruiting, internal. kylon workspace connection meeting-prep apply <connection_id> Apply only in the live turn from the owner's card click. Save preferences, a private Room and a paused Automation. Automatic preparation is not available yet. kylon workspace connection meeting-prep status <connection_id> Read saved preferences and setup availability on behalf of the connection owner. kylon workspace connection meeting-prep pause <connection_id> Pause after a live owner request. Keep the Room and invalidate outstanding setup cards. kylon workspace connection delivery status <connection_id> Show whether inbound delivery is unconfigured, explicitly disabled, active through an Automation, or fail-closed because its stored Automation or derived Room is unavailable. kylon workspace connection delivery prepare --json <setup_json> After conversationally confirming all-email or filtered real-time delivery, provide connectionId, policy, and an optional privateRoomName. The server discovers and ranks suitable Rooms and sends the canonical destination card with create-private and Not-now choices. kylon workspace connection delivery apply <connection_id> Run in the live turn created by the destination click. The server authenticates the immutable receipt, revalidates the Room and privacy boundary, creates exact canonical Automation source/hash, then binds only after creation succeeds. kylon workspace connection delivery disable <connection_id> After the user asks in this live turn, disable automatic inbound delivery. Existing reply-to-thread routing is unchanged. kylon workspace connection contact list --connection <connection_id> [--query <name-email-or-phone>] [--kind email_address|direct|group|room] [--status active|unavailable] [--limit <n>] Search addressable recipients for one Connection. Returned Contact IDs are internal identifiers for subsequent commands. kylon workspace connection contact get --id <contact_id> Read one Contact selected by list. LINE destination IDs remain internal. kylon workspace connection contact create --connection <connection_id> --address <email-or-whatsapp-number> [--name <display_name>] [--kind email_address|direct] Create or reuse an Email or WhatsApp recipient. LINE Contacts are discovered from inbound conversations. kylon workspace connection event list --connection <connection_id> [--query <text>] [--conversation <id>] [--direction inbound|outbound|unknown] [--since <date>] [--until <date>] [--latest-inbound] [--limit <n>] [--cursor <cursor>] Search locally persisted Events. Results include sender, conversation, subject, content preview, and attachment count. Inspect the returned collection start, status, and coverage warning. --latest-inbound returns conversations whose latest locally collected message is inbound and defaults to 20 results. kylon workspace connection event get --id <event_id> Read one Event selected by list, including its collection coverage warning. kylon workspace connection draft list [--query <text>] [--recipient <email-or-name>] [--subject <text>] [--type email|im|social] [--connection <connection_id>] [--status <status[,status...]>] [--since <date>] [--until <date>] [--limit <n>] Find visible Drafts and return their IDs. Statuses: draft, scheduled, sending, sent, failed, delivery_unknown, discarded. kylon workspace connection draft get --id <draft_id> Return the canonical Content and version required by revise. kylon workspace connection draft revise --id <draft_id> --expected-version <n> --json <content_json> [--quote-event-id <event_id>] [--clear-quote true] Replace the full Content returned by get when the version matches. Raw JSON needs no shell quotes. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # context-audit Source: https://docs.kylon.io/cli/workspace/context-audit `kylon workspace context-audit` command reference. ```text theme={null} kylon workspace context-audit — kylon workspace help detail context-audit — durable-context placement decisions kylon workspace context-audit decline <finding_id> --reason <text> Persist a validated decline for one current context-audit finding. Use the stable f_... ID shown in the advisory or findings report, never an advisory list number. The finding must exist and --reason is required; future audits treat the saved reason as a standing constraint. Deterministic credential values and configured secret-key name references must be fixed and cannot be declined. kylon workspace context-audit repair <finding_id> --verified true Resolve a credential-value record whose keyed locator is missing or belongs to a rotated fingerprint key, or whose source cannot be verified within the audit's bounded scan, after inspecting the source and verifying the credential remediation. A record whose fingerprint still matches the source is rejected. Also accepts a deterministic configured secret-name record: a keyed record is re-verified against the current source and rejected while its exact key name is still present; a record whose key token could not be recovered during migration is accepted after manual inspection. The fixed verification note cannot contain source material. This is not a decline: a later audit raises a new finding if credential material remains. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # credit Source: https://docs.kylon.io/cli/workspace/credit Inspect credit usage and manage credit policies. ```text theme={null} kylon workspace credit — kylon workspace help detail credit — workspace credit usage and limits kylon workspace credit usage [summary] [--since <duration|iso_timestamp>] [--until <iso_timestamp>] [--by usage|metering|workflow|activation|room|session] [--metering all|agent|script|compute] [--limit <n>] Inspect workspace display-credit consumption. Defaults to the last 24 hours grouped by metering class. kylon workspace credit script Show daily and monthly workspace credit limits for API calls made by code. kylon workspace credit script --daily <display_credits> Set the daily code-run API credit limit after the user explicitly approves continuing. kylon workspace credit script --monthly <display_credits> Set the current billing-period code-run API credit limit after the user explicitly approves continuing. kylon workspace credit script --default Reset code-run API credit limits to defaults. kylon workspace credit budget show --scope workflow --id <workflow_id> Show the workflow credit budget policy. kylon workspace credit budget set --scope workflow --id <workflow_id> [--daily <credits|default>] [--weekly <credits|default>] [--monthly <credits|default>] [--action warn|pause] [--status active|disabled] Update the workflow budget policy. Workflow budgets keep their existing warn/pause behavior. All limits are display credits. Code-run API calls receive a 429 with credit details when a limit is reached. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # custom-skill Source: https://docs.kylon.io/cli/workspace/custom-skill Create, inspect, publish, and share custom skills. ```text theme={null} kylon workspace custom-skill — kylon workspace help detail custom-skill — legacy alias Use kylon workspace skill for workspace-scoped custom skill work. The custom-skill command remains executable for compatibility. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # emoji Source: https://docs.kylon.io/cli/workspace/emoji `kylon workspace emoji` command reference. ```text theme={null} kylon workspace emoji — kylon workspace help detail emoji — workspace custom emoji catalog kylon workspace emoji list kylon workspace emoji create --name <shortcode> --file <local_path> kylon workspace emoji delete --name <shortcode> kylon workspace emoji delete --id <emoji_id> Workspace members can add or remove custom emoji. Names render inline as :shortcode: and can be used in reactions with reaction add --emoji <shortcode>. Images must be PNG, JPG, GIF, or WebP, up to 1 MB and 512 by 512 pixels. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # feedback Source: https://docs.kylon.io/cli/workspace/feedback Send product feedback from the workspace. Available to signed-in people using `kylon auth login`; Agent assignments do not dispatch this command. ```text theme={null} kylon workspace feedback — kylon workspace help detail feedback — send product feedback to the Kylon team kylon workspace feedback submit --subject <text> --description <text> [--category <text>] [--room <room_id>] Send feedback about the product from this workspace, as the app's feedback dialog does. --room names the Room the feedback is about. Available to signed-in people only; Agent assignments report problems with issue submit. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # field Source: https://docs.kylon.io/cli/workspace/field List, create, update, and reorder table fields. ```text theme={null} kylon workspace field — kylon workspace help detail field — custom field definitions on a non-upgraded legacy Table Runtime scope: add --scope-room <room_id> when this table is in another room you can access. Every row has built-in system fields: createdAt, updatedAt, createdBy. These are managed automatically and can be displayed as table columns via view config. Do NOT create custom fields that duplicate system fields (e.g. do not create a "created_at" or "creation_date" custom field). kylon workspace field list --table <table_id_or_title> kylon workspace field create --table <table_id_or_title> --key <key> --label <label> --type <field_type> [--config <json>] [--required] --type: text, number, date, select, multi_select, checkbox, user, multi_user, url, email, attachment user/multi_user: for fields referencing workspace members (assignee, reviewer, etc.). Stored as user IDs, rendered with avatar + name. Use instead of text for people. attachment: for files, images, screenshots, and documents shared in the room. Stored as array of file IDs. Use "file list" to discover IDs. Images render as thumbnails in the table cell. --config for select/multi_select: --config '{"options":[{"id":"opt_1","label":"Open","color":"blue"},{"id":"opt_2","label":"Closed","color":"rose"}]}' Available option colors: blue, purple, green, amber, rose, cyan, indigo, orange, teal, pink, emerald --config for date: --config '{"includeTime":false,"dateFormat":"YYYY-MM-DD"}' includeTime (optional, default false): whether to display the time component. When false (the default), only the date part is shown. dateFormat (optional, default "MM/DD/YYYY" when includeTime is false, "MM/DD/YYYY, h:mm A" when true): display format preset. Available dateFormat presets: "MM/DD/YYYY", "DD/MM/YYYY", "YYYY-MM-DD", "MMM D, YYYY", "MM/DD/YYYY, h:mm A", "YYYY-MM-DD HH:mm" kylon workspace field update --table <table_id_or_title> --field <field_id> [--label <label>] [--type <field_type>] [--config <json>] [--required <bool>] kylon workspace field delete --table <table_id_or_title> --field <field_id> kylon workspace field reorder --table <table_id_or_title> --ids <comma_separated_field_ids> kylon workspace field add-option --table <table_id_or_title> --field <field_id> --label <label> [--id <option_id>] [--color <color>] kylon workspace field remove-option --table <table_id_or_title> --field <field_id> --option <option_id> add-option/remove-option grow or shrink a select/multi_select field's options without resending the full --config blob. add-option auto-generates an option id like "opt_<hex>" unless --id is passed, and rejects a label that already exists on the field (naming the existing matching option id so you can reuse it). remove-option refuses to remove an option that is still referenced by any row and names up to 10 offending row ids so you can fix those rows first. "field list" prints the current option set for every select/multi_select field — check it before you create a new option or before you pass an option id in a row update. --- Filter/Sort JSON reference (used by row list, view create, view update) --- --filters '[{"fieldId":"<field_key>","operator":"<op>","value":"<val>"}]' --sorts '[{"fieldId":"<field_key>","direction":"asc|desc"}]' Operators: eq, neq, contains, gt, gte, lt, lte, isEmpty, isNotEmpty Use field key (e.g. "status", "created_date") as fieldId. Dynamic values — prefer these over hardcoded literals when the intent is relative (e.g. "my tasks", "overdue", "recent"). They resolve at query time, so saved views stay correct as time passes and across different users. "$current_member" → viewing user's ID (use with user/multi_user fields) "$start_of_today" → 00:00 UTC today "$start_of_tomorrow" → 00:00 UTC tomorrow "$start_of_yesterday" → 00:00 UTC yesterday "$start_of_7_days_ago" → 00:00 UTC 7 days ago "$start_of_30_days_ago"→ 00:00 UTC 30 days ago Common patterns: Due today: gte $start_of_today + lt $start_of_tomorrow Overdue: lt $start_of_today Last 7 days: gte $start_of_7_days_ago Last 30 days: gte $start_of_30_days_ago Assigned to me: eq $current_member (user field) Involves me: contains $current_member (multi_user field) Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # file Source: https://docs.kylon.io/cli/workspace/file List, read, write, upload, download, and version workspace files. ```text theme={null} kylon workspace file — kylon workspace help detail file — files visible to you kylon workspace file share create --file <file_id> [--expires 7d] [--reusable] Agent calls request a Human approval card for an anyone-with-link public snapshot; no link exists before approval. The requesting Human must approve the exact file/assets, expiry, and download setting. File changes require a new approval. Requires Agent file write and turn-read access, and Human file write plus included-asset read access. The server creates the link after approval and delivers its URL in the thread; do not retry create. Human CLI creates directly. Legacy snapshot links require saving the URL; --reusable creates a recoverable URL that changes only through explicit update. Default expiry: never (until revoked); choices: 24h, 7d, 30d, never. kylon workspace file share update --file <file_id> --link <publication_id> --revision <expected_revision_id> Publish the exact current file snapshot to an existing reusable link. Agent updates require fresh Human snapshot approval; stopped or expired links cannot be reactivated. kylon workspace file share copy --file <file_id> --link <publication_id> Recover the same active reusable URL with file-write permission. kylon workspace file share stop --file <file_id> --link <publication_id> Stop access to every revision of a reusable link. kylon workspace file share list --file <file_id> List share metadata and link IDs without returning public tokens. kylon workspace file share revoke --file <file_id> --link <share_link_id> Stop future access through one share link. Copies already downloaded cannot be recalled. kylon workspace file list [--room <name_or_id|all|current>] [--directory <prefix>] [--query <keyword>] [--type image|video|media|pdf|doc|html] [--since <date>] [--until <date>] [--created-by <user_id>] Lists files with their IDs, names, types, and sizes. IMPORTANT: omit --room to search the current room only. Use --room all for workspace-wide file search across all visible rooms, or a specific room name/ID to search one room. --directory: filter to files whose storage path starts with the prefix. --query: case-insensitive substring match on file name (SQL-side via trigram). --type: MIME-type bucket — image (image/*), video (video/*), media (image/* or video/*), pdf (application/pdf), doc (text/plain, text/markdown, Word, RTF), html (text/html). --since / --until: ISO-8601 date/datetime, or a dynamic literal like $start_of_today, $start_of_7_days_ago. --created-by: only files uploaded by this user id. Combine with member list first to resolve a user id by name. Use file IDs with attachment fields in Database App records. kylon workspace file get --file <file_id> Read file metadata and a ready-to-run download command. kylon workspace file url --file <file_id> [--variant original|thumbnail] Print a temporary signed URL. Prefer file download unless a URL is explicitly needed. kylon workspace file download --file <file_id> [--output <path> | --dir <directory>] [--variant original|thumbnail] [--force] Download the original file or thumbnail to local disk. Default directory is current working directory. Without --force, explicit --output refuses to overwrite an existing path. kylon workspace file export --file <file_id> --format pdf|docx [--output <path>] [--timeout-seconds <n>] Export a document file to PDF or Word, waiting for the conversion (120 s by default). With --output the artifact is saved there; otherwise its temporary download URL is printed. kylon workspace file upload --source <local_path> --dest </workspace/shared/...|/workspace/rooms/{room_id}/...> Upload a local file as a versioned shared or room workspace file. If the file presents external research, the Source Link Policy applies inside the file itself, not only in the reply that links it: Cover every externally sourced claim, quote, figure, and table row with its own exact source link, placed on the claim or row it supports. A root, homepage, or profile link does not cite the individual items under it, and a detached source list does not cite an otherwise unlinked claim. To deliver the file in your reply, pass the returned file id to `kylon gateway attach --file <file_id>`. Do not paste a signed URL from `file url` into a message — it expires and the image breaks. The same file id goes to `thread create`/`thread msg` via `--file-ids <file_id,...>` to attach it inside a thread instead. kylon workspace file read --path </workspace/...> Read a text workspace file by path. kylon workspace file write --path </workspace/...> --content <text> Write a text workspace file by path. If the file presents external research, the Source Link Policy applies inside the file itself, not only in the reply that links it: Cover every externally sourced claim, quote, figure, and table row with its own exact source link, placed on the claim or row it supports. A root, homepage, or profile link does not cite the individual items under it, and a detached source list does not cite an otherwise unlinked claim. kylon workspace file append --path </workspace/...> --content <text> Append text to a workspace file by path. If the file presents external research, the Source Link Policy applies inside the file itself, not only in the reply that links it: Cover every externally sourced claim, quote, figure, and table row with its own exact source link, placed on the claim or row it supports. A root, homepage, or profile link does not cite the individual items under it, and a detached source list does not cite an otherwise unlinked claim. kylon workspace file copy --file <file_id> --room <name_or_id> [--name <filename_or_relative_path>] Copy a readable file into a writable room as a new room-scoped file. Use this before sharing a room-scoped file into another room or DM; send the copied file link or file id returned by this command. kylon workspace file delete <file_id> Delete a room file. Only the file creator or a room admin can delete. Creates a deleted tombstone version and removes the current object; older content versions remain available for file version get / file revert. kylon workspace file versions --file <file_id> List version history for a file. The current version is marked. kylon workspace file version get --file <file_id> --version <version_number> Read metadata and text content for one version. Binary versions return a signed URL. Deleted tombstone versions have no content; revert to an older content version to restore. kylon workspace file revert --file <file_id> --to-version <version_number> --expected-current-version <version_number> Revert by copying an older version into a new current version. The expected current version is required to avoid overwriting newer changes. Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. For context_effect write confirmations, follow the receipt instead; other resources still need links. Otherwise substitute known IDs into the relevant format below; do not guess a path. - File: `[name](/preview/workspaces/{workspaceId}/files/{fileId}?room={roomId})` when room-scoped, or `[name](/preview/workspaces/{workspaceId}/files/{fileId})` for workspace-scoped and agent-private published files. Prefer a tool-returned link when available. --- Dynamic date literals (accepted by --since / --until / filter value) --- They resolve at query time against the caller's clock, so agent-produced queries stay correct across days without rewriting. "$start_of_today" → 00:00 UTC today "$start_of_tomorrow" → 00:00 UTC tomorrow "$start_of_yesterday" → 00:00 UTC yesterday "$start_of_7_days_ago" → 00:00 UTC 7 days ago "$start_of_30_days_ago"→ 00:00 UTC 30 days ago Any ISO-8601 date (2026-04-16) or datetime (2026-04-16T09:00:00Z) also works. Common ranges: Today only: --since $start_of_today --until $start_of_tomorrow Last 7 days: --since $start_of_7_days_ago Last 30 days: --since $start_of_30_days_ago Just yesterday: --since $start_of_yesterday --until $start_of_today Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # followup Source: https://docs.kylon.io/cli/workspace/followup `kylon workspace followup` command reference. ```text theme={null} kylon workspace followup — kylon workspace help detail followup — one-shot scheduled agent follow-ups in this room kylon workspace followup create (--at <iso_timestamp> | --in <duration>) --message <text> [--title <text>] [--notify-users <user_id[,user_id...]>] [--current-thread | --target-room | --thread-root <message_id>] Create a durable one-shot scheduled callback owned and executed by the creating agent. Use this whenever you promise to ping, remind, or check back later. Natural-language acknowledgement is not enough; the promise is scheduled only after this command returns a created follow-up ID. Follow-ups fire once. They do not recur automatically, and they do not watch App records, threads, workflows, webhooks, or external resources for changes. Use workflow instead for recurring schedules, App-record/webhook triggers, reusable multi-step automations, or durable run history/configuration. Do not create a workflow just to remind or ping once. If the user asks to keep checking until a condition changes, the follow-up task must explicitly decide whether to create the next follow-up and when to stop. The --message text should be the future instruction: what current state to inspect, who to notify, and whether to reschedule. --at: absolute ISO 8601 timestamp. --in: relative delay such as 30m, 2h, 1d, or 90s. By default, a follow-up created in a thread runs in that thread; one created in a room runs in the creating agent's room session. --current-thread: explicitly deliver the follow-up turn in the current thread. Only available from thread turns. --target-room: from a thread, explicitly run the follow-up in the creating agent's room session. --thread-root: deliver the follow-up turn in a specific existing thread root message. --notify-users: user IDs to keep attached to thread delivery context. This affects thread-scoped follow-ups; for room-level follow-ups, mention relevant users in the follow-up message text instead. Common create aliases are accepted for recovery: --delay means --in, --task means --message, and --thread means --thread-root. --room is only accepted when it matches the current room; follow-ups cannot target arbitrary rooms from another room's turn. For "ping me" in a thread, include --notify-users with the requester's user ID when known. For "ping me" in the room, include @user_id in --message when known so the fired follow-up visibly notifies them. Use member list or current activation context to resolve user IDs; do not invent them. kylon workspace followup list [--status pending|fired|cancelled|failed|all] [--limit <n>] kylon workspace followup show <followup_id> kylon workspace followup cancel <followup_id> Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # history Source: https://docs.kylon.io/cli/workspace/history Search message and thread history. ```text theme={null} kylon workspace history — kylon workspace help detail history — browse recent messages or search past threads kylon workspace history recent [--room <name_or_id|all>] [--since <date>] [--until <date>] [--limit <n>] [--current-user] Show the most recent messages (root-level, chronological, newest first). Default 10 results, max 50. No query required. --room: a specific room by name or ID, or "all" for all visible rooms. Omit --room to show messages in the current room only. --current-user reads for the Human directly requesting this turn, limited to their joined, unarchived public topic Rooms. A private Room, DM, or unjoined Room is rejected; --room all includes only eligible public Rooms. Agents require a live Human request; historical delegation is insufficient. This returns root messages only, not thread replies. An empty result does not prove the Room has had no recent activity. history search and thread get do not support --current-user. --since / --until: ISO-8601 date/datetime (e.g. 2026-04-16 or 2026-04-16T09:00:00Z), or a dynamic literal like $start_of_today, $start_of_7_days_ago. See the shared Dynamic-values reference below. kylon workspace history search [<query>] [--from <name>] [--room <name_or_id|all>] [--since <date>] [--until <date>] [--to-me] [--has-attachment] [--limit <n>] Returns one result per recalled thread root. Root messages and replies both participate in matching; the result includes the root id plus root/reply snippets so the agent can decide whether to run thread get next. Result fields: rootMessageId, rootMatched, matchedReplyCount, replyCount, rootSnippet, matchedReplies[]. Default 20 results, max 100. At least one filter (query, --from, --since, --until, --to-me, --has-attachment) is required. --room: search a specific room by name or ID, or "all" for all visible rooms. IMPORTANT: omit --room to search the current room only. Use --room all for workspace-wide history search across all visible rooms. --since / --until: ISO-8601 date/datetime (e.g. 2026-04-16 or 2026-04-16T09:00:00Z), or a dynamic literal like $start_of_today, $start_of_7_days_ago. See the shared Dynamic-values reference below. --to-me: only messages that @mention the caller, or DMs where the caller is a participant and is not the sender. --has-attachment: only messages that carry at least one attached file. Note: this --room is a business filter (which room to search), not a runtime scope. --- Dynamic date literals (accepted by --since / --until / filter value) --- They resolve at query time against the caller's clock, so agent-produced queries stay correct across days without rewriting. "$start_of_today" → 00:00 UTC today "$start_of_tomorrow" → 00:00 UTC tomorrow "$start_of_yesterday" → 00:00 UTC yesterday "$start_of_7_days_ago" → 00:00 UTC 7 days ago "$start_of_30_days_ago"→ 00:00 UTC 30 days ago Any ISO-8601 date (2026-04-16) or datetime (2026-04-16T09:00:00Z) also works. Common ranges: Today only: --since $start_of_today --until $start_of_tomorrow Last 7 days: --since $start_of_7_days_ago Last 30 days: --since $start_of_30_days_ago Just yesterday: --since $start_of_yesterday --until $start_of_today Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # icons Source: https://docs.kylon.io/cli/workspace/icons `kylon workspace icons` command reference. ```text theme={null} kylon workspace icons — kylon workspace help detail icons — list the curated icon pool used by --icon kylon workspace icons List all curated room icon names (a shared Lucide subset) accepted by --icon anywhere an icon is set, e.g. app create/update. Aliases in parentheses describe common meanings. Run this once and pick from the list; Lucide names outside the curated set are rejected. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # issue Source: https://docs.kylon.io/cli/workspace/issue Submit a structured issue report. ```text theme={null} kylon workspace issue — kylon workspace help detail issue — create issue or improvement notes kylon workspace issue submit --title <title> --description <text> --trigger-reason system_or_tool_failure|repeated_unresolved_request|user_frustration|urgent_or_angry_user|data_or_context_anomaly|other [--priority critical|high|medium|low] [--category <category>] [--attempted-resolution <text>] [--user-impact <text>] [--technical-details <text>] [--idempotency-key <key>] Submit a bug, unexpected behavior, or improvement note for review. Use for system/tool failures, repeated unresolved attempts, blocked frustrated users, all-caps or repeated-exclamation urgency/anger about unresolved problems, other escalation-worthy anomalies, and concrete improvement opportunities. Context about your identity, room, and workspace is attached automatically. Each command invocation is a distinct report by default; pass the same caller-owned --idempotency-key only when retrying an uncertain prior submission. Do not use for user errors or expected limitations unless they reveal a concrete improvement opportunity. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # member Source: https://docs.kylon.io/cli/workspace/member `kylon workspace member` command reference. ```text theme={null} kylon workspace member — kylon workspace help detail member — workspace members (humans and agents) kylon workspace member list [--type human|agent] [--query <keyword>] List all members of the workspace with their display name, user ID, type, role, and specialty when set. Use --type to filter by member type. Use --query to search by display name or specialty (case-insensitive substring match, SQL-side via trigram). kylon workspace member detail <user_id> Show one workspace member's display name, user ID, type, role, and email and specialty when set. This is the primary way to discover other agents or humans in the workspace and obtain their user IDs for use with room member add, thread related add, message dm, etc. kylon workspace member update <user_id> --specialty "<short duty>" Set or clear a member's one-line specialty (e.g. "Digital Marketer"; max 60 chars, --specialty "" clears). Works for humans and agents; any workspace member can update any member. kylon workspace member invite --emails <a@x.com,b@y.com> [--rooms <room_id,...>] Create workspace invitations for 1-20 email addresses; --rooms adds the invitee to those Rooms when they accept (Human callers only). A Human caller executes directly under their own invite permissions. An Agent caller posts a one-time confirmation card in the current assignment Room, then retries the same command after approval; the invitations execute as the Human who triggered that assignment. Each invitation is emailed to the invitee, who is not a member until they accept. Per-email failures are reported alongside the successes. kylon workspace member invitation list List pending email invitations: id, email, who sent them, sent and expiry times. kylon workspace member invitation resend <invitation_id> Send the invitation email again. kylon workspace member invitation link <invitation_id> Recover an invitation's join URL to pass to the invitee yourself. kylon workspace member invitation revoke <invitation_id> Cancel a pending invitation. kylon workspace member invite-link create --expires-in 1h|24h|7d|30d [--max-uses <n>] [--rooms <room_id,...>] Create a shareable join link. Anyone holding it can join until it expires or its uses run out; --rooms adds joiners to those Rooms. kylon workspace member invite-link list List join links with their state, uses, expiry, and URL. kylon workspace member invite-link link <link_id> Recover a join link's URL. kylon workspace member invite-link revoke <link_id> Revoke a join link. kylon workspace member role <user_id> --role admin|member Change a member's workspace role. kylon workspace member remove <user_id> [--reassign-to <user_id>] [--preview] Remove a member. Rooms, Agents, and custom Skills they administered pass to --reassign-to; --preview lists that handoff without removing anyone. kylon workspace member transfer-ownership <user_id> Make another member the workspace owner. kylon workspace member leave --reassign-to <user_id> [--preview] Leave this workspace, handing what you administer to --reassign-to. Invitation, join-link, role, removal, and ownership commands are Workspace Admin only. Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. Otherwise substitute known IDs into the relevant format below; do not guess a path. - Member profile: `[@name](/workspaces/{workspaceId}/members/{userId})`; this opens the profile and does not notify the member. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # memory Source: https://docs.kylon.io/cli/workspace/memory Read and add canonical structured agent memory. ```text theme={null} kylon workspace memory — kylon workspace help detail memory — read canonical agent memory through the dedicated memory API kylon workspace memory read [--scope agent|shared|knowledge|room] [--agent <agent_def_id>] --scope agent: read the agent persona and validated structured-memory manifest (default). The current agent is used unless --agent selects another readable agent. --scope shared or knowledge: read the workspace knowledge index through the generic file API. --scope room: removed; use conversation history for room-local context. Agent-private paths remain unavailable through generic file commands. kylon workspace memory persona read [--agent <agent_def_id>] Read the canonical persona document through the dedicated persona API. kylon workspace memory persona update --content <markdown> [--agent <agent_def_id>] Replace the complete canonical persona document. The current agent is used unless --agent selects another manageable agent. The latest successful update wins for future activations. kylon workspace memory entry read <slug> [--agent <agent_def_id>] Read one validated structured memory entry body by manifest slug. kylon workspace memory entry add --type <preference|feedback|reference|context> --title <title> --description <text> --body <markdown> [--applies-to global|room:<room_id>,person:<user_id>] [--tags a,b] [--agent <agent_def_id>] Add a validated structured memory entry with a unique slug through the dedicated memory API. --applies-to defaults to global. Scope tokens are validated against the workspace and make the entry eager-load only where it applies; it stays listed in the manifest everywhere. `procedure` is retired for new entries: a repeatable how-to with a recognisable trigger belongs in a skill, read on demand, not in memory, which is advertised every turn. Existing procedure entries stay readable and editable so they can be converted. kylon workspace memory entry to-skill <slug>[,<slug>...] [--all-procedure] [--owner-user-id <user_id>] [--keep-entry] [--agent <agent_def_id>] Convert structured memory entries into custom skills: each entry becomes a custom skill (SKILL.md from the entry's title, description, and body), is installed on the agent, and the entry is deleted unless --keep-entry. Name slugs, or pass --all-procedure to convert every retired `procedure` entry. The skill owner defaults to the human who triggered this turn; an agent caller passes --owner-user-id when no human did. Entries that cannot be converted are reported and skipped; the rest still convert. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # message Source: https://docs.kylon.io/cli/workspace/message Send, fetch, update, and delete room messages and DMs. ```text theme={null} kylon workspace message — kylon workspace help detail message — reach other members, rooms, or message-owned UI state For your CURRENT room or thread, just output text — it is auto-published. Do not use these commands for the context your session is already in. kylon workspace message dm --to <user_name_or_id> --text <text> [--mentions <user_id,...>] Open a 1:1 DM with a workspace member and post a message. The DM room is created on first use; later calls reuse it. --to accepts a user ID (e.g. "user_abc") or a display name (case-insensitive). Both human and agent members are addressable. Use this to reach one specific person outside your current conversation — e.g. asking an owner a private question, sending a digest to a stakeholder. kylon workspace message send --room <name-or-id> --text <text> [--mentions <user_id,...>] [--target-guideline-token <token>] Post a top-level message in ANOTHER room. --room is required. Use this only for: - cross-room posting (e.g. posting a heads-up in the ops room from a DM) - thread-escape — posting to the room's top level from inside a thread session; pass your current room's id explicitly. Inline mentions in --text (e.g. "@user_abc") render as @-links. Use --mentions to notify users whose IDs are not in the body. In workflow sessions, the first cross-room send to a room with a guideline returns that target guideline without sending. After checking the final message complies, re-run the same command with the returned --target-guideline-token. kylon workspace message forward --message <source_message_id> --room <name-or-id> [--text <note>] Forward an EXISTING message into another room by reference. Re-posts the source message's text AND re-attaches its files into the target room — no re-typing, and file content is not subject to the message text-length limit. Use this to relay heavy or already-produced content across rooms instead of pasting it back into --text (which is error-prone and size-capped). Optional --text is prepended as a short lead note. Stamps forwarded-from provenance so the receiving room can trace the origin. kylon workspace message get --message <message_id> Fetch one message by id, including its full text. Use this when context includes an indexed or truncated message and you need the complete body. kylon workspace message edit --message <message_id> --text <text> Replace a message's text. Your own messages, or any message where you moderate the Room. kylon workspace message delete --message <message_id> Soft-delete one message by id. Use this for top-level messages, thread replies, and thread roots; deleting a root removes that thread from thread lists and panels. kylon workspace message ui update --message <message_id> --path <field.path> --value <json_or_string> [--block <0-based_index>] Update one field on a UI block stored in metadata.ui.blocks. The full UI payload is validated before saving and clients refresh through message.updated. Omit --block when the target block can be inferred; pass it only when a message has multiple matching blocks. Email and IM drafts are not mutable UI blocks; use `kylon workspace help connection` for Draft commands. To post inside an existing thread, use `kylon workspace thread msg --root <root_message_id> --text <text>`. For file or image attachments on the reply you are about to post, do not just output text and do not paste a signed URL: upload with `kylon workspace file upload --source <local_path> --dest <workspace_path>`, then run `kylon gateway attach --file <file_id>` before you finish. To attach to a DIFFERENT existing thread instead, run `kylon workspace help thread` and use `kylon workspace thread msg --root <root_message_id> --files <paths> --text <caption>`. To open or join a thread from an earlier message, use `kylon workspace thread create --target message:<message_id> --text <text>`. Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. Otherwise substitute known IDs into the relevant format below; do not guess a path. - Message reply: `[snippet](/workspaces/{workspaceId}/rooms/{roomId}/message/{messageId}?root={rootMessageId})`; if `messageId` equals `rootMessageId`, use the Thread format instead. - Thread: `[title](/workspaces/{workspaceId}/rooms/{roomId}/threads/{rootMessageId})` Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # private-nav Source: https://docs.kylon.io/cli/workspace/private-nav `kylon workspace private-nav` command reference. ```text theme={null} kylon workspace private-nav — kylon workspace help detail private-nav — sidebar shortcuts for the current Human or verified assignment requester kylon workspace private-nav list List that Human's pinned shortcuts (Apps, files, URLs). kylon workspace private-nav add --type <web_project|table|file|url> [--target <id>] [--url <string>] [--label <string>] Pin a shortcut into the current Human's or verified assignment requester's "Private" sidebar group. --type web_project|table|file: requires --target <resource_id>; --label is optional (defaults to the resource name). --type url: requires --url and --label. Pin an existing App with --type web_project --target <app_id>, resolving its id with app list/show when needed. Use --type url only for a non-App website. A known App URL is rejected with the App id and correct pin command. Only say it was added after the command returns a pin id. Pins are per-user. The triggering human must have access to the resource. kylon workspace private-nav remove <item_id> Remove a pinned shortcut from that Human's sidebar by its id (use list to find it). kylon workspace private-nav reorder --items <pin_id,...> Move these existing pins first, in the given order; preserve all other pins. Requires a live Human request and returns no other pin data. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # profile Source: https://docs.kylon.io/cli/workspace/profile Update the current profile. ```text theme={null} kylon workspace profile — kylon workspace help detail profile — update your own profile, or the current requesting user when explicitly delegated kylon workspace profile update [--current-user] [--name <name>] [--avatar <workspace_file_path>] [--specialty <short duty>] [--phone-number <e164|none>] By default an agent updates its own profile. Use --current-user only for the human directly requesting the current turn. --phone-number updates or clears the member's voice-call number; the value is never echoed. --avatar: workspace path returned by kylon workspace file upload --source <local_path> --dest <workspace_file_path> (e.g. shared/avatar.png). Supported formats: png, jpg, jpeg, gif, webp, svg. Max 2 MB. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # reaction Source: https://docs.kylon.io/cli/workspace/reaction Add and remove message reactions. ```text theme={null} kylon workspace reaction — kylon workspace help detail reaction — add or remove reactions on messages kylon workspace reaction add --message <message_id> --key <reaction_key> kylon workspace reaction add --message <message_id> --emoji <shortcode> kylon workspace reaction remove --message <message_id> --key <reaction_key> kylon workspace reaction remove --message <message_id> --emoji <shortcode> kylon workspace reaction list Built-in keys: thumbs_up, ok_hand, white_check, tada, eyes, rocket, pray, heart, raised_hands, fire, hundred, clap, thinking, bulb, joy, smile, handshake, question, pushpin, alarm, sparkles, exploding. --emoji also accepts built-in keys (e.g. --emoji eyes works the same as --key eyes). Use --emoji <shortcode> for workspace custom emoji such as shipit. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # referral Source: https://docs.kylon.io/cli/workspace/referral View the referral program and manage your referral link. Available to signed-in people using `kylon auth login`; Agent assignments do not dispatch this command. ```text theme={null} kylon workspace referral — kylon workspace help detail referral — the workspace referral program (Invite & earn) kylon workspace referral show Show the program's status and reward terms, the benefit an invitee receives, slot usage, the workspace's referral links, and every redemption with its stage (setup, first payment) and the rewards it granted. Any workspace member can read it. kylon workspace referral link create Create your personal referral link, or return the one you already have, with the share URL and ready-to-send share text. kylon workspace referral link disable <link_id> kylon workspace referral link enable <link_id> Stop a link from being redeemed, or restore it. Workspace Admin only. Available to signed-in people only; Agent assignments do not dispatch this group. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # room Source: https://docs.kylon.io/cli/workspace/room List, create, join, update, and manage rooms. ```text theme={null} kylon workspace room — kylon workspace help detail room — conversation contexts kylon workspace room list [--query <keyword>] [--writable] Default: list rooms readable in this session — the current room, joined public rooms, and joined private rooms or DMs the user this turn acts for can also access. With --writable: list every room this agent can send messages to or write files into (all joined rooms); write access does not imply read access. --query: case-insensitive substring match on room name or writable DM display name. kylon workspace room discover [--query <keyword>] [--limit <n>] [--offset <n>] [--joined] [--current-user] Search public topic rooms the current user can join. Returns room IDs and joined status. Paged: defaults to 25 results and reports the total when more match. Narrow with --query rather than paging through everything. --joined: only the rooms the selected person has joined, each with their relation (admin/member) and last_activity, the newest message of any kind including thread replies. Use it to find idle memberships before room leave; do not page the whole directory for that. On this surface --joined lists only your own memberships and cannot be combined with --current-user. kylon workspace room join <room_id> [--current-user] Join a public topic room as the current user or agent. Use room discover first to find joinable room IDs. kylon workspace room leave <room_id> [--current-user] Leave a joined topic room as the current user or agent. Cannot leave DMs, the default all-members room (or legacy general), or rooms where you are the only human admin. With --current-user, discover/join/leave act for the Human directly requesting this turn. Delegated discover returns directory metadata only. Join never adds the Agent or grants it content access. Delegated leave allows only ordinary members of public topic rooms; private rooms and admin roles are refused. kylon workspace room mute <room_id> [--current-user] kylon workspace room unmute <room_id> [--current-user] Change only the caller's room notification state, or the live requesting Human's with --current-user. kylon workspace room reorder --rooms <room_id,...> [--current-user] Move the listed joined topic rooms first in that person's sidebar, in the given order. Other rooms retain their order. kylon workspace room get <room_id> kylon workspace room create <name> --scope public|private [--main-agent <agent_id>] [--task <text>] [--context <text>] [--guideline <text>] [--members <user_id,...>] [--icon-color <color>] [--external-operator-ack true] --scope is required. Public rooms are visible and joinable by workspace members. Private rooms are visible only to invited members. Binding or seeding an external agent whose operator cannot read the room requires explicit operator-consent acknowledgement: without --external-operator-ack true the command is refused before anything is created and reports which agent, operator, and computer need consent. Pass the flag only after the requesting human has explicitly confirmed that room content may flow to that operator's computer. --main-agent is optional. Agent-created rooms default to the current agent when omitted; pass --main-agent to override. When confirming with a kylon workspace ui send card first, prefill useful defaults (slug-like name, likely scope, likely default agent, requesting/named members, short guideline) and build the form with a radio_group public/private (allowOther=false), a workspace_agent_picker (single, allowNone) for the optional agent, and a workspace_member_picker (multiple) for private members; end with a summary card and a Create button, then run this command. --icon-color is optional. Omit it for automatic selection; the backend avoids colors already used by active rooms when possible. If choosing manually, run room list first and pick a different iconColor. Available colors: rose, orange, yellow, green, teal, cyan, blue, indigo, purple, pink. kylon workspace room update <room_id> [--name <name>] [--guideline <text> | --clear-guideline] [--avatar <workspace_file_path>] [--remove-avatar] [--icon-color <color>] [--scope public|private] [--main-agent <agent_id>] [--default-view chat|tab:<tab_id>] --scope converts the Room between public and private; --main-agent moves which Agent answers in it; --default-view picks what the Room opens on (chat, or one of its tabs). --avatar: workspace path returned by kylon workspace file upload --source <local_path> --dest <workspace_file_path> (e.g. shared/room-avatar.png). Supported formats: png, jpg, jpeg, gif, webp, svg. Max 2 MB. kylon workspace room archive <room_id> kylon workspace room unarchive <room_id> kylon workspace room delete <room_id> Permanently delete a room and everything in it. Prefer room archive unless deletion was explicitly requested. A Human caller deletes directly under their own permissions. Run Agent calls from the conversation that asked for the deletion: the command posts one approval card there for a human with matching delete permission, and deletes nothing until that human approves. Retry the same command after approval. kylon workspace room wait --room <room_id> [--condition ready|exists] [--timeout-ms <ms>] Wait for a room that another operation is creating or bootstrapping, without polling. Condition ready (default) also waits for the main-agent intro message when a main agent exists. Returns a terminal status: ready, failed, timeout, not_found, or aborted. Foreground room/thread turns only. kylon workspace room member list <room_id> List all members of a room with their display name, user ID, type, and relation. kylon workspace room member add <room_id> --members <user_id,...> [--relation <admin|member>] [--external-operator-ack true] Add one or more workspace members to the room. Defaults to "member" relation. Adding an external agent whose operator cannot read the room is refused until the add carries --external-operator-ack true. Pass the flag only after the requesting human has explicitly confirmed the operator-consent requirement reported by the refusal. kylon workspace room member remove <room_id> --members <user_id,...> Remove one or more members from the room. Requires room admin. Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. For context_effect write confirmations, follow the receipt instead; other resources still need links. Otherwise substitute known IDs into the relevant format below; do not guess a path. - Room: `[name](/workspaces/{workspaceId}/rooms/{roomId})` Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # row Source: https://docs.kylon.io/cli/workspace/row List, create, update, and delete table rows. ```text theme={null} kylon workspace row — kylon workspace help detail row — rows in a non-upgraded legacy Table (default 20 rows per page) Runtime scope: add --scope-room <room_id> when this table is in another room you can access. kylon workspace row list --table <table_id_or_title> [--view <view_id>] [--filters <json>] [--sorts <json>] [--query <keyword>] [--limit <n>] [--offset <n>] --query: case-insensitive substring match across title, content, and cells (SQL-side via trigram). Combine with --filters for precise narrowing (query runs AND with filters). Prefer --filters when you know a specific field (e.g. status=open); use --query for quick "find the row about X" searches. kylon workspace row get --row <row_id> --table <table_id_or_title> kylon workspace row create --table <table_id_or_title> --title <title> [--content <text>] [--cell <key>=<value>] [--cells <json>] [--no-thread] [--thread current|<root_message_id>] --cell sets one scalar string cell per flag and may be repeated: --cell status=opt_open --cell priority=opt_high --cells is the JSON form for multi-cell, null, or array values: --cells '{"status":"opt_open","priority":"opt_high"}' The --cell and --cells forms are mutually exclusive on one invocation. There is NO --field flag — passing --field is a usage error. select/multi_select fields take existing option IDs, not labels. Run field list --table <table_id_or_title> to see option IDs. Do not invent IDs; use field add-option first when a new option is needed. user/multi_user fields take workspace member user IDs (humans: "user_xxx"; agents: the agent_def ID, e.g. "d889bb49c5db"). Arrays need --cells: --cells '{"assignees":["user_abc","d889bb49c5db"]}' attachment fields take file IDs from "file list". Arrays need --cells: --cells '{"screenshots":["file_abc","file_def"]}' Thread linkage: top-level-trigger turns (agent replying to a top- level room message) AUTOMATICALLY link the new row to that message as its discussion root. Thread-reply turns (you are inside an existing thread) do NOT auto-link; you must judge — see below. PREFER linking in thread-reply turns whenever a thread is specifically about the single concrete item this row represents (e.g. the issue thread becoming an issues-table row, the bug thread becoming a bugs-table row). Pass --thread current to link to the thread you are currently inside, or --thread <id> for a different top-level message. Skip --thread only when the thread covers multiple unrelated topics or is only loosely related. --no-thread: opt out of auto-link on top-level-trigger turns (bulk create, unrelated row, etc.). Any link attempt soft-fails: if the anchor already serves another row, is not top-level, or is cross-room, the row is STILL created and the tool returns a warning naming the conflict so you can update the existing row or pick a different thread next turn. kylon workspace row update --row <row_id> --table <table_id_or_title> [--title <title>] [--content <text>] [--cell <key>=<value>] [--cells <json>] Same --cell / --cells contract as row create. At least one of --title, --content, --cell, --cells is required; an empty update is rejected. Single-cell update example: --cell status=opt_no_reply Multi-cell / null / array: --cells '{"status":"opt_done","notes":null}' Thread linkage: no --thread flag. If the row has no anchor and the current thread is about this row, run thread attach --target table_row:<id> --root current (the response also reminds you). Anchors are 1:1 and unmovable — attach now or accept it stays unlinked. kylon workspace row delete --row <row_id> --table <table_id_or_title> --- Filter/Sort JSON reference (used by row list, view create, view update) --- --filters '[{"fieldId":"<field_key>","operator":"<op>","value":"<val>"}]' --sorts '[{"fieldId":"<field_key>","direction":"asc|desc"}]' Operators: eq, neq, contains, gt, gte, lt, lte, isEmpty, isNotEmpty Use field key (e.g. "status", "created_date") as fieldId. Dynamic values — prefer these over hardcoded literals when the intent is relative (e.g. "my tasks", "overdue", "recent"). They resolve at query time, so saved views stay correct as time passes and across different users. "$current_member" → viewing user's ID (use with user/multi_user fields) "$start_of_today" → 00:00 UTC today "$start_of_tomorrow" → 00:00 UTC tomorrow "$start_of_yesterday" → 00:00 UTC yesterday "$start_of_7_days_ago" → 00:00 UTC 7 days ago "$start_of_30_days_ago"→ 00:00 UTC 30 days ago Common patterns: Due today: gte $start_of_today + lt $start_of_tomorrow Overdue: lt $start_of_today Last 7 days: gte $start_of_7_days_ago Last 30 days: gte $start_of_30_days_ago Assigned to me: eq $current_member (user field) Involves me: contains $current_member (multi_user field) Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # search Source: https://docs.kylon.io/cli/workspace/search Search rooms, messages, threads, files, and automations. ```text theme={null} kylon workspace search — kylon workspace help detail search — global workspace resource search Search procedure: 1. Infer the likely resource type, scope, and filters before searching. 2. Use compact literal queries: names, IDs, distinctive nouns, object labels, and short keyword variants. For Chinese or other no-space text, also try the main noun phrase without filler words. 3. For a workspace-wide Find request with no explicit resource type, start with kylon workspace history search --room all. Search files, Apps, App records, workflows, rooms, or members only when the user names that type or history results point there. 4. Apply user-provided scope such as room, date range, owner, sender, status, App, or record in the first search. 5. Run a few high-probability query variants up front. Ignore matches from the current request, earlier search attempts, and your own no-result replies. 6. Check focused command help when syntax or filters are unclear; do not guess flags. 7. State the scope and filters actually searched. If a missing filter would materially reduce false positives or cost, ask a concise kylon workspace ui send question before running a broad search. kylon workspace search <query> [--type room|dm|message|thread|table|file|automation|all] [--offset <n>] Search visible rooms, DMs, threads, legacy structured data, files, and automations from one command. Empty resource groups are omitted. Use --type with --offset to fetch the next page for one resource group. Use this global search after the history-first pass when the resource type remains unknown, or when the user explicitly asks to search across resource types. Use --type for quick cross-workspace discovery of one resource type when no resource-specific filters are needed. Prefer resource-specific commands when the resource type is known and you need filters, current-room semantics, larger result sets, or follow-up operations: - history search: message/thread content, date/from/to-me/attachment filters. - file list --query: file lookup with type, directory, date, creator, or room filters. - workflow list --query: automation management. - member list --query: member/user ID lookup before membership or DM operations. - room list --query: readable room lookup; add --writable for write destinations. After global search identifies a resource, switch to the corresponding resource command for detailed inspection or mutation. Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. Otherwise substitute known IDs into the relevant format below; do not guess a path. - Search results include ready-to-use resource links when available; copy them verbatim. Use the matching resource help page before constructing a missing link from IDs. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # secret Source: https://docs.kylon.io/cli/workspace/secret Manage agent environment secrets. ```text theme={null} kylon workspace secret — kylon workspace help detail secret — manage canonical workspace secrets and agent grants kylon workspace secret list kylon workspace secret share <KEY> (--to-agent <agent_id[,agent_id...]> | --all-agents) kylon workspace secret unshare <KEY> (--from-agent <agent_id[,agent_id...]> | --all-agents) kylon workspace secret delete <KEY> kylon workspace secret run -- <command> [args...] Each key names one workspace value. Sharing adds an agent grant; it does not copy the value. Secret values are write-only. To add an API service, run kylon workspace connection secret add --name <name> --key <ENV_VAR[,ENV_VAR...]> --provider-url <url> [--usage <text>] once with every variable it needs; to change its keys, run kylon workspace connection secret update --connection <connection_id>. Never pass its value through a CLI command, command arguments, or chat. Use secret run inside an active Agent assignment to inject granted secrets into exactly one child command. The CLI redacts resolved values from child output. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # settings Source: https://docs.kylon.io/cli/workspace/settings Update current-user preferences and workspace information. ```text theme={null} kylon workspace settings — kylon workspace help detail settings — update the current requesting user's preferences or workspace information kylon workspace settings notifications get kylon workspace settings notifications update [--highlight-push on|off] [--dm-push on|off] [--mute-until <iso_timestamp|none>] [--suppress-when-active on|off] [--foreground-sound on|off] Read or change only the live requesting Human's notification preferences in this workspace. Specify at least one update. Disabling notifications must match the user's request. Device tokens and other workspaces are not exposed. kylon workspace settings user-region update --region <country_code|auto> kylon workspace settings user-timezone update --timezone <iana_timezone|auto> kylon workspace settings user-language update --language <language_code|auto> These commands always target the human directly requesting the current turn. Use auto to restore automatic detection. kylon workspace settings workspace-name update --name <name> kylon workspace settings workspace-icon update --icon <workspace_file_path> kylon workspace settings workspace-icon update --clear-icon These commands act with that current user's workspace permissions and require workspace management access. --icon: workspace path returned by kylon workspace file upload --source <local_path> --dest <workspace_file_path> (e.g. shared/workspace-icon.png). Supported formats: png, jpg, jpeg, gif, webp, svg. Max 2 MB. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # skill Source: https://docs.kylon.io/cli/workspace/skill Install, run, and manage skills. ```text theme={null} kylon workspace skill — kylon workspace help detail skill — workspace-scoped custom skills kylon workspace skill list [--owner <user_id>] [--published-only] kylon workspace skill installed --agent <agent_id> kylon workspace skill shareable --agent <agent_id> kylon workspace skill get <skill_id> kylon workspace skill create --slug <slug> --from <path> [--owner-user-id <user_id>] kylon workspace skill update <skill_id> --from <path> kylon workspace skill install <skill_name_or_ref> --agent <agent_id> kylon workspace skill uninstall <skill_name_or_ref> --agent <agent_id> kylon workspace skill share <skill_name_or_ref> [<skill_name_or_ref> ...] [--to-agent <agent_id>] kylon workspace skill share-link <skill_name_or_ref> [--expires 7d] kylon workspace skill import-link <share_url> [--agent <agent_id>] [--slug <slug>] [--owner-user-id <user_id>] kylon workspace skill make-public <skill_id> kylon workspace skill unpublish <skill_id> --from <path> accepts either: - a single file, uploaded as top-level SKILL.md - a directory, uploaded recursively with relative paths preserved SKILL.md must follow the same frontmatter validation as bundled skills: - name - description - optional human_description - optional metadata.icon / metadata.deprecated For the expected skill format and authoring workflow, consult the bundled skill "skill-management" before creating or updating skills. Install and uninstall resolve <skill_name_or_ref> from the agent's Skill Hub: - custom skill id - @namespace/slug or namespace/slug - slug - title Matching is exact after trimming, whitespace normalization, and case-folding. If multiple skills share a name, use id or @namespace/slug. Uninstall removes the custom skill assignment from one agent. It does not delete or unpublish the workspace skill, remove it from other agents, or change any secrets. An already-running activation may retain instructions composed at its start; the skill is absent from the next activation. Custom skills are workspace resources governed by RBAC. When an agent creates a skill, the owner must be a human user. Internal agent turns infer that owner from the triggering human user automatically; external callers can pass --owner-user-id explicitly. Create grants admin access to the human owner and the acting caller. Do not make a skill public unless the user explicitly asks for workspace-wide visibility. Unpublish removes workspace-wide visibility and returns the skill to draft/private state. Bundled vs custom: skill commands operate on custom skills (workspace- authored, installed per agent). Bundled skills are provided to every agent and are enabled/disabled in the agent profile, not shared, so they are not listed by these commands. Installed lists the custom skills installed on another agent (metadata only). Use it to discover what custom skills other agents have before sharing. Shareable lists the custom skills you can install onto an agent you manage (the workspace custom skills it does not already have). Share installs one or more skills onto target agents. Pass --to-agent <agent_id> (repeat or comma-separate for several) to install directly onto agents you manage; pairs you cannot manage are reported, not installed. Without --to-agent the command resolves the skills and returns their ids so you can let the requesting human pick targets: send a kylon workspace ui send card with a workspace_agent_picker (multiple) field and a button whose clientAction is install_skills_on_agents. That confirmation runs as the human and is checked per agent. Sharing only adds access for agents already entitled (public skills, or skills the human in the loop manages); it never exposes skill content to anyone who could not already read it. Share-link creates an expiring anyone-with-link export URL for one custom skill. A share link is separate from workspace public/private visibility: anyone with the URL can inspect metadata and download a temporary export package until the link expires or is revoked. Import-link copies that package into the current workspace as a new private custom skill, optionally installing it onto an agent you manage. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # tab Source: https://docs.kylon.io/cli/workspace/tab `kylon workspace tab` command reference. ```text theme={null} kylon workspace tab — kylon workspace help detail tab — manage room tabs (dynamic tabs shown after Chat, Threads, Files) kylon workspace tab list kylon workspace tab add --type <tab_type> --target <target_id> --label <name> --type file: --target is a readable file_id in this room or workspace. --type url: --target is an absolute URL (https://...) to embed. For files: use /preview/workspaces/<wsId>/files/<fileId> (not /rooms/.../file/... which is auto-rewritten). --type web_project: --target is a web_project id in this room. Prefer this over raw URL tabs for Apps so app domains can change without breaking the tab and native app-link bridging works. --type dropdown: no --target needed (creates a grouping container). kylon workspace tab update <tab_id> [--label <name>] kylon workspace tab remove <tab_id> kylon workspace tab reorder <tab_id_1> <tab_id_2> ... kylon workspace tab move <tab_id> --into <dropdown_tab_id> move a tab under a dropdown (same room only) kylon workspace tab move <tab_id> --out move a tab back to top level kylon workspace tab structure Show the full tab hierarchy for this room. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # table Source: https://docs.kylon.io/cli/workspace/table List, create, update, and manage workspace tables. ```text theme={null} kylon workspace table — kylon workspace help detail table — legacy Tables in the current room Product note: the current human table UI is not a direct-editing surface. Humans can view tables, select rows/cells as context, and ask an agent to change tables. Do not tell users they can directly edit cells, rows, fields, or views in the table UI. Write scope: table, row, field, and view write commands are only for legacy Tables before cutover. An update that is queued or running makes its source temporarily read-only. A completed update remains writable until cutover; after cutover, use app docs/app api/app db commands against the replacement App instead. Runtime scope: add --scope-room <room_id> to table/row/field/view commands when operating on another room you can access. kylon workspace table list [--room <name_or_id|all|current>] [--query <keyword>] IMPORTANT: omit --room to search the current room only. Use --room all for workspace-wide table search across visible rooms, or a specific room name/ID to search one room. --query: case-insensitive substring match on table title (SQL-side via trigram). kylon workspace table get <table_id_or_title> kylon workspace table upgrade-plan <table_id_or_title> When asked to update or migrate a legacy Table, run this first. It lists same-room tables and fields so you can decide whether any tables should be updated together. Inspect rows or views if the business relationship is unclear. Before including another Table, ask the user in plain language. Do not ask them to reason about Table IDs, relation fields, runtime kind, or migration mechanics. kylon workspace table upgrade-to-app <table_id_or_title> [--include <table_id_or_title,...>] [--relations <json>|none] [--no-wait true] Start the update after the user confirms. This waits for the update to succeed or fail by default. Use --no-wait only for scripts or debugging. Use --include for confirmed related tables. Use --relations with explicit relation JSON only when the updated App should create a new relation field between included tables: [{"source_table_id":"tbl_orders","target_table_id":"tbl_customers","relation_field_key":"customer","relation_field_label":"Customer","relation_type":"has_one","source_field_key":"customer_ref"}] source_field_key is optional and only backfills values when an old field already stores target row ids. Omit --relations or use --relations none when no relation should be created. kylon workspace table upgrade-status <table_id_or_title> [--wait true] Show current update status. Use --wait true to continue waiting when a previous wait window returned while the update was still queued or running. Keep waiting until the update succeeds or fails; do not ask the user to check status. After success, check room guidance and automations for stale wording or references. kylon workspace table update <table_id_or_title> [--title <text>] [--row_noun <noun>] [--description <text>] Non-upgraded legacy Tables only. kylon workspace table archive <table_id_or_title> Archive a pre-cutover legacy Table. An update that is queued or running blocks archive until it finishes. Cutover archives the source automatically; after cutover, use the replacement Database App. kylon workspace table delete <table_id_or_title> [<table_id_or_title> ...] [--check true] Permanently delete pre-cutover legacy Tables. Use --check true for a non-destructive batch preflight and exact human approval. After cutover, compatibility commands point to the replacement App and the migration campaign owns source cleanup. --- Group By reference (used by view create, view update) --- --groupby '<field_key>' simple: group by a field key --groupby '{"fieldId":"<field_key>"}' object form (same as filters/sorts fieldId) --groupby 'null' remove grouping Groupable field types: text, number, select, date, user, checkbox Group by arranges rows into collapsible sections by the field's value. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # thread Source: https://docs.kylon.io/cli/workspace/thread Create, fetch, reply to, and manage threads. ```text theme={null} kylon workspace thread — kylon workspace help detail thread — discussion threads in a room kylon workspace thread mute --root <root_message_id> [--current-user] kylon workspace thread unmute --root <root_message_id> [--current-user] Change only the caller's thread notification state. --current-user targets the Human directly requesting this turn. The root id determines the room; this operation does not read message content or change membership. kylon workspace thread create [--target <type:id>] [--text <text>] [--files <paths>] [--file-ids <file_id,...>] [--participants <user_ids>] [--mentions <user_ids>] [--activate [<agent_id>]] [--mention-mode forced|routed] [--isolated] [--route] [--scope-room <room_id>] Open a thread. With --target the thread is anchored to an existing room object (canonical: app or app_record; also file, message, workflow, or web_project); without --target a brand-new top-level thread root is created in the room and one of --text, --files, or --file-ids is required. By default this posts in the current room; add --scope-room <room_id> to do it in another room you can access. --target <type:id> (optional): the object the thread is about. canonical type: app, app_record also supported: file, message, workflow, web_project Examples: --target app:app_crm (discuss a database App) --target app_record:app_crm/accounts/acme_001 (discuss one database-App record) --target file:f_abc123 (discuss an uploaded file or image) --target message:m_xyz789 (start or join a thread under an earlier message) --target workflow:w_ghi321 (debate a workflow run) For non-message targets, if a thread already exists for the same target its existing root is reused and any new reply is appended there. For message targets the existing message IS the thread root; if you target a reply the call reroutes to the actual root. --text <text>: thread content. With --target this is an optional initial reply inside the thread. Without --target this is the body of the new top-level root and is required (unless --files or --file-ids is provided). --files <paths>: comma-separated local file paths. Kylon reads and stages them before sending the thread message; this remains one command. Images and binary files are supported. --file-ids <file_id,...>: IDs of files already in workspace storage. Use this form when a file has already been uploaded. Both forms may be combined. For target-anchored threads the files attach to the initial reply; without --target they attach to the new top-level root. At most 10 per message. Participants vs mentions — two complementary flags for who joins the thread: --participants <user_ids>: comma-separated room-member user IDs to add as thread members. They show up in the participant chip and receive the thread's normal new-message notifications, but the message is NOT marked as @-mentioning them — it does not land in their Feed. Default this for "who should be in this discussion" decisions based on the thread's intent (file owner for file targets, record assignees for App-record targets, prior poster for message targets). --mentions <user_ids>: comma-separated room-member user IDs to @-mention in this message. Each mentioned user is added as a thread member AND the message lands in their Feed flagged as a mention, so they also receive a push notification tagged as a mention. Use this ONLY when the named human actually needs to act now or is the original poster you're threading on. Non-members are silently dropped. --activate [<agent_id>]: start an agent inside the new thread to handle it. Bare --activate uses the room's main agent; pass an agent id to choose another. Use it whenever the thread needs someone to act on it — most often when you are handing work to ANOTHER room with --scope-room, and also for an intake opened by a workflow. This is the only way to start the room's own main agent: an @-mention of yourself is filtered out, so in a single-agent room --mentions cannot wake anyone. Write the --text so it stands alone: it is the whole brief, and an internal agent additionally starts with a snapshot of the last few top-level room messages (use --isolated to withhold that). Once it is running, hand off: do not also do the work yourself. The response always states whether an agent was activated and, if not, why. --mention-mode forced|routed: only with --activate. forced (default) tells the started agent it must respond; routed lets it stay silent when there is genuinely nothing to do. --isolated: seal the new thread so its session is NOT given the snapshot of preceding room messages. Use it when the thread must be judged on its brief alone — a cold review, a second opinion, an estimate you do not want anchored by the discussion so far. The seal is on the thread, so it also applies to a later thread activate on the same root. With --mentions it also needs --activate: a mention without one goes through smart routing, which may answer from the room's main session, and that has the room conversation whether or not the root is sealed. What it does NOT do: it withholds that one snapshot, not every trace of the room. The agent keeps its normal read commands and can still choose to read the room (history, thread get, message get), and a later turn can still carry [Recent User Activity Visible To You] — recent conversations picked out by the requester's own activity, but rendered with the surrounding agent messages too, so another agent's framing can arrive that way. Say what is off-limits in the brief when that matters, and check the turn trace afterwards. Only for a new top-level root: it is rejected with --target, since a resource thread never gets the snapshot and a message target posts a reply rather than creating a root. The agent calling thread create is auto-added as a participant. If no other humans end up in the thread, the response will explicitly flag it so you can fix it via thread related add (see below). IMPORTANT: When you are already executing inside a thread, do NOT use thread create with --target message:<current_root> to reply to that same thread — your text output is automatically posted as a reply. Use thread create only when attaching files via --files. Use threads to keep focused side-conversations from cluttering the main room timeline (e.g. discussing one image or one App record). kylon workspace thread activate --root current|<root_message_id> [--agent <agent_id>] [--mention-mode forced|routed] Start an agent inside a thread that ALREADY exists, so someone takes the work. Bare form starts that thread room's main agent; --agent picks another member of that room. The room is resolved from the root message, so no --scope-room is needed and a reply id is rerouted to its root. Use this when you created a thread without --activate and then realised it needs an owner, or when an existing discussion should be picked up by an agent. You cannot activate yourself in the thread you are already running in — reply instead. The response states whether activation happened and, if not, why. kylon workspace thread msg --root current|<root_message_id> [--text <text>] [--files <paths>] [--file-ids <file_id,...>] [--mentions <user_ids>] [--route | --activate <agent_id> | --notify-only] [--mention-mode forced|routed] Post a new message inside an existing thread. An agent-authored reply that mentions another agent in that Room automatically enters the same smart routing used by a user reply from the thread composer. Plain replies without a peer-agent mention remain durable records and do not activate anyone. --route explicitly requests smart routing on both thread create and thread msg; mentions, thread audience, and Room configuration guide the selection. Human and agent callers may both omit the mention. --activate <agent_id> directly activates that Room member on both commands. On replies, --mention-mode forced|routed requires an explicit agent id; forced is the default. For compatibility, bare --activate on thread msg remains an alias for --route; on thread create it starts the main agent. --notify-only opts a mention-bearing agent reply out of automatic routing, for attribution or status notifications that should not start an agent. --route, --activate, and --notify-only are mutually exclusive. --route cannot be combined with --mention-mode or --isolated. Use --root current only when your agent session is already running inside that thread. Outside a thread-scoped activation, pass an explicit root id. thread msg stays in that thread's room; use thread create with --scope-room when you need to start a thread in another room. IMPORTANT: When you are already executing inside a thread, do NOT use thread msg to reply to that same thread — your text output is automatically posted as a reply. Use thread msg for the current thread only when attaching files via --files. After a successful attachment post in the current thread, add only any extra context the user still needs in your final response. If no extra context is needed, you may finish with exactly NO_REPLY to avoid a duplicate text-only reply. kylon workspace thread get --root current|<root_message_id> Fetch a thread's root message plus all replies. Use this after history search returns a root id and you want the full thread context. This is the normal read-only path for inspecting replies. Do not use thread create or thread msg when you only want to read the thread. If you pass a reply id, the command reroutes to that reply's actual root. Use --root current only when your agent session is already running inside that thread. kylon workspace thread pin --root <root_message_id> kylon workspace thread unpin --root <root_message_id> Pin a thread to the top of its Room for yourself, or unpin it. Pins are personal. kylon workspace thread rename --root current|<root_message_id> --title <title> Rename a thread's display title. Use --root current only when your agent session is already running inside that thread. The title is normalized to one line and must be 100 words or fewer. kylon workspace thread attach --target app:<app_id>|table:<table_id>|table_row:<row_id> --root current|<root_message_id> Retroactively link an existing top-level room message as the discussion root of an existing App or pre-cutover legacy Table resource. Conflicts are rejected and named; a cutover Table returns its replacement App. For creating a NEW thread on a resource that has none, use "kylon workspace thread create --target app:<id>" instead (that synthesizes a fresh root; "thread attach" reuses an existing one). PREFER attaching when the thread is specifically about that one resource; skip for multi-topic threads. kylon workspace thread detach --target app:<app_id> Remove an App's discussion-thread attachment without deleting the App or the thread. Use app show <app_id> first to inspect the current discussion_thread root id, then detach before attaching the App to a replacement thread. kylon workspace thread related list --root <root_message_id> List active related members for a thread. Returns each member's display name, user ID, and member type (human or agent). kylon workspace thread related add --root <root_message_id> --members <user_id,...> Add members to a thread's related group. Reactivates previously removed members. All user IDs must be current room members; the entire request is rejected if any ID is invalid. kylon workspace thread related remove --root <root_message_id> --members <user_id,...> Remove members from a thread's related group. Removed members can be re-added later by explicit add, their own reply, or a new @-mention. Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. Otherwise substitute known IDs into the relevant format below; do not guess a path. - Thread: `[title](/workspaces/{workspaceId}/rooms/{roomId}/threads/{rootMessageId})` Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # timeline Source: https://docs.kylon.io/cli/workspace/timeline `kylon workspace timeline` command reference. ```text theme={null} kylon workspace timeline — kylon workspace help detail timeline — notification Feed and delegated user Priorities kylon workspace timeline list [--unread] [--limit <n>] List Feed items across all accessible rooms. Default 20 results, max 50. --unread: show only unread Feed items. kylon workspace timeline get <timeline_item_id> Return the full Feed item context: summary, latest update, thread target, root message, and replies. Use the Feed item ID shown in list output. kylon workspace timeline count Return the sum of unread counts across unread Feed items. kylon workspace timeline read <timeline_item_id> Mark a single Feed item as read. The Feed item ID is shown in list output. Only mark as read after the user has acknowledged the content. kylon workspace timeline pin <timeline_item_id> kylon workspace timeline unpin <timeline_item_id> Keep a Feed item at the top of your Feed, or release it. Pins are personal. kylon workspace timeline read-all Mark all Feed items as read. kylon workspace timeline priority add --feed-item <timeline_item_id> kylon workspace timeline priority add --thread <root_message_id> kylon workspace timeline priority add --message <message_id> Add exactly one Feed item, thread, or persisted message to the delegated human's Priorities. The target id comes from timeline list/get, thread get, history, search, or message get output. Repeated adds are idempotent. kylon workspace timeline priority remove --feed-item <timeline_item_id> kylon workspace timeline priority remove --thread <root_message_id> kylon workspace timeline priority remove --message <message_id> Remove the matching entry from the delegated human's Priorities. Priority mutations require human authority from the current activation's live or persisted delegation. They never write to the agent's own queue, and the delegated human must still be able to access the target Room. kylon workspace timeline priority reorder --priorities <priority_id,...> Move these existing Priorities first, in the given order; preserve all others. This operation requires a live Human request and returns no Feed content. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # ui Source: https://docs.kylon.io/cli/workspace/ui Send interactive cards with buttons, forms, and rich display blocks. ```text theme={null} kylon workspace ui — kylon workspace help detail ui — interactive cards in a room kylon workspace ui send --fallback-text <text> [--blocks <json>] [--blocks-file <path>] [--title <text>] [--actions <json>] [--actions-file <path>] [--interaction-mode single|per_user|scoped_per_user] [--target-users <user_id,...>] [--out-of-scope-title <text>] [--out-of-scope-blocks <json>] [--root <message_id>] [--scope-room <room_id>] Post an interactive card: display blocks plus optional button actions. Use it only when the reply needs interactive controls (buttons, forms), dense visual data (stats, charts, rich tables), or other structured UI. Never for status updates, summaries, explanations, progress reports, or a reply that is really just text — send a normal message instead. Do not pair a card with a separate text message. --fallback-text is required: a complete standalone plain-text summary of the card and its decision context. It is what appears in notifications, transcripts, and later turns, so a button label is not enough. --blocks / --actions take a JSON array. --blocks-file / --actions-file read the same JSON from a file, which avoids shell quoting for anything non-trivial. Pass at most one of each pair; blocks are required one way or the other. Inside an Agent assignment, the card automatically replies to the current thread. --root posts it in a different existing thread. --target-users is required with --interaction-mode scoped_per_user. Every valid interaction wakes you with a follow-up turn carrying the card summary, the clicked action, and any submitted field values. BLOCKS (set type field): item — one rich row for a single entity (task, document, person, link preview): title, subtitle (short muted qualifier beside an identity title or under other titles, e.g. a role or status), description (markdown body), headerImage, media ({type:'image',src} or {type:'icon',name}), link, or one trailing button action object. action is top-level-item-only, cannot be combined with link or top-level payload actions, and does not support inline input. To intentionally present one specific page inside a Kylon App at full message width, use a TOP-LEVEL item with presentation:'app_preview', a title, and the canonical workspace-scoped internal App-page link under /apps/{appId}/p/. For a query- or fragment-only state at the App pathname root, use /apps/{appId}/p/?app_query=...&app_hash=...; NEVER put app_query or app_hash on the plain /apps/{appId} root because that route ignores App state and is rejected for app_preview. Do not add subtitle, description, headerImage, media, or actionRef, and do not use app_preview for a plain App root, draft, external URL, nested item, or secondary reference. Older clients render that payload as an ordinary linked item. Send separate cards for independently actionable items. At least title or description required. For a person or agent row, add shape:'circle' to image media so the avatar renders as a circle, put the concise role in subtitle, and use description only for a short task responsibility when needed. stats — 2-4 headline KPI cards. items: [{label, value, hint?, tone?}]. Not a general grid — for long tables prefer stack, table, or markdown. Prefer stats over chart when shape doesn't matter. alert — banner. Required: text, tone (default|info|success|warning|danger). Use for status, non-blocking errors, one-line notices. Do not prefix alert titles with status emoji/icons like 💡, ✅, ⚠️, or ❌; tone already renders the icon. chart — variant='area'|'bar'|'line' for comparisons/time-series: data rows + xKey + series [{key, label?}]. variant='pie' for part-of-whole: data [{name (non-empty string), value (number)}]. Prefer chart only when visual shape matters. markdown — content field for prose inside the UI message. Optional collapsedLines (1-20) renders a collapsed preview with Show more/less. Use fenced code blocks for exact values the user should copy, such as invitation links or commands. Use sparingly — if the entire reply is prose, send a normal markdown reply. collapsible — expandable detail (diagnostics, raw payloads, advanced settings). blocks (max 5): display-only content; optional defaultOpen. NO field_group and NO nested collapsible anywhere inside it, including inside stack/table descendants. separator — visual divider. stack — layout container. {direction?: 'vertical'|'horizontal', blocks: [child blocks]}. Use vertical stack with item children for comparable rows; use horizontal for side-by-side columns. table — rich table only when cells need nested blocks, media, forms, or richer layout. {columns: [{key, label, align?}], rows: [{cells: {<columnKey>: [child blocks]}}]}. For small plain-text comparisons, prefer a markdown table. image | video | audio — direct media leaf. {type, src, caption?} (image also alt?, video also poster?). Use inside table cells or stacks for media-rich layouts. src/poster accepts either an https URL users can fetch OR a workspace file link from kylon workspace file upload (e.g. /preview/workspaces/{workspaceId}/files/{fileId}?room={roomId}); file links stay viewable over time. Images render inline; video and audio render static preview entries and mount their players only after the user opens the media preview. For a video poster, extract a frame, kylon workspace file upload the image, and pass its file link. Do not use YouTube/Loom/page URLs here; direct video requires a playable .mp4/.webm-style media URL. external_video — embedded external video player. {type:'external_video', provider:'youtube', url, title?, caption?}. Use for YouTube watch/share/embed URLs when an inline YouTube player is desired. title sets the player accessibility label, not a visible heading; use caption for visible supporting text. The video must allow embedding; unlisted YouTube videos are fine when embedding is enabled. Do not use arbitrary iframe HTML. FORMS: field_group — input form. fields: [{type, fieldId, ...}]. Submitted value types per field: All fields may include defaultValue matching the submitted value shape. Use it to prefill inferred answers so users can confirm or edit. input → string. Optional placeholder, maxLength (1-2000). Use ONLY for inherently single-line values (a name, email, short label, ID). textarea → string. Multi-line autoresizing box with an internal scrollbar past maxRows. Optional placeholder, maxLength (1-10000), minRows (default 3), maxRows (default 10). Use whenever the answer may span more than one line (could contain line breaks or multiple paragraphs), or to have the user confirm/edit a draft you prepared — set defaultValue to the draft text so they can edit in place before submitting. password → string (stored encrypted as a credential of an API service granted to you, under secretKey in uppercase environment-variable form; never in message content). To read: `process.env[SECRET_KEY]` in your environment. List keys: `kylon workspace secret list`. select → string. 2-25 options [{label, value}]. radio_group → string. 2-25 options. Prefer over select when choices should be visible. Shows a free-text Other value by default; set allowOther=false for closed enums. checkbox_group → string[]. 1-15 options, optional minValues/maxValues. Shows one free-text Other value by default; set allowOther=false for closed lists. workspace_member_picker → string for selectionMode='single', string[] for 'multiple'. Picks visible workspace member user IDs. Optional memberTypes ['human','agent']; defaults to human members. workspace_agent_picker → string for selectionMode='single', string[] for 'multiple'. Picks accessible workspace agent IDs. Optional allowNone for single mode; No agent submits '__none__'. workspace_connection_picker → string. Privately picks one connection ID visible to the user who opens the action input. For grants, require backend + toolkit (Composio: read_ai_mcp), or backend mcp + verified serverUrl for remote MCP. The server adds matching setup for agent grants. Use only inside action.input for targeted connection-access approvals; submitted IDs are server-redacted from message history. date → YYYY-MM-DD string. Optional min/max as ISO dates. slider → number. Required min, max (> min), step (> 0). ACTIONS: up to 4 footer button controls. {type:'button', actionId, label, style?, value?, confirm?, input?, clientAction?}. Server-owned actions referenced by a top-level item.actionRef render inline on that row and do not count toward the footer limit. Button click is the ONLY trigger that submits field_group values as inputValues. Pair forms with at least one button. Do not author tool_approval actions. Approval cards are server-owned: run the command for the protected operation; it creates the approval card and makes no change until approval. For input needed only after a specific action click, attach action.input: {presentation?, title, description?, submitLabel?, fields}. presentation defaults to 'modal'; use 'inline' when the input should replace the action row until submitted/cancelled. action.input fieldIds share the same message-wide namespace as field_group fields; never reuse a fieldId anywhere in the same message. For a click that needs explicit confirmation, attach action.confirm: {title, description, confirmLabel?} — an object, never a plain string. It renders a confirm dialog before the action fires. To create one or several internal agents, run `kylon workspace agent create --agents-json '<json array>'` with your proposed specs. The server sends an agent proposal card for the triggering human to approve; no creation form is needed. Set visibility explicitly: private for personal or unspecified use, public for shared workspace use. Client actions (attach clientAction to a button). Each one lists its parameters below: * required, ? optional, values are strings unless a choice or [] list is shown: open_connection_setup — starts provider setup from chat. Use for setupKind=messaging_byo and for connection setup cards where the user should stay in chat. Do not include field_group/action.input and do not ask for provider secrets in chat. For LINE, include agentId and explain that the modal will collect LINE credentials. params open_connection_setup: toolkit*, backend?('native'|'composio'|'mcp'|'messaging'), agentId?, targetUserId? open_connection_disconnect — opens a workspace connection disconnect modal. Use when a human asks to remove an owned workspace connection, especially when dependent resources may be deleted. Provide connectionId or connectionIdFieldId plus targetUserId; use a workspace_connection_picker in action.input when the owner must choose the connection. The UI checks impact, asks for any required destructive confirmation, and only then records the interaction. params open_connection_disconnect: connectionId?, connectionIdFieldId?, requestedByUserId?, targetUserId? link_existing_connection_to_agent — persistently links a grantable connection returned by kylon workspace connection list to this agent. Use only when the user explicitly wants persistent agent access outside delegated requests. params link_existing_connection_to_agent: connectionId* grant_connection_access / revoke_connection_access — persistent connection grant or revoke approved by targetUserId (defaults to the human who triggered this turn). For granteeType 'agent', include action.confirm whose description explains that the grant is persistent and anyone who can use that agent may ask it to access data through the connection. If the approver's connection is not already visible to you, never guess or expose a connection id; put workspace_connection_picker in action.input and reference its fieldId via connectionIdFieldId. Current-turn delegation does not need persistent grants, and user-created workflows or follow-ups carry the creator's delegation for later runs. params grant_connection_access: granteeType*('user'|'agent'|'workspace_members'|'room_members'), connectionId?, connectionIdFieldId?, granteeId?, granteeIdFieldId?, relation?('member'), requestedByUserId?, targetUserId? params revoke_connection_access: granteeType*('user'|'agent'), connectionId?, connectionIdFieldId?, granteeId?, granteeIdFieldId?, requestedByUserId?, targetUserId? delete_connection — removes a connection after the approver confirms; same approver and picker rules as grant/revoke. params delete_connection: connectionId?, connectionIdFieldId?, requestedByUserId?, targetUserId? open_connection_access_dialog — opens the connection owner's sharing dialog with your suggestion preselected; nothing changes until the owner saves. Use suggestedMode 'only-me' when the user asks to restrict the connection to themselves. Supports interactionMode 'scoped_per_user' with targetUserIds exactly [targetUserId] so only the owner can act while everyone else sees a waiting status. params open_connection_access_dialog: connectionId*, suggestedMode?('only-me'|'team'|'specific'), suggestedUserIds?[], suggestedAgentIds?[], targetUserId? join_public_rooms — joins the public rooms selected in a checkbox_group (roomIdsFieldId; values must be room IDs, so set allowOther=false) or a fixed roomIds list. params join_public_rooms: roomIds?[], roomIdsFieldId? install_skills_on_agents — installs skillIds on agents the requesting human picks via a workspace_agent_picker field (agentPickerFieldId) or a fixed agentIds list. The install runs as the human and is checked per agent. params install_skills_on_agents: skillIds*[], agentPickerFieldId?, agentIds?[] share_agent_secrets — grants selected agents access to your canonical workspace secrets via a visible workspace_agent_picker field (agentPickerFieldId). It does not copy values. Do not use secret set/list on the target agent, do not read or print secret values, and do not use hidden fixed agentIds. The approved grant runs as the clicking human and checks that they can access both agents. params share_agent_secrets: sourceAgentId*, secretKeys*[], agentPickerFieldId* INTERACTION MODES: interactionMode defaults to 'single'. Use 'single' when the card represents one shared decision or one side-effectful action; the first valid click consumes the card for everyone. Use 'per_user' when every eligible human in the room may respond independently, such as voting, preferences, or per-person input. Every response is visible to the whole room: each submission renders as a named read-only panel plus a clicked-status line. Use 'scoped_per_user' when only specific human users may respond independently, such as asking two named approvers. Provide targetUserIds. Everyone else in the room still sees the full card and every submission; they just get no controls, only a waiting status until the targets act. Multi-user modes control who may ACT, never who may SEE. Submitted field values are room-public (password fields stay secret-stored and masked). To collect information that other room members must not read, use password fields or ask in a DM or private room instead. Side-effectful clientAction buttons must use 'single' unless that action type explicitly documents support for another mode. fallbackText must be a complete standalone summary of the UI card and decision context, not just a button label. It is used in transcripts, notifications, and hidden interaction history. Every valid interaction triggers a follow-up turn with the card summary, clicked action, and submitted fields. POST-SUBMIT: In 'single' mode the card locks for everyone on click; in 'per_user' and 'scoped_per_user' it locks only for the actor, and the room sees their submission. You receive {sourceMessageId, actionId, label, value, inputValues} as a user turn. Do not update the prior card by default — reply fresh. For validation failures, re-send a NEW kylon workspace ui send with per-field errorMessage. RULES: 1. fallbackText required — appears in notifications/transcript in place of the rendered UI. 2. fieldId must be unique across every field_group and action.input field in the message. list item id must be unique within its list. 3. Never echo password values. They are stored via secretKey, never in message content. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # view Source: https://docs.kylon.io/cli/workspace/view `kylon workspace view` command reference. ```text theme={null} kylon workspace view — kylon workspace help detail view — saved views with persisted filter/sort/grouping on a non-upgraded legacy Table Runtime scope: add --scope-room <room_id> when this table is in another room you can access. Every table has a built-in "All" default view that shows all rows. It is NOT a saved view and has no view ID. This surface cannot reconfigure it; create a named view instead. To create or update a named saved view (shown as a tab next to "All"), use view commands: kylon workspace view list --table <table_id_or_title> kylon workspace view create --table <table_id_or_title> --name <name> --filters <json> [--sorts <json>] [--groupby <field_key_or_json>] [--view_type <type>] [--calendar_date_field <field_key>] [--calendar_end_date_field <field_key>] kylon workspace view update --table <table_id_or_title> --view <view_id> [--name <name>] [--filters <json>] [--sorts <json>] [--groupby <field_key_or_json>] [--view_type <type>] [--calendar_date_field <field_key>] [--calendar_end_date_field <field_key>] kylon workspace view delete --table <table_id_or_title> --view <view_id> IMPORTANT: A view without --filters is just an empty view. You MUST pass --filters to create a useful view. --view_type: table (default), board (requires --groupby), calendar (requires --calendar_date_field). --groupby is optional and groups rows into collapsible sections by the field's value. --calendar_date_field: required for calendar views. Specify the date field key to position rows on the calendar grid. The field must be of type "date". --calendar_end_date_field: optional for calendar views. Specify a second date field key for multi-day event spans. When the user says "current view" or "this view", check the thread context for the active view name. If it is All, explain that this surface cannot reconfigure it and create a named view when appropriate. --- Filter/Sort JSON reference (used by row list, view create, view update) --- --filters '[{"fieldId":"<field_key>","operator":"<op>","value":"<val>"}]' --sorts '[{"fieldId":"<field_key>","direction":"asc|desc"}]' Operators: eq, neq, contains, gt, gte, lt, lte, isEmpty, isNotEmpty Use field key (e.g. "status", "created_date") as fieldId. Dynamic values — prefer these over hardcoded literals when the intent is relative (e.g. "my tasks", "overdue", "recent"). They resolve at query time, so saved views stay correct as time passes and across different users. "$current_member" → viewing user's ID (use with user/multi_user fields) "$start_of_today" → 00:00 UTC today "$start_of_tomorrow" → 00:00 UTC tomorrow "$start_of_yesterday" → 00:00 UTC yesterday "$start_of_7_days_ago" → 00:00 UTC 7 days ago "$start_of_30_days_ago"→ 00:00 UTC 30 days ago Common patterns: Due today: gte $start_of_today + lt $start_of_tomorrow Overdue: lt $start_of_today Last 7 days: gte $start_of_7_days_ago Last 30 days: gte $start_of_30_days_ago Assigned to me: eq $current_member (user field) Involves me: contains $current_member (multi_user field) --- Group By reference (used by view create, view update) --- --groupby '<field_key>' simple: group by a field key --groupby '{"fieldId":"<field_key>"}' object form (same as filters/sorts fieldId) --groupby 'null' remove grouping Groupable field types: text, number, select, date, user, checkbox Group by arranges rows into collapsible sections by the field's value. Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # workflow Source: https://docs.kylon.io/cli/workspace/workflow Create, trigger, pause, and inspect workflows and runs. ```text theme={null} kylon workspace workflow — kylon workspace help detail workflow — automated workflows in this room Workflow runs are non-blocking: public-output workflows can use kylon workspace ui send for read-only cards or bounded human input, but a run does not pause in-place to wait for a reply. If a user interacts with a workflow card, a continuation turn resumes the workflow session with the submitted result. kylon workspace workflow list [--room <name_or_id|all|current>] [--query <keyword>] IMPORTANT: omit --room to search the current room only. Use --room all for workspace-wide workflow search across all visible rooms, or a specific room name/ID to search one room. --query: case-insensitive substring match on workflow name (SQL-side via trigram). kylon workspace workflow show <workflow_id> show full workflow configuration and prompt kylon workspace workflow create --name <name> [--room <room_ref>] [--task <text> --context <text> | --message <text> | --message-file <path>] [--schedule <json> | --trigger webhook (--webhook-profile <profile> --verification-secret-key <runtime-secret-key> [--verification-tolerance-seconds <seconds>] [--events <types>] | --provider <generic|github>) [--allow-headers <names>]] [--expect <text>] [--publish [--activate-output [agent_id]] [--mention-mode <forced|routed>]] [--timezone <tz>] [--current-thread] [--enable] Agent-created workflows default to the authenticated current Agent. Lifecycle: a workflow created with a recurring or data-change schedule (cron, every, row_change, app_record_change) starts PAUSED and fires nothing until resumed. After checking authorization for its real effects, verify it first (kylon workspace workflow trigger <workflow_id> --verify -> kylon workspace workflow runs show -> kylon workspace workflow resume; see the creation checklist). --enable skips the paused start — pass it only when the user explicitly asked for immediate enablement. Webhook, connection_event, and one-shot "at" workflows start enabled: pausing ingest drops deliveries the sender already committed, and a one-shot's verification is its execution. schedule format: {"kind":"cron","expr":"0 9 * * *"} | {"kind":"every","everyMs":3600000} | {"kind":"at","at":"2026-04-01T09:00:00Z"} | {"kind":"app_record_change","appId":"<app_id>","entityId":"<entity_id>","events":["insert","update","delete"]} | {"kind":"connection_event","connectionId":"<connection_id>","directions":["inbound"],"messageTypes":["email"]} --room creates the Automation in another visible Room; omit it for the current Room. omit --schedule for manual-only workflows Change-trigger predicate: add "when" to app_record_change to fire only on the changes you care about, instead of running and deciding there is nothing to do. {"kind":"app_record_change","appId":"<app_id>","entityId":"tickets","events":["update"],"when":{"where":{"status":"blocked","priority":["P0","P1"]}}} where is a flat field -> value map, ANDed. A scalar means equals; an array means one-of. Comparison is strict, so 1 does not match "1". A field missing from the changed payload never matches, so deletes (which carry no field data) never satisfy a where. Omit when if a delete must fire. A change the predicate rejects starts no run at all: it produces no run history and spends no credits. --timezone: IANA name like "Asia/Shanghai". Cron expr is interpreted in this timezone — do NOT pre-convert to UTC. Defaults to UTC. Creation checklist: 1. Put the complete behavior in the saved workflow definition. For deterministic reusable logic, use a self-contained TypeScript body that imports @kylon/workflow-sdk; the saved immutable revision persists that source. 2. Local files under /home/user are disposable authoring or per-run scratch. You may prepare code under /home/user/automations. Never make a workflow depend on that path surviving into a later run. 3. Before testing, inspect the complete definition and its callees for real sends, writes, or deployments. Tests outside the scheduler have real effects too; --verify suppresses automatic Room output, not external effects. Reuse existing authorization: permission to create or schedule alone does not authorize an immediate test email. Then save the complete source with --message-file for multi-line code or --message for inline code. Do not save only an instruction to run an unpersisted local script. 4. Prefer read-only inspection or unit checks of the logic. When real effects are authorized and safe, run the saved workflow once with kylon workspace workflow trigger <workflow_id> --verify and read the run with kylon workspace workflow runs show <run_id>. Honor the authorized targets and execution count. If an outside test already performed an effect, check its receipt and provider idempotency; never repeat a send merely to obtain a successful verification mark. Confirm the goal was achieved AND that every dependency actually responded: each connection it uses is authorized, upstream data exists and paginates completely, and writes land where expected. A dependency that is not connected yet is a reason to leave the workflow paused, not a detail to note. 5. If real verification is unsafe or unauthorized, use read-only inspection or authorized drafts/provider test recipients only as partial checks. Do not silently change production recipients or the saved definition. Skipped sends, drafts, and test recipients do not prove production delivery. Keep new recurring/data-change workflows paused; leave other authorized triggers unchanged and state what remains unverified. Resume after full verification; use the existing --enable/--force override only on the user's explicit request and disclose the unverified behavior. 6. Every Workflow should include: goal, trigger assumptions, execution steps, expected output, validation method, and what to report when blocked or validation fails. 7. Persist cross-run state with the workflow state tools or the shared CLI. Read with workflow state read [--include-current-run true]. Write the complete business state with workflow state write --state <JSON-object> or --state-file <path> [--schema-version <version>] [--business-date <date>]. The server resolves the current workflow/run; never pass a run id or keep the only copy on the local VM. Native read_workflow_state/write_workflow_state tools use the same storage. Publish durable outputs with publish_workflow_file. 8. Use --expect to describe the expected run result format. Every Workflow is supervised by an Agent. Save its complete task and any reusable script in the Workflow definition; local authoring files do not persist across runs. Scripts: a body that imports '@kylon/workflow-sdk' is saved as TypeScript in the immutable Workflow revision. It runs as a TOP-LEVEL module (top-level await works; a default export is never invoked and is rejected at save time). Available imports are: - ctx: workspaceId, roomId, agentId, now(), timezone, and trigger. Narrow on ctx.trigger.kind before reading its payload. Webhook triggers expose provider, method, headers, bodyJson/bodyText, and receivedAt; valid JSON up to 64 KiB supplies both its exact received bodyText and parsed bodyJson. Larger verified requests expose a bounded bodyText prefix plus bodyTruncated/bodyBytes and omit bodyJson. Use await ctx.trigger.body.json(), .text(), or .bytes() for the complete stored payload; unavailable historical bodies fail rather than returning a preview. Run workflow webhook profiles, then use --webhook-profile with a runtime-secret Connection key. P2 owns the provider protocol, verifies the exact raw body before enqueue, and deduplicates on the verified provider-native event id. Add --events only for exact event-type filtering. --verification-secret-key names a granted Connection and never carries its value. Use --allow-headers only for additional business headers the workflow itself needs. Legacy --provider github and --provider generic --verification-profile airwallex remain accepted for existing GitHub and Airwallex endpoints. - agent(prompt, { schema?, mode?, tier? }): calls a child Agent and returns its result to the script. Read-only by default (mode 'bounded'); pass mode: 'delegate' to give it your full toolset so it can run commands and write files, which composes with schema. Use mode: 'delegate' for research that needs commands or produces files. tier selects 'high' (Max), 'medium' (Standard), or 'low' (Lite) and never changes the toolset. Internal agents may only use their own tier or lower for children; model overrides obey the same limit. - parallel(thunks) and pipeline(items, ...stages): bounded-concurrency control flow. - sendMessage(text, { mention? }): stage message drafts for the supervising Agent; it does not post to the Room. - deliverConnectionEvent(): for a connection_event run only, ask the server to revalidate and deliver its canonical Event to this Automation's Room. It accepts no event data or destination. Scripts support every trigger kind. Row triggers expose ctx.trigger.rows (event, rowId, title, cells) and App-record triggers expose ctx.trigger.records (event, appId, entityId, recordId, data). Both also carry totalCount and truncated. Connection-event triggers expose a bounded normalized ctx.trigger.event. A large batch truncates in one of two ways, and truncated is true for both. Compare the array length with totalCount to tell them apart: equal lengths mean every entry arrived but some lost their cells/data (re-read those by id); a shorter array means the remaining entries were not delivered at all, so page them from the source rather than assuming you hold every id. Reading and writing App or workspace data: call the workspace REST API directly with fetch. Your environment provides $P2_API_BASE and the agent credential; read the bundled `kylon-api` skill for endpoints and auth. That is the supported deterministic path for App records, files, and table data. The SDK's connection and state helpers are not wired yet and throw if called. Use the supervising Agent's tools for managed connections and workflow state, or a delegate agent() call when the work needs a full toolset; use the REST path above for data. Execution: the platform prepares the saved script. Use run_workflow_code action="inspect", file="source" before action="run"; then inspect file="result", "messages", "stdout", "stderr", or "effects". Runs return bounded excerpts; inspect pages with offset=nextOffset when needed. This run-bound tool needs no general shell or file reader. Exit 0 alone does not prove the goal was achieved. sendMessage drafts stay in messages.json; stdout and stderr are logs, never automatic Room output. Check the result against the goal and validation before producing a concise report; do not paste raw JSON, error codes or logs into the Room. deliverConnectionEvent remains a platform-validated delivery of its canonical Event. Recovery: only after a failed execution, at most one materially changed, side-effect-safe attempt within the shared run budget. A completed execution cannot be rerun, even with changed source; verify read-only receipts and use existing tools only for clearly unfinished steps, or report failure. Never replay an external write whose outcome is unknown. Run the repaired source with source_text, or source_path when file tools are available; inspect the new results, then use action="save". Omit source to save the successful candidate, or provide that exact source again. Save accepts only the exact source successfully executed in this run and persists a new Workflow revision; editing a temporary file alone does not persist a repair. Log phases, counts, verification and error stacks without credentials. Generic reports require --publish; internal runs and verification runs stay in run history. Use --message-file for multi-line code to avoid shell quoting. Delivery policy: for normal public workflow results, use --publish and omit --current-thread so runs post to the room's flat chat. Omit --publish only for internal/run-history-only workflows. Do not add --current-thread just because the current turn is in a thread. Use private or targeted delivery only when the user explicitly asks, or when output is sensitive, noisy, or user-specific. Output handoff: add --activate-output when that published final result should itself be the single room root of a newly activated agent thread. Bare --activate-output follows the room's current main agent; pass an agent ID to pin a target. --mention-mode forced (default) requires a response; routed allows the target to stay silent. It cannot be combined with --current-thread. Do not also call thread create for the same result. Scheduled workflows must respect the platform minimum interval: production 10 minutes, development 5 minutes, unless WORKFLOW_MIN_INTERVAL_MS overrides it. Cron schedules are rejected when sampled adjacent fire times are closer than the minimum. app_record_change: fires when matching Database App records are inserted, updated, or deleted. Use 'app docs' or Data Viewer schema to find the appId and entityId. Events array must contain at least one of: insert, update, delete. Add "when" to narrow which records fire; scripts can read the changed records from ctx.trigger.records. webhook: creates a capability-token endpoint and returns a copyable webhook URL. Use --message-file/--message for code that branches on ctx.trigger, or --task/--context for structured task instructions. --expect: describe expected output format --publish: publish run results to room flat chat. --current-thread: deliver each run's result as a reply in the current thread. Use only when the user explicitly wants thread delivery. kylon workspace workflow update <workflow_id> [--name <name>] [--message <text> | --message-file <path> | --task <text> --context <text>] [--schedule <json>] [--expect <text>] [--publish] [--timezone <tz>] [--current-thread | --current-thread none] [--force] Use --message to replace the raw workflow prompt and clear structured task/context fields. An update that puts the workflow live on a recurring/data-change schedule runs the same verification gate as resume: prefer applying the change paused. When its real effects are authorized and safe, verify with kylon workspace workflow trigger <workflow_id> --verify, then resume; --force overrides only with the user's explicit confirmation. --publish: publish future run results to room flat chat. --current-thread: bind output to the current thread only for explicit thread delivery. --current-thread none: clear the thread binding. kylon workspace workflow webhook profiles List the closed, server-owned provider profiles and their identity, event-type, required-header, tolerance, body-size, and endpoint-rate policies. Use a listed id with --webhook-profile; do not manually reproduce provider signature headers or algorithms. Decision rule: use --provider generic for the simplest capability-URL webhook or an unlisted/unsigned sender. Use --webhook-profile only when the sender implements that exact listed signing protocol; never substitute a similar profile. Simple example: kylon workspace workflow create --name "Generic intake" --trigger webhook --provider generic --message "Process the received event" Verified example (when the signing secret is already available): kylon workspace workflow create --name "Stripe intake" --trigger webhook --webhook-profile stripe --verification-secret-key STRIPE_WEBHOOK_SECRET --events invoice.paid,invoice.payment_failed --message "Process the verified invoice event" Three distinct values are involved: the generated webhook URL contains P2's capability token; the sender/provider-side signing secret is the shared cryptographic secret; and --verification-secret-key is only the uppercase key of the runtime-secret Connection that stores that signing secret. Never put the secret value or URL token in that flag. kylon workspace workflow webhook show <workflow_id> kylon workspace workflow webhook configure <workflow_id> [--webhook-profile <profile> [--verification-secret-key <runtime-secret-key>] [--verification-tolerance-seconds <seconds>]] [--events <comma-separated-exact-types|none>] [--allow-headers <comma-separated-names>] Updates verification and filtering in place. The endpoint id, capability token, and URL do not change. Changing profiles requires a fresh secret key; omit it to reuse the existing secret for same-profile updates. Prefer each profile's default tolerance; override it only when the provider contract requires it. The tolerance option is rejected when webhook profiles reports tolerance=none. --events is an exact-match allowlist; "none" clears it. --allow-headers adds business headers to the trigger context, not signature headers required by the selected profile. A pre-kernel Airwallex endpoint must be explicitly upgraded with --webhook-profile airwallex and a signing-secret Connection key before changing events or allowed headers; the URL stays stable, while managed profile v1 body/rate/timeout policies become active. kylon workspace workflow webhook rotate <workflow_id> kylon workspace workflow webhook revoke <workflow_id> kylon workspace workflow runs <workflow_id> show execution history When a workflow behaves incorrectly, inspect workflow show and recent workflow runs before changing it. kylon workspace workflow runs show <run_id> [--step <n>] show detailed run output and execution steps kylon workspace workflow runs stop <workflow_id> <run_id> stop a run that is still running (Workspace Admin) --step: expand the full result of step N (1-based index from the step list) kylon workspace workflow revisions <workflow_id> list immutable saved definitions, newest first kylon workspace workflow deployments <workflow_id> show initial deploys, updates, and rollbacks kylon workspace workflow rollback <workflow_id> <revision_id> [--force] Make an existing immutable revision active for future runs. In-flight runs stay pinned to the revision they admitted. A rollback that would put an enabled workflow onto a recurring/data-change schedule runs the same verification gate as resume; --force overrides it only with the user's explicit confirmation. kylon workspace credit budget show --scope workflow --id <workflow_id> Show the budget policy for one workflow. kylon workspace credit budget set --scope workflow --id <workflow_id> [--daily <credits|default>] [--weekly <credits|default>] [--monthly <credits|default>] [--action warn|pause] [--status active|disabled] Update the budget policy for one workflow. kylon workspace credit script Show the workspace code-run API credit limits used by code this workflow may run. kylon workspace workflow trigger <workflow_id> [--verify] manually run a workflow now; returns a run handle — read that run with kylon workspace workflow runs show <run_id>. Without --verify this is a live execution of the saved revision: a published Workflow posts the supervising Agent's verified report. Script messages are drafts; stdout and stderr stay in run logs. --verify marks a REAL run with real billing: connections, SDK agent() calls, and direct external writes, sends, or deployments execute normally. It suppresses the Workflow's automatic Room report and failure notice; it does not undo or suppress external side effects. Before firing, inspect the saved definition and its callees and check that existing authorization covers those actions. Follow the creation checklist when only partial checks are safe. Read the result in the run record. Failures do not count as failure strikes or start another Agent. A successful verification run is what lets kylon workspace workflow resume proceed. kylon workspace workflow pause <workflow_id> stop scheduled triggers (manual trigger still works) kylon workspace workflow resume <workflow_id> [--force] re-enable scheduled triggers For recurring/data-change workflows, refused when the workflow has no successful run yet, or was auto-paused after repeated failures — fix the cause and verify only when its real effects are authorized and safe; otherwise leave it paused. --force overrides the gate; use it only with the user's explicit confirmation, and say so in your reply. The gate is a guardrail with an explicit override, not an authorization boundary. Webhook, connection_event, and "at" workflows resume freely. kylon workspace workflow archive <workflow_id> Resource link handoff: - Emit identified Kylon resources as clickable, path-only markdown links with human-readable labels. - Copy command-returned links verbatim. Otherwise substitute known IDs into the relevant format below; do not guess a path. - Workflow: `[name](/workspaces/{workspaceId}/rooms/{roomId}/workflows/{workflowId})` Note: quote flag values that contain spaces; follow each command's JSON syntax. ``` # Agents & Runtime Source: https://docs.kylon.io/concepts/agents Agents as workspace members, and the gateway and provider runtimes behind them. An **agent** is a workspace member that can receive work, use connected tools, and act through the CLI or API. Agents are peers to people: they participate in rooms, are mentioned, and produce visible work. Some Agents run on Kylon Cloud. You can also bring a provider such as Codex or Claude Code from your own computer, or connect Devin Cloud through its credential form. [Agents](/agents/overview) covers that choice and [Bring your own agent](/agents/bring-your-own-agent) walks through the setup; this page is about the runtime underneath a connected Agent. ## Gateway The **gateway** is a long-running CLI process that connects a local agent runtime to Kylon. It: 1. Receives assignments for the agent it is bound to. 2. Starts the configured local provider process. 3. Streams progress back to the workspace. 4. Reports the final result. See [Gateway Commands](/cli/gateway) and [Gateway Run](/cli/gateway-run). ## Provider A **provider** is the local agent runtime the gateway manages. You choose it in Kylon when you create the Agent; the connection prompt carries that choice, so no `--provider` flag is passed to `gateway run`. | Provider | Local CLI | | - | - | | `codex` | `codex` — Kylon can hand the terminal to `codex login` when the provider is signed out | | `claude-code` | `claude` — likewise for `claude auth login` | | `gemini-cli`, `grok-build`, `hermes` | Named integrations that speak ACP internally, where the deployment offers them | | `acp` | Any agent speaking the [Agent Client Protocol](/cli/acp-agents), on deployments that enable Custom (ACP) | `devin-cloud` has no local runtime: Kylon calls Cognition's cloud API with the credentials you enter, so no gateway runs for it. The retired `generic` provider and its directory-local registration commands are no longer a setup path. See [Providers](/cli/providers). ## How an agent acts on the workspace Regardless of where it runs, an agent works on the workspace through the same command surface: [`kylon workspace`](/cli/workspace) for resources (rooms, tables, files, workflows, …) and the [proxy](/concepts/connections) for connected tools and model calls. # Connections & Proxy Source: https://docs.kylon.io/concepts/connections Connected tools, model APIs, and the proxy that authenticates them. A **connection** links a workspace agent to an external toolkit or provider — a SaaS integration, a data source, or a model vendor — so the agent can act through it with managed auth and billing. ## The proxy The **proxy** is the single authenticated surface agents use to reach connected tools, model providers, and selected external data providers. It centralizes: * Authentication (the `pak_` [API key](/concepts/workspace#api-keys)). * Billing and credit preflight. * Permission and access checks. * Request attribution. * Provider-specific request routing. Because the proxy handles auth and billing uniformly, an agent uses one credential and one base URL rather than managing per-vendor secrets. ## What the proxy covers * **Tools API** — search toolkits, authorize, inspect, and execute connected tools. See [Tools API](/proxy/tools-api). * **App Connection API** — use source-agent connections from server-side App code. See [App Connection API](/proxy/app-connections). * **Model APIs** — OpenAI-, Anthropic-, Gemini-, and other-compatible model routes. See [Model APIs](/proxy/model-apis). * **Provider APIs** — non-model data providers. See [Provider APIs](/proxy/provider-apis). Start at the [Proxy Overview](/proxy/overview). # Database & Custom Apps Source: https://docs.kylon.io/concepts/database-apps Turn a table into a backed application with its own database and contract. An **App** is a canonical data application built from workspace tables. Where a [table](/concepts/tables) is raw structured data, an App wraps it with a backing database, a typed contract, and a hosted surface — so agents and people can operate it like a real product, not just a spreadsheet. ## Database Apps vs Custom Apps * **Database App** — a table promoted to an app with its own managed database. This is the path when you start from data and want durable, queryable, app-backed storage. * **Custom App** — a generated application surface with its own contract and views on top of workspace data. ## Lifecycle A typical progression: 1. Start from a [table](/concepts/tables). 2. Inspect the upgrade with `app upgrade-plan` / `table upgrade-plan`. 3. Promote it with `table upgrade-to-app`. 4. Operate the App: `app list`, `app show <app_id>`, and data views via `app data-view`. ## Reference The full command surface — creating, showing, listing, configuring, and operating Apps and their data views — is documented in [`kylon workspace app`](/cli/workspace). It is the largest workspace subcommand, so prefer the generated reference over memorizing flags. # Follow-ups Source: https://docs.kylon.io/concepts/followups One-shot scheduled callbacks for reminders and check-backs. A **follow-up** is a durable, one-shot scheduled callback for a room's agent. Use one whenever you promise to ping, remind, or check back later. A natural-language acknowledgement is not enough — the promise is only scheduled once the follow-up is created and returns an ID. ```bash theme={null} kylon workspace followup create \ --in 2h \ --message "Check whether the deploy finished and report status." \ --notify-users <user_id> ``` You can schedule with an absolute time (`--at <iso_timestamp>`) or a relative duration (`--in <duration>`), optionally targeting a thread. ## Follow-ups vs workflows Follow-ups fire **once**. They do not recur, and they do not watch rows, threads, workflows, webhooks, or external resources for changes. * Reminder or single check-back → **follow-up**. * Recurring schedule, row-change/webhook trigger, reusable multi-step automation, or durable run history → [**workflow**](/concepts/workflows). If the task is "keep checking until something changes," the follow-up must explicitly decide whether to schedule the next follow-up and when to stop. <Note> `followup` is part of the in-workspace agent command surface (`workspace_cli`), not the external `kylon workspace` CLI. </Note> # Memory Source: https://docs.kylon.io/concepts/memory Durable agent and workspace knowledge that survives across turns and sessions. **Memory** is durable, file-backed knowledge that persists across turns and sessions. It is how an agent remembers preferences, procedures, and facts without re-deriving them each time. Memory is read fresh each turn; canonical files are updated, never created or deleted ad hoc. ## Scopes * **Agent memory** — an agent's persona plus its structured, private memory entries. Read with `memory read --scope agent` (optionally `--agent <id>` to read another agent's). * **Shared / knowledge** — the workspace knowledge index, shared across agents. Read with `memory read --scope shared` (or `knowledge`). Room-local context does not live in memory — use conversation history for that. ## Structured entries Durable agent memories are validated **entries** with a type, title, description, and markdown body: ```bash theme={null} kylon workspace memory entry add \ --type preference \ --title "Reporting cadence" \ --description "How often to post status" \ --body "Post a weekly status every Monday." ``` Entry types are `preference`, `feedback`, `procedure`, `reference`, and `context`. Choosing the right type keeps recall relevant. Read a single entry with `memory entry read <slug>`. <Note> Memory is part of the in-workspace command surface. `memory` commands run through the agent's `workspace_cli` tool; the reference lives with the agent runtime rather than in the external CLI reference. </Note> # Core Concepts Source: https://docs.kylon.io/concepts/overview The public Kylon concepts behind the CLI, workspace commands, and proxy APIs. Kylon is an AI-native workspace where people and agents collaborate as peers. This section explains the concepts an agent (or a developer building one) needs before using the CLI and proxy. Kylon exposes two developer-facing surfaces: * **The Kylon CLI** connects local agent runtimes to a workspace and gives agents command-line access to workspace resources through `kylon workspace`. * **The Kylon proxy** gives authenticated agents a stable API for connected tools, model providers, and selected external data providers. ## Foundations <CardGroup> <Card title="Workspace" href="/concepts/workspace"> The collaboration boundary for people, agents, rooms, and resources. </Card> <Card title="Agents & Runtime" href="/concepts/agents"> Agents, the gateway, and local provider runtimes. </Card> <Card title="Rooms & Threads" href="/concepts/rooms"> Where conversations and work happen. </Card> <Card title="Connections & Proxy" href="/concepts/connections"> Connected tools, model APIs, and the proxy. </Card> </CardGroup> ## Working with data and automation <CardGroup> <Card title="Tables" href="/concepts/tables"> Structured workspace data: tables, fields, rows, and views. </Card> <Card title="Database & Custom Apps" href="/concepts/database-apps"> Turn a table into a backed application with its own database. </Card> <Card title="Workflows" href="/concepts/workflows"> Reusable, triggered, multi-step automations with run history. </Card> <Card title="Follow-ups" href="/concepts/followups"> One-shot scheduled callbacks for reminders and check-backs. </Card> <Card title="Memory" href="/concepts/memory"> Durable agent and workspace knowledge that survives across turns. </Card> <Card title="Timeline" href="/concepts/timeline"> The notification feed of mentions and thread replies. </Card> </CardGroup> Every `kylon workspace` subcommand has a generated reference under [Workspace commands](/cli/workspace). # Rooms & Threads Source: https://docs.kylon.io/concepts/rooms The conversation contexts where people and agents collaborate. A **room** is a conversation context, and the primary place people and agents collaborate. Workspace commands that read or write room-specific resources use an explicit room scope, usually `--scope-room <room_id>`. Each room has one main agent and one bound main session. A normal human message activates that room's main session; newer activations supersede older ones on the same session. ## Threads A **thread** is a focused sub-conversation rooted at a message inside a room. Threads keep a topic self-contained without creating a separate room. Thread history is room-local unless branch lineage explicitly extends it. Use [`kylon workspace thread`](/cli/workspace/thread) to create, fetch, and reply to threads. ## Direct messages Direct messages (DMs) are private rooms between members. They use the same message and thread commands as public rooms. ## Choosing where work goes * Behavior local to one conversation belongs in the room's main flow. * To create a new foreground context, branch the room. * Work that belongs in an existing room should be handed off there. See [`kylon workspace room`](/cli/workspace/room) and [`kylon workspace message`](/cli/workspace/message). # Tables Source: https://docs.kylon.io/concepts/tables Structured workspace data — tables, fields, rows, and views. A **table** is structured, workspace-scoped data: a set of typed **fields** (columns) and **rows** (records). Tables are the foundation for tracking work, and they are what a [Database or Custom App](/concepts/database-apps) is built on. ## Fields Fields define the schema of a table — each has an ID, a type, and configuration. Manage them with [`kylon workspace field`](/cli/workspace). ## Rows Rows are the records in a table. Create, read, update, and delete them with [`kylon workspace row`](/cli/workspace). Row-level changes can also trigger [workflows](/concepts/workflows). ## Views A **view** is a saved filter, sort, grouping, and column layout over a table. Views let different consumers see the same data shaped for their needs without duplicating it. Filters use a structured JSON DSL, for example: ```json theme={null} { "filters": [{ "field_id": "priority", "operator": "eq", "value": "P0" }], "sorts": [{ "field_id": "amount", "direction": "desc" }], "group_by": { "field_id": "region" } } ``` Use manifest field IDs exactly (snake\_case). See [`kylon workspace table`](/cli/workspace) and [`kylon workspace field`](/cli/workspace). # Timeline Source: https://docs.kylon.io/concepts/timeline The notification feed of mentions and thread replies across rooms. The **timeline** is an agent's notification Feed — mentions and thread replies gathered across every room it can access. It is how an agent notices what needs attention without polling each room. Typical use: * `timeline list [--unread] [--limit <n>]` — list Feed items across rooms (default 20, max 50). * `timeline count` — total unread across the Feed. * `timeline get <id>` — full context for one item: summary, latest update, thread target, root message, and replies. * `timeline read <id>` / `timeline read-all` — mark items read. <Warning> Mark a Feed item read only after the user has acknowledged its content — not merely after the agent has looked at it. </Warning> <Note> `timeline` is part of the in-workspace agent command surface (`workspace_cli`), not the external `kylon workspace` CLI. </Note> # Workflows Source: https://docs.kylon.io/concepts/workflows Reusable, triggered, multi-step automations with durable run history. A **workflow** is a reusable, multi-step automation with a durable configuration and run history. Workflows are the right tool for anything recurring or event-driven — as opposed to a one-time [follow-up](/concepts/followups). Use a workflow when you need: * **Recurring schedules** — run on a cadence. * **Event triggers** — react to row changes or inbound webhooks. * **Reusable multi-step automations** — a defined sequence you run repeatedly. * **Durable run history and configuration** — inspect past runs and outcomes. Do not create a workflow just to remind or ping once; use a [follow-up](/concepts/followups) for that. ## Triggers Workflows can be triggered manually, on a schedule, by [row](/concepts/tables) changes, or by webhooks. Each run produces an inspectable record. ## Reference List, create, update, trigger, pause, resume, archive, and inspect runs with [`kylon workspace workflow`](/cli/workspace). # Workspace Source: https://docs.kylon.io/concepts/workspace The collaboration boundary that scopes every agent, resource, and API key. A **workspace** is the collaboration boundary for people, agents, rooms, files, tables, workflows, and connected tools. Everything in Kylon belongs to exactly one workspace, and every resource is scoped to it — there are no cross-workspace reads or writes. API keys and CLI sessions are always scoped to a single workspace. Most `kylon workspace` commands therefore take an explicit workspace scope: ```bash theme={null} kylon workspace <subcommand> ... --scope-workspace <workspace_id> ``` For manual CLI use, the workspace can come from saved CLI auth instead of the flag. Room-specific commands additionally take `--scope-room <room_id>`. ## Members A workspace has two kinds of members: * **People** — human members with roles and permissions. * **Agents** — non-human members that receive work and act through the CLI or API. See [Agents & Runtime](/concepts/agents). ## API keys Kylon API keys start with `pak_`. They authenticate an agent or workspace service when calling the proxy, using either the `x-api-key` header or `Authorization: Bearer`. A key never grants access outside its workspace. See [Authentication](/authentication). # Connect a LINE Official Account Source: https://docs.kylon.io/connections/line-official-account Connect a LINE Messaging API channel so Kylon can receive new messages through a verified webhook. Kylon connects to LINE through a bring-your-own LINE Official Account. You provide the account's **Channel Secret** and **Channel Access Token**. Kylon uses them to identify the Official Account, configure its webhook URL, verify webhook delivery, and send messages through the LINE Messaging API. ## Before you start You need: * Admin access to a LINE Official Account. * Access to its matching Messaging API channel in the [LINE Developers Console](https://developers.line.biz/console/). * A Channel Secret from the account's Basic settings. * A Channel Access Token from the Messaging API tab. If the account does not have a Messaging API channel yet, enable the Messaging API in LINE Official Account Manager. LINE creates the corresponding channel in the LINE Developers Console. ## Find the credentials <Steps> <Step title="Open the LINE Official Account"> Sign in to [LINE Official Account Manager](https://manager.line.biz/) and open the account you want to connect. <img alt="LINE Official Account Manager account list" /> </Step> <Step title="Copy the Channel Secret"> Open **Settings** > **Messaging API**. Copy the Channel Secret, or open the matching channel in the LINE Developers Console and copy it from **Basic settings**. </Step> <Step title="Issue a Channel Access Token"> Open the matching channel in the [LINE Developers Console](https://developers.line.biz/console/), choose **Messaging API**, and issue or copy a Channel Access Token. The token is not shown in LINE Official Account Manager. If necessary, match the numeric Channel ID in both products to make sure you opened the same account. </Step> </Steps> <Warning> The Channel Secret, Channel ID, and Channel Access Token are different values. A Channel Secret is commonly a 32-character value. A Channel ID is numeric. A Channel Access Token is an opaque token and is usually much longer. Do not paste the Channel ID into either Kylon field. </Warning> ## Create the Kylon connection You can start setup from either place: * Click the LINE setup action an agent sent in chat. * Open the agent's **Connections** page and choose **LINE Official Account**. Enter both required credentials: | Kylon field | LINE location | Purpose | | - | - | - | | Channel Secret | Official Account Manager, **Settings** > **Messaging API**, or Developers Console, **Basic settings** | Verifies that inbound webhook requests came from LINE. | | Channel Access Token | Developers Console, **Messaging API** | Identifies the Official Account, configures and verifies the webhook, sends messages, and retrieves message details. | When you submit the form, Kylon automatically: 1. Checks the Channel Access Token and reads the Official Account name. 2. Creates one pending connection. 3. Sets the Kylon webhook URL in LINE. 4. Tests the webhook endpoint. 5. Checks whether LINE reports webhook delivery as active. Kylon only shows **LINE connection created** after all checks pass. A successful setup does not require you to copy a webhook URL. <Note> If you close an unfinished chat setup, click the original agent action again to continue the same connection. Kylon does not create a duplicate. You can also repair a pending connection from its **Webhook** menu. </Note> ## Turn on Webhooks in LINE LINE's public Messaging API can set and test a webhook URL, but it cannot turn on the account's Webhooks switch. If Kylon asks you to enable webhooks, use either path below. ### LINE Official Account Manager 1. Open the Official Account. 2. Go to **Settings** > **Response settings**. 3. Turn on **Webhooks**. 4. Return to Kylon and click **Check again**. ### LINE Developers Console 1. Open the matching Messaging API channel. 2. Open the **Messaging API** tab. 3. Turn on **Use webhook**. 4. Return to Kylon and click **Check again**. **Check again** reads and tests the existing webhook. It does not create another connection or replace the URL. ## Manual URL setup Kylon displays a copyable webhook URL only when LINE rejects or cannot complete the automatic URL update. If Kylon shows **Set the webhook URL in LINE**: <Steps> <Step title="Copy the URL from Kylon"> Copy the URL shown in the setup dialog. The URL contains a private capability token; do not share it. </Step> <Step title="Paste it in LINE"> In the LINE Developers Console, open the channel's **Messaging API** tab. Edit **Webhook URL**, paste the exact Kylon URL, and save it. <img alt="LINE Developers Console webhook settings with Webhook URL, Verify, and Use webhook controls" /> </Step> <Step title="Enable delivery and check again"> Turn on **Use webhook**, return to Kylon, and click **Check again**. You do not need to create another connection. </Step> </Steps> ## Recommended response settings If Kylon should handle incoming messages: * Turn off LINE's automatic replies so they do not compete with the agent. * Keep Webhooks enabled. * To receive group or room messages, enable **Allow bot to join group chats** in the LINE Developers Console before inviting the Official Account. ## Message coverage After the connection is active, Kylon can receive new inbound messages from: * One-to-one chats with the Official Account. * Groups that the Official Account has joined. * Multi-person chats (rooms) that the Official Account has joined. A missing local Event does not prove that no LINE message exists. If Kylon reports that Event collection is unavailable, repair the webhook before relying on the local history. For LINE's event and conversation behavior, see [Receive messages](https://developers.line.biz/en/docs/messaging-api/receiving-messages/) and [Group and multi-person chats](https://developers.line.biz/en/docs/messaging-api/group-chats/). ## Verify or repair an existing connection Open the connection's menu and choose **Webhook**. The dialog shows the current status and the latest webhook activity. * Click the refresh icon to verify the existing URL, test the endpoint, and recheck the Webhooks switch. Verification does not change LINE's URL. * Choose **Reconfigure webhook** to replace invalid credentials or let Kylon restore a mismatched URL. * If the dialog reports a problem, follow its direct recommendation or open this setup guide. ## Troubleshooting | Symptom | What to do | | - | - | | Channel Access Token is invalid or expired | Issue or copy a current token from the channel's **Messaging API** tab, then re-enter it in Kylon. | | Channel Secret looks like a Channel ID | Use the Channel Secret from **Basic settings**, not the numeric Channel ID. | | Channel Access Token looks like a Channel Secret or Channel ID | Use the opaque token from **Messaging API**. Both fields are required. | | Kylon says Webhooks or Use webhook is off | Enable the switch in Official Account Manager or Developers Console, then click **Check again**. | | Kylon could not set the URL automatically | Copy the URL Kylon displays, paste it into LINE's **Webhook URL**, enable Webhooks, and click **Check again**. | | LINE is using a different webhook URL | Open **Webhook** in Kylon and choose **Reconfigure webhook** so Kylon can restore the URL. | | Endpoint verification fails | Confirm the Channel Secret belongs to the same Messaging API channel as the token, then reconfigure and verify again. | | Setup was closed before it finished | Click the original agent action again, or open the pending connection's **Webhook** menu. | | Messages do not appear in Kylon | Verify the connection, confirm Webhooks is on, and send a new message after the connection becomes active. Do not interpret an unhealthy connection's empty local history as "no messages." | | Group or room messages do not appear | Enable **Allow bot to join group chats**, invite the Official Account, and verify the webhook is active. | | Auto-replies appear instead of Kylon handling the message | Disable LINE's automatic reply features for the Official Account. | # Introduction Source: https://docs.kylon.io/introduction Build agents that work with Kylon workspaces, tools, and proxy APIs. Kylon helps teams connect agents to the work happening in their workspace. Agents can receive assignments, use connected tools, update workspace resources, and call supported proxy APIs through one authenticated surface. ## What is Kylon? Kylon gives agents the ability to: * **Connect to tools and services** through workspace-approved connections * **Run locally** with the Kylon CLI gateway for Codex, Claude Code, or custom runtimes * **Use workspace resources** such as rooms, threads, files, tables, workflows, and web projects * **Call proxy APIs** for connected tools, model providers, and supported data providers ## How it works <Steps> <Step title="Choose an integration path"> Use the CLI gateway for local agent execution, the workspace CLI for workspace operations, or the proxy APIs for programmatic access. </Step> <Step title="Authenticate"> Use a Kylon API key for API calls, or sign in with the CLI when working interactively. </Step> <Step title="Act in the workspace"> Send messages, manage threads, update tables, work with files, execute tools, and call proxy endpoints. </Step> </Steps> ## Choose your integration path <CardGroup> <Card title="CLI Gateway" icon="terminal" href="/cli/overview"> Connect a local agent runtime to a Kylon workspace. </Card> <Card title="Workspace CLI" icon="table" href="/cli/workspace"> Let agents inspect and update workspace resources from the command line. </Card> <Card title="Proxy APIs" icon="plug" href="/proxy/overview"> Call connected tools, model APIs, and supported external providers. </Card> </CardGroup> # App Connection API Source: https://docs.kylon.io/proxy/app-connections Use source-agent connections from server-side generated App code. Generated Kylon Apps can call connection-backed APIs from server-side App code. Use this when an App needs to read or update data through the same connections the source agent can use, such as Gmail, Google Calendar, Google Drive, Slack, Notion, or another linked integration. ## Connection access surfaces | Use case | Recommended surface | | - | - | | The agent is working in chat | Built-in tools: `list_connections`, `search_connection_tools`, and `execute_connection_tool` | | The agent is running code, a script, workflow, or automation | `/proxy/tools/*` with `KYLON_API_TOKEN` | | A generated App needs connection data | `/api/build-apps/{app_id}/connections/*` from server-side App code | Do not expose `KYLON_API_TOKEN` or connection data fetches directly in browser client code. Put connection calls behind an App server route or server action. ## App endpoint model App connection endpoints are mounted on the main Kylon API base: ```text theme={null} {KYLON_API_BASE}/api/build-apps/{KYLON_APP_ID}/connections ``` Generated Apps receive these environment variables after deployment: | Variable | Purpose | | - | - | | `KYLON_API_BASE` | Main Kylon API base URL | | `KYLON_APP_ID` | Current App project ID | | `KYLON_API_TOKEN` | Source agent API key for server-side agent proxy calls | The App connection endpoints are visitor-authenticated. When a browser user opens an App, Kylon's generated App middleware creates a `p2-app-{app_id}` auth cookie after checking the App's visibility and user access. Server-side App code should forward the incoming request cookie when calling the App connection endpoints. <Warning> Keep `KYLON_API_TOKEN` server-side only. It can be useful when server-side App code needs the agent-level `/proxy/tools/*` API, but it should never be sent to the browser. </Warning> ## List source-agent connections ```ts theme={null} export async function GET(request: Request) { const apiBase = process.env.KYLON_API_BASE; const appId = process.env.KYLON_APP_ID; const response = await fetch(`${apiBase}/api/build-apps/${appId}/connections`, { headers: { cookie: request.headers.get("cookie") ?? "", }, cache: "no-store", }); return Response.json(await response.json(), { status: response.status }); } ``` The response contains the connections linked to the App's source agent: ```json theme={null} { "connections": [ { "connection_id": "conn_123", "backend": "composio", "toolkit": "gmail", "remote_user": "person@example.com", "label": "Work Gmail", "created_at": "2026-06-21T15:00:00.000Z" } ] } ``` ## Execute a connection tool Use the exact tool slug and schema-shaped arguments returned by tool discovery. For generated Apps, the agent should normally discover the correct slug while building the App by using `search_connection_tools` or the `/proxy/tools` toolkit search endpoints. ```ts theme={null} export async function POST(request: Request) { const apiBase = process.env.KYLON_API_BASE; const appId = process.env.KYLON_APP_ID; const { connectionId, tool, args } = await request.json(); const response = await fetch( `${apiBase}/api/build-apps/${appId}/connections/${connectionId}/tools/execute`, { method: "POST", headers: { "content-type": "application/json", cookie: request.headers.get("cookie") ?? "", }, body: JSON.stringify({ tool, arguments: args ?? {}, }), cache: "no-store", }, ); return Response.json(await response.json(), { status: response.status }); } ``` Request body: | Field | Required | Description | | - | - | - | | `tool` | Yes | Exact connection tool slug | | `arguments` | No | Tool input object matching the tool schema | ## Native connection proxy For supported native toolkits, server-side App code can proxy an HTTP request through the linked connection: ```ts theme={null} await fetch(`${apiBase}/api/build-apps/${appId}/connections/${connectionId}/proxy`, { method: "POST", headers: { "content-type": "application/json", cookie: request.headers.get("cookie") ?? "", }, body: JSON.stringify({ toolkit: "github", method: "GET", url: "https://api.github.com/user/repos", }), cache: "no-store", }); ``` Request body: | Field | Required | Description | | - | - | - | | `toolkit` | Yes | Toolkit slug | | `method` | Yes | HTTP method | | `url` | Yes | Target provider URL | | `headers` | No | Additional request headers | | `body` | No | Request body | <Note> Hosted provider connections, including Composio-backed connections, usually do not support arbitrary raw provider URLs. Use tool execution unless the toolkit is documented as native proxy-capable. </Note> ## Safety model App connection access follows the existing App permission model: * The App can only see connections linked to its source agent. * The App visitor must pass the App's auth and visibility checks. * Provider credentials are not returned to the App. * Responses are marked `no-store`. * Server-side App code is responsible for not returning sensitive provider data to viewers who should not see it. If an App becomes visible to more users, connection-backed App routes can also be reached by that broader audience. Review server-side routes before changing App visibility. # Proxy Authentication Source: https://docs.kylon.io/proxy/authentication Authenticate proxy calls with Kylon API keys. All proxy requests require a Kylon API key. ## Headers Use either `x-api-key`: ```bash theme={null} curl https://api.kylon.io/proxy/tools/connections \ -H "x-api-key: pak_your_key_here" ``` Or `Authorization: Bearer`: ```bash theme={null} curl https://api.kylon.io/proxy/tools/connections \ -H "Authorization: Bearer pak_your_key_here" ``` ## Accepted key types | Key owner | Use case | | - | - | | Agent | Normal agent calls to tools, models, and providers | | Workspace service | Service-level automation for a workspace | Agent keys are associated with one Kylon agent. Workspace service keys are associated with one workspace. ## Request attribution Kylon can attribute proxy usage to workspace context such as an agent, room, thread, workflow, and activation. When the CLI or Kylon runtime calls the proxy, this context is usually supplied automatically. For direct API calls, these optional headers can provide workspace context: | Header | Description | | - | - | | `x-channel-id` | Channel associated with the request | | `x-thread-root-message-id` | Thread associated with the request | | `x-triggered-by-user-id` | User who triggered the request | These headers are for attribution. They do not grant additional access. ## Permission checks Provider-specific routes may require the agent to have access to a matching Kylon skill or capability. If access is missing, the proxy returns `401` with a message explaining that the required skill is not available. Common provider gates: | Route family | Required access | | - | - | | `/proxy/apify/*` | Apify access | | `/proxy/apollo/*` | Apollo access | | `/proxy/elevenlabs/*` | ElevenLabs access | | `/proxy/fastmoss/*` | FastMoss access | | `/proxy/flightradar24/*` | Flightradar24 access | | `/proxy/logo-dev/*` | Logo.dev access | | `/proxy/places/*` | Places access | | `/proxy/scrapecreators/*` | Social media scraper access | | `/proxy/seedance/*` | Seedance access | | `/proxy/ahrefs/*` | Ahrefs access | | `/proxy/brightdata/*` | Brightdata access | | `/proxy/exa/*` | Exa access | | `/proxy/pagespeed/*` | Website Audit access | | `/proxy/seedance-2/*` | Seedance 2 access | | `/proxy/thankyouai/*` | Image generation, Seedance 2, or media effects access, depending on the requested model | | `/proxy/web_search` | Built-in web search access; no separate provider skill is required | | `/proxy/treg/*` | No separate provider skill is required | Model proxy and tools endpoints still require a valid Kylon key and may perform their own provider or connection checks. <Note> Certain Apify actor runs for social-media scraping also accept the social media scraper skill in place of a dedicated Apify skill. </Note> # Proxy Billing Source: https://docs.kylon.io/proxy/billing How Kylon accounts for proxy usage. Kylon proxy calls are checked and recorded against workspace credits where applicable. ## Preflight checks Before a proxy request is sent to a provider, Kylon may check: * Whether the workspace has enough credits * Whether the request is allowed by a script-level credit policy * Whether the agent has access to the requested provider capability If a credit check fails, the proxy returns `402 payment_required`. ## Fixed-cost endpoints Some endpoints have fixed credit costs. Examples include: | Endpoint family | Typical fixed cost behavior | | - | - | | Tools execute/proxy | Fixed low-cost request accounting | | Google-style search helpers | Fixed low-cost request accounting | | Apollo search/enrich endpoints | Fixed per-request accounting | | FastMoss endpoints | Fixed per-request accounting by endpoint | | Places endpoints | Fixed per-request accounting | | Logo.dev endpoints | Fixed per-request accounting | | ScrapeCreators endpoints | Provider response may include its own credit estimate, with a default fallback | | Flightradar24 endpoints | Fixed per-request accounting; estimated provider usage is recorded when available | | PageSpeed endpoints | Fixed per-request accounting | ## Dynamic-cost endpoints Some providers are accounted from returned usage: | Provider family | Usage signal | | - | - | | OpenAI-compatible model routes | Token and image usage | | Anthropic-compatible model routes | Token usage | | Gemini-compatible model routes | Token and media usage metadata | | Cerebras-compatible model routes | Token usage | | OpenRouter model routes | Token usage | | ElevenLabs-compatible routes | Character usage | | Apify actor runs | Actor compute units | | Seedance video generation | Estimated video compute units | | Ahrefs endpoints | API units reported by Ahrefs | | Bright Data endpoints | Configured endpoint cost multiplied by request or result usage units | | Exa enrichment and web search | Provider-reported dollar cost converted to credits | | Seedance 2 endpoints | Estimated model, resolution, duration, and media usage | | ThankYouAI media endpoints | Provider quote converted to credits before generation | | Treg call endpoints | Provider-reported cost converted to credits; catalog reads are not charged | ## Streaming requests For streaming model requests, Kylon records usage after the stream completes or disconnects. If the client disconnects, the request is stopped and recorded as disconnected. ## Error accounting Failed provider requests are still recorded with status code, provider, endpoint, model when available, and a short error summary. This helps teams understand which calls are failing and why. # API error codes Source: https://docs.kylon.io/proxy/error-codes Numeric error codes the Kylon API returns, with HTTP status and default message. Every Kylon API error carries a numeric `code` and a default `message`. Codes are grouped into ranges by category. This page is generated from the API error-code manifest, so it matches the codes the API returns. ## Request / validation (1000-1999) | Code | Name | HTTP | Message | | - | - | - | - | | 1000 | `INVALID_INPUT` | 400 | Invalid input | | 1001 | `DIRECT_MESSAGE_MEMBERSHIP_FIXED` | 400 | Direct message membership is fixed | | 1002 | `THREAD_TARGET_UNSUPPORTED` | 400 | Thread target is not supported | | 1003 | `EXPORT_FORMAT_UNSUPPORTED` | 400 | This file cannot be exported to the requested format | | 1004 | `APP_HANDOFF_CODE_INVALID` | 400 | Invalid or expired sign-in code | | 1005 | `WORKFLOW_CODE_INVALID` | 400 | Workflow code failed to compile | | 1006 | `VOICE_PHONE_NUMBER_REQUIRED` | 400 | Add a phone number before starting a voice call | | 1007 | `SIGNUP_HANDOFF_LINK_UNAVAILABLE` | 400 | This link is no longer available | | 1008 | `REMOTE_MCP_DCR_UNSUPPORTED` | 400 | This server does not support dynamic client registration. Turn it off and enter a Client ID. | | 1009 | `REMOTE_MCP_PKCE_UNSUPPORTED` | 400 | This server's OAuth configuration does not support the required S256 PKCE method. Ask the server owner to enable S256 PKCE or use another MCP server. | ## Authentication / authorization (2000-2999) | Code | Name | HTTP | Message | | - | - | - | - | | 2000 | `AUTH_REQUIRED` | 401 | Authentication required | | 2001 | `ACCESS_DENIED` | 403 | Access denied | | 2002 | `CLIENT_SESSION_REQUIRED` | 401 | Client session required | | 2003 | `CLIENT_SESSION_INVALID` | 401 | Client session is no longer valid | | 2004 | `ACCOUNT_SUSPENDED` | 403 | This account is suspended | | 2005 | `WORKSPACE_SUSPENDED` | 403 | This workspace is suspended | | 2006 | `SIGNUP_HANDOFF_LINK_NOT_CLAIMABLE` | 403 | This link cannot be claimed with this account | ## Not found (3000-3999) | Code | Name | HTTP | Message | | - | - | - | - | | 3000 | `RESOURCE_NOT_FOUND` | 404 | Resource not found | | 3001 | `CHANNEL_AGENT_NOT_FOUND` | 404 | Room agent not found | | 3002 | `ENDPOINT_RETIRED` | 410 | Endpoint has been retired | | 3010 | `APP_RELEASE_NOT_FOUND` | 404 | App release not found | | 3011 | `APP_DOWNLOAD_ARTIFACT_NOT_FOUND` | 404 | App download artifact not found | | 3012 | `SIGNUP_HANDOFF_LINK_NOT_FOUND` | 404 | This link was not found | | 3013 | `TABLE_RESOURCE_RETIRED` | 410 | This structured data resource has moved to a Database App | ## Conflict / invalid state (4000-4999) | Code | Name | HTTP | Message | | - | - | - | - | | 4000 | `CONFLICT` | 409 | Conflict | | 4001 | `WORKSPACE_MEMBER_ALREADY_EXISTS` | 409 | User is already a workspace member | | 4002 | `WORKSPACE_PAYMENT_REQUIRED` | 402 | Workspace credit is required | | 4003 | `WORKSPACE_SETUP_IN_PROGRESS` | 409 | Workspace setup is already in progress | | 4010 | `APP_RELEASE_IMMUTABLE` | 409 | App release is immutable after the edit window | | 4011 | `APP_RELEASE_INVALID_SIGNATURE` | 409 | App release signature is invalid | | 4012 | `APP_STORE_LISTING_NOT_LIVE` | 409 | App store listing is not live | | 4013 | `TOOL_APPROVAL_REQUIRED` | 428 | Tool approval is required | | 4014 | `EXPORT_NOT_READY` | 409 | The export is not ready yet | | 4015 | `AGENT_INVOCATION_FANOUT_LIMIT` | 429 | Too many concurrent sub-agent invocations in flight | | 4020 | `BILLING_ENTITLEMENT_LIMIT_REACHED` | 403 | Billing plan limit reached | | 4021 | `WEB_HANDOFF_RATE_LIMITED` | 429 | Too many sign-in handoff requests | | 4022 | `APP_HANDOFF_RATE_LIMITED` | 429 | Too many sign-in handoff requests | | 4023 | `BILLING_PLAN_CHANGE_QUOTE_STALE` | 409 | The amount due for this plan change has changed. Review the updated amount and confirm again. | | 4024 | `REFERRAL_SIGNUP_RATE_LIMITED` | 429 | Too many signup requests. Try again later. | | 4025 | `VOICE_OUTBOUND_CALL_RATE_LIMITED` | 429 | Too many phone calls placed recently. Try again later. | | 4026 | `AGENT_TURN_NOT_RUNNING` | 409 | This agent turn is no longer running | | 4027 | `EXTERNAL_AGENT_OPERATOR_ACK_REQUIRED` | 409 | This agent runs in an environment managed by its operator, and the operator cannot read this room. Confirm that room content may be processed there before adding the agent. | | 4028 | `UI_CARD_INTERACTION_LIMIT_REACHED` | 409 | This card has reached its response limit | | 4029 | `SUPPORT_REPORT_RATE_LIMITED` | 429 | Too many reports from this device. Try again later. | | 4030 | `API_KEY_RATE_LIMITED` | 429 | Too many requests from this API credential. Retry after the interval in the Retry-After header. | | 4031 | `API_KEY_QUOTA_EXCEEDED` | 429 | This API credential has used its daily request quota. Retrying will not succeed until the quota resets. | ## Internal / unknown (5000-5999) | Code | Name | HTTP | Message | | - | - | - | - | | 5000 | `INTERNAL_SERVER_ERROR` | 500 | Internal server error | | 5001 | `AUTH_PROVIDER_UNAVAILABLE` | 503 | The authentication provider is temporarily unavailable | | 5002 | `MODEL_PROVIDER_UNAVAILABLE` | 503 | No model credential is configured for this operation | | 5003 | `REMOTE_MCP_SERVER_UNREACHABLE` | 502 | Could not reach the MCP server. Check the server URL and try again. | | 5004 | `REMOTE_MCP_SERVER_REJECTED` | 502 | The MCP server rejected the connection request. Check its authentication requirements and request headers. | | 5005 | `REMOTE_MCP_PROTOCOL_ERROR` | 502 | The server did not respond as a compatible MCP server. Check that the URL points to a Streamable HTTP MCP endpoint. | | 5006 | `REMOTE_MCP_OAUTH_DISCOVERY_FAILED` | 502 | The server requires OAuth, but its authorization configuration could not be discovered. Check the server's OAuth metadata. | | 5007 | `REMOTE_MCP_DCR_FAILED` | 502 | The server rejected dynamic client registration. Turn it off and enter credentials for a pre-registered OAuth client. | | 5008 | `REMOTE_MCP_OAUTH_START_FAILED` | 502 | OAuth authorization could not be started for this server. Check its authorization configuration. | # Proxy Errors Source: https://docs.kylon.io/proxy/errors Common proxy error shapes and how to respond. Kylon proxy endpoints return provider-compatible errors where practical. Shared proxy errors use a small JSON shape. ## Missing or invalid API key ```json theme={null} { "error": "unauthorized", "message": "Missing API key" } ``` or: ```json theme={null} { "error": "unauthorized", "message": "Invalid API key" } ``` Fix: pass a valid Kylon key using `x-api-key` or `Authorization: Bearer`. ## Missing provider access ```json theme={null} { "error": "unauthorized", "message": "No access to the required skill. Please check the agent skill settings." } ``` Fix: enable the required provider capability for the agent, or call an endpoint the agent is allowed to use. ## Missing request fields Some endpoints validate required fields directly: ```json theme={null} { "error": "Missing required fields: toolkit, method, url" } ``` Fix: check the endpoint documentation and include the required fields. ## Payment required ```json theme={null} { "error": "payment_required", "code": "payment_required", "message": "Workspace credits are unavailable or exhausted", "details": {} } ``` Fix: add credits, reduce usage, or retry after a script-level limit resets. ## Provider errors Buffered provider proxy routes generally return: ```json theme={null} { "error": "proxy_error", "message": "Provider error message" } ``` Model-compatible routes may return provider-shaped errors instead, such as OpenAI-style or Anthropic-style error objects. ## Retry guidance | Status | Recommended action | | - | - | | `400` | Fix the request shape or missing fields | | `401` | Check API key and provider access | | `402` | Check credits or script-level credit policy | | `429` | Back off and retry with jitter | | `499` | Client disconnected; retry if still needed | | `5xx` | Retry with exponential backoff if the operation is idempotent | ## Full error-code reference Kylon API errors carry a numeric `code` alongside the message. Every code, its name, HTTP status, and default message is listed in the [API error codes](/proxy/error-codes) reference — generated directly from the API's error-code manifest, so it always matches what the API returns. # Model Proxy APIs Source: https://docs.kylon.io/proxy/model-apis Call supported model providers through the Kylon proxy. Kylon exposes provider-compatible model routes under `/proxy`. Use the same Kylon API-key authentication as other proxy calls. ## OpenAI-compatible routes | Method | Path | Notes | | - | - | - | | `POST` | `/proxy/openai/v1/chat/completions` | Chat Completions-compatible requests, including streaming | | `POST` | `/proxy/openai/v1/responses` | Responses API-compatible requests, including streaming | | `POST` | `/proxy/openai/v1/images/generations` | Image generation | | `POST` | `/proxy/openai/v1/images/edits` | Image edits with JSON or multipart form data | Example: ```bash theme={null} curl -s https://api.kylon.io/proxy/openai/v1/responses \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "input": "Summarize this customer request in one paragraph." }' ``` ## Anthropic-compatible routes | Method | Path | Notes | | - | - | - | | `POST` | `/proxy/anthropic/v1/messages` | Anthropic Messages-compatible requests, including streaming | | `POST` | `/proxy/anthropic-vertex/v1/messages` | Same request shape through an alternate supported provider route | Example: ```bash theme={null} curl -s https://api.kylon.io/proxy/anthropic/v1/messages \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-6", "max_tokens": 512, "messages": [{"role": "user", "content": "Draft a concise launch note."}] }' ``` ## Gemini-compatible routes | Method | Path | Notes | | - | - | - | | Any | `/proxy/gemini` | Gemini proxy root | | Any | `/proxy/gemini/*` | Gemini-compatible upstream paths | | `POST` | `/proxy/gemini/files/upload-urls` | Upload URL helper | | `POST` | `/proxy/gemini/file-understanding` | File understanding helper | | `POST` | `/proxy/gemini/video-audio-understanding` | Video/audio understanding helper | ## Cerebras-compatible route | Method | Path | Notes | | - | - | - | | `POST` | `/proxy/cerebras/v1/chat/completions` | Chat Completions-compatible requests | ## OpenRouter route | Method | Path | Notes | | - | - | - | | `POST` | `/proxy/openrouter/v1/chat/completions` | Chat Completions-compatible requests routed through OpenRouter | Use the OpenRouter route to access a broad catalog of third-party models with a single Kylon API key. Example: ```bash theme={null} curl -s https://api.kylon.io/proxy/openrouter/v1/chat/completions \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "model": "moonshotai/kimi-k2", "messages": [{"role": "user", "content": "Hello from Kylon."}] }' ``` ## ElevenLabs-compatible routes | Method | Path | Notes | | - | - | - | | Any | `/proxy/elevenlabs` | ElevenLabs proxy root | | Any | `/proxy/elevenlabs/*` | ElevenLabs-compatible upstream paths | <Note> ElevenLabs routes require the ElevenLabs skill to be enabled for your agent. See [Proxy Authentication](/proxy/authentication) for the full list of provider gates. </Note> ## Streaming OpenAI-compatible, Anthropic-compatible, Gemini-compatible, Cerebras-compatible, and OpenRouter routes support streaming where the provider route supports it. If the client disconnects during a stream, Kylon stops the upstream request and records the request as disconnected. ## Usage accounting Model routes compute credits from usage when provider usage data is available. See [Proxy Billing](/proxy/billing). # Proxy Overview Source: https://docs.kylon.io/proxy/overview Use Kylon proxy APIs for tools, model providers, and supported data providers. The Kylon proxy is the stable API surface for agents that need to call connected tools, model providers, or supported external data providers. All proxy endpoints share the same public contract: * Authenticate with a Kylon API key * Check workspace permissions and provider access * Attribute usage to the workspace and agent * Check credits before the request when required * Record request status, usage, and errors * Return provider-compatible responses where possible ## Base URL ```text theme={null} https://api.kylon.io ``` Proxy routes are mounted under: ```text theme={null} /proxy ``` ## Main endpoint families | Family | Purpose | | - | - | | `/proxy/tools/*` | Search toolkits, start auth, inspect tools, execute connected tools, and proxy native toolkit requests | | `/proxy/openai/*` | OpenAI-compatible chat, responses, and image endpoints | | `/proxy/anthropic/*` | Anthropic Messages API | | `/proxy/anthropic-vertex/*` | Anthropic Messages API through a supported hosted provider route | | `/proxy/gemini/*` | Gemini-compatible model and media endpoints | | `/proxy/cerebras/*` | Cerebras chat completions | | `/proxy/openrouter/*` | OpenRouter chat completions (access to a wide range of third-party models) | | `/proxy/elevenlabs/*` | ElevenLabs-compatible voice endpoints | | `/proxy/apify/*` | Apify store, actors, runs, datasets, logs, aborts, and key-value records | | `/proxy/apollo/*` | Apollo people, company, organization, and news endpoints | | `/proxy/fastmoss/*` | FastMoss creator, shop, product, video, and live endpoints | | `/proxy/flightradar24/*` | Flight position, summary, track, event, airline, and airport endpoints | | `/proxy/logo-dev/*` | Logo lookup, search, and company description | | `/proxy/places/*` | Places autocomplete, search, nearby, directions, details, photo, and resolve endpoints | | `/proxy/scrapecreators/*` | Instagram and TikTok profile, post, video, search, song, comment, and transcript endpoints | | `/proxy/seedance/*` | Seedance video generation endpoints | | `/proxy/ahrefs/*` | Ahrefs proxy endpoints | | `/proxy/brightdata/*` | Bright Data search, scraping, extraction, discovery, and dataset endpoints | | `/proxy/exa/*` | Exa proxy endpoints | | `/proxy/pagespeed/*` | PageSpeed Insights audit endpoint | | `/proxy/seedance-2/*` | Seedance 2 video generation endpoints | | `/proxy/thankyouai/*` | ThankYouAI image, video, effects, and vision media endpoints | | `/proxy/web_search` | Built-in Exa-backed web search endpoint | | `/proxy/treg/*` | Treg proxy endpoints | ## Typical tools workflow ```text theme={null} 1. Search toolkits GET /proxy/tools/search?keywords=gmail 2. Start auth POST /proxy/tools/auth 3. User completes OAuth Open returned redirect URL 4. Verify connection GET /proxy/tools/connections 5. Inspect tools GET /proxy/tools/toolkit/gmail 6. Execute tool POST /proxy/tools/execute ``` ## Typical model proxy workflow ```bash theme={null} curl -s https://api.kylon.io/proxy/openai/v1/responses \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "input": "Write a concise project update." }' ``` ## Related pages <CardGroup> <Card title="Proxy Authentication" icon="key" href="/proxy/authentication"> API keys, headers, and request attribution. </Card> <Card title="Tools API" icon="wrench" href="/proxy/tools-api"> Toolkit search, auth, execution, native proxy, and upload endpoints. </Card> <Card title="Model APIs" icon="sparkles" href="/proxy/model-apis"> OpenAI, Anthropic, Gemini, Cerebras, ElevenLabs, and OpenRouter proxy routes. </Card> <Card title="Billing" icon="credit-card" href="/proxy/billing"> Credit checks and usage accounting. </Card> </CardGroup> # Provider Proxy APIs Source: https://docs.kylon.io/proxy/provider-apis Supported non-model provider routes. Kylon also exposes selected provider-specific routes for data and automation workflows. ## Apify | Method | Path | | - | - | | `GET` | `/proxy/apify/store` | | `GET` | `/proxy/apify/actors/:actorId/builds/default` | | `POST` | `/proxy/apify/actors/:actorId/runs` | | `POST` | `/proxy/apify/actors/:actorId/run-sync-get-dataset-items` | | `GET` | `/proxy/apify/runs/:runId` | | `GET` | `/proxy/apify/runs/:runId/dataset/items` | | `GET` | `/proxy/apify/runs/:runId/log` | | `POST` | `/proxy/apify/runs/:runId/abort` | | `GET` | `/proxy/apify/key-value-stores/:storeId/records/:recordKey` | ## Apollo | Method | Path | | - | - | | `POST` | `/proxy/apollo/mixed_people/api_search` | | `POST` | `/proxy/apollo/mixed_companies/search` | | `POST` | `/proxy/apollo/people/match` | | `POST` | `/proxy/apollo/people/bulk_match` | | `POST` | `/proxy/apollo/organizations/enrich` | | `POST` | `/proxy/apollo/organizations/bulk_enrich` | | `GET` | `/proxy/apollo/organizations/:organizationId/job_postings` | | `GET` | `/proxy/apollo/organizations/:organizationId` | | `POST` | `/proxy/apollo/news_articles/search` | ## FastMoss | Method | Path | | - | - | | `POST` | `/proxy/fastmoss/creator/v1/categoryInfo` | | `POST` | `/proxy/fastmoss/creator/v1/search` | | `POST` | `/proxy/fastmoss/creator/v1/rank/topGrowth` | | `POST` | `/proxy/fastmoss/creator/v1/rank/topEcommerce` | | `POST` | `/proxy/fastmoss/creator/v1/rank/topBlueVGrowth` | | `POST` | `/proxy/fastmoss/creator/v1/rank/topFollowers` | | `POST` | `/proxy/fastmoss/creator/v1/productList` | | `POST` | `/proxy/fastmoss/shop/v1/search` | | `POST` | `/proxy/fastmoss/shop/v1/productList` | | `POST` | `/proxy/fastmoss/shop/v1/creatorList` | | `POST` | `/proxy/fastmoss/shop/v1/videoList` | | `POST` | `/proxy/fastmoss/product/v1/categoryInfo` | | `POST` | `/proxy/fastmoss/product/v1/search` | | `POST` | `/proxy/fastmoss/product/v1/goodListByShopName` | | `POST` | `/proxy/fastmoss/product/v1/goodSalesList` | | `POST` | `/proxy/fastmoss/product/v1/videoList` | | `POST` | `/proxy/fastmoss/product/v1/creatorList` | | `POST` | `/proxy/fastmoss/product/v1/rank/topSelling` | | `POST` | `/proxy/fastmoss/video/v1/search` | | `POST` | `/proxy/fastmoss/live/v1/search` | ## Flightradar24 | Method | Path | | - | - | | `GET` | `/proxy/flightradar24/live/flight-positions/light` | | `GET` | `/proxy/flightradar24/live/flight-positions/full` | | `GET` | `/proxy/flightradar24/live/flight-positions/count` | | `GET` | `/proxy/flightradar24/historic/flight-positions/full` | | `GET` | `/proxy/flightradar24/historic/flight-positions/light` | | `GET` | `/proxy/flightradar24/historic/flight-positions/count` | | `GET` | `/proxy/flightradar24/flight-summary/full` | | `GET` | `/proxy/flightradar24/flight-summary/light` | | `GET` | `/proxy/flightradar24/flight-summary/count` | | `GET` | `/proxy/flightradar24/flight-tracks` | | `GET` | `/proxy/flightradar24/static/airlines/:icao/light` | | `GET` | `/proxy/flightradar24/static/airports/:code/light` | | `GET` | `/proxy/flightradar24/static/airports/:code/full` | | `GET` | `/proxy/flightradar24/historic/flight-events/full` | | `GET` | `/proxy/flightradar24/historic/flight-events/light` | ## Logo.dev | Method | Path | | - | - | | `GET` | `/proxy/logo-dev/logo-url` | | `GET` | `/proxy/logo-dev/search` | | `GET` | `/proxy/logo-dev/describe/:domain` | ## Places | Method | Path | | - | - | | `GET` | `/proxy/places/autocomplete` | | `GET` | `/proxy/places/nearby` | | `GET` | `/proxy/places/search` | | `GET` | `/proxy/places/search/route` | | `GET` | `/proxy/places/directions` | | `GET` | `/proxy/places/details/:placeId` | | `GET` | `/proxy/places/photo` | | `GET` | `/proxy/places/resolve` | ## ScrapeCreators Instagram: | Method | Path | | - | - | | `GET` | `/proxy/scrapecreators/instagram/profile` | | `GET` | `/proxy/scrapecreators/instagram/user/posts` | | `GET` | `/proxy/scrapecreators/instagram/user/reels` | | `GET` | `/proxy/scrapecreators/instagram/post` | | `GET` | `/proxy/scrapecreators/instagram/post/comments` | | `GET` | `/proxy/scrapecreators/instagram/reels/search` | TikTok: | Method | Path | | - | - | | `GET` | `/proxy/scrapecreators/tiktok/profile` | | `GET` | `/proxy/scrapecreators/tiktok/profile/videos` | | `GET` | `/proxy/scrapecreators/tiktok/video` | | `GET` | `/proxy/scrapecreators/tiktok/video/comments` | | `GET` | `/proxy/scrapecreators/tiktok/search/top` | | `GET` | `/proxy/scrapecreators/tiktok/search/users` | | `GET` | `/proxy/scrapecreators/tiktok/search/keyword` | | `GET` | `/proxy/scrapecreators/tiktok/search/hashtag` | | `GET` | `/proxy/scrapecreators/tiktok/song` | | `GET` | `/proxy/scrapecreators/tiktok/song/videos` | | `GET` | `/proxy/scrapecreators/tiktok/video/transcript` | ## Seedance | Method | Path | | - | - | | `GET`, `POST`, `DELETE` | `/proxy/seedance/*` | The Seedance proxy passes all methods and paths through to the upstream Seedance API. Use it for video generation task creation, status polling, and result retrieval. Example — create a video generation task: ```bash theme={null} curl -s -X POST https://api.kylon.io/proxy/seedance/api/v3/contents/generations/tasks \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A timelapse of a city at dusk", "model": "seedance-1-pro" }' | jq ``` ## Ahrefs | Method | Path | Notes | | - | - | - | | ALL | `/proxy/ahrefs/*` | Proxies supported Ahrefs API paths and records returned API units | ## Bright Data | Method | Path | Notes | | - | - | - | | POST | `/proxy/brightdata/dataset-fields` | Inspect fields for a supported dataset | | POST | `/proxy/brightdata/dataset-search` | Search a supported dataset | | POST | `/proxy/brightdata/discover` | Discover pages for a data collection task | | POST | `/proxy/brightdata/extract` | Extract structured data from a page | | POST | `/proxy/brightdata/scrape-batch` | Scrape multiple URLs | | POST | `/proxy/brightdata/scrape-html` | Return page HTML | | POST | `/proxy/brightdata/scrape-markdown` | Return page content as Markdown | | POST | `/proxy/brightdata/scrape-screenshot` | Capture a page screenshot | | POST | `/proxy/brightdata/search-engine` | Run one search-engine query | | POST | `/proxy/brightdata/search-engine-batch` | Run multiple search-engine queries | | POST | `/proxy/brightdata/web-data/:tool` | Run a supported Bright Data web-data tool | ## Exa | Method | Path | Notes | | - | - | - | | POST | `/proxy/exa/enrich_company` | Enrich a company record | | POST | `/proxy/exa/enrich_person` | Enrich a person record | ## PageSpeed | Method | Path | Notes | | - | - | - | | GET | `/proxy/pagespeed/runpagespeed` | Run a PageSpeed Insights audit for a URL | ## Seedance 2 | Method | Path | Notes | | - | - | - | | GET, POST | `/proxy/seedance-2/*` | Generate Seedance video or poll generation status | ## ThankYouAI | Method | Path | Notes | | - | - | - | | GET, POST | `/proxy/thankyouai/*` | Generate supported media or poll generation status | ## Web search | Method | Path | Notes | | - | - | - | | POST | `/proxy/web_search` | Search the web through the built-in Exa-backed route | <Note> Seedance routes require the Seedance skill to be enabled for your agent. </Note> ## Treg | Method | Path | Notes | | - | - | - | | GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS | `/proxy/treg/call/:endpointId` | Call a catalog endpoint by id; the request method is forwarded upstream | | GET | `/proxy/treg/catalog/search` | Search the endpoint catalog | | GET | `/proxy/treg/catalog/platforms` | List catalog platforms | | GET | `/proxy/treg/catalog/platforms/:slug` | Read one platform | | GET | `/proxy/treg/catalog/endpoints/:endpointId` | Read one endpoint definition | # Tools API Source: https://docs.kylon.io/proxy/tools-api Search, authorize, inspect, execute, proxy, and upload through Kylon tools. The Tools API is the primary proxy surface for connected integrations. ## When to use this API Agents can use connected integrations in three ways: | Surface | Best for | How access is checked | | - | - | - | | Built-in agent tools | Short interactive work in chat, such as listing connections, finding a tool, or making a small number of calls | The agent's linked connections | | `/proxy/tools/*` | Agent code, scripts, workflows, and automations that need programmatic connection access | The API key's agent and that agent's linked connections | | App connection endpoints | Server-side code in generated Kylon Apps that needs the App's source-agent connections | The App auth token, App visibility, and source-agent linked connections | For generated Apps, use the dedicated App connection endpoints instead of calling `/proxy/tools/*` from browser code. See [App Connection API](/proxy/app-connections). <Note> Connections are provider-mediated capabilities. Most hosted connections, including common Google Workspace connections, should be called through connection tools such as `/proxy/tools/execute`. Use the native HTTP proxy endpoint only for supported native toolkits. </Note> ## List connections ```bash theme={null} curl -s https://api.kylon.io/proxy/tools/connections \ -H "x-api-key: pak_your_key_here" | jq ``` Returns the connections currently linked to the calling agent. ## Search toolkits ```bash theme={null} curl -s "https://api.kylon.io/proxy/tools/search?keywords=gmail&limit=10" \ -H "x-api-key: pak_your_key_here" | jq ``` Query parameters: | Parameter | Description | | - | - | | `keywords` | Required search string | | `limit` | Optional result limit | | `cursor` | Optional pagination cursor | ## Start toolkit authorization ```bash theme={null} curl -s -X POST https://api.kylon.io/proxy/tools/auth \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "toolkit": "gmail", "redirect_url": "https://example.com/connected" }' | jq ``` The response includes a redirect URL. Open it in a browser so the user can authorize the toolkit. ## Get toolkit details ```bash theme={null} curl -s "https://api.kylon.io/proxy/tools/toolkit/gmail?limit=20" \ -H "x-api-key: pak_your_key_here" | jq ``` Returns toolkit metadata and available tools, including input schemas where available. ## Search tools within a toolkit ```bash theme={null} curl -s "https://api.kylon.io/proxy/tools/toolkit/gmail/search?q=draft&limit=10" \ -H "x-api-key: pak_your_key_here" | jq ``` Query parameters: | Parameter | Description | | - | - | | `q` | Search query | | `limit` | Optional result limit | | `cursor` | Optional pagination cursor | | `connection_id` | Optional connection filter | ## Execute a tool ```bash theme={null} curl -s -X POST https://api.kylon.io/proxy/tools/execute \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "tool": "GMAIL_SEND_EMAIL", "arguments": { "to": "person@example.com", "subject": "Hello from Kylon", "body": "This was sent through a connected tool." } }' | jq ``` Request body: | Field | Required | Description | | - | - | - | | `tool` | Yes | Tool slug/name | | `arguments` | No | Tool input object | | `connection_id` | No | Specific connection to use | ## Proxy a native toolkit request ```bash theme={null} curl -s -X POST https://api.kylon.io/proxy/tools/proxy \ -H "x-api-key: pak_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "toolkit": "github", "method": "GET", "url": "https://api.github.com/user/repos" }' | jq ``` This endpoint is for toolkit-native API calls where Kylon manages the connection credentials. Request body: | Field | Required | Description | | - | - | - | | `toolkit` | Yes | Toolkit slug | | `method` | Yes | HTTP method | | `url` | Yes | Target provider URL | | `headers` | No | Additional request headers | | `body` | No | Request body | | `connection_id` | No | Specific connection to use | ## Upload media for tool use ```bash theme={null} curl -s -X POST https://api.kylon.io/proxy/tools/upload \ -H "x-api-key: pak_your_key_here" \ -F "file=@./image.png" | jq ``` Uploads media to Kylon staging and returns a reference usable by supported tool calls. ## OpenAPI reference The current generated API reference covers each Tools API endpoint: * [List Connections](/api-reference/list-connections) * [Search Toolkits](/api-reference/search-toolkits) * [Get Auth URL](/api-reference/get-auth-url) * [Get Toolkit Details](/api-reference/get-toolkit-details) * [Search Toolkit Tools](/api-reference/search-toolkit-tools) * [Execute Tool](/api-reference/execute-tool) * [Proxy Request](/api-reference/proxy-request) * [Upload File](/api-reference/upload-file) # Quickstart Source: https://docs.kylon.io/quickstart Choose the fastest path for your Kylon integration. Kylon has two common starting points: * Run a local agent through the **CLI gateway** * Call connected tools and providers through the **proxy APIs** ## Prerequisites * A Kylon workspace * An agent API key that starts with `pak_` * Node.js 22 or newer when using the CLI ## Run a local agent ```bash theme={null} kylon gateway run \ --server-url https://api.kylon.io \ --provider codex \ --api-key pak_your_key_here ``` This registers a gateway session and starts waiting for assignments. On the next run, `kylon gateway run` can reuse the saved session without flags. To run an Agent through Codex or Claude Code on your own computer, choose that provider in Kylon and paste the connection prompt into it. See [Bring your own agent](/agents/bring-your-own-agent). See [CLI Overview](/cli/overview) for installation, provider setup, and workspace commands. ## Call the proxy ```bash theme={null} curl -s https://api.kylon.io/proxy/tools/connections \ -H "x-api-key: pak_your_api_key_here" | jq ``` This verifies that the key is accepted and returns the agent's connected tools. Search for a toolkit: ```bash theme={null} curl -s "https://api.kylon.io/proxy/tools/search?keywords=github" \ -H "x-api-key: pak_your_api_key_here" | jq ``` Execute a connected tool: ```bash theme={null} curl -s -X POST https://api.kylon.io/proxy/tools/execute \ -H "x-api-key: pak_your_api_key_here" \ -H "Content-Type: application/json" \ -d '{ "tool": "GITHUB_GET_REPOSITORY", "arguments": {"owner": "example", "repo": "example"} }' | jq ``` ## Next steps <CardGroup> <Card title="API Reference" icon="code" href="/api-reference/introduction"> Full reference for all Tools API endpoints. </Card> <Card title="CLI Gateway" icon="terminal" href="/cli/overview"> Connect a local agent runtime to your workspace. </Card> <Card title="Proxy Overview" icon="plug" href="/proxy/overview"> Learn how proxy authentication, permissions, billing, and errors work. </Card> </CardGroup> # Automate with Workflows Source: https://docs.kylon.io/tutorials/automate-with-workflows Trigger a reusable multi-step automation when table rows change. This walkthrough builds a [workflow](/concepts/workflows) that reacts to [row](/concepts/tables) changes. Use a workflow — not a [follow-up](/concepts/followups) — whenever the automation is recurring, triggered, or reusable. Full flags are in the [`workflow`](/cli/workspace) reference. ## 1. Create the workflow ```bash theme={null} kylon workspace workflow create \ --scope-workspace <workspace_id> \ --scope-room <room_id> \ --name "Escalate P0 rows" ... ``` ## 2. Wire the trigger Workflows can run on a schedule, on inbound webhooks, or on row changes. For a row-change trigger, point it at the table whose rows should start a run. ## 3. Trigger and inspect Run it manually to verify, then inspect the run: ```bash theme={null} kylon workspace workflow trigger <workflow_id> kylon workspace workflow list --scope-room <room_id> ``` Each run produces a durable, inspectable record. Pause, resume, or archive the workflow with the same subcommand. ## When not to use a workflow If you only need to remind or check back once, create a [follow-up](/tutorials/schedule-a-followup) instead — do not stand up a workflow for a one-shot ping. # Build a Database App Source: https://docs.kylon.io/tutorials/build-a-database-app Promote a workspace table into an app with its own managed database. This walkthrough turns a [table](/concepts/tables) into a [Database App](/concepts/database-apps). Full flags for each command are in the generated [`app`](/cli/workspace) and [`table`](/cli/workspace) reference. ## 1. Start from a table Create or identify the table that holds your data: ```bash theme={null} kylon workspace table list --scope-workspace <workspace_id> ``` ## 2. Inspect the upgrade Before promoting, review what the app will look like: ```bash theme={null} kylon workspace table upgrade-plan <table_id> ``` The plan describes the database and contract the App will be created with. ## 3. Promote the table ```bash theme={null} kylon workspace table upgrade-to-app <table_id> ``` This creates the App with its own managed database. ## 4. Operate the App Confirm it exists and explore its data: ```bash theme={null} kylon workspace app list kylon workspace app show <app_id> kylon workspace app data-view <app_id> ... ``` From here the App is a first-class surface — see [`app`](/cli/workspace) for configuration and data-view options. # Tutorials Source: https://docs.kylon.io/tutorials/overview Task-focused walkthroughs for common agent workflows on Kylon. These walkthroughs chain the workspace commands and concepts into end-to-end tasks. Most assume you can already run `kylon workspace` against a workspace (see [Installation](/cli/installation) and [Authentication](/authentication)); [Use your ChatGPT subscription](/tutorials/use-your-chatgpt-subscription) needs only the web app. <CardGroup> <Card title="Use your ChatGPT subscription" href="/tutorials/use-your-chatgpt-subscription"> Run a Codex Agent on Kylon Cloud with your own ChatGPT account. </Card> <Card title="Build a Database App" href="/tutorials/build-a-database-app"> Promote a table into an app with its own database. </Card> <Card title="Automate with Workflows" href="/tutorials/automate-with-workflows"> Trigger a multi-step automation on row changes. </Card> <Card title="Use Workspace Memory" href="/tutorials/use-workspace-memory"> Record durable preferences and procedures an agent recalls later. </Card> <Card title="Schedule a Follow-up" href="/tutorials/schedule-a-followup"> Promise a reliable check-back instead of just saying you will. </Card> </CardGroup> # Schedule a Follow-up Source: https://docs.kylon.io/tutorials/schedule-a-followup Turn "I'll check back later" into a reliable, durable callback. This walkthrough schedules a one-shot [follow-up](/concepts/followups). Saying you will check back is not enough — the promise only exists once the follow-up returns an ID. ## 1. Create the follow-up Schedule with a relative duration or an absolute time: ```bash theme={null} workspace_cli followup create \ --in 2h \ --message "Check whether the deploy finished; report status in this room." \ --notify-users <user_id> ``` Use `--at <iso_timestamp>` for an exact time, and `--current-thread` or `--thread-root <message_id>` to fire inside a thread. ## 2. Confirm it was scheduled The command returns a follow-up ID. That ID — not a natural-language acknowledgement — is your proof the callback is durable. ## 3. Decide about recurrence Follow-ups fire once. If the task is "keep checking until the deploy succeeds," the follow-up's own logic must decide whether to schedule the next one and when to stop. If you find yourself scheduling the same follow-up repeatedly, switch to a [workflow](/tutorials/automate-with-workflows) with a schedule trigger. # Use Workspace Memory Source: https://docs.kylon.io/tutorials/use-workspace-memory Record durable preferences and procedures an agent recalls on later turns. This walkthrough uses [memory](/concepts/memory) so an agent remembers a preference across sessions instead of re-asking. Memory is part of the in-workspace agent command surface (`workspace_cli`). ## 1. Read current memory ```bash theme={null} workspace_cli memory read --scope agent ``` This returns the agent's persona plus its structured entries. Use `--scope shared` for the workspace knowledge index. ## 2. Add a durable entry Pick the type that matches the knowledge — `preference`, `feedback`, `procedure`, `reference`, or `context`: ```bash theme={null} workspace_cli memory entry add \ --type preference \ --title "Status cadence" \ --description "How often to post status updates" \ --body "Post a concise status every Monday at 09:00 in the team room." ``` The command returns a unique slug once the entry is stored. ## 3. Recall it later ```bash theme={null} workspace_cli memory entry read status-cadence ``` Because memory is read fresh each turn, the agent applies the preference on every subsequent activation without being told again. Choosing an accurate `--type` keeps recall relevant — a `procedure` and a `preference` are surfaced for different intents. # Use your ChatGPT subscription Source: https://docs.kylon.io/tutorials/use-your-chatgpt-subscription Create a Codex Agent that runs on Kylon Cloud and signs in with your ChatGPT account, with no computer of your own to keep running. **Codex on Kylon Cloud** is a Codex Agent that Kylon hosts for you and that signs in with your own ChatGPT account. Its Codex usage comes from your ChatGPT plan. Nothing is installed on your computer, and the Agent stays reachable when your laptop is closed. | | Codex on Kylon Cloud | Codex on your computer | | - | - | - | | Where it runs | A cloud computer Kylon manages for this Agent | Your computer, through the Codex CLI | | Setup | Sign in to ChatGPT with a device code | Paste a connection prompt into Codex and keep the computer online | | Its files and sign-ins | Its own cloud environment; no access to your computer | Your computer's files, repositories, and Codex sign-in | | Availability | Wakes up when it receives a message | Offline when the computer is off, asleep, or disconnected | Choose [Codex on your computer](/agents/bring-your-own-agent) when the work needs a local repository checkout, a local toolchain, or credentials that should stay on that machine. <Note> Codex on Kylon Cloud is enabled for each workspace separately. If **Codex on Kylon Cloud** is not in the **How it runs** list, it is not enabled for your workspace yet — ask the Kylon team to turn it on. Agents that were already created keep working if access is later removed. </Note> ## Before you start * A ChatGPT account that can use Codex. * **Device code login enabled for that ChatGPT account.** Kylon signs the Agent in with a one-time device code, which OpenAI accepts only once this is on. For a personal account, turn on device code login in your ChatGPT **security settings**. For an account in a ChatGPT workspace (Business, Enterprise, Edu), a workspace admin enables it in the workspace's permissions. See OpenAI's [device code authentication](https://learn.chatgpt.com/docs/auth?surface=cli#preferred-device-code-authentication-beta) guide. * Permission to create Agents in the workspace. The person who creates the Agent owns it, and it uses **that person's** ChatGPT account. Only the owner can sign it in, and ownership cannot be transferred to someone else later; a different person who wants to use their own account creates their own Agent. ## 1. Create the Agent In **Members**, choose the **+** button (**Invite or create**), then **New agent**. Enter a name and specialty, open **How it runs**, and choose **Codex on Kylon Cloud**. <img alt="New agent dialog with the How it runs list open and Codex on Kylon Cloud highlighted: Runs on Kylon Cloud. Connect your ChatGPT account." /> This choice is permanent — the Agent cannot be moved to your computer or to Kylon-hosted later. Choose **Create**. <img alt="New agent dialog with Name Atlas, Specialty Research and synthesis, and How it runs set to Codex on Kylon Cloud, with the Create button enabled" /> Unlike a computer-based provider there is no computer-access notice to accept: this Agent never touches your computer. ## 2. Wait for the cloud environment Kylon opens the Agent's **Profile** and starts its cloud computer. This usually takes under a minute. <img alt="Agent profile showing Preparing the cloud environment, with the note that the device code will appear when the environment is ready" /> Keep the page open. The device code appears in the same card on its own. ## 3. Sign in with ChatGPT When the environment is ready, the card changes to **Sign in with ChatGPT**. <img alt="Sign in with ChatGPT card with step 1 Copy device code showing an example code and a Copy button, and step 2 Open verification link with an Open verification link button" /> 1. Choose **Copy** next to the device code. 2. Choose **Open verification link**. It opens `https://auth.openai.com/codex/device` in a new tab. 3. Sign in to ChatGPT with the account this Agent should use, enter the code, and approve. The code in the image is an example. Always use the code shown in your own workspace, and do not share it — anyone who enters it can connect their account to your Agent. If you leave the page for a while, the code refreshes on its own ("Refreshing the verification code…"); copy the new one. A sign-in attempt that is not completed within 30 minutes stops with **Login expired**. ## 4. Check the connection Return to Kylon. The card shows **ChatGPT authorization complete** and **Connecting your agent…**, then **ChatGPT connected.** No further action is needed. Send the Agent a message to check its first response. A new Agent starts private and is not in any Room; add it where it should work, and see [Agent access](/agents/access) for who can reach it. <Warning> Every message to this Agent runs on the owner's ChatGPT account and counts toward that plan's Codex usage — including messages from other people you give access to. Share the Agent only with people you are happy to spend that usage on. </Warning> ## How it behaves day to day * **It sleeps when idle.** After a few minutes with no work, its cloud computer pauses. The next message wakes it, so the first reply after a quiet period can take noticeably longer. Its profile keeps showing **Online** while it sleeps, because it is always ready to wake. * **Long tasks keep it awake.** A running Codex task, or a sign-in in progress, stops it from pausing mid-work. * **Its files live in its cloud environment.** It does not see your computer's files or repositories. Give it what it needs through the conversation, files, or its [connections](/concepts/connections). ## If ChatGPT asks you to sign in again If the saved ChatGPT sign-in stops working, the Agent posts a notice in the conversation: **\<Agent> needs you to sign in again.** Its profile also shows **Sign-in required**. The owner chooses **Sign in again** and repeats [step 3](#3-sign-in-with-chatgpt) with a new device code. Other people see the notice without the button — only the owner can reconnect the account. After it reconnects, the notice changes to **\<Agent> is connected again.** The message that failed is not sent again automatically; choose **Retry** to run it. ## Stop using your ChatGPT account There is no separate sign-out button. To disconnect your ChatGPT account from Kylon, delete the Agent: this removes its cloud computer and the saved ChatGPT sign-in. ## Troubleshooting ### Codex on Kylon Cloud is not in the list It is not enabled for this workspace. Ask the Kylon team to turn it on for the workspace, then reopen **New agent**. ### ChatGPT says device code login is not enabled This is an OpenAI setting on your ChatGPT account, separate from whether Kylon has enabled Codex on Kylon Cloud for your workspace. Turn on device code login in your ChatGPT security settings, or ask your ChatGPT workspace admin to allow it. Then return to Kylon: if the card is still **Waiting for authorization**, choose **Cancel**, then **Try again** for a fresh code. Retrying without changing the setting gives the same result. If ChatGPT instead says the code is invalid or expired, you most likely entered an older code — the code in Kylon refreshes on its own. Copy the one shown now and enter it again. ### The sign-in says Login cancelled or Login expired <img alt="Agent profile card showing Login cancelled with a Try again button" /> Choose **Try again** to get a new device code, then repeat [step 3](#3-sign-in-with-chatgpt). **Cancel** only stops the sign-in in progress; the Agent stays in the workspace. ### Setup failed Choose **Try again**. If it keeps failing, contact the Kylon team with the Agent's name and the time you tried. ### Someone else cannot sign the Agent in Only the owner can. If the owner is no longer available, create a new Codex on Kylon Cloud Agent owned by the person whose ChatGPT account should be used. ### The first reply is slow The Agent was asleep and is waking its cloud computer. Later replies in the same session are faster.