[{"data":1,"prerenderedAt":2059},["ShallowReactive",2],{"navigation":3,"/apps/building-an-app":200,"/apps/building-an-app-surround":2056},[4,22,50,83,120,156,189],{"title":5,"path":6,"stem":7,"children":8,"icon":16},"Getting Started","/getting-started","1.getting-started/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-ph-house",{"title":13,"path":14,"stem":15,"icon":16},"Quickstart","/getting-started/quickstart","1.getting-started/2.quickstart","i-ph-rocket",{"title":18,"path":19,"stem":20,"icon":21},"Plans","/getting-started/plans","1.getting-started/3.plans","i-ph-credit-card",{"title":23,"path":24,"stem":25,"children":26,"icon":29},"Agents","/agents","2.agents/1.index",[27,30,35,40,45],{"title":28,"path":24,"stem":25,"icon":29},"Overview","i-ph-robot",{"title":31,"path":32,"stem":33,"icon":34},"Creating an agent","/agents/creating-an-agent","2.agents/2.creating-an-agent","i-ph-plus",{"title":36,"path":37,"stem":38,"icon":39},"Agent settings","/agents/settings","2.agents/3.settings","i-ph-gear",{"title":41,"path":42,"stem":43,"icon":44},"Memory","/agents/memory","2.agents/4.memory","i-ph-database",{"title":46,"path":47,"stem":48,"icon":49},"Residential proxy","/agents/proxy","2.agents/5.proxy","i-ph-globe-hemisphere-west",{"title":51,"path":52,"stem":53,"children":54,"icon":57},"Chats & Tasks","/chats-and-tasks","3.chats-and-tasks/1.index",[55,58,63,68,73,78],{"title":56,"path":52,"stem":53,"icon":57},"Chats","i-ph-chats-circle",{"title":59,"path":60,"stem":61,"icon":62},"Sharing chats","/chats-and-tasks/sharing-chats","3.chats-and-tasks/2.sharing-chats","i-ph-share-network",{"title":64,"path":65,"stem":66,"icon":67},"Tasks","/chats-and-tasks/tasks","3.chats-and-tasks/3.tasks","i-ph-list-checks",{"title":69,"path":70,"stem":71,"icon":72},"Recurring tasks","/chats-and-tasks/recurring-tasks","3.chats-and-tasks/4.recurring-tasks","i-ph-repeat",{"title":74,"path":75,"stem":76,"icon":77},"Results & deliverables","/chats-and-tasks/results-and-deliverables","3.chats-and-tasks/5.results-and-deliverables","i-ph-package",{"title":79,"path":80,"stem":81,"icon":82},"Save a chat as a skill","/chats-and-tasks/save-chat-as-skill","3.chats-and-tasks/6.save-chat-as-skill","i-ph-sparkle",{"title":84,"path":85,"stem":86,"children":87,"icon":90},"Models & Skills","/models-and-skills","4.models-and-skills/1.index",[88,91,96,101,105,110,115],{"title":89,"path":85,"stem":86,"icon":90},"LLM configuration","i-ph-cpu",{"title":92,"path":93,"stem":94,"icon":95},"Providers & models","/models-and-skills/providers","4.models-and-skills/2.providers","i-ph-stack",{"title":97,"path":98,"stem":99,"icon":100},"Bring your own key","/models-and-skills/byok","4.models-and-skills/3.byok","i-ph-key",{"title":102,"path":103,"stem":104,"icon":29},"ChatGPT subscription","/models-and-skills/chatgpt-subscription","4.models-and-skills/4.chatgpt-subscription",{"title":106,"path":107,"stem":108,"icon":109},"Skills","/models-and-skills/skills","4.models-and-skills/5.skills","i-ph-puzzle-piece",{"title":111,"path":112,"stem":113,"icon":114},"Installing skills","/models-and-skills/installing-skills","4.models-and-skills/6.installing-skills","i-ph-download-simple",{"title":116,"path":117,"stem":118,"icon":119},"Custom skills","/models-and-skills/custom-skills","4.models-and-skills/7.custom-skills","i-ph-code",{"title":121,"path":122,"stem":123,"children":124,"icon":126},"Connect Your Tools","/connect-your-tools","5.connect-your-tools/1.index",[125,127,132,137,142,147,151],{"title":28,"path":122,"stem":123,"icon":126},"i-ph-plug",{"title":128,"path":129,"stem":130,"icon":131},"Telegram","/connect-your-tools/telegram","5.connect-your-tools/2.telegram","i-ph-telegram-logo",{"title":133,"path":134,"stem":135,"icon":136},"Discord","/connect-your-tools/discord","5.connect-your-tools/3.discord","i-ph-discord-logo",{"title":138,"path":139,"stem":140,"icon":141},"Slack","/connect-your-tools/slack","5.connect-your-tools/4.slack","i-ph-slack-logo",{"title":143,"path":144,"stem":145,"icon":146},"Connectors","/connect-your-tools/connectors","5.connect-your-tools/5.connectors","i-ph-link",{"title":148,"path":149,"stem":150,"icon":100},"Secrets","/connect-your-tools/secrets","5.connect-your-tools/6.secrets",{"title":152,"path":153,"stem":154,"icon":155},"Audit log","/connect-your-tools/secret-audit-log","5.connect-your-tools/7.secret-audit-log","i-ph-scroll",{"title":157,"path":158,"stem":159,"children":160,"icon":188},"Account & Team","/account-and-team","6.account-and-team/1.index",[161,164,169,174,179,183],{"title":162,"path":158,"stem":159,"icon":163},"Signing in","i-ph-sign-in",{"title":165,"path":166,"stem":167,"icon":168},"Team members","/account-and-team/teams","6.account-and-team/3.teams","i-ph-users",{"title":170,"path":171,"stem":172,"icon":173},"Roles & permissions","/account-and-team/roles-and-permissions","6.account-and-team/4.roles-and-permissions","i-ph-shield",{"title":175,"path":176,"stem":177,"icon":178},"Invitations","/account-and-team/invitations","6.account-and-team/5.invitations","i-ph-envelope-simple",{"title":180,"path":181,"stem":182,"icon":21},"Billing & upgrades","/account-and-team/billing","6.account-and-team/6.billing",{"title":184,"path":185,"stem":186,"icon":187},"Support","/account-and-team/support","6.account-and-team/7.support","i-ph-lifebuoy","i-ph-user",{"title":190,"path":191,"stem":192,"children":193,"icon":195},"Apps","/apps","7.apps/1.index",[194,196],{"title":190,"path":191,"stem":192,"icon":195},"i-ph-squares-four",{"title":197,"path":198,"stem":199,"icon":119},"Building an app","/apps/building-an-app","7.apps/2.building-an-app",{"id":201,"title":197,"body":202,"description":2049,"extension":2050,"links":2051,"meta":2052,"navigation":2053,"path":198,"seo":2054,"stem":199,"__hash__":2055},"docs/7.apps/2.building-an-app.md",{"type":203,"value":204,"toc":2036},"minimark",[205,209,218,221,226,233,243,256,260,670,687,691,699,797,811,815,828,831,838,844,1512,1516,1525,1539,1552,1569,1579,1588,1591,1594,1651,1654,1918,1922,1948,1955,1959,2032],[206,207,197],"h1",{"id":208},"building-an-app",[210,211,212,213,217],"p",{},"An app is plain HTML, CSS and JavaScript — no build step, no npm, no framework required.\nIt runs in a locked-down frame and reaches everything through one global: ",[214,215,216],"code",{},"bc",".",[210,219,220],{},"The fastest way to start is to ask an agent. It knows this format and will scaffold the\nfiles for you. This page is the reference for what it writes, and for writing one yourself.",[222,223,225],"h2",{"id":224},"layout","Layout",[210,227,228,229,232],{},"Apps live in your agent's workspace at ",[214,230,231],{},"apps/\u003Cslug>/",":",[234,235,240],"pre",{"className":236,"code":238,"language":239},[237],"language-text","apps/expense-tracker/\n  app.json        the manifest — required\n  index.html      the entry page — required\n  assets/         your CSS and JS\n  scripts/        optional scripts that run on the agent\n  data/           created for you — the app's database and files\n    app.db        SQLite, created on first use\n","text",[214,241,238],{"__ignoreMap":242},"",[210,244,245,248,249,252,253,217],{},[214,246,247],{},"\u003Cslug>"," is lowercase letters, digits and hyphens, and must match the ",[214,250,251],{},"slug"," in ",[214,254,255],{},"app.json",[222,257,259],{"id":258},"the-manifest","The manifest",[234,261,265],{"className":262,"code":263,"language":264,"meta":242,"style":242},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"slug\": \"expense-tracker\",\n  \"name\": \"Expense Tracker\",\n  \"version\": \"0.1.0\",\n  \"description\": \"Track receipts your agent files for you\",\n  \"icon\": \"i-ph-receipt\",\n  \"entry\": \"index.html\",\n  \"capabilities\": [\"sql\", \"files\", \"chat\"],\n  \"secrets\": [],\n  \"toolkits\": [],\n  \"scripts\": [{ \"name\": \"import\", \"run\": \"node scripts/import.js\", \"timeoutSec\": 60 }],\n  \"cron\": [\n    {\n      \"key\": \"weekly-summary\",\n      \"label\": \"Weekly summary\",\n      \"default\": \"0 9 * * 1\",\n      \"prompt\": \"Read apps/expense-tracker/data/app.db and message me last week's total. If there were no expenses, say so in one line.\"\n    }\n  ]\n}\n","json",[214,266,267,276,302,323,344,365,386,407,451,466,480,547,562,568,590,611,632,652,658,664],{"__ignoreMap":242},[268,269,272],"span",{"class":270,"line":271},"line",1,[268,273,275],{"class":274},"sMK4o","{\n",[268,277,279,282,285,288,290,293,297,299],{"class":270,"line":278},2,[268,280,281],{"class":274},"  \"",[268,283,251],{"class":284},"spNyl",[268,286,287],{"class":274},"\"",[268,289,232],{"class":274},[268,291,292],{"class":274}," \"",[268,294,296],{"class":295},"sfazB","expense-tracker",[268,298,287],{"class":274},[268,300,301],{"class":274},",\n",[268,303,305,307,310,312,314,316,319,321],{"class":270,"line":304},3,[268,306,281],{"class":274},[268,308,309],{"class":284},"name",[268,311,287],{"class":274},[268,313,232],{"class":274},[268,315,292],{"class":274},[268,317,318],{"class":295},"Expense Tracker",[268,320,287],{"class":274},[268,322,301],{"class":274},[268,324,326,328,331,333,335,337,340,342],{"class":270,"line":325},4,[268,327,281],{"class":274},[268,329,330],{"class":284},"version",[268,332,287],{"class":274},[268,334,232],{"class":274},[268,336,292],{"class":274},[268,338,339],{"class":295},"0.1.0",[268,341,287],{"class":274},[268,343,301],{"class":274},[268,345,347,349,352,354,356,358,361,363],{"class":270,"line":346},5,[268,348,281],{"class":274},[268,350,351],{"class":284},"description",[268,353,287],{"class":274},[268,355,232],{"class":274},[268,357,292],{"class":274},[268,359,360],{"class":295},"Track receipts your agent files for you",[268,362,287],{"class":274},[268,364,301],{"class":274},[268,366,368,370,373,375,377,379,382,384],{"class":270,"line":367},6,[268,369,281],{"class":274},[268,371,372],{"class":284},"icon",[268,374,287],{"class":274},[268,376,232],{"class":274},[268,378,292],{"class":274},[268,380,381],{"class":295},"i-ph-receipt",[268,383,287],{"class":274},[268,385,301],{"class":274},[268,387,389,391,394,396,398,400,403,405],{"class":270,"line":388},7,[268,390,281],{"class":274},[268,392,393],{"class":284},"entry",[268,395,287],{"class":274},[268,397,232],{"class":274},[268,399,292],{"class":274},[268,401,402],{"class":295},"index.html",[268,404,287],{"class":274},[268,406,301],{"class":274},[268,408,410,412,415,417,419,422,424,427,429,432,434,437,439,441,443,446,448],{"class":270,"line":409},8,[268,411,281],{"class":274},[268,413,414],{"class":284},"capabilities",[268,416,287],{"class":274},[268,418,232],{"class":274},[268,420,421],{"class":274}," [",[268,423,287],{"class":274},[268,425,426],{"class":295},"sql",[268,428,287],{"class":274},[268,430,431],{"class":274},",",[268,433,292],{"class":274},[268,435,436],{"class":295},"files",[268,438,287],{"class":274},[268,440,431],{"class":274},[268,442,292],{"class":274},[268,444,445],{"class":295},"chat",[268,447,287],{"class":274},[268,449,450],{"class":274},"],\n",[268,452,454,456,459,461,463],{"class":270,"line":453},9,[268,455,281],{"class":274},[268,457,458],{"class":284},"secrets",[268,460,287],{"class":274},[268,462,232],{"class":274},[268,464,465],{"class":274}," [],\n",[268,467,469,471,474,476,478],{"class":270,"line":468},10,[268,470,281],{"class":274},[268,472,473],{"class":284},"toolkits",[268,475,287],{"class":274},[268,477,232],{"class":274},[268,479,465],{"class":274},[268,481,483,485,488,490,492,495,497,500,502,504,506,509,511,513,515,518,520,522,524,527,529,531,533,536,538,540,544],{"class":270,"line":482},11,[268,484,281],{"class":274},[268,486,487],{"class":284},"scripts",[268,489,287],{"class":274},[268,491,232],{"class":274},[268,493,494],{"class":274}," [{",[268,496,292],{"class":274},[268,498,309],{"class":499},"sBMFI",[268,501,287],{"class":274},[268,503,232],{"class":274},[268,505,292],{"class":274},[268,507,508],{"class":295},"import",[268,510,287],{"class":274},[268,512,431],{"class":274},[268,514,292],{"class":274},[268,516,517],{"class":499},"run",[268,519,287],{"class":274},[268,521,232],{"class":274},[268,523,292],{"class":274},[268,525,526],{"class":295},"node scripts/import.js",[268,528,287],{"class":274},[268,530,431],{"class":274},[268,532,292],{"class":274},[268,534,535],{"class":499},"timeoutSec",[268,537,287],{"class":274},[268,539,232],{"class":274},[268,541,543],{"class":542},"sbssI"," 60",[268,545,546],{"class":274}," }],\n",[268,548,550,552,555,557,559],{"class":270,"line":549},12,[268,551,281],{"class":274},[268,553,554],{"class":284},"cron",[268,556,287],{"class":274},[268,558,232],{"class":274},[268,560,561],{"class":274}," [\n",[268,563,565],{"class":270,"line":564},13,[268,566,567],{"class":274},"    {\n",[268,569,571,574,577,579,581,583,586,588],{"class":270,"line":570},14,[268,572,573],{"class":274},"      \"",[268,575,576],{"class":499},"key",[268,578,287],{"class":274},[268,580,232],{"class":274},[268,582,292],{"class":274},[268,584,585],{"class":295},"weekly-summary",[268,587,287],{"class":274},[268,589,301],{"class":274},[268,591,593,595,598,600,602,604,607,609],{"class":270,"line":592},15,[268,594,573],{"class":274},[268,596,597],{"class":499},"label",[268,599,287],{"class":274},[268,601,232],{"class":274},[268,603,292],{"class":274},[268,605,606],{"class":295},"Weekly summary",[268,608,287],{"class":274},[268,610,301],{"class":274},[268,612,614,616,619,621,623,625,628,630],{"class":270,"line":613},16,[268,615,573],{"class":274},[268,617,618],{"class":499},"default",[268,620,287],{"class":274},[268,622,232],{"class":274},[268,624,292],{"class":274},[268,626,627],{"class":295},"0 9 * * 1",[268,629,287],{"class":274},[268,631,301],{"class":274},[268,633,635,637,640,642,644,646,649],{"class":270,"line":634},17,[268,636,573],{"class":274},[268,638,639],{"class":499},"prompt",[268,641,287],{"class":274},[268,643,232],{"class":274},[268,645,292],{"class":274},[268,647,648],{"class":295},"Read apps/expense-tracker/data/app.db and message me last week's total. If there were no expenses, say so in one line.",[268,650,651],{"class":274},"\"\n",[268,653,655],{"class":270,"line":654},18,[268,656,657],{"class":274},"    }\n",[268,659,661],{"class":270,"line":660},19,[268,662,663],{"class":274},"  ]\n",[268,665,667],{"class":270,"line":666},20,[268,668,669],{"class":274},"}\n",[210,671,672,674,675,682,683,686],{},[214,673,372],{}," is any ",[676,677,681],"a",{"href":678,"rel":679},"https://phosphoricons.com/",[680],"nofollow","Phosphor icon"," name in ",[214,684,685],{},"i-ph-*"," form.",[688,689,690],"h3",{"id":414},"Capabilities",[210,692,693,695,696,698],{},[214,694,414],{}," gates the ",[214,697,216],{}," API, and the user sees this list before installing. Declare\nonly what you use — calling into an undeclared capability fails.",[700,701,702,715],"table",{},[703,704,705],"thead",{},[706,707,708,712],"tr",{},[709,710,711],"th",{},"Capability",[709,713,714],{},"Unlocks",[716,717,718,731,743,756,768,782],"tbody",{},[706,719,720,725],{},[721,722,723],"td",{},[214,724,426],{},[721,726,727,730],{},[214,728,729],{},"bc.sql.*"," — the app's own SQLite database",[706,732,733,737],{},[721,734,735],{},[214,736,436],{},[721,738,739,742],{},[214,740,741],{},"bc.files.*"," — read and write files in the app folder",[706,744,745,750],{},[721,746,747],{},[214,748,749],{},"script",[721,751,752,755],{},[214,753,754],{},"bc.script.run()"," — run a script from the manifest",[706,757,758,762],{},[721,759,760],{},[214,761,445],{},[721,763,764,767],{},[214,765,766],{},"bc.chat.send()"," — message the agent",[706,769,770,774],{},[721,771,772],{},[214,773,458],{},[721,775,776,779,780],{},[214,777,778],{},"bc.secrets.get()"," — read keys listed in ",[214,781,458],{},[706,783,784,789],{},[721,785,786],{},[214,787,788],{},"tools",[721,790,791,794,795],{},[214,792,793],{},"bc.tools.*"," — call connected tools from ",[214,796,473],{},[210,798,799,801,802,804,805,807,808,810],{},[214,800,458],{}," and ",[214,803,473],{}," are further allowlists: a key not in ",[214,806,458],{}," cannot be read even\nwith the ",[214,809,458],{}," capability, and the credential still has to exist in the workspace.",[688,812,814],{"id":813},"schedules","Schedules",[210,816,817,818,820,821,824,825,827],{},"Each ",[214,819,554],{}," entry becomes a recurring task, so it appears in ",[822,823,64],"strong",{}," where the user can\nreschedule or pause it. The ",[214,826,639],{}," is dispatched to the agent when it fires — write it as\nan instruction, and say what to do when there is nothing to report, or the agent may invent\nactivity to fill the silence.",[210,829,830],{},"The plan's minimum cron interval applies. A schedule faster than the plan allows is created\npaused rather than failing the install.",[222,832,834,835,837],{"id":833},"the-bc-api","The ",[214,836,216],{}," API",[210,839,840,843],{},[214,841,842],{},"window.bc"," exists before your code runs. Every method returns a Promise.",[234,845,849],{"className":846,"code":847,"language":848,"meta":242,"style":242},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// SQLite. Values always go through params — they are bound, never interpolated.\nawait bc.sql.exec('CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT)');\nconst { changes, lastInsertRowid } = await bc.sql.exec(\n  'INSERT INTO items (name) VALUES (?)', [name]\n);\nconst { rows, truncated } = await bc.sql.query('SELECT * FROM items WHERE name LIKE ?', [q + '%']);\n\n// Files, relative to the app folder. Writes are confined to data/.\nawait bc.files.write('data/export.csv', csv);\nconst text = await bc.files.read('data/export.csv');\nconst bytes = await bc.files.readBytes('data/logo.png');\nconst entries = await bc.files.list('data');\nawait bc.files.delete('data/export.csv');\n\n// Hand work to the agent. The reply appears in Chats.\nconst { chatId } = await bc.chat.send('Summarise this month from my expenses table');\n\n// Scripts from the manifest, run on the agent.\nconst { exitCode, stdout, stderr } = await bc.script.run('import', { since: '2026-01-01' });\n\n// Credentials and connected tools, if declared.\nconst key = await bc.secrets.get('OPENEXCHANGE_API_KEY');\nconst { tools } = await bc.tools.search('send an email');\nawait bc.tools.execute('GMAIL_SEND_EMAIL', { to, subject, body });\n\nbc.app;               // { slug, name, version, capabilities }\nawait bc.context();   // the above plus agentId and workspaceId\nawait bc.navigate('/chats');\n","js",[214,850,851,857,894,932,947,953,1014,1020,1025,1056,1091,1126,1161,1188,1192,1197,1236,1240,1245,1312,1316,1322,1358,1398,1446,1451,1467,1487],{"__ignoreMap":242},[268,852,853],{"class":270,"line":271},[268,854,856],{"class":855},"sHwdD","// SQLite. Values always go through params — they are bound, never interpolated.\n",[268,858,859,863,867,869,871,873,877,880,883,886,888,891],{"class":270,"line":278},[268,860,862],{"class":861},"s7zQu","await",[268,864,866],{"class":865},"sTEyZ"," bc",[268,868,217],{"class":274},[268,870,426],{"class":865},[268,872,217],{"class":274},[268,874,876],{"class":875},"s2Zo4","exec",[268,878,879],{"class":865},"(",[268,881,882],{"class":274},"'",[268,884,885],{"class":295},"CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT)",[268,887,882],{"class":274},[268,889,890],{"class":865},")",[268,892,893],{"class":274},";\n",[268,895,896,899,902,905,907,910,913,916,919,921,923,925,927,929],{"class":270,"line":304},[268,897,898],{"class":284},"const",[268,900,901],{"class":274}," {",[268,903,904],{"class":865}," changes",[268,906,431],{"class":274},[268,908,909],{"class":865}," lastInsertRowid ",[268,911,912],{"class":274},"}",[268,914,915],{"class":274}," =",[268,917,918],{"class":861}," await",[268,920,866],{"class":865},[268,922,217],{"class":274},[268,924,426],{"class":865},[268,926,217],{"class":274},[268,928,876],{"class":875},[268,930,931],{"class":865},"(\n",[268,933,934,937,940,942,944],{"class":270,"line":325},[268,935,936],{"class":274},"  '",[268,938,939],{"class":295},"INSERT INTO items (name) VALUES (?)",[268,941,882],{"class":274},[268,943,431],{"class":274},[268,945,946],{"class":865}," [name]\n",[268,948,949,951],{"class":270,"line":346},[268,950,890],{"class":865},[268,952,893],{"class":274},[268,954,955,957,959,962,964,967,969,971,973,975,977,979,981,984,986,988,991,993,995,998,1001,1004,1007,1009,1012],{"class":270,"line":367},[268,956,898],{"class":284},[268,958,901],{"class":274},[268,960,961],{"class":865}," rows",[268,963,431],{"class":274},[268,965,966],{"class":865}," truncated ",[268,968,912],{"class":274},[268,970,915],{"class":274},[268,972,918],{"class":861},[268,974,866],{"class":865},[268,976,217],{"class":274},[268,978,426],{"class":865},[268,980,217],{"class":274},[268,982,983],{"class":875},"query",[268,985,879],{"class":865},[268,987,882],{"class":274},[268,989,990],{"class":295},"SELECT * FROM items WHERE name LIKE ?",[268,992,882],{"class":274},[268,994,431],{"class":274},[268,996,997],{"class":865}," [q ",[268,999,1000],{"class":274},"+",[268,1002,1003],{"class":274}," '",[268,1005,1006],{"class":295},"%",[268,1008,882],{"class":274},[268,1010,1011],{"class":865},"])",[268,1013,893],{"class":274},[268,1015,1016],{"class":270,"line":388},[268,1017,1019],{"emptyLinePlaceholder":1018},true,"\n",[268,1021,1022],{"class":270,"line":409},[268,1023,1024],{"class":855},"// Files, relative to the app folder. Writes are confined to data/.\n",[268,1026,1027,1029,1031,1033,1035,1037,1040,1042,1044,1047,1049,1051,1054],{"class":270,"line":453},[268,1028,862],{"class":861},[268,1030,866],{"class":865},[268,1032,217],{"class":274},[268,1034,436],{"class":865},[268,1036,217],{"class":274},[268,1038,1039],{"class":875},"write",[268,1041,879],{"class":865},[268,1043,882],{"class":274},[268,1045,1046],{"class":295},"data/export.csv",[268,1048,882],{"class":274},[268,1050,431],{"class":274},[268,1052,1053],{"class":865}," csv)",[268,1055,893],{"class":274},[268,1057,1058,1060,1063,1066,1068,1070,1072,1074,1076,1079,1081,1083,1085,1087,1089],{"class":270,"line":468},[268,1059,898],{"class":284},[268,1061,1062],{"class":865}," text ",[268,1064,1065],{"class":274},"=",[268,1067,918],{"class":861},[268,1069,866],{"class":865},[268,1071,217],{"class":274},[268,1073,436],{"class":865},[268,1075,217],{"class":274},[268,1077,1078],{"class":875},"read",[268,1080,879],{"class":865},[268,1082,882],{"class":274},[268,1084,1046],{"class":295},[268,1086,882],{"class":274},[268,1088,890],{"class":865},[268,1090,893],{"class":274},[268,1092,1093,1095,1098,1100,1102,1104,1106,1108,1110,1113,1115,1117,1120,1122,1124],{"class":270,"line":482},[268,1094,898],{"class":284},[268,1096,1097],{"class":865}," bytes ",[268,1099,1065],{"class":274},[268,1101,918],{"class":861},[268,1103,866],{"class":865},[268,1105,217],{"class":274},[268,1107,436],{"class":865},[268,1109,217],{"class":274},[268,1111,1112],{"class":875},"readBytes",[268,1114,879],{"class":865},[268,1116,882],{"class":274},[268,1118,1119],{"class":295},"data/logo.png",[268,1121,882],{"class":274},[268,1123,890],{"class":865},[268,1125,893],{"class":274},[268,1127,1128,1130,1133,1135,1137,1139,1141,1143,1145,1148,1150,1152,1155,1157,1159],{"class":270,"line":549},[268,1129,898],{"class":284},[268,1131,1132],{"class":865}," entries ",[268,1134,1065],{"class":274},[268,1136,918],{"class":861},[268,1138,866],{"class":865},[268,1140,217],{"class":274},[268,1142,436],{"class":865},[268,1144,217],{"class":274},[268,1146,1147],{"class":875},"list",[268,1149,879],{"class":865},[268,1151,882],{"class":274},[268,1153,1154],{"class":295},"data",[268,1156,882],{"class":274},[268,1158,890],{"class":865},[268,1160,893],{"class":274},[268,1162,1163,1165,1167,1169,1171,1173,1176,1178,1180,1182,1184,1186],{"class":270,"line":564},[268,1164,862],{"class":861},[268,1166,866],{"class":865},[268,1168,217],{"class":274},[268,1170,436],{"class":865},[268,1172,217],{"class":274},[268,1174,1175],{"class":875},"delete",[268,1177,879],{"class":865},[268,1179,882],{"class":274},[268,1181,1046],{"class":295},[268,1183,882],{"class":274},[268,1185,890],{"class":865},[268,1187,893],{"class":274},[268,1189,1190],{"class":270,"line":570},[268,1191,1019],{"emptyLinePlaceholder":1018},[268,1193,1194],{"class":270,"line":592},[268,1195,1196],{"class":855},"// Hand work to the agent. The reply appears in Chats.\n",[268,1198,1199,1201,1203,1206,1208,1210,1212,1214,1216,1218,1220,1223,1225,1227,1230,1232,1234],{"class":270,"line":613},[268,1200,898],{"class":284},[268,1202,901],{"class":274},[268,1204,1205],{"class":865}," chatId ",[268,1207,912],{"class":274},[268,1209,915],{"class":274},[268,1211,918],{"class":861},[268,1213,866],{"class":865},[268,1215,217],{"class":274},[268,1217,445],{"class":865},[268,1219,217],{"class":274},[268,1221,1222],{"class":875},"send",[268,1224,879],{"class":865},[268,1226,882],{"class":274},[268,1228,1229],{"class":295},"Summarise this month from my expenses table",[268,1231,882],{"class":274},[268,1233,890],{"class":865},[268,1235,893],{"class":274},[268,1237,1238],{"class":270,"line":634},[268,1239,1019],{"emptyLinePlaceholder":1018},[268,1241,1242],{"class":270,"line":654},[268,1243,1244],{"class":855},"// Scripts from the manifest, run on the agent.\n",[268,1246,1247,1249,1251,1254,1256,1259,1261,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1296,1298,1300,1303,1305,1308,1310],{"class":270,"line":660},[268,1248,898],{"class":284},[268,1250,901],{"class":274},[268,1252,1253],{"class":865}," exitCode",[268,1255,431],{"class":274},[268,1257,1258],{"class":865}," stdout",[268,1260,431],{"class":274},[268,1262,1263],{"class":865}," stderr ",[268,1265,912],{"class":274},[268,1267,915],{"class":274},[268,1269,918],{"class":861},[268,1271,866],{"class":865},[268,1273,217],{"class":274},[268,1275,749],{"class":865},[268,1277,217],{"class":274},[268,1279,517],{"class":875},[268,1281,879],{"class":865},[268,1283,882],{"class":274},[268,1285,508],{"class":295},[268,1287,882],{"class":274},[268,1289,431],{"class":274},[268,1291,901],{"class":274},[268,1293,1295],{"class":1294},"swJcz"," since",[268,1297,232],{"class":274},[268,1299,1003],{"class":274},[268,1301,1302],{"class":295},"2026-01-01",[268,1304,882],{"class":274},[268,1306,1307],{"class":274}," }",[268,1309,890],{"class":865},[268,1311,893],{"class":274},[268,1313,1314],{"class":270,"line":666},[268,1315,1019],{"emptyLinePlaceholder":1018},[268,1317,1319],{"class":270,"line":1318},21,[268,1320,1321],{"class":855},"// Credentials and connected tools, if declared.\n",[268,1323,1325,1327,1330,1332,1334,1336,1338,1340,1342,1345,1347,1349,1352,1354,1356],{"class":270,"line":1324},22,[268,1326,898],{"class":284},[268,1328,1329],{"class":865}," key ",[268,1331,1065],{"class":274},[268,1333,918],{"class":861},[268,1335,866],{"class":865},[268,1337,217],{"class":274},[268,1339,458],{"class":865},[268,1341,217],{"class":274},[268,1343,1344],{"class":875},"get",[268,1346,879],{"class":865},[268,1348,882],{"class":274},[268,1350,1351],{"class":295},"OPENEXCHANGE_API_KEY",[268,1353,882],{"class":274},[268,1355,890],{"class":865},[268,1357,893],{"class":274},[268,1359,1361,1363,1365,1368,1370,1372,1374,1376,1378,1380,1382,1385,1387,1389,1392,1394,1396],{"class":270,"line":1360},23,[268,1362,898],{"class":284},[268,1364,901],{"class":274},[268,1366,1367],{"class":865}," tools ",[268,1369,912],{"class":274},[268,1371,915],{"class":274},[268,1373,918],{"class":861},[268,1375,866],{"class":865},[268,1377,217],{"class":274},[268,1379,788],{"class":865},[268,1381,217],{"class":274},[268,1383,1384],{"class":875},"search",[268,1386,879],{"class":865},[268,1388,882],{"class":274},[268,1390,1391],{"class":295},"send an email",[268,1393,882],{"class":274},[268,1395,890],{"class":865},[268,1397,893],{"class":274},[268,1399,1401,1403,1405,1407,1409,1411,1414,1416,1418,1421,1423,1425,1427,1430,1432,1435,1437,1440,1442,1444],{"class":270,"line":1400},24,[268,1402,862],{"class":861},[268,1404,866],{"class":865},[268,1406,217],{"class":274},[268,1408,788],{"class":865},[268,1410,217],{"class":274},[268,1412,1413],{"class":875},"execute",[268,1415,879],{"class":865},[268,1417,882],{"class":274},[268,1419,1420],{"class":295},"GMAIL_SEND_EMAIL",[268,1422,882],{"class":274},[268,1424,431],{"class":274},[268,1426,901],{"class":274},[268,1428,1429],{"class":865}," to",[268,1431,431],{"class":274},[268,1433,1434],{"class":865}," subject",[268,1436,431],{"class":274},[268,1438,1439],{"class":865}," body ",[268,1441,912],{"class":274},[268,1443,890],{"class":865},[268,1445,893],{"class":274},[268,1447,1449],{"class":270,"line":1448},25,[268,1450,1019],{"emptyLinePlaceholder":1018},[268,1452,1454,1456,1458,1461,1464],{"class":270,"line":1453},26,[268,1455,216],{"class":865},[268,1457,217],{"class":274},[268,1459,1460],{"class":865},"app",[268,1462,1463],{"class":274},";",[268,1465,1466],{"class":855},"               // { slug, name, version, capabilities }\n",[268,1468,1470,1472,1474,1476,1479,1482,1484],{"class":270,"line":1469},27,[268,1471,862],{"class":861},[268,1473,866],{"class":865},[268,1475,217],{"class":274},[268,1477,1478],{"class":875},"context",[268,1480,1481],{"class":865},"()",[268,1483,1463],{"class":274},[268,1485,1486],{"class":855},"   // the above plus agentId and workspaceId\n",[268,1488,1490,1492,1494,1496,1499,1501,1503,1506,1508,1510],{"class":270,"line":1489},28,[268,1491,862],{"class":861},[268,1493,866],{"class":865},[268,1495,217],{"class":274},[268,1497,1498],{"class":875},"navigate",[268,1500,879],{"class":865},[268,1502,882],{"class":274},[268,1504,1505],{"class":295},"/chats",[268,1507,882],{"class":274},[268,1509,890],{"class":865},[268,1511,893],{"class":274},[222,1513,1515],{"id":1514},"rules-that-matter","Rules that matter",[210,1517,1518,1521,1522,1524],{},[822,1519,1520],{},"No network of your own."," The frame runs at an opaque origin — no access to the page\naround it, no cookies, no shared storage — and a Content-Security-Policy limits outbound\nrequests to the BetterClaw API alone. Everything goes through ",[214,1523,216],{},". Don't link a CDN or\ncall a third-party API from the page; both are blocked. If an app needs to reach an\nexternal service, do it from a script (see below), where you control the request.",[210,1526,1527,1530,1531,1534,1535,1538],{},[822,1528,1529],{},"Reference assets with plain relative paths."," ",[214,1532,1533],{},"\u003Cscript src=\"assets/app.js\">"," and\n",[214,1536,1537],{},"\u003Clink href=\"assets/app.css\">"," are inlined when the app is served, which is what lets the\nframe stay fully sandboxed. Small images and fonts are inlined too.",[210,1540,1541,1544,1545,1548,1549,217],{},[822,1542,1543],{},"Keep the entry page under 2 MB assembled."," Larger assets belong in ",[214,1546,1547],{},"data/"," and should be\nfetched with ",[214,1550,1551],{},"bc.files.read()",[210,1553,1554,1561,1562,1565,1566,217],{},[822,1555,1556,1557,1560],{},"Never use ",[214,1558,1559],{},"innerHTML"," for data."," Use ",[214,1563,1564],{},"textContent"," or build nodes with ",[214,1567,1568],{},"createElement",[210,1570,1571,1578],{},[822,1572,1573,1574,1577],{},"Create tables with ",[214,1575,1576],{},"IF NOT EXISTS"," on every load."," It keeps a first run and a reopen on\nthe same path, with no schema versioning to maintain.",[210,1580,1581,1584,1585,217],{},[822,1582,1583],{},"Support both colour schemes"," with ",[214,1586,1587],{},"@media (prefers-color-scheme: dark)",[222,1589,1590],{"id":487},"Scripts",[210,1592,1593],{},"A script runs on the agent as a subprocess, in the app folder, with its arguments delivered\nas JSON on stdin. It gets a deliberately minimal environment — not the agent's, which holds\nmodel keys and hub credentials — plus:",[700,1595,1596,1606],{},[703,1597,1598],{},[706,1599,1600,1603],{},[709,1601,1602],{},"Variable",[709,1604,1605],{},"Meaning",[716,1607,1608,1618,1628,1641],{},[706,1609,1610,1615],{},[721,1611,1612],{},[214,1613,1614],{},"BC_APP_SLUG",[721,1616,1617],{},"The app's slug",[706,1619,1620,1625],{},[721,1621,1622],{},[214,1623,1624],{},"BC_APP_DIR",[721,1626,1627],{},"Absolute path to the app folder",[706,1629,1630,1635],{},[721,1631,1632],{},[214,1633,1634],{},"BC_HUB_URL",[721,1636,1637,1638,1640],{},"Base URL for the same API ",[214,1639,216],{}," uses",[706,1642,1643,1648],{},[721,1644,1645],{},[214,1646,1647],{},"BC_APP_TOKEN",[721,1649,1650],{},"Bearer token scoped to this installation, valid for the run",[210,1652,1653],{},"So a script can call the same endpoints the page does:",[234,1655,1657],{"className":846,"code":1656,"language":848,"meta":242,"style":242},"const args = JSON.parse(require('node:fs').readFileSync(0, 'utf-8'));\n\nconst res = await fetch(`${process.env.BC_HUB_URL}/app-api/sql`, {\n  method: 'POST',\n  headers: {\n    'Content-Type': 'application/json',\n    Authorization: `Bearer ${process.env.BC_APP_TOKEN}`,\n  },\n  body: JSON.stringify({ op: 'exec', sql: 'INSERT INTO items (name) VALUES (?)', params: [args.name] }),\n});\n",[214,1658,1659,1716,1720,1764,1780,1789,1810,1841,1846,1910],{"__ignoreMap":242},[268,1660,1661,1663,1666,1668,1671,1673,1676,1678,1681,1683,1685,1688,1690,1692,1694,1697,1699,1702,1704,1706,1709,1711,1714],{"class":270,"line":271},[268,1662,898],{"class":284},[268,1664,1665],{"class":865}," args ",[268,1667,1065],{"class":274},[268,1669,1670],{"class":865}," JSON",[268,1672,217],{"class":274},[268,1674,1675],{"class":875},"parse",[268,1677,879],{"class":865},[268,1679,1680],{"class":875},"require",[268,1682,879],{"class":865},[268,1684,882],{"class":274},[268,1686,1687],{"class":295},"node:fs",[268,1689,882],{"class":274},[268,1691,890],{"class":865},[268,1693,217],{"class":274},[268,1695,1696],{"class":875},"readFileSync",[268,1698,879],{"class":865},[268,1700,1701],{"class":542},"0",[268,1703,431],{"class":274},[268,1705,1003],{"class":274},[268,1707,1708],{"class":295},"utf-8",[268,1710,882],{"class":274},[268,1712,1713],{"class":865},"))",[268,1715,893],{"class":274},[268,1717,1718],{"class":270,"line":278},[268,1719,1019],{"emptyLinePlaceholder":1018},[268,1721,1722,1724,1727,1729,1731,1734,1736,1739,1742,1744,1747,1749,1751,1753,1756,1759,1761],{"class":270,"line":304},[268,1723,898],{"class":284},[268,1725,1726],{"class":865}," res ",[268,1728,1065],{"class":274},[268,1730,918],{"class":861},[268,1732,1733],{"class":875}," fetch",[268,1735,879],{"class":865},[268,1737,1738],{"class":274},"`${",[268,1740,1741],{"class":865},"process",[268,1743,217],{"class":274},[268,1745,1746],{"class":865},"env",[268,1748,217],{"class":274},[268,1750,1634],{"class":865},[268,1752,912],{"class":274},[268,1754,1755],{"class":295},"/app-api/sql",[268,1757,1758],{"class":274},"`",[268,1760,431],{"class":274},[268,1762,1763],{"class":274}," {\n",[268,1765,1766,1769,1771,1773,1776,1778],{"class":270,"line":325},[268,1767,1768],{"class":1294},"  method",[268,1770,232],{"class":274},[268,1772,1003],{"class":274},[268,1774,1775],{"class":295},"POST",[268,1777,882],{"class":274},[268,1779,301],{"class":274},[268,1781,1782,1785,1787],{"class":270,"line":346},[268,1783,1784],{"class":1294},"  headers",[268,1786,232],{"class":274},[268,1788,1763],{"class":274},[268,1790,1791,1794,1797,1799,1801,1803,1806,1808],{"class":270,"line":367},[268,1792,1793],{"class":274},"    '",[268,1795,1796],{"class":1294},"Content-Type",[268,1798,882],{"class":274},[268,1800,232],{"class":274},[268,1802,1003],{"class":274},[268,1804,1805],{"class":295},"application/json",[268,1807,882],{"class":274},[268,1809,301],{"class":274},[268,1811,1812,1815,1817,1820,1823,1826,1828,1830,1832,1834,1836,1839],{"class":270,"line":388},[268,1813,1814],{"class":1294},"    Authorization",[268,1816,232],{"class":274},[268,1818,1819],{"class":274}," `",[268,1821,1822],{"class":295},"Bearer ",[268,1824,1825],{"class":274},"${",[268,1827,1741],{"class":865},[268,1829,217],{"class":274},[268,1831,1746],{"class":865},[268,1833,217],{"class":274},[268,1835,1647],{"class":865},[268,1837,1838],{"class":274},"}`",[268,1840,301],{"class":274},[268,1842,1843],{"class":270,"line":409},[268,1844,1845],{"class":274},"  },\n",[268,1847,1848,1851,1853,1855,1857,1860,1862,1865,1868,1870,1872,1874,1876,1878,1881,1883,1885,1887,1889,1891,1894,1896,1899,1901,1904,1906,1908],{"class":270,"line":453},[268,1849,1850],{"class":1294},"  body",[268,1852,232],{"class":274},[268,1854,1670],{"class":865},[268,1856,217],{"class":274},[268,1858,1859],{"class":875},"stringify",[268,1861,879],{"class":865},[268,1863,1864],{"class":274},"{",[268,1866,1867],{"class":1294}," op",[268,1869,232],{"class":274},[268,1871,1003],{"class":274},[268,1873,876],{"class":295},[268,1875,882],{"class":274},[268,1877,431],{"class":274},[268,1879,1880],{"class":1294}," sql",[268,1882,232],{"class":274},[268,1884,1003],{"class":274},[268,1886,939],{"class":295},[268,1888,882],{"class":274},[268,1890,431],{"class":274},[268,1892,1893],{"class":1294}," params",[268,1895,232],{"class":274},[268,1897,1898],{"class":865}," [args",[268,1900,217],{"class":274},[268,1902,1903],{"class":865},"name] ",[268,1905,912],{"class":274},[268,1907,890],{"class":865},[268,1909,301],{"class":274},[268,1911,1912,1914,1916],{"class":270,"line":468},[268,1913,912],{"class":274},[268,1915,890],{"class":865},[268,1917,893],{"class":274},[222,1919,1921],{"id":1920},"the-authoring-loop","The authoring loop",[1923,1924,1925,1931,1941],"ol",{},[1926,1927,1928,1929,217],"li",{},"Ask an agent to build the app. It writes the files into ",[214,1930,231],{},[1926,1932,1933,1934,1936,1937,1940],{},"In ",[822,1935,190],{},", choose ",[822,1938,1939],{},"Load from agent"," and enter the slug.",[1926,1942,1943,1944,1947],{},"Ask for changes in the chat, then hit ",[822,1945,1946],{},"Reload"," in the app panel.",[210,1949,1950,1951,1954],{},"An app registered this way stays at version ",[214,1952,1953],{},"dev"," and is re-read from the agent every time\nit opens, so there is no reinstall step while you iterate.",[222,1956,1958],{"id":1957},"troubleshooting","Troubleshooting",[700,1960,1961,1971],{},[703,1962,1963],{},[706,1964,1965,1968],{},[709,1966,1967],{},"What you see",[709,1969,1970],{},"Usually means",[716,1972,1973,1987,1999,2011,2024],{},[706,1974,1975,1981],{},[721,1976,1977],{},[1978,1979,1980],"em",{},"App is not installed",[721,1982,1983,1984,1986],{},"The folder or ",[214,1985,255],{}," is missing, or the slug and folder name disagree",[706,1988,1989,1994],{},[721,1990,1991],{},[1978,1992,1993],{},"did not declare the X capability",[721,1995,1996,1997],{},"Add it to ",[214,1998,414],{},[706,2000,2001,2006],{},[721,2002,2003],{},[1978,2004,2005],{},"Apps may only write under data/",[721,2007,2008,2009],{},"A published app's own code is read-only; app data goes in ",[214,2010,1547],{},[706,2012,2013,2018],{},[721,2014,2015],{},[1978,2016,2017],{},"No secret \"K\" is configured",[721,2019,2020,2021,2023],{},"Add the credential under ",[822,2022,148],{}," in the workspace",[706,2025,2026,2029],{},[721,2027,2028],{},"A blank panel",[721,2030,2031],{},"A JavaScript error — check the browser console",[2033,2034,2035],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":242,"searchDepth":271,"depth":278,"links":2037},[2038,2039,2043,2045,2046,2047,2048],{"id":224,"depth":278,"text":225},{"id":258,"depth":278,"text":259,"children":2040},[2041,2042],{"id":414,"depth":304,"text":690},{"id":813,"depth":304,"text":814},{"id":833,"depth":278,"text":2044},"The bc API",{"id":1514,"depth":278,"text":1515},{"id":487,"depth":278,"text":1590},{"id":1920,"depth":278,"text":1921},{"id":1957,"depth":278,"text":1958},"The manifest, the bc API, and the rules a BetterClaw app runs under.","md",null,{},{"icon":119},{"title":197,"description":2049},"FwyfG0DZpcYldkmLLFVKWu35Nravm8p9QPTPimIl1k4",[2057,2051],{"title":190,"path":191,"stem":192,"description":2058,"icon":195,"children":-1},"Small purpose-built interfaces that run against your agent, with their own storage and schedules.",1789675864731]