From 617d51b564e513dd0602f13525cb3934137ecfff Mon Sep 17 00:00:00 2001 From: docs-bot <77750099+docs-bot@users.noreply.github.com> Date: Mon, 1 Jun 2026 12:19:38 -0700 Subject: [PATCH 1/4] fix: add new Liquid corruption patterns for pt/fr/de translations (#61522) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/languages/lib/correct-translation-content.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/languages/lib/correct-translation-content.ts b/src/languages/lib/correct-translation-content.ts index 9fe44393fc2c..a933f4951dfa 100644 --- a/src/languages/lib/correct-translation-content.ts +++ b/src/languages/lib/correct-translation-content.ts @@ -544,6 +544,9 @@ export function correctTranslatedContentStrings( content = content.replaceAll('{%- sugestões embutidas do variables.', '{%- data variables.') // Fully translated reusables path: `{% dados reutilizáveis.X.Y %}` → `{% data reusables.X.Y %}` content = content.replaceAll('{% dados reutilizáveis.', '{% data reusables.') + // `{% dado reutilizáveis.X.Y %}` — singular "dado" (datum) + plural "reutilizáveis" + content = content.replaceAll('{% dado reutilizáveis.', '{% data reusables.') + content = content.replaceAll('{%- dado reutilizáveis.', '{%- data reusables.') // Translated path segment inside reusables path: `repositórios` → `repositories` content = content.replaceAll( '{% data reusables.repositórios.', @@ -566,6 +569,11 @@ export function correctTranslatedContentStrings( content = content.replaceAll('{% variáveis de dados ', '{% data variables ') // `{% dados variáveis.` — alternate word order "data variables" content = content.replaceAll('{% dados variáveis.', '{% data variables.') + // `{% Espaços de Código %}` / `{% espaços de código %}` — "Code Spaces" = codespaces + content = content.replaceAll('{% Espaços de Código %}', '{% codespaces %}') + content = content.replaceAll('{%- Espaços de Código %}', '{%- codespaces %}') + content = content.replaceAll('{% espaços de código %}', '{% codespaces %}') + content = content.replaceAll('{%- espaços de código %}', '{%- codespaces %}') // `{% janelas %}` — Portuguese "windows" = windows (platform tag) content = content.replaceAll('{% janelas %}', '{% windows %}') content = content.replaceAll('{%- janelas %}', '{%- windows %}') @@ -675,6 +683,9 @@ export function correctTranslatedContentStrings( // `{% caso contrário %}` — alternate "otherwise" = else content = content.replaceAll('{% caso contrário %}', '{% else %}') content = content.replaceAll('{%- caso contrário %}', '{%- else %}') + // `{% outra %}` — "other/another" (feminine) = else + content = content.replaceAll('{% outra %}', '{% else %}') + content = content.replaceAll('{%- outra %}', '{%- else %}') // `{% observação %}` — "note" = note content = content.replaceAll('{% observação %}', '{% note %}') content = content.replaceAll('{%- observação %}', '{%- note %}') @@ -1152,6 +1163,9 @@ export function correctTranslatedContentStrings( } if (context.code === 'fr') { + // `{% espaces de code %}` — French "code spaces" = codespaces + content = content.replaceAll('{% espaces de code %}', '{% codespaces %}') + content = content.replaceAll('{%- espaces de code %}', '{%- codespaces %}') // `{% sinon %}` — "otherwise" = else content = content.replaceAll('{% sinon %}', '{% else %}') content = content.replaceAll('{%- sinon %}', '{%- else %}') @@ -1639,6 +1653,8 @@ export function correctTranslatedContentStrings( '{%$1data reusables.', ) content = content.replace(/\{%(-?\s*)data Variablen\./g, '{%$1data variables.') + // `data variablen.` — lowercase variant of "Variablen" (survives after broad fallback) + content = content.replace(/\{%(-?\s*)data variablen\./g, '{%$1data variables.') // German `oder` = "or", `und` = "and" inside ifversion/elsif/if tags content = content.replace(/\{%-?\s+(?:ifversion|elsif|if)\s+[^%]*?\soder\s[^%]*?-?%\}/g, (m) => m.replace(/\soder\s/g, ' or '), From 76805f5e4863725e3df218bb7d74979f5f922e61 Mon Sep 17 00:00:00 2001 From: Steve Gray Date: Mon, 1 Jun 2026 13:26:51 -0600 Subject: [PATCH 2/4] Update Copilot usage report docs for NDJSON downloads (#61488) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Ben Ahmady <32935794+subatoi@users.noreply.github.com> --- .../reference/copilot-usage-metrics/team-level-metrics.md | 6 +++--- .../copilot/tutorials/roll-out-at-scale/measure-success.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/copilot/reference/copilot-usage-metrics/team-level-metrics.md b/content/copilot/reference/copilot-usage-metrics/team-level-metrics.md index c44fa7ca11e7..15246925fd28 100644 --- a/content/copilot/reference/copilot-usage-metrics/team-level-metrics.md +++ b/content/copilot/reference/copilot-usage-metrics/team-level-metrics.md @@ -19,7 +19,7 @@ The same join recipe supports any team-level slice you need: per `(team, day)`, ## Fetching the reports -The two reports referenced in this guide are downloaded in two steps. First, call the REST endpoint for the day you want. The endpoint returns time-limited signed URLs from which you can download the report files. Then download the JSON files those URLs point to. The user-team and per-user rows are in those JSON files; they are not returned inline by the REST endpoint. +The two reports referenced in this guide are downloaded in two steps. First, call the REST endpoint for the day you want. The endpoint returns time-limited signed URLs from which you can download the report files. Then download the newline-delimited JSON (NDJSON) files those URLs point to. The user-teams and per-user rows are in those NDJSON files; they are not returned inline by the REST endpoint. | Report | Endpoint | |:--|:--| @@ -33,7 +33,7 @@ Each endpoint returns a response of the form: ```json { "download_links": [ - "https://example.com/copilot-user-teams-report-1.json" + "https://example.com/copilot-user-teams-report-1.ndjson" ], "report_day": "2026-05-07" } @@ -89,7 +89,7 @@ The entity-level reports (`enterprise_28_day`, `organization_28_day`, `enterpris ## Example -This minimal end-to-end example produces one day of organization-team metrics. The JSON shown below for each input report is a sample of the rows you would find in the file downloaded from one of that report's `download_links` (see [Fetching the reports](#fetching-the-reports) above). +This minimal end-to-end example produces one day of organization-team metrics. The sample NDJSON rows below for each input report are like the rows you would find in the file downloaded from one of that report's `download_links` (see [Fetching the reports](#fetching-the-reports) above). Two users have {% data variables.product.prodname_copilot_short %} activity on 2026-05-07 in organization `999`: diff --git a/content/copilot/tutorials/roll-out-at-scale/measure-success.md b/content/copilot/tutorials/roll-out-at-scale/measure-success.md index 2d22f6ebcbdf..2b184b52e89a 100644 --- a/content/copilot/tutorials/roll-out-at-scale/measure-success.md +++ b/content/copilot/tutorials/roll-out-at-scale/measure-success.md @@ -100,7 +100,7 @@ Example response: ```json { "download_links": [ - "https://example.com/copilot-usage-report.json" + "https://example.com/copilot-usage-report.ndjson" ], "report_start_day": "2025-07-18", "report_end_day": "2025-08-14" From fbb305a915d3ab50e1e09b205520e80fb1b8d0c9 Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Mon, 1 Jun 2026 12:37:08 -0700 Subject: [PATCH 3/4] [2026-06-01] Start Copilot cloud agent tasks via the REST API - available for Copilot Pro and Pro+ (#61427) --- .../cloud-agent/use-cloud-agent-via-the-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/copilot/how-tos/use-copilot-agents/cloud-agent/use-cloud-agent-via-the-api.md b/content/copilot/how-tos/use-copilot-agents/cloud-agent/use-cloud-agent-via-the-api.md index a9de498934ca..fe5ff23625ef 100644 --- a/content/copilot/how-tos/use-copilot-agents/cloud-agent/use-cloud-agent-via-the-api.md +++ b/content/copilot/how-tos/use-copilot-agents/cloud-agent/use-cloud-agent-via-the-api.md @@ -1,8 +1,8 @@ --- title: Using Copilot cloud agent via the API shortTitle: Use cloud agent via the API -intro: 'You can start and manage {% data variables.copilot.copilot_cloud_agent %} tasks directly using the REST API and assign issues to Copilot using the issues REST and GraphQL APIs.' -product: '{% data reusables.gated-features.copilot-business-and-enterprise %}' +intro: 'You can start and manage {% data variables.copilot.copilot_cloud_agent %} tasks programmatically using the REST API.' +product: '{% data reusables.gated-features.copilot-cloud-agent %}
Sign up for {% data variables.product.prodname_copilot_short %} {% octicon "link-external" height:16 %}' versions: feature: copilot contentType: how-tos From 5e56f9f0acb92ae663b3f2bae6d3fa3e4fef98e8 Mon Sep 17 00:00:00 2001 From: docs-bot <77750099+docs-bot@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:55:44 -0700 Subject: [PATCH 4/4] Sync Copilot SDK docs (auto-generated) (#61521) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: saritai <66540150+saritai@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../features-agent-loop-diagram-1.png | Bin 76669 -> 76665 bytes .../features-agent-loop-diagram-2.png | Bin 69655 -> 69650 bytes .../setup-multi-tenancy-diagram-0.png | Bin 0 -> 54403 bytes .../how-tos/copilot-sdk/auth/authenticate.md | 18 +- .../copilot/how-tos/copilot-sdk/auth/byok.md | 20 +- .../copilot-sdk/features/cloud-sessions.md | 403 ++++++++++++++++ .../copilot-sdk/features/custom-agents.md | 11 +- .../copilot-sdk/features/fleet-mode.md | 346 ++++++++++++++ .../how-tos/copilot-sdk/features/hooks.md | 15 +- .../copilot-sdk/features/image-input.md | 34 +- .../how-tos/copilot-sdk/features/index.md | 3 + .../features/plugin-directories.md | 357 ++++++++++++++ .../copilot-sdk/features/remote-sessions.md | 94 +--- .../how-tos/copilot-sdk/features/skills.md | 9 +- .../features/steering-and-queueing.md | 10 +- .../copilot-sdk/features/streaming-events.md | 5 +- .../how-tos/copilot-sdk/getting-started.md | 126 ++--- .../copilot-sdk/hooks/error-handling.md | 8 +- .../copilot-sdk/hooks/hooks-overview.md | 4 +- .../copilot-sdk/hooks/post-tool-use.md | 24 +- .../how-tos/copilot-sdk/hooks/pre-tool-use.md | 41 +- .../copilot-sdk/hooks/session-lifecycle.md | 36 +- .../hooks/user-prompt-submitted.md | 24 +- .../integrations/microsoft-agent-framework.md | 27 +- .../observability/opentelemetry.md | 6 +- .../copilot-sdk/setup/backend-services.md | 54 ++- .../how-tos/copilot-sdk/setup/bundled-cli.md | 5 +- .../setup/choosing-a-setup-path.md | 4 + .../how-tos/copilot-sdk/setup/github-oauth.md | 9 +- .../how-tos/copilot-sdk/setup/index.md | 1 + .../copilot-sdk/setup/multi-tenancy.md | 440 ++++++++++++++++++ .../how-tos/copilot-sdk/setup/scaling.md | 2 + .../troubleshooting/compatibility.md | 6 +- .../copilot-sdk/troubleshooting/debugging.md | 10 +- .../troubleshooting/mcp-debugging.md | 2 +- 35 files changed, 1874 insertions(+), 280 deletions(-) create mode 100644 assets/images/help/copilot/copilot-sdk/setup-multi-tenancy-diagram-0.png create mode 100644 content/copilot/how-tos/copilot-sdk/features/cloud-sessions.md create mode 100644 content/copilot/how-tos/copilot-sdk/features/fleet-mode.md create mode 100644 content/copilot/how-tos/copilot-sdk/features/plugin-directories.md create mode 100644 content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md diff --git a/assets/images/help/copilot/copilot-sdk/features-agent-loop-diagram-1.png b/assets/images/help/copilot/copilot-sdk/features-agent-loop-diagram-1.png index 4ce852f914fa238c21aa5ca3aeb1cbe47c48e8d0..9263455a5ac2a5e5141894239c0a5d62aab859d9 100644 GIT binary patch delta 36223 zcmXtfcOcdO_y4s*vJ%Q3Wp5%|R1$J!Ws{8TTzkE2MfTp5m7Uo&L$a=wy;He1aqV&a zp5CADum5tN_c_jdobx#MVgmnU0>8>X13C+ED)GL2fW12(OxCwxs9?qW4)^!>mZJrq zJm}Vu?i}91ipkfbg@}mUceR%9tB*{KhtvK-*|YiTYq@Vm59=?Q{knW+IUMMI{`JW@ z%R~e`33et+ROV`s2$C#`VnV>8NS7G69&~9-bT&n=KTm{|>qacdazC?X ze&S|Ll<>z#Xd5~@3Q$7`m^#@KgE~%L^BWd$n4*%>)nRwRVX2gT8DzLLCH!~qhJeF3 zBAuguyn`>)QvBax>)p%Z;b6L6U|cJP6Vi_6@Cakd03 zJ!&IoHB~q3zLI^DrrJ;GdqoPP|e~sVI31 z!Xd#C9(O5Eui4`auyR-(&MQ}s`%O|qk9Ke3#7bgThJ0mLLJ;^7a5A8H+~vX~0tL|( zvC3f6R8@MaLFk!=Mw^cOnmkLQbM!h}Vka}$FAuCiq-18w^oHzFT6yT`>Q21>%?N!W zS|P&EV`ySCV`V`PyaOt=vRj3Q^NKPizwxREvb9xJ{p-1>n*4gpo3TT(q*FdI2c&Y0}LtPEyJw^eW49MnuQR`Pn+DH;YRdn}}^Q2T0o zei@0EJAM0sv)QYcFQ+Ea_k}t__KJRvjxNs6I}oiDKMl=0@0F_|fG9esajgk3iHWze zrD5qL;l#^1X%4hheMN-@1;(cH^fw2WV&Kv9tVXOXt-8r5l-kv@(7%8G5~>&Y%41F& zD!{cL?9y=}cV|qt&<{A~^)E}=E;M`17F;7* z8KBQ&7=Qd#Q33L$#w7C_?#N+Nz1(14{>c?^LpSI0+q z`TNUVZJJEHEG#uOy7?pnj(ufdFtc$JKLmpgg-0t;R#0%+v63R5rL5h=5!2^LY;zKq z9q4+!SIc|v9oP#mkKz79AR*s!K21$cR$LgQ4uAHnPu&WU@6|H<*S(2c^z8A?*G*v< zW>Zs#4zFS823-X4vS{1FBQE7{L};RSl}QCvRk15%0UXxASS-|7+7>q(Q5*BZYiny6 z1<}Xh7{;{69GR7@nGysXiI~_QP8$HLi}G30SV2mr+6%x5--42DVMI}?2=+{kdXWVMl_%kFC*nP@!XWuj}~_KF~Q6|zW5p3qSB#fUduI?U9r@qNjQ=r|eV z>+lL5eRiUk@%l|;!wZ4x#kvIVg6kCcA-wqCo8$D$`B=kX3hZL9dt%v9XgNeL9~ajH zmx1*A$XAdS-C(7E^%0JhM?@GVhl6U6{?-<6u?0Q?|GS>BN7MY3!lZ%;$+s=mukWO> z1$X*-_BVTBl2zEvcvifHb~mCwu$`niFPLEq{RrHyv^>&>o2&V=Jv%QiFDGN3W}$WO zQiXkKazf-DXKLM+RaMo|z>^~7OzX+ky%L)TF#|-h zFKWv}olPJc(}%KbS01o-Q@!gdR!2Sg&uBm8iEGhPRwGQkbOxaoAEu>dCdxj|q5sVE z71Pa|9SA~&PeQJ%!@+8rOa6@P7MWASkwoJ(OU>C7eIqa;Jt86~SRO}=1Mk|6)lF9^ zdGW^tegloNva%P}Z*YlL+<@nYDF83^9le(>A!VQsn=-h>UUagvv9*df?V|VGfb-$~ z451j@7+hR*b@8lSGh zr5wzX$`02Rf+UgmiC>7z6lpsHj<60_Y4_Z+3rM%$#DQlG z-MS%gze$>ege1nO`n5{3m_-O?o;|TM8eHraxR|}=zhCW2>RgcK5v0ERs|*R=OG`0W zs=yU)ObHIW5_IpkKs+iXMa5Q;CUcHN`MBid!_T?+OU*KhlA9lZFobwXVDxXpLPPzm zt`jh#>_)Yz`npN_STj?A1h%gZ!hkzp1?p~;-H1O&V&#<%27UYZiz${e;n6<=!6w6f z5bifJaO19KvMA9!nZ?X@X_u=QO`u~t_}{9a|5oAV=8+1ctg4SX5mxj;wr`^U`z!=} zcIC#g&B3y5!j%sx3*rCNfb8?ZgdqLB1C0m&Pi$< zoCHSIxY~3fI6K`SyNd-mKk-UJhRFlY#81L(sq7%v(9{&XBFi-?$j_HC7ypE^^n3WQ zUAV(+$N;(DMJDaHBx7ecdVM9tMNId~R~z<<9(FM(w2ZW8TOp#z4qcH(%0g4357J-# zw#8zfQ55YAfgb@7XnCrl;`QS8rhX-z#e+$B>%YnyT9WZwgA^-0Thh8akkF21%K(N` zE#OJml~#|b6#V{?9X6-8XCG7whaxWF+s=KfrP-?&F(>;B7wKLLHz;%CSiy5{VDaIT zw>PK%(J4KsyqmajHfprvo(qe*adj||++cowe(fIprsVtfY|`$*rRHk*_I-^@Wg%q? zfDW%Rpp~i+Aw*$+n!R6_2#$O{oXc~447gxa=?wd%rt!V$XD)U zT&KI6smGbfizu`#nl2L`D*BFtcdeE>my$IV`tKnW_DW$l?pT=^njHG~m}z9#_Bfl& z!?(L_t%*rUK4lR^T?bxv1*?SC%rvO_>MCVW&8;%MV1K)J&L+X|3SU2TFuu*BDuAM~U^pwo+A z2}uUaa@tN=xI>C2!=WPv5b?1PA)NQ>Icu&`Im3P_{cfiK%HUo%u8L_STB##lHem|y z{PNAHgOHSNOc@Gz0$fai+Oq*40mBhx{jBx$X%DTH#P==tMNyx_%^`xQbivHXZj7Eo zr&p{ZvWtNaHR51nvzm=7b`xAN0>DVRwTW`W*8t`ZMean$Xhxz zx8*)M81&>S`lU*|EQD0?;rt*|Gp7$Qq2setQaqw_r*}gUG0NCsXSwC_x@`SL$7BM? zULtL-Mm=*-*zI=Tfo%Vz_46)i)8B-;G;r<*l;*5TYOE*koM{Owe}cfp6?|pUioj}!uW(J?IZch> zs(Vw6Se|ciu0DojMO23E4pRdH^|idrx`%blYR&m z2)j95b4jD{tmB0BcRXHY)|g%ESg;oc?I4j6g_fKazIX4Q0W8C!Pa6L&A0PAqxHh#& zdr{K#YG1Y{de0RE@LAmB5obs7wHGlcoZr4wsM&Ofh?9RFIQAbRByr=@(`|K710+UY zVF7wqXkcKYL&B<|1$q9;g!c!r8M&_8f{gspt#9b!RCY6TmwG80T=Cw=j~^FAGR)D{ zGMt<%FKfyd3^o|-J%Z9jf%{zi$ydHLeSiys*Sz35!o?qwIoM(3pt zdmQ_YEq5x^hz+ntp+zG!-`gACn#n%g4?Jf@yv>*lqp}{#Zg~l#7jE~Bc6?*`&;p26 z{bjq1goK15Ow16tK6}T8EMiU+hiCS$k;l&$l>&8XYmD$9@M-X zzM?h5gScW^KAT^ZBV%J@chsle-)Htu1^KrMCT^Ksq${loieF4x=LE3vRF8i}Y^ity z38LcShlrXjM-y_axb@KB&2K+Yn6c|XW~j8}|%niiCP!IqDI?J<*A0x zh|RRLfdnuglZy-yQnBFL=1SpYvh(&85-Exp4=9y**^a;_UrqB(phrrCq%Ll{S5v;qu0l*7Ex z=(a)F^uhRRQuDKAGc_3fdBk(W1En^h={zHvLgHF!Z^Xupu-?OJr-<51)(}yn2#X;)j z0k`qGlv0Q|LlL8^7(sGDZwN~mdZPk4UW3~IEePCnee-YMzBMGUdF6|zkk-%O{x}A# z%18>0kQ{dXyRxF3W{Vv6pr@yAQtw2<)XB9tI{vd;)2>V)T%1rSG;~SYee>zCA5~vN zcvu+C^4GxA6tfphp!M1KN`r9H?_9x z6$ve zJF+(EG41V}K>OdYXFF|G@>uA&lP)JNG4Zd|;gp5PHJ7tc656omIdb!-v#M%pu8h$6 zF3$V{{@zn6l;LV?n2VOM;LY4S!aL?92eK%mLyG@Bd3I~iO{#o}7$3o+FyH9LoB81F ztKXolp}7C&aBH?HjGQ^!G;5ZIhNiERTz<}_GmLb?!Kr!oN5Co65g8HD0UB*L-Q=aD zq(u4n$`k^uIQaP;%%44rh(w~ym2Y4{cT7p?&N=ZI{PpX6Bk1DbPHPOOdU|3NV&%EA zo8#G_^v?HF#gliGL!=h}{(rB4eecJIJ6c*a1KWcMX&Kz7%%xqSv%{^y6ccZ5M~?=5q>E)wH#1~km;3$u zch8E})AbvlIkLz!t<8j&=H8V2Jt;KEzNdisf#R#W2Q0L(oUhUHA153^YwG(}w^X;> zsPPg!`q3q3NZwq>_;Ra5AQ+r}^t%ZM#ZErqWPW9a~xD z4KdV%dLLI;TRV}S$&o+xi4dV}&*V>+e*T8LYu$9sIS}?lz3`*)c4Lm;q5gjSJ=HQn z?TL=~oE*WOmLrqRz2*MSi86gE;I0!Cj7BqgN`%V5Wt5^N(YHM|CdwOh@8k9VEKr5q z%-;M(4`e8bh=?evr8Znk1#Qd;x8a9`%jrAIH*<;qsi)aoS8E}tq6Ck#Dsh)?ZW_VO z{ZU)6Jgh`Mzk6}C*ln|OoZ-|u{X2+6py#k{5a>NKfm5U2z?jF*{7QVQpqriX)&JsD zq;l=_3-YP0Z3!w#sly7Mo-0QSn_vEXIh4=TYY+U}<6t4?`@1XLVqQ`@pa zgmnCfVdPUzVIiEB7?`*s@EjVxm+;v5_!qBDh7E`U43K~0RjbvUqsR0O)GTEtv^x<1 zIqHjqF6FBv{8qm|N5^2GNfH^hXIFtNtdmTz^pkP<+cO6`iPWjkvj)%yq9LIbNR-DO zD*+%$E8;l!bz(^FY!hwFyEr6+QEL`VJX#wqa{l!#@FYvhjVI#WyML=k5{vA z$qKg_7L|0;WRR1YndyWbY*gL#lx~2DfBU5|_OAO6)H~wv^y$+NuwrT_)yVs^BN5cR z9dajs6K+$LF$%Wqzi9TasHRB<@F^7Zi~6r``|PxMWQVzAc|9(AJeKydqq7t7>ElQD z8}#C3W@E*g6S-TTwThnD9n2lc*0NOu8XpnfxDAJEa_Mnqd%hZ+w$912EWzC2H>hR# zo;xC%2c0v|rw0te;8WMy8ScL_87`AUV9?CGFxvqrIk{oMyEIgHP*ha3eA1>oL{E&Q z->L0FR|IyJ8%#Fy*?bQFRJZjFrGKwtXe384_+mk`(xb)myv#GWpb-ASEZ) zR&BOjVyOl0{xy`<22ND|bcIKvy{Y33<&|x%&Mr2(+4b7Bh1qAhJwB?7IR`OFO-)0? z+Lbe1##BfG65O|J7YFGxDwVdDaR$$h2LXcP)7k>d&8aWaZYGEePY)8}6G8~n&E!*- zbdphv+u-r+dop%%+{A@B>)A*{CDc7>>@k1nvyJ3b(PJ5(xZScE7(~4JSk`-=i$TiO z2D>`)3B!}#M`=@rLI66(KHMxiy>HhM@Fzh%_`i%yg(jypOAMYqU7ti} zbb>2}gWml4dwBT2%m^45c62D}IvRb8MT-NM^m~Z=B#86n3jTkhB%Zmty6OUxTH1D` zy>mxjV3U)BqY=0filJqdCts`Rc~rVQ=;-WF^pb6S(Z7R^+SErWO;@wiPuu?ox z+;J4du?IyVop2FWWIt-!o(f+f*k-&W$@*k(dBXo_dtS83b*)+}$ZSaVh;J-%djnV5 z6uNNRPciksQ>x=yj^3z^2xsyxhDGVy+S*#VxKu}XtxlC2Hata8q;o3ZS^VR){T{N% zwgT|y0baG6KIAI($XLOqCzkbI&e=v~8(T@Ey1#$xVRDMkz)*kxC=#WlTW&!8 zVtlKPTvkeI#x}6Gw|A)pPrd8KPBH+-xPnkcF}JBu3>EC)2UOugg~AMQdzLQ$1@ZL# zczr^j;}OWy-PwMJ(+=HHfZy4gsk_JO`}_O*_j*QeA7{)uHu3lR?mUAku6a6Gj$8;B zH*VI)FkY3PRn*>BS|XL{mp+b+kc7v$XO*6R{SzJOyVuJ}b)AG{`E;Yw$qfQZcG_5I z@li4C4G6=EwMl#H^k--?(t@o^~q6C*EY4P4!_ z@X46hz#J3-W($>ZG+AVFNkIrh!s>C6}Dfn?UCKr*7cH7gN+-!95!F~ zEf&l8`{sW5&AUw|rP2B=`W+3(1H^)m1K$49_yjYe%&ac<&~&Eujn*wn$|d3P1Gw?O z9uL0@FN^Nz0g&kx6%`HAg9ihG-2gc4uz2N9Ry*am5LKz21Z z*hN%CBr`27P3pnen&Fm~-cFfq9@~A}v0~pA8!m|?_aXts{D#SO9}v2X%TC`HJ|%ZP z*m*YFiC={S@ZxuT#FY|aA%GSWQc|oB!ZWnCXO)zcco{uEm)>6A5A%+r`?)hx?_k(q zf^Tz8O~@nds1}Z3p?fj%P!OJznnVDiHDH7k7)5oi&|$f|Fjb!@NCy}K1$byk$V>Cg z63I=#bkOyRG&h0%v0H9cl@KU?IW>QRb-coBAA zTY?(F(h~u2p&FOd=QEDj9kF&9W!M;TmbZ38V|oRQ6f}Tms*+ckL|#7)f)QOOC2TAy z61aPdi7A_wiYkE{w*H~=ssgw=ex?eoBra&Hf}1-bcKcY-%f`kgP=MtwY#lVBtEiqs zv$^86uNG#tkM|SLUf{qjIBu=p3Rh_y*V+I%YKjAfdw4kO)Qw(QF~pp>?<})LezZdS9D0l~I$@yhDANp|=@H-L%)}g+>pKzv+ zMdNN2E?I{9F#OF(!Pa*m5`2-ugpRyxtqM$8y8O60NPQ>VGB?w&XRx*3p2~eIl`v-ThA0#7Nk6{$D%a7KMKum~bBx z0JN-51v1*5Up;g*6hU$m78ah+F9IGWaSj4ibjf-nKA^zcA%^=_K_}un^#w4Z)G(Kn ze(FL8-Uayc2Qb^-b4LAH5P3Ko{LT(1wBJ>>VZF~mn9tIg3u}{|!j(lA3u6?Y0B2FU z!mk5w4xLT8$cc%$Z^9mGy?nX)^>D^c)Uk1`P#3fsTxEcxzLi+?MLc;tNh+4AktKEC z1pss?4%jEjc%**?sB<5CPXl;?0e@D4q-;TZoo-Z@hKdLDwQ%!!z0-#&mPnRCuPPLm zrMR}u7r?PlLT2B8gE{`E+}^Bb|_tK;quw=oXATX`&`Q27$sDRbgt_?D;m; z#2-MT;^`Xeo#x*Wyds?)9r#2L;Mj|W0b>Ii`6UA(dm%wVK~LvnqN3)Xa1jReZwW9J znqvpcxTypiS3j10{rX@dA%R2vS*<2ej`}SY1#Oh3MXQ-(J`~1U`i2PIJ_Pn;#ai}YOp7=}!imfaq*ntYm)?8R*vW%(tbUSyjaBF+ zfZ!7k-6kuHBORNz>Kz!RT)B|*tluF>L+47)q zL#LMU-%H`lG`Wp7mJg#IKYBFWhpQb-yxfp3frWM#$cNNbRnHV)W4sO$BLv~K7Y?cM#F$;-b}0pHcPgjQU}YT#|^FornXxi%Owvkoj~;`mZXZD}XD4_n`Fp3S`*e zNV>ZP`d{*SrAZvl3+>~_A-o&(fg}c!e!67-vf|Ld$s%SEE7+K3_AFO z3T|u6FH3S6gryn-^%7gl-O7NSIV7TCT7_0@Z!04>aQ>RtHwb`6gI&~qrQ^gM`H}c)>(r@iMA`xt+sC+2J#`f_iY|9SPoNaJgbZ{4;K8(-a zCu5ZQdmXM0a8U#?6TPcl5K%kBfXNj}iFR6&MvQ1p=A^;>!(dg6S+nOIB!Z})ehyk* zz*h`Yp*BN3OJ28iHNIBA%lhQL+e34dEzF4O0LOgf7QJFXOrjd?|*Z1 zbI*zt#MZ5Z2l!C=t;1`C*4XWKspfJvgd-|kJIe_8`Nd2;Aq`?QGn z_aPFkn(FFkk(`Q&n~N~IXeUR+!TzX*at4LNRz};h%cLx@CWLEg-hY9$V$;VTAgnK~ z$bJ9-pps=GAdI@-rK$9wp`}XKH?Y_~v;fC;1B)gzu6_;mI<81w8~*3&h@sMu8A+e@ z1!WeiVFOKN#!B09?9dg)mvUQweUPq^EhD)N8WA664x~WTdx%nI_PbSj#&1~fngePC zeO!DN?EnMN_@oD{DJVQ@UMrs5rs`|E-*kHIqLg?!yz=E2HVv21J zRjf*34CV_qZrLt=gxDE|SSC(}SX}iW!4DZV-=f#?5e_=jpw2G-z-|MgSa}+4)&0i% zI$_Uo#mwpYfW&KgR!Ek+ujet?JS*dVK5#~NLPQ!AAsN(u9bFjlR7g1?DL(#V(k^*{ z=i?!bf$6-2P;SaVjxMO}m4E^s@azc`Ng6eYWnW-ne{;+Uw*GVK)dYg3U14=@usi?{ zF3ox8#$ZVi3Ak4^pggrvBXG~(c@wD5@}|5b?F{PBkKsI}A@K|k#x6UA#$lKXOg**o z)!;7;v0K@m#dSeJxCZ*e`2bK3tw@xe{FKQ~d7-5>L=79j36>wp1<|PP1he8Kmch2O zo^yli$*1J_c$YW`;7<@d6l#9apR05+kcM(H1t}5+*v1Oy6$Zni62n|-yn5;Ta#$1b zpn*sL)tC@h#}U!k!HWBrKLWlJn899>6()Y$N9kl7H&=hxa0`&vVnjibL6%9_q2^*Y z>fAVBdD%@vtF6S#F~IK7@4ZkX!=ArcxzvjFx98nyb179+RFKvwaQ|SKP4deVD$=Mx zZ=&m3#xEUtNUyrfg)gulp=qPCGj!Ck0LT|Kuz}>t?m2079{3Ju@%q?_mSN{<@N8>wO+6_iA z8#pbFeIay--9lM~A#WUb%G}{dj1eYGl)ny3Oe(zuNXsxEb^yS0uCRIcx+pm*X#tc) zQ2&Z&Srz~otMvI+baiWSu}ui^GDHH~>}XEWZ*P7aNuxcWc_k1!#Hmx7<3J=GXeJAP z7s_Zu71Ve+3UKrBG01sr&xPW`sQ=YhujXGH0WkO)#AZ|bszOvPjYPEO8;u&r;$ky$ zU18`pA}u8)rQs4#g!RNQZD_D0^*;eAw|sgPox59CeY*wU#teYt?hJ_uW>nzEu)Q@T z5_xvB4`(yFGU>6k6=iNVXw8ewaO4_dUQH+mToVKIGy;XT07S-6eXJ^81dvt>z-b2uajk)ZO0NaWuk+hq%Fx8Q z^`QU12#@>W@f@V+V%B?OVuR9H4jTI+|AJPQbKn=K#hr52iqoI!T@4LC>Zj z%l?3MY7SjJW~2xxO~6vaf&6l86;A}M^nCg+MT*kH(;#^36Bx@=wXV5kzzbcOSux4w z`lVW3UK{M;E5#FIbkv?Kx5)s8s)iBJgEfP| zH5*|HjC%wKZ`26I1NGosQR;z96p3M=m*z%ReEdxgg#Z-BDwlZq%?pM;y)?Mo2RK=- z+=Hy=*PxH>AVSm1pa~oTw^J3M`;P)(sc^Xod#hAcUc|{&mh9z76r_O_6FMq26n=a3 zM6uAG+~APL?~3b_Ve>ZQ9CUgO$XL1f~yEbPYPN+-$h8veL(H2DeZ!P4NKm z@yw#L8_mHL99P2-Y%n+&<3;lcg@gfK*x0=9k+y23NekQW-@hR_5vLI4G;$Jkt~TH{ z5(F?h7|D%1Rxr`cX(TY&3_5;(=AXJ5lGXv>d*SN3e}wjmXG1mPe!Etj`iXVKB3eq= zdN8vN{a9Vk(q0mHA{p-HD}ZuaK#S!k$Y5!Du&E#~br+w8*LTOHvt5f-p|#8Ab`maO z&wsy`SRqzcC}Um#4HHPZS{bT~YBBsj@fYZy%42@lr@&19iw1CP({$8injV-wdm@6l z4x{J3BEO0~_ESFz6s%unKIf!HyaXdv$T(SmVu3>nOr^JSl2DQv2ne5o^4Lg9RhXheRYKXCs^L z;(Dg$*@T2cz+OJX6!0+Av?x2Rw4pOU-)OHW>7tLb>CmKXILr+U<*%n#W`)XOI9`F# zIK~0`$v0Mdi>VArI)elH@xg%pa)VWc?JdqZ9>Ebbp>VQqG^mXid120sdoSiA_Z$Kn zfnu{n1kGx|%o2v9BV?<;Ias2ri75OqCWUx~qwF&0WQH7l)2E==6q zBnL8?*s7q$^sOGC9utOD(Bwt~>nu`BaxHWmAo(R1^kfKsTc`%9IQx?4GgD}4EH-&s z&Q@+m_!2t_3ZlT1DSnt4I{^VfOuG8P3uMZukRTL80#^oZtOW*wXY^Ws7{#jgz@~<;=1S8B&c=}y4JF&+v+97~ z6(s&|GjhP3nod0-qPtJk*zKdSynX65zq--eD%CS;pPsxr_#HrhHdE4zyzZeyM{!SYO7YU2|2;xh+}Oh(hHe9%gkLyA&-afd z&u=|`)0~u)qeht9JF{r16&EBCT0LNNt$C&qmE#V4<| z?W@UQB6v7>FrvnK2-|OeeSl=v%zXR&iApyiC~rEydqXAOB|@gl@14nVg@;9b(f2nb zzeN0@9(+?Vz6V(rHe#z`ZXhY2!e5(=p;H~EVp)|AX~d+^i#vVm&$-ba^f&=OzBQYu zi#-m#UW#6@J#j2uR}cbvGA(mYj*X?5(WgsuoNs)bK5)`#Iv;x9cXHOv9|5ak&w7Xo z!Spun@bY*z2xPs#2gbZean^A_@CTOmghyC-_Z37{OXW`6*AnS;EN~iaWo+{XXZUvN zU~PS75nmkBbM zmv2pBxmX(^=xi&cfCFTxetZo25xGL<^P(HKg&u9%t_(6(d+xT~WX|E5Z#=jqCKKcp z>oDD{Uhha;rkIwK0|^$-UCz5^)!HrURy4UZm%XfiK^LF3O#&Nh5Ow;Q@w-@E zof2WTGkl7$AsrDBAia5x=zfLm~3&Md-qqqwO@A z<-scpi!v5_Lia{N*f0f|dm|ZuKL=T-Qx1Mg&PiMu(!X=kKP!$|8$qpRZ2$magsyug( zzF++B(~(?U+a;8)vn}p0TNkGkbKB5&5o^dNiajpZT!ihr6o$2^)ybE1}5VIzwpDKBA*NFXB*YU z%S;7%lgs0e7O_wFFnBv8mA!uN9VmH=GX3LSw`Y1~AgisrpOY3+w$QEiu{ykZ{oOl$ zJbRrPS9a^6gKyY14T21oxHp=Fe$bM5}>xbe-K zRQaLEAu#b$?PnNvB4K#9O+C%(!VsoVb$&P-Q|+?+!tU}r)lhtD>QCL27&-6Jb+7HI zFOdwc&@kl-ZSA|D@tbyzJsX;EaNq2S(=DHQ8pGuGH-gtOF+X2737ZKjTTG3A>}M?~ z{$OLW2k;zalb0bO$rDGzJJ9|JXJqG6tQjCjH9*TEYOkBQ&476Yy`9*bkkfE@(6Wyb z73A^AP|pwtvmtHwN_F{D0HS>A?q28$t&fd2-k_^Z0X#nOvSW?ghSkaGMohWiMHU#o zNPM<4`Xg#%`D{nN;Sg{YfB$vHqabKzP9pK+k>W6@Xxg=X9~mPG9V7P!QWle%23tQV_ayxhNLhteS4DDm zX38VorhOKd;;Sd&Uar3r&;(A(p-0L}$04&nR4e6L`h4ZSSblUvE>{rmbvDTNA`(ov zFm72DLlP{yZ6-QG%zodv*4nJ)?Jipym#K{oC02r9{p*t&x#rf_}R;(-Miy zkw{fos6aXFTeRFzzhisRNg;R#AyaG83z+&WSESYvIxsp!K3lrJen&n0-VV~OF=<_f%h-zw3| z(TFE5E{@v&VwjyQ4kI9CnC7<;ZniUs*?yQ<<>&c^3}(N z55&GM`t0Pp?8MdO;Y_v3K3eSd!?OldK_3BPYuEpHNxCeU3<5c^R-g@g8hoF9FogIh z{p^m`-a&r;#Kh#~DYW6SVIey;<*|6d+pM7>>(-WENJG25-Q@IQSIxQU2HF_ulIEt# z&CO1PCVdBD0#X{W+^d|O+{C$H9$Hvh(WK~@fuQSzt`MP5_rux;%GsN9iB`H^XL7yE_wbT7AekC=?4V%ZglVT^(VlwCGk+zdZ zy&9hF`K?5z)YSiUpd{bw^=lOgsu1NJ`My&V3v&4>Ixp;I!jMW8NPml-sCtO+oMHpAn0xTW54b7LMHTjBf0!%qXX~SWLu@=)9LQUO7e`w zgVR!up2j+8Bfk+BDR@D+UxVFJREoT;-T!7gxOr0Tx_fhNp{D5uoy>4a^Txv{lbykg zozFsVCAE*a;4*&_BkEoH%?vI;hqCA%Jr?rqw7la5)- zJXC$`D2&}obQXu_P`nPWZd&*2mfAOy292&;_80chg-6>6!{!`f)=$Jk-0vN1UDw8D z*Ut0d!`Aa1DCVUWO}6LnG~G}c9-f(yeb+Q`hX@_>g;u|e=F|02mzAuTmj-7Nt3f@DFXB5W~Dl7fM%L0QL|fxmXlOm4#p)^su;Xizvxz7oMVm#?)2Di_!$k| z;NpkA9-r-YSNCbVDbFHvuihIw8)?bo*$?q{Csn?pyxT7XgeMmHlyd#O~CSUxcE6YYY;ane%8p|vj~#v9 zq#)3Ge76^cs+xIRTcA|hEoVRqCi8wDJtF<1A$QWqEfSjIYh2pLndMq<xM0@ zl&da8j7?hwExlupZm4fN-^-##9Rz&**j_zji&-xndU+NXr^%7qcDKdnh#vuEfdPs6 z#zDXgI@YD1pJOB}d8VbPm(?ZaIVBc6)7)~aHy(yz&sVa2zRx%9PUHr5! zw}ulfn7X0;{>FM8VG-asL)pD5S#gXr7iig`1XDjl-3l&8a&iS-){^_pC11{jN;R}gZ-5i z(>HHo_+0L!O3c&tYo*gnLXJq;gYQ@ep0=hi7v`;Q?C5N;yi1#3fnWD8LApF^ihaJ2 zpX>F2+B-VwHhpPIyK^xK-`Z)89O9maE|w*D%eI|fwvFIlHmJ(UT|k>!1&#YRg7-XS zL^gJ&sZBUV*+(rDt=ZA1%2aidf8F(F%FU#%j5{p=&rs88J%eZILQ6$bSei<5gp(#vWt!Z&sClL4mlaDA* z#)as-nZ16!)vELTZmW-6t;Uqoq>K(pc9kUC7XOSvxbz)`#Y}m4_F^YfIH#*mh(E_%-T@4~(D?dU9N z13b6!AEfm6WZm2g7M0ox`PIq|8mbL!KoY<1ONwTcR?V&5`Y0mB_0xK^@W8UQu$*Q5jXGduYK<)h(y7sxp94Q7+L>W6lp1eV(K0Qkb6`RHm$s+v62Hi=fWy_fWT=n2w6uA<`d+{4 zVS+(JqM7Qy>;gDuMR)#mcSrs*2@I3nOWw3=`#RJC(e`fh>DPiE8I<^ilT~|bBRv-4a5AANBv} zm$xJ$-(C9aS|v{xG{q;9#`WYPx}q``ReAp+;%xw$J6WGJ6PZCGYuG4RWh#q76m<`@`(CR$2J;% zkN4Huy;h7_1>0mkzy3kZ=vfjt-=z z`LouMj^2yXpYYUGS_)Co>aL34e^fi6s>-$|DT8{oM6<|9J97uO?@fahTGW@_+JpwD z$9nS~+f#nj*5RhSTK)O>pUE2f?@{ge_t3pA33hj@zf=CTR>Yce|07`_XSR3qcr+$i z(jp@hOJHo*p(5D_{mU~qqFr?%#K(w))E z3ZYD==@+MjZSDtBUI$&1`Hkm3-#tzV`oSRFmr^yY0ge5zO+vLPS85%nhnaJ8zQp3? z&JFJ(Yp&6RhKK7+KglNnR4}wco9Iv8<{rPg$~B#}n)-8NHQ=)XDm~5CxadP#%sU2IkUe`&csAHu+o}%M(uCU z58cWzFo@hZR=hNY)N9ZxPDI$6o>j3>JrgerSc8Ms+9a51$PyuBZ-iiR&)c6qa55r7 zi+g+@2{#n=;4)s;w8pNEAwOk$?CS6JVJcIaT6Jw})W44EFtD?+-*uR<|4h84aisF} zLrUW+Wu{FgbP;6V_xYX28r6CAn+o^NelPO;l_zf`JKo=| z%-7=(Xx*2hpKypz9}a}NXG98UN&j{#->4~E-)yip-S}hCLG=Hd1#%ynmgtbbJ4$&O zVK-pzyB#DkDVvM_XPuxuS9QIz2vH!BSX|6ySEA&g+1uYw+7}p2cHQsdz`ESeIP=Z+ zoOY=P7IZDD3$yaG3U+^)_Wcn1n}ukH(ec$iz_gAL-zV_?Bu5-@k zoX@%VPE~6R43e>{Oj$8+t46`sUqaZCi^%B8@HBaaY@4hRTcBI|%tooXvgZ#t-Y1l< zOAQPwp0TDm?e{UI$XF@*dh*nuXcsr-f+8J*&2ukkQ3g|o)%x}=kIFtd0Wd=Ve5`ET zwXpG+s(SXz&4MBfSB6+OD>y`|zZpu;=-IN|uz%sP@_jboypadqe5}E~_Tj$y(3jTTJ1>dQ+rdj9m%QwoNTNem3bLG%KX+p`q<~W)3+0$t#0xyOeM1(w=Vd$-s%5t zfkR&2hWnhXC5uSGQi~}3;w9$qFBjb0*azconQ0OljC9$L_hJbik0VD^HpJ&jJZ7$* zf{732k|S{P4Vd%pnZp>%B+oXzdxP0o8hmg$@@Ou`N!{=1AyS!UaZeMc)z5gz?eP3; zrbhDt$BdLoZ``+q!tCuxXrt*S>NrLqP{*D}YVOaJ!=<;w6A~LgRkEN_cm+Zp?T;wS zJcoaLpIXpxc_D$a=fb`q5a|>fl{X?s@V>OwM~}Dx;NCmrIv^9>W9laYa;`Ls6Ia_@E8uMv}Ec6_fkiL+AbeK*cKI z^KY^JTEI+Ep75pz1EE^S-)|1Oo6`-)hD-I1uW)5(2iK-4m+M&udCup4hC@}PquJW= z3gk|UhJQ}sXzt#Kv>$X}y_ryR=$Xj$5*IIRD1q6s<$D-{*+d0ZG~9p>lMLetX@llm z_5#(U@7^6+apk=8O|9$vu@{uJEvA5W{7ZSzH{M|#t!E37zPhMJ`u}0lS#L;i9j927 zx~1>aSm6-fUev%goVuMvV8XfZNhtBvt=2i`r>r2P)(SMtR$sMnSFfxT(@zMI!B&;Y zrwLpOH6QBXVL?Y6WPM|5z>o0)0Qc3pDqOi3R4W%T9eb4I zx`t{Y+g^wBAKt{(zdkF%cw@YYOaS@k&}tvrF5hZW)#qVqAPH3CNrfegPaEgI1kE1> z^_J)DF^WefaSWwzax%x71^?+xvLP(jhp?NEs)L#K$CvV9QH8?t8~yCWL0ls-wLAw3 zo>p6MjY>>@JH6@&Pl1cweZjwCs-flE>7DFG+btt|uFaSHYef(1vP~|-9dJ}Qs076< z3qMS&@KN^K(art5G8v7|QZ7H|Yg0Uo#+17ol`y#*&Pw%r8}BFwG=%zYFYIx&K`&-{ zz5W&kE_~E4s-!X~tXX#!1&Wbb=>fENiJH26Jj93OD|Y>Fu6z>T-l+BhhBGNre7%0S zhF_l1JHxHNdS#b@Jr&>!84oKgnL>-7Ey-XEXAFNGrv^Gy;@zYi4G%%^2op*IoDd)Q zs{V3m=rZvF{VuX4h*X-_qiyI`F?`yYL{w9{e~}@AwbYVizt(uTB7~BIBoCLB1fBk> z;}G>vK`hiAO1fjV++3l8ysD45sw%R4@@Z%WKpG!ou*UF3OW^-xTH;{1IhqEdlUiy> zwPHJcre+-xjz~gUeqit|&yH?Lq zF8pGZW)>lP(}%?ay3jLMz51nO&-U?=&_~CMCEWSe&l}%N@@^4FTJj;xi#PEV_8Hl^ zDTF79OoQoamryMA*kL9LMq2QXNz_{PuXg?Hph-`}o@ z=`h>AQ}VB@h*)0b1opbB1g{lO)QCgX43mN?A5&mCz!?M~-x{*ccFtrr0uHi@9O<{F zVTO)qMUVGqg?jans1#(Rv+>;#__f63qbBlX?owzu44-M+2Pdq#7rW(l?Qgp420hA^ zXR1zDz8Qkg*jpLaHes$cmdd}H-XOkMd^vD?B4Oy3E=jpN%UYJ$$5nSu6ZsN5^g-{U zTeZX%PMR_=!M2ulyrREB)?4FLkKpjQ%5dS(ik~dH;9h5R;l-R^`DtnC1%GoIg9_hP zoApB_7na@tX%GY}Zr5_eXn6B>SvSsR?+>(evI_}myicv!YmuMO)+={l$BrN?$G_S< zAzuauc#BwKwM|PL7i5%D=9X#xGEIxOw|(r@CB8xo(eBGEb#VA2%ZjTZ9!v>d%S*zP zahVEp*Hzp;neL?0y^V@mVy@=4w^T7BjwTBHUWWaxip>7q z@#O(6ECA>!C_bFlL>$gLw|Bl#@c1A!GZ5%?j`Qx&X(Ug#-$%zw{a(4eYk||{oVqn) z6%Jz-hBk^zmdVn4$x}vZgn3&+>3cV0pZA-i*mufumhA6kwDCioiU3ZN={>TR8;1mv zJFJYov`VXnKAt14d_Y`6kN+9C9CQj}I-DxYiGBZ3o|`f}v^NgAt=X4R<}j#NnCyfs zm*zwy)$O4O!-otEl|sFehQIV4wb4A z7zRyjd^!&*guYQX)kWc_Evpis_UeHO!+2+7%5Rq1)$F+ zc#j9X|0}Z46~5r-|ECShuM*WOeeeXhnqWp z(yhFFVRBs*M7u(J| zVq#%Qg{vWOl3t3n__a(e?49=Zo*(BDeRrlgQMkXjHq(&MJKHWVKW6GM%Rl|lDN2`M zzE&&g;E64F�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

Yx-d+W4y}Jy@m$!oT!$kFxpT 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

