1"use strict";(self.webpackChunktf_docs=self.webpackChunktf_docs||[]).push([["3830"],{95134(e,s,n){n.r(s),n.d(s,{metadata:()=>r,default:()=>a,frontMatter:()=>c,contentTitle:()=>l,toc:()=>o,assets:()=>t});var r=JSON.parse('{"id":"config","title":"Config","description":"TF Code configuration \u2014 profiles, regions, config files, and precedence","source":"@site/tfcode/01-config.md","sourceDirName":".","slug":"/config","permalink":"/tfcode/config","draft":false,"unlisted":false,"tags":[],"version":"current","lastUpdatedAt":1789469015000,"sidebarPosition":1,"frontMatter":{"title":"Config","sidebar_label":"Config","description":"TF Code configuration \u2014 profiles, regions, config files, and precedence"},"sidebar":"tutorialSidebar","previous":{"title":"Intro","permalink":"/tfcode/intro"},"next":{"title":"Providers","permalink":"/tfcode/providers"}}'),d=n(74848),i=n(28453);let c={title:"Config",sidebar_label:"Config",description:"TF Code configuration \u2014 profiles, regions, config files, and precedence"},l="Config",t={},o=[{value:"Interactive Setup",id:"interactive-setup",level:2},{value:"Profiles",id:"profiles",level:2},{value:"Create",id:"create",level:3},{value:"Switch",id:"switch",level:3},{value:"Use in commands",id:"use-in-commands",level:3},{value:"Storage",id:"storage",level:3},{value:"Regions",id:"regions",level:2},{value:"Config File Locations",id:"config-file-locations",level:2},{value:"Project config example",id:"project-config-example",level:3},{value:"Feature config sections",id:"feature-config-sections",level:3},{value:"Perks",id:"perks",level:3},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Validate",id:"validate",level:2},{value:"Server Config",id:"server-config",level:2},{value:"Logging",id:"logging",level:2},{value:"CLI Commands Reference",id:"cli-commands-reference",level:2},{value:"Top-level",id:"top-level",level:3},{value:"Setup & credentials",id:"setup--credentials",level:3},{value:"MCP",id:"mcp",level:3},{value:"Other",id:"other",level:3},{value:"Chat commands (interactive)",id:"chat-commands-interactive",level:3}];function h(e){let s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.header,{children:(0,d.jsx)(s.h1,{id:"config",children:"Config"})}),"\n",(0,d.jsx)(s.p,{children:"TF Code uses JSON config files merged in precedence order. Profile credentials and environment variables override file-based settings."}),"\n",(0,d.jsx)(s.h2,{id:"interactive-setup",children:"Interactive Setup"}),"\n",(0,d.jsx)(s.p,{children:"The recommended way to get started:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"tfcode setup\n"})}),"\n",(0,d.jsx)(s.p,{children:"This prompts for profile name, workspace ID, API key, and region, then saves them as a named profile."}),"\n",(0,d.jsx)(s.h2,{id:"profiles",children:"Profiles"}),"\n",(0,d.jsx)(s.p,{children:"Profiles store multiple sets of ToothFairyAI credentials so you can switch between workspaces instantly."}),"\n",(0,d.jsx)(s.h3,{id:"create",children:"Create"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"tfcode setup\n# Prompts for: profile name, workspace ID, API key, region\n"})}),"\n",(0,d.jsx)(s.p,{children:"Non-interactive:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"tfcode setup --profile dev --workspace-id dev-ws-456 --api-key dev-key-xxx --region dev --name dev\n"})}),"\n",(0,d.jsx)(s.h3,{id:"switch",children:"Switch"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"tfcode profile prod\ntfcode profile\n# Current profile: prod\n#\n# Available profiles:\n# * prod\n# dev\n"})}),"\n",(0,d.jsx)(s.h3,{id:"use-in-commands",children:"Use in commands"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:'tfcode -p prod run "Deploy to production"\nTF_PROFILE=prod tfcode run "Force prod workspace"\n'})}),"\n",(0,d.jsx)(s.h3,{id:"storage",children:"Storage"}),"\n",(0,d.jsxs)(s.p,{children:["Profiles are stored in ",(0,d.jsx)(s.code,{children:"~/.local/share/tfcode/.tfcode/profiles.json"}),":"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-json",children:'{\n "default": "prod",\n "profiles": {\n "prod": {\n "api_key": "prod-key-xxx",\n "workspace_id": "prod-ws-123",\n "region": "au"\n },\n "dev": {\n "api_key": "dev-key-yyy",\n "workspace_id": "dev-ws-456",\n "region": "dev"\n }\n }\n}\n'})}),"\n",(0,d.jsxs)(s.p,{children:["Profiles replace the legacy ",(0,d.jsx)(s.code,{children:"credentials.json"}),". TF Code automatically migrates it on first profile command."]}),"\n",(0,d.jsx)(s.h2,{id:"regions",children:"Regions"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Region"}),(0,d.jsx)(s.th,{children:"Base URL"}),(0,d.jsx)(s.th,{children:"Streaming URL"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"dev"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ai.toothfairylab.link"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ais.toothfairylab.link"})})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"au"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ai.toothfairyai.com"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ais.toothfairyai.com"})})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"eu"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ai.eu.toothfairyai.com"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ais.eu.toothfairyai.com"})})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"us"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ai.us.toothfairyai.com"})}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"ais.us.toothfairyai.com"})})]})]})]}),"\n",(0,d.jsx)(s.h2,{id:"config-file-locations",children:"Config File Locations"}),"\n",(0,d.jsx)(s.p,{children:"Config sources are loaded in order of increasing priority (later overrides earlier):"}),"\n",(0,d.jsxs)(s.ol,{children:["\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:"Global config"})," \u2014 ",(0,d.jsx)(s.code,{children:"~/.config/tfcode/tfcode.json"})]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:"Custom config"})," \u2014 ",(0,d.jsx)(s.code,{children:"OPENCODE_CONFIG"})," env var path"]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:"Project config"})," \u2014 ",(0,d.jsx)(s.code,{children:"tfcode.json"})," in project root"]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:(0,d.jsx)(s.code,{children:".tfcode/tfcode.json"})})," in project root"]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:"Inline config"}
1)," \u2014 ",(0,d.jsx)(s.code,{children:"OPENCODE_CONFIG_CONTENT"})," env var"]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:"Active profile"})," \u2014 set via ",(0,d.jsx)(s.code,{children:"tfcode profile <name>"})," or ",(0,d.jsx)(s.code,{children:"--profile"})," / ",(0,d.jsx)(s.code,{children:"TF_PROFILE"})]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:"Environment variables"})," \u2014 ",(0,d.jsx)(s.code,{children:"TF_WORKSPACE_ID"}),", ",(0,d.jsx)(s.code,{children:"TF_API_KEY"}),", ",(0,d.jsx)(s.code,{children:"TF_REGION"})]}),"\n"]}),"\n",(0,d.jsxs)(s.p,{children:["Files are ",(0,d.jsx)(s.strong,{children:"merged together"}),", not replaced. Non-conflicting settings from all sources are preserved."]}),"\n",(0,d.jsx)(s.admonition,{type:"note",children:(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"tfcode sync"})," can ",(0,d.jsx)(s.strong,{children:"replace"})," the global config file with a workspace-managed ",(0,d.jsx)(s.code,{children:"tfcode.json"})," published by your workspace admin \u2014 the previous file is kept as ",(0,d.jsx)(s.code,{children:"tfcode.json.bak"}),". See ",(0,d.jsx)(s.a,{href:"/tfcode/configure/workspace#workspace-managed-config--policies",children:"Workspace Sync"}),"."]})}),"\n",(0,d.jsx)(s.h3,{id:"project-config-example",children:"Project config example"}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:".tfcode/tfcode.json"}),":"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-json",children:'{\n "toothfairy": {\n "workspace_id": "your-workspace-id",\n "api_key": "your-api-key",\n "region": "au"\n },\n "model": "toothfairyai/mystica",\n "default_agent": "build"\n}\n'})}),"\n",(0,d.jsx)(s.h3,{id:"feature-config-sections",children:"Feature config sections"}),"\n",(0,d.jsxs)(s.p,{children:["Top-level config keys that switch on agent features (see ",(0,d.jsx)(s.a,{href:"/tfcode/configure/agents",children:"Agents"})," for details):"]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Key"}),(0,d.jsx)(s.th,{children:"Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"reviewer"})}),(0,d.jsx)(s.td,{children:"object"}),(0,d.jsxs)(s.td,{children:["Stronger model agents call for second opinions (see ",(0,d.jsx)(s.a,{href:"/tfcode/configure/agents#reviewer",children:"Reviewer"}),")"]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"model_swap"})}),(0,d.jsx)(s.td,{children:"object"}),(0,d.jsxs)(s.td,{children:["Lets agents switch models mid-session (see ",(0,d.jsx)(s.a,{href:"/tfcode/configure/agents#model-swap",children:"Model swap"}),")"]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"loops"})}),(0,d.jsx)(s.td,{children:"object"}),(0,d.jsxs)(s.td,{children:["Structured execution-path workflows (see ",(0,d.jsx)(s.a,{href:"/tfcode/configure/loops",children:"Loops"}),")"]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"policies"})}),(0,d.jsx)(s.td,{children:"array"}),(0,d.jsxs)(s.td,{children:["Allow/deny rules for providers, tools, MCP, and skills (see ",(0,d.jsx)(s.a,{href:"/tfcode/configure/policies",children:"Policies"}),")"]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"self_improve_skills"})}),(0,d.jsx)(s.td,{children:"boolean | object"}),(0,d.jsxs)(s.td,{children:["Steers agents to refine their own skills. Supports ",(0,d.jsx)(s.code,{children:"enabled_for"}),", ",(0,d.jsx)(s.code,{children:"validate"}),", ",(0,d.jsx)(s.code,{children:"history_dir"}),", and reserved ",(0,d.jsx)(s.code,{children:"embeddings"})," (see ",(0,d.jsx)(s.a,{href:"/tfcode/configure/agents#self-improving-skills",children:"Self-improving skills"}),")"]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"perks"})}),(0,d.jsx)(s.td,{children:"object"}),(0,d.jsxs)(s.td,{children:["Named capabilities (e.g. ",(0,d.jsx)(s.code,{children:"computer-use"}),", ",(0,d.jsx)(s.code,{children:"voice"}),") whose default on/off state applies to every new session \u2014 seeds session toggles (see ",(0,d.jsx)(s.a,{href:"#perks",children:"Perks"}),")"]})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"perks",children:"Perks"}),"\n",(0,d.jsxs)(s.p,{children:["Perks control ",(0,d.jsx)(s.strong,{children:"on-demand capabilities"})," for agents \u2014 whose default on/off state is configured once and applied to every new session. Example:"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-json",children:'{\n "perks": {\n "computer-use": true,\n "voice": true\n }\n}\n'})}),"\n",(0,d.jsx)(s.p,{children:"Each perk key is a boolean:"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Key"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:'"computer-use"'})}),(0,d.jsx)(s.td,{children:"Default state of the computer-use perk (OS GUI control) for new sessions \u2014 users can still toggle it per session via the UI icon"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:'"voice"'})}),(0,d.jsx)(s.td,{children:"Default state of the voice perk (mic input, spoken callouts, TTS) for new sessions"})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Absent perks default to off."}),"\n",(0,d.jsx)(s.admonition,{type:"note",children:(0,d.jsxs)(s.p,{children:["Agent-level perks are a different c
1oncept: setting ",(0,d.jsx)(s.code,{children:'perk: "tf_engineer"'})," or ",(0,d.jsx)(s.code,{children:'perk: "tf_orchestrate"'})," ",(0,d.jsx)(s.strong,{children:"on an agent definition"})," makes it inherit the full behaviour of the native ToothFairyAI agent (prompt, permissions, MCP and TF tool access). See ",(0,d.jsx)(s.a,{href:"/tfcode/configure/agents#agent-perks",children:"Agent perks"}),"."]})}),"\n",(0,d.jsx)(s.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Variable"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"TF_WORKSPACE_ID"})}),(0,d.jsx)(s.td,{children:"ToothFairyAI workspace ID"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"TF_API_KEY"})}),(0,d.jsx)(s.td,{children:"ToothFairyAI API key"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"TF_REGION"})}),(0,d.jsx)(s.td,{children:"ToothFairyAI region: dev, au, eu, us"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"TF_PROFILE"})}),(0,d.jsx)(s.td,{children:"Profile name to use (overrides default profile)"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"TFCODE_SERVER_PASSWORD"})}),(0,d.jsx)(s.td,{children:"HTTP basic auth password for server mode"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"TFCODE_SERVER_USERNAME"})}),(0,d.jsx)(s.td,{children:"HTTP basic auth username (default: tfcode)"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"OPENCODE_CONFIG"})}),(0,d.jsx)(s.td,{children:"Path to custom config file"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"OPENCODE_CONFIG_CONTENT"})}),(0,d.jsx)(s.td,{children:"Inline config content (highest priority)"})]})]})]}),"\n",(0,d.jsx)(s.h2,{id:"validate",children:"Validate"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"tfcode validate\ntfcode validate --profile prod\n"})}),"\n",(0,d.jsx)(s.h2,{id:"server-config",children:"Server Config"}),"\n",(0,d.jsxs)(s.p,{children:["The ",(0,d.jsx)(s.code,{children:"server"})," block controls the HTTP server:"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-json",children:'{\n "server": {\n "port": 4096,\n "hostname": "127.0.0.1",\n "mdns": false,\n "mdnsDomain": "tfcode.local",\n "cors": ["https://app.example.com"]\n }\n}\n'})}),"\n",(0,d.jsx)(s.h2,{id:"logging",children:"Logging"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"tail -f ~/.local/share/tfcode/log/dev.log\ntfcode --log-level DEBUG\n"})}),"\n",(0,d.jsxs)(s.p,{children:["Levels: ",(0,d.jsx)(s.code,{children:"DEBUG"}),", ",(0,d.jsx)(s.code,{children:"INFO"}),", ",(0,d.jsx)(s.code,{children:"WARN"}),", ",(0,d.jsx)(s.code,{children:"ERROR"}),"."]}),"\n",(0,d.jsx)(s.h2,{id:"cli-commands-reference",children:"CLI Commands Reference"}),"\n",(0,d.jsx)(s.h3,{id:"top-level",children:"Top-level"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode"})}),(0,d.jsx)(s.td,{children:"Start interactive session"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode run <prompt>"})}),(0,d.jsx)(s.td,{children:"Execute a single task and exit"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode serve"})}),(0,d.jsx)(s.td,{children:"Start headless HTTP server"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode web"})}),(0,d.jsx)(s.td,{children:"Start server and open web interface"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode attach <url>"})}),(0,d.jsx)(s.td,{children:"Attach TUI to a running server"})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"setup--credentials",children:"Setup & credentials"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode setup"})}),(0,d.jsx)(s.td,{children:"Interactive credential setup (creates a profile)"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode validate"})}),(0,d.jsxs)(s.td,{children:["Validate credentials (",(0,d.jsx)(s.code,{children:"--profile <name>"})," for specific)"]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode profile"})}),(0,d.jsx)(s.td,{children:"Show current profile and list all"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode profile <name>"})}),(0,d.jsx)(s.td,{children:"Switch to a different profile"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode sync"})}),(0,d.jsx)(s.td,{children:"Sync workspace tools metadata"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode policy"})}),(0,d.jsx)(s.td,{children:"List local and workspace policy statements"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode providers list"})}),(0,d.jsx)(s.td,{children:"List available providers"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode models [provider]"})}),(0,d.jsx)(s.td,{children:"List available models (optional provider filter)"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode models --verbose"})}),(0,d.jsx)(s.td,{children:"List models with metadata"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode models --refresh"})}),(0,d.jsx)(s.td,{children:"Refresh the models cache"})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"mcp",children:"MCP"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode mcp list"})}),(0,d.jsx)(s.td,{children:"List MCP servers and tools"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode mcp add"})}),(0,d.jsx)(s.td,{children:"Add a local MCP server"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode mcp auth"})}),(0,d.jsx)(s.td,{children:"Authenticate with OAuth MCP server"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode mcp logout"})}),(0,d.jsx)(s.td,{children:"Logout from MCP server"})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"other",children:"Other"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode -p/--profile"})}),(0,d.jsx)(s.td,{children:"Switch profile per command"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode --log-level"})}),(0,d.jsx)(s.td,{children:"Set log level"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode --version"})}),(0,d.jsx)(s.td,{children:"Show version"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode --help"})}),(0,d.jsx)(s.td,{children:"Show all commands"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"tfcode gateway"})}),(0,d.jsx)(s.td,{children:"Manage webhook subscriptions"})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"chat-commands-interactive",children:"Chat commands (interactive)"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"/compact [instructions]"})}),(0,d.jsx)(s.td,{children:"Compact context with preservation hints"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"/help"})}),(0,d.jsx)(s.td,{children:"Show available commands"})]})]})]})]})}function a(e={}){let{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,d.jsx)(s,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},28453(e,s,n){n.d(s,{R:()=>c,x:()=>l});var r=n(96540);let d={},i=r.createContext(d);function c(e){let s=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:c(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.