[{"data":1,"prerenderedAt":1430},["ShallowReactive",2],{"repo-tree":3,"repo-\u002Finternal\u002Fchatwoot\u002Fprovider\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":200,"body":285,"description":1423,"extension":1424,"lastReviewed":1425,"meta":1426,"navigation":837,"owner":1425,"path":199,"seo":1427,"status":1425,"stem":1428,"tags":1425,"__hash__":1429},"repo\u002Finternal\u002Fchatwoot\u002Fprovider\u002FREADME.md",{"type":286,"value":287,"toc":1410},"minimark",[288,294,338,375,380,538,547,552,612,619,647,651,661,698,722,726,756,802,1132,1136,1149,1198,1206,1295,1310,1314,1317,1344,1360,1364,1372,1376,1406],[289,290,291],"h1",{"id":200},[292,293,200],"code",{},[295,296,297,298,305,306,309,310,313,314,321,322,325,326,329,330,333,334,337],"p",{},"Pulumi-native resource provider for the self-hosted ",[299,300,304],"a",{"href":301,"rel":302},"https:\u002F\u002Fchatwoot.com",[303],"nofollow","Chatwoot","\nat ",[292,307,308],{},"support.studyflash.ch"," (account ",[292,311,312],{},"2","). Implemented in Go via\n",[299,315,318],{"href":316,"rel":317},"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fpulumi-go-provider",[303],[292,319,320],{},"pulumi-go-provider",". Ships\na real plugin binary (",[292,323,324],{},"pulumi-resource-chatwoot",") and a generated TypeScript\nSDK at ",[292,327,328],{},"sdk\u002Fnodejs\u002F",", consumed by the parent stack at ",[292,331,332],{},"internal\u002Fchatwoot\u002F","\nvia ",[292,335,336],{},"workspace:*",".",[295,339,340,341,343,344,347,348,347,351,354,355,358,359,362,363,366,367,370,371,374],{},"This replaces a Pulumi Dynamic Provider that lived directly inside\n",[292,342,332],{}," (",[292,345,346],{},"automationRule.ts",", ",[292,349,350],{},"agentBot.ts",[292,352,353],{},"inboxAgentBot.ts",").\nThe dynamic-provider closure was serialised into each resource's state, so\nany provider edit triggered a ",[292,356,357],{},"replace"," that called ",[292,360,361],{},"delete"," on every live\nChatwoot resource — catastrophic for production. The native implementation\nhas none of those gaps: ",[292,364,365],{},"read"," works, ",[292,368,369],{},"pulumi import"," and ",[292,372,373],{},"pulumi refresh","\nwork, and provider edits are a no-op against existing state.",[376,377,379],"h2",{"id":378},"resources-v0","Resources (v0)",[381,382,383,396],"table",{},[384,385,386],"thead",{},[387,388,389,393],"tr",{},[390,391,392],"th",{},"Pulumi token",[390,394,395],{},"Chatwoot API",[397,398,399,412,424,441,453,465,477,490,502,514,526],"tbody",{},[387,400,401,407],{},[402,403,404],"td",{},[292,405,406],{},"chatwoot:index:AutomationRule",[402,408,409],{},[292,410,411],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fautomation_rules",[387,413,414,419],{},[402,415,416],{},[292,417,418],{},"chatwoot:index:AgentBot",[402,420,421],{},[292,422,423],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fagent_bots",[387,425,426,431],{},[402,427,428],{},[292,429,430],{},"chatwoot:index:InboxAgentBot",[402,432,433,436,437,440],{},[292,434,435],{},"POST \u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Finbox\u002F{id}\u002Fset_agent_bot"," + ",[292,438,439],{},"GET ...\u002Finboxes\u002F{id}"," (drift)",[387,442,443,448],{},[402,444,445],{},[292,446,447],{},"chatwoot:index:Webhook",[402,449,450],{},[292,451,452],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fwebhooks",[387,454,455,460],{},[402,456,457],{},[292,458,459],{},"chatwoot:index:Inbox",[402,461,462],{},[292,463,464],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Finboxes",[387,466,467,472],{},[402,468,469],{},[292,470,471],{},"chatwoot:index:Team",[402,473,474],{},[292,475,476],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fteams",[387,478,479,484],{},[402,480,481],{},[292,482,483],{},"chatwoot:index:TeamMember",[402,485,486,489],{},[292,487,488],{},"POST\u002FDELETE \u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fteams\u002F{id}\u002Fteam_members"," (binding)",[387,491,492,497],{},[402,493,494],{},[292,495,496],{},"chatwoot:index:Label",[402,498,499],{},[292,500,501],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Flabels",[387,503,504,509],{},[402,505,506],{},[292,507,508],{},"chatwoot:index:CustomAttribute",[402,510,511],{},[292,512,513],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fcustom_attribute_definitions",[387,515,516,521],{},[402,517,518],{},[292,519,520],{},"chatwoot:index:CannedResponse",[402,522,523],{},[292,524,525],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fcanned_responses",[387,527,528,533],{},[402,529,530],{},[292,531,532],{},"chatwoot:index:SlaPolicy",[402,534,535],{},[292,536,537],{},"\u002Fapi\u002Fv1\u002Faccounts\u002F{acc}\u002Fsla_policies",[295,539,540,370,543,546],{},[292,541,542],{},"InboxAgentBot",[292,544,545],{},"TeamMember"," are bindings — they own a single relation\neach (an inbox-to-agent_bot pointer, a team-to-user pointer). Modeling\nthose as separate resources keeps the parent (Inbox, Team) stable across\nbinding churn rather than forcing a replace whenever the relation changes.",[548,549,551],"h3",{"id":550},"out-of-scope-for-v0","Out of scope for v0",[553,554,555,562,572,582,594,609],"ul",{},[556,557,558,561],"li",{},[292,559,560],{},"Integration"," (account-level Slack\u002FLinear\u002FDialogflow).",[556,563,564,567,568,571],{},[292,565,566],{},"WorkingHours"," sub-resource — folded into ",[292,569,570],{},"Inbox"," config later if needed.",[556,573,574,577,578,581],{},[292,575,576],{},"CustomView"," \u002F ",[292,579,580],{},"CustomFilter"," — niche per-agent UI config.",[556,583,584,436,587,436,590,593],{},[292,585,586],{},"Portal",[292,588,589],{},"Category",[292,591,592],{},"Article"," — help-center hierarchy; deserves its own PR.",[556,595,596,597,600,601,605,606,608],{},"Inbox ",[292,598,599],{},"email"," channel creation — Chatwoot's email-creation flow runs\nIMAP validation through a different endpoint. Existing email inboxes\n",[602,603,604],"em",{},"can"," be adopted via ",[292,607,369],{}," and updated, just not created.",[556,610,611],{},"All runtime data — conversations, messages, contacts, dashboards, reports.",[548,613,615,618],{"id":614},"payload-envelope-handling",[292,616,617],{},"payload"," envelope handling",[295,620,621,622,370,625,628,629,632,633,636,637,640,641,643,644,646],{},"Several Chatwoot endpoints (notably the automation_rules controller, plus\n",[292,623,624],{},"labels",[292,626,627],{},"sla_policies",") wrap the response in ",[292,630,631],{},"{\"payload\": \u003Cbody>}",",\nwhile others (",[292,634,635],{},"agent_bots",", single inbox\u002Fteam) return the bare object.\nThe dynamic-provider TypeScript code didn't account for this and read\n",[292,638,639],{},"r.id"," directly, which is one reason ",[292,642,373],{}," was unreliable.\nThe Go client transparently unwraps ",[292,645,617],{}," if present, so resources\nconsume a flat shape regardless.",[376,648,650],{"id":649},"build-regenerate","Build \u002F regenerate",[295,652,653,654,347,657,660],{},"The SDK is checked in (TS sources only — ",[292,655,656],{},"bin\u002F",[292,658,659],{},"node_modules\u002F",", and the\nprovider binary are gitignored). Regenerate after any change to a Go file:",[662,663,668],"pre",{"className":664,"code":665,"language":666,"meta":667,"style":667},"language-sh shiki shiki-themes github-light github-dark","make sdk            # build binary, dump schema, regen + build TS SDK\nmake install-plugin # symlink the binary into ~\u002F.pulumi\u002Fplugins\n","sh","",[292,669,670,687],{"__ignoreMap":667},[671,672,675,679,683],"span",{"class":673,"line":674},"line",1,[671,676,678],{"class":677},"sScJk","make",[671,680,682],{"class":681},"sZZnC"," sdk",[671,684,686],{"class":685},"sJ8bj","            # build binary, dump schema, regen + build TS SDK\n",[671,688,690,692,695],{"class":673,"line":689},2,[671,691,678],{"class":677},[671,693,694],{"class":681}," install-plugin",[671,696,697],{"class":685}," # symlink the binary into ~\u002F.pulumi\u002Fplugins\n",[295,699,700,701,704,705,577,708,577,711,714,715,718,719,721],{},"The ",[292,702,703],{},"Makefile"," patches the gen-sdk output to add ",[292,706,707],{},"main",[292,709,710],{},"types",[292,712,713],{},"files","\nfields and to copy ",[292,716,717],{},"package.json"," into ",[292,720,656],{}," so module resolution works\nfrom a Pulumi runtime that requires the compiled artefacts.",[376,723,725],{"id":724},"consuming-from-a-sibling-stack","Consuming from a sibling stack",[295,727,728,729,731,732,735,736,739,740,742,743,746,747,749,750,752,753,755],{},"The SDK exposes itself as ",[292,730,200],{}," via the generated\n",[292,733,734],{},"sdk\u002Fnodejs\u002Fpackage.json",". pnpm picks it up through the ",[292,737,738],{},"internal\u002Fchatwoot","\nworkspace entry — note the consumer (",[292,741,332],{},") and the SDK\n(",[292,744,745],{},"internal\u002Fchatwoot\u002Fprovider\u002Fsdk\u002Fnodejs\u002F",") live in nested directories, so\nthe consumer's ",[292,748,717],{}," lists the provider via ",[292,751,336],{}," and pnpm\nresolves it through the nested ",[292,754,717],{},":",[662,757,761],{"className":758,"code":759,"language":760,"meta":667,"style":667},"language-json shiki shiki-themes github-light github-dark","{\n  \"dependencies\": {\n    \"studyflash-chatwoot-provider\": \"workspace:*\"\n  }\n}\n","json",[292,762,763,769,778,790,796],{"__ignoreMap":667},[671,764,765],{"class":673,"line":674},[671,766,768],{"class":767},"sVt8B","{\n",[671,770,771,775],{"class":673,"line":689},[671,772,774],{"class":773},"sj4cs","  \"dependencies\"",[671,776,777],{"class":767},": {\n",[671,779,781,784,787],{"class":673,"line":780},3,[671,782,783],{"class":773},"    \"studyflash-chatwoot-provider\"",[671,785,786],{"class":767},": ",[671,788,789],{"class":681},"\"workspace:*\"\n",[671,791,793],{"class":673,"line":792},4,[671,794,795],{"class":767},"  }\n",[671,797,799],{"class":673,"line":798},5,[671,800,801],{"class":767},"}\n",[662,803,807],{"className":804,"code":805,"language":806,"meta":667,"style":667},"language-ts shiki shiki-themes github-light github-dark","import * as chatwoot from 'studyflash-chatwoot-provider';\n\nconst accountId = '2';\n\nconst maximilian = new chatwoot.AgentBot('maximilian', {\n  accountId,\n  name: 'Maximilian',\n  outgoingUrl: 'https:\u002F\u002Fsupport-bot.studyflash.dev\u002Fchatwoot-webhook',\n});\n\nnew chatwoot.InboxAgentBot('maximilian-support-mailbox', {\n  accountId,\n  inboxId: 1,\n  agentBotId: maximilian.agentBotId,\n});\n\nnew chatwoot.AutomationRule('rxdb-bug-on-create', {\n  accountId,\n  name: 'RxDb Bug',\n  description: 'Short fix',\n  eventName: 'conversation_created',\n  active: true,\n  conditions: [\n    {\n      attributeKey: 'email',\n      filterOperator: 'contains',\n      values: ['RxDB Error-Code: DB6'],\n    },\n  ],\n  actions: [\n    { actionName: 'send_message', actionParams: ['Hi there, …'] },\n  ],\n});\n","ts",[292,808,809,833,839,855,859,886,892,904,915,921,926,943,948,959,965,970,975,992,997,1007,1018,1029,1040,1046,1052,1063,1074,1086,1092,1098,1104,1122,1127],{"__ignoreMap":667},[671,810,811,815,818,821,824,827,830],{"class":673,"line":674},[671,812,814],{"class":813},"szBVR","import",[671,816,817],{"class":773}," *",[671,819,820],{"class":813}," as",[671,822,823],{"class":767}," chatwoot ",[671,825,826],{"class":813},"from",[671,828,829],{"class":681}," 'studyflash-chatwoot-provider'",[671,831,832],{"class":767},";\n",[671,834,835],{"class":673,"line":689},[671,836,838],{"emptyLinePlaceholder":837},true,"\n",[671,840,841,844,847,850,853],{"class":673,"line":780},[671,842,843],{"class":813},"const",[671,845,846],{"class":773}," accountId",[671,848,849],{"class":813}," =",[671,851,852],{"class":681}," '2'",[671,854,832],{"class":767},[671,856,857],{"class":673,"line":792},[671,858,838],{"emptyLinePlaceholder":837},[671,860,861,863,866,868,871,874,877,880,883],{"class":673,"line":798},[671,862,843],{"class":813},[671,864,865],{"class":773}," maximilian",[671,867,849],{"class":813},[671,869,870],{"class":813}," new",[671,872,873],{"class":767}," chatwoot.",[671,875,876],{"class":677},"AgentBot",[671,878,879],{"class":767},"(",[671,881,882],{"class":681},"'maximilian'",[671,884,885],{"class":767},", {\n",[671,887,889],{"class":673,"line":888},6,[671,890,891],{"class":767},"  accountId,\n",[671,893,895,898,901],{"class":673,"line":894},7,[671,896,897],{"class":767},"  name: ",[671,899,900],{"class":681},"'Maximilian'",[671,902,903],{"class":767},",\n",[671,905,907,910,913],{"class":673,"line":906},8,[671,908,909],{"class":767},"  outgoingUrl: ",[671,911,912],{"class":681},"'https:\u002F\u002Fsupport-bot.studyflash.dev\u002Fchatwoot-webhook'",[671,914,903],{"class":767},[671,916,918],{"class":673,"line":917},9,[671,919,920],{"class":767},"});\n",[671,922,924],{"class":673,"line":923},10,[671,925,838],{"emptyLinePlaceholder":837},[671,927,929,932,934,936,938,941],{"class":673,"line":928},11,[671,930,931],{"class":813},"new",[671,933,873],{"class":767},[671,935,542],{"class":677},[671,937,879],{"class":767},[671,939,940],{"class":681},"'maximilian-support-mailbox'",[671,942,885],{"class":767},[671,944,946],{"class":673,"line":945},12,[671,947,891],{"class":767},[671,949,951,954,957],{"class":673,"line":950},13,[671,952,953],{"class":767},"  inboxId: ",[671,955,956],{"class":773},"1",[671,958,903],{"class":767},[671,960,962],{"class":673,"line":961},14,[671,963,964],{"class":767},"  agentBotId: maximilian.agentBotId,\n",[671,966,968],{"class":673,"line":967},15,[671,969,920],{"class":767},[671,971,973],{"class":673,"line":972},16,[671,974,838],{"emptyLinePlaceholder":837},[671,976,978,980,982,985,987,990],{"class":673,"line":977},17,[671,979,931],{"class":813},[671,981,873],{"class":767},[671,983,984],{"class":677},"AutomationRule",[671,986,879],{"class":767},[671,988,989],{"class":681},"'rxdb-bug-on-create'",[671,991,885],{"class":767},[671,993,995],{"class":673,"line":994},18,[671,996,891],{"class":767},[671,998,1000,1002,1005],{"class":673,"line":999},19,[671,1001,897],{"class":767},[671,1003,1004],{"class":681},"'RxDb Bug'",[671,1006,903],{"class":767},[671,1008,1010,1013,1016],{"class":673,"line":1009},20,[671,1011,1012],{"class":767},"  description: ",[671,1014,1015],{"class":681},"'Short fix'",[671,1017,903],{"class":767},[671,1019,1021,1024,1027],{"class":673,"line":1020},21,[671,1022,1023],{"class":767},"  eventName: ",[671,1025,1026],{"class":681},"'conversation_created'",[671,1028,903],{"class":767},[671,1030,1032,1035,1038],{"class":673,"line":1031},22,[671,1033,1034],{"class":767},"  active: ",[671,1036,1037],{"class":773},"true",[671,1039,903],{"class":767},[671,1041,1043],{"class":673,"line":1042},23,[671,1044,1045],{"class":767},"  conditions: [\n",[671,1047,1049],{"class":673,"line":1048},24,[671,1050,1051],{"class":767},"    {\n",[671,1053,1055,1058,1061],{"class":673,"line":1054},25,[671,1056,1057],{"class":767},"      attributeKey: ",[671,1059,1060],{"class":681},"'email'",[671,1062,903],{"class":767},[671,1064,1066,1069,1072],{"class":673,"line":1065},26,[671,1067,1068],{"class":767},"      filterOperator: ",[671,1070,1071],{"class":681},"'contains'",[671,1073,903],{"class":767},[671,1075,1077,1080,1083],{"class":673,"line":1076},27,[671,1078,1079],{"class":767},"      values: [",[671,1081,1082],{"class":681},"'RxDB Error-Code: DB6'",[671,1084,1085],{"class":767},"],\n",[671,1087,1089],{"class":673,"line":1088},28,[671,1090,1091],{"class":767},"    },\n",[671,1093,1095],{"class":673,"line":1094},29,[671,1096,1097],{"class":767},"  ],\n",[671,1099,1101],{"class":673,"line":1100},30,[671,1102,1103],{"class":767},"  actions: [\n",[671,1105,1107,1110,1113,1116,1119],{"class":673,"line":1106},31,[671,1108,1109],{"class":767},"    { actionName: ",[671,1111,1112],{"class":681},"'send_message'",[671,1114,1115],{"class":767},", actionParams: [",[671,1117,1118],{"class":681},"'Hi there, …'",[671,1120,1121],{"class":767},"] },\n",[671,1123,1125],{"class":673,"line":1124},32,[671,1126,1097],{"class":767},[671,1128,1130],{"class":673,"line":1129},33,[671,1131,920],{"class":767},[376,1133,1135],{"id":1134},"adopting-existing-live-resources","Adopting existing live resources",[295,1137,1138,1141,1142,1145,1146,755],{},[292,1139,1140],{},"Read"," is fully implemented, so adoption uses the standard Pulumi\nmechanism — pass ",[292,1143,1144],{},"import: '\u003Cchatwoot-id>'"," in resource options on the\nfirst ",[292,1147,1148],{},"pulumi up",[662,1150,1152],{"className":804,"code":1151,"language":806,"meta":667,"style":667},"new chatwoot.AgentBot(\n  'maximilian',\n  { \u002F* declared shape *\u002F },\n  { import: '1' },\n);\n",[292,1153,1154,1165,1172,1183,1193],{"__ignoreMap":667},[671,1155,1156,1158,1160,1162],{"class":673,"line":674},[671,1157,931],{"class":813},[671,1159,873],{"class":767},[671,1161,876],{"class":677},[671,1163,1164],{"class":767},"(\n",[671,1166,1167,1170],{"class":673,"line":689},[671,1168,1169],{"class":681},"  'maximilian'",[671,1171,903],{"class":767},[671,1173,1174,1177,1180],{"class":673,"line":780},[671,1175,1176],{"class":767},"  { ",[671,1178,1179],{"class":685},"\u002F* declared shape *\u002F",[671,1181,1182],{"class":767}," },\n",[671,1184,1185,1188,1191],{"class":673,"line":792},[671,1186,1187],{"class":767},"  { import: ",[671,1189,1190],{"class":681},"'1'",[671,1192,1182],{"class":767},[671,1194,1195],{"class":673,"line":798},[671,1196,1197],{"class":767},");\n",[295,1199,1200,1201,370,1203,1205],{},"For ",[292,1202,542],{},[292,1204,545],{},", use the composite ID:",[662,1207,1209],{"className":804,"code":1208,"language":806,"meta":667,"style":667},"new chatwoot.InboxAgentBot('maximilian-support-mailbox', {\n  accountId, inboxId: 1, agentBotId: maximilian.agentBotId,\n}, { import: '2\u002F1' });          \u002F\u002F \u003CaccountId>\u002F\u003CinboxId>\n\nnew chatwoot.TeamMember('rajiv-on-engineering', {\n  accountId, teamId: 1, userId: 2,\n}, { import: '2\u002F1\u002F2' });        \u002F\u002F \u003CaccountId>\u002F\u003CteamId>\u002F\u003CuserId>\n",[292,1210,1211,1225,1235,1249,1253,1268,1282],{"__ignoreMap":667},[671,1212,1213,1215,1217,1219,1221,1223],{"class":673,"line":674},[671,1214,931],{"class":813},[671,1216,873],{"class":767},[671,1218,542],{"class":677},[671,1220,879],{"class":767},[671,1222,940],{"class":681},[671,1224,885],{"class":767},[671,1226,1227,1230,1232],{"class":673,"line":689},[671,1228,1229],{"class":767},"  accountId, inboxId: ",[671,1231,956],{"class":773},[671,1233,1234],{"class":767},", agentBotId: maximilian.agentBotId,\n",[671,1236,1237,1240,1243,1246],{"class":673,"line":780},[671,1238,1239],{"class":767},"}, { import: ",[671,1241,1242],{"class":681},"'2\u002F1'",[671,1244,1245],{"class":767}," });          ",[671,1247,1248],{"class":685},"\u002F\u002F \u003CaccountId>\u002F\u003CinboxId>\n",[671,1250,1251],{"class":673,"line":792},[671,1252,838],{"emptyLinePlaceholder":837},[671,1254,1255,1257,1259,1261,1263,1266],{"class":673,"line":798},[671,1256,931],{"class":813},[671,1258,873],{"class":767},[671,1260,545],{"class":677},[671,1262,879],{"class":767},[671,1264,1265],{"class":681},"'rajiv-on-engineering'",[671,1267,885],{"class":767},[671,1269,1270,1273,1275,1278,1280],{"class":673,"line":888},[671,1271,1272],{"class":767},"  accountId, teamId: ",[671,1274,956],{"class":773},[671,1276,1277],{"class":767},", userId: ",[671,1279,312],{"class":773},[671,1281,903],{"class":767},[671,1283,1284,1286,1289,1292],{"class":673,"line":894},[671,1285,1239],{"class":767},[671,1287,1288],{"class":681},"'2\u002F1\u002F2'",[671,1290,1291],{"class":767}," });        ",[671,1293,1294],{"class":685},"\u002F\u002F \u003CaccountId>\u002F\u003CteamId>\u002F\u003CuserId>\n",[295,1296,1297,1298,1301,1302,1305,1306,1309],{},"Pulumi calls ",[292,1299,1300],{},"Read(ctx, id)",", populates state from live Chatwoot, and the\nresource is managed normally afterwards. Once ",[292,1303,1304],{},"pulumi preview"," shows zero\ndiff, drop the ",[292,1307,1308],{},"import:"," line from the declaration.",[376,1311,1313],{"id":1312},"credentials","Credentials",[295,1315,1316],{},"The provider reads two values, in priority order:",[1318,1319,1320,1334],"ol",{},[556,1321,1322,1323,577,1326,1329,1330,1333],{},"Pulumi config: ",[292,1324,1325],{},"chatwoot:apiUrl",[292,1327,1328],{},"chatwoot:apiKey"," (the latter is ",[292,1331,1332],{},"secret",").",[556,1335,1336,1337,577,1340,1343],{},"Env vars: ",[292,1338,1339],{},"CHATWOOT_API_URL",[292,1341,1342],{},"CHATWOOT_API_KEY"," (used as defaults).",[295,1345,1346,1348,1349,577,1352,1355,1356,1359],{},[292,1347,332],{},"'s ",[292,1350,1351],{},"pnpm preview",[292,1353,1354],{},"pnpm up"," scripts already wrap\n",[292,1357,1358],{},"infisical run --path=\u002Finternal\u002Fchatwoot\u002F -- pulumi …",", so the env vars\nreach the provider without ever touching disk.",[376,1361,1363],{"id":1362},"layout","Layout",[662,1365,1370],{"className":1366,"code":1368,"language":1369},[1367],"language-text","internal\u002Fchatwoot\u002Fprovider\u002F\n├── main.go              # provider boot\n├── client.go            # Chatwoot HTTP client (with payload unwrap)\n├── resources.go         # AutomationRule \u002F AgentBot \u002F InboxAgentBot \u002F Webhook\n├── resources_extra.go   # Inbox \u002F Team \u002F TeamMember \u002F Label \u002F CustomAttribute \u002F CannedResponse \u002F SlaPolicy\n├── go.mod \u002F go.sum\n├── Makefile             # build \u002F schema \u002F gen-sdk \u002F install-plugin\n├── README.md\n└── sdk\u002Fnodejs\u002F          # generated TS SDK (committed; bin\u002F + node_modules\u002F gitignored)\n","text",[292,1371,1368],{"__ignoreMap":667},[376,1373,1375],{"id":1374},"references","References",[553,1377,1378,1385,1392],{},[556,1379,1380,786,1382],{},[292,1381,320],{},[299,1383,316],{"href":316,"rel":1384},[303],[556,1386,1387,1388],{},"Chatwoot API overview: ",[299,1389,1390],{"href":1390,"rel":1391},"https:\u002F\u002Fwww.chatwoot.com\u002Fdevelopers\u002Fapi\u002F",[303],[556,1393,1394,1395,1398,1399,1402,1403,337],{},"Authoritative when the docs lag: the controllers in\n",[292,1396,1397],{},"chatwoot\u002Fchatwoot"," at ",[292,1400,1401],{},"app\u002Fcontrollers\u002Fapi\u002Fv1\u002Faccounts\u002F",". Field-level\nshapes for nested types (channel config, condition operators) are best\ncross-referenced against the model files at ",[292,1404,1405],{},"app\u002Fmodels\u002F",[1407,1408,1409],"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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":667,"searchDepth":689,"depth":689,"links":1411},[1412,1417,1418,1419,1420,1421,1422],{"id":378,"depth":689,"text":379,"children":1413},[1414,1415],{"id":550,"depth":780,"text":551},{"id":614,"depth":780,"text":1416},"payload envelope handling",{"id":649,"depth":689,"text":650},{"id":724,"depth":689,"text":725},{"id":1134,"depth":689,"text":1135},{"id":1312,"depth":689,"text":1313},{"id":1362,"depth":689,"text":1363},{"id":1374,"depth":689,"text":1375},"Pulumi-native resource provider for the self-hosted Chatwoot\nat support.studyflash.ch (account 2). Implemented in Go via\npulumi-go-provider. Ships\na real plugin binary (pulumi-resource-chatwoot) and a generated TypeScript\nSDK at sdk\u002Fnodejs\u002F, consumed by the parent stack at internal\u002Fchatwoot\u002F\nvia workspace:*.","md",null,{},{"title":200,"description":1423},"internal\u002Fchatwoot\u002Fprovider\u002FREADME","bq7gb0IiCqGww5NUNN6vpkabngfK1gQi8T_LPxe3WIA",1779007964121]