VE;4+_jc#f| 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 diff --git a/assets/images/help/copilot/copilot-sdk/setup-multi-tenancy-diagram-0.png b/assets/images/help/copilot/copilot-sdk/setup-multi-tenancy-diagram-0.png new file mode 100644 index 0000000000000000000000000000000000000000..57d30960d07d5b6ecd7da677ae0f323893d12264 GIT binary patch literal 54403 zcmd?RcT`i|*DkuL3W%VH2uM*WD(yw2Nfkvvs(`czs7No7-U&rfL_n!Z7ZH#adLWd5 zO0Uv;kRqMXLrZd3-rx7#zt6b$oHOpYCu0B^Veh@xnscsawr3?mPe+ZBo`W8OAVv-K z`}z<>4c<}-pQZ(WItKfcA&42$xPRBsCv|P=RKSHHmd34i{wvBV3|#h<{n`9Y#c$W) z@as}*^^vc$o~u17<@GA{UaNnK9F2u2-(^u={et47R(Ct>6&{;AzoFm8KVODHW_aRn zj(C+z;Oc!9DZn@o8lrG$RJ zrH1sJ`drufzFe^u56<6Yd#A-MZLH_-v5Yl2T1yayuFloJ`K!6#5kL`acfW#)yu|;7 zg882$-~W$4MmZJQ%(g^y$J=HEj*jVQPH5}M{CQ8WBqgyU=)2Y2nznB4#m?8t?O*28 zEtpX!XpmFKQZ4`dS9gE@V@`?^=OP$N$EEsNb@^1Gse8@eWLMUpwPeWx>$TC3JzkL) zi>wFpVA;jT#AC6AZfVOi{{C9;bz@^WH0D~gv+W07j9JA5TEF4)qlb9!e1sr*hwkLZ zx2zt7mrvzCp6HM_G(uXi`>c6Qc%Bz4qi)MmWuQt@I$9Eu-5cDYX{>r|V#4gX_)dULPQtG_Wu@HiPa!#y%H`@a@4HK<-QBh6{-DeAjAZ32-jCAhP#G=Pt0lU8^ zX7R@~P}bwl#G-GOn8EX%(Q^CV=WmFMi-#N&wpyKP{)Bg0H@~x{gx-qo0!w>%G!rJB z>ZzgiIn5+dxi;6~)rE@}AHF%8mNri1zfqF`L}zh@2NiIrUo#gi-m@Qaiu=Yf4w2_xSoutSXOYBz zyypJlNzkFEzPXc$au_WmzZg8tK#5mSaN@@K)6m{8 z%Fl%4?s7@41elib3B9bXkM6j6^CrCqNms{3RBpZEO}TSKFb+fNuOSfdmR~RN>b+4Q z?B3J4QrGWv>4OM{q-X#~s62>icudPUj)*)SbNz8XzE_DfdeQS<(DAylZK>&lXxYCn zWLFC{tJGu1ttPEt*oN=h`x9|#E{Da@_K0845s~!1vu$c{7 zlK)z1jKPg@GlIxcRq(XgpT(}v3l+gr{mvxu?r$s@GxG=+fZ(YQVuofkOCY6^rqRfvy7cX`)&T_o|1zXC)l_+Z64M z{Y^&{`SVo7e#BC#;TPuI<=}}6fvuM%w0acqZr|zg*;AL@+CH2oC3-ej{-HOzwEBjp z!7G*$TDiDd1}|hd3B)TH%vM)+iu&JKRU)03haJVGt=}-1zTrAqYW3Csa_JRy?1j?EllkO`uAAX zxL|IoTRQY#tFyMUGQV*{?oC~cwxDN^?9Xqy85eRFZhqQ3b8xh(o94`r6&6N%I#r8z z3wWy=$G6lo;%DYJnF60x&Hl@MCH3K!v=fGe=QuiQ_v zp`*||^TLKWU(xaC40E3U%Fx8^iZ)6(!`q*%R}^M~e^yoZ_(>8D=1@IVTm`}r>^cQT z&Z#rwek>-T1JMeJm#%l4{lQP+nIqy&%X8#3P4~wgmDr`$Qboe0fOM(C3@Pr%KW?n* zIQaY7mOJqjPo05o;-c}vR%fEfS*O~$=RX0!sXg^?e)sJe&Ukt!zV)4pX+cA&k&+z6 zS$-Mu&1rumeK6X3bA~EyZ@kiR{+&>d+q*qep+Hq(ixbPI6ZwRsT=&K9qE#aX-V2%+ zZaa5Rd-oFpSCJ>Sl#6%AlMlrrGC`W6L53BzO%A0$zS2(y_D{Rews?R%0bfN+#u( zT$BMK+{cps$sH28pm|3AWYZ@%CuE4LWUKT774^#5iCoe#JVZjPy=7;@$45@5(q*b= z`63o+nQU+{NV(G=8sjWss}pzbT93#MmcIBeoDNE%tgOiAo_JVJt(J!tNwI8o6RfeP zp?8*f#ZR$Oi?jEmf|M^@p@1^`CyO@)3{i$D)3~NnmVJ$gGJ{_ZL-`3hdQOqrANN`~ z#qL;#-kiO$HTt-~h`MT>uO=%|)co>(RlbhFLKQJ(clW#BtfJgn;8bt;^I+xM zH;+ecG&&uT_2yn<3xS_+Etuz;VfLVs>|haq-QVQ5+opQfAT|pb6&5OIsu)Hc{c+(N z-*PoXBDt`ByQ8j=tB!v3ik!n9MY#PMO4>kffYrw2s zLYmOEgI_~tC-+LliHjMCZw701~gt$17gl7Zq(UYRM zFD8NKVQVG_%egqYN~NG<=WwUdlBSxeSOnRxd1DFH5~`VWqCRN+^eLIw_k{8Tk9G7@ zOk9T-)BO$OxJh>mYR%xUlRv!%(Sj#%b1@Fn0q)-Ys*%Kmj*>)CV-Q<))*&lDtpgX@ z^ISL>c$sz`HeXH{X+Dmrtw#>Wo+sceVl%ASIQk*vELYWf1d`G6rK$8tOH@ky@ugJ` zCk`F~?>ymE+c@|9c|bpgq#R*m6xMtmvS|uM0C_9NgY?D6 z@OYnVkFTa?;IV>CrdUjxo^IOFk%18Iaw)71VMwBqOWY>Z)v#^ z^GlcjROpE8o^uxd=(?B|6P|V?^oa&a9Q{WsU}kqf>;fd2tD8X)vV6b1?4pqj#pakT zPrOfbN1i37;j+)nxm$L96mAM z>QV`fPka=7%Dq>6Xsw8!IOQ#5R7pHsiYQnhnPnJ4SNUWs^m zypFOg?z0ju{rqw3Yq|5>n8*hv8<7*Er1^Thh0u;K$89@i_4nhY?Ofqc=_tL;24&rC zUKg$5%3StVhl}FI+s-$+FA}+{C+q#;6wv)s=b_*?G`cWp`+jQM_dzmVR~-c#h6Ayl zZCCgi4osC50}hsNxlBrKk6Pgq*$>R5eT_lnM_uJTS&Eq98#C(-Yn@NDK`x}ahj;u| z!>t=;N8jfBiMw+!^Hu0XhEvW-wekI4$pMJlX_UK53B6qYa0Lnr--XY&aPZcKV;n}| z<(SRxb%n{+SYKlc-zs;^44U^#b)`z-gLiusZj78>(d9k8y-7(Hez(@j9Qt4m)` z$x1K|3K%WUr2D%hPEKB4+y;?-{DUYC1`z%OMK%^z-W{`79= zL3DY&gN=Ds5t>fHX>|goWRc!u*1EE5C03g98I^uK9(|8`_6to17RDXL#&*WnY@da0fn|T+EK^Ia`;bDW*_#zpQce)3iq1hI{Op7PE{(X%)V)li>|V)Qx(5 zeXruKpHvxPbm^*)@?N20;I6$1=2B2e$nK1 z&w<1+70Fu=7oXKF_RxFy)P%zbviYn;xh+=|ZQ2 z@($iZ`>mDI@%#N_+CNBt+QMsWIplf4H3*LAcDikQ z2IY^_vS2o9+7I+BpJSdB z%CzlO?5TM2aeo*lMpMP46p&{)+!#_T8}cfOinx&UJ>lkk+RPQFJN=w4)twp+<3Tdc z2TG?lz03aZuEf0b(5>SKHTddm68#$l1ebj zX3!g>tA?HF()khg=AmJH%5~qrpWmc)VgvCtmtB9kQfB@&(f$}h$PYP?QZ=Fytq2yh%wbFg)2_Du}F9ojq%&Nxj1Sw_oqnRZXl;Uft$(F#AHdU*`ZZN zPRgZw>zw53e^qO=ZCX9*meO4kQqDsevu8ddoj9?{ePCCu=1W$>65#pASVN8NWb-(l?Ig~BkJ2t;Za=QmvZ3$SnM{a$2P!N3*tEBqcpxXlZqEp=G5M6bN@Hg70KmVuAu^ z=jIS1H*Y@dZEL%99fAy5-a-FXJpYG^qm8$Np)3_Gt@oBtri&0rxAV_|O!N2iGy*a& z@A@Ms^K3*+4AQu+<`D$tJvc)FF^jlGjsQ&$-Uz}dH4TG85n1g+@2H{RyiCD1@_!!d zFa>92Wie7h%977dL&0``_@Ii{@4*#!niqHYFTndj)l#o$i2~v^>jUw0TDAyDqiUGi zHX3{!MgI8aQbcJSlzEyr82umy-d;64H}Md}+#J8b)rK!wAaWJR^F0;^cX8B)3Yq_F z){m|zDPh++G{LxOv-{BIVF0LDL54!0==GL<{MLhW%8+Ml3bc7l_|KF<2`WqF*|RJ6 zz??ObXC{k%+(GqCFA4;0Z|Tczd#jd9={@YPLwYEWa*}=44v081IlvXn+80;PCnY8h zt3a92ZzCd>vkHE&OW2%T1A|=yBFt*f*jIAqUloP)PVKIa!2QjeS8jo#cAgCw_kL7X z)>T0YW=_u9Fi4qeX6NvT72b0JEP)+t^0yp7pgNSwEEHhsdV+Q;?#8fH*L6WKax!`G zgJANAQ8N|_vYc7T%a9BwOa9y-Rqz!ETA@}*Uw^UcxjIZBTY?06G7la+Xi1&zPN#$( ziAqZD@oGB>IGmqZly(36f&nOwtQNc35tapCzaOc6NK4Ehn#t{jwkObBo zoHu)x>TP7?*R$Yao5iR1oUSP;kyOE~XhFcj{CM&^#OevwR#Z_@QSX^h*jlkHVcT3vQ?ibgFkm(R3B9XvuI@i&17(z7DV`DPFXn|9NY4H)@CG-{CaD@F-RYa$qK#a@%>x>wMq`khc9ECJ{Un@;iA3a5-4{5E5U3LI|HZnox`&LC>Hb$ z40ifO-Q;vD8E&1#a&0U)VmN0P|2;h;XZcc`f zMa+39@3p?Z{{HY#gkNgMShedMXg4%U-3Pm6u%oTb$4ECn$)VE>Sy6F2hniZiV04o& zqZc3Vyjr@F{8_?Q^c)0LT_GEk=@(iO%R3YjtV0#V>zkj7t43y&6eJ|#ejvc?qRHlx zn3QBIIOK~y5fc$9%7v6gGF!hgczPy_I?~hAhl3VVCAm-Y$a#NlOctGN7~om~rXuyU zF*wab@)3+kK%e<6Zq=d$<|YEtO69?wV}kc+M3u|g)e)qn5Jj+awl{9tIY1G6jAk$B zTzdcheJ_xVStxnzq|cvg)QyqL=h=985H;YrPgP0edEV91($ds^s53l+r~{iT5?HRD z;1V5vbhcZwh(-s>47cATg%<03w42npEi9AAz6XA#eMnCy7F1Q&e@|iD<2!Mo2(rPB4Ngp(N7t z=g+-Tz`|6(&bfFM{Ob7x_94cPGDr;+VyU70BpMQY^{8)l27%w*-K8PVfmI07d&4Iv zh~NRssY-wAZ9kCHeFSQy2tkPX8R2M8(+S%^c!NGvVk9oEireajA|PdFwrh}HYj#c! zcedah&x*$319SXH+%}d5y2{7T|1FIhruh3CiiU(?PMaFDoyLbikct;yXg7@<^?xAab;PCjb1){+nOT$Gll{f)y?!NAF&l`OU z6+lRAK=Idq0UzL*OnV}|w4!OA?ASRarvkPk>mUk_73Da|UCpT^l8jAEs^vgcnKzk? z@{0=#3tR^BYTn6cV<_{oU*RP)q(!}@r@NX$P(X4<2G)DL!XCt8(4+SNSmp2P{x$I2 z`zq=hgdt^jb#*0CLl5aTwvizi%MoeY7cVA--{Vg~gA^XGX=dn5^UZ6$96fesK7IOh zZM@3)IKrY*56U#b1QCvI+x5*zC_K2F2c%kLl@(k93zZ`n!G1 z71cE~mieGe#;X7ZM_O82ZS6L(nlUUH%Vl3_NtR$pTk!mNoiy zu%P{|O?gHlLgXw_Vz0U{W(GiX67V^}f~I%`K!Qk@s=kG9K;UuI!GcRftbQ2L)>Bqp z?4rXA;tefP%Gxdji1iJS?Tjf^yZ}YR5HIf|F~uy6UCsEzyNonFc7X|sl!O|lpzCjn|Jh^^F);ttkIYjXBKn(S@nr z0T7hMTmfC=+4ppc1B*Kfk1E1l<%e#9X>S)B43sNP4LvQ8Ar(gB)055(Kz(1?hzct12lIyE-9q6GZi=06U= zft8ZC=SZ=6?Gaj5o$8GhFeM31&DJZ%2pO4WO3G zKsT8e7fo8d_7*120`INawq-S2WrRx6(4^g z<;RYw`S`M8@>k=jtm9<`G$_eJB{bwkhtKc@V{uC25)wO-6eZew0Cv>^0!~=aHE+y^ zXGpB(qPew75M+IAx-5b0f&b+NfM+lC@ii7DQ&+eAJvA6DPp`~3N= z2--JV)K$eB0YNukgNYj|o0%m?iKXiWxcd0{9R*TmKG@xusuMQ3lP`3}1 zjHD`$ls;u-Aa-|`2QY)q7$7bBucyF6RDes@7(Y6w6QEc-ID834eoe_c3$S{?WAE*T z1J!!jhBwYs;q25R5s0GXF_5z|zkTF<={Uz>tV@f%-u4R+QjMX_`Jntl-3&#pm7xM@ zi!j0*xX}u;>=tBW^LGRYJ0GAJ-(#w&sUf9+Lbn$? z-aDKgL{si3uX90jsNpWCsl8bZl2E~C*!VsE;-UmIG4YuK@*=SSow}w5Q!2AEUiv4~ z-N~u2`*hzUs!#0bwG3c-g}VeGuOiNJF7L?OGlzO{&>Q+0@n(agw8fpn;-Sc*^*d9x zPBPtjz%kd5MZpMA{cUi3e7qOOAR&S)e2R#ryl)9)FK-M}vjosw%+_0N8WNBr*G(cVq4j_tGA#1W0)k1hRd5?KG7X$ z-N@A_qdHBbfbwL46$hVQA^R6lC$${lUHpgfrPK=ABJX(FdHCAXh^llKK|>j}_@xmf zcHh<2wcMk;;X=ke6L{jwdg!+4Kk9G{EGfjx6tQ3K>6u1LgafS2a|Hn=@AmVGArd#E zU-+BaFu60zTschx$CQI^QeGGkxGAl`y@Soqa`$IZ1V-#cP~4P~+CMvWV!8F0VK3<7 zfszOWJxzHAo^{{iBki4}q!9%(IDQp0%^qa}XL7MG=`_*2nMSmz0AV~8G`6^7-Ig+d4Z}A8s;1ja6zOS<0hzX(siD=>LOa1N#~a_O*KzR2fgZFJ;y2e^ZM)EzQ*Ot6b|Q7wsjE$aql{g&#?&+ z2?OQKU_v0*f$qQUeqCIse}pyqgRO6{W04*e+q%S%{I2ye?t4*DJxw0h?4S_Z<@&;f za^dbY5cEQWiexQ@-llt5DXIX%*YP6)ks$dJZHcsaa(QXO{KVxvugnd-C#q={P#){; zw-{|i4Ar;oduFK#WGO@_^+OM3hznUnan*hm=0}b;4Firpw-M-ze?@WT)h-L%`t!OK ztCFlUBTHC~mX?F(?l5k*&QiLF_CrdiYeER$XStpTgj`RR(CD#JeAd}kCAZ+gTdzyE z=L%Yz=YeT(gFs%Ht`(!V8zME!B@F3}{8C@(6l{4xcCf4^QQlcm73snd17|li&n+Jnh6;?^uQ4esIkf@;+v96$fUQ=g5>xLmXcr;UfXi0n z`N-N?Kah0>46vjEHtH`wiU3~r<>j8LJzANC!GX@eE;>QRI8k%-oe2!_&b?{>MQ5-$ z$bno}(p!smMLl$JDJ~EEp&u5nSUXM9$XOU^s-%Dw1>=(IZz zYrQ5kzP3bJx6d|jV-XD28yScWO)+^fPHC4jhbMEm8e?*09go>dO!?99m#~kujFvyT zWP9Aam>vgc9*Qp~Ec}@gzqE4UoUjNiHNl&dAklLN<~8Q&t>H4PgE(6rR z)JlH!XnDW4yF4GRu2)Uyl#LW8&@fzVtLQr8yLGtDaAkjaLN{9J5sL_yoCYX4d;@@8 z=GDz%`n7Y!GVq3&JihRNK)jXlGu*)h9>uNT-{!S0r|ziTRoLB=Xswyl#+DH%0I%CZ zA22XjJFeA?@XBtyVo7s84#HKhOWhC_zV4b~R0QkP_^I=8pKDyxpMYPNv#7KCc!F9| z`Yh?5qZPE=T+)l!DMBqDy9gkNhi@j8{#ZmrMa6v$zr21@yDsMupPhZ*w9+kM=d(^7 z-o-S#ms1B6xaTV*dg9aT{T?QXPGy(m=@E~;znpCE^!9i=We5R<0@OXd-2;PnC?2m1 z21?3Q{s?+=IjA~dbEB4j!%Bj74L#w~vkxz~?c_u{v)||O>1%R}5I8TK$2eSSAZR=0 zj8{li##4>g`(M7Xg9#_;b*x^U0}(=auwaAM7~!``kjjhINjZGXO6q{g=_)$eGz z2ebOn<)bj{Ye}Y_zP`aiOA0*UKBK-lod|4Y)&9nJd;9((n6&nj$uiYOC*i(&o32Y^ z{uzO&>h7HH<<`fd<}Z5h`gi6DAzwP&e$`*6>b@wsyE0Wf@6IPErx}x8Kd(n1ielFE zP3s*J48vJNF9&v4_IQ_gbvv*l7S~~QNmKYqg9i?=*KgeT{%bF-3OjA;g|*UM^mZHA z8+jAJly(O$Heo;eYei>t(Pv_P4s~7Go{kpA?YHL2t}uJ^kboM4$?JZ75M@1?HYa(2 zdpvv8a#S;FTaFZncwp)ITEGC*P$3_3Hh#Ssy`$^5VxRk(wC3I$2X8oeSXMrA2W6^R zu*dulrnM^IXx;!Q_tE>B+@}BulpyhOXm9p5+k?=0rD+%HM9&?(POvjJ$wt zy4Sm^-QsxlPNo&}rxZ0bq@Bg?xUq6u*%6T=_(!KGT1L)}Pn_`nnd*iB62be{>InO| z1I7qY+-wEy@P`4n>^2q4%%~P4@Y7&SBxc!Wk&tqD^!a4FQ*69L!P3pG?3+PuPZ>&a z*v4>ayt3el`14m!5bKgK`8RvfKAV49Q(uLB-riE%t`)E{a>&Hg(_+IUYo7K#t7mAz z1|pvXG#wt97bd+MEe`arIjnNk+000Z6Z*OsRjzyq3MJ+gzYN{OPy4nm zpL-(OkQ9Gm(Z8JU=W900^JQusQOS0$VTfb-BHM_-9Izign0rk;j+P_duh~E1 z>|ECdh_s?eMz43C_@Mpe-1#~N(fF2ev|qdR&xNW|X*pCH;*aY1_T-PTs^b&X%V!a- zW{ztmaneJyZ9P4Sjt`<<`q5Q49Pe}5)-3gFE-YPXy(4n+Q%6yi`;$+`eY0nJBY3K_ z@+N<~4$X`E5U8w>momfo^#NnI*cFem&g0gfDI6N2W=& zqAz(EMyF=5=n6|8qA#p2eK8~OLAuWoyPyxs$YZtnAOGRP^LTc@ldX^$(l@q@BtdR} z;g=IAO9X$f!cK)&HRTp;zf| ze6{YAC#k8v!(%;FLx@X3?W)^&O9YJz$*SkFttr~$b1L9!=`avKSiR}!6l>6%^*wo= zLb<(O<%r``d|)pWX!GDf#BtsJiqQ6;yO_*Rku~?xXKyxiLK}z5jp4SZ!%Nfoj4c%9 z`z9KPB_w4ftj2HG*snS3BP|rjj*(onKmBK@UF=jSY*oeit`VMFVSeTwlV@?c_{oWYS0;t|3el7>CIzizez>{!N!dZ96zZUA#Av;Cqq@GM3A4I4 zV!?Pg9dvjom}?wd%6;JtSI~=yi4;lA#2CdB<(!qkX#{@#1G3dDKQ}<0|7DFM%7xzr z{%KS%{0!HM6VkNyLAvj@2HnD#Z92UZEaug=2`<`ouGO*AU+zX*Z&C`pS|=z?JTUS& zO=fLg`TSDzVuskclT#@t+mYM2P@0~7@q00GespwKa7mdXh{NVZ7&WQ*dviwaSh3-= z4y!$1b2#SEuk8!15@|Os0N+i{+m*r3kLsOh*ASNp^hbYMR98d)lUG zIq_}vMsk5<$hQ9IqDh6FdoTT}K98`ZXXb#!&j4gdQDEX1t%2a9ZB4O{13HTB-z)Vl za#p?Ube_xh$8+mYKA&{9TFB)=obk0Rn40lBF5;2D{`S9X0V6*Zb6I&RLf__?mfQ3r zElDN#%3{(V;U@?1r?sFz!S7PeeYQn0OjqfUZ_PbmlUV!T%Peulx=8v94gamWKXGZ5 zX6NtgfcG?hHiu;kS0ayTQn(EJic}*L_0uL3m()#4X0XcIuk-+&4wi8IuI%FWaM48D zS&mmIhq0S40|8Z5a}w#9(tUUHj6JUjzGy@10=y>x(ZfhCpu)mmp^p= zhO9L;NkE3#dA!iR?ReB@_ug5BCw};`-x|dgL(R@ZV!EA)DJ)Qd(c^lbS#tD8I>v_d z?BlV4t6kLRq8S}aj-Zx?)d(iVCx6`qr6yDB?568f+m20&D7OBLj94Q(#-}ZtmaYn?gJW9P%ib zg{7s{uJQ}kt}T`&dUFae^H}O~@H?{)@&wI)bUQM&Jw<76b$8R!eeq7Yz^8ByyV?w2 z`|cFDPNK<|=KQ58f3-2kzUh$8+BI~F0q)sRMb`&B{P%NrW_UZ~o!tD+ZtRv8=nfX8 zr1!4es2*M@62cRu%9SG%hb9Jq`x|s2=UOVm#Z!~pX`eosY!Eo9E6*+#b;jA9J3;>} zox#q}C!XnZHmi#i*MBz$?zqy{Hx2iwm ztGSCion7il@q@P)J0gRfsQkJ2aF?yT=*t z4}wp=f8hsM<<%EM9SJ&`Ri2FS{tEjVJd;bi1^Pv)Q&hjz4@VVWoJe(o@4~xS^Ic~L zRfe+ev^f{|ocm|^uV^&~lzS}y?aj|G7aYZVl3w{Q%*80i7d&_$A9hxu%a<@R_44cc z>e+2(d~cj&fw5dh$R2ds_FcQJ0>Y z#>Po|3tB$8Nujrdy}cnaH2x#p|`#C+WWVeF(j3IK2>bOilnVp?WTj!4~|DiaYGe1EJCcUmF zBxNAz2I)(dSpu6C=&J(Kx~+duF|`}?*7M?Z>MT2~RJUEKUEa?xICDh1t}NTi+`IVj zc<9Vd%8_8wA3)M_+V8NLjk0N( z-8Oxp>kRWlgtUFdOJk9UjZ5Mr_UYL4$BmRIz z=ZtR(4ek_oz}xbA*SQCWn*=-+$~4Kdwx_~r=+4@XrQ6uc`at)lx?lQ|r-lnnMR)=a zLdu<|#+hVyOFs0vclFItO&DN~b#6ZY^8>MvUfUu!A!XPUPH9p}c#6~t(r|N=VpWmf z%8u(SEL3va9lCW`DLp^NW_fmk;mb`xr%r0z|ER`D=gV^}>^&9e4UCf){G6+Jen@{f zKNpj>t}_7_!%vffcbCS>e+3pkJ{*?YIP;_dH(mR!q-0)x4`|uo>2XKFgO0OP{?wwd z$g(J7CHv7E+Y@VJ`YZvifEJS^1`{~N?NO47_|puVgzr{by*Qp-A%JNcm1%0TFIA;a z3?kT`cxXh-jOF8EFt(wWgXSOIB1XIRI8o-LGUEtN9upbz&XKwJZ&p&y`ymT z{hm&>+x&IejRTg{PN77xBox-?-p!TBUd05aY5(4_Dhq~0>eDs``}M~?u%4>=ky=5m z_y^zKog4QKIzFhi&Q0@n6-5x21K_%7ratn137q-hjz3H zGhBmNllIpyCt~^DPbO?9&0^|;)*suVZ6ixwnFG|SSnYvIySi>t$4zslng67`QcTSy z+?-5P2+R|uzZ{2-8&B$=TrZN0`2AI_S9z1Pij+vjTa|NF*R$vU^vBhSTtn8W{3Rad z?x5Gb`<>r#rQ&|(Xw|JoPo(uW=9u5!+RMjz0~g{TJx&3|zdT`3<*{S<)1)-%U08T9 z2fI6DYP<%j7Mh@?IUgg7IThORu54og)Iopq%09X%{0UcaG<(t%DEYF)x4$GeXJoE=oD}wWwk<&ql z$V4pYD`F7^pV1&X;ynVL-+y2K8xC;t{b!{Ab1RNyZvbAwr+(2vuljKDbhFq`p!B=G zB8X!9H-S*T#3=iW7F@D&0VK2!H=EnoXRdaxxz>6U!;+wpSJ84j14kc#S@fD7u3M#z5cbyFU;7rsM4hvLf?1t@Q*mde1N-gh zL=Y4(Ox^=~j~fMj&Lj^7!z6x?jf9b#wr>XS9w}n_hMr=u7=O?rGYqly+?cEha&y~m z0-akptz|}X@=-8Rkvk&?*o`4O!12uew*$e8=H^U*-*zOXq=Z1BIZmjW{sO{9gU4n@ zY^<9DXaK5$ROmC>@}#hn83^I=4`6$FH1A-_*nwc%e@PL3eec;NE~;}S0?tef^lT|; zGg{Pmso`aVDAis*m!~giq&FH_od(@HD|>r;M#;WIt*}({y;*D!27v_4epSjwall`o zDijPBh)S#-`IeJo@wK1^%o+)9%3}udEMc_Y#AeGJ=nh1>Z}03BEg-%_r-jH=i{3?d z`lDr{RePC6^6BbFKo_3@YZ;n&ODirS>2ug1bC8jcl2UuBNlC8(jP(r=q8zLPijQ^W z>Q^9e;X)Q@S~^jUZ)1&&vCC!kqUH1q4ER(j=W&NEW*Z7+K0q-;sy%t~L?1A{(Ed}w z6jafJzm!MT*4A1Vd(vu+fKh~ja=zZr+cL|A1xSzOyw2N$jc@S7mRxc(*tXdGVwEpwT*o!^P0HnOs^>{>(NV57#d-jK=3B`2jpBX4c zRT;Fx^tGr?L+9pcNocMVmM>Rg3|$n<~L0zhRc^-GGorxF5NKkY|a zaxewkKLD_w5&;DYdK{meJg#kwbu4(Q>3rqHaO92M(+^^h{Jpqf%u0SPH({Fj z?5QcB%5!8f(gWR$SWpp>kzpjB;bL?DOHE2M8U`L?d99%aWHRiC)jdED&rFP91>1Ug zs@6N@)vH%<&+;%@((?EU3J1=`CJN?#0NrRJaJ9<`@$nV<&dj{;tgWrJ?S~7;u5p|o z2j-euKtpAUCBQ$1TY;nKKRwM7MzT|^Qo%L^rYuJgW5&l(Vd-nVeTk&{zvQi^_YB~N z)Z^Lz8{;Teu4{XxeQSNUh1P0oZ?Ez0NtGQV)9(JYRX!m~K$1#oZX#tI9v+6#5h-4M zZGE?azCF;L5*r(PF()Ty1Jv7{sDO9NJYO+%r$Hl5AY-XLK&k$q7f9h0;b;|EKn?w9 z1JtPn{IU07x3Oo$z^^|@@(|2|fblTEf*-kkfHjpi1_!U6;Xv6}?4naq?%vKxeo4uu zCB;fLz??Dk9i6zhA|C!V{(-pZ`Zxe6N;aSk?%f6UZ3L)(Mv)PV6)4IthL)7%*q2;T z943vY`lLML7qen6B;Qb{%8=IB#8m(vo+YDlc z^0E>|V8pqdLylEfepRuJoX$`XLht|zmxD5BQ(u2m)yGv_fZC&0cmN~m_5fPqUC??3 zcyVX>icK}Qr6^Owbod!SVGsjO?P@SkM*OozaEQu&brR+G+(K8(0x39)I(_v=xZ&u- zxSMPjV`6BTvjNq?oNO2a-R-~|Nq2n`pCcOxJvd7R{pd?XRRIUWW4ejFyRt(~`e<#Q z?l}gNPB|Sc@~gRd{dp^oxz6wVjaWY|4$zG^q#$=cx@|Okb(3D0Hvq}YXaleU$ktE+ z7z|R$!F9S~e_1bH%mJOX$I1W_Rn)b$D_J%S&559`E~`Hh1Q>)i22>7|ZazUlL5sl3 z0?!A)9zN_42Ro7fA8=cIRukzr08nrH0$4O?*E@oQQmg$jBRF~~c*L$dV$>~`By3t{ z1ikuptnRXD%}9*dI}AWB2YHxHR5_2>SX*~rIG+FoyXjFgL!tlrhk$^9aM~P3(8SgQ zxOIUd*bMmOf2k|pN!+>7<(7i~Sd}Idk87vIGHQT&OGxSi&owGK;1Dr-()Te^pUYv&WF(1pK(nUQH<;()LLUqXKrjWO6|Qm*Li>Pk)f_^}itKoP#Q9of5B3)o(I zu9OgWA~5mFVy|KA5YZ$$Xz*MzwU2=@2u()5s>M8Dg4G;rI4b71GA~U97x0`!< zhE;uFJtPoWD)ta*nJr7UighI=FEfDuH3f_&J^=wmE+DZY0i}$k2^3rcoLHhS2klm2 zZRjMgAWf2p(S&t8I1LTDf(f@C1vH%UD6bS1@>p)yqJU<&$m3}Eoezj`S~(*5gJ?$* zO!LF%&xgsyes;4vR_2Pp%|UQ7fcFA6OhDn>7*jwo|AKLi`{FGcLEu+G zNaYhvOJZ8d52*@@0vu}I1MCC9Dv1PonY5HK}l-r<@8 zJTjhdi2z42$v{;^fziJpyqdfHY%mk-<}u*Tez!!?0ft$r3E2qIOU z7dTMs{v8aD3Sw&*9UY~l&=VRZn%p@U$-L{HC4O0gBJ(VW${Sh8R4JGv%si;Ot1G~~ zq}w#}OC*$6FMMEGZlfJpU0ofTot}=ss}~h zK*b*EsW#*>Fic_}KO&`N4qv~1{VmEAa(Z715(^ED;Lj&v|c>X}`Ao z0s`s91wQ5t>573z2+G!u1ff6-VLxTS4K-rnztAp~h3)0g?m8%RECr_%KvcUbLQ&!} zg%+q{T3v`@^_>KM*J^SO6zN46XtrB<5QDHvhXkZ*8wFkwAGm;7UK+He^5Z2{MAM)!V2GIuL!irj$|GqL|)tt6Acv^qYDI`xxPE^#vf8W z5IX%S4Y0%7==~g4_qN~37lWu;wcc;fEtUpwXax^*(cZX*-|H02EBi5uM|n+Is*$tN z;6V8#$fe+}8GyI&tCnIPFd2m;>+oQ&A#)>41Sxnca30m$B9B_xoXn1;l(siCyLU0sFvrc*q(Pj-5hR_!~ZSQ&0s9D{TG){Y%QmtRa_uzssWzewODaZiiFcy%9$ zk=e}H)cv_yxxAm~1O$w2Jp<`meT)*Z`VWRgz_q+)uKl$>n#MaA4^ ztjxNhJx)-N29pT#KN;jVa0-I+%^CJs*b}Q~48u3w!TD;rgodAwtA=p`7D;}?uTAo| zDhCJgGWPx14>;;Z%16Y5P7YX&Ojbc!06ze~Mo_q`a&i+Rz(<@!bIJXkFtG?!;BQgV zO_eGAzqotzcc|Yt?thXcgd&u+4TT|ql5XNrCz9fX~ z%wUWW$ubyXW-ylTHSf=H|ML9~M^6yb7VHsC~9jq;c;(YwuS};tPH{hM+p`3 z8N3$6=)8b})?(LXJkV?2I{rzbBJ&Yv7o}*4%sbZ#B66fYhde{AM za1)!BOf|~*1^rZxToHZ?W9cf>iO#oz^Yg&PPCx8t;o0S+2@wRTH_TBY z!{b)`KB_k;9?&|94zxr=M-2$B8E+FXb{22;`&U0cCFv9Vvry~&(KIR{a3S*tshL*V zyee9s&|!{e!zqGdX^UreD5V=0O2uPwzHO2>*q@6Zv$YCZ`g(EyAT!h|;fQBnx}rZN zkaj?B7#PBy`4_MY-V_PlbOq?m!`1V6mW=Oy8hh)vze{9?46g&mPCRyiup?|1xACnY ztKQgJD>@-A_s_xtu4Q5oydi?BtUTh^b?@KzXio6%S9a6|x0#}vmyuys94m-ec(%{5_JsZZe(k|7F@1?f zneg`^kD0`*`Yvq3U4lm!;Ol*ggzM$DSf+cNoli3>4_L5FAvJGVy?|O5lstAPYbH#UYtm#Y!LFYwl-9d&~ zQGdN$vZnwX43n?lL{%rnHjtWedW+8E{&# z9bsH;Sbh?*0&EkKRRXUR*}v-U75hWf8cUz!KvvUTVkPrp1!^2lnQ&%+M~gQ

