[{"data":1,"prerenderedAt":870},["ShallowReactive",2],{"repo-tree":3,"repo-\u002Finternal\u002Fchatwoot\u002Freadme":283},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,69,72,75,78,81,84,86,88,90,93,96,99,102,105,108,111,114,117,120,123,125,127,129,131,133,135,138,141,143,146,149,152,155,158,161,164,167,169,172,175,178,180,183,186,189,192,195,198,201,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281],{"path":5,"title":6},"\u002Fagents\u002Fbackend-code-style","Backend Conventions",{"path":8,"title":9},"\u002Fagents\u002Fdatabase","Database",{"path":11,"title":12},"\u002Fagents\u002Fportal-code-style","Portal Conventions",{"path":14,"title":15},"\u002Fagents\u002Ftranslation","Translation",{"path":17,"title":18},"\u002Fconventions\u002Fbackend-coding","Backend coding conventions",{"path":20,"title":21},"\u002Fconventions\u002Ffrontend-coding","Frontend coding conventions",{"path":23,"title":24},"\u002Fdevelopment-process","Development process",{"path":26,"title":27},"\u002Flearning-api-preview-hetzner-setup","Learning API Preview on Hetzner + Cloudflare",{"path":29,"title":30},"\u002Flearning-api-preview-vm-plan","Learning API Preview VM Plan",{"path":32,"title":33},"\u002Fmonorepo-structure","Monorepo structure",{"path":35,"title":36},"\u002Foperations","Operations — bugs and support",{"path":38,"title":39},"\u002Fpostmortems\u002F2026-03-16_onboarding-currency-regression","Onboarding Zod transform silently broken — web signups assigned wrong checkout currency",{"path":41,"title":42},"\u002Fpostmortems\u002Freadme","Postmortems",{"path":44,"title":45},"\u002Fpostmortems\u002F_template","TEMPLATE",{"path":47,"title":48},"\u002Fpostmortems\u002Fposthog-comparison","Postmortem practice — comparison with PostHog",{"path":50,"title":51},"\u002Fpreview-environment-plan","Preview Environment Plan",{"path":53,"title":54},"\u002Fprinciples","Engineering principles",{"path":56,"title":57},"\u002Fworking-with-ai","Working with AI",{"path":59,"title":60},"\u002F.claude\u002Fskills\u002Feval-playground\u002Fskill","Eval Playground — Co-development Skill",{"path":62,"title":63},"\u002F.claude\u002Fskills\u002Ffigma-diff-section\u002Fskill","Figma Diff Section Pipeline",{"path":65,"title":66},"\u002Fagents","AGENTS.md",{"path":68,"title":66},"\u002Fclaude",{"path":70,"title":71},"\u002Freadme","Studyflash",{"path":73,"title":74},"\u002Fapps\u002Fcore-api\u002Fagents","Core API (apps\u002Fcore-api)",{"path":76,"title":77},"\u002Fapps\u002Fcore-api\u002Freadme","README",{"path":79,"title":80},"\u002Fapps\u002Femail-previews\u002Fagents","Email Previews (apps\u002Femail-previews)",{"path":82,"title":83},"\u002Fapps\u002Flanding-page\u002Fagents","Landing Page (apps\u002Flanding-page)",{"path":85,"title":83},"\u002Fapps\u002Flanding-page\u002Fclaude",{"path":87,"title":66},"\u002Fapps\u002Flearning-api\u002Fagents",{"path":89,"title":77},"\u002Fapps\u002Flearning-api\u002Freadme",{"path":91,"title":92},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Feval_metrics_design","Surface-Specific Eval Metrics Design",{"path":94,"title":95},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ftest_set","Quiz Eval Test Set",{"path":97,"title":98},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ffrontend\u002Freadme","React + TypeScript + Vite",{"path":100,"title":101},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fcontent-pillar-shallow-coverage\u002Freadme","Content pillar misses subtopics in dense documents",{"path":103,"title":104},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-empty-section-headers\u002Freadme","Empty section headers dropped by docling chunker",{"path":106,"title":107},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-table-reading-order\u002Freadme","Table\u002Fbox layout causes wrong reading order",{"path":109,"title":110},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fmetrics\u002Freadme","Quiz eval metrics — canonical rubrics",{"path":112,"title":113},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-12-quiz-summary-feedback-current-state","Quiz and Summary Feedback Current State",{"path":115,"title":116},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-24-quiz-eval-metrics","Quiz Evaluation Metrics",{"path":118,"title":119},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-05-01-quiz-eval-current-state","Quiz Eval Current State",{"path":121,"title":122},"\u002Fapps\u002Flearning-api\u002Fmonitoring\u002Freadme","Monitoring Stack",{"path":124,"title":77},"\u002Fapps\u002Flearning-api\u002Fshared\u002Freadme",{"path":126,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fflashcard_agent\u002Freadme",{"path":128,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fingestion_agent\u002Freadme",{"path":130,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fquiz_agent\u002Freadme",{"path":132,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fsummary_agent\u002Freadme",{"path":134,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Fparser\u002Freadme",{"path":136,"title":137},"\u002Fapps\u002Fmarketing-emails-preview\u002Fagents","Marketing Emails Preview (apps\u002Fmarketing-emails-preview)",{"path":139,"title":140},"\u002Fapps\u002Fmobile-app\u002Fagents","StudyFlash Mobile App - Claude Code Configuration",{"path":142,"title":140},"\u002Fapps\u002Fmobile-app\u002Fclaude",{"path":144,"title":145},"\u002Fapps\u002Fmountain-max\u002Fagents","Mountain Max (apps\u002Fmountain-max)",{"path":147,"title":148},"\u002Fapps\u002Fmountain-max\u002Fgame\u002Freadme","Mountain Max Game",{"path":150,"title":151},"\u002Fapps\u002Fportal\u002Fagents","Portal (apps\u002Fportal)",{"path":153,"title":154},"\u002Fapps\u002Fportal\u002Freadme","Nuxt Minimal Starter",{"path":156,"title":157},"\u002Fapps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002Freadme","File Upload Composables",{"path":159,"title":160},"\u002Fapps\u002Fportal\u002Fdocs\u002Flibrary-routing","Library Routing Documentation",{"path":162,"title":163},"\u002Fapps\u002Fsupabase\u002Fagents","Supabase (apps\u002Fsupabase)",{"path":165,"title":166},"\u002Fapps\u002Fwrapped\u002Fagents","Wrapped (apps\u002Fwrapped)",{"path":168,"title":98},"\u002Fapps\u002Fwrapped\u002Freadme",{"path":170,"title":171},"\u002Finfra\u002Freadme","infra\u002F",{"path":173,"title":174},"\u002Finfra\u002Fdns\u002Freadme","DNS Infrastructure",{"path":176,"title":177},"\u002Finfra\u002Fdokploy\u002Freadme","studyflash-dokploy",{"path":179,"title":77},"\u002Finfra\u002Fdokploy\u002Fsdk\u002Fnodejs\u002Freadme",{"path":181,"title":182},"\u002Finfra\u002Finfisical\u002Freadme","Infisical Infrastructure",{"path":184,"title":185},"\u002Finfra\u002Flearning-api\u002Freadme","Pulumi GCP TypeScript Template",{"path":187,"title":188},"\u002Finfra\u002Fopenreplay\u002Freadme","OpenReplay on Hetzner",{"path":190,"title":191},"\u002Finfra\u002Fscripts\u002Freadme","infra\u002Fscripts\u002F",{"path":193,"title":194},"\u002Finfra\u002Fturborepo-cache\u002Freadme","Turborepo Remote Cache Infrastructure",{"path":196,"title":197},"\u002Finternal\u002Fchatwoot\u002Freadme","Chatwoot Infrastructure",{"path":199,"title":200},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Freadme","studyflash-chatwoot-provider",{"path":202,"title":77},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Fsdk\u002Fnodejs\u002Freadme",{"path":204,"title":205},"\u002Finternal\u002Fdocs\u002Freadme","internal\u002Fdocs",{"path":207,"title":208},"\u002Finternal\u002Fsupport-bot\u002Fclaude","Support Bot (Maximilian)",{"path":210,"title":211},"\u002Finternal\u002Fsupport-bot\u002Freadme","Studyflash Customer Support Bot (Maximilian)",{"path":213,"title":214},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Faccount_issues","Account Issues",{"path":216,"title":217},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fbilling_invoice","Billing Invoice",{"path":219,"title":220},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fcontent_upload","Content Upload",{"path":222,"title":223},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fdata_loss","Data Loss",{"path":225,"title":226},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fflashcard_issues","Flashcard Issues",{"path":228,"title":229},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgarbage","Garbage",{"path":231,"title":232},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgeneral_how_to","General How To",{"path":234,"title":235},"\u002Finternal\u002Fsupport-bot\u002Fkb","Knowledge Base Index",{"path":237,"title":238},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Flanguage_issues","Language Issues",{"path":240,"title":241},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmindmap_issues","Mindmap Issues",{"path":243,"title":244},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmisunderstanding","Misunderstanding",{"path":246,"title":247},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmock_exam_issues","Mock Exam Issues",{"path":249,"title":250},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fpodcast_issues","Podcast Issues",{"path":252,"title":253},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fquiz_issues","Quiz Issues",{"path":255,"title":256},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Frefund_request","Refund Request",{"path":258,"title":259},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_cancellation","Subscription Cancellation",{"path":261,"title":262},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_info","Subscription Info",{"path":264,"title":265},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsummary_issues","Summary Issues",{"path":267,"title":268},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Ftechnical_errors","Technical Errors",{"path":270,"title":271},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fvideo_issues","Video Issues",{"path":273,"title":274},"\u002Fpackages\u002Fcommon\u002Fdocs\u002Fearly-access-features","Declarative Early Access Features",{"path":276,"title":277},"\u002Fpackages\u002Fcommon\u002Fscripts\u002Freadme","Common Package Scripts",{"path":279,"title":280},"\u002Fpackages\u002Fdevtools\u002Ffigma-plugins\u002Freadme","Figma plugins",{"path":282,"title":77},"\u002Fpackages\u002Fpulumi-infisical\u002Freadme",{"id":284,"title":197,"body":285,"description":862,"extension":863,"lastReviewed":864,"meta":865,"navigation":866,"owner":864,"path":196,"seo":867,"status":864,"stem":868,"tags":864,"__hash__":869},"repo\u002Finternal\u002Fchatwoot\u002FREADME.md",{"type":286,"value":287,"toc":848},"minimark",[288,292,305,310,349,353,379,383,412,416,433,446,451,488,518,522,563,567,573,584,624,631,637,641,660,712,718,722,750,764,768,786,790,844],[289,290,197],"h1",{"id":291},"chatwoot-infrastructure",[293,294,295,296,300,301,304],"p",{},"Pulumi project that declares the configuration running on the\nself-hosted Chatwoot at ",[297,298,299],"code",{},"support.studyflash.ch"," (account_id ",[297,302,303],{},"2",").",[306,307,309],"h3",{"id":308},"automation-rules","Automation rules",[311,312,313,324,338],"ul",{},[314,315,316,319,320,323],"li",{},[297,317,318],{},"assign-dev-support-to-rajiv"," — assigns conversations labelled ",[297,321,322],{},"dev-support"," to Rajiv (currently inactive).",[314,325,326,329,330,333,334,337],{},[297,327,328],{},"rxdb-bug-on-create"," — auto-replies on ",[297,331,332],{},"conversation_created"," when the contact email contains ",[297,335,336],{},"RxDB Error-Code: DB6",".",[314,339,340,329,343,333,346,337],{},[297,341,342],{},"rxdb-bug-on-open",[297,344,345],{},"conversation_opened",[297,347,348],{},"RxDB Error-Code",[306,350,352],{"id":351},"agent-bots","Agent bots",[311,354,355],{},[314,356,357,360,361,365,366,369,370,373,374,378],{},[297,358,359],{},"maximilian"," — the support bot's Chatwoot identity. Declared but\n",[362,363,364],"strong",{},"not bound to any inbox",". Chatwoot bot-scope tokens are too narrow\nfor the support-bot's needs (no labels, no reads), so we kept the\nlegacy ",[297,367,368],{},"n8n-legacy"," webhook as the live event path. Maximilian\nremains as reproducible config and its ",[297,371,372],{},"accessToken"," is exported as\na stack output — useful for future signature verification on the\nwebhook receiver, or for bot-attributed POSTs (the operations the\nbot scope ",[375,376,377],"em",{},"does"," allow: messages, custom_attributes, toggle_status,\nassignments, sla_policy).",[306,380,382],{"id":381},"inboxes","Inboxes",[311,384,385,395],{},[314,386,387,390,391,394],{},[297,388,389],{},"support-mailbox"," (id ",[297,392,393],{},"1",") — Email channel, Microsoft 365 OAuth.\nImap\u002FSMTP credentials are not modeled in the resource (deliberately\nnarrow schema) and stay whatever Chatwoot has on disk.",[314,396,397,390,400,403,404,407,408,411],{},[297,398,399],{},"mobile-app-api",[297,401,402],{},"5",") — API channel; ",[297,405,406],{},"webhook_url"," points at\nthe production ",[297,409,410],{},"studyflash-core-api"," worker. (Was previously\npointing at a stale PR-1959 preview URL — fixed by this PR.)",[306,413,415],{"id":414},"webhooks","Webhooks",[311,417,418],{},[314,419,420,390,422,424,425,428,429,432],{},[297,421,368],{},[297,423,393],{},", Chatwoot name ",[297,426,427],{},"N8N",") — historical account-level\nwebhook delivering ",[297,430,431],{},"message_created"," events to the support-bot.\nBrought under management here so it can be torn down declaratively\nin a future change once we have a replacement event path.",[293,434,435,436,441,442,445],{},"SLA assignment for premium users is handled separately by the\n",[437,438,440],"a",{"href":439},"..\u002Fsupport-bot\u002F","support-bot"," calling Chatwoot's\n",[297,443,444],{},"apply_sla_policy"," API directly — there is no automation rule for it.",[447,448,450],"h2",{"id":449},"how-this-is-wired","How this is wired",[293,452,453,454,460,461,469,470,472,473,476,477,483,484,487],{},"There's no Pulumi-shipped or community Terraform provider for Chatwoot,\nso we ship our own at ",[437,455,457],{"href":456},".\u002Fprovider\u002F",[297,458,459],{},"provider\u002F"," — a Go-native plugin\nbuilt on ",[437,462,466],{"href":463,"rel":464},"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fpulumi-go-provider",[465],"nofollow",[297,467,468],{},"pulumi-go-provider",".\nThis stack consumes the generated TypeScript SDK\n(",[297,471,200],{},") via ",[297,474,475],{},"workspace:*",". See\n",[437,478,480],{"href":479},".\u002Fprovider\u002FREADME",[297,481,482],{},"provider\u002FREADME.md"," for the resource catalogue,\nthe build\u002Fregenerate workflow, and the full list of ",[297,485,486],{},"payload","-envelope\nquirks the client transparently unwraps.",[293,489,490,491,494,495,494,498,501,502,505,506,509,510,513,514,517],{},"The provider used to live as a Pulumi Dynamic Provider directly inside\nthis directory (",[297,492,493],{},"automationRule.ts",", ",[297,496,497],{},"agentBot.ts",[297,499,500],{},"inboxAgentBot.ts",").\nThe dynamic-provider closure was serialised into each resource's state,\nso any provider edit triggered a ",[297,503,504],{},"replace"," that called ",[297,507,508],{},"delete"," on every\nlive Chatwoot resource — catastrophic for production. The Go-native\nrewrite has none of those gaps: ",[297,511,512],{},"read"," works, ",[297,515,516],{},"pulumi import"," works, and\nprovider edits are a no-op on existing state.",[447,519,521],{"id":520},"stack-outputs","Stack outputs",[523,524,525,541],"table",{},[526,527,528],"thead",{},[529,530,531,535,538],"tr",{},[532,533,534],"th",{},"Name",[532,536,537],{},"Type",[532,539,540],{},"Notes",[542,543,544],"tbody",{},[529,545,546,552,557],{},[547,548,549],"td",{},[297,550,551],{},"maximilianAccessToken",[547,553,554],{},[297,555,556],{},"secret string",[547,558,559,560,337],{},"The bot's Chatwoot access_token. Currently unused by any consumer. Available for future use (webhook signature verification, bot-attributed POSTs) via ",[297,561,562],{},"pulumi.StackReference",[447,564,566],{"id":565},"apply","Apply",[293,568,569,570],{},"Run the shared Pulumi bootstrap once per machine (handles ",[297,571,572],{},"pulumi login",[311,574,575],{},[314,576,577,578,583],{},"R2 credentials — see ",[437,579,581],{"href":580},"..\u002F..\u002Finfra\u002Fscripts\u002F",[297,582,191],{},"), then:",[585,586,591],"pre",{"className":587,"code":588,"language":589,"meta":590,"style":590},"language-sh shiki shiki-themes github-light github-dark","pnpm preview   # pulumi preview --diff\npnpm run pulumi:up # pulumi up\n","sh","",[297,592,593,610],{"__ignoreMap":590},[594,595,598,602,606],"span",{"class":596,"line":597},"line",1,[594,599,601],{"class":600},"sScJk","pnpm",[594,603,605],{"class":604},"sZZnC"," preview",[594,607,609],{"class":608},"sJ8bj","   # pulumi preview --diff\n",[594,611,613,615,618,621],{"class":596,"line":612},2,[594,614,601],{"class":600},[594,616,617],{"class":604}," run",[594,619,620],{"class":604}," pulumi:up",[594,622,623],{"class":608}," # pulumi up\n",[293,625,626,627,630],{},"Both wrap ",[297,628,629],{},"infisical run --path=\u002Finternal\u002Fchatwoot\u002F -- pulumi \u003Caction>","\nso the Chatwoot creds reach the provider without ever touching disk.",[293,632,633,634,636],{},"No cross-stack dependency is live today. ",[297,635,551],{}," is\nexported but unconsumed — feel free to apply this stack on its own.",[447,638,640],{"id":639},"credentials","Credentials",[293,642,643,644,647,648,651,652,655,656,659],{},"Stack-specific creds are sourced from Infisical at ",[297,645,646],{},"\u002Finternal\u002Fchatwoot\u002F","\non the ",[297,649,650],{},"prod"," env. (Backend creds — ",[297,653,654],{},"PULUMI_BACKEND_URL",", R2 keys — are\nshared across all stacks and live at ",[297,657,658],{},"\u002Finfra\u002Fscripts\u002F","; the bootstrap\nscript handles them.)",[523,661,662,675],{},[526,663,664],{},[529,665,666,669,672],{},[532,667,668],{},"Var",[532,670,671],{},"Where it comes from",[532,673,674],{},"Why it's needed",[542,676,677,694],{},[529,678,679,684,691],{},[547,680,681],{},[297,682,683],{},"CHATWOOT_API_URL",[547,685,686,687,690],{},"Infisical (",[297,688,689],{},"https:\u002F\u002Fsupport.studyflash.ch",")",[547,692,693],{},"Base URL for the REST calls",[529,695,696,701,707],{},[547,697,698],{},[297,699,700],{},"CHATWOOT_API_KEY",[547,702,703,704,690],{},"Infisical (Chatwoot user ",[297,705,706],{},"api_access_token",[547,708,709,711],{},[297,710,706],{}," header",[293,713,714,715,717],{},"The Chatwoot API key should belong to a dedicated automation user with\nadmin scope on account ",[297,716,303],{},". Don't reuse a personal token — the audit log\nwill attribute every Pulumi-driven change to whoever's token it is.",[447,719,721],{"id":720},"stack-config","Stack config",[585,723,727],{"className":724,"code":725,"language":726,"meta":590,"style":590},"language-yaml shiki shiki-themes github-light github-dark","config:\n  studyflash-chatwoot:accountId: \"2\"\n","yaml",[297,728,729,739],{"__ignoreMap":590},[594,730,731,735],{"class":596,"line":597},[594,732,734],{"class":733},"s9eBZ","config",[594,736,738],{"class":737},"sVt8B",":\n",[594,740,741,744,747],{"class":596,"line":612},[594,742,743],{"class":733},"  studyflash-chatwoot:accountId",[594,745,746],{"class":737},": ",[594,748,749],{"class":604},"\"2\"\n",[293,751,752,755,756,759,760,763],{},[297,753,754],{},"accountId"," defaults to ",[297,757,758],{},"\"2\""," in ",[297,761,762],{},"index.ts"," if unset, so a one-off override\nper stack is possible without code changes.",[447,765,767],{"id":766},"state-migration-from-the-dynamic-provider","State migration from the dynamic provider",[293,769,770,771,773,774,777,778,781,782,785],{},"Existing prod state holds the three rules + ",[297,772,359],{}," + the inbox\nbinding as ",[297,775,776],{},"pulumi-nodejs:dynamic:Resource",". The new provider's URNs\nare ",[297,779,780],{},"chatwoot:index:AutomationRule"," etc. Pulumi can't auto-migrate URNs\nacross providers, so a one-shot stack-state edit is required per stack.\nThe runbook lives in the PR description; verify with ",[297,783,784],{},"pnpm preview","\nafterwards (must show zero diff).",[447,787,789],{"id":788},"references","References",[311,791,792,799,809,827,837],{},[314,793,794,795],{},"Provider source: ",[437,796,797],{"href":456},[297,798,459],{},[314,800,801,802],{},"Chatwoot automation rules controller (source of truth for the\nrequest\u002Fresponse schema):\n",[437,803,806],{"href":804,"rel":805},"https:\u002F\u002Fgithub.com\u002Fchatwoot\u002Fchatwoot\u002Fblob\u002Fdevelop\u002Fapp\u002Fcontrollers\u002Fapi\u002Fv1\u002Faccounts\u002Fautomation_rules_controller.rb",[465],[297,807,808],{},"app\u002Fcontrollers\u002Fapi\u002Fv1\u002Faccounts\u002Fautomation_rules_controller.rb",[314,810,811,812,815,816,819,820],{},"Chatwoot automation rule model (allowed ",[297,813,814],{},"attribute_key"," \u002F\n",[297,817,818],{},"action_name"," values):\n",[437,821,824],{"href":822,"rel":823},"https:\u002F\u002Fgithub.com\u002Fchatwoot\u002Fchatwoot\u002Fblob\u002Fdevelop\u002Fapp\u002Fmodels\u002Fautomation_rule.rb",[465],[297,825,826],{},"app\u002Fmodels\u002Fautomation_rule.rb",[314,828,829,830],{},"Chatwoot agent bots controller:\n",[437,831,834],{"href":832,"rel":833},"https:\u002F\u002Fgithub.com\u002Fchatwoot\u002Fchatwoot\u002Fblob\u002Fdevelop\u002Fapp\u002Fcontrollers\u002Fapi\u002Fv1\u002Faccounts\u002Fagent_bots_controller.rb",[465],[297,835,836],{},"app\u002Fcontrollers\u002Fapi\u002Fv1\u002Faccounts\u002Fagent_bots_controller.rb",[314,838,839,840],{},"Agent Bot API reference:\n",[437,841,842],{"href":842,"rel":843},"https:\u002F\u002Fdevelopers.chatwoot.com\u002Fapi-reference\u002Fagentbots\u002Fcreate-an-agent-bot",[465],[845,846,847],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":590,"searchDepth":612,"depth":612,"links":849},[850,852,853,854,855,856,857,858,859,860,861],{"id":308,"depth":851,"text":309},3,{"id":351,"depth":851,"text":352},{"id":381,"depth":851,"text":382},{"id":414,"depth":851,"text":415},{"id":449,"depth":612,"text":450},{"id":520,"depth":612,"text":521},{"id":565,"depth":612,"text":566},{"id":639,"depth":612,"text":640},{"id":720,"depth":612,"text":721},{"id":766,"depth":612,"text":767},{"id":788,"depth":612,"text":789},"Pulumi project that declares the configuration running on the\nself-hosted Chatwoot at support.studyflash.ch (account_id 2).","md",null,{},true,{"title":197,"description":862},"internal\u002Fchatwoot\u002FREADME","k_P36K2WFRK-0cGzAteCNvMbXGQ-9IDI4evNRFPaPrM",1779007964115]