osB 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 L_Bj91tAPIoXX + ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(new CopilotClientOptions() .setGitHubToken(userAccessToken) // Token from OAuth flow @@ -292,13 +294,15 @@ BYOK allows you to use your own API keys from model providers like Azure AI Foun When multiple authentication methods are available, the SDK uses them in this priority order: -1. **Explicit `gitHubToken`** - Token passed directly to SDK constructor +1. **Explicit `gitHubToken`** - Token passed directly to the SDK client or session configuration 1. **HMAC key** - `CAPI_HMAC_KEY` or `COPILOT_HMAC_KEY` environment variables 1. **Direct API token** - `GITHUB_COPILOT_API_TOKEN` with `COPILOT_API_URL` 1. **Environment variable tokens** - `COPILOT_GITHUB_TOKEN` → `GH_TOKEN` → `GITHUB_TOKEN` 1. **Stored OAuth credentials** - From previous `copilot` CLI login 1. **GitHub CLI** - `gh auth` credentials +For multi-user server mode, pass a per-session `gitHubToken` so each session runs with the correct GitHub identity; see [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy). + ## Disabling auto-login To prevent the SDK from automatically using stored credentials or `gh` CLI auth, use the `useLoggedInUser: false` option: @@ -365,8 +369,8 @@ await using var client = new CopilotClient(new CopilotClientOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(new CopilotClientOptions() .setUseLoggedInUser(false) // Only use explicit tokens diff --git a/content/copilot/how-tos/copilot-sdk/auth/byok.md b/content/copilot/how-tos/copilot-sdk/auth/byok.md index db14d167386c..9a37fb8202ab 100644 --- a/content/copilot/how-tos/copilot-sdk/auth/byok.md +++ b/content/copilot/how-tos/copilot-sdk/auth/byok.md @@ -126,7 +126,7 @@ func main() { Provider: &copilot.ProviderConfig{ Type: "openai", BaseURL: "https://your-resource.openai.azure.com/openai/v1/", - WireApi: "responses", // Use "completions" for older models + WireAPI: "responses", // Use "completions" for older models APIKey: os.Getenv("FOUNDRY_API_KEY"), }, }) @@ -177,9 +177,8 @@ Console.WriteLine(response?.Data.Content); {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(); client.start().get(); @@ -214,15 +213,17 @@ client.stop().get(); | `baseUrl` / `base_url` | string | **Required.** API endpoint URL | | `apiKey` / `api_key` | string | API key (optional for local providers like Ollama) | | `bearerToken` / `bearer_token` | string | Bearer token auth (takes precedence over apiKey) | -| `wireApi` / `wire_api` | `"completions"` \| `"responses"` | API format (default: `"completions"`) | +| `wireApi` / `wire_api` | `"completions"` \| `"responses"` | Select `"completions"` for broad model compatibility (the Chat Completions API); select `"responses"` for multi-turn state management, tool namespacing, and reasoning support (the Responses API). Anthropic models always use the Messages API regardless of this setting. | | `azure.apiVersion` / `azure.api_version` | string | Azure API version (default: `"2024-10-21"`) | ### Wire API format The `wireApi` setting determines which OpenAI API format to use: -* **`"completions"`** (default) - Chat Completions API (`/chat/completions`). Use for most models. -* **`"responses"`** - Responses API. Use for GPT-5 series models that support the newer responses format. +* **`"completions"`** (default) - Chat Completions API (`/chat/completions`) for broad model compatibility. +* **`"responses"`** - Responses API for multi-turn state management, tool namespacing, and reasoning support. + +Anthropic models always use the Anthropic Messages API regardless of this setting. ### Type-specific notes @@ -450,8 +451,8 @@ var client = new CopilotClient(new CopilotClientOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -489,6 +490,7 @@ Some Copilot features may behave differently with BYOK: * **Model availability** - Only models supported by your provider are available * **Rate limiting** - Subject to your provider's rate limits, not Copilot's * **Usage tracking** - Usage is tracked by your provider, not GitHub Copilot +* **Premium requests** - Do not count against Copilot premium request quotas ### Provider-specific limitations diff --git a/content/copilot/how-tos/copilot-sdk/features/cloud-sessions.md b/content/copilot/how-tos/copilot-sdk/features/cloud-sessions.md new file mode 100644 index 000000000000..fe36d3c6f2d0 --- /dev/null +++ b/content/copilot/how-tos/copilot-sdk/features/cloud-sessions.md @@ -0,0 +1,403 @@ +--- +title: Cloud sessions +shortTitle: Cloud Sessions +intro: >- + Run Copilot sessions on GitHub-hosted compute through Mission Control instead + of local CLI sessions. +versions: + fpt: '*' + ghec: '*' +contentType: how-tos +--- + + + + +## Prerequisites + +Before creating a cloud session, make sure: + +* The user has Copilot access with cloud-agent entitlement. +* The session can authenticate to GitHub, either with a user token or a logged-in Copilot CLI identity. +* You can associate the session with a GitHub repository. This is optional in the SDK type, but recommended so Mission Control and the cloud agent have repository context. +* Organization policies allow remote control and viewing sessions from cloud surfaces. + +## Creating a cloud session + +Set the create-session `cloud` option to create a cloud session. You can include repository metadata to associate the cloud session with a GitHub repository. + + + +### TypeScript + +```typescript +import { CopilotClient } from "@github/copilot-sdk"; + +const client = new CopilotClient(); +await client.start(); + +const session = await client.createSession({ + onPermissionRequest: async () => ({ kind: "approve-once" }), + cloud: { + repository: { + owner: "github", + name: "copilot-sdk", + branch: "main", + }, + }, +}); +``` + +### Python + +```python +from copilot import ( + CloudSessionOptions, + CloudSessionRepository, + CopilotClient, + PermissionHandler, +) + +client = CopilotClient() +await client.start() + +session = await client.create_session( + on_permission_request=PermissionHandler.approve_all, + cloud=CloudSessionOptions( + repository=CloudSessionRepository( + owner="github", + name="copilot-sdk", + branch="main", + ) + ), +) +``` + +### Go + + + +```golang +package main + +import ( + "context" + + copilot "github.com/github/copilot-sdk/go" + "github.com/github/copilot-sdk/go/rpc" +) + +func main() { + _ = run(context.Background()) +} + +func run(ctx context.Context) error { + client := copilot.NewClient(nil) + if err := client.Start(ctx); err != nil { + return err + } + + session, err := client.CreateSession(ctx, &copilot.SessionConfig{ + Cloud: &copilot.CloudSessionOptions{ + Repository: &copilot.CloudSessionRepository{ + Owner: "github", + Name: "copilot-sdk", + Branch: "main", + }, + }, + OnPermissionRequest: func(_ copilot.PermissionRequest, _ copilot.PermissionInvocation) (rpc.PermissionDecision, error) { + return &rpc.PermissionDecisionApproveOnce{}, nil + }, + }) + _ = session + return err +} +``` + + + +```golang +client := copilot.NewClient(nil) +if err := client.Start(ctx); err != nil { + return err +} + +session, err := client.CreateSession(ctx, &copilot.SessionConfig{ + Cloud: &copilot.CloudSessionOptions{ + Repository: &copilot.CloudSessionRepository{ + Owner: "github", + Name: "copilot-sdk", + Branch: "main", + }, + }, + OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) { + return &rpc.PermissionDecisionApproveOnce{}, nil + }, +}) +_ = session +``` + +### .NET + +```csharp +await using var client = new CopilotClient(); + +var session = await client.CreateSessionAsync(new SessionConfig +{ + Cloud = new CloudSessionOptions + { + Repository = new CloudSessionRepository + { + Owner = "github", + Name = "copilot-sdk", + Branch = "main", + }, + }, + OnPermissionRequest = (req, inv) => + Task.FromResult(PermissionDecision.ApproveOnce()), +}); +``` + +### Java + +```java +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; + +try (var client = new CopilotClient()) { + client.start().get(); + + var session = client.createSession( + new SessionConfig() + .setCloud(new CloudSessionOptions() + .setRepository(new CloudSessionRepository() + .setOwner("github") + .setName("copilot-sdk") + .setBranch("main"))) + .setOnPermissionRequest(PermissionHandler.APPROVE_ALL) + ).get(); +} +``` + +### Rust + +```rust +use std::sync::Arc; +use github_copilot_sdk::{CloudSessionOptions, CloudSessionRepository, SessionConfig}; +use github_copilot_sdk::handler::ApproveAllHandler; + +let session = client.create_session( + SessionConfig::default() + .with_cloud(CloudSessionOptions::with_repository( + CloudSessionRepository::new("github", "copilot-sdk").with_branch("main"), + )) + .with_permission_handler(Arc::new(ApproveAllHandler)), +).await?; +``` + + + +## Sending the first prompt + +Cloud sessions initialize in two phases: `createSession` resolves as soon as Mission Control has reserved a task, but the remote `copilot-agent` worker takes another second or two to connect and emit `session.start`. If you call `session.send` before that, the runtime's `RemoteSession.send` throws `"Remote session is still starting"` — but the schema wrapper is fire-and-forget and **silently swallows the error** while still returning a fresh `messageId` to your code. The prompt is dropped on the server and never reaches the worker. + +To send reliably, subscribe to events **before** sending and await the first `session.start` event whose `producer` is `"copilot-agent"`: + + + +```typescript +import { CopilotClient, type CopilotSession } from "@github/copilot-sdk"; + +const client = new CopilotClient(); +await client.start(); + +const session: CopilotSession = await client.createSession({ + streaming: true, // required for assistant.message_delta to fire + cloud: { repository: { owner: "github", name: "copilot-sdk" } }, + onPermissionRequest: async () => ({ kind: "approve-once" }), +}); + +// Subscribe BEFORE sending so you don't miss the start event. +const ready = new Promise((resolve) => { + const off = session.on("session.start", (event) => { + if (event.data?.producer === "copilot-agent") { + off(); + resolve(); + } + }); +}); + +await ready; +await session.send({ prompt: "Summarize the README" }); +``` + +A few notes: + +* Set `streaming: true` on `createSession` so the runtime emits `assistant.message_delta` events. Without it, the only assistant signal you get is the final `assistant.message` — fine for batch use, but the chat will look frozen if you're rendering a live UI. See [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/streaming-events). +* Only the **first** `session.send` is sensitive to this race. Subsequent sends on the same session work normally because the runtime keeps `hasSessionStarted` set for the life of the session. +* Apply a timeout (e.g. 60 s) around the `ready` promise so a stuck Mission Control provisioning doesn't hang your app forever. +* The same pattern works in every SDK language — subscribe to `session.start`, check `producer === "copilot-agent"`, then call `send`. + +## Accessing the Mission Control URL + +Cloud sessions are inherently remote: once the worker connects, Mission Control publishes the session at `https://github.com/copilot/tasks/{sessionId}` and the runtime emits a `session.info` event with the URL. You do **not** need to call `remote.enable()` — that API is only for promoting a local session to Mission Control. + +Capture the URL by subscribing to `session.info` and filtering by `infoType: "remote"`: + + + +```typescript +session.on("session.info", (event) => { + if (event.data?.infoType === "remote" && event.data.url) { + console.log("Open from web or mobile:", event.data.url); + // e.g. surface in your UI as a shareable link or QR code. + } +}); +``` + +The event fires shortly after `session.start`. If your renderer mounts after the event has already fired, persist the URL alongside the session record in your app's state and rehydrate on remount — the runtime does not re-emit `session.info` on its own. + +For the same wiring on local sessions promoted via `remote: true`, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/remote-sessions). + +## Repository association + +The `cloud.repository` object associates the cloud session with a GitHub repository: + +| Field | Required | Description | +|-------|----------|-------------| +| `owner` | Yes | Repository owner or organization. | +| `name` | Yes | Repository name. | +| `branch` | No | Branch to use for repository context. Omit it to let the runtime choose the default branch or current repository context. | + +Repository association is optional in the SDK type, but include it whenever your app knows the target repository. It helps Mission Control display the session in the right context and gives the cloud agent a clearer starting point. + +Use `branch` when the work should start from a specific branch. If your app is creating sessions from pull requests, issue triage flows, or deployment workflows, pass the branch that matches the user-visible task. + +## Resuming a cloud session + +The `cloud` option only applies when creating a new session. To resume an existing cloud session, use the standard resume API for the SDK language: + + + +```typescript +import { CopilotClient } from "@github/copilot-sdk"; + +const client = new CopilotClient(); +await client.start(); + +const session = await client.resumeSession("session-id", { + onPermissionRequest: async () => ({ kind: "approve-once" }), +}); +void session; +``` + + + +```typescript +const session = await client.resumeSession("session-id", { + onPermissionRequest: async () => ({ kind: "approve-once" }), +}); +``` + +Do not pass `cloud` again on resume. The saved session metadata determines that the session is cloud-backed, and resume follows the normal session resume path. + +## Org policies and entitlements + +Cloud session creation can fail when the user or organization is not entitled to cloud-agent execution or when organization-level policies block the flow. In particular, policies for cloud sandbox can prevent clients from creating the cloud task. + +When this happens, the runtime reports a `"policy_blocked"` failure reason for cloud task creation. Treat this as an authorization or policy outcome, not as a transient infrastructure failure. + +In TypeScript, check for the reason before retrying: + + + +```typescript +import { + CopilotClient, + type CloudSessionRepository, +} from "@github/copilot-sdk"; + +const client = new CopilotClient(); +await client.start(); + +const repository: CloudSessionRepository = { + owner: "github", + name: "copilot-sdk", +}; + +try { + await client.createSession({ + cloud: { repository }, + onPermissionRequest: async () => ({ kind: "approve-once" }), + }); +} catch (error) { + if ((error as { reason?: string }).reason === "policy_blocked") { + // Show an admin-facing message or link to org policy settings. + } + throw error; +} +``` + + + +```typescript +try { + await client.createSession({ cloud: { repository } }); +} catch (error) { + if ((error as { reason?: string }).reason === "policy_blocked") { + // Show an admin-facing message or link to org policy settings. + } + throw error; +} +``` + +In languages where SDK errors are represented differently, inspect the surfaced error reason or code and handle `"policy_blocked"` explicitly. Retrying without a policy change is not expected to succeed. + +## Integration ID and routing + +Cloud sessions are stamped with a `Copilot-Integration-Id` header derived from the `GITHUB_COPILOT_INTEGRATION_ID` environment variable. This integration ID is used by Mission Control for routing, attribution, and integration-specific behavior. + +For multi-user server guidance and full integration ID details, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy). + +Mission Control routes SDK-created cloud sessions to the `copilot-developer-sandbox` agent slug. The name is an internal routing slug for the cloud agent and does not mean the session uses the local Windows sandbox. + +## Advanced: `COPILOT_MC_BASE_URL` + +By default, the runtime derives the Mission Control base URL from the configured Copilot API URL. Set `COPILOT_MC_BASE_URL` only when you need to override that Mission Control endpoint. + +This may be required for GitHub Enterprise Server deployments. Confirm the correct value and support status with your GitHub representative before relying on it in production. + +```shell +COPILOT_MC_BASE_URL="https://example.com/agents" +``` + +## Cloud sessions vs. remote sessions + +| Capability | Remote sessions | Cloud sessions | +|------------|-----------------|----------------| +| Execution location | Local machine or your server | GitHub-hosted compute | +| Mission Control role | Shares a local session to GitHub web/mobile | Creates and routes the hosted session | +| SDK option | `remote: true` on the client or session | `cloud: { ... }` on create session | +| Resume path | Standard resume | Standard resume | +| Windows sandbox relation | Unrelated | Unrelated | + +Use remote sessions when the session should execute where the SDK runtime is already running, but also be accessible from Mission Control. Use cloud sessions when the session should execute on GitHub-hosted compute. + +## Troubleshooting + +| Symptom | Likely cause | What to check | +|---------|--------------|---------------| +| Cloud session creation returns `"policy_blocked"` | Organization policy blocks remote control or view from cloud flows | Check org Copilot policies and user entitlement | +| Session creates without repository context | `cloud.repository` was omitted | Pass `owner`, `name`, and optionally `branch` | +| Resume ignores a new `cloud` option | `cloud` only applies to new sessions | Resume the existing session normally | +| Confusion with sandbox settings | Windows sandbox and cloud sessions are separate | Do not use `SANDBOX=true` for cloud execution | +| `session.send` resolves with a `messageId` but no `assistant.*` events fire and Mission Control shows no prompt | The session.send raced ahead of `session.start` from the remote worker; the runtime swallowed the prompt | Await the first `session.start` event with `producer === "copilot-agent"` before sending. See [Sending the first prompt](#sending-the-first-prompt) | +| Live UI never updates even though the cloud worker is processing | `streaming` was not set on `createSession`, so only the final `assistant.message` is emitted | Set `streaming: true` on `createSession` and re-launch | +| Cloud session works but no shareable URL appears in your UI | App never subscribed to `session.info` for the URL | Subscribe to `session.info` and filter `infoType === "remote"`. See [Accessing the Mission Control URL](#accessing-the-mission-control-url) | + +## See also + +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/remote-sessions): share locally hosted sessions through Mission Control +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/streaming-events): subscribe to `assistant.*` deltas for live UI rendering +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy): integration IDs and server deployment patterns +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/auth): configure GitHub authentication for SDK sessions diff --git a/content/copilot/how-tos/copilot-sdk/features/custom-agents.md b/content/copilot/how-tos/copilot-sdk/features/custom-agents.md index 882b08f8915d..d93076614715 100644 --- a/content/copilot/how-tos/copilot-sdk/features/custom-agents.md +++ b/content/copilot/how-tos/copilot-sdk/features/custom-agents.md @@ -3,7 +3,7 @@ title: Custom agents and sub-agent orchestration shortTitle: Custom Agents intro: >- Define specialized agents with scoped tools and prompts, then let Copilot - orchestrate them as sub-agents within a single session. + orchestrate them as sub-agents within a single session. versions: fpt: '*' ghec: '*' @@ -205,9 +205,8 @@ await using var session = await client.CreateSessionAsync(new SessionConfig {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; try (var client = new CopilotClient()) { @@ -380,7 +379,7 @@ var session = await client.CreateSessionAsync(new SessionConfig ```java -import com.github.copilot.sdk.json.*; +import com.github.copilot.rpc.*; import java.util.List; var session = client.createSession( @@ -638,6 +637,8 @@ await session.SendAndWaitAsync(new MessageOptions {% endcodetab %} {% codetab java %} + + ```java session.on(event -> { if (event instanceof SubagentStartedEvent e) { diff --git a/content/copilot/how-tos/copilot-sdk/features/fleet-mode.md b/content/copilot/how-tos/copilot-sdk/features/fleet-mode.md new file mode 100644 index 000000000000..817959982f40 --- /dev/null +++ b/content/copilot/how-tos/copilot-sdk/features/fleet-mode.md @@ -0,0 +1,346 @@ +--- +title: Fleet mode +shortTitle: Fleet Mode +intro: >- + Use fleet mode to split work across multiple sub-agents and combine their + results in one parent session. +versions: + fpt: '*' + ghec: '*' +contentType: how-tos +--- + + + + +## When to use fleet mode + +Fleet mode is useful when the work can be decomposed before execution and each unit can run without waiting for the others. + +Good fits include: + +* Multi-file refactors where each worker owns a file, package, or language SDK. +* Batch reviews where each worker checks a separate diff, module, or alert group. +* Parallel research across independent repositories, services, or feature areas. +* Documentation refreshes where each worker owns a page or topic. +* Migration tasks where each worker can validate its own slice and report back. + +Avoid fleet mode for: + +* Sequential tasks where step 2 needs the concrete output from step 1. +* Tightly coupled edits where workers would contend for the same files. +* Small tasks that one synchronous sub-agent or the parent agent can finish quickly. +* Tasks that require continuous shared reasoning rather than clear ownership. + +Fleet mode works best when the parent session can create clear units of work, assign one owner per unit, and define what each worker must return. + +## Starting fleet mode + +The SDK exposes fleet mode through the session RPC namespace in several languages. The binding is experimental in the generated RPC surface; pin both the SDK and the Copilot CLI runtime if your application depends on it. + +### From within a session + +The wire method is `session.fleet.start`. The optional `prompt` is combined with the runtime's fleet orchestration instructions. + +{% codetabs %} +{% codetab typescript %} + +```typescript +const result = await session.rpc.fleet.start({ + prompt: "Refactor each SDK package independently, then summarize the changes.", +}); + +if (result.started) { + console.log("Fleet mode started"); +} +``` + +{% endcodetab %} +{% codetab python %} + +```python +from copilot.generated.rpc import FleetStartRequest + +result = await session.rpc.fleet.start( + FleetStartRequest( + prompt="Review each service independently, then summarize the risks." + ) +) + +if result.started: + print("Fleet mode started") +``` + +{% endcodetab %} +{% codetab go %} + +```golang +package main + +import ( + "context" + "fmt" + + copilot "github.com/github/copilot-sdk/go" + "github.com/github/copilot-sdk/go/rpc" +) + +func main() { + ctx := context.Background() + client := copilot.NewClient(nil) + session, err := client.CreateSession(ctx, &copilot.SessionConfig{}) + if err != nil { + return + } + + prompt := "Update each package independently, then report validation results." + result, err := session.RPC.Fleet.Start(ctx, &rpc.FleetStartRequest{ + Prompt: &prompt, + }) + if err != nil { + return + } + if result.Started { + fmt.Println("Fleet mode started") + } +} +``` + +```golang +prompt := "Update each package independently, then report validation results." +result, err := session.RPC.Fleet.Start(ctx, &rpc.FleetStartRequest{ + Prompt: &prompt, +}) +if err != nil { + return err +} +if result.Started { + fmt.Println("Fleet mode started") +} +``` + +{% endcodetab %} +{% codetab dotnet %} + +```csharp +using GitHub.Copilot; + +await using var client = new CopilotClient(); +await using var session = await client.CreateSessionAsync(new SessionConfig()); + +var result = await session.Rpc.Fleet.StartAsync( + "Audit each project independently, then summarize the findings."); + +if (result.Started) +{ + Console.WriteLine("Fleet mode started"); +} +``` + +```csharp +var result = await session.Rpc.Fleet.StartAsync( + "Audit each project independently, then summarize the findings."); + +if (result.Started) +{ + Console.WriteLine("Fleet mode started"); +} +``` + +{% endcodetab %} +{% codetab rust %} + +```rust +use github_copilot_sdk::generated::api_types::FleetStartRequest; + +let result = session + .rpc() + .fleet() + .start(FleetStartRequest { + prompt: Some("Research each crate independently, then summarize the plan.".into()), + }) + .await?; + +if result.started { + println!("Fleet mode started"); +} +``` + +{% endcodetab %} +{% endcodetabs %} + +Native typed bindings for fleet mode were verified in Node.js/TypeScript, Python, Go, .NET, and Rust. A Java binding was not found in `java/src/main/java` on this branch, so Java examples are omitted until that surface is available. + +### From plan mode + +Plan-mode UIs can start fleet deployment by returning the `autopilot_fleet` exit action. The generated session event types describe it as: + +```typescript +type PlanModeExitAction = + | "exit_only" + | "interactive" + | "autopilot" + /** Exit plan mode and continue with parallel autonomous workers. */ + | "autopilot_fleet"; +``` + +Use this when a user approves a plan that already contains independent work items. Use `autopilot` for a single autonomous worker and `interactive` when the user should stay in the loop. + +## How sub-agents coordinate + +Fleet mode relies on explicit coordination state instead of implicit shared memory. The parent agent decomposes the work into todos, each sub-agent owns one todo, and the orchestrator dispatches workers whose dependencies are already complete. + +The canonical schema is: + +```sql +CREATE TABLE todos ( + id TEXT PRIMARY KEY, + title TEXT NOT NULL, + description TEXT, + status TEXT DEFAULT 'pending' +); + +CREATE TABLE todo_deps ( + todo_id TEXT, + depends_on TEXT, + PRIMARY KEY (todo_id, depends_on) +); +``` + +Each todo moves through a small state machine: + +```text +pending -> in_progress -> done + \-> blocked +``` + +A sub-agent should: + +1. Claim exactly one ready todo by setting `status = 'in_progress'`. +1. Work only on that todo's scope. +1. Store its result in the conversation or relevant task output. +1. Set `status = 'done'` when complete. +1. Set `status = 'blocked'` when it cannot proceed, and include the reason. + +The orchestrator can find work whose dependencies are satisfied with a query like: + +```sql +SELECT t.* +FROM todos t +WHERE t.status = 'pending' + AND NOT EXISTS ( + SELECT 1 + FROM todo_deps td + JOIN todos dep ON td.depends_on = dep.id + WHERE td.todo_id = t.id + AND dep.status != 'done' + ); +``` + +This pattern gives every worker a clear owner and lets the parent session reason about what is ready, running, complete, or blocked. + +## Lifecycle hooks + +Fleet mode invokes sub-agents through the runtime's task mechanism. The runtime emits hook activity for sub-agent tool calls: the runtime 1.0.52 changelog notes that `preToolUse`, `postToolUse`, `subagentStart`, and `subagentStop` fire correctly for sub-agent tool calls. + +A dedicated SDK hook callback for `subagentStart` or `subagentStop` was not found in the public SDK surface on this branch. SDK consumers can observe sub-agent activity through the generic session event stream, which includes events such as `subagent.started`, `subagent.completed`, `subagent.failed`, `subagent.selected`, and `subagent.deselected`. + +{% codetabs %} +{% codetab typescript %} + +```typescript +session.on((event) => { + if (event.type === "subagent.started") { + console.log(`Started ${event.data.agentDisplayName}`); + } + + if (event.type === "subagent.completed") { + console.log(`Completed ${event.data.agentDisplayName}`); + } +}); +``` + +{% endcodetab %} +{% codetab python %} + +```python +import asyncio +from copilot import CopilotClient +from copilot.session import PermissionHandler + +async def main(): + client = CopilotClient() + await client.start() + session = await client.create_session( + on_permission_request=PermissionHandler.approve_all, + ) + + def handle_event(event): + if event.type == "subagent.started": + print(f"Started {event.data.agent_display_name}") + elif event.type == "subagent.completed": + print(f"Completed {event.data.agent_display_name}") + + unsubscribe = session.on(handle_event) + +asyncio.run(main()) +``` + +```python +def handle_event(event): + if event.type == "subagent.started": + print(f"Started {event.data.agent_display_name}") + elif event.type == "subagent.completed": + print(f"Completed {event.data.agent_display_name}") + +unsubscribe = session.on(handle_event) +``` + +{% endcodetab %} +{% endcodetabs %} + +For hook configuration that is already exposed at the SDK layer, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/hooks). For sub-agent event payloads, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/custom-agents). + +## Plugin sub-agents + +The runtime can load plugins with `--plugin-dir`. Plugins loaded this way can register their agents as available `task(agent_type=...)` sub-agent types in prompt mode, which means fleet mode can dispatch to those plugin-provided worker types. + +This is currently a runtime-level configuration pattern rather than a documented SDK-level registration API. Configure the Copilot CLI runtime with the plugin directory, then connect the SDK client to that runtime. Native SDK helpers for registering plugin sub-agent types may be added in the future. + +Conceptually, a fleet prompt can then ask for a specific worker type: + +```text +Use task(agent_type="security-review") for each independent package. +Run the workers in parallel and summarize only high-confidence findings. +``` + +Keep plugin-provided sub-agent types narrow and descriptive so the orchestrator can choose them reliably. + +## Best practices + +* Decompose the work into independent units before starting fleet mode. +* Minimize dependencies between todos; dependencies reduce parallelism. +* Give each todo a durable ID, a clear title, and a complete description. +* Make each sub-agent own exactly one todo at a time. +* Use background sub-agents for truly parallel work. +* Use synchronous sub-agent calls for serialized steps or validation gates. +* Provide each sub-agent with complete context; sub-agents are stateless across calls. +* Include file paths, commands, expected outputs, and constraints in each worker prompt. +* Do not dispatch a single background sub-agent; prefer a synchronous call or batch multiple workers in parallel. +* Avoid assigning overlapping files to different workers unless the parent agent will reconcile conflicts explicitly. +* Require every worker to report what it changed, how it validated the change, and what remains blocked. +* Have the parent agent verify the combined result after workers finish. + +## Limitations and open questions + +* Fleet mode is exposed through generated session RPC bindings and is marked experimental in several SDKs. +* The SQL todos pattern is the canonical coordination model in the runtime guidance, but whether it is a stable extensibility contract for SDK consumers is still an open question. +* `subagentStart` and `subagentStop` are runtime hook names; this branch exposes sub-agent lifecycle to SDK consumers through the generic session event stream, not dedicated hook callbacks. +* Plugin sub-agent registration is configured at the runtime layer through `--plugin-dir`; no SDK-level plugin registration helper was verified on this branch. +* Java native typed bindings for `session.fleet.start` were not found in the Java SDK source on this branch. +* Fleet mode does not remove the need for parent-agent review. Parallel workers can produce inconsistent assumptions that the orchestrator must reconcile. + +## See also + +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/custom-agents) +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/hooks) diff --git a/content/copilot/how-tos/copilot-sdk/features/hooks.md b/content/copilot/how-tos/copilot-sdk/features/hooks.md index e124ea5c8459..1e15f414f7cc 100644 --- a/content/copilot/how-tos/copilot-sdk/features/hooks.md +++ b/content/copilot/how-tos/copilot-sdk/features/hooks.md @@ -203,9 +203,8 @@ var session = await client.CreateSessionAsync(new SessionConfig {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.concurrent.CompletableFuture; try (var client = new CopilotClient()) { @@ -408,14 +407,16 @@ var session = await client.CreateSessionAsync(new SessionConfig {% endcodetab %} {% codetab java %} + + ```java import java.util.Set; import java.util.concurrent.CompletableFuture; -import com.github.copilot.sdk.PermissionHandler; -import com.github.copilot.sdk.SessionConfig; -import com.github.copilot.sdk.SessionHooks; -import com.github.copilot.sdk.json.PreToolUseHookOutput; +import com.github.copilot.rpc.PermissionHandler; +import com.github.copilot.rpc.SessionConfig; +import com.github.copilot.rpc.SessionHooks; +import com.github.copilot.rpc.PreToolUseHookOutput; var readOnlyTools = Set.of("read_file", "glob", "grep", "view"); var hooks = new SessionHooks() diff --git a/content/copilot/how-tos/copilot-sdk/features/image-input.md b/content/copilot/how-tos/copilot-sdk/features/image-input.md index 7ca964146ccb..5f95fc5db566 100644 --- a/content/copilot/how-tos/copilot-sdk/features/image-input.md +++ b/content/copilot/how-tos/copilot-sdk/features/image-input.md @@ -112,7 +112,7 @@ func main() { session.Send(ctx, copilot.MessageOptions{ Prompt: "Describe what you see in this image", Attachments: []copilot.Attachment{ - &copilot.UserMessageAttachmentFile{ + &copilot.AttachmentFile{ DisplayName: "screenshot.png", Path: path, }, @@ -137,7 +137,7 @@ path := "/absolute/path/to/screenshot.png" session.Send(ctx, copilot.MessageOptions{ Prompt: "Describe what you see in this image", Attachments: []copilot.Attachment{ - &copilot.UserMessageAttachmentFile{ + &copilot.AttachmentFile{ DisplayName: "screenshot.png", Path: path, }, @@ -167,9 +167,9 @@ public static class ImageInputExample await session.SendAsync(new MessageOptions { Prompt = "Describe what you see in this image", - Attachments = new List + Attachments = new List { - new UserMessageAttachmentFile + new AttachmentFile { Path = "/absolute/path/to/screenshot.png", DisplayName = "screenshot.png", @@ -195,9 +195,9 @@ await using var session = await client.CreateSessionAsync(new SessionConfig await session.SendAsync(new MessageOptions { Prompt = "Describe what you see in this image", - Attachments = new List + Attachments = new List { - new UserMessageAttachmentFile + new AttachmentFile { Path = "/absolute/path/to/screenshot.png", DisplayName = "screenshot.png", @@ -210,9 +210,8 @@ await session.SendAsync(new MessageOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; try (var client = new CopilotClient()) { @@ -326,7 +325,7 @@ func main() { session.Send(ctx, copilot.MessageOptions{ Prompt: "Describe what you see in this image", Attachments: []copilot.Attachment{ - &copilot.UserMessageAttachmentBlob{ + &copilot.AttachmentBlob{ Data: base64ImageData, MIMEType: mimeType, DisplayName: &displayName, @@ -342,7 +341,7 @@ displayName := "screenshot.png" session.Send(ctx, copilot.MessageOptions{ Prompt: "Describe what you see in this image", Attachments: []copilot.Attachment{ - &copilot.UserMessageAttachmentBlob{ + &copilot.AttachmentBlob{ Data: base64ImageData, // base64-encoded string MIMEType: mimeType, DisplayName: &displayName, @@ -374,9 +373,9 @@ public static class BlobAttachmentExample await session.SendAsync(new MessageOptions { Prompt = "Describe what you see in this image", - Attachments = new List + Attachments = new List { - new UserMessageAttachmentBlob + new AttachmentBlob { Data = base64ImageData, MimeType = "image/png", @@ -392,9 +391,9 @@ public static class BlobAttachmentExample await session.SendAsync(new MessageOptions { Prompt = "Describe what you see in this image", - Attachments = new List + Attachments = new List { - new UserMessageAttachmentBlob + new AttachmentBlob { Data = base64ImageData, MimeType = "image/png", @@ -408,9 +407,8 @@ await session.SendAsync(new MessageOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; try (var client = new CopilotClient()) { diff --git a/content/copilot/how-tos/copilot-sdk/features/index.md b/content/copilot/how-tos/copilot-sdk/features/index.md index 859367e45e68..4e5d83814a03 100644 --- a/content/copilot/how-tos/copilot-sdk/features/index.md +++ b/content/copilot/how-tos/copilot-sdk/features/index.md @@ -12,10 +12,13 @@ redirect_from: contentType: how-tos children: - /agent-loop + - /cloud-sessions - /custom-agents + - /fleet-mode - /hooks - /image-input - /mcp + - /plugin-directories - /remote-sessions - /session-persistence - /skills diff --git a/content/copilot/how-tos/copilot-sdk/features/plugin-directories.md b/content/copilot/how-tos/copilot-sdk/features/plugin-directories.md new file mode 100644 index 000000000000..f66586d55a10 --- /dev/null +++ b/content/copilot/how-tos/copilot-sdk/features/plugin-directories.md @@ -0,0 +1,357 @@ +--- +title: Plugin directories +shortTitle: Plugin Directories +intro: >- + Use plugin directories to load skills, hooks, MCP servers, custom agents, and + LSP settings from a single manifest. +versions: + fpt: '*' + ghec: '*' +contentType: how-tos +--- + + + + +This guide explains the plugin folder layout, how to load a plugin from a directory, when to use plugin directories vs. registering individual extensions, and how to make plugin sets deterministic. + +## When to use plugin directories + +Use a plugin directory when you want to: + +* **Distribute a bundle of capabilities** as one unit — e.g., a "TypeScript reviewer" pack with a skill, a `preToolUse` hook that enforces lint, and a custom agent that runs the reviewer. +* **Vendor capability packs into a repository** so every clone of the host application loads the same extensions deterministically. +* **Develop a plugin locally** before publishing it to a marketplace. +* **Override or extend** a marketplace-installed plugin with a local checkout for testing. + +If you only need to add a single MCP server, a single hook, or a single custom agent, you can register it inline via the SDK config (`mcpServers`, `hooks`, `customAgents`). Plugin directories are most useful once you have three or more related extensions that ship together. + +## Plugin folder layout + +The Copilot CLI scans each plugin directory for a `plugin.json` manifest or a root-level `SKILL.md`. A minimal plugin looks like this: + +```text +my-plugin/ +├── plugin.json # manifest (required unless using SKILL.md only) +├── SKILL.md # optional: top-level skill +├── hooks.json # optional: hooks config +├── .mcp.json # optional: MCP server config +├── agents/ # optional: custom agents (one .md file per agent) +│ └── code-reviewer.md +└── skills/ # optional: additional skills + └── lint-fix/ + └── SKILL.md +``` + +The manifest may also live at `.github/plugin.json` or `.github/plugin/plugin.json` so plugins can sit inside an existing repository without changing its root layout. Each subsystem (hooks, MCP, LSP, skills, agents) has its own loader and is optional — a plugin only needs the parts it contributes. + +For the full manifest schema, see the runtime documentation referenced from your CLI's `/plugin` slash command. + +## Loading a plugin directory from the SDK + +Plugin directories are loaded by passing `--plugin-dir ` to the Copilot CLI when the SDK spawns it. Each language exposes this through the runtime connection's extra-args option. The flag can be repeated to load multiple plugins. + +{% codetabs %} +{% codetab typescript %} + +```typescript +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; + +async function main() { + const client = new CopilotClient({ + connection: RuntimeConnection.forStdio({ + args: [ + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + ], + }), + }); + + await client.start(); +} + +main(); +``` + +```typescript +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; + +const client = new CopilotClient({ + connection: RuntimeConnection.forStdio({ + args: [ + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + ], + }), +}); + +await client.start(); +``` + +{% endcodetab %} +{% codetab python %} + + + +```python +from copilot import CopilotClient, StdioRuntimeConnection + +client = CopilotClient( + connection=StdioRuntimeConnection( + args=( + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + ), + ), +) +await client.start() +``` + +{% endcodetab %} +{% codetab go %} + +```golang +package main + +import ( + "context" + + copilot "github.com/github/copilot-sdk/go" +) + +func main() { + ctx := context.Background() + client := copilot.NewClient(&copilot.ClientOptions{ + Connection: copilot.StdioConnection{ + Args: []string{ + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + }, + }, + }) + if err := client.Start(ctx); err != nil { + return + } +} +``` + +```golang +client := copilot.NewClient(&copilot.ClientOptions{ + Connection: copilot.StdioConnection{ + Args: []string{ + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + }, + }, +}) +if err := client.Start(ctx); err != nil { + return err +} +``` + +{% endcodetab %} +{% codetab dotnet %} + +```csharp +using GitHub.Copilot; + +await using var client = new CopilotClient(new CopilotClientOptions +{ + Connection = RuntimeConnection.ForStdio(args: new[] + { + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + }), +}); + +await client.StartAsync(); +``` + +{% endcodetab %} +{% codetab java %} + +```java +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.CopilotClientOptions; + +public class PluginDirectoriesExample { + public static void main(String[] args) throws Exception { + var options = new CopilotClientOptions() + .setCliArgs(new String[] { + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + }); + + var client = new CopilotClient(options); + client.start().get(); + } +} +``` + +```java +var options = new CopilotClientOptions() + .setCliArgs(new String[] { + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + }); + +var client = new CopilotClient(options); +client.start().get(); +``` + +{% endcodetab %} +{% codetab rust %} + +```rust +use github_copilot_sdk::{Client, ClientOptions}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let _client = Client::start( + ClientOptions::new().with_extra_args([ + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + ]), + ) + .await?; + Ok(()) +} +``` + +```rust +use github_copilot_sdk::{Client, ClientOptions}; + +let client = Client::start( + ClientOptions::new().with_extra_args([ + "--plugin-dir", "./plugins/code-reviewer", + "--plugin-dir", "./plugins/lint-fix", + ]), +) +.await?; +``` + +{% endcodetab %} +{% endcodetabs %} + +> The example above uses an stdio runtime connection — the default when the SDK bundles the CLI. If you connect to an external runtime via a URL (`forUri` / `ForUri`), pass `--plugin-dir` to the long-running CLI server when you start it; the SDK does not forward `--plugin-dir` to runtimes it didn't spawn. + +## What a plugin can contribute + +Loading a plugin directory makes its extensions visible to every session created by the client. The runtime merges plugin-provided extensions with anything you register inline: + +| Plugin contributes | Visible to session as | +|---|---| +| Skills (`SKILL.md`, `skills/*/SKILL.md`) | Items in `session.skills.list()`; injectable by name | +| Custom agents (`agents/*.md`) | Dispatchable via the `task(agent_type=...)` tool | +| Hooks (`hooks.json`) | Fired alongside hooks registered via the SDK | +| MCP servers (`.mcp.json`) | Tools and resources reachable through `session.mcp.*` | +| LSP servers (`.lsp.json`) | Initialized via `session.lsp.initialize(...)` | + +Plugin agents are first-class sub-agents in [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/fleet-mode): a parent agent can dispatch them by `agent_type`, and the runtime fires the `subagentStart` / `subagentStop` hooks for them like any other sub-agent. + +## Plugin-dir vs marketplace plugins + +The runtime has two ways to install plugins, and both end up looking the same to a session: + +* **Marketplace / direct-repo plugins** are installed persistently through the CLI's `/plugin` slash command or the underlying `installedPlugins` user setting. They are *ambient* — every session that runs against the same user config sees them, and they participate in plugin discovery rules. +* **`--plugin-dir` plugins** are *explicit and ephemeral* — they only apply to the CLI process you launched with that flag. They take precedence over ambient discovery and are de-duplicated against marketplace entries with the same cache path, so the same plugin won't load twice when both surfaces reference it. + +For SDK-driven applications, `--plugin-dir` is usually the right choice: it keeps the plugin set under your application's control instead of depending on per-machine user state. + +## Making plugin sets deterministic + +When the host machine may have other plugins installed (marketplace or personal), set `COPILOT_PLUGIN_DIR_ONLY=true` in the runtime's environment to suppress automatic plugin discovery. Only the directories you pass via `--plugin-dir` will load. + +

+Node.js / TypeScript + + + +```typescript +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; + +async function main() { + process.env.COPILOT_PLUGIN_DIR_ONLY = "true"; + const client = new CopilotClient({ + connection: RuntimeConnection.forStdio({ + args: ["--plugin-dir", "./plugins/code-reviewer"], + }), + }); + await client.start(); +} + +main(); +``` + + + +```typescript +process.env.COPILOT_PLUGIN_DIR_ONLY = "true"; + +const client = new CopilotClient({ + connection: RuntimeConnection.forStdio({ + args: ["--plugin-dir", "./plugins/code-reviewer"], + }), +}); +await client.start(); +``` + +
+ +Use this in CI, in headless server deployments, and anywhere you want a reproducible plugin set that doesn't depend on the host's user configuration. + +## Inspecting which plugins loaded + +Once a session is created, list the active plugins to confirm a directory was picked up correctly: + +
+Node.js / TypeScript + + + +```typescript +import { CopilotClient } from "@github/copilot-sdk"; + +async function main() { + const client = new CopilotClient(); + await client.start(); + const session = await client.createSession({ + onPermissionRequest: async () => ({ kind: "approve-once" }), + }); + + const plugins = await session.rpc.plugins.list(); + for (const plugin of plugins.plugins) { + console.log(`${plugin.name} (${plugin.enabled ? "enabled" : "disabled"})`); + } +} + +main(); +``` + + + +```typescript +const plugins = await session.rpc.plugins.list(); +for (const plugin of plugins.plugins) { + console.log(`${plugin.name} (${plugin.enabled ? "enabled" : "disabled"})`); +} +``` + +
+ +Plugins loaded via `--plugin-dir` appear in this list with their cache path set to the directory you provided. Marketplace installs are tagged with their registry source. + +## Troubleshooting + +* **"no plugin.json or SKILL.md found in <dir>"** — the directory exists but doesn't qualify as a plugin. Add a `plugin.json` manifest at the root (or under `.github/`), or include a top-level `SKILL.md`. +* **Plugin loaded but agents/skills not visible** — make sure the plugin manifest declares the agents/skills it contributes, or use the implicit layout (`agents/*.md`, `skills/*/SKILL.md`). Then call `session.rpc.skills.reload()` to pick up changes without restarting. +* **Duplicate hooks firing** — the runtime de-duplicates by `cache_path`, but only when the same directory is referenced both as a marketplace install and a `--plugin-dir`. If two different directories contain the same plugin, both will load. Remove one or use `COPILOT_PLUGIN_DIR_ONLY=true`. +* **`--plugin-dir` ignored when connecting to an external runtime** — the SDK only forwards extra args when it spawns the CLI itself. For external runtimes (`forUri`/`ForUri`), pass `--plugin-dir` on the command line that starts the runtime server. + +## Related + +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/custom-agents): write agents that ship inside a plugin's `agents/` folder. +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/skills): how `SKILL.md` files are loaded, and the skill-tier ordering rules. +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/hooks): hooks defined by a plugin fire alongside SDK-registered hooks. +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/mcp): plugin-provided MCP servers integrate the same way as inline registrations. +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/fleet-mode): plugin-provided agents are dispatchable as sub-agents. diff --git a/content/copilot/how-tos/copilot-sdk/features/remote-sessions.md b/content/copilot/how-tos/copilot-sdk/features/remote-sessions.md index 1a3e6a6f4b42..d2b32e692c9c 100644 --- a/content/copilot/how-tos/copilot-sdk/features/remote-sessions.md +++ b/content/copilot/how-tos/copilot-sdk/features/remote-sessions.md @@ -17,6 +17,8 @@ contentType: how-tos +For running sessions on GitHub-hosted compute, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/cloud-sessions). + ## Prerequisites * The user must be authenticated (GitHub token or logged-in user) @@ -140,97 +142,6 @@ while let Ok(event) = events.recv().await { -### Cloud sessions - -Set the create-session `cloud` option to create a remote session in the cloud instead of a local session. You can include repository metadata to associate the cloud session with a GitHub repository. - - - -#### TypeScript - - - -```typescript -const session = await client.createSession({ - onPermissionRequest: async () => ({ allowed: true }), - cloud: { - repository: { owner: "github", name: "copilot-sdk", branch: "main" }, - }, -}); -``` - -#### Python - - - -```python -from copilot import CloudSessionOptions, CloudSessionRepository - -session = await client.create_session( - on_permission_request=PermissionHandler.approve_all, - cloud=CloudSessionOptions( - repository=CloudSessionRepository( - owner="github", - name="copilot-sdk", - branch="main", - ) - ), -) -``` - -#### Go - - - -```golang -session, err := client.CreateSession(ctx, &copilot.SessionConfig{ - Cloud: &copilot.CloudSessionOptions{ - Repository: &copilot.CloudSessionRepository{ - Owner: "github", - Name: "copilot-sdk", - Branch: "main", - }, - }, -}) -``` - -#### C# - - - -```csharp -var session = await client.CreateSessionAsync(new SessionConfig -{ - Cloud = new CloudSessionOptions - { - Repository = new CloudSessionRepository - { - Owner = "github", - Name = "copilot-sdk", - Branch = "main" - } - } -}); -``` - -#### Rust - - - -```rust -use github_copilot_sdk::{CloudSessionOptions, CloudSessionRepository, SessionConfig}; - -let session = client.create_session( - SessionConfig::default().with_cloud( - CloudSessionOptions::with_repository( - CloudSessionRepository::new("github", "copilot-sdk").with_branch("main"), - ), - ), -).await?; -``` - - - ### On-demand (per-session toggle) Use `session.rpc.remote.enable()` to start remote access mid-session, and `session.rpc.remote.disable()` to stop it. This is equivalent to the CLI's `/remote on` and `/remote off` commands. @@ -316,6 +227,5 @@ The remote URL can be rendered as a QR code for easy mobile access. The SDK prov ## Notes * The `remote` client option only applies when the SDK spawns the CLI process. It is ignored when connecting to an external server via `cliUrl`. -* The `cloud` session option applies only to new sessions created with `session.create`; it is not used when resuming an existing session. * If the working directory is not a GitHub repository, remote setup is silently skipped (always-on mode) or returns an error (on-demand mode). * Remote sessions require authentication. Ensure `gitHubToken` or `useLoggedInUser` is configured. diff --git a/content/copilot/how-tos/copilot-sdk/features/skills.md b/content/copilot/how-tos/copilot-sdk/features/skills.md index ac9c6ed77f10..3e2fd99814d4 100644 --- a/content/copilot/how-tos/copilot-sdk/features/skills.md +++ b/content/copilot/how-tos/copilot-sdk/features/skills.md @@ -151,9 +151,8 @@ await session.SendAndWaitAsync(new MessageOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; try (var client = new CopilotClient()) { @@ -275,8 +274,10 @@ var session = await client.CreateSessionAsync(new SessionConfig {% endcodetab %} {% codetab java %} + + ```java -import com.github.copilot.sdk.json.*; +import com.github.copilot.rpc.*; import java.util.List; var session = client.createSession( diff --git a/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md b/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md index 428c139d7682..85ef4660148e 100644 --- a/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md +++ b/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md @@ -169,9 +169,8 @@ await session.SendAsync(new MessageOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; try (var client = new CopilotClient()) { client.start().get(); @@ -402,9 +401,8 @@ await session.SendAsync(new MessageOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; try (var client = new CopilotClient()) { client.start().get(); diff --git a/content/copilot/how-tos/copilot-sdk/features/streaming-events.md b/content/copilot/how-tos/copilot-sdk/features/streaming-events.md index 021533bd18ac..202b768e05a6 100644 --- a/content/copilot/how-tos/copilot-sdk/features/streaming-events.md +++ b/content/copilot/how-tos/copilot-sdk/features/streaming-events.md @@ -164,6 +164,8 @@ session.On(evt => {% endcodetab %} {% codetab java %} + + ```java // All events session.on(event -> System.out.println(event.getType())); @@ -284,6 +286,7 @@ Ephemeral. Token usage and cost information for an individual API call. | `duration` | `number` | | API call duration in milliseconds | | `initiator` | `string` | | What triggered this call (e.g., `"sub-agent"`); absent for user-initiated | | `apiCallId` | `string` | | Completion ID from the provider (e.g., `chatcmpl-abc123`) | +| `apiEndpoint` | `"/chat/completions" \| "/v1/messages" \| "/responses" \| "ws:/responses"` | | API endpoint used for the model call; useful for observability and cost attribution. `ws:/responses` is the websocket variant of the responses API | | `providerCallId` | `string` | | GitHub request tracing ID (`x-github-request-id`) | | `parentToolCallId` | `string` | | Set when usage originates from a sub-agent | | `quotaSnapshots` | `Record` | | Per-quota resource usage, keyed by quota identifier | @@ -728,7 +731,7 @@ session.idle → Ready for next message (ephemeral) | `assistant.message` | | Assistant | `messageId`, `content`, `toolRequests?`, `outputTokens?`, `phase?` | | `assistant.message_delta` | ✅ | Assistant | `messageId`, `deltaContent`, `parentToolCallId?` | | `assistant.turn_end` | | Assistant | `turnId` | -| `assistant.usage` | ✅ | Assistant | `model`, `inputTokens?`, `outputTokens?`, `cost?`, `duration?` | +| `assistant.usage` | ✅ | Assistant | `model`, `apiEndpoint?`, `inputTokens?`, `outputTokens?`, `cost?`, `duration?` | | `tool.user_requested` | | Tool | `toolCallId`, `toolName`, `arguments?` | | `tool.execution_start` | | Tool | `toolCallId`, `toolName`, `arguments?`, `mcpServerName?` | | `tool.execution_partial_result` | ✅ | Tool | `toolCallId`, `partialOutput` | diff --git a/content/copilot/how-tos/copilot-sdk/getting-started.md b/content/copilot/how-tos/copilot-sdk/getting-started.md index 917db8fa4aa6..f226f43ae757 100644 --- a/content/copilot/how-tos/copilot-sdk/getting-started.md +++ b/content/copilot/how-tos/copilot-sdk/getting-started.md @@ -32,7 +32,7 @@ Copilot: In Tokyo it's 75°F and sunny. Great day to be outside! Before you begin, make sure you have: -* **GitHub Copilot CLI** installed and authenticated ([Installation guide](/copilot/how-tos/set-up/install-copilot-cli)) +* **GitHub Copilot CLI** installed and authenticated (the Node.js, Python, and .NET SDKs bundle the CLI automatically—see [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/bundled-cli). Required for Go, Java, and Rust unless using their application-level CLI bundling features.) * Your preferred language runtime: * **Node.js** 20+ or **Python** 3.11+ or **Go** 1.24+ or **Rust** 1.94+ or **Java** 17+ or **.NET** 8.0+ @@ -263,7 +263,7 @@ use github_copilot_sdk::{Client, ClientOptions, MessageOptions, SessionConfig}; async fn main() -> Result<(), Box> { let client = Client::start(ClientOptions::default()).await?; let session = client - .create_session(SessionConfig::default().with_handler(Arc::new(ApproveAllHandler))) + .create_session(SessionConfig::default().with_permission_handler(Arc::new(ApproveAllHandler))) .await?; let response = session @@ -320,10 +320,11 @@ dotnet run Create `HelloCopilot.java`: + + ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; public class HelloCopilot { public static void main(String[] args) throws Exception { @@ -504,7 +505,7 @@ async fn main() -> Result<(), Box> { let mut config = SessionConfig::default(); config.streaming = Some(true); let session = client - .create_session(config.with_handler(Arc::new(ApproveAllHandler))) + .create_session(config.with_permission_handler(Arc::new(ApproveAllHandler))) .await?; // Listen for response chunks @@ -576,10 +577,11 @@ await session.SendAndWaitAsync(new MessageOptions { Prompt = "Tell me a short jo Update `HelloCopilot.java`: + + ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; public class HelloCopilot { public static void main(String[] args) throws Exception { @@ -827,6 +829,8 @@ unsubscribe.Dispose(); {% endcodetab %} {% codetab java %} + + ```java // Subscribe to all events var unsubscribe = session.on(event -> { @@ -1051,7 +1055,7 @@ use std::sync::Arc; use std::time::Duration; use github_copilot_sdk::handler::ApproveAllHandler; -use github_copilot_sdk::tool::{JsonSchema, ToolHandlerRouter, define_tool}; +use github_copilot_sdk::tool::{define_tool, JsonSchema}; use github_copilot_sdk::{Client, ClientOptions, MessageOptions, SessionConfig, ToolResult}; use serde::Deserialize; @@ -1063,27 +1067,28 @@ struct GetWeatherParams { #[tokio::main] async fn main() -> Result<(), Box> { // Define a tool that Copilot can call - let router = ToolHandlerRouter::new( - vec![define_tool( - "get_weather", - "Get the current weather for a city", - |_inv, params: GetWeatherParams| async move { - Ok(ToolResult::Text(format!( - "{}: 62°F and sunny", - params.city - ))) - }, - )], - Arc::new(ApproveAllHandler), - ); - let tools = router.tools(); + let tools = vec![define_tool( + "get_weather", + "Get the current weather for a city", + |_inv, params: GetWeatherParams| async move { + Ok(ToolResult::Text(format!( + "{}: 62°F and sunny", + params.city + ))) + }, + )]; let client = Client::start(ClientOptions::default()).await?; let mut config = SessionConfig::default(); config.streaming = Some(true); - config.tools = Some(tools); - let session = client.create_session(config.with_handler(Arc::new(router))).await?; + let session = client + .create_session( + config + .with_tools(tools) + .with_permission_handler(Arc::new(ApproveAllHandler)), + ) + .await?; let mut events = session.subscribe(); tokio::spawn(async move { @@ -1176,10 +1181,11 @@ await session.SendAndWaitAsync(new MessageOptions Update `HelloCopilot.java`: + + ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; import java.util.Map; @@ -1502,7 +1508,7 @@ use std::sync::Arc; use std::time::Duration; use github_copilot_sdk::handler::ApproveAllHandler; -use github_copilot_sdk::tool::{JsonSchema, ToolHandlerRouter, define_tool}; +use github_copilot_sdk::tool::{define_tool, JsonSchema}; use github_copilot_sdk::{Client, ClientOptions, MessageOptions, SessionConfig, ToolResult}; use serde::Deserialize; @@ -1523,27 +1529,28 @@ fn read_line() -> Option { #[tokio::main] async fn main() -> Result<(), Box> { - let router = ToolHandlerRouter::new( - vec![define_tool( - "get_weather", - "Get the current weather for a city", - |_inv, params: GetWeatherParams| async move { - Ok(ToolResult::Text(format!( - "{}: 62°F and sunny", - params.city - ))) - }, - )], - Arc::new(ApproveAllHandler), - ); - let tools = router.tools(); + let tools = vec![define_tool( + "get_weather", + "Get the current weather for a city", + |_inv, params: GetWeatherParams| async move { + Ok(ToolResult::Text(format!( + "{}: 62°F and sunny", + params.city + ))) + }, + )]; let client = Client::start(ClientOptions::default()).await?; let mut config = SessionConfig::default(); config.streaming = Some(true); - config.tools = Some(tools); - let session = client.create_session(config.with_handler(Arc::new(router))).await?; + let session = client + .create_session( + config + .with_tools(tools) + .with_permission_handler(Arc::new(ApproveAllHandler)), + ) + .await?; let mut events = session.subscribe(); tokio::spawn(async move { @@ -1672,10 +1679,11 @@ dotnet run Create `WeatherAssistant.java`: + + ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; import java.util.Map; @@ -1946,9 +1954,9 @@ import ( func main() { ctx := context.Background() - client := copilot.NewClient(&copilot.ClientOptions{ - Connection: copilot.UriConnection{URL: "localhost:4321"}, - }) + client := copilot.NewClient(&copilot.ClientOptions{ + Connection: copilot.URIConnection{URL: "localhost:4321"}, + }) if err := client.Start(ctx); err != nil { log.Fatal(err) @@ -1966,7 +1974,7 @@ func main() { import copilot "github.com/github/copilot-sdk/go" client := copilot.NewClient(&copilot.ClientOptions{ - Connection: copilot.UriConnection{URL: "localhost:4321"}, + Connection: copilot.URIConnection{URL: "localhost:4321"}, }) if err := client.Start(ctx); err != nil { @@ -1999,7 +2007,7 @@ let client = Client::start(options).await?; // Use the client normally let session = client - .create_session(SessionConfig::default().with_handler(Arc::new(ApproveAllHandler))) + .create_session(SessionConfig::default().with_permission_handler(Arc::new(ApproveAllHandler))) .await?; // ... ``` @@ -2027,8 +2035,8 @@ await using var session = await client.CreateSessionAsync(new() {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient( new CopilotClientOptions().setCliUrl("localhost:4321") @@ -2045,7 +2053,7 @@ var session = client.createSession( {% endcodetab %} {% endcodetabs %} -**Note:** When `cli_url` / `cliUrl` / Go's `UriConnection` is provided, or Rust uses `Transport::External`, the SDK will not spawn or manage a CLI process - it will only connect to the existing server at the specified URL. +**Note:** When `cli_url` / `cliUrl` / Go's `URIConnection` is provided, or Rust uses `Transport::External`, the SDK will not spawn or manage a CLI process - it will only connect to the existing server at the specified URL. ## Telemetry and observability @@ -2146,8 +2154,8 @@ No extra dependencies—uses built-in `System.Diagnostics.Activity`. ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(new CopilotClientOptions() .setTelemetry(new TelemetryConfig() diff --git a/content/copilot/how-tos/copilot-sdk/hooks/error-handling.md b/content/copilot/how-tos/copilot-sdk/hooks/error-handling.md index 1f76b6ed69b1..d3b3d762752c 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/error-handling.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/error-handling.md @@ -103,6 +103,8 @@ public delegate Task ErrorOccurredHandler( {% endcodetab %} {% codetab java %} + + ```java // Note: Java SDK does not have an onErrorOccurred hook. // Use EventErrorPolicy and EventErrorHandler instead: @@ -263,9 +265,11 @@ var session = await client.CreateSessionAsync(new SessionConfig {% endcodetab %} {% codetab java %} + + ```java -import com.github.copilot.sdk.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.*; +import com.github.copilot.rpc.*; // Note: Java SDK does not have an onErrorOccurred hook. // Use EventErrorPolicy and EventErrorHandler instead: diff --git a/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md b/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md index a883c7dba021..ab46314b4ddc 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md @@ -166,8 +166,8 @@ var session = await client.CreateSessionAsync(new SessionConfig {% codetab java %} ```java -import com.github.copilot.sdk.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.*; +import com.github.copilot.rpc.*; import java.util.concurrent.CompletableFuture; try (var client = new CopilotClient()) { diff --git a/content/copilot/how-tos/copilot-sdk/hooks/post-tool-use.md b/content/copilot/how-tos/copilot-sdk/hooks/post-tool-use.md index 4afbcd9839b9..7fa71e2dcae3 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/post-tool-use.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/post-tool-use.md @@ -115,9 +115,23 @@ public delegate Task PostToolUseHandler( {% codetab java %} ```java -import com.github.copilot.sdk.json.*; +import com.github.copilot.rpc.*; +import java.util.concurrent.CompletableFuture; -PostToolUseHandler postToolUseHandler; +public class PostToolUseSignature { + PostToolUseHandler handler = (PostToolUseHookInput input, HookInvocation invocation) -> + CompletableFuture.completedFuture(null); + public static void main(String[] args) {} +} +``` + +```java +@FunctionalInterface +public interface PostToolUseHandler { + CompletableFuture handle( + PostToolUseHookInput input, + HookInvocation invocation); +} ``` {% endcodetab %} @@ -269,9 +283,11 @@ var session = await client.CreateSessionAsync(new SessionConfig {% endcodetab %} {% codetab java %} + + ```java -import com.github.copilot.sdk.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.*; +import com.github.copilot.rpc.*; import java.util.concurrent.CompletableFuture; var hooks = new SessionHooks() diff --git a/content/copilot/how-tos/copilot-sdk/hooks/pre-tool-use.md b/content/copilot/how-tos/copilot-sdk/hooks/pre-tool-use.md index 7adb0007292d..a334078c36a9 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/pre-tool-use.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/pre-tool-use.md @@ -102,9 +102,23 @@ public delegate Task PreToolUseHandler( {% codetab java %} ```java -import com.github.copilot.sdk.json.*; +import com.github.copilot.rpc.*; +import java.util.concurrent.CompletableFuture; -PreToolUseHandler preToolUseHandler; +public class PreToolUseSignature { + PreToolUseHandler handler = (PreToolUseHookInput input, HookInvocation invocation) -> + CompletableFuture.completedFuture(PreToolUseHookOutput.allow()); + public static void main(String[] args) {} +} +``` + +```java +@FunctionalInterface +public interface PreToolUseHandler { + CompletableFuture handle( + PreToolUseHookInput input, + HookInvocation invocation); +} ``` {% endcodetab %} @@ -139,6 +153,23 @@ Return `null` or `undefined` to allow the tool to execute with no changes. Other | `"deny"` | Tool is blocked, reason shown to user | | `"ask"` | User is prompted to approve (interactive mode) | +### Skipping permission prompts for trusted custom tools + +If you define a custom tool that is safe to run without prompting, set `skipPermission: true` on the tool definition. Use this for trusted, app-owned tools whose inputs are already constrained by your application; use `onPreToolUse` when you need per-call policy checks or argument validation. + +```typescript +const getWeather = defineTool("get_weather", { + description: "Get weather for a location.", + parameters: { + type: "object", + properties: { location: { type: "string" } }, + required: ["location"], + }, + skipPermission: true, + handler: async ({ location }) => ({ forecast: `Sunny in ${location}` }), +}); +``` + ## Examples ### Allow all tools (logging only) @@ -265,9 +296,11 @@ var session = await client.CreateSessionAsync(new SessionConfig {% endcodetab %} {% codetab java %} + + ```java -import com.github.copilot.sdk.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.*; +import com.github.copilot.rpc.*; import java.util.concurrent.CompletableFuture; var hooks = new SessionHooks() diff --git a/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md b/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md index 295395df6f89..0c9b2eaf8463 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md @@ -108,9 +108,23 @@ public delegate Task SessionStartHandler( {% codetab java %} ```java -import com.github.copilot.sdk.json.*; +import com.github.copilot.rpc.*; +import java.util.concurrent.CompletableFuture; + +public class SessionStartSignature { + SessionStartHandler handler = (SessionStartHookInput input, HookInvocation invocation) -> + CompletableFuture.completedFuture(null); + public static void main(String[] args) {} +} +``` -SessionStartHandler sessionStartHandler; +```java +@FunctionalInterface +public interface SessionStartHandler { + CompletableFuture handle( + SessionStartHookInput input, + HookInvocation invocation); +} ``` {% endcodetab %} @@ -308,9 +322,23 @@ public delegate Task SessionEndHandler( {% codetab java %} ```java -import com.github.copilot.sdk.json.*; +import com.github.copilot.rpc.*; +import java.util.concurrent.CompletableFuture; + +public class SessionEndSignature { + SessionEndHandler handler = (SessionEndHookInput input, HookInvocation invocation) -> + CompletableFuture.completedFuture(null); + public static void main(String[] args) {} +} +``` -SessionEndHandler sessionEndHandler; +```java +@FunctionalInterface +public interface SessionEndHandler { + CompletableFuture handle( + SessionEndHookInput input, + HookInvocation invocation); +} ``` {% endcodetab %} diff --git a/content/copilot/how-tos/copilot-sdk/hooks/user-prompt-submitted.md b/content/copilot/how-tos/copilot-sdk/hooks/user-prompt-submitted.md index 42246a31884c..9fa0979bf9c1 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/user-prompt-submitted.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/user-prompt-submitted.md @@ -104,9 +104,23 @@ public delegate Task UserPromptSubmittedHandler( {% codetab java %} ```java -import com.github.copilot.sdk.json.*; +import com.github.copilot.rpc.*; +import java.util.concurrent.CompletableFuture; -UserPromptSubmittedHandler userPromptSubmittedHandler; +public class UserPromptSubmittedSignature { + UserPromptSubmittedHandler handler = (UserPromptSubmittedHookInput input, HookInvocation invocation) -> + CompletableFuture.completedFuture(null); + public static void main(String[] args) {} +} +``` + +```java +@FunctionalInterface +public interface UserPromptSubmittedHandler { + CompletableFuture handle( + UserPromptSubmittedHookInput input, + HookInvocation invocation); +} ``` {% endcodetab %} @@ -242,9 +256,11 @@ var session = await client.CreateSessionAsync(new SessionConfig {% endcodetab %} {% codetab java %} + + ```java -import com.github.copilot.sdk.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.*; +import com.github.copilot.rpc.*; import java.util.concurrent.CompletableFuture; var hooks = new SessionHooks() diff --git a/content/copilot/how-tos/copilot-sdk/integrations/microsoft-agent-framework.md b/content/copilot/how-tos/copilot-sdk/integrations/microsoft-agent-framework.md index 2745d1516882..299ef507dc71 100644 --- a/content/copilot/how-tos/copilot-sdk/integrations/microsoft-agent-framework.md +++ b/content/copilot/how-tos/copilot-sdk/integrations/microsoft-agent-framework.md @@ -125,9 +125,8 @@ async def main(): ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(); client.start().get(); @@ -241,9 +240,8 @@ await session.sendAndWait({ prompt: "What's the weather like in Seattle?" }); {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -362,9 +360,8 @@ async def main(): ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; // Java uses the standard SDK directly — no MAF orchestrator needed var client = new CopilotClient(); @@ -438,9 +435,8 @@ Console.WriteLine(combinedResult); ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; import java.util.concurrent.CompletableFuture; // Java uses CompletableFuture for concurrent execution @@ -549,10 +545,11 @@ await session.sendAndWait({ prompt: "Write a quicksort implementation in TypeScr {% endcodetab %} {% codetab java %} + + ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(); client.start().get(); diff --git a/content/copilot/how-tos/copilot-sdk/observability/opentelemetry.md b/content/copilot/how-tos/copilot-sdk/observability/opentelemetry.md index 6f5dbe8b5464..cd017a2892da 100644 --- a/content/copilot/how-tos/copilot-sdk/observability/opentelemetry.md +++ b/content/copilot/how-tos/copilot-sdk/observability/opentelemetry.md @@ -81,8 +81,8 @@ var client = new CopilotClient(new CopilotClientOptions ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(new CopilotClientOptions() .setTelemetry(new TelemetryConfig() @@ -123,6 +123,8 @@ let client = Client::start(ClientOptions::new() The SDK can propagate W3C Trace Context (`traceparent`/`tracestate`) on JSON-RPC payloads so that your application's spans and the CLI's spans are linked in one distributed trace. This is useful when, for example, you want to see a "handle tool call" span in your app nested inside the CLI's "execute tool" span, or show the SDK call as a child of your request-handling span. +For cost attribution alongside traces, subscribe to `assistant.usage` events and inspect `apiEndpoint` (`AssistantUsageApiEndpoint`) to see whether a turn used Chat Completions, Responses, or Anthropic Messages; see [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/streaming-events). + #### SDK → CLI (outbound) For **Node.js**, provide an `onGetTraceContext` callback on the client options. This is only needed if your application already uses `@opentelemetry/api` and you want to link your spans with the CLI's spans. The SDK calls this callback before `session.create`, `session.resume`, and `session.send` RPCs: diff --git a/content/copilot/how-tos/copilot-sdk/setup/backend-services.md b/content/copilot/how-tos/copilot-sdk/setup/backend-services.md index 325538a974b3..674a216528b5 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/backend-services.md +++ b/content/copilot/how-tos/copilot-sdk/setup/backend-services.md @@ -20,7 +20,7 @@ contentType: how-tos ## How it works -Instead of the SDK spawning a CLI child process, you run the CLI independently in **headless server mode**. Your backend connects to it over TCP using the `Connection` option (`UriConnection`). +Instead of the SDK spawning a CLI child process, you run the CLI independently in **headless server mode**. Your backend connects to it over TCP using the `Connection` option (`URIConnection`). ![Diagram: Flowchart showing the described process.](/assets/images/help/copilot/copilot-sdk/setup-backend-services-diagram-0.png) @@ -30,6 +30,8 @@ Instead of the SDK spawning a CLI child process, you run the CLI independently i * Multiple SDK clients can share one CLI server * Works with any auth method (GitHub tokens, env vars, BYOK) +For multi-user server mode, configure SDK clients with `mode: "empty"`, pass user credentials per session, and explicitly allow tools for each session. See [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy) for the full pattern. + ## Architecture: auto-managed vs. external CLI ![Diagram: Flowchart showing the described process.](/assets/images/help/copilot/copilot-sdk/setup-backend-services-diagram-1.png) @@ -103,15 +105,18 @@ Restart=always {% codetab typescript %} ```typescript -import { CopilotClient } from "@github/copilot-sdk"; +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; const client = new CopilotClient({ - cliUrl: "localhost:4321", + connection: RuntimeConnection.forUri("localhost:4321"), + mode: "empty", }); const session = await client.createSession({ sessionId: `user-${userId}-${Date.now()}`, model: "gpt-4.1", + availableTools: ["custom:*"], + gitHubToken: user.githubToken, }); const response = await session.sendAndWait({ prompt: req.body.message }); @@ -153,9 +158,9 @@ func main() { userID := "user1" message := "Hello" - client := copilot.NewClient(&copilot.ClientOptions{ - Connection: copilot.UriConnection{URL: "localhost:4321"}, - }) + client := copilot.NewClient(&copilot.ClientOptions{ + Connection: copilot.URIConnection{URL: "localhost:4321"}, + }) client.Start(ctx) defer client.Stop() @@ -171,7 +176,7 @@ func main() { ```golang client := copilot.NewClient(&copilot.ClientOptions{ - Connection: copilot.UriConnection{URL: "localhost:4321"}, + Connection: copilot.URIConnection{URL: "localhost:4321"}, }) client.Start(ctx) defer client.Stop() @@ -228,9 +233,8 @@ var response = await session.SendAndWaitAsync( {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var userId = "user1"; var message = "Hello!"; @@ -277,17 +281,18 @@ copilot --headless --port 4321 Pass individual user tokens when creating sessions. See [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/github-oauth) for the full flow. ```typescript +const client = new CopilotClient({ + connection: RuntimeConnection.forUri("localhost:4321"), + mode: "empty", +}); + // Your API receives user tokens from your auth layer app.post("/chat", authMiddleware, async (req, res) => { - const client = new CopilotClient({ - cliUrl: "localhost:4321", - gitHubToken: req.user.githubToken, - useLoggedInUser: false, - }); - const session = await client.createSession({ sessionId: `user-${req.user.id}-chat`, model: "gpt-4.1", + availableTools: ["custom:*"], + gitHubToken: req.user.githubToken, }); const response = await session.sendAndWait({ @@ -304,7 +309,7 @@ Use your own API keys for the model provider. See [AUTOTITLE](/copilot/how-tos/c ```typescript const client = new CopilotClient({ - cliUrl: "localhost:4321", + connection: RuntimeConnection.forUri("localhost:4321"), }); const session = await client.createSession({ @@ -325,14 +330,15 @@ const session = await client.createSession({ ```typescript import express from "express"; -import { CopilotClient } from "@github/copilot-sdk"; +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; const app = express(); app.use(express.json()); -// Single shared CLI connection +// Single shared CLI connection for multi-user server mode const client = new CopilotClient({ - cliUrl: process.env.CLI_URL || "localhost:4321", + connection: RuntimeConnection.forUri(process.env.CLI_URL || "localhost:4321"), + mode: "empty", }); app.post("/api/chat", async (req, res) => { @@ -346,6 +352,8 @@ app.post("/api/chat", async (req, res) => { session = await client.createSession({ sessionId, model: "gpt-4.1", + availableTools: ["custom:*"], + gitHubToken: req.user.githubToken, }); } @@ -362,10 +370,10 @@ app.listen(3000); ### Background worker ```typescript -import { CopilotClient } from "@github/copilot-sdk"; +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; const client = new CopilotClient({ - cliUrl: process.env.CLI_URL || "localhost:4321", + connection: RuntimeConnection.forUri(process.env.CLI_URL || "localhost:4321"), }); // Process jobs from a queue @@ -468,11 +476,13 @@ setInterval(() => cleanupSessions(24 * 60 * 60 * 1000), 60 * 60 * 1000); | Need | Next Guide | |------|-----------| | Multiple CLI servers / high availability | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling) | +| SDK isolation for concurrent users | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy) | | GitHub account auth for users | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/github-oauth) | | Your own model keys | [AUTOTITLE](/copilot/how-tos/copilot-sdk/auth/byok) | ## Next steps +* **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy)**: Configure SDK isolation for concurrent users * **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling)**: Handle more users, add redundancy * **[AUTOTITLE](/copilot/how-tos/copilot-sdk/features/session-persistence)**: Resume sessions across restarts * **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/github-oauth)**: Add user authentication diff --git a/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md b/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md index 1be31c99ae6b..059cbd25ee8a 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md +++ b/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md @@ -131,9 +131,8 @@ Console.WriteLine(response?.Data.Content); > The Java SDK does not bundle or embed the Copilot CLI. You must install the CLI separately and configure its path via `Connection` or the `COPILOT_CLI_PATH` environment variable. ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(new CopilotClientOptions() // Point to the CLI binary installed on the system diff --git a/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md b/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md index 04bace18a5fc..1fc8528d435e 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md +++ b/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md @@ -43,6 +43,7 @@ You're building tools for your team or company. Users are employees who need to 1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services)**—Run the SDK in your internal services **If scaling beyond a single server:** +1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy)**—Configure SDK options for multi-user server mode 1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling)**—Handle multiple users and services ### 🚀 App developer (ISV) @@ -55,6 +56,7 @@ You're building a product for customers. You need to handle authentication for y 1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services)**—Power your product from server-side code **For production:** +1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy)**—Use `mode: "empty"`, per-session tokens, and isolated runtime state 1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling)**—Serve many customers reliably ### 🏗️ Platform developer @@ -63,6 +65,7 @@ You're embedding Copilot into a platform—APIs, developer tools, or infrastruct **Start with:** 1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services)**—Core server-side integration +1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy)**—SDK-level isolation, per-session auth, and shared runtime options 1. **[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling)**—Session isolation, horizontal scaling, persistence **Depending on your auth model:** @@ -81,6 +84,7 @@ Use this table to find the right guides based on what you need to do: | Use your own model keys (OpenAI, Azure, etc.) | [AUTOTITLE](/copilot/how-tos/copilot-sdk/auth/byok) | | Azure BYOK with Managed Identity (no API keys) | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/azure-managed-identity) | | Run the SDK on a server | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services) | +| Configure SDK options for concurrent users | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy) | | Serve multiple users / scale horizontally | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling) | ## Configuration comparison diff --git a/content/copilot/how-tos/copilot-sdk/setup/github-oauth.md b/content/copilot/how-tos/copilot-sdk/setup/github-oauth.md index 99189359dc3b..ddb3c29df73b 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/github-oauth.md +++ b/content/copilot/how-tos/copilot-sdk/setup/github-oauth.md @@ -162,7 +162,7 @@ func main() { ```golang func createClientForUser(userToken string) *copilot.Client { return copilot.NewClient(&copilot.ClientOptions{ - GithubToken: userToken, + GitHubToken: userToken, UseLoggedInUser: copilot.Bool(false), }) } @@ -228,10 +228,11 @@ var response = await session.SendAndWaitAsync( {% endcodetab %} {% codetab java %} + + ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.events.*; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; CopilotClient createClientForUser(String userToken) throws Exception { var client = new CopilotClient(new CopilotClientOptions() diff --git a/content/copilot/how-tos/copilot-sdk/setup/index.md b/content/copilot/how-tos/copilot-sdk/setup/index.md index 71dac28cdc25..1766006906b2 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/index.md +++ b/content/copilot/how-tos/copilot-sdk/setup/index.md @@ -14,6 +14,7 @@ children: - /choosing-a-setup-path - /github-oauth - /local-cli + - /multi-tenancy - /scaling --- diff --git a/content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md b/content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md new file mode 100644 index 000000000000..3d6e4aedccc0 --- /dev/null +++ b/content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md @@ -0,0 +1,440 @@ +--- +title: Multi-tenancy and server deployments +shortTitle: Multi Tenancy +intro: >- + Run the Copilot SDK in multi-user server deployments with per-session + isolation for state, authentication, and tools. +versions: + fpt: '*' + ghec: '*' +contentType: how-tos +--- + + + + +**Best for:** SaaS products, partner integrations, internal platforms, and backend services that handle concurrent users. + +## Use this guide when + +Use this guide when you are building: + +* A multi-user SaaS product that embeds Copilot-powered agents +* A backend for a partner integration, such as a Copilot Studio or Fabric-style pattern +* Any server that handles concurrent users, workspaces, tenants, or requests +* A shared runtime where multiple SDK clients connect to one Copilot runtime process + +This guide is a sister to [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling). Use that guide for topology, load-balancing, and storage patterns. Use this guide for SDK-level options and runtime isolation choices. + +## Key SDK options + +| Option | Use it for | Notes | +|--------|------------|-------| +| `mode: "empty"` | Disabling ambient OS tools and CLI defaults | Required for multi-user or shared scenarios. | +| `sessionIdleTimeoutSeconds` | Cleaning idle sessions | Set a server-side timeout for long-running processes. | +| `baseDirectory` | Isolating `COPILOT_HOME` per runtime instance | Ignored when connecting to an existing runtime. | +| `sessionFs` | Routing session filesystem storage off local disk | Pair with per-session filesystem providers. | +| `RuntimeConnection.forUri(url)` | Sharing one already-running runtime | Language names vary; see samples below. | +| Per-session `gitHubToken` | Scoping auth to the requesting user | Prefer this over a single shared user token. | + +### `mode: "empty"` + +`mode: "empty"` disables optional Copilot CLI behavior by default. In multi-user server mode, this is the safe baseline because your application must explicitly decide which tools, MCP servers, skills, and workspace paths a session can access. + +Do not use the default `mode: "copilot-cli"` for shared servers. That mode is intended for CLI-like coding agents and can expose ambient host filesystem capabilities. + +{% codetabs %} +{% codetab typescript %} + +```typescript +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; + +// baseDirectory and sessionIdleTimeoutSeconds apply when the SDK spawns the +// runtime. With RuntimeConnection.forUri(...) configure COPILOT_HOME and the +// idle timeout on the runtime process itself. +const client = new CopilotClient({ + mode: "empty", + connection: RuntimeConnection.forUri(process.env.COPILOT_RUNTIME_URL!), +}); + +const session = await client.createSession({ + sessionId: `user-${user.id}-${crypto.randomUUID()}`, + model: "gpt-4.1", + availableTools: ["custom:lookupOrder", "custom:createTicket"], + gitHubToken: user.githubToken, +}); +``` + +{% endcodetab %} +{% codetab python %} + +```python +from copilot import CopilotClient, RuntimeConnection +from copilot.session import PermissionHandler + +client = CopilotClient( + mode="empty", + base_directory=f"/var/lib/my-app/copilot/{runtime_instance_id}", + session_idle_timeout_seconds=900, + connection=RuntimeConnection.for_uri(runtime_url), +) +await client.start() + +session = await client.create_session( + session_id=f"user-{user.id}-{request_id}", + model="gpt-4.1", + available_tools=["custom:lookupOrder", "custom:createTicket"], + github_token=user.github_token, + on_permission_request=PermissionHandler.approve_all, +) +``` + +{% endcodetab %} +{% codetab go %} + +```golang +package main + +import ( + "context" + "fmt" + + copilot "github.com/github/copilot-sdk/go" +) + +type appUser struct { + ID string + GitHubToken string +} + +func main() { + ctx := context.Background() + runtimeInstanceID := "instance-1" + runtimeURL := "http://127.0.0.1:8080" + requestID := "req-1" + user := appUser{ID: "alice", GitHubToken: "YOUR_GITHUB_TOKEN"} + + client := copilot.NewClient(&copilot.ClientOptions{ + Mode: copilot.ModeEmpty, + BaseDirectory: fmt.Sprintf("/var/lib/my-app/copilot/%s", runtimeInstanceID), + SessionIdleTimeoutSeconds: 900, + Connection: copilot.URIConnection{URL: runtimeURL}, + }) + + session, err := client.CreateSession(ctx, &copilot.SessionConfig{ + SessionID: fmt.Sprintf("user-%s-%s", user.ID, requestID), + Model: "gpt-4.1", + AvailableTools: []string{"custom:lookupOrder", "custom:createTicket"}, + GitHubToken: user.GitHubToken, + }) + _ = session + _ = err +} +``` + +```golang +client := copilot.NewClient(&copilot.ClientOptions{ + Mode: copilot.ModeEmpty, + BaseDirectory: fmt.Sprintf("/var/lib/my-app/copilot/%s", runtimeInstanceID), + SessionIdleTimeoutSeconds: 900, + Connection: copilot.URIConnection{URL: runtimeURL}, +}) + +session, err := client.CreateSession(ctx, &copilot.SessionConfig{ + SessionID: fmt.Sprintf("user-%s-%s", user.ID, requestID), + Model: "gpt-4.1", + AvailableTools: []string{"custom:lookupOrder", "custom:createTicket"}, + GitHubToken: user.GitHubToken, +}) +``` + +{% endcodetab %} +{% codetab dotnet %} + +```csharp +using GitHub.Copilot; + +var runtimeInstanceId = "instance-1"; +var runtimeUrl = "http://127.0.0.1:8080"; +var requestId = "req-1"; +var user = new { Id = "alice", GitHubToken = "YOUR_GITHUB_TOKEN" }; + +var client = new CopilotClient(new CopilotClientOptions +{ + Mode = CopilotClientMode.Empty, + BaseDirectory = $"/var/lib/my-app/copilot/{runtimeInstanceId}", + SessionIdleTimeoutSeconds = 900, + Connection = RuntimeConnection.ForUri(runtimeUrl), +}); + +await using var session = await client.CreateSessionAsync(new SessionConfig +{ + SessionId = $"user-{user.Id}-{requestId}", + Model = "gpt-4.1", + AvailableTools = ["custom:lookupOrder", "custom:createTicket"], + GitHubToken = user.GitHubToken, +}); +``` + +```csharp +var client = new CopilotClient(new CopilotClientOptions +{ + Mode = CopilotClientMode.Empty, + BaseDirectory = $"/var/lib/my-app/copilot/{runtimeInstanceId}", + SessionIdleTimeoutSeconds = 900, + Connection = RuntimeConnection.ForUri(runtimeUrl), +}); + +await using var session = await client.CreateSessionAsync(new SessionConfig +{ + SessionId = $"user-{user.Id}-{requestId}", + Model = "gpt-4.1", + AvailableTools = ["custom:lookupOrder", "custom:createTicket"], + GitHubToken = user.GitHubToken, +}); +``` + +{% endcodetab %} +{% codetab java %} + +```java +import java.util.List; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.CopilotClientOptions; +import com.github.copilot.rpc.CopilotClientMode; +import com.github.copilot.rpc.SessionConfig; + +public class MultiTenancyExample { + record User(String id, String gitHubToken) {} + + public static void main(String[] args) throws Exception { + String runtimeUrl = "http://localhost:4321"; + String requestId = "req-1"; + User user = new User("u1", "ghu_token"); + + // setCopilotHome and setSessionIdleTimeoutSeconds are ignored when + // setCliUrl is used; configure those on the runtime process instead. + var client = new CopilotClient(new CopilotClientOptions() + .setMode(CopilotClientMode.EMPTY) + .setCliUrl(runtimeUrl) + ); + + var session = client.createSession(new SessionConfig() + .setSessionId("user-" + user.id() + "-" + requestId) + .setModel("gpt-4.1") + .setAvailableTools(List.of("custom:lookupOrder", "custom:createTicket")) + .setGitHubToken(user.gitHubToken()) + ).get(); + } +} +``` + +```java +// setCopilotHome and setSessionIdleTimeoutSeconds are ignored when +// setCliUrl is used; configure those on the runtime process instead. +var client = new CopilotClient(new CopilotClientOptions() + .setMode(CopilotClientMode.EMPTY) + .setCliUrl(runtimeUrl) +); + +var session = client.createSession(new SessionConfig() + .setSessionId("user-" + user.id() + "-" + requestId) + .setModel("gpt-4.1") + .setAvailableTools(List.of("custom:lookupOrder", "custom:createTicket")) + .setGitHubToken(user.gitHubToken()) +).get(); +``` + +{% endcodetab %} +{% codetab rust %} + +```rust +use std::path::PathBuf; +use github_copilot_sdk::{Client, ClientOptions, Transport}; +use github_copilot_sdk::mode::ClientMode; +use github_copilot_sdk::types::SessionConfig; + +let client = Client::start( + ClientOptions::new() + .with_mode(ClientMode::Empty) + .with_base_directory(PathBuf::from(format!( + "/var/lib/my-app/copilot/{runtime_instance_id}" + ))) + .with_session_idle_timeout_seconds(900) + .with_transport(Transport::External { + host: runtime_host.to_string(), + port: runtime_port, + connection_token: None, + }), +).await?; + +let session = client.create_session( + SessionConfig::default() + .with_session_id(format!("user-{}-{request_id}", user.id)) + .with_model("gpt-4.1") + .with_available_tools(["custom:lookupOrder", "custom:createTicket"]) + .with_github_token(user.github_token), +).await?; +``` + +{% endcodetab %} +{% endcodetabs %} + +### `sessionIdleTimeoutSeconds` + +Set `sessionIdleTimeoutSeconds` on servers so inactive sessions are cleaned up automatically. This prevents zombie sessions in long-running processes and reduces memory and filesystem pressure. + +| Language | Public option | +|----------|---------------| +| TypeScript | `sessionIdleTimeoutSeconds` | +| Python | `session_idle_timeout_seconds` | +| Go | `SessionIdleTimeoutSeconds` | +| .NET | `SessionIdleTimeoutSeconds` | +| Java | `setSessionIdleTimeoutSeconds(...)` | +| Rust | `with_session_idle_timeout_seconds(...)` | + +Use a value that matches your product's conversation lifetime. For chat backends, 15 to 30 minutes is usually a good starting point. For workflow agents, use a longer timeout and explicit deletion when the workflow completes. + +### `baseDirectory` + +`baseDirectory` sets `COPILOT_HOME` for a runtime instance. Use it to isolate runtime state, credentials, and session data per process, pod, worker, or tenant boundary. + +```typescript +const client = new CopilotClient({ + mode: "empty", + baseDirectory: `/var/lib/my-app/copilot/runtime-${process.env.HOSTNAME}`, + sessionIdleTimeoutSeconds: 900, +}); +``` + +The runtime stores session state under the configured `COPILOT_HOME`, including `session-state/{sessionId}`. If your app runs multiple runtime instances, give each instance a distinct directory unless you intentionally use shared storage. + +When the SDK connects to an already-running runtime with `RuntimeConnection.forUri(url)`, `baseDirectory` is ignored by the SDK client. Configure `COPILOT_HOME` on the runtime process instead. + +### `sessionFs` + +`sessionFs` registers a custom session filesystem provider so session-scoped file I/O can be routed through application storage instead of the runtime's local disk. Use it when local disk is ephemeral, when session state needs to live in object storage, or when a platform needs to enforce tenant-aware storage paths. + +```typescript +const client = new CopilotClient({ + mode: "empty", + sessionFs: { + initialCwd: "/workspace", + sessionStatePath: "/session-state", + conventions: "posix", + }, +}); +``` + +For languages that expose a provider callback, configure `sessionFs` at the client level and provide a per-session filesystem handler when creating or resuming a session. See [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/session-persistence) for persistence concepts and storage trade-offs. + +Verified public SDK surfaces: + +| Language | Client-level config | Per-session provider | +|----------|---------------------|----------------------| +| TypeScript | `sessionFs` | `createSessionFsAdapter` / provider callbacks | +| Python | `session_fs` | `create_session_fs_handler` | +| Go | `SessionFS` | `CreateSessionFSProvider` | +| .NET | `SessionFs` | `CreateSessionFsProvider` | +| Rust | `with_session_fs(...)` | `with_session_fs_provider(...)` | + +Java does not currently expose a verified public `sessionFs` option, so this guide does not show a Java `sessionFs` sample. + +### `RuntimeConnection.forUri(url)` + +Use an external runtime connection when multiple SDK clients should share one already-running runtime. This is common in backend services where the runtime process is managed separately from request handlers. + +| Language | External runtime connection | +|----------|-----------------------------| +| TypeScript | `RuntimeConnection.forUri(url)` | +| Python | `RuntimeConnection.for_uri(url)` | +| Go | `copilot.URIConnection{URL: url}` | +| .NET | `RuntimeConnection.ForUri(url)` | +| Java | `setCliUrl(url)` | +| Rust | `Transport::External { host, port, connection_token }` | + +External runtimes manage their own process-level authentication and storage. Pass per-session tokens on `createSession` or `resumeSession` when you need user-specific auth. + +### Per-session `gitHubToken` + +Set `gitHubToken` on each session to scope GitHub auth to the requesting user. This is different from a client-level token, which authenticates the runtime process. + +```typescript +const session = await client.createSession({ + sessionId: `user-${user.id}-support`, + model: "gpt-4.1", + availableTools: ["custom:*"], + gitHubToken: user.githubToken, +}); +``` + +Use per-session tokens for content exclusion, model routing, quota checks, and user-specific Copilot access. Avoid sharing one service token across users unless your product intentionally uses service-account semantics. + +## Integration ID + +Partners building branded agents can set an integration ID for Mission Control requests. The runtime reads `GITHUB_COPILOT_INTEGRATION_ID` and stamps it as the `Copilot-Integration-Id` HTTP header on every Mission Control request. + +```bash +GITHUB_COPILOT_INTEGRATION_ID=my-product-agent copilot --headless --port 4321 +``` + +The default integration ID is `copilot-developer-cli`. Use a stable value such as `my-product-agent` for attribution and routing. The integration ID is currently configured by environment variable only; it is not a first-class SDK option. + +If the SDK spawns the runtime, pass the environment variable through the client environment option. If you connect with `RuntimeConnection.forUri(url)`, set the environment variable on the runtime process itself. + +## Session-level isolation guarantees + +Session-level isolation means the runtime keeps user-specific model and state information scoped to a session, not in global shared state. + +| Surface | Isolation behavior | +|---------|--------------------| +| Model list cache | Per-session. Model lookup uses the session's model list cache. | +| Session state | Per session ID under `COPILOT_HOME/session-state/{sessionId}`. | +| GitHub identity | Per-session when `gitHubToken` is set on the session. | +| Tools | Explicit in `mode: "empty"`; ambient in `mode: "copilot-cli"`. | +| Host filesystem | Shared by the runtime process if host tools are available. | + +`mode: "empty"` is what makes shared runtime patterns viable: no ambient OS tools are exposed unless your application registers or allows them. With `mode: "copilot-cli"`, OS filesystem access is shared through the host process, so do not use that mode for multi-user server mode. + +Session state is stored under `COPILOT_HOME/session-state/{sessionId}` unless you route it through `sessionFs`. Use unique session IDs that include your own tenant or user boundary, and enforce access control before resuming or deleting sessions. + +## Pattern comparison + +| Pattern | Use when | Trade-offs | +|---------|----------|------------| +| Pattern 1: isolated CLI per user | You need the strongest isolation boundary or separate process credentials per user. | Strong isolation; higher resource cost. See [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling). | +| Pattern 2: shared CLI with `mode: "empty"` | You want one runtime to serve many users while your app controls tools, auth, and session IDs. | Efficient; requires careful tool registration, per-session tokens, and application-level access checks. | +| Pattern 3: hybrid | You route compute-heavy work to cloud sessions and light work to local sessions. | Flexible; requires workload routing and policy handling. See [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/cloud-sessions). | + +### Pattern 2: shared CLI with `mode: "empty"` + +In this pattern, all users connect through your backend to one runtime pool. The application performs user authentication, chooses a session ID, passes the user's GitHub token on the session, and provides an explicit tool allowlist. + +![Diagram: Flowchart showing the described process.](/assets/images/help/copilot/copilot-sdk/setup-multi-tenancy-diagram-0.png) + +Use these rules: + +* Always start the client or runtime in `mode: "empty"`. +* Use unique session IDs and store ownership metadata in your application database. +* Check ownership before `resumeSession`, `deleteSession`, or any UI action that references a session ID. +* Pass `gitHubToken` per session when requests should run as the user. +* Register only the tools the session needs, and prefer source-qualified allowlists such as `custom:*` or `mcp:search_docs`. +* Set `sessionIdleTimeoutSeconds` and delete completed workflow sessions explicitly. + +## Common pitfalls + +* Forgetting `mode: "empty"`. The default `copilot-cli` mode exposes CLI-style behavior and may expose the host filesystem through ambient tools. +* Not setting `sessionIdleTimeoutSeconds`. Long-running servers can accumulate idle sessions if they do not clean them up. +* Sharing one `gitHubToken` across users instead of passing a per-session token. +* Trusting client-provided session IDs without checking ownership in your backend. +* Setting `baseDirectory` on a client that connects to an existing runtime and expecting it to move runtime storage. Configure the runtime process instead. +* Allowing broad tool patterns such as `builtin:*` without reviewing whether each tool is appropriate for your users. + +## See also + +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling): deployment topologies, storage patterns, and isolation comparisons +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services): running the runtime in headless server mode +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/auth/byok): using your own model provider credentials +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/cloud-sessions): routing selected work to cloud sessions +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/session-persistence): managing resumable session state +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/features): tools, events, hooks, and advanced SDK features diff --git a/content/copilot/how-tos/copilot-sdk/setup/scaling.md b/content/copilot/how-tos/copilot-sdk/setup/scaling.md index 7f66293d26c6..d45441808b01 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/scaling.md +++ b/content/copilot/how-tos/copilot-sdk/setup/scaling.md @@ -14,6 +14,8 @@ contentType: how-tos +For SDK-level options and patterns, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy). + **Best for:** Platform developers, SaaS builders, any deployment serving more than a handful of concurrent users. ## Core concepts diff --git a/content/copilot/how-tos/copilot-sdk/troubleshooting/compatibility.md b/content/copilot/how-tos/copilot-sdk/troubleshooting/compatibility.md index 4315e8b0dd69..60cd2712584f 100644 --- a/content/copilot/how-tos/copilot-sdk/troubleshooting/compatibility.md +++ b/content/copilot/how-tos/copilot-sdk/troubleshooting/compatibility.md @@ -97,7 +97,7 @@ The Copilot SDK communicates with the CLI via JSON-RPC protocol. Features must b | Working directory | `workingDirectory` config | Set session cwd | | **Experimental** | | | | Agent management | `session.rpc.agent.*` | List, select, deselect, get current agent | -| Fleet mode | `session.rpc.fleet.start()` | Parallel sub-agent execution | +| Fleet mode | `session.rpc.fleet.start()` | Parallel sub-agent execution; see [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/fleet-mode) | | Manual compaction | `session.rpc.history.compact()` | Trigger compaction on demand | | History truncation | `session.rpc.history.truncate()` | Remove events from a point onward | | Session forking | `server.rpc.sessions.fork()` | Fork a session at a point in history | @@ -181,6 +181,10 @@ The Copilot SDK communicates with the CLI via JSON-RPC protocol. Features must b ## Workarounds +### Fleet mode + +Fleet mode is available through `session.rpc.fleet.start()` for SDK applications that want the runtime to dispatch parallel sub-agents for a larger objective. Use it when independent subtasks can run concurrently and then be summarized by the main session. For a full guide, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/features/fleet-mode). + ### Session export The `--share` option is not available via SDK. Workarounds: diff --git a/content/copilot/how-tos/copilot-sdk/troubleshooting/debugging.md b/content/copilot/how-tos/copilot-sdk/troubleshooting/debugging.md index ccfb2e783a38..301053a71553 100644 --- a/content/copilot/how-tos/copilot-sdk/troubleshooting/debugging.md +++ b/content/copilot/how-tos/copilot-sdk/troubleshooting/debugging.md @@ -99,8 +99,8 @@ var client = new CopilotClient(new CopilotClientOptions {% codetab java %} ```java -import com.github.copilot.sdk.CopilotClient; -import com.github.copilot.sdk.json.*; +import com.github.copilot.CopilotClient; +import com.github.copilot.rpc.*; var client = new CopilotClient(new CopilotClientOptions() .setLogLevel("debug") @@ -174,6 +174,8 @@ var client = new CopilotClient(new CopilotClientOptions {% endcodetab %} {% codetab java %} + + ```java // The Java SDK does not currently support passing extra CLI arguments. // For custom log directories, run the CLI manually with --log-dir @@ -284,7 +286,7 @@ var client = new CopilotClient(new CopilotClientOptions ```golang client := copilot.NewClient(&copilot.ClientOptions{ - GithubToken: os.Getenv("GITHUB_TOKEN"), + GitHubToken: os.Getenv("GITHUB_TOKEN"), }) ``` @@ -294,7 +296,7 @@ var client = new CopilotClient(new CopilotClientOptions ```csharp var client = new CopilotClient(new CopilotClientOptions { - GithubToken = Environment.GetEnvironmentVariable("GITHUB_TOKEN") + GitHubToken = Environment.GetEnvironmentVariable("GITHUB_TOKEN") }); ``` diff --git a/content/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging.md b/content/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging.md index 506efb703cc7..e6e751f7df2c 100644 --- a/content/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging.md +++ b/content/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging.md @@ -423,7 +423,7 @@ Create a wrapper script to log all communication: #!/bin/bash # mcp-debug-wrapper.sh -LOG="/tmp/mcp-debug-$(date +%s).log" +LOG="./mcp-debug-$(date +%s).log" ACTUAL_SERVER="$1" shift