commit ec9810566fc981301184d7ba31906e3d2860fec0 Author: aljazceru Date: Tue Jul 15 19:48:09 2025 +0000 deploy: 8b3c77618076eb211a56439f62ef49892ffd18b8 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..f616dd6b --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ + + + + + +Page Not Found | codename goose + + + + + + + + + + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ +
+ + + \ No newline at end of file diff --git a/assets/css/styles.4f50fa0c.css b/assets/css/styles.4f50fa0c.css new file mode 100644 index 00000000..7e176a03 --- /dev/null +++ b/assets/css/styles.4f50fa0c.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal)}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.markdown li,body{word-wrap:break-word}.bg-black,.bg-blue-100,.bg-blue-400,.bg-gray-200,.bg-gray-300,.bg-purple-100,.bg-purple-500,.bg-purple-600,.bg-red-100,.bg-red-50,.bg-white,.bg-yellow-100,.bg-yellow-400,.bg-yellow-600,.bg-zinc-100,.bg-zinc-200,.bg-zinc-800,.hover\:bg-gray-900:hover,.hover\:bg-purple-700:hover,.hover\:bg-zinc-300:hover{--tw-bg-opacity:1}.border-blue-200,.border-gray-200,.border-purple-200,.border-red-400,.border-red-500,.border-yellow-200,.border-zinc-200,.border-zinc-300{--tw-border-opacity:1}.text-black,.text-blue-500,.text-blue-800,.text-gray-500,.text-gray-600,.text-gray-800,.text-purple-600,.text-purple-800,.text-red-600,.text-red-700,.text-white,.text-yellow-800,.text-zinc-400,.text-zinc-500,.text-zinc-600,.text-zinc-700,.text-zinc-900{--tw-text-opacity:1}.button,.dropdown__link,.text--truncate,.whitespace-nowrap{white-space:nowrap}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list,.swiper{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--background-app)}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.items-start,.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.items-center,.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width);width:100%}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.italic,.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.inline-block{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw)}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child,.first\:pt-0:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links,.mb-4{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.command-content code,.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.last\:mb-0:last-child,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child),.mt-1{margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";transform:rotate(180deg);filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.flex,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem}.card,.h-full,.navbar__logo img,body,html{height:100%}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.m-0,.navbar__items--center .navbar__brand,.pill-button p{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]),.pointer-events-none{pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items,.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.inline-flex,.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.content_knG7,.hero__title,.swiper-pagination,.text-center,.textColumn_jfBU{text-align:center}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.overflow-hidden,.server-card{overflow:hidden}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--constant-white:#fff;--constant-black:#000;--green-for-lightbg:#0f6636;--green-for-darkbg:#25c2a0;--grey-10:#101010;--grey-20:#1e1e1e;--grey-50:#666;--grey-60:#959595;--grey-80:#ccc;--grey-85:#dadada;--grey-90:#e8e8e8;--grey-95:#f0f0f0;--dark-grey-15:#1a1a1a;--dark-grey-25:#232323;--dark-grey-30:#2a2a2a;--dark-grey-40:#333;--dark-grey-45:#595959;--dark-grey-60:#878787;--dark-grey-90:#e1e1e1;--background-app:var(--constant-white);--background-prominent:var(--grey-80);--background-standard:var(--grey-90);--background-subtle:var(--grey-95);--border-divider:var(--grey-90);--border-inverse:var(--constant-white);--border-prominent:var(--grey-10);--border-standard:var(--grey-60);--border-subtle:var(--grey-90);--icon-disabled:var(--grey-60);--icon-extra-subtle:var(--grey-60);--icon-inverse:var(--constant-white);--icon-prominent:var(--grey-10);--icon-standard:var(--grey-20);--icon-subtle:var(--grey-50);--text-placeholder:var(--grey-60);--text-prominent:var(--grey-10);--text-standard:var(--grey-20);--text-subtle:var(--grey-50);--text-inverse:var(--constant-white);--button-primary-background:var(--constant-black);--ifm-button-border-radius:999px;--ifm-font-family-base:"Cash Sans",sans-serif;--ifm-font-size-base:16px;--ifm-button-font-weight:var(--ifm-font-weight-normal);--ifm-navbar-item-padding-horizontal:32px;--ifm-navbar-shadow:none;--ifm-navbar-background-color:var(--background-app);--ifm-background-color:var(--background-app);--ifm-hero-text-color:var(--text-standard);--ifm-heading-font-weight:var(--ifm-font-weight-semibold);--ifm-footer-background-color:var(--background-app);--ifm-color-primary:var(--constant-black);--ifm-footer-link-color:var(--text-standard);--ifm-navbar-link-hover-color:var(--text-subtle);--ifm-link-color:var(--green-for-lightbg);--ifm-color-video-alert-contrast-background:#edfbf8;--ifm-color-video-alert-contrast-foreground:#01523e;--ifm-color-video-alert-border:#25c2a0;--swiper-theme-color:#007aff;--swiper-navigation-size:44px;--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Cash Sans;font-style:normal;font-weight:400;src:url(https://cash-f.squarecdn.com/static/fonts/cashsans/woff2/CashSans-Regular.woff2) format("woff2")}@font-face{font-family:Cash Sans;font-style:normal;font-weight:500;src:url(https://cash-f.squarecdn.com/static/fonts/cashsans/woff2/CashSans-Medium.woff2) format("woff2")}@font-face{font-family:Cash Sans;font-style:normal;font-weight:600;src:url(https://cash-f.squarecdn.com/static/fonts/cashsans/woff2/CashSans-Semibold.woff2) format("woff2")}@font-face{font-family:Cash Sans;font-style:normal;font-weight:700;src:url(https://cash-f.squarecdn.com/static/fonts/cashsans/woff2/CashSans-Bold.woff2) format("woff2")}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d;--background-app:var(--constant-black);--background-prominent:var(--dark-grey-40);--background-standard:var(--dark-grey-25);--background-subtle:var(--dark-grey-15);--border-divider:var(--dark-grey-25);--border-inverse:var(--constant-black);--border-prominent:var(--constant-white);--border-standard:var(--dark-grey-45);--border-subtle:var(--dark-grey-25);--icon-disabled:var(--dark-grey-45);--icon-extra-subtle:var(--dark-grey-45);--icon-inverse:var(--constant-black);--icon-prominent:var(--constant-white);--icon-standard:var(--dark-grey-90);--icon-subtle:var(--dark-grey-60);--text-placeholder:var(--dark-grey-45);--text-prominent:var(--constant-white);--text-standard:var(--dark-grey-90);--text-subtle:var(--dark-grey-60);--text-inverse:var(--constant-black);--button-primary-background:var(--constant-white);--ifm-link-color:var(--green-for-darkbg);--ifm-color-video-alert-contrast-background:#336e62;--ifm-color-video-alert-contrast-foreground:#d8fbd8;--ifm-color-video-alert-border:#99d5c5}.button{align-items:center;border:none;color:var(--text-standard);display:flex;font-size:var(--ifm-font-size-base);font-weight:var(--ifm-font-weight-semibold);padding:8px 24px}.card-footer,.card-stats,.hero .container,.logo_Ukns,.pill-button,.textColumn_jfBU,.wrapper_fthM{align-items:center;display:flex}.button--primary{background:var(--button-primary-background);color:var(--text-inverse)}.ctaButton,.hero--primary{background:var(--background-app);color:var(--text-standard)}.button svg,.mr-3{margin-right:.75rem}.hero .container{flex-direction:column;justify-content:center;padding:2rem 0}.hero__title{line-height:.8;margin-bottom:32px;max-width:280px}.hero__subtitle{font-size:28px;line-height:36px;margin-bottom:32px;max-width:600px}.footer{border-top:2px solid var(--border-subtle);padding-top:24px}.hero--logo svg{height:220px;width:220px}.card-stats svg,.command-toggle svg,.install-button svg{height:16px;width:16px}.ctaButton{border-radius:999px;display:inline-block;font-size:.9rem;font-weight:700;padding:.75rem 1.5rem;text-decoration:none}.card-stats:hover,.command-toggle:hover,.dropdown__link:hover,.group:hover .group-hover\:text-textProminent,.hover\:text-textProminent:hover,.navbar__link--active,.text-textProminent{color:var(--text-prominent)}.theme-code-block pre{white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word}.swiper-pagination.swiper-pagination-hidden,html[data-theme=dark] .hide-in-dark,html[data-theme=light] .hide-in-light{opacity:0}.alert--video{--ifm-alert-background-color:var(--ifm-color-video-alert-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-video-alert-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-video-alert-border)}.aspect-ratio,.aspect-ratio_NVrr,.videoColumn_qOfe{aspect-ratio:16/9;width:100%}.navbar{border-bottom:1px solid var(--border-divider)}.navbar__item{align-items:center;display:flex;padding-left:.75rem;padding-right:.75rem}.navbar__item,.navbar__toggle{transition:opacity .3s,transform .3s}.navbar__toggle{opacity:0;transform:scale(.8)}.navbar__brand,.navbar__logo{margin-right:0}.dropdown__link,.search-input,.text-textStandard{color:var(--text-standard)}.dropdown__menu{background-color:var(--background-app);border-color:var(--border-subtle)}.dropdown__link:hover{background-color:var(--background-subtle)}.iconExternalLink_nPIU{margin-left:8px!important}.carousel-image{border-radius:8px;object-fit:cover;width:100%}*,:after,:before{border:0 solid #e5e7eb}.search-container{margin-bottom:2rem;position:relative}.search-input{background:#0000;border:none;border-bottom:1px solid var(--border-subtle);font-size:1rem;padding:1rem 0;transition:border-color .2s;width:100%}.search-input:focus{border-bottom-color:var(--border-standard);outline:0}.search-input::placeholder{color:var(--text-placeholder)}.server-card{background-color:var(--border-subtle);border-radius:17px;height:100%;padding:2px;position:relative;transition:.3s}.server-card.interactive:hover{background-color:initial;transform:translateY(-2px)}.footerLogoLink_BH7S:hover,.hash-link:focus,.server-card:hover .card-glow,:hover>.hash-link{opacity:1}.card-glow{animation:6s linear infinite b;background:linear-gradient(45deg,#13bbaf,#ff4f00);height:1000px;left:-200px;opacity:0;pointer-events:none;position:absolute;top:-200px;transform-origin:center;transition:opacity .2s;width:1000px;z-index:-1}.-translate-x-1\/2,.hover\:-translate-y-0\.5:hover,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.card,.prompt-card{background-color:var(--background-app);border:1px solid var(--border-subtle);border-radius:15px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;display:flex;flex-direction:column;overflow:hidden;transition:.3s}.hover\:shadow-lg:hover,.hover\:shadow-md:hover,.hover\:shadow-xl:hover,.shadow-lg,.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.card-header a,.extension-title{transition:color .2s;color:var(--text-standard)}.prompt-card{min-height:200px}.prompt-card-content{display:flex;flex:1;flex-direction:column;min-height:0;padding:0 1.5rem 1.5rem}.card-header{align-items:center;display:flex;padding:1.5rem 1.5rem .75rem}.card-header a{text-decoration:none}.card-header-content,.container,.w-full{width:100%}.card-header-content,.extension-title{align-items:center;display:flex;gap:.5rem}.extension-title{text-decoration:none!important}.extension-title:hover,.install-button:hover{color:var(--text-prominent);text-decoration:none!important}.extension-icon{flex-shrink:0;height:12px;width:13px}.home-page-server-name{font-size:1rem;font-weight:500;line-height:1.2}.home-page-server-name:hover{color:var(--text-prominent);text-decoration:none}.card-stats,.card-stats:hover,.card_tSoT,.install-button{text-decoration:none!important}.card-content{display:flex;flex:1;flex-direction:column;gap:1rem;justify-content:space-between;padding:0 1.5rem 1.5rem}.card-description{line-height:1.5;margin:0}.card-description,.command-toggle{color:var(--text-standard);font-size:.875rem}.command-toggle{align-items:center;background:#0000;border:none;cursor:pointer;display:flex;padding:.5rem 0;transition:.2s;width:100%}.built-in-badge,.command-content{background-color:var(--background-subtle)}.command-toggle h4{font-size:.875rem;font-weight:500;margin:0}.command-content{border-radius:.375rem;color:var(--text-standard);font-size:.875rem;margin-top:.5rem;padding:.75rem}.built-in-badge,.card-stats,.install-button{color:var(--text-subtle);font-size:.75rem}.command-content code{background-color:initial;border:none;font-size:.875rem}.card-footer{justify-content:space-between;margin-top:auto}.card-stats{gap:.25rem;transition:color .2s}.card-action,.ml-auto{margin-left:auto}.install-button{align-items:center;display:flex;gap:.5rem;padding:0;transition:.2s}.duration-150,.transition,.transition-all,.transition-colors,.transition-shadow,.transition-transform{transition-duration:.15s}.ease-in-out,.transition,.transition-all,.transition-colors,.transition-shadow,.transition-transform{transition-timing-function:cubic-bezier(.4,0,.2,1)}.install-button svg{transition:color .2s}.install-button:hover svg{color:#fa5204}.built-in-badge{border-radius:999px;cursor:help;padding:.25rem .5rem}.bg-bgApp,.hover\:bg-bgApp:hover,html[data-theme=dark] .card{background-color:var(--background-app)}.cards-grid{display:grid;gap:1.5rem;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));padding:1rem 0;width:100%}html[data-theme=dark] .card{border-color:var(--border-subtle);box-shadow:none}html[data-theme=dark] .command-content{background-color:#ffffff0d}html[data-theme=dark] .built-in-badge{background-color:#ffffff1a}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-5{bottom:1.25rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.top-0{top:0}.z-10{z-index:10}.z-50{z-index:50}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-8{margin-bottom:2rem;margin-top:2rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block,.group:hover .group-hover\:block,.tocCollapsibleContent_vkbj a{display:block}.inline,.tags_jXut{display:inline}.grid{display:grid}.hidden{display:none}.h-12{height:3rem}.h-16{height:4rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-\[600px\]{height:600px}.max-h-\[550px\]{max-height:550px}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.min-h-\[100px\]{min-height:100px}.min-h-\[150px\]{min-height:150px}.min-h-screen{min-height:100vh}.w-16{width:4rem}.w-2\/3{width:66.666667%}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-fit{width:fit-content}.swiper-slide,.swiper-wrapper{height:100%;position:relative;width:100%}.min-w-\[30px\]{min-width:30px}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%}.rotate-90{--tw-rotate:90deg}@keyframes a{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite a}.cursor-help{cursor:help}.cursor-pointer,.dropdownNavbarItemMobile_S0Fm,.hover\:cursor-pointer:hover,.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col,.swiper-vertical>.swiper-wrapper{flex-direction:column}.flex-wrap{flex-wrap:wrap}.justify-end{justify-content:flex-end}.justify-center,.mdxPageWrapper_j9I6{justify-content:center}.justify-between{justify-content:space-between}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0,.last\:border-0:last-child{border-width:0}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-blue-200{border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-borderStandard,.hover\:border-borderStandard:hover{border-color:var(--border-standard)}.border-borderSubtle{border-color:var(--border-subtle)}.border-gray-200{border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-purple-200{border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.border-red-400{border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.border-red-500{border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.border-yellow-200{border-color:rgb(254 240 138/var(--tw-border-opacity,1))}.border-zinc-200{border-color:rgb(228 228 231/var(--tw-border-opacity,1))}.border-zinc-300{border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.bg-bgProminent{background-color:var(--background-prominent)}.bg-bgSubtle{background-color:var(--background-subtle)}.bg-black{background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-blue-100{background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-400{background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.bg-gray-100,.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-purple-100{background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.bg-purple-500{background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.bg-purple-600{background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.bg-red-100{background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-red-50{background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-transparent{background-color:initial}.bg-white{background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100{background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.bg-yellow-400{background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.bg-yellow-600{background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.bg-zinc-100{background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}.bg-zinc-200{background-color:rgb(228 228 231/var(--tw-bg-opacity,1))}.bg-zinc-800{background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.bg-opacity-60{--tw-bg-opacity:0.6}.bg-opacity-70{--tw-bg-opacity:0.7}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-24{padding:6rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-16{padding-bottom:4rem;padding-top:4rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-8{padding-bottom:2rem}.pl-0,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pl-6{padding-left:1.5rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[18px\]{font-size:18px}.text-\[40px\]{font-size:40px}.text-\[64px\]{font-size:64px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.cardTitle_Vgx8,.font-semibold{font-weight:600}.leading-\[24px\]{line-height:24px}.leading-\[52px\]{line-height:52px}.leading-normal{line-height:1.5}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.text-black{color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-blue-500{color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-800{color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-gray-500{color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-800{color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-inherit{color:inherit}.text-purple-600{color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-purple-800{color:rgb(107 33 168/var(--tw-text-opacity,1))}.hover\:text-red-500:hover,.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-textSubtle{color:var(--text-subtle)}.text-white{color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-800{color:rgb(133 77 14/var(--tw-text-opacity,1))}.text-zinc-400{color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-zinc-500{color:rgb(113 113 122/var(--tw-text-opacity,1))}.text-zinc-600{color:rgb(82 82 91/var(--tw-text-opacity,1))}.text-zinc-700{color:rgb(63 63 70/var(--tw-text-opacity,1))}.text-zinc-900{color:rgb(24 24 27/var(--tw-text-opacity,1))}.hover\:no-underline:hover,.no-underline{text-decoration-line:none}.placeholder-textPlaceholder::placeholder{color:var(--text-placeholder)}.caret-\[\#FF4F00\]{caret-color:#ff4f00}.opacity-10{opacity:.1}.hover\:shadow-lg:hover,.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.hover\:shadow-md:hover,.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline{outline-style:solid}.blur-2xl{--tw-blur:blur(40px)}.blur-2xl,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter}.transition-all{transition-property:all}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke}.transition-shadow{transition-property:box-shadow}.swiper-slide,.swiper-wrapper,.transition-transform{transition-property:transform}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.hover\:border-\[var\(--ifm-color-primary-dark\)\]:hover{border-color:var(--ifm-color-primary-dark)}.hover\:bg-gray-900:hover{background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.hover\:bg-purple-700:hover{background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.hover\:bg-zinc-300:hover{background-color:rgb(212 212 216/var(--tw-bg-opacity,1))}.hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-\[0_0_0_2px_rgba\(99\2c 102\2c 241\2c 0\.4\)\2c _0_4px_20px_rgba\(99\2c 102\2c 241\2c 0\.1\)\]:hover{--tw-shadow:0 0 0 2px #6366f166,0 4px 20px #6366f11a;--tw-shadow-colored:0 0 0 2px var(--tw-shadow-color),0 4px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.focus\:outline-none:focus{outline:#0000 solid 2px;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.card_tSoT:hover,.video-container{box-shadow:0 4px 12px -6px #0000001a}.focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity,1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.disabled\:cursor-not-allowed:disabled,.toggleButtonDisabled_aARS{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.dark\:border-zinc-600:is([data-theme=dark] *){--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity,1))}.dark\:border-zinc-700:is([data-theme=dark] *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1))}.dark\:bg-\[\#1A1A1A\]:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(26 26 26/var(--tw-bg-opacity,1))}.dark\:bg-white:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.dark\:bg-zinc-700:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.dark\:bg-zinc-800:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.dark\:bg-zinc-900:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.dark\:text-black:is([data-theme=dark] *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.dark\:text-gray-300:is([data-theme=dark] *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-purple-400:is([data-theme=dark] *){--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.dark\:text-white:is([data-theme=dark] *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:text-zinc-200:is([data-theme=dark] *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.dark\:text-zinc-300:is([data-theme=dark] *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.dark\:text-zinc-400:is([data-theme=dark] *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.dark\:hover\:bg-gray-100:hover:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:hover\:bg-zinc-600:hover:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))}.dark\:hover\:bg-zinc-700:hover:is([data-theme=dark] *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.dark\:focus\:ring-offset-gray-900:focus:is([data-theme=dark] *){--tw-ring-offset-color:#111827}@font-face{font-family:swiper-icons;font-style:normal;font-weight:400;src:url("data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA")}:host{display:block;margin-left:auto;margin-right:auto;position:relative;z-index:1}.swiper{display:block;margin-left:auto;margin-right:auto;overflow:hidden;padding:0;position:relative;z-index:1}.swiper-wrapper{box-sizing:initial;display:flex;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);z-index:1}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{display:block;flex-shrink:0}.swiper-slide-invisible-blank{visibility:hidden}.img_ev3q,.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{backface-visibility:hidden;transform:translateZ(0)}.swiper-3d,.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide,.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper:before{content:"";flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper:before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper:before{height:var(--swiper-centered-offset-after);min-width:1px;width:100%}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:10}.swiper-3d .swiper-slide-shadow{background:#00000026}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(270deg,#00000080,#0000)}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(90deg,#00000080,#0000)}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(0deg,#00000080,#0000)}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(180deg,#00000080,#0000)}.swiper-lazy-preloader{border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top:4px solid #0000;box-sizing:border-box;height:42px;left:50%;margin-left:-21px;margin-top:-21px;position:absolute;top:50%;transform-origin:50%;width:42px;z-index:10}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:1s linear infinite b}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes b{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.swiper-button-next,.swiper-button-prev{align-items:center;color:var(--swiper-navigation-color,var(--swiper-theme-color));cursor:pointer;display:flex;height:var(--swiper-navigation-size);justify-content:center;margin-top:calc(0px - var(--swiper-navigation-size)/ 2);position:absolute;top:var(--swiper-navigation-top-offset,50%);width:calc(var(--swiper-navigation-size)/44*27);z-index:10}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{cursor:auto;opacity:.35;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{cursor:auto;opacity:0;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev,.swiper-pagination-bullet:only-child,.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-button-next svg,.swiper-button-prev svg{height:100%;object-fit:contain;transform-origin:center;width:100%}.swiper-rtl .swiper-button-next svg,.swiper-rtl .swiper-button-prev svg{transform:rotate(180deg)}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:var(--swiper-navigation-sides-offset,10px);right:auto}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.swiper-button-lock,.swiper-pagination-lock,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);font-variant:normal;letter-spacing:0;line-height:1;text-transform:none!important}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:"prev"}.swiper-button-next,.swiper-rtl .swiper-button-prev{left:auto;right:var(--swiper-navigation-sides-offset,10px)}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:"next"}.swiper-pagination{position:absolute;transform:translateZ(0);transition:opacity .3s;z-index:10}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);left:0;top:var(--swiper-pagination-top,auto);width:100%}.swiper-pagination-bullets-dynamic{font-size:0;overflow:hidden}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{position:relative;transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active,.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next,.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next,.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullet{background:var(--swiper-pagination-bullet-inactive-color,#000);border-radius:var(--swiper-pagination-bullet-border-radius,50%);display:inline-block;height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));opacity:var(--swiper-pagination-bullet-inactive-opacity,.2);width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px))}button.swiper-pagination-bullet{appearance:none;border:none;box-shadow:none;margin:0;padding:0}.swiper-pagination-bullet-active{background:var(--swiper-pagination-color,var(--swiper-theme-color));opacity:var(--swiper-pagination-bullet-opacity,1)}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{left:var(--swiper-pagination-left,auto);right:var(--swiper-pagination-right,8px);top:50%;transform:translate3d(0,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{display:block;margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:transform .2s,top .2s}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,left .2s}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,right .2s}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,#00000040);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));height:100%;left:0;position:absolute;top:0;transform:scale(0);transform-origin:left top;width:100%}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0;width:100%}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{height:100%;left:0;top:0;width:var(--swiper-pagination-progressbar-size,4px)}.categorySection_OPv7{margin:3rem 0}.categoryTitle_lrPf{color:var(--ifm-heading-color);font-size:1.5rem;font-weight:600;margin-bottom:1.5rem}.cardGrid_EPen{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.cardGrid_EPen,.singleCardGrid_c1rY{display:grid;gap:1.5rem;margin:1rem 0}.singleCardGrid_c1rY{grid-template-columns:minmax(300px,600px)}.pageTitle_DJXn{color:var(--ifm-heading-color);font-size:2.5rem;margin-bottom:1rem}.pageDescription_HHKJ{color:var(--ifm-color-emphasis-700);font-size:1.2rem;line-height:1.6;margin-bottom:2rem}.video-container{border-radius:8px;margin:0 auto 3rem;max-width:800px;overflow:hidden;position:relative;width:100%}.card_tSoT{background:#0000;border:1px solid var(--ifm-color-emphasis-200);border-radius:12px;color:inherit!important;display:block;padding:1.75rem;transition:border-color .2s,box-shadow .2s}.card_tSoT:hover{border-color:var(--ifm-color-emphasis-500);text-decoration:none}.cardTitle_Vgx8{color:var(--ifm-heading-color);font-size:1.4rem;margin:0 0 .75rem}.cardDescription_N3HQ{color:var(--ifm-color-emphasis-700);line-height:1.6;margin:0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.features_t9lD{align-items:center;display:flex;padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.featureIcon_GA8l{height:32px;width:32px}.videoContainer_B4Kr{margin-bottom:100px;overflow:hidden;position:relative;width:100%}.video_hjvp{display:block;height:auto;outline:0;width:100%}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.video_hjvp+.video_hjvp{left:0;position:absolute;top:0}.header_gB2a{padding:4rem 2rem}.wrapper_fthM{flex-wrap:wrap;gap:3rem;justify-content:center;margin:0 auto;max-width:1200px;min-height:400px}.textColumn_jfBU{flex:1 1 300px;flex-direction:column;margin-top:-40px;max-width:500px}.subtitle_RlPM{font-size:1.25rem;margin-bottom:1.5rem;max-width:30ch}.videoColumn_qOfe{flex:1 1 400px;max-width:640px}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.authorSocials_rSDt,.authorTitle_nd0D{overflow:hidden;-webkit-box-orient:vertical}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .instagramSvg_YC40,[data-theme=dark] .threadsSvg_PTXY,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .instagramSvg_YC40,[data-theme=light] .threadsSvg_PTXY,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.authorListItem_n3yI{list-style-type:none;margin-bottom:2rem}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.cards-grid{grid-template-columns:repeat(2,1fr)}.container{max-width:768px}.md\:mb-8{margin-bottom:2rem}.md\:mt-8{margin-top:2rem}.md\:block{display:block}.md\:hidden{display:none}.md\:w-64{width:16rem}.md\:flex-row{flex-direction:row}.md\:gap-4{gap:1rem}.md\:gap-6{gap:1.5rem}.md\:p-24{padding:6rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:py-3{padding-bottom:.75rem;padding-top:.75rem}.md\:pb-16{padding-bottom:4rem}.md\:pb-8{padding-bottom:2rem}.md\:text-\[40px\]{font-size:40px}.md\:text-\[64px\]{font-size:64px}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:leading-\[52px\]{line-height:52px}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.navbar__item{opacity:1;pointer-events:auto;transform:translateX(0);visibility:visible}.navbar__toggle{opacity:0;transform:scale(.8)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1024px){.cards-grid{grid-template-columns:repeat(3,1fr)}.container{max-width:1024px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (min-width:1536px){.container{max-width:1536px}}@media (max-width:1450px){#inkeep{max-width:180px}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__item{display:none;opacity:0;pointer-events:none;transform:translateX(-10px);visibility:hidden}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbar__toggle{display:inherit!important;opacity:1!important;transform:scale(1)!important}.navbar-sidebar{display:block}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media screen and (max-width:768px){.header_gB2a{padding:1rem}.wrapper_fthM{flex-direction:column;gap:1rem;padding:1rem;text-align:center}.textColumn_jfBU{flex:1 1 400px;margin-top:0;max-width:100%;text-align:center}.subtitle_RlPM{font-size:1.1rem;line-height:1.5;margin:0 auto 1.5rem}.ctaButton_g0jw{font-size:1rem;width:auto}.videoColumn_qOfe{aspect-ratio:16/9;flex:1 1 180px;width:100%}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/files/square-mcp-goosin-menu-192f4e4ee8aad4c74a1ce35a5f09167f.png b/assets/files/square-mcp-goosin-menu-192f4e4ee8aad4c74a1ce35a5f09167f.png new file mode 100644 index 00000000..fb0f24e2 Binary files /dev/null and b/assets/files/square-mcp-goosin-menu-192f4e4ee8aad4c74a1ce35a5f09167f.png differ diff --git a/assets/images/agentic-ai-with-mcp-1e3050cc8d8ae7a620440e871ad9f0d2.png b/assets/images/agentic-ai-with-mcp-1e3050cc8d8ae7a620440e871ad9f0d2.png new file mode 100644 index 00000000..1ccad7cd Binary files /dev/null and b/assets/images/agentic-ai-with-mcp-1e3050cc8d8ae7a620440e871ad9f0d2.png differ diff --git a/assets/images/alex_speaking-ec13442c55a42985517eb08e0b545137.jpg b/assets/images/alex_speaking-ec13442c55a42985517eb08e0b545137.jpg new file mode 100644 index 00000000..1b3b3e68 Binary files /dev/null and b/assets/images/alex_speaking-ec13442c55a42985517eb08e0b545137.jpg differ diff --git a/assets/images/attendee_hacking-bdac777f63da49683cf58513629ff01a.jpg b/assets/images/attendee_hacking-bdac777f63da49683cf58513629ff01a.jpg new file mode 100644 index 00000000..9d4a4d93 Binary files /dev/null and b/assets/images/attendee_hacking-bdac777f63da49683cf58513629ff01a.jpg differ diff --git a/assets/images/automated-testing-graphic-aafa22b18427c32d851c98a1a32a5d8a.png b/assets/images/automated-testing-graphic-aafa22b18427c32d851c98a1a32a5d8a.png new file mode 100644 index 00000000..c9a46879 Binary files /dev/null and b/assets/images/automated-testing-graphic-aafa22b18427c32d851c98a1a32a5d8a.png differ diff --git a/assets/images/bestcodes-3d6c50de10a2d84def19d515aaea0724.png b/assets/images/bestcodes-3d6c50de10a2d84def19d515aaea0724.png new file mode 100644 index 00000000..3e3e8765 Binary files /dev/null and b/assets/images/bestcodes-3d6c50de10a2d84def19d515aaea0724.png differ diff --git a/assets/images/blender-6a9190b0fd17a51a2c0c86b8301aafb4.png b/assets/images/blender-6a9190b0fd17a51a2c0c86b8301aafb4.png new file mode 100644 index 00000000..2113430f Binary files /dev/null and b/assets/images/blender-6a9190b0fd17a51a2c0c86b8301aafb4.png differ diff --git a/assets/images/blog-banner-7f0e5ed1cf875e64e3ebb3250932baaf.png b/assets/images/blog-banner-7f0e5ed1cf875e64e3ebb3250932baaf.png new file mode 100644 index 00000000..09284b1b Binary files /dev/null and b/assets/images/blog-banner-7f0e5ed1cf875e64e3ebb3250932baaf.png differ diff --git a/assets/images/brutalism-calendar-df62e8a95de08f35dabfa2552f937af0.png b/assets/images/brutalism-calendar-df62e8a95de08f35dabfa2552f937af0.png new file mode 100644 index 00000000..f4667bac Binary files /dev/null and b/assets/images/brutalism-calendar-df62e8a95de08f35dabfa2552f937af0.png differ diff --git a/assets/images/cdd-playbook-69a053588574d8678c2acb92a1b21da6.png b/assets/images/cdd-playbook-69a053588574d8678c2acb92a1b21da6.png new file mode 100644 index 00000000..d0efd076 Binary files /dev/null and b/assets/images/cdd-playbook-69a053588574d8678c2acb92a1b21da6.png differ diff --git a/assets/images/claude-3-5-haiku-ff0b0347d5aec59efab98769039f7063.gif b/assets/images/claude-3-5-haiku-ff0b0347d5aec59efab98769039f7063.gif new file mode 100644 index 00000000..e032d1de Binary files /dev/null and b/assets/images/claude-3-5-haiku-ff0b0347d5aec59efab98769039f7063.gif differ diff --git a/assets/images/claude-3-5-sonnet-2-b445a205684b5c7bd674d744b92cc4ea.gif b/assets/images/claude-3-5-sonnet-2-b445a205684b5c7bd674d744b92cc4ea.gif new file mode 100644 index 00000000..56252b09 Binary files /dev/null and b/assets/images/claude-3-5-sonnet-2-b445a205684b5c7bd674d744b92cc4ea.gif differ diff --git a/assets/images/claude-3-7-sonnet-a11804cddf505cec1df78ca8315c8257.gif b/assets/images/claude-3-7-sonnet-a11804cddf505cec1df78ca8315c8257.gif new file mode 100644 index 00000000..e74894ab Binary files /dev/null and b/assets/images/claude-3-7-sonnet-a11804cddf505cec1df78ca8315c8257.gif differ diff --git a/assets/images/claude-3.5-haiku-71f1ce5faa13846a556ba539c57caae8.png b/assets/images/claude-3.5-haiku-71f1ce5faa13846a556ba539c57caae8.png new file mode 100644 index 00000000..1c7286cc Binary files /dev/null and b/assets/images/claude-3.5-haiku-71f1ce5faa13846a556ba539c57caae8.png differ diff --git a/assets/images/claude-3.5-sonnet-2-2c683339b1e4880de5ce5aa435304a5a.png b/assets/images/claude-3.5-sonnet-2-2c683339b1e4880de5ce5aa435304a5a.png new file mode 100644 index 00000000..a8ad7486 Binary files /dev/null and b/assets/images/claude-3.5-sonnet-2-2c683339b1e4880de5ce5aa435304a5a.png differ diff --git a/assets/images/claude-3.7-sonnet-6042d99d5829957f3fd471d44ff2ea26.png b/assets/images/claude-3.7-sonnet-6042d99d5829957f3fd471d44ff2ea26.png new file mode 100644 index 00000000..f9988c3d Binary files /dev/null and b/assets/images/claude-3.7-sonnet-6042d99d5829957f3fd471d44ff2ea26.png differ diff --git a/assets/images/claymorphism-calendar-5b17a874ff38f094d6e4ea180c56c551.png b/assets/images/claymorphism-calendar-5b17a874ff38f094d6e4ea180c56c551.png new file mode 100644 index 00000000..9d78d228 Binary files /dev/null and b/assets/images/claymorphism-calendar-5b17a874ff38f094d6e4ea180c56c551.png differ diff --git a/assets/images/computer-controller-csv-result-e70478e8b2736ac21c595dba9e4cee3a.png b/assets/images/computer-controller-csv-result-e70478e8b2736ac21c595dba9e4cee3a.png new file mode 100644 index 00000000..512cbb30 Binary files /dev/null and b/assets/images/computer-controller-csv-result-e70478e8b2736ac21c595dba9e4cee3a.png differ diff --git a/assets/images/context-reuse-example-8a77763351f738734fe87068dabfba87.png b/assets/images/context-reuse-example-8a77763351f738734fe87068dabfba87.png new file mode 100644 index 00000000..c81de28b Binary files /dev/null and b/assets/images/context-reuse-example-8a77763351f738734fe87068dabfba87.png differ diff --git a/assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png b/assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png new file mode 100644 index 00000000..8c2cdbf5 Binary files /dev/null and b/assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png differ diff --git a/assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png b/assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png new file mode 100644 index 00000000..4aec96d5 Binary files /dev/null and b/assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png differ diff --git a/assets/images/cover-2ba7c2e15786be2db6108c91d27dc1ec.png b/assets/images/cover-2ba7c2e15786be2db6108c91d27dc1ec.png new file mode 100644 index 00000000..7b9d2ef3 Binary files /dev/null and b/assets/images/cover-2ba7c2e15786be2db6108c91d27dc1ec.png differ diff --git a/assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png b/assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png new file mode 100644 index 00000000..3c6bd718 Binary files /dev/null and b/assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png differ diff --git a/assets/images/custom-extension-chat-dade20fed6d387174db32667977bdae1.png b/assets/images/custom-extension-chat-dade20fed6d387174db32667977bdae1.png new file mode 100644 index 00000000..e5dc2eb3 Binary files /dev/null and b/assets/images/custom-extension-chat-dade20fed6d387174db32667977bdae1.png differ diff --git a/assets/images/custom-extension-mcp-inspector-aca22c16eb49051723a6ed413fd53fe7.png b/assets/images/custom-extension-mcp-inspector-aca22c16eb49051723a6ed413fd53fe7.png new file mode 100644 index 00000000..e8887269 Binary files /dev/null and b/assets/images/custom-extension-mcp-inspector-aca22c16eb49051723a6ed413fd53fe7.png differ diff --git a/assets/images/custom-extension-settings-2f8639f68e9bde86c64af6518d2c0a2a.png b/assets/images/custom-extension-settings-2f8639f68e9bde86c64af6518d2c0a2a.png new file mode 100644 index 00000000..ddc16399 Binary files /dev/null and b/assets/images/custom-extension-settings-2f8639f68e9bde86c64af6518d2c0a2a.png differ diff --git a/assets/images/custom-extension-tools-9d440447ae99b18ae92819e652148abe.png b/assets/images/custom-extension-tools-9d440447ae99b18ae92819e652148abe.png new file mode 100644 index 00000000..5a52b5fc Binary files /dev/null and b/assets/images/custom-extension-tools-9d440447ae99b18ae92819e652148abe.png differ diff --git a/assets/images/debugging_with_attendees-528d912677fc352ddb3f601c2cf4c972.jpg b/assets/images/debugging_with_attendees-528d912677fc352ddb3f601c2cf4c972.jpg new file mode 100644 index 00000000..f46b83bf Binary files /dev/null and b/assets/images/debugging_with_attendees-528d912677fc352ddb3f601c2cf4c972.jpg differ diff --git a/assets/images/deepseek-chat-v3-0324-01d4dec7f79311b593ac04fbba9f93ef.gif b/assets/images/deepseek-chat-v3-0324-01d4dec7f79311b593ac04fbba9f93ef.gif new file mode 100644 index 00000000..96db978d Binary files /dev/null and b/assets/images/deepseek-chat-v3-0324-01d4dec7f79311b593ac04fbba9f93ef.gif differ diff --git a/assets/images/deepseek-chat-v3-0324-879b3ea78b30ff135607365fd77eeebe.png b/assets/images/deepseek-chat-v3-0324-879b3ea78b30ff135607365fd77eeebe.png new file mode 100644 index 00000000..f74039d5 Binary files /dev/null and b/assets/images/deepseek-chat-v3-0324-879b3ea78b30ff135607365fd77eeebe.png differ diff --git a/assets/images/deepseek-r1-distill-llama-70b-toolshim-mistral-nemo-bfd7f9d3f37a92aaae6c7afb74b52d91.png b/assets/images/deepseek-r1-distill-llama-70b-toolshim-mistral-nemo-bfd7f9d3f37a92aaae6c7afb74b52d91.png new file mode 100644 index 00000000..2a44838b Binary files /dev/null and b/assets/images/deepseek-r1-distill-llama-70b-toolshim-mistral-nemo-bfd7f9d3f37a92aaae6c7afb74b52d91.png differ diff --git a/assets/images/deepseek-r1-toolshim-mistral-nemo-bf4bd9d06ff57563ae2762d047ccb1c7.gif b/assets/images/deepseek-r1-toolshim-mistral-nemo-bf4bd9d06ff57563ae2762d047ccb1c7.gif new file mode 100644 index 00000000..d300b4db Binary files /dev/null and b/assets/images/deepseek-r1-toolshim-mistral-nemo-bf4bd9d06ff57563ae2762d047ccb1c7.gif differ diff --git a/assets/images/ebony_preparing-013a8b1730a1f75484dfad5694a73a75.jpg b/assets/images/ebony_preparing-013a8b1730a1f75484dfad5694a73a75.jpg new file mode 100644 index 00000000..671f7437 Binary files /dev/null and b/assets/images/ebony_preparing-013a8b1730a1f75484dfad5694a73a75.jpg differ diff --git a/assets/images/emotion-powered-ui-83b0e779f22a3a060eef7bb29e04090d.png b/assets/images/emotion-powered-ui-83b0e779f22a3a060eef7bb29e04090d.png new file mode 100644 index 00000000..198cdaff Binary files /dev/null and b/assets/images/emotion-powered-ui-83b0e779f22a3a060eef7bb29e04090d.png differ diff --git a/assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png b/assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png new file mode 100644 index 00000000..d292d637 Binary files /dev/null and b/assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png differ diff --git a/assets/images/figma-mcp-design-dac4a1618225011a385bb592858e3b3b.png b/assets/images/figma-mcp-design-dac4a1618225011a385bb592858e3b3b.png new file mode 100644 index 00000000..15b2c35b Binary files /dev/null and b/assets/images/figma-mcp-design-dac4a1618225011a385bb592858e3b3b.png differ diff --git a/assets/images/figma-mcp-output-3fa01318977684f5673d44f5b9ad7a19.png b/assets/images/figma-mcp-output-3fa01318977684f5673d44f5b9ad7a19.png new file mode 100644 index 00000000..9d4073d0 Binary files /dev/null and b/assets/images/figma-mcp-output-3fa01318977684f5673d44f5b9ad7a19.png differ diff --git a/assets/images/focus-4927104eb487e6b1f9480d8149e26c36.jpg b/assets/images/focus-4927104eb487e6b1f9480d8149e26c36.jpg new file mode 100644 index 00000000..b8503a00 Binary files /dev/null and b/assets/images/focus-4927104eb487e6b1f9480d8149e26c36.jpg differ diff --git a/assets/images/focus2-4ca4bc40c7a86ec46ec566d4d1fd2001.jpg b/assets/images/focus2-4ca4bc40c7a86ec46ec566d4d1fd2001.jpg new file mode 100644 index 00000000..fdf74ce6 Binary files /dev/null and b/assets/images/focus2-4ca4bc40c7a86ec46ec566d4d1fd2001.jpg differ diff --git a/assets/images/focus3-8ba8fb623d148fa5583c41c0a7a721a4.jpg b/assets/images/focus3-8ba8fb623d148fa5583c41c0a7a721a4.jpg new file mode 100644 index 00000000..fbf3c4f4 Binary files /dev/null and b/assets/images/focus3-8ba8fb623d148fa5583c41c0a7a721a4.jpg differ diff --git a/assets/images/focus4-8232c187021a690519cfa1e8f1c18014.jpg b/assets/images/focus4-8232c187021a690519cfa1e8f1c18014.jpg new file mode 100644 index 00000000..27ae96af Binary files /dev/null and b/assets/images/focus4-8232c187021a690519cfa1e8f1c18014.jpg differ diff --git a/assets/images/focus5-afe81c949e09dc788989d1c20c3a74fe.jpg b/assets/images/focus5-afe81c949e09dc788989d1c20c3a74fe.jpg new file mode 100644 index 00000000..c34bf95d Binary files /dev/null and b/assets/images/focus5-afe81c949e09dc788989d1c20c3a74fe.jpg differ diff --git a/assets/images/fun-340fa01a11fd04982ae7e2e612bded03.jpg b/assets/images/fun-340fa01a11fd04982ae7e2e612bded03.jpg new file mode 100644 index 00000000..fd734b2c Binary files /dev/null and b/assets/images/fun-340fa01a11fd04982ae7e2e612bded03.jpg differ diff --git a/assets/images/fun1-b0d7060f8629eec662b2c9f5a22dd7d0.jpg b/assets/images/fun1-b0d7060f8629eec662b2c9f5a22dd7d0.jpg new file mode 100644 index 00000000..91b95ff9 Binary files /dev/null and b/assets/images/fun1-b0d7060f8629eec662b2c9f5a22dd7d0.jpg differ diff --git a/assets/images/gemma3-eca1a363fea57b818a967883e567a481.png b/assets/images/gemma3-eca1a363fea57b818a967883e567a481.png new file mode 100644 index 00000000..10e047ae Binary files /dev/null and b/assets/images/gemma3-eca1a363fea57b818a967883e567a481.png differ diff --git a/assets/images/gemma3.27b-toolshim-mistral-nemo-ee63d6bc421659fa3501a447f8c46426.png b/assets/images/gemma3.27b-toolshim-mistral-nemo-ee63d6bc421659fa3501a447f8c46426.png new file mode 100644 index 00000000..62b2ca30 Binary files /dev/null and b/assets/images/gemma3.27b-toolshim-mistral-nemo-ee63d6bc421659fa3501a447f8c46426.png differ diff --git a/assets/images/glassmorphism-calendar-43f14e391e706ee2254d8289a9ba90f1.png b/assets/images/glassmorphism-calendar-43f14e391e706ee2254d8289a9ba90f1.png new file mode 100644 index 00000000..3a3f252f Binary files /dev/null and b/assets/images/glassmorphism-calendar-43f14e391e706ee2254d8289a9ba90f1.png differ diff --git a/assets/images/goose-benchmark-d9726c203290ef892fe3fe3adc7d898f.png b/assets/images/goose-benchmark-d9726c203290ef892fe3fe3adc7d898f.png new file mode 100644 index 00000000..ccfd4fec Binary files /dev/null and b/assets/images/goose-benchmark-d9726c203290ef892fe3fe3adc7d898f.png differ diff --git a/assets/images/goose-framework-1.0-b1fa4be4f759784ed7334937044af426.png b/assets/images/goose-framework-1.0-b1fa4be4f759784ed7334937044af426.png new file mode 100644 index 00000000..e930fdd8 Binary files /dev/null and b/assets/images/goose-framework-1.0-b1fa4be4f759784ed7334937044af426.png differ diff --git a/assets/images/goose-github-ci-30930008ab57b0aebae15a03c73a12b5.png b/assets/images/goose-github-ci-30930008ab57b0aebae15a03c73a12b5.png new file mode 100644 index 00000000..176e8b01 Binary files /dev/null and b/assets/images/goose-github-ci-30930008ab57b0aebae15a03c73a12b5.png differ diff --git a/assets/images/goose-gui-a7479dd08b0ddc839348b2a83a62ccfc.png b/assets/images/goose-gui-a7479dd08b0ddc839348b2a83a62ccfc.png new file mode 100644 index 00000000..b1477fca Binary files /dev/null and b/assets/images/goose-gui-a7479dd08b0ddc839348b2a83a62ccfc.png differ diff --git a/assets/images/goose-mcp-34a5252d18d18dff26157d673f7af779.png b/assets/images/goose-mcp-34a5252d18d18dff26157d673f7af779.png new file mode 100644 index 00000000..1da9ddd5 Binary files /dev/null and b/assets/images/goose-mcp-34a5252d18d18dff26157d673f7af779.png differ diff --git a/assets/images/goose-panther-header-25b5891acdd70e6a7bbe6b84e34f08f0.png b/assets/images/goose-panther-header-25b5891acdd70e6a7bbe6b84e34f08f0.png new file mode 100644 index 00000000..d8798d23 Binary files /dev/null and b/assets/images/goose-panther-header-25b5891acdd70e6a7bbe6b84e34f08f0.png differ diff --git a/assets/images/goose-panther-mcp-interaction-ae32c310d436afad5c67ae632649c0c3.png b/assets/images/goose-panther-mcp-interaction-ae32c310d436afad5c67ae632649c0c3.png new file mode 100644 index 00000000..e8bb23b6 Binary files /dev/null and b/assets/images/goose-panther-mcp-interaction-ae32c310d436afad5c67ae632649c0c3.png differ diff --git a/assets/images/goose-prototypes-calendar-8ff9719a4fa565eab4fcdb2389fdde56.png b/assets/images/goose-prototypes-calendar-8ff9719a4fa565eab4fcdb2389fdde56.png new file mode 100644 index 00000000..3a127dfb Binary files /dev/null and b/assets/images/goose-prototypes-calendar-8ff9719a4fa565eab4fcdb2389fdde56.png differ diff --git a/assets/images/goose-qwen-local-62d07cd240ff65cb99a6ef41a2c851a5.png b/assets/images/goose-qwen-local-62d07cd240ff65cb99a6ef41a2c851a5.png new file mode 100644 index 00000000..253af324 Binary files /dev/null and b/assets/images/goose-qwen-local-62d07cd240ff65cb99a6ef41a2c851a5.png differ diff --git a/assets/images/goose-rover-blog-3f3cbe549ebbfb0f951ff61a86788475.png b/assets/images/goose-rover-blog-3f3cbe549ebbfb0f951ff61a86788475.png new file mode 100644 index 00000000..ebb23e59 Binary files /dev/null and b/assets/images/goose-rover-blog-3f3cbe549ebbfb0f951ff61a86788475.png differ diff --git a/assets/images/goose-tips-4add28cc7201737dfb468ad11980f070.png b/assets/images/goose-tips-4add28cc7201737dfb468ad11980f070.png new file mode 100644 index 00000000..ceec1e6f Binary files /dev/null and b/assets/images/goose-tips-4add28cc7201737dfb468ad11980f070.png differ diff --git a/assets/images/goose-v1.0-beta-5d469fa73edea37cfccfe8a8ca0b47e2.png b/assets/images/goose-v1.0-beta-5d469fa73edea37cfccfe8a8ca0b47e2.png new file mode 100644 index 00000000..f3c1562e Binary files /dev/null and b/assets/images/goose-v1.0-beta-5d469fa73edea37cfccfe8a8ca0b47e2.png differ diff --git a/assets/images/goose-voyp-215f3391cfbe2132542a2be63db84999.png b/assets/images/goose-voyp-215f3391cfbe2132542a2be63db84999.png new file mode 100644 index 00000000..0b8adf9a Binary files /dev/null and b/assets/images/goose-voyp-215f3391cfbe2132542a2be63db84999.png differ diff --git a/assets/images/goose4win-7f57433fa3f19849e74b18ebffe08bcf.png b/assets/images/goose4win-7f57433fa3f19849e74b18ebffe08bcf.png new file mode 100644 index 00000000..48b55989 Binary files /dev/null and b/assets/images/goose4win-7f57433fa3f19849e74b18ebffe08bcf.png differ diff --git a/assets/images/goose_aierrors-22154af884db86789ce1a12a72897e8e.png b/assets/images/goose_aierrors-22154af884db86789ce1a12a72897e8e.png new file mode 100644 index 00000000..30aa7ee2 Binary files /dev/null and b/assets/images/goose_aierrors-22154af884db86789ce1a12a72897e8e.png differ diff --git a/assets/images/goose_boston_conversations-01c3e57ecd38e55d3159caeb1ebb0fac.jpg b/assets/images/goose_boston_conversations-01c3e57ecd38e55d3159caeb1ebb0fac.jpg new file mode 100644 index 00000000..d2b8feb7 Binary files /dev/null and b/assets/images/goose_boston_conversations-01c3e57ecd38e55d3159caeb1ebb0fac.jpg differ diff --git a/assets/images/goose_goes_to_boston_banner-3ef0eedeb9d3eac56907c0c5e615d919.png b/assets/images/goose_goes_to_boston_banner-3ef0eedeb9d3eac56907c0c5e615d919.png new file mode 100644 index 00000000..47e5e0f9 Binary files /dev/null and b/assets/images/goose_goes_to_boston_banner-3ef0eedeb9d3eac56907c0c5e615d919.png differ diff --git a/assets/images/goose_team_in_boston-83ed4d854908362156459ede34035521.jpg b/assets/images/goose_team_in_boston-83ed4d854908362156459ede34035521.jpg new file mode 100644 index 00000000..9ab28627 Binary files /dev/null and b/assets/images/goose_team_in_boston-83ed4d854908362156459ede34035521.jpg differ diff --git a/assets/images/goosefigma-e6f84a734bd56cb431bb02452331a5d5.png b/assets/images/goosefigma-e6f84a734bd56cb431bb02452331a5d5.png new file mode 100644 index 00000000..92b0115f Binary files /dev/null and b/assets/images/goosefigma-e6f84a734bd56cb431bb02452331a5d5.png differ diff --git a/assets/images/goosehints-vs-memory-1f0cc2cadcfda38e903e66f5b82ef808.png b/assets/images/goosehints-vs-memory-1f0cc2cadcfda38e903e66f5b82ef808.png new file mode 100644 index 00000000..1e3d56b1 Binary files /dev/null and b/assets/images/goosehints-vs-memory-1f0cc2cadcfda38e903e66f5b82ef808.png differ diff --git a/assets/images/gooseollama-fbb2cb67117c81eaa189a6b6174e6c6c.png b/assets/images/gooseollama-fbb2cb67117c81eaa189a6b6174e6c6c.png new file mode 100644 index 00000000..34ffbc4f Binary files /dev/null and b/assets/images/gooseollama-fbb2cb67117c81eaa189a6b6174e6c6c.png differ diff --git a/assets/images/gooseteam-agents-61bd50464e81d67f3f51ce2e3a2be223.png b/assets/images/gooseteam-agents-61bd50464e81d67f3f51ce2e3a2be223.png new file mode 100644 index 00000000..eeda1738 Binary files /dev/null and b/assets/images/gooseteam-agents-61bd50464e81d67f3f51ce2e3a2be223.png differ diff --git a/assets/images/gooseteam-mcp-082fa2890c313519c2a1637ca979c219.png b/assets/images/gooseteam-mcp-082fa2890c313519c2a1637ca979c219.png new file mode 100644 index 00000000..283aea80 Binary files /dev/null and b/assets/images/gooseteam-mcp-082fa2890c313519c2a1637ca979c219.png differ diff --git a/assets/images/gpt-4-5-preview-1cd4983ce3ceafaf22b12dff95ed4ad1.gif b/assets/images/gpt-4-5-preview-1cd4983ce3ceafaf22b12dff95ed4ad1.gif new file mode 100644 index 00000000..5f7e8549 Binary files /dev/null and b/assets/images/gpt-4-5-preview-1cd4983ce3ceafaf22b12dff95ed4ad1.gif differ diff --git a/assets/images/gpt-4.5-preview-99cafaf409ffbc47a8186ed0a5c05043.png b/assets/images/gpt-4.5-preview-99cafaf409ffbc47a8186ed0a5c05043.png new file mode 100644 index 00000000..141d4e8d Binary files /dev/null and b/assets/images/gpt-4.5-preview-99cafaf409ffbc47a8186ed0a5c05043.png differ diff --git a/assets/images/gpt-4o-8b238b9d92ca62e7480ab6f12faeedfa.png b/assets/images/gpt-4o-8b238b9d92ca62e7480ab6f12faeedfa.png new file mode 100644 index 00000000..ecc5c3cf Binary files /dev/null and b/assets/images/gpt-4o-8b238b9d92ca62e7480ab6f12faeedfa.png differ diff --git a/assets/images/gpt-4o-cbdbf0c788605e797fb8f4ea9b987b8c.gif b/assets/images/gpt-4o-cbdbf0c788605e797fb8f4ea9b987b8c.gif new file mode 100644 index 00000000..7d494e8a Binary files /dev/null and b/assets/images/gpt-4o-cbdbf0c788605e797fb8f4ea9b987b8c.gif differ diff --git a/assets/images/gpt-4o-mini-37fbaf84ea5c2d7d57a9b4e7ddf4fb3b.png b/assets/images/gpt-4o-mini-37fbaf84ea5c2d7d57a9b4e7ddf4fb3b.png new file mode 100644 index 00000000..636dc369 Binary files /dev/null and b/assets/images/gpt-4o-mini-37fbaf84ea5c2d7d57a9b4e7ddf4fb3b.png differ diff --git a/assets/images/gpt-4o-mini-9e4478259ad6e3e4353394c0b3f19126.gif b/assets/images/gpt-4o-mini-9e4478259ad6e3e4353394c0b3f19126.gif new file mode 100644 index 00000000..dc0590dd Binary files /dev/null and b/assets/images/gpt-4o-mini-9e4478259ad6e3e4353394c0b3f19126.gif differ diff --git a/assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png b/assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png new file mode 100644 index 00000000..2ccd48b4 Binary files /dev/null and b/assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png differ diff --git a/assets/images/interactive-loop-55558c45ba877033b3bd355c500150ef.png b/assets/images/interactive-loop-55558c45ba877033b3bd355c500150ef.png new file mode 100644 index 00000000..a2cc63b6 Binary files /dev/null and b/assets/images/interactive-loop-55558c45ba877033b3bd355c500150ef.png differ diff --git a/assets/images/introducing-codename-goose-89cac25816e0ea215dd47d4b9768c8ab.png b/assets/images/introducing-codename-goose-89cac25816e0ea215dd47d4b9768c8ab.png new file mode 100644 index 00000000..58ff2cde Binary files /dev/null and b/assets/images/introducing-codename-goose-89cac25816e0ea215dd47d4b9768c8ab.png differ diff --git a/assets/images/james-89c46143c593bee36832667ded97233c.png b/assets/images/james-89c46143c593bee36832667ded97233c.png new file mode 100644 index 00000000..35e9401d Binary files /dev/null and b/assets/images/james-89c46143c593bee36832667ded97233c.png differ diff --git a/assets/images/llama3.3.70b-instruct-q4_K_M-91e7e0436dd5b7530fc18ff39366369d.png b/assets/images/llama3.3.70b-instruct-q4_K_M-91e7e0436dd5b7530fc18ff39366369d.png new file mode 100644 index 00000000..51720319 Binary files /dev/null and b/assets/images/llama3.3.70b-instruct-q4_K_M-91e7e0436dd5b7530fc18ff39366369d.png differ diff --git a/assets/images/llama3.3.70b-instruct-q8_0-9477c2fcd3abc509fa4855d9633be812.png b/assets/images/llama3.3.70b-instruct-q8_0-9477c2fcd3abc509fa4855d9633be812.png new file mode 100644 index 00000000..6093161e Binary files /dev/null and b/assets/images/llama3.3.70b-instruct-q8_0-9477c2fcd3abc509fa4855d9633be812.png differ diff --git a/assets/images/llama4-2ebc0ab8f18d31c450ee2bf34aa82191.png b/assets/images/llama4-2ebc0ab8f18d31c450ee2bf34aa82191.png new file mode 100644 index 00000000..d97f692a Binary files /dev/null and b/assets/images/llama4-2ebc0ab8f18d31c450ee2bf34aa82191.png differ diff --git a/assets/images/llm-agent-test-86ce2379ce4dde48ae1448f0f9d75c1f.png b/assets/images/llm-agent-test-86ce2379ce4dde48ae1448f0f9d75c1f.png new file mode 100644 index 00000000..33476d49 Binary files /dev/null and b/assets/images/llm-agent-test-86ce2379ce4dde48ae1448f0f9d75c1f.png differ diff --git a/assets/images/mcp-for-enterprise-5912379e407d5f5139b2636dcfc138f5.png b/assets/images/mcp-for-enterprise-5912379e407d5f5139b2636dcfc138f5.png new file mode 100644 index 00000000..3a83f0a3 Binary files /dev/null and b/assets/images/mcp-for-enterprise-5912379e407d5f5139b2636dcfc138f5.png differ diff --git a/assets/images/mcp-for-enterprise-social-bb8a18872fedc0046ef72bb413dea851.png b/assets/images/mcp-for-enterprise-social-bb8a18872fedc0046ef72bb413dea851.png new file mode 100644 index 00000000..0ed72685 Binary files /dev/null and b/assets/images/mcp-for-enterprise-social-bb8a18872fedc0046ef72bb413dea851.png differ diff --git a/assets/images/mcp-planner-761303c5ddcd5c79ed853536e3f87bcf.png b/assets/images/mcp-planner-761303c5ddcd5c79ed853536e3f87bcf.png new file mode 100644 index 00000000..46c35f3c Binary files /dev/null and b/assets/images/mcp-planner-761303c5ddcd5c79ed853536e3f87bcf.png differ diff --git a/assets/images/mcp-servers-cover-99742334f4c2581d18eb092cd0c737f9.png b/assets/images/mcp-servers-cover-99742334f4c2581d18eb092cd0c737f9.png new file mode 100644 index 00000000..174e7cdd Binary files /dev/null and b/assets/images/mcp-servers-cover-99742334f4c2581d18eb092cd0c737f9.png differ diff --git a/assets/images/mcp-tool-list-6ca350d7f5679d32dbc1c8337b55f2e4.png b/assets/images/mcp-tool-list-6ca350d7f5679d32dbc1c8337b55f2e4.png new file mode 100644 index 00000000..d797f9c9 Binary files /dev/null and b/assets/images/mcp-tool-list-6ca350d7f5679d32dbc1c8337b55f2e4.png differ diff --git a/assets/images/mcp-use-cases-758ecc959d6334783257fc9d6329e1f2.png b/assets/images/mcp-use-cases-758ecc959d6334783257fc9d6329e1f2.png new file mode 100644 index 00000000..0398215d Binary files /dev/null and b/assets/images/mcp-use-cases-758ecc959d6334783257fc9d6329e1f2.png differ diff --git a/assets/images/mcp-workflow-9ef765371217ef59184cfddbbede89a4.png b/assets/images/mcp-workflow-9ef765371217ef59184cfddbbede89a4.png new file mode 100644 index 00000000..9ce4289d Binary files /dev/null and b/assets/images/mcp-workflow-9ef765371217ef59184cfddbbede89a4.png differ diff --git a/assets/images/mcp_nondevs-5ce7f39de923cab01de6e14e5dc06744.png b/assets/images/mcp_nondevs-5ce7f39de923cab01de6e14e5dc06744.png new file mode 100644 index 00000000..a368328a Binary files /dev/null and b/assets/images/mcp_nondevs-5ce7f39de923cab01de6e14e5dc06744.png differ diff --git a/assets/images/mcpblog-40894789122bda594a8576ebcb67a2d8.png b/assets/images/mcpblog-40894789122bda594a8576ebcb67a2d8.png new file mode 100644 index 00000000..250fde79 Binary files /dev/null and b/assets/images/mcpblog-40894789122bda594a8576ebcb67a2d8.png differ diff --git a/assets/images/mcpsafety-87eb7ace7163a5edbe068ff75b79a199.png b/assets/images/mcpsafety-87eb7ace7163a5edbe068ff75b79a199.png new file mode 100644 index 00000000..7df094a3 Binary files /dev/null and b/assets/images/mcpsafety-87eb7ace7163a5edbe068ff75b79a199.png differ diff --git a/assets/images/mistral-nemo_index-4866f9a20a1294585adef2dc4fbc4ade.png b/assets/images/mistral-nemo_index-4866f9a20a1294585adef2dc4fbc4ade.png new file mode 100644 index 00000000..53c7f1d3 Binary files /dev/null and b/assets/images/mistral-nemo_index-4866f9a20a1294585adef2dc4fbc4ade.png differ diff --git a/assets/images/model_sizes_vs_score-6512491865ea8ed96119245f1f21687e.png b/assets/images/model_sizes_vs_score-6512491865ea8ed96119245f1f21687e.png new file mode 100644 index 00000000..392d3c41 Binary files /dev/null and b/assets/images/model_sizes_vs_score-6512491865ea8ed96119245f1f21687e.png differ diff --git a/assets/images/multi-model-ai-agent-d408feaeba3e13cafdbfe9377980bc3d.png b/assets/images/multi-model-ai-agent-d408feaeba3e13cafdbfe9377980bc3d.png new file mode 100644 index 00000000..a653e326 Binary files /dev/null and b/assets/images/multi-model-ai-agent-d408feaeba3e13cafdbfe9377980bc3d.png differ diff --git a/assets/images/neumorphism-calendar-50b2536c0ecf7410320e7ad81005d1b7.png b/assets/images/neumorphism-calendar-50b2536c0ecf7410320e7ad81005d1b7.png new file mode 100644 index 00000000..405fd190 Binary files /dev/null and b/assets/images/neumorphism-calendar-50b2536c0ecf7410320e7ad81005d1b7.png differ diff --git a/assets/images/o1-134e3913d813a9e797e979c42a92fa3f.gif b/assets/images/o1-134e3913d813a9e797e979c42a92fa3f.gif new file mode 100644 index 00000000..42f11054 Binary files /dev/null and b/assets/images/o1-134e3913d813a9e797e979c42a92fa3f.gif differ diff --git a/assets/images/o1-9a41312ec15fa512b13f215c94dc1335.png b/assets/images/o1-9a41312ec15fa512b13f215c94dc1335.png new file mode 100644 index 00000000..2e492516 Binary files /dev/null and b/assets/images/o1-9a41312ec15fa512b13f215c94dc1335.png differ diff --git a/assets/images/o3-mini-0da4fd28bcb174906ff6b2664c08e88d.png b/assets/images/o3-mini-0da4fd28bcb174906ff6b2664c08e88d.png new file mode 100644 index 00000000..a27b7748 Binary files /dev/null and b/assets/images/o3-mini-0da4fd28bcb174906ff6b2664c08e88d.png differ diff --git a/assets/images/o3-mini-7a869a80bf99f27dd7454830ae309184.gif b/assets/images/o3-mini-7a869a80bf99f27dd7454830ae309184.gif new file mode 100644 index 00000000..41b146f2 Binary files /dev/null and b/assets/images/o3-mini-7a869a80bf99f27dd7454830ae309184.gif differ diff --git a/assets/images/openhands-7fe1d878c7108c846e6275ed3157be6e.png b/assets/images/openhands-7fe1d878c7108c846e6275ed3157be6e.png new file mode 100644 index 00000000..7eb19cb6 Binary files /dev/null and b/assets/images/openhands-7fe1d878c7108c846e6275ed3157be6e.png differ diff --git a/assets/images/openrouter_toolcalls-01ef22c3d91ff5580c49b89f6599293f.png b/assets/images/openrouter_toolcalls-01ef22c3d91ff5580c49b89f6599293f.png new file mode 100644 index 00000000..a1e170bb Binary files /dev/null and b/assets/images/openrouter_toolcalls-01ef22c3d91ff5580c49b89f6599293f.png differ diff --git a/assets/images/phi4-toolshim-mistral-nemo-db0e5f6075b793b2b6facfa483fc9a5d.png b/assets/images/phi4-toolshim-mistral-nemo-db0e5f6075b793b2b6facfa483fc9a5d.png new file mode 100644 index 00000000..693734f0 Binary files /dev/null and b/assets/images/phi4-toolshim-mistral-nemo-db0e5f6075b793b2b6facfa483fc9a5d.png differ diff --git a/assets/images/phi4-toolshim-qwen2.5-coder7b-632ebfc62d7e69db76bc030235990574.png b/assets/images/phi4-toolshim-qwen2.5-coder7b-632ebfc62d7e69db76bc030235990574.png new file mode 100644 index 00000000..33cb34c4 Binary files /dev/null and b/assets/images/phi4-toolshim-qwen2.5-coder7b-632ebfc62d7e69db76bc030235990574.png differ diff --git a/assets/images/players-e2b075360b81c342d61ed84bc51c1e97.png b/assets/images/players-e2b075360b81c342d61ed84bc51c1e97.png new file mode 100644 index 00000000..f76777bb Binary files /dev/null and b/assets/images/players-e2b075360b81c342d61ed84bc51c1e97.png differ diff --git a/assets/images/politenessprompt-8bde8ee9a219af685f98f45be5977226.png b/assets/images/politenessprompt-8bde8ee9a219af685f98f45be5977226.png new file mode 100644 index 00000000..c08ca8d3 Binary files /dev/null and b/assets/images/politenessprompt-8bde8ee9a219af685f98f45be5977226.png differ diff --git a/assets/images/process-improvement-chart-eea292cb14dd3519f36cada6314ea694.png b/assets/images/process-improvement-chart-eea292cb14dd3519f36cada6314ea694.png new file mode 100644 index 00000000..b594a061 Binary files /dev/null and b/assets/images/process-improvement-chart-eea292cb14dd3519f36cada6314ea694.png differ diff --git a/assets/images/process-overview-diagram-11aa53158f5a0484351b12fe602dae1b.png b/assets/images/process-overview-diagram-11aa53158f5a0484351b12fe602dae1b.png new file mode 100644 index 00000000..1ebdcb06 Binary files /dev/null and b/assets/images/process-overview-diagram-11aa53158f5a0484351b12fe602dae1b.png differ diff --git a/assets/images/programmer-jokes-fetch-mcp-ccb6ac3de6a6a9ecec6f529638d2049a.png b/assets/images/programmer-jokes-fetch-mcp-ccb6ac3de6a6a9ecec6f529638d2049a.png new file mode 100644 index 00000000..6e337bbc Binary files /dev/null and b/assets/images/programmer-jokes-fetch-mcp-ccb6ac3de6a6a9ecec6f529638d2049a.png differ diff --git a/assets/images/prompt-078b12695f95c4f0eac3861a8a2611ef.png b/assets/images/prompt-078b12695f95c4f0eac3861a8a2611ef.png new file mode 100644 index 00000000..bed0c45f Binary files /dev/null and b/assets/images/prompt-078b12695f95c4f0eac3861a8a2611ef.png differ diff --git a/assets/images/qwen2.5-coder-32b-ceca4ac06aaf0f42f3d6b65363c60e3e.gif b/assets/images/qwen2.5-coder-32b-ceca4ac06aaf0f42f3d6b65363c60e3e.gif new file mode 100644 index 00000000..dcf364bd Binary files /dev/null and b/assets/images/qwen2.5-coder-32b-ceca4ac06aaf0f42f3d6b65363c60e3e.gif differ diff --git a/assets/images/qwen2.5-coder.14b-dfb90e9a247737df599d7736e982fa64.png b/assets/images/qwen2.5-coder.14b-dfb90e9a247737df599d7736e982fa64.png new file mode 100644 index 00000000..374d36db Binary files /dev/null and b/assets/images/qwen2.5-coder.14b-dfb90e9a247737df599d7736e982fa64.png differ diff --git a/assets/images/qwen2.5-coder.32b-e540b5187a35326045a1810070188b68.png b/assets/images/qwen2.5-coder.32b-e540b5187a35326045a1810070188b68.png new file mode 100644 index 00000000..e6c93577 Binary files /dev/null and b/assets/images/qwen2.5-coder.32b-e540b5187a35326045a1810070188b68.png differ diff --git a/assets/images/qwen2.5.14b-5f613200d90cb8f8e5242cefab130ed2.png b/assets/images/qwen2.5.14b-5f613200d90cb8f8e5242cefab130ed2.png new file mode 100644 index 00000000..16f009bb Binary files /dev/null and b/assets/images/qwen2.5.14b-5f613200d90cb8f8e5242cefab130ed2.png differ diff --git a/assets/images/qwen2.5.32b-cf589a3b4494e4f75a63f3b7c8f13923.png b/assets/images/qwen2.5.32b-cf589a3b4494e4f75a63f3b7c8f13923.png new file mode 100644 index 00000000..1ae8b93a Binary files /dev/null and b/assets/images/qwen2.5.32b-cf589a3b4494e4f75a63f3b7c8f13923.png differ diff --git a/assets/images/qwq-2df978b1c23d170ed2bf2d2caf5c3ecd.png b/assets/images/qwq-2df978b1c23d170ed2bf2d2caf5c3ecd.png new file mode 100644 index 00000000..d5e40e10 Binary files /dev/null and b/assets/images/qwq-2df978b1c23d170ed2bf2d2caf5c3ecd.png differ diff --git a/assets/images/qwq-3a05f474ec77049ba53a0439b36df0ba.gif b/assets/images/qwq-3a05f474ec77049ba53a0439b36df0ba.gif new file mode 100644 index 00000000..5940bf04 Binary files /dev/null and b/assets/images/qwq-3a05f474ec77049ba53a0439b36df0ba.gif differ diff --git a/assets/images/responsible-vibe-code-a77f5e24a879edda943cc76f1fc0bd2a.png b/assets/images/responsible-vibe-code-a77f5e24a879edda943cc76f1fc0bd2a.png new file mode 100644 index 00000000..644ad961 Binary files /dev/null and b/assets/images/responsible-vibe-code-a77f5e24a879edda943cc76f1fc0bd2a.png differ diff --git a/assets/images/sandbox-0b0f5e6f871cbf48ea1a0be243440aa1.png b/assets/images/sandbox-0b0f5e6f871cbf48ea1a0be243440aa1.png new file mode 100644 index 00000000..51906338 Binary files /dev/null and b/assets/images/sandbox-0b0f5e6f871cbf48ea1a0be243440aa1.png differ diff --git a/assets/images/screenshot-calendar-og-fbaf4b2c4843cce8e2f0ea735c04676b.png b/assets/images/screenshot-calendar-og-fbaf4b2c4843cce8e2f0ea735c04676b.png new file mode 100644 index 00000000..82e6f8e8 Binary files /dev/null and b/assets/images/screenshot-calendar-og-fbaf4b2c4843cce8e2f0ea735c04676b.png differ diff --git a/assets/images/screenshot-driven-development-4ed1beaa10c6062c0bf87e2d27590ad6.png b/assets/images/screenshot-driven-development-4ed1beaa10c6062c0bf87e2d27590ad6.png new file mode 100644 index 00000000..13051aca Binary files /dev/null and b/assets/images/screenshot-driven-development-4ed1beaa10c6062c0bf87e2d27590ad6.png differ diff --git a/assets/images/securing-mcp-5e475e91c0e621afa33e30b3d89ef065.png b/assets/images/securing-mcp-5e475e91c0e621afa33e30b3d89ef065.png new file mode 100644 index 00000000..dc491a99 Binary files /dev/null and b/assets/images/securing-mcp-5e475e91c0e621afa33e30b3d89ef065.png differ diff --git a/assets/images/set-up-provider-ui-a6ba5f66d16937ee91dbad22c101c232.png b/assets/images/set-up-provider-ui-a6ba5f66d16937ee91dbad22c101c232.png new file mode 100644 index 00000000..ccd1ba7e Binary files /dev/null and b/assets/images/set-up-provider-ui-a6ba5f66d16937ee91dbad22c101c232.png differ diff --git a/assets/images/sketch-0bb4b0e6fb7fdbd194fff4db41c3806f.png b/assets/images/sketch-0bb4b0e6fb7fdbd194fff4db41c3806f.png new file mode 100644 index 00000000..57b46451 Binary files /dev/null and b/assets/images/sketch-0bb4b0e6fb7fdbd194fff4db41c3806f.png differ diff --git a/assets/images/speaker-bd71c5b83c6e0cd202ea8aa8af867b58.jpg b/assets/images/speaker-bd71c5b83c6e0cd202ea8aa8af867b58.jpg new file mode 100644 index 00000000..dcf43b9e Binary files /dev/null and b/assets/images/speaker-bd71c5b83c6e0cd202ea8aa8af867b58.jpg differ diff --git a/assets/images/speaker1-45d20237329fb76d724e73b6ee1f7a89.jpg b/assets/images/speaker1-45d20237329fb76d724e73b6ee1f7a89.jpg new file mode 100644 index 00000000..dc85c085 Binary files /dev/null and b/assets/images/speaker1-45d20237329fb76d724e73b6ee1f7a89.jpg differ diff --git a/assets/images/swag-8eaec6e42aea06511f6334c6e9e21ec1.jpg b/assets/images/swag-8eaec6e42aea06511f6334c6e9e21ec1.jpg new file mode 100644 index 00000000..ee083017 Binary files /dev/null and b/assets/images/swag-8eaec6e42aea06511f6334c6e9e21ec1.jpg differ diff --git a/assets/images/swag1-7e7ee0095446a64f5dbcffe6b5b69460.jpg b/assets/images/swag1-7e7ee0095446a64f5dbcffe6b5b69460.jpg new file mode 100644 index 00000000..fdaa0be0 Binary files /dev/null and b/assets/images/swag1-7e7ee0095446a64f5dbcffe6b5b69460.jpg differ diff --git a/assets/images/swag2-6ed2a0029c159d14013e366f6f945268.jpg b/assets/images/swag2-6ed2a0029c159d14013e366f6f945268.jpg new file mode 100644 index 00000000..085f7cf8 Binary files /dev/null and b/assets/images/swag2-6ed2a0029c159d14013e366f6f945268.jpg differ diff --git a/assets/images/swag3-50d943bd7ee6e68c65ad0bed5e339f9a.jpg b/assets/images/swag3-50d943bd7ee6e68c65ad0bed5e339f9a.jpg new file mode 100644 index 00000000..34b206e2 Binary files /dev/null and b/assets/images/swag3-50d943bd7ee6e68c65ad0bed5e339f9a.jpg differ diff --git a/assets/images/tokens_vs_score-729f597c3ada0924c0c400b17459a3f3.png b/assets/images/tokens_vs_score-729f597c3ada0924c0c400b17459a3f3.png new file mode 100644 index 00000000..acc23add Binary files /dev/null and b/assets/images/tokens_vs_score-729f597c3ada0924c0c400b17459a3f3.png differ diff --git a/assets/images/tool_calls_vs_score-bb8723cbd0a4509b1776776fb54ec07b.png b/assets/images/tool_calls_vs_score-bb8723cbd0a4509b1776776fb54ec07b.png new file mode 100644 index 00000000..5c8b6479 Binary files /dev/null and b/assets/images/tool_calls_vs_score-bb8723cbd0a4509b1776776fb54ec07b.png differ diff --git a/assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png b/assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png new file mode 100644 index 00000000..f7430cf4 Binary files /dev/null and b/assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png differ diff --git a/assets/images/vibe-coding-b2efeed37ea43f4773da5f1ff96f4184.png b/assets/images/vibe-coding-b2efeed37ea43f4773da5f1ff96f4184.png new file mode 100644 index 00000000..b8c0cf32 Binary files /dev/null and b/assets/images/vibe-coding-b2efeed37ea43f4773da5f1ff96f4184.png differ diff --git a/assets/images/visualguide-9b44af19be52631e84712cad31849bee.png b/assets/images/visualguide-9b44af19be52631e84712cad31849bee.png new file mode 100644 index 00000000..c65c48c6 Binary files /dev/null and b/assets/images/visualguide-9b44af19be52631e84712cad31849bee.png differ diff --git a/assets/images/vscodestream-74eafa34e7ae10cfb738feddecc98519.png b/assets/images/vscodestream-74eafa34e7ae10cfb738feddecc98519.png new file mode 100644 index 00000000..de277b26 Binary files /dev/null and b/assets/images/vscodestream-74eafa34e7ae10cfb738feddecc98519.png differ diff --git a/assets/images/youtubeMcp-3701319613ac205084485a6ee8f8c41f.png b/assets/images/youtubeMcp-3701319613ac205084485a6ee8f8c41f.png new file mode 100644 index 00000000..6200f84e Binary files /dev/null and b/assets/images/youtubeMcp-3701319613ac205084485a6ee8f8c41f.png differ diff --git a/assets/js/00bbba72.62db6ec2.js b/assets/js/00bbba72.62db6ec2.js new file mode 100644 index 00000000..91be426a --- /dev/null +++ b/assets/js/00bbba72.62db6ec2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2627],{14301:(e,l,n)=>{n.r(l),n.d(l,{assets:()=>r,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"experimental/ollama","title":"Ollama Tool Shim","description":"The Ollama tool shim is an experimental feature that enables tool calling capabilities for language models that don\'t natively support tool calling (like DeepSeek). It works by instructing the primary model to output json for intended tool usage, the interpretive model uses ollama structured outputs to translate the primary model\'s message into valid json, and then that json is translated into valid tool calls to be invoked.","source":"@site/docs/experimental/ollama.md","sourceDirName":"experimental","slug":"/experimental/ollama","permalink":"/goose/docs/experimental/ollama","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Ollama Tool Shim","sidebar_position":2,"sidebar_label":"Ollama Tool Shim"},"sidebar":"tutorialSidebar","previous":{"title":"Subagents","permalink":"/goose/docs/experimental/subagents"},"next":{"title":"Goose Mobile","permalink":"/goose/docs/experimental/goose-mobile"}}');var t=n(74848),a=n(28453);const s={title:"Ollama Tool Shim",sidebar_position:2,sidebar_label:"Ollama Tool Shim"},i=void 0,r={},d=[{value:"How to use the Ollama Tool Shim",id:"how-to-use-the-ollama-tool-shim",level:4}];function c(e){const l={a:"a",code:"code",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(l.p,{children:"The Ollama tool shim is an experimental feature that enables tool calling capabilities for language models that don't natively support tool calling (like DeepSeek). It works by instructing the primary model to output json for intended tool usage, the interpretive model uses ollama structured outputs to translate the primary model's message into valid json, and then that json is translated into valid tool calls to be invoked."}),"\n",(0,t.jsx)(l.h4,{id:"how-to-use-the-ollama-tool-shim",children:"How to use the Ollama Tool Shim"}),"\n",(0,t.jsxs)(l.ol,{children:["\n",(0,t.jsxs)(l.li,{children:["\n",(0,t.jsxs)(l.p,{children:["Make sure you have ",(0,t.jsx)(l.a,{href:"https://ollama.com/download",children:"Ollama"})," installed and running"]}),"\n"]}),"\n",(0,t.jsxs)(l.li,{children:["\n",(0,t.jsxs)(l.p,{children:["The default interpreter model is ",(0,t.jsx)(l.code,{children:"mistral-nemo"}),", if you want to proceed with this, you have to pull it from ollama server by running:"]}),"\n",(0,t.jsx)(l.pre,{children:(0,t.jsx)(l.code,{className:"language-bash",children:"ollama pull mistral-nemo\n"})}),"\n"]}),"\n",(0,t.jsxs)(l.li,{children:["\n",(0,t.jsxs)(l.p,{children:["If you want to use a different model, make sure to pull it first from the Ollama server. Then override the default interpreter model using the ",(0,t.jsx)(l.code,{children:"GOOSE_TOOLSHIM_OLLAMA_MODEL"})," environment variable. For example, to use the ",(0,t.jsx)(l.code,{children:"llama3.2"})," model, run:"]}),"\n",(0,t.jsx)(l.pre,{children:(0,t.jsx)(l.code,{className:"language-bash",children:"ollama pull llama3.2\n"})}),"\n",(0,t.jsx)(l.p,{children:"Then,"}),"\n",(0,t.jsx)(l.pre,{children:(0,t.jsx)(l.code,{className:"language-bash",children:"GOOSE_TOOLSHIM_OLLAMA_MODEL=llama3.2 \n"})}),"\n"]}),"\n",(0,t.jsxs)(l.li,{children:["\n",(0,t.jsx)(l.p,{children:"For optimal performance, run the Ollama server with an increased context length:"}),"\n",(0,t.jsx)(l.pre,{children:(0,t.jsx)(l.code,{className:"language-bash",children:"OLLAMA_CONTEXT_LENGTH=32768 ollama serve\n"})}),"\n"]}),"\n",(0,t.jsxs)(l.li,{children:["\n",(0,t.jsxs)(l.p,{children:["Enable the tool shim by setting the ",(0,t.jsx)(l.code,{children:"GOOSE_TOOLSHIM"})," environment variable:"]}),"\n",(0,t.jsx)(l.pre,{children:(0,t.jsx)(l.code,{className:"language-bash",children:"GOOSE_TOOLSHIM=1 \n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(l.p,{children:"Start a new Goose session with your tool shim preferences:"}),"\n",(0,t.jsx)(l.pre,{children:(0,t.jsx)(l.code,{className:"language-bash",children:"GOOSE_TOOLSHIM=1 GOOSE_TOOLSHIM_OLLAMA_MODEL=llama3.2 cargo run --bin goose session\n"})})]})}function m(e={}){const{wrapper:l}={...(0,a.R)(),...e.components};return l?(0,t.jsx)(l,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},28453:(e,l,n)=>{n.d(l,{R:()=>s,x:()=>i});var o=n(96540);const t={},a=o.createContext(t);function s(e){const l=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(l):{...l,...e}}),[l,e])}function i(e){let l;return l=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(a.Provider,{value:l},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03586272.f58abcb3.js b/assets/js/03586272.f58abcb3.js new file mode 100644 index 00000000..febd584a --- /dev/null +++ b/assets/js/03586272.f58abcb3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3780],{48129:(n,e,i)=>{i.r(e),i.d(e,{default:()=>a});i(96540);var t=i(43938),r=i(58069),s=i(74848);const a=()=>(0,s.jsx)(t.A,{title:"Types",description:"Type definitions for the Prompt Library",children:(0,s.jsxs)("div",{className:"container margin-vert--lg",children:[(0,s.jsx)("h1",{children:"Type Definitions"}),(0,s.jsx)("p",{children:"This page contains the type definitions used in the Prompt Library."}),(0,s.jsx)("h2",{children:"Environment Variable"}),(0,s.jsx)(r.A,{language:"typescript",children:"type EnvironmentVariable = {\n name: string;\n description: string;\n required: boolean;\n};"}),(0,s.jsx)("h2",{children:"Extension"}),(0,s.jsx)(r.A,{language:"typescript",children:"type Extension = {\n name: string;\n command: string;\n is_builtin: boolean;\n link?: string;\n installation_notes?: string;\n environmentVariables?: EnvironmentVariable[];\n};"}),(0,s.jsx)("h2",{children:"Category"}),(0,s.jsx)(r.A,{language:"typescript",children:'type Category = "business" | "technical" | "productivity";'}),(0,s.jsx)("h2",{children:"Prompt"}),(0,s.jsx)(r.A,{language:"typescript",children:"type Prompt = {\n id: string;\n title: string;\n description: string;\n example_prompt: string;\n extensions: Extension[];\n category: Category;\n featured?: boolean;\n};"})]})})}}]); \ No newline at end of file diff --git a/assets/js/04e255ea.db813924.js b/assets/js/04e255ea.db813924.js new file mode 100644 index 00000000..980ef161 --- /dev/null +++ b/assets/js/04e255ea.db813924.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1270],{80088:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var o=n(96540),s=n(56347),r=n(74848);function c(){const e=(0,s.zy)();return(0,o.useEffect)((()=>{const t=new URLSearchParams(e.search);window.location.href="goose://extension"+(t.toString()?"?"+t.toString():"")}),[e]),(0,r.jsx)("div",{style:{padding:"2rem",textAlign:"center"},children:"Redirecting to Goose..."})}}}]); \ No newline at end of file diff --git a/assets/js/07691c2f.83c29347.js b/assets/js/07691c2f.83c29347.js new file mode 100644 index 00000000..474d9c4c --- /dev/null +++ b/assets/js/07691c2f.83c29347.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,3895,5339,5815,5821,7720,8196,8202],{33283:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"mcp/elevenlabs-mcp","title":"ElevenLabs Extension","description":"Add ElevenLabs MCP Server as a Goose Extension","source":"@site/docs/mcp/elevenlabs-mcp.md","sourceDirName":"mcp","slug":"/mcp/elevenlabs-mcp","permalink":"/goose/docs/mcp/elevenlabs-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"ElevenLabs Extension","description":"Add ElevenLabs MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Developer Extension","permalink":"/goose/docs/mcp/developer-mcp"},"next":{"title":"Fetch Extension","permalink":"/goose/docs/mcp/fetch-mcp"}}');var s=t(74848),i=t(28453),r=t(65537),l=t(79329),a=t(25887);const c={title:"ElevenLabs Extension",description:"Add ElevenLabs MCP Server as a Goose Extension"},d=void 0,u={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function p(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.A,{videoUrl:"https://www.youtube.com/embed/1Z8XtjQ9El0"}),"\n",(0,s.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,s.jsx)(n.a,{href:"https://github.com/yamadashy/repomix",children:"ElevenLabs MCP Server"})," as a Goose extension to enable AI-powered voice generation, voice cloning, audio editing, and speech-to-text transcription."]}),"\n",(0,s.jsxs)(n.admonition,{title:"TLDR",type:"tip",children:[(0,s.jsxs)(r.A,{groupId:"interface",children:[(0,s.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"goose://extension?cmd=uvx&arg=elevenlabs-mcp&id=elevenlabs&name=ElevenLabs&description=ElevenLabs%20voice%20synthesis%20server&env=ELEVENLABS_API_KEY",children:"Launch the installer"})})}),(0,s.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Command"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"uvx elevenlabs-mcp\n"})})]})]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Environment Variable"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"ELEVENLABS_API_KEY: \n"})})]}),"\n",(0,s.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Note that you'll need ",(0,s.jsx)(n.a,{href:"https://docs.astral.sh/uv/#installation",children:"uv"})," installed on your system to run this command, as it uses ",(0,s.jsx)(n.code,{children:"uvx"}),"."]})}),"\n",(0,s.jsxs)(r.A,{groupId:"interface",children:[(0,s.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"goose://extension?cmd=uvx&arg=elevenlabs-mcp&id=elevenlabs&name=ElevenLabs&description=ElevenLabs%20voice%20synthesis%20server&env=ELEVENLABS_API_KEY",children:"Launch the installer"})}),"\n",(0,s.jsxs)(n.li,{children:["Press ",(0,s.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Save Configuration"})]}),"\n",(0,s.jsxs)(n.li,{children:["Scroll to the top and click ",(0,s.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,s.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Run the ",(0,s.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["Choose to add a ",(0,s.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 elevenlabs\n // highlight-end\n \u2514 \n"})}),(0,s.jsxs)(n.ol,{start:"4",children:["\n",(0,s.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 elevenlabs\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 uvx elevenlabs-mcp\n // highlight-end\n \u2514 \n"})}),(0,s.jsxs)(n.ol,{start:"5",children:["\n",(0,s.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 elevenlabs\n\u2502\n\u25c7 What command should be run?\n\u2502 uvx elevenlabs-mcp\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 300\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,s.jsxs)(n.ol,{start:"6",children:["\n",(0,s.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 elevenlabs\n \u2502\n \u25c7 What command should be run?\n \u2502 uvx elevenlabs-mcp\n \u2502\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n // highlight-start\n \u25c7 Would you like to add a description?\n \u2502 No\n // highlight-end\n \u2514 \n"})}),(0,s.jsxs)(n.ol,{start:"7",children:["\n",(0,s.jsxs)(n.li,{children:["Obtain an ",(0,s.jsx)(n.a,{href:"https://elevenlabs.io/app/settings/api-keys",children:"ElevenLabs API Key"})," and paste it in."]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 elevenlabs\n \u2502\n \u25c7 What command should be run?\n \u2502 uvx elevenlabs-mcp\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502 \n \u25c7 Would you like to add a description?\n \u2502 No \n | \n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 Yes \n \u2502\n \u25c7 Environment variable name:\n \u2502 ELEVENLABS_API_KEY\n \u2502\n \u25c7 Environment variable value:\n \u2502 \u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n \u2502\n \u25c7 Add another environment variable?\n \u2502 No \n // highlight-end\n \u2514 Added elevenlabs extension\n"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,s.jsx)(n.p,{children:"In this example, I\u2019ll show you how to use Goose with the ElevenLabs Extension to create AI-generated voiceovers for a YouTube Short. Goose will take a sample script I provided, generate a narrated version using different AI voices, and seamlessly switch tones mid-script to match the content flow."}),"\n",(0,s.jsx)(n.p,{children:"By connecting to the ElevenLabs MCP server, Goose can transform plain text into natural-sounding speech, offering multiple voice styles and character options \u2014 all without any manual recording or editing."}),"\n",(0,s.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Hey Goose, create a script for me for my youtube short video, I want there to be two different voices. The first voice should cut me off and be a human narrator style and then switch to a cassual AI tone after I read the prompt. Here's an example of a YT short script I've done in the past:"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Wait\u2026 Within Seconds, Goose performed Security Audits Across Multiple Projects?! \ud83d\udd25"}),"\n",(0,s.jsx)(n.p,{children:"Lets, plug & play to find out how"}),"\n",(0,s.jsx)(n.p,{children:"Let\u2019s provide Goose with the command it needs to connect to the Filesystem MCP server extension\u2026"}),"\n",(0,s.jsx)(n.p,{children:"Now lets play\npropmt: \"Hey Goose, I need to perform a security audit across multiple projects. Let's check for\u2026\ud83d\udd39 Hardcoded Credentials \u2013 API keys, passwords, and secrets left in the code.\ud83d\udd39 SQL Injection Risks \u2013 Unsafe queries that could expose data.\ud83d\udd39 Insecure Cryptographic Practices \u2013 Weak encryption methods that put data at risk.AND\ud83d\udd39 Exposed Config Files \u2013 Sensitive information that shouldn't be public.\ud83d\udd39 Outdated Dependencies \u2013 Security vulnerabilities in third-party libraries.\""}),"\n",(0,s.jsx)(n.p,{children:"Go Goose, go Goose!"}),"\n",(0,s.jsx)(n.p,{children:"\u2705 Goose scanned the entire codebase across 3 different projects, identified security risks, generated a detailed report with fixes and provided me with step by step instructions on how I can test and verify these code fixes!"}),"\n",(0,s.jsx)(n.p,{children:"If that\u2019s not amazing idk what is \u2026"}),"\n",(0,s.jsx)(n.p,{children:"\ud83d\ude80 to get started visit block.github.io/goose_"}),"\n",(0,s.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,s.jsxs)(n.admonition,{title:"Desktop",type:"note",children:[(0,s.jsx)(n.p,{children:"I'll create your YouTube script for you using the given script as reference."}),(0,s.jsx)(n.p,{children:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Text To Speech \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,s.jsx)(n.p,{children:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Text To Speech \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,s.jsx)(n.p,{children:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Text To Speech \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,s.jsx)(n.p,{children:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Text To Speech \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,s.jsx)(n.p,{children:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Text To Speech \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,s.jsx)(n.p,{children:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Play Audio \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,s.jsx)(n.p,{children:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Play Audio \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,s.jsx)(n.p,{children:"The script has been created and read aloud using the specified voices and style. The audio files have been saved to your desktop."}),(0,s.jsx)(n.p,{children:"Press play and hear it for yourself! \ud83d\udd0a"}),(0,s.jsxs)("audio",{controls:!0,children:[(0,s.jsx)("source",{src:"/goose/audio/elevenlabs-mcp-demo.mp3",type:"audio/mpeg"}),(0,s.jsx)(n.p,{children:"Your browser does not support the audio element."})]})]})]})}function m(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>P});var o=t(96540),s=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=o.Children.toArray(e),t=n.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),r=t?.props.children;return{mdxAdmonitionTitle:r,rest:i.length>0?(0,s.jsx)(s.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var r=t(34164),l=t(50539),a=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function p(e){let{type:n,className:t,children:o}=e;return(0,s.jsx)("div",{className:(0,r.A)(a.G.common.admonition,a.G.common.admonitionType(n),c,t),children:o})}function m(e){let{icon:n,title:t}=e;return(0,s.jsxs)("div",{className:d,children:[(0,s.jsx)("span",{className:u,children:n}),t]})}function x(e){let{children:n}=e;return n?(0,s.jsx)("div",{className:h,children:n}):null}function f(e){const{type:n,icon:t,title:o,children:i,className:r}=e;return(0,s.jsxs)(p,{type:n,className:r,children:[o||t?(0,s.jsx)(m,{title:o,icon:t}):null,(0,s.jsx)(x,{children:i})]})}function v(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const g={icon:(0,s.jsx)(v,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function j(e){return(0,s.jsx)(f,{...g,...e,className:(0,r.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,s.jsx)(b,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,s.jsx)(f,{...y,...e,className:(0,r.A)("alert alert--success",e.className),children:e.children})}function E(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const A={icon:(0,s.jsx)(E,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function k(e){return(0,s.jsx)(f,{...A,...e,className:(0,r.A)("alert alert--info",e.className),children:e.children})}function N(e){return(0,s.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const C={icon:(0,s.jsx)(N,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function I(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const T={icon:(0,s.jsx)(I,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const S={icon:(0,s.jsx)(N,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const L={...{note:j,tip:w,info:k,warning:function(e){return(0,s.jsx)(f,{...C,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,s.jsx)(f,{...T,...e,className:(0,r.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,s.jsx)(j,{title:"secondary",...e}),important:e=>(0,s.jsx)(k,{title:"important",...e}),success:e=>(0,s.jsx)(w,{title:"success",...e}),caution:function(e){return(0,s.jsx)(f,{...S,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})}}};function P(e){const n=i(e),t=(o=n.type,L[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),L.info));var o;return(0,s.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(34164);const s={tabItem:"tabItem_Ymn6"};var i=t(74848);function r(e){let{children:n,hidden:t,className:r}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,o.A)(s.tabItem,r),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),s=t(34164),i=t(65627),r=t(56347),l=t(50372),a=t(30604),c=t(11861),d=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:s}}=e;return{value:n,label:t,attributes:o,default:s}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const s=(0,r.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,a.aZ)(i),(0,o.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(s.location.search);n.set(i,e),s.replace({...s.location,search:n.toString()})}),[i,s])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,i=h(e),[r,a]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:i}))),[c,u]=m({queryString:t,groupId:s}),[x,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,i]=(0,d.Dv)(t);return[s,(0,o.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:s}),v=(()=>{const e=c??x;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{v&&a(v)}),[v]);return{selectedValue:r,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),f(e)}),[u,f,i]),tabValues:i}}var f=t(9136);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(74848);function j(e){let{className:n,block:t,selectedValue:o,selectValue:r,tabValues:l}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),s=l[t].value;s!==o&&(c(n),r(s))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{a.push(e)},onKeyDown:u,onClick:d,...i,className:(0,s.A)("tabs__item",v.tabItem,i?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:i}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===i));return e?(0,o.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=x(e);return(0,g.jsxs)("div",{className:(0,s.A)("tabs-container",v.tabList),children:[(0,g.jsx)(j,{...n,...e}),(0,g.jsx)(b,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,g.jsx)(y,{...e,children:u(e.children)},String(n))}},25887:(e,n,t)=>{t.d(n,{A:()=>i});t(96540);var o=t(52362),s=t(74848);const i=e=>{let{videoUrl:n}=e;return(0,s.jsxs)("div",{children:[(0,s.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,s.jsxs)("details",{children:[(0,s.jsx)("summary",{children:"Watch the demo"}),(0,s.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,s.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,s.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>l});var o=t(96540);const s={},i=o.createContext(s);function r(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09a1246f.19e2c876.js b/assets/js/09a1246f.19e2c876.js new file mode 100644 index 00000000..2a84c931 --- /dev/null +++ b/assets/js/09a1246f.19e2c876.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2622],{70014:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var o=s(14101),n=s(74848),i=s(28453);const a={title:"11 Practical Ways I Use AI Agents Without Losing My Authenticity",description:"From conference planning to prepping podcasts, here's how I use AI Agents built on MCP for everyday tasks.",authors:["rizel"]},r=void 0,c={authorsImageUrls:[void 0]},l=[];function p(e){const t={a:"a",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"mcp use cases",src:s(58488).A+"",width:"2240",height:"1260"})}),"\n",(0,n.jsx)(t.p,{children:"\"Stop using AI,\" reads yet another viral post. I get it. It's frustrating to review a colleague's auto-generated work, filled with AI's classic giveaways like generic code comments and phrases like \"In today's fast-paced world...\""}),"\n",(0,n.jsxs)(t.p,{children:["Still, AI plays a pivotal role in my career. I don't rely on AI to do my work, but I use it to help me brainstorm and work more effciently.\nThe introduction of ",(0,n.jsx)(t.a,{href:"https://modelcontextprotocol.io",children:"Model Context Protocol (MCP)"})," has made this even easier. MCP is an open standard that gives AI tools the context they need to be useful in the real world. It enables AI agents to interact with APIs, apps, and systems in a structured way. I use ",(0,n.jsx)(t.a,{href:"/",children:"Codename goose"}),", an open source AI agent built on MCP."]}),"\n",(0,n.jsx)(t.p,{children:"Here are 11 real ways I use AI Agents without sacrificing authenticity, creativity, or quality:"})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},58488:(e,t,s)=>{s.d(t,{A:()=>o});const o=s.p+"assets/images/mcp-use-cases-758ecc959d6334783257fc9d6329e1f2.png"},28453:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>r});var o=s(96540);const n={},i=o.createContext(n);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(i.Provider,{value:t},e.children)}},14101:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/21/practical-use-cases-of-ai","source":"@site/blog/2025-04-21-practical-use-cases-of-ai/index.md","title":"11 Practical Ways I Use AI Agents Without Losing My Authenticity","description":"From conference planning to prepping podcasts, here\'s how I use AI Agents built on MCP for everyday tasks.","date":"2025-04-21T00:00:00.000Z","tags":[],"readingTime":8.565,"hasTruncateMarker":true,"authors":[{"name":"Rizel Scarlett","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/rizel"},"socials":{"x":"https://x.com/blackgirlbytes","github":"https://github.com/blackgirlbytes","bluesky":"https://bsky.app/profile/blackgirlbytes.bsky.social","linkedin":"https://www.linkedin.com/in/rizel-bobb-semple/"},"imageURL":"https://avatars.githubusercontent.com/u/22990146?v=4","key":"rizel"}],"frontMatter":{"title":"11 Practical Ways I Use AI Agents Without Losing My Authenticity","description":"From conference planning to prepping podcasts, here\'s how I use AI Agents built on MCP for everyday tasks.","authors":["rizel"]},"unlisted":false,"prevItem":{"title":"MCP in the Enterprise: Real World Adoption at Block","permalink":"/goose/blog/2025/04/21/mcp-in-enterprise"},"nextItem":{"title":"Codename Goose Goes to New York","permalink":"/goose/blog/2025/04/17/goose-goes-to-NY"}}')}}]); \ No newline at end of file diff --git a/assets/js/0a45c249.23eb55cf.js b/assets/js/0a45c249.23eb55cf.js new file mode 100644 index 00000000..50163d88 --- /dev/null +++ b/assets/js/0a45c249.23eb55cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9765],{33083:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"permalink":"/goose/blog/README","source":"@site/blog/README.md","title":"Writing Blog Posts for Goose","description":"This guide explains how to write and structure blog posts for the Goose documentation site.","date":"2025-07-15T19:21:03.000Z","tags":[],"readingTime":3.305,"hasTruncateMarker":true,"authors":[],"frontMatter":{"unlisted":true},"unlisted":true}');var i=t(74848),s=t(28453);const l={unlisted:!0},o="Writing Blog Posts for Goose",a={authorsImageUrls:[]},c=[{value:"Getting Started",id:"getting-started",level:2},{value:"Directory Structure",id:"directory-structure",level:2},{value:"Frontmatter",id:"frontmatter",level:2},{value:"Header Image",id:"header-image",level:2},{value:"Content Structure",id:"content-structure",level:2},{value:"Introduction",id:"introduction",level:3},{value:"Truncate Tag",id:"truncate-tag",level:3},{value:"Headers",id:"headers",level:3},{value:"Code Blocks",id:"code-blocks",level:3},{value:"Images",id:"images",level:3},{value:"Social Media Tags",id:"social-media-tags",level:2},{value:"Author Information",id:"author-information",level:2},{value:"Best Practices",id:"best-practices",level:2},{value:"Previewing Your Blog Post",id:"previewing-your-blog-post",level:2},{value:"Troubleshooting Preview",id:"troubleshooting-preview",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"This guide explains how to write and structure blog posts for the Goose documentation site."}),"\n",(0,i.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Clone the Goose repository:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/block/goose.git\ncd goose\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Install dependencies:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd documentation\nnpm install\n"})}),"\n",(0,i.jsx)(n.h2,{id:"directory-structure",children:"Directory Structure"}),"\n",(0,i.jsx)(n.p,{children:"Blog posts are organized by date using the following format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"YYYY-MM-DD-post-title/\n\u251c\u2500\u2500 index.md\n\u2514\u2500\u2500 images/\n"})}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"2025-05-22-llm-agent-readiness/\n\u251c\u2500\u2500 index.md\n\u2514\u2500\u2500 llm-agent-test.png\n"})}),"\n",(0,i.jsx)(n.h2,{id:"frontmatter",children:"Frontmatter"}),"\n",(0,i.jsx)(n.p,{children:"Each blog post must begin with YAML frontmatter that includes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"---\ntitle: Your Blog Post Title\ndescription: A brief description of your post (1-2 sentences)\nauthors: \n - your_author_id\n---\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"authors"})," field should match your ID in the ",(0,i.jsx)(n.code,{children:"authors.yml"})," file. Multiple authors can be listed. ",(0,i.jsx)(n.a,{href:"#author-information",children:"More info on authors"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"header-image",children:"Header Image"}),"\n",(0,i.jsx)(n.p,{children:"After the frontmatter, include a header image using Markdown:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-markdown",children:"![blog cover](your-image.png)\n"})}),"\n",(0,i.jsx)(n.p,{children:"The header image should be:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Relevant to the post content"}),"\n",(0,i.jsx)(n.li,{children:"High quality (recommended dimensions: 1200 x 600 px)"}),"\n",(0,i.jsx)(n.li,{children:"Stored in the post's directory"}),"\n",(0,i.jsx)(n.li,{children:"Named descriptively"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"content-structure",children:"Content Structure"}),"\n",(0,i.jsx)(n.h3,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"Start with 1-2 paragraphs introducing the topic before the truncate tag. This will be what's shown on the blog index page."}),"\n",(0,i.jsx)(n.h3,{id:"truncate-tag",children:"Truncate Tag"}),"\n",(0,i.jsx)(n.p,{children:'Add the truncate tag after your introduction to create a "read more" break:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-markdown",children:"\x3c!-- truncate --\x3e\n"})}),"\n",(0,i.jsx)(n.h3,{id:"headers",children:"Headers"}),"\n",(0,i.jsx)(n.p,{children:"Use headers to organize your content hierarchically:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"#"})," (H1) - Used only for the post title in frontmatter"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"##"})," (H2) - Main sections"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"###"})," (H3) - Subsections"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"####"})," (H4) - Minor sections (these will not show on the right nav bar)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"code-blocks",children:"Code Blocks"}),"\n",(0,i.jsx)(n.p,{children:"Use fenced code blocks with language specification:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-markdown",children:"```javascript\n// Your code here\n```\n"})}),"\n",(0,i.jsx)(n.h3,{id:"images",children:"Images"}),"\n",(0,i.jsx)(n.p,{children:"Include additional images using Markdown:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-markdown",children:"![descriptive alt text](image-name.png)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"social-media-tags",children:"Social Media Tags"}),"\n",(0,i.jsx)(n.p,{children:"At the end of your post, include the following meta tags for social media sharing:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-html",children:'\n \n \n \n \n \n \n \n \n \n \n\n'})}),"\n",(0,i.jsx)(n.h2,{id:"author-information",children:"Author Information"}),"\n",(0,i.jsx)(n.p,{children:"To add yourself as an author:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Edit ",(0,i.jsx)(n.code,{children:"authors.yml"})," in the blog directory"]}),"\n",(0,i.jsx)(n.li,{children:"Add your information following this format:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"your_author_id:\n name: Your Full Name\n title: Your Title\n image_url: https://avatars.githubusercontent.com/u/your_github_id?v=4\n url: https://your-website.com # Optional\n page: true\n socials:\n linkedin: your_linkedin_username\n github: your_github_username\n x: your_twitter_handle\n bluesky: your_bluesky_handle # Optional\n"})}),"\n",(0,i.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Writing Style"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use clear, concise language"}),"\n",(0,i.jsx)(n.li,{children:"Break up long paragraphs"}),"\n",(0,i.jsx)(n.li,{children:"Include code examples where relevant"}),"\n",(0,i.jsx)(n.li,{children:"Use images to illustrate complex concepts"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Technical Content"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Include working code examples"}),"\n",(0,i.jsx)(n.li,{children:"Explain prerequisites"}),"\n",(0,i.jsx)(n.li,{children:"Link to relevant documentation"}),"\n",(0,i.jsx)(n.li,{children:"Test code snippets before publishing"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Formatting"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use consistent spacing"}),"\n",(0,i.jsx)(n.li,{children:"Include alt text for images"}),"\n",(0,i.jsx)(n.li,{children:"Break up content with subheadings"}),"\n",(0,i.jsx)(n.li,{children:"Use lists and tables when appropriate"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Review Process"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Proofread for typos and grammar"}),"\n",(0,i.jsx)(n.li,{children:"Verify all links work"}),"\n",(0,i.jsx)(n.li,{children:"Check image paths"}),"\n",(0,i.jsx)(n.li,{children:"Test code samples"}),"\n",(0,i.jsx)(n.li,{children:"Validate frontmatter syntax"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"previewing-your-blog-post",children:"Previewing Your Blog Post"}),"\n",(0,i.jsx)(n.p,{children:"To preview your blog post locally:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Ensure you're in the documentation directory:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd documentation\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Start the development server:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"npm start\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Open your browser and visit:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"http://localhost:3000/goose/blog\n"})}),"\n",(0,i.jsx)(n.p,{children:"The development server features:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Hot reloading (changes appear immediately)"}),"\n",(0,i.jsx)(n.li,{children:"Preview of the full site navigation"}),"\n",(0,i.jsx)(n.li,{children:"Mobile responsive testing"}),"\n",(0,i.jsx)(n.li,{children:"Social media preview testing"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you make changes to your blog post while the server is running, the page will automatically refresh to show your updates."}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting-preview",children:"Troubleshooting Preview"}),"\n",(0,i.jsx)(n.p,{children:"If you encounter issues:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Make sure all dependencies are installed:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"npm install\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Clear the cache and restart:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"npm run clear\nnpm start\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Verify your frontmatter syntax is correct (no tabs, proper indentation)"}),"\n",(0,i.jsx)(n.li,{children:"Check that all image paths are correct relative to your post's directory"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var r=t(96540);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e8f5fe6.61589e79.js b/assets/js/0e8f5fe6.61589e79.js new file mode 100644 index 00000000..6ff517d6 --- /dev/null +++ b/assets/js/0e8f5fe6.61589e79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4656],{99808:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>g,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var s=o(38685),i=o(74848),n=o(28453);const a={title:"6 Essential Tips for Working with Goose",description:"Practical tips to help you use Goose more effectively and efficiently.",authors:["angie"]},r=void 0,l={authorsImageUrls:[void 0]},c=[];function p(e){const t={img:"img",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"goose tips",src:o(66134).A+"",width:"1200",height:"630"})}),"\n",(0,i.jsx)(t.p,{children:"Working with AI agents can sometimes feel unpredictable. After using Goose extensively for the last few months, I've compiled a few key tips that will help you get the most out of this tool. No matter your workflow, these guidelines will help you work more efficiently with Goose."})]})}function g(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},66134:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/goose-tips-4add28cc7201737dfb468ad11980f070.png"},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>r});var s=o(96540);const i={},n=s.createContext(i);function a(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(n.Provider,{value:t},e.children)}},38685:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/06/goose-tips","source":"@site/blog/2025-03-06-goose-tips/index.md","title":"6 Essential Tips for Working with Goose","description":"Practical tips to help you use Goose more effectively and efficiently.","date":"2025-03-06T00:00:00.000Z","tags":[],"readingTime":5.37,"hasTruncateMarker":true,"authors":[{"name":"Angie Jones","title":"Head of Developer Relations","url":"https://angiejones.tech","page":{"permalink":"/goose/blog/authors/angie"},"socials":{"linkedin":"https://www.linkedin.com/in/angiejones/","github":"https://github.com/angiejones","x":"https://x.com/techgirl1908","bluesky":"https://bsky.app/profile/angiejones.tech"},"imageURL":"https://avatars.githubusercontent.com/u/15972783?v=4","key":"angie"}],"frontMatter":{"title":"6 Essential Tips for Working with Goose","description":"Practical tips to help you use Goose more effectively and efficiently.","authors":["angie"]},"unlisted":false,"prevItem":{"title":"Automating Phone Calls with Goose","permalink":"/goose/blog/2025/03/10/goose-calls-vyop"},"nextItem":{"title":"Let A Team of AI Agents Do It For You","permalink":"/goose/blog/2025/02/21/gooseteam-mcp"}}')}}]); \ No newline at end of file diff --git a/assets/js/0eaee0a4.80d8f0db.js b/assets/js/0eaee0a4.80d8f0db.js new file mode 100644 index 00000000..e2a93bdc --- /dev/null +++ b/assets/js/0eaee0a4.80d8f0db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8584],{58455:a=>{a.exports=JSON.parse('{"author":{"name":"W Ian Douglas","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/ian"},"socials":{"linkedin":"https://www.linkedin.com/in/iandouglas736/","github":"https://github.com/iandouglas","bluesky":"https://bsky.app/profile/iandouglas736.com","x":"https://x.com/iandouglas736"},"imageURL":"https://avatars.githubusercontent.com/u/168030?v=4","key":"ian","count":4},"listMetadata":{"permalink":"/goose/blog/authors/ian","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/0ef0a83e.7db81bbc.js b/assets/js/0ef0a83e.7db81bbc.js new file mode 100644 index 00000000..ca31f331 --- /dev/null +++ b/assets/js/0ef0a83e.7db81bbc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7219,7720,8196,8202],{78805:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>p,frontMatter:()=>d,metadata:()=>o,toc:()=>x});const o=JSON.parse('{"id":"mcp/context7-mcp","title":"Context7 Extension","description":"This tutorial covers how to add the Context7 MCP Server as a Goose extension to pull up-to-date, version-specific code and docs so Goose can vibe code with real context, not hallucinated or outdated answers.","source":"@site/docs/mcp/context7-mcp.mdx","sourceDirName":"mcp","slug":"/mcp/context7-mcp","permalink":"/goose/docs/mcp/context7-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Context7 Extension","escription":"Add Context7 MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Computer Controller Extension","permalink":"/goose/docs/mcp/computer-controller-mcp"},"next":{"title":"Developer Extension","permalink":"/goose/docs/mcp/developer-mcp"}}');var i=t(74848),s=t(28453),r=t(65537),l=t(79329),a=t(25887),c=t(28799);const d={title:"Context7 Extension",escription:"Add Context7 MCP Server as a Goose Extension"},u=void 0,h={},x=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function m(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.A,{videoUrl:"https://www.youtube.com/embed/LNmPi6YCocI"}),"\n",(0,i.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,i.jsx)(n.a,{href:"https://github.com/upstash/context7",children:"Context7 MCP Server"})," as a Goose extension to pull up-to-date, version-specific code and docs so Goose can vibe code with real context, not hallucinated or outdated answers."]}),"\n",(0,i.jsx)(n.admonition,{title:"TLDR",type:"tip",children:(0,i.jsxs)(r.A,{groupId:"interface",children:[(0,i.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=%40upstash%2Fcontext7-mcp&id=context7&name=Context7&description=Context7%20MCP%20server%20for%20up-to-date%20code%20and%20docs",children:"Launch the installer"})})}),(0,i.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Command"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"npx -y @upstash/context7-mcp\n"})})]})]})}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Note that you'll need ",(0,i.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," installed on your system to run this command, as it uses ",(0,i.jsx)(n.code,{children:"npx"}),"."]})}),"\n",(0,i.jsxs)(r.A,{groupId:"interface",children:[(0,i.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=%40upstash%2Fcontext7-mcp&id=context7&name=Context7&description=Context7%20MCP%20server%20for%20up-to-date%20code%20and%20docs",children:"Launch the installer"})}),"\n",(0,i.jsxs)(n.li,{children:["Press ",(0,i.jsx)("code",{children:"Yes"})," to confirm the installation"]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)("code",{children:"Save Configuration"})]}),"\n",(0,i.jsxs)(n.li,{children:["Scroll to the top and click ",(0,i.jsx)("code",{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,i.jsx)(l.A,{value:"cli",label:"Goose CLI",children:(0,i.jsx)(c.A,{name:"context7",command:"npx -y @upstash/context7-mcp",timeout:300})})]}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsx)(n.p,{children:"In this example, Goose uses Context7 to pull real-time docs, compare tools, and scaffold a modern app using only the latest, official implementation patterns."}),"\n",(0,i.jsxs)(r.A,{groupId:"interface",children:[(0,i.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Open a new session in Goose Desktop"}),"\n"]})}),(0,i.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Open a terminal and start a new Goose session:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"goose session\n"})})]})]}),"\n",(0,i.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,i.jsx)(n.p,{children:"I need help building a modern web application. Could you:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Use Context7 to analyze and compare:"}),"\n"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Next.js App Router vs Pages Router"}),"\n",(0,i.jsx)(n.li,{children:"Prisma vs other ORMs"}),"\n",(0,i.jsx)(n.li,{children:"Different authentication approaches"}),"\n",(0,i.jsx)(n.li,{children:"State management solutions"}),"\n"]}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"For each technology chosen:"}),"\n"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Show the latest official implementation patterns"}),"\n",(0,i.jsx)(n.li,{children:"Provide type definitions and interfaces"}),"\n",(0,i.jsx)(n.li,{children:"Share relevant code snippets from documentation"}),"\n",(0,i.jsx)(n.li,{children:"Explain best practices and common pitfalls"}),"\n"]}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Help implement:"}),"\n"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Project structure following official guidelines"}),"\n",(0,i.jsx)(n.li,{children:"Database schema and type safety"}),"\n",(0,i.jsx)(n.li,{children:"Authentication flow with proper security"}),"\n",(0,i.jsx)(n.li,{children:"API routes with error handling"}),"\n",(0,i.jsx)(n.li,{children:"Performance optimizations"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Please reference specific documentation sections and explain why certain approaches are recommended over others."}),"\n",(0,i.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,i.jsxs)(n.admonition,{title:"Desktop",type:"note",children:[(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Technology Analysis\nNext.js App Router vs Pages Router\nFirst, let's get the latest Next.js documentation:"}),"\n"]}),(0,i.jsx)(n.p,{children:"-------- Resolve-library-id -------"}),(0,i.jsx)(n.p,{children:"Let's get detailed documentation about Next.js, focusing on routing:"}),(0,i.jsx)(n.p,{children:"------ Get-library-docs ---------"}),(0,i.jsx)(n.p,{children:"Let me analyze the Next.js documentation and break down the key differences between the App Router and Pages Router:"}),(0,i.jsx)(n.p,{children:"------ code structure comparison -----"}),(0,i.jsx)(n.p,{children:"Let's get information about Prisma and other ORMs:"}),(0,i.jsx)(n.p,{children:"------- Resolve-library-id ----------"}),(0,i.jsx)(n.p,{children:"Let's get Prisma's documentation:"}),(0,i.jsx)(n.p,{children:"------ Get-library-docs ----------"}),(0,i.jsx)(n.p,{children:"Key Decisions and Best Practices:"}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"App Router vs Pages Router:"}),"\n"]}),(0,i.jsx)(n.p,{children:"Chose App Router for:\nServer Components by default (better performance)\nBuilt-in data fetching with streaming\nSimpler API routes with Route Handlers\nBetter TypeScript integration"}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Prisma as ORM:"}),"\n"]}),(0,i.jsx)(n.p,{children:"Benefits:\nType-safe database queries\nAuto-generated client\nSchema migrations\nRich query API\nUsing Prisma Accelerate for better performance"}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Authentication:"}),"\n"]}),(0,i.jsx)(n.p,{children:"NextAuth.js for:\nBuilt-in security features\nMultiple authentication providers\nSession management\nJWT handling"}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Performance Optimizations:"}),"\n"]}),(0,i.jsx)(n.p,{children:"Server Components for reduced JavaScript\nRoute Handlers for API endpoints\nPrisma Accelerate for database performance\nType safety across the stack"}),(0,i.jsx)(n.p,{children:"Would you like me to explain any part in more detail or help you implement specific features?"})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>R});var o=t(96540),i=t(74848);function s(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=o.Children.toArray(e),t=n.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),s=n.filter((e=>e!==t)),r=t?.props.children;return{mdxAdmonitionTitle:r,rest:s.length>0?(0,i.jsx)(i.Fragment,{children:s}):null}}(e.children),s=e.title??n;return{...e,...s&&{title:s},children:t}}var r=t(34164),l=t(50539),a=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function x(e){let{type:n,className:t,children:o}=e;return(0,i.jsx)("div",{className:(0,r.A)(a.G.common.admonition,a.G.common.admonitionType(n),c,t),children:o})}function m(e){let{icon:n,title:t}=e;return(0,i.jsxs)("div",{className:d,children:[(0,i.jsx)("span",{className:u,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,i.jsx)("div",{className:h,children:n}):null}function f(e){const{type:n,icon:t,title:o,children:s,className:r}=e;return(0,i.jsxs)(x,{type:n,className:r,children:[o||t?(0,i.jsx)(m,{title:o,icon:t}):null,(0,i.jsx)(p,{children:s})]})}function g(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,i.jsx)(g,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function v(e){return(0,i.jsx)(f,{...j,...e,className:(0,r.A)("alert alert--secondary",e.className),children:e.children})}function y(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const b={icon:(0,i.jsx)(y,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,i.jsx)(f,{...b,...e,className:(0,r.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const C={icon:(0,i.jsx)(A,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function k(e){return(0,i.jsx)(f,{...C,...e,className:(0,r.A)("alert alert--info",e.className),children:e.children})}function N(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const E={icon:(0,i.jsx)(N,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function P(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const I={icon:(0,i.jsx)(P,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const T={icon:(0,i.jsx)(N,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const W={...{note:v,tip:w,info:k,warning:function(e){return(0,i.jsx)(f,{...E,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(f,{...I,...e,className:(0,r.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(v,{title:"secondary",...e}),important:e=>(0,i.jsx)(k,{title:"important",...e}),success:e=>(0,i.jsx)(w,{title:"success",...e}),caution:function(e){return(0,i.jsx)(f,{...T,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})}}};function R(e){const n=s(e),t=(o=n.type,W[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),W.info));var o;return(0,i.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(34164);const i={tabItem:"tabItem_Ymn6"};var s=t(74848);function r(e){let{children:n,hidden:t,className:r}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(i.tabItem,r),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),i=t(34164),s=t(65627),r=t(56347),l=t(50372),a=t(30604),c=t(11861),d=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:i}}=e;return{value:n,label:t,attributes:o,default:i}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function x(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const i=(0,r.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,a.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(i.location.search);n.set(s,e),i.replace({...i.location,search:n.toString()})}),[s,i])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,s=h(e),[r,a]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!x({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:s}))),[c,u]=m({queryString:t,groupId:i}),[p,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,s]=(0,d.Dv)(t);return[i,(0,o.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:i}),g=(()=>{const e=c??p;return x({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{g&&a(g)}),[g]);return{selectedValue:r,selectValue:(0,o.useCallback)((e=>{if(!x({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),f(e)}),[u,f,s]),tabValues:s}}var f=t(9136);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(74848);function v(e){let{className:n,block:t,selectedValue:o,selectValue:r,tabValues:l}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),i=l[t].value;i!==o&&(c(n),r(i))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{a.push(e)},onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function y(e){let{lazy:n,children:t,selectedValue:s}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,o.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function b(e){const n=p(e);return(0,j.jsxs)("div",{className:(0,i.A)("tabs-container",g.tabList),children:[(0,j.jsx)(v,{...n,...e}),(0,j.jsx)(y,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,j.jsx)(b,{...e,children:u(e.children)},String(n))}},28799:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var o=t(58069),i=t(74848);function s(e){let{name:n,command:t,timeout:s=300,envVars:r=[],infoNote:l}=e;const a=r.length>0,c=a?`Add environment variable${r.length>1?"s":""} for ${n}`:"Choose No when asked to add environment variables";return(0,i.jsxs)("div",{children:[(0,i.jsx)("ol",{children:(0,i.jsxs)("li",{children:["Run the ",(0,i.jsx)("code",{children:"configure"})," command:"]})}),(0,i.jsx)(o.A,{language:"sh",children:"goose configure"}),(0,i.jsx)("ol",{start:2,children:(0,i.jsxs)("li",{children:["Choose to add a ",(0,i.jsx)("code",{children:"Command-line Extension"}),"."]})}),(0,i.jsx)(o.A,{language:"sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c6 What type of extension would you like to add?\n\u2502 \u25cb Built-in Extension \n// highlight-start \n\u2502 \u25cf Command-line Extension (Run a local command or script)\n// highlight-end \n\u2502 \u25cb Remote Extension \n\u2514"}),(0,i.jsx)("ol",{start:3,children:(0,i.jsx)("li",{children:"Give your extension a name."})}),(0,i.jsx)(o.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n// highlight-start\n\u25c6 What would you like to call this extension?\n\u2502 ${n}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:4,children:(0,i.jsx)("li",{children:"Enter the command to run when this extension is used."})}),(0,i.jsx)(o.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n// highlight-start\n\u25c6 What command should be run?\n\u2502 ${t}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:5,children:(0,i.jsxs)("li",{children:["Enter the number of seconds Goose should wait for actions to complete before timing out. Default is ",(0,i.jsx)("code",{children:"300"})," seconds."]})}),(0,i.jsx)(o.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${t}\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:6,children:(0,i.jsxs)("li",{children:["Choose to add a description. If you select ",(0,i.jsx)("code",{children:"Yes"}),", you\u2019ll be prompted to enter a description for the extension."]})}),(0,i.jsx)(o.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${t}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n// highlight-start\n\u25c6 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:7,children:(0,i.jsx)("li",{children:c})}),!a&&(0,i.jsx)(o.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${t}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n\u25c7 Would you like to add a description?\n\u2502 No\n\u2502\n// highlight-start\n\u25c6 Would you like to add environment variables?\n\u2502 No\n// highlight-end\n\u2514 Added ${n} extension`}),a&&(0,i.jsxs)(i.Fragment,{children:[l&&(0,i.jsx)("div",{className:"alert alert--info",children:l}),(0,i.jsx)(o.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${t}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n\u25c7 Would you like to add a description?\n\u2502 No\n\u2502\n// highlight-start\n\u25c6 Would you like to add environment variables?\n\u2502 Yes\n${r.map(((e,n)=>{let{key:t,value:o}=e;return`\u2502\n\u25c7 Environment variable name:\n\u2502 ${t}\n\u2502\n\u25c7 Environment variable value:\n\u2502 ${o}\n\u2502\n\u25c7 Add another environment variable?\n\u2502 ${n===r.length-1?"No":"Yes"}`})).join("\n")}\n// highlight-end\n\u2514 Added ${n} extension`})]})]})}},25887:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var o=t(52362),i=t(74848);const s=e=>{let{videoUrl:n}=e;return(0,i.jsxs)("div",{children:[(0,i.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Watch the demo"}),(0,i.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,i.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,i.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>l});var o=t(96540);const i={},s=o.createContext(i);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0fa2ba1d.18b29361.js b/assets/js/0fa2ba1d.18b29361.js new file mode 100644 index 00000000..e4e7dbe1 --- /dev/null +++ b/assets/js/0fa2ba1d.18b29361.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5564],{82760:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"tutorials/benchmarking","title":"Benchmarking with Goose","description":"The Goose benchmarking system allows you to evaluate goose performance on complex tasks with one or more system","source":"@site/docs/tutorials/benchmarking.md","sourceDirName":"tutorials","slug":"/tutorials/benchmarking","permalink":"/goose/docs/tutorials/benchmarking","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Benchmarking with Goose","sidebar_label":"Benchmark with Goose"},"sidebar":"tutorialSidebar","previous":{"title":"Advanced Cognee Usage with Goose","permalink":"/goose/docs/tutorials/advanced-cognee-usage"},"next":{"title":"CI/CD Environments","permalink":"/goose/docs/tutorials/cicd"}}');var l=s(74848),o=s(28453);const r={title:"Benchmarking with Goose",sidebar_label:"Benchmark with Goose"},a=void 0,t={},c=[{value:"Quick Start",id:"quick-start",level:3},{value:"Configuration File",id:"configuration-file",level:2},{value:"Configuration Options",id:"configuration-options",level:3},{value:"Models Section",id:"models-section",level:4},{value:"Evals Section",id:"evals-section",level:4},{value:"General Options",id:"general-options",level:4},{value:"Mechanics of include_dirs option",id:"mechanics-of-include_dirs-option",level:5},{value:"Customizing Evaluations",id:"customizing-evaluations",level:3},{value:"Output and Results",id:"output-and-results",level:2},{value:"Debug Mode",id:"debug-mode",level:3},{value:"Advanced Usage",id:"advanced-usage",level:2},{value:"Tool Shimming",id:"tool-shimming",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(n.p,{children:["The Goose benchmarking system allows you to evaluate goose performance on complex tasks with one or more system\nconfigurations.",(0,l.jsx)("br",{}),"\nThis guide covers how to use the ",(0,l.jsx)(n.code,{children:"goose bench"})," command to run benchmarks and analyze results."]}),"\n",(0,l.jsx)(n.h3,{id:"quick-start",children:"Quick Start"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["The benchmarking system includes several evaluation suites.",(0,l.jsx)("br",{}),"\nRun the following to see a listing of every valid selector:"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"goose bench selectors\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"2",children:["\n",(0,l.jsx)(n.li,{children:"Create a basic configuration file:"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'goose bench init-config -n bench-config.json\ncat bench-config.json\n{\n "models": [\n {\n "provider": "databricks",\n "name": "goose",\n "parallel_safe": true\n }\n ],\n "evals": [\n {\n "selector": "core",\n "parallel_safe": true\n }\n ],\n "repeat": 1\n}\n...etc.\n'})}),"\n",(0,l.jsxs)(n.ol,{start:"2",children:["\n",(0,l.jsx)(n.li,{children:"Run the benchmark:"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"goose bench run -c bench-config.json\n"})}),"\n",(0,l.jsx)(n.h2,{id:"configuration-file",children:"Configuration File"}),"\n",(0,l.jsx)(n.p,{children:"The benchmark configuration is specified in a JSON file with the following structure:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "models": [\n {\n "provider": "databricks",\n "name": "goose",\n "parallel_safe": true,\n "tool_shim": {\n "use_tool_shim": false,\n "tool_shim_model": null\n }\n }\n ],\n "evals": [\n {\n "selector": "core",\n "post_process_cmd": null,\n "parallel_safe": true\n }\n ],\n "include_dirs": [],\n "repeat": 2,\n "run_id": null,\n "eval_result_filename": "eval-results.json",\n "run_summary_filename": "run-results-summary.json",\n "env_file": null\n}\n'})}),"\n",(0,l.jsx)(n.h3,{id:"configuration-options",children:"Configuration Options"}),"\n",(0,l.jsx)(n.h4,{id:"models-section",children:"Models Section"}),"\n",(0,l.jsxs)(n.p,{children:["Each model entry in the ",(0,l.jsx)(n.code,{children:"models"})," array specifies:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"provider"}),': The model provider (e.g., "databricks")']}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"name"}),": Model identifier"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"parallel_safe"}),": Whether the model can be run in parallel"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"tool_shim"}),": Optional configuration for tool shimming","\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"use_tool_shim"}),": Enable/disable tool shimming"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"tool_shim_model"}),": Optional model to use for tool shimming"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.h4,{id:"evals-section",children:"Evals Section"}),"\n",(0,l.jsxs)(n.p,{children:["Each evaluation entry in the ",(0,l.jsx)(n.code,{children:"evals"})," array specifies:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"selector"}),': The evaluation suite to run (e.g., "core")']}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"post_process_cmd"}),": Optional path to a post-processing script"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"parallel_safe"}),": Whether the evaluation can run in parallel"]}),"\n"]}),"\n",(0,l.jsx)(n.h4,{id:"general-options",children:"General Options"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"include_dirs"}),": Additional directories to include in the evaluation"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"repeat"}),": Number of times to repeat each evaluation"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"run_id"}),": Optional identifier for the benchmark run"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"eval_result_filename"}),": Name of the evaluation results file"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"run_summary_filename"}),": Name of the summary results file"]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"env_file"}),": Optional path to an environment file"]}),"\n"]}),"\n",(0,l.jsx)(n.h5,{id:"mechanics-of-include_dirs-option",children:"Mechanics of include_dirs option"}),"\n",(0,l.jsxs)(n.p,{children:["The ",(0,l.jsx)(n.code,{children:"include_dirs"})," config parameter makes the items at all paths listed within the option, available to all\nevaluations.",(0,l.jsx)("br",{}),"\nIt accomplishes this by:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"copying each included asset into the top-level directory created for each model/provider pair"}),"\n",(0,l.jsxs)(n.li,{children:["at evaluation run-time","\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"whichever assets is explicitly required by an evaluation gets copied into the eval-specific directory"}),"\n",(0,l.jsx)(n.li,{children:"only if the evaluation-code specifically pulls it in"}),"\n",(0,l.jsx)(n.li,{children:"and only if the evaluation actually is covered by one of the configured selectors and therefore runs"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"customizing-evaluations",children:"Customizing Evaluations"}),"\n",(0,l.jsx)(n.p,{children:"You can customize runs in several ways:"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsx)(n.li,{children:"Using Post-Processing Commands after evaluation:"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "evals": [\n {\n "selector": "core",\n "post_process_cmd": "/path/to/process-script.sh",\n "parallel_safe": true\n }\n ]\n}\n'})}),"\n",(0,l.jsxs)(n.ol,{start:"2",children:["\n",(0,l.jsx)(n.li,{children:"Including Additional Data:"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "include_dirs": [\n "/path/to/custom/eval/data"\n ]\n}\n'})}),"\n",(0,l.jsxs)(n.ol,{start:"3",children:["\n",(0,l.jsx)(n.li,{children:"Setting Environment Variables:"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-json",children:'{\n "env_file": "/path/to/env-file"\n}\n'})}),"\n",(0,l.jsx)(n.h2,{id:"output-and-results",children:"Output and Results"}),"\n",(0,l.jsxs)(n.p,{children:["The benchmark generates two main output files within a file-hierarchy similar to the following.",(0,l.jsx)("br",{}),"\nResults from running ach model/provider pair are stored within their own directory:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"benchmark-${datetime}/\n ${model}-${provider}[-tool-shim[-${shim-model}]]/\n run-${i}/\n ${an-include_dir-asset}\n run-results-summary.json\n core/developer/list_files/\n ${an-include_dir-asset}\n run-results-summary.json\n"})}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"eval-results.json"}),": Contains detailed results from each evaluation, including:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Individual test case results"}),"\n",(0,l.jsx)(n.li,{children:"Model responses"}),"\n",(0,l.jsx)(n.li,{children:"Scoring metrics"}),"\n",(0,l.jsx)(n.li,{children:"Error logs"}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"run-results-summary.json"}),": A collection of all eval results across all suites."]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"debug-mode",children:"Debug Mode"}),"\n",(0,l.jsx)(n.p,{children:"For detailed logging, you can enable debug mode:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"RUST_LOG=debug goose bench bench-config.json\n"})}),"\n",(0,l.jsx)(n.h2,{id:"advanced-usage",children:"Advanced Usage"}),"\n",(0,l.jsx)(n.h3,{id:"tool-shimming",children:"Tool Shimming"}),"\n",(0,l.jsx)(n.p,{children:"Tool shimming allows you to use a non-tool-capable models with Goose, provided Ollama is installed on the\nsystem."}),"\n",(0,l.jsxs)(n.p,{children:["See this guide for important details on ",(0,l.jsx)(n.a,{href:"/docs/experimental/ollama",children:"tool shimming"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var i=s(96540);const l={},o=i.createContext(l);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/101.367a2044.js b/assets/js/101.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/101.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1053.367a2044.js b/assets/js/1053.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/1053.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/125ecc8b.ebee7d56.js b/assets/js/125ecc8b.ebee7d56.js new file mode 100644 index 00000000..eefc0e7e --- /dev/null +++ b/assets/js/125ecc8b.ebee7d56.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8280],{67264:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>u});var n=t(47523),s=t(74848),r=t(28453);const a={title:"4 Things You Need to Know Before Using Goose",description:"Learn what you need to get started with Goose - a local open source AI agent that's powered by the LLM of your choice.",authors:["ebony"]},i="4 Things You Actually Need to Know Before Using Goose",c={authorsImageUrls:[void 0]},u=[];function l(e){const o={img:"img",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"blog cover",src:t(67409).A+"",width:"2240",height:"1260"})}),"\n",(0,s.jsx)(o.p,{children:"So you\u2019ve heard about Goose. Maybe you saw a livestream, someone on your team mentioned it, or you just stumbled into our corner of the internet while trying to automate your dev setup. Either way\u2014love that for you."}),"\n",(0,s.jsx)(o.p,{children:"Goose is a local, open source AI agent that can automate tasks, interact with your codebase, and connect to a growing ecosystem of tools. But before you hit install, here are four things you should know to get the most out of it."})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},67409:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/cover-2ba7c2e15786be2db6108c91d27dc1ec.png"},28453:(e,o,t)=>{t.d(o,{R:()=>a,x:()=>i});var n=t(96540);const s={},r=n.createContext(s);function a(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:o},e.children)}},47523:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/23/things-need-to-know","source":"@site/blog/2025-04-23-things-need-to-know/index.md","title":"4 Things You Need to Know Before Using Goose","description":"Learn what you need to get started with Goose - a local open source AI agent that\'s powered by the LLM of your choice.","date":"2025-04-23T00:00:00.000Z","tags":[],"readingTime":4.71,"hasTruncateMarker":true,"authors":[{"name":"Ebony Louis","title":"Developer Advocate","page":{"permalink":"/goose/blog/authors/ebony"},"socials":{"linkedin":"https://www.linkedin.com/in/ebonylouis/","x":"https://x.com/ebonyjlouis","github":"https://github.com/ebonylouis"},"imageURL":"https://avatars.githubusercontent.com/u/55366651?v=4","key":"ebony"}],"frontMatter":{"title":"4 Things You Need to Know Before Using Goose","description":"Learn what you need to get started with Goose - a local open source AI agent that\'s powered by the LLM of your choice.","authors":["ebony"]},"unlisted":false,"prevItem":{"title":"A Recipe for Success: Cooking Up Repeatable Agentic Workflows","permalink":"/goose/blog/2025/05/06/recipe-for-success"},"nextItem":{"title":"How One Contribution Can Spark Many Wins","permalink":"/goose/blog/2025/04/22/community-bestcodes"}}')}}]); \ No newline at end of file diff --git a/assets/js/12706580.900064f0.js b/assets/js/12706580.900064f0.js new file mode 100644 index 00000000..5e472003 --- /dev/null +++ b/assets/js/12706580.900064f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[7732],{41349:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"tutorials/custom-extensions","title":"Building Custom Extensions","description":"Create your own custom MCP Server to use as a Goose extension","source":"@site/docs/tutorials/custom-extensions.md","sourceDirName":"tutorials","slug":"/tutorials/custom-extensions","permalink":"/goose/docs/tutorials/custom-extensions","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Building Custom Extensions","description":"Create your own custom MCP Server to use as a Goose extension"},"sidebar":"tutorialSidebar","previous":{"title":"CI/CD Environments","permalink":"/goose/docs/tutorials/cicd"},"next":{"title":"Goose in Docker","permalink":"/goose/docs/tutorials/goose-in-docker"}}');var s=t(74848),o=t(28453);const r={title:"Building Custom Extensions",description:"Create your own custom MCP Server to use as a Goose extension"},c="Building Custom Extensions with Goose",a={},l=[{value:"Step 1: Initialize Your Project",id:"step-1-initialize-your-project",level:2},{value:"Step 2: Write Your MCP Server Code",id:"step-2-write-your-mcp-server-code",level:2},{value:"server.py",id:"serverpy",level:3},{value:"__init__.py",id:"__init__py",level:3},{value:"__main__.py",id:"__main__py",level:3},{value:"Step 3: Define Project Configuration",id:"step-3-define-project-configuration",level:2},{value:"Step 4: Test Your MCP Server",id:"step-4-test-your-mcp-server",level:2},{value:"Using MCP Inspector",id:"using-mcp-inspector",level:3},{value:"Testing the CLI",id:"testing-the-cli",level:3},{value:"Step 5: Integrate with Goose",id:"step-5-integrate-with-goose",level:2},{value:"Step 6: Use Your Extension in Goose",id:"step-6-use-your-extension-in-goose",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"building-custom-extensions-with-goose",children:"Building Custom Extensions with Goose"})}),"\n",(0,s.jsxs)(n.p,{children:["Goose allows you to extend its functionality by creating your own custom extensions, which are built as MCP servers. These extensions are compatible with Goose because it adheres to the ",(0,s.jsx)(n.a,{href:"https://modelcontextprotocol.io/",children:"Model Context Protocol (MCP)"}),". MCP is an open protocol that standardizes how applications provide context to LLMs. It enables a consistent way to connect LLMs to various data sources and tools, making it ideal for extending functionality in a structured and interoperable way.\xa0"]}),"\n",(0,s.jsxs)(n.p,{children:["In this guide, we build an MCP server using the ",(0,s.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/python-sdk",children:"Python SDK for MCP"}),". We\u2019ll demonstrate how to create an MCP server that reads Wikipedia articles and converts them to Markdown, integrate it as an extension in Goose. You can follow a similar process to develop your own custom extensions for Goose."]}),"\n",(0,s.jsxs)(n.p,{children:["You can checkout other examples in this ",(0,s.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/servers",children:"MCP servers repository"}),". MCP SDKs are also available in ",(0,s.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/typescript-sdk",children:"Typescript"})," and ",(0,s.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/kotlin-sdk",children:"Kotlin"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Goose currently supports Tools and Resources for ",(0,s.jsx)(n.a,{href:"https://spec.modelcontextprotocol.io/specification/2024-11-05/server/",children:"MCP Server features"}),".\nWe will be adding support for MCP Prompts soon."]})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"step-1-initialize-your-project",children:"Step 1: Initialize Your Project"}),"\n",(0,s.jsxs)(n.p,{children:["The first step is to create a new project using ",(0,s.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/",children:"uv"}),". We will name our project ",(0,s.jsx)(n.code,{children:"mcp-wiki"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Run the following commands in your terminal to set up a basic structure for your MCP server:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"uv init mcp-wiki\n\ncd mcp-wiki\nrm hello.py\n\nmkdir -p src/mcp_wiki\ntouch src/mcp_wiki/server.py # Your MCP server code (tool, resources, prompts)\ntouch src/mcp_wiki/__init__.py # Primary CLI entry point\ntouch src/mcp_wiki/__main__.py # To enable running as a Python module\n"})}),"\n",(0,s.jsx)(n.p,{children:"Your project directory structure should look like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-plaintext",children:".\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 pyproject.toml\n\u251c\u2500\u2500 src\n\u2502 \u2514\u2500\u2500 mcp_wiki\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 __main__.py\n\u2502 \u2514\u2500\u2500 server.py\n\u2514\u2500\u2500 uv.lock\n"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"step-2-write-your-mcp-server-code",children:"Step 2: Write Your MCP Server Code"}),"\n",(0,s.jsx)(n.p,{children:"In this step, we\u2019ll implement the core functionality of the MCP server. Here is a breakdown of the key components:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"server.py"})}),": This file holds the main MCP server code. In this example, we define a single tool to read Wikipedia articles. You can add your own custom tools, resources, and prompts here."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"__init__.py"})}),": This is the primary CLI entry point for your MCP server."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"__main__.py"})}),": This file allows your MCP server to be executed as a Python module."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Below is the example implementation for the Wikipedia MCP server:"}),"\n",(0,s.jsx)(n.h3,{id:"serverpy",children:(0,s.jsx)(n.code,{children:"server.py"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'import requests\nfrom requests.exceptions import RequestException\nfrom bs4 import BeautifulSoup\nfrom html2text import html2text\n\nfrom mcp.server.fastmcp import FastMCP\nfrom mcp.shared.exceptions import McpError\nfrom mcp.types import ErrorData, INTERNAL_ERROR, INVALID_PARAMS\n\nmcp = FastMCP("wiki")\n\n@mcp.tool()\ndef read_wikipedia_article(url: str) -> str:\n """\n Fetch a Wikipedia article at the provided URL, parse its main content,\n convert it to Markdown, and return the resulting text.\n\n Usage:\n read_wikipedia_article("https://en.wikipedia.org/wiki/Python_(programming_language)")\n """\n try:\n # Validate input\n if not url.startswith("http"):\n raise ValueError("URL must start with http or https.")\n\n response = requests.get(url, timeout=10)\n if response.status_code != 200:\n raise McpError(\n ErrorData(\n INTERNAL_ERROR,\n f"Failed to retrieve the article. HTTP status code: {response.status_code}"\n )\n )\n\n soup = BeautifulSoup(response.text, "html.parser")\n content_div = soup.find("div", {"id": "mw-content-text"})\n if not content_div:\n raise McpError(\n ErrorData(\n INVALID_PARAMS,\n "Could not find the main content on the provided Wikipedia URL."\n )\n )\n\n # Convert to Markdown\n markdown_text = html2text(str(content_div))\n return markdown_text\n\n except ValueError as e:\n raise McpError(ErrorData(INVALID_PARAMS, str(e))) from e\n except RequestException as e:\n raise McpError(ErrorData(INTERNAL_ERROR, f"Request error: {str(e)}")) from e\n except Exception as e:\n raise McpError(ErrorData(INTERNAL_ERROR, f"Unexpected error: {str(e)}")) from e\n'})}),"\n",(0,s.jsx)(n.h3,{id:"__init__py",children:(0,s.jsx)(n.code,{children:"__init__.py"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'import argparse\nfrom .server import mcp\n\ndef main():\n """MCP Wiki: Read Wikipedia articles and convert them to Markdown."""\n parser = argparse.ArgumentParser(\n description="Gives you the ability to read Wikipedia articles and convert them to Markdown."\n )\n parser.parse_args()\n mcp.run()\n\nif __name__ == "__main__":\n main()\n'})}),"\n",(0,s.jsx)(n.h3,{id:"__main__py",children:(0,s.jsx)(n.code,{children:"__main__.py"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"from mcp_wiki import main\n\nmain()\n"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"step-3-define-project-configuration",children:"Step 3: Define Project Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["Configure your project using ",(0,s.jsx)(n.code,{children:"pyproject.toml"}),".\xa0This configuration defines the CLI script so that the mcp-wiki command is available as a binary. Below is an example configuration:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[project]\nname = "mcp-wiki"\nversion = "0.1.0"\ndescription = "MCP Server for Wikipedia"\nreadme = "README.md"\nrequires-python = ">=3.13"\ndependencies = [\n "beautifulsoup4>=4.12.3",\n "html2text>=2024.2.26",\n "mcp[cli]>=1.2.0",\n "requests>=2.32.3",\n]\n\n[project.scripts]\nmcp-wiki = "mcp_wiki:main"\n\n[build-system]\nrequires = ["hatchling"]\nbuild-backend = "hatchling.build"\n'})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"step-4-test-your-mcp-server",children:"Step 4: Test Your MCP Server"}),"\n",(0,s.jsx)(n.h3,{id:"using-mcp-inspector",children:"Using MCP Inspector"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Setup the project environment:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"uv sync\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Activate your virtual environment:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"source .venv/bin/activate\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run your server in development mode:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mcp dev src/mcp_wiki/server.py\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Go to ",(0,s.jsx)(n.code,{children:"http://localhost:5173"})," in your browser to open the MCP Inspector UI."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:['In the UI, you can click "Connect" to initialize your MCP server. Then click on "Tools" tab > "List Tools" and you should see the ',(0,s.jsx)(n.code,{children:"read_wikipedia_article"})," tool.\nThen you can try to call the ",(0,s.jsx)(n.code,{children:"read_wikipedia_article"}),' tool with URL set to "',(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Bangladesh",children:"https://en.wikipedia.org/wiki/Bangladesh"}),'" and click "Run Tool".']}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"MCP Inspector UI",src:t(38359).A+"",width:"1413",height:"820"})}),"\n",(0,s.jsx)(n.h3,{id:"testing-the-cli",children:"Testing the CLI"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Install your project locally:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"uv pip install .\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Check the executable in your virtual environment:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ls .venv/bin/ # Verify your CLI is available\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Test the CLI:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mcp-wiki --help\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should see output similar to:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-plaintext",children:"\u276f mcp-wiki --help\nusage: mcp-wiki [-h]\n\nGives you the ability to read Wikipedia articles and convert them to Markdown.\n\noptions:\n -h, --help show this help message and exit\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"step-5-integrate-with-goose",children:"Step 5: Integrate with Goose"}),"\n",(0,s.jsx)(n.p,{children:"To add your MCP server as an extension in Goose:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Go to ",(0,s.jsx)(n.code,{children:"Settings > Extensions > Add"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Set the ",(0,s.jsx)(n.code,{children:"Type"})," to ",(0,s.jsx)(n.code,{children:"StandardIO"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"Provide the ID, name, and description for your extension."}),"\n",(0,s.jsxs)(n.li,{children:["In the ",(0,s.jsx)(n.code,{children:"Command"})," field, provide the absolute path to your executable. For example:","\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-plaintext",children:"uv run /full/path/to/mcp-wiki/.venv/bin/mcp-wiki\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Alternatively in Step 3, you can also publish your package to pypi.\xa0Once published, the server can be run directly using uvx. For example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"uvx mcp-wiki\n"})}),"\n",(0,s.jsx)(n.p,{children:"For the purposes on this guide, we will show you how to run the local version.\xa0"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Goose Settings for Adding Custom Extension",src:t(12972).A+"",width:"627",height:"776"})}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"step-6-use-your-extension-in-goose",children:"Step 6: Use Your Extension in Goose"}),"\n",(0,s.jsx)(n.p,{children:"Once integrated, you can start using your extension in Goose. Open the Goose chat interface and call your tool as needed."}),"\n",(0,s.jsx)(n.p,{children:'You can verify that Goose has picked up the tools from your custom extension by asking it "what tools do you have?"'}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Goose Chat - Ask about tools",src:t(25874).A+"",width:"736",height:"502"})}),"\n",(0,s.jsx)(n.p,{children:"Then, you can try asking questions that require using the extension you added."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Goose Chat - Use custom extension",src:t(60321).A+"",width:"1179",height:"1106"})}),"\n",(0,s.jsxs)(n.p,{children:["\ud83c\udf89 ",(0,s.jsx)(n.strong,{children:"Congratulations!"})," You\u2019ve successfully built and integrated a custom MCP server with Goose."]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},60321:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/custom-extension-chat-dade20fed6d387174db32667977bdae1.png"},38359:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/custom-extension-mcp-inspector-aca22c16eb49051723a6ed413fd53fe7.png"},12972:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/custom-extension-settings-2f8639f68e9bde86c64af6518d2c0a2a.png"},25874:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/custom-extension-tools-9d440447ae99b18ae92819e652148abe.png"},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var i=t(96540);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12714b95.3c8755aa.js b/assets/js/12714b95.3c8755aa.js new file mode 100644 index 00000000..f353f416 --- /dev/null +++ b/assets/js/12714b95.3c8755aa.js @@ -0,0 +1,2 @@ +/*! For license information please see 12714b95.3c8755aa.js.LICENSE.txt */ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5342],{2139:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>x,frontMatter:()=>c,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"guides/smart-context-management","title":"Smart Context Management","description":"When working with Large Language Models (LLMs), there are limits to how much conversation history they can process at once. Goose provides smart context management features to help handle context and conversation limits so you can maintain productive sessions. Here are some key concepts:","source":"@site/docs/guides/smart-context-management.md","sourceDirName":"guides","slug":"/guides/smart-context-management","permalink":"/goose/docs/guides/smart-context-management","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":22,"frontMatter":{"title":"Smart Context Management","sidebar_position":22,"sidebar_label":"Smart Context Management"},"sidebar":"tutorialSidebar","previous":{"title":"Environment Variables","permalink":"/goose/docs/guides/environment-variables"},"next":{"title":"Enhanced Code Editing","permalink":"/goose/docs/guides/enhanced-code-editing"}}');var o=t(74848),i=t(28453),r=t(65537),l=t(79329);const a=(0,t(75395).A)("ScrollText",[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]),c={title:"Smart Context Management",sidebar_position:22,sidebar_label:"Smart Context Management"},d=void 0,h={},u=[{value:"Context Limit Strategy",id:"context-limit-strategy",level:2},{value:"Maximum Turns",id:"maximum-turns",level:2},{value:"Token Usage",id:"token-usage",level:2},{value:"Model Context Limit Overrides",id:"model-context-limit-overrides",level:2},{value:"Cost Tracking",id:"cost-tracking",level:2}];function m(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["When working with ",(0,o.jsx)(n.a,{href:"/docs/getting-started/providers",children:"Large Language Models (LLMs)"}),", there are limits to how much conversation history they can process at once. Goose provides smart context management features to help handle context and conversation limits so you can maintain productive sessions. Here are some key concepts:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Context Length"}),": The amount of conversation history the LLM can consider"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Context Limit"}),": The maximum number of tokens the model can process"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Context Management"}),": How Goose handles conversations approaching these limits"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Turn"}),": One complete prompt-response interaction between Goose and the LLM"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"context-limit-strategy",children:"Context Limit Strategy"}),"\n",(0,o.jsx)(n.p,{children:"When a conversation reaches the context limit, Goose offers different ways to handle it:"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Feature"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Best For"}),(0,o.jsx)(n.th,{children:"Impact"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Summarization"})}),(0,o.jsx)(n.td,{children:"Condenses conversation while preserving key points"}),(0,o.jsx)(n.td,{children:"Long, complex conversations"}),(0,o.jsx)(n.td,{children:"Maintains most context"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Truncation"})}),(0,o.jsx)(n.td,{children:"Removes oldest messages to make room"}),(0,o.jsx)(n.td,{children:"Simple, linear conversations"}),(0,o.jsx)(n.td,{children:"Loses old context"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Clear"})}),(0,o.jsx)(n.td,{children:"Starts fresh while keeping session active"}),(0,o.jsx)(n.td,{children:"New direction in conversation"}),(0,o.jsx)(n.td,{children:"Loses all context"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Prompt"})}),(0,o.jsx)(n.td,{children:"Asks user to choose from the above options"}),(0,o.jsx)(n.td,{children:"Control over each decision in interactive sessions"}),(0,o.jsx)(n.td,{children:"Depends on choice made"})]})]})]}),"\n",(0,o.jsx)(n.p,{children:"Your available options depend on whether you're using the Desktop app or CLI."}),"\n",(0,o.jsxs)(r.A,{groupId:"interface",children:[(0,o.jsxs)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,o.jsx)(n.p,{children:"Goose Desktop exclusively uses summarization to manage context, preserving key information while reducing size."}),(0,o.jsxs)(r.A,{children:[(0,o.jsxs)(l.A,{value:"automatic",label:"Automatic",default:!0,children:[(0,o.jsx)(n.p,{children:"When you reach the context limit in Goose Desktop:"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Goose will automatically start summarizing the conversation to make room."}),"\n",(0,o.jsxs)(n.li,{children:["You'll see a message that says ",(0,o.jsx)(n.strong,{children:'"Preparing summary..."'}),", followed by ",(0,o.jsx)(n.strong,{children:'"Session summarized."'})]}),"\n",(0,o.jsxs)(n.li,{children:["Once complete, you'll have the option to ",(0,o.jsx)(n.strong,{children:'"View or edit summary."'})]}),"\n",(0,o.jsx)(n.li,{children:"You can then continue the session with the summarized context in place."}),"\n"]})]}),(0,o.jsxs)(l.A,{value:"manual",label:"Manual",children:[(0,o.jsx)(n.p,{children:"You can proactively summarize your conversation before reaching context limits:"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Click the scroll text icon (",(0,o.jsx)(a,{className:"inline",size:16}),") in the chat interface"]}),"\n",(0,o.jsx)(n.li,{children:"Confirm the summarization in the modal"}),"\n",(0,o.jsx)(n.li,{children:"View or edit the generated summary if needed"}),"\n"]})]})]})]}),(0,o.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(n.p,{children:["The CLI supports all context limit strategies: ",(0,o.jsx)(n.code,{children:"summarize"}),", ",(0,o.jsx)(n.code,{children:"truncate"}),", ",(0,o.jsx)(n.code,{children:"clear"}),", and ",(0,o.jsx)(n.code,{children:"prompt"}),"."]}),(0,o.jsx)(n.p,{children:"The default behavior depends on the mode you're running in:"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Interactive mode"}),": Prompts user to choose (equivalent to ",(0,o.jsx)(n.code,{children:"prompt"}),")"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Headless mode"})," (",(0,o.jsx)(n.code,{children:"goose run"}),"): Automatically summarizes (equivalent to ",(0,o.jsx)(n.code,{children:"summarize"}),")"]}),"\n"]}),(0,o.jsxs)(n.p,{children:["You can configure how Goose handles context limits by setting the ",(0,o.jsx)(n.code,{children:"GOOSE_CONTEXT_STRATEGY"})," environment variable:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Set automatic strategy (choose one)\nexport GOOSE_CONTEXT_STRATEGY=summarize # Automatically summarize (recommended)\nexport GOOSE_CONTEXT_STRATEGY=truncate # Automatically remove oldest messages\nexport GOOSE_CONTEXT_STRATEGY=clear # Automatically clear session\n\n# Set to prompt the user\nexport GOOSE_CONTEXT_STRATEGY=prompt\n"})}),(0,o.jsxs)(r.A,{children:[(0,o.jsxs)(l.A,{value:"automatic",label:"Automatic",default:!0,children:[(0,o.jsx)(n.p,{children:"When you hit the context limit, the behavior depends on your configuration:"}),(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.strong,{children:["With default settings (no ",(0,o.jsx)(n.code,{children:"GOOSE_CONTEXT_STRATEGY"})," set)"]}),", you'll see this prompt to choose a management option:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u25c7 The model's context length is maxed out. You will need to reduce the # msgs. Do you want to?\n\u2502 \u25cb Clear Session \n\u2502 \u25cb Truncate Message\n// highlight-start\n\u2502 \u25cf Summarize Session\n// highlight-end\n\nfinal_summary: [A summary of your conversation will appear here]\n\nContext maxed out\n--------------------------------------------------\nGoose summarized messages for you.\n"})}),(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.strong,{children:["With ",(0,o.jsx)(n.code,{children:"GOOSE_CONTEXT_STRATEGY"})," configured"]}),", Goose will automatically apply your chosen strategy:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"# Example with GOOSE_CONTEXT_STRATEGY=summarize\nContext maxed out - automatically summarized messages.\n--------------------------------------------------\nGoose automatically summarized messages for you.\n\n# Example with GOOSE_CONTEXT_STRATEGY=truncate\nContext maxed out - automatically truncated messages.\n--------------------------------------------------\nGoose tried its best to truncate messages for you.\n\n# Example with GOOSE_CONTEXT_STRATEGY=clear\nContext maxed out - automatically cleared session.\n--------------------------------------------------\n"})})]}),(0,o.jsxs)(l.A,{value:"manual",label:"Manual",children:[(0,o.jsxs)(n.p,{children:["To proactively trigger summarization before reaching context limits, use the ",(0,o.jsx)(n.code,{children:"/summarize"})," command:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"( O)> /summarize\n\u25c7 Are you sure you want to summarize this conversation? This will condense the message history.\n\u2502 Yes \n\u2502\nSummarizing conversation...\nConversation has been summarized.\nKey information has been preserved while reducing context length.\n"})})]})]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"maximum-turns",children:"Maximum Turns"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"Max Turns"}),' limit is the maximum number of consecutive turns that Goose can take without user input (default: 1000). When the limit is reached, Goose stops and prompts: "I\'ve reached the maximum number of actions I can do without user input. Would you like me to continue?" If the user answers in the affirmative, Goose continues until the limit is reached and then prompts again.']}),"\n",(0,o.jsx)(n.p,{children:"This feature gives you control over agent autonomy and prevents infinite loops and runaway behavior, which could have significant cost consequences or damaging impact in production environments. Use it for:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Preventing infinite loops and excessive API calls or resource consumption in automated tasks"}),"\n",(0,o.jsx)(n.li,{children:"Enabling human supervision or interaction during autonomous operations"}),"\n",(0,o.jsx)(n.li,{children:"Controlling loops while testing and debugging agent behavior"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["This setting is stored as the ",(0,o.jsx)(n.code,{children:"GOOSE_MAX_TURNS"})," environment variable in your ",(0,o.jsx)(n.a,{href:"/docs/guides/config-file",children:"config.yaml file"}),". You can configure it using the Desktop app or CLI."]}),"\n",(0,o.jsxs)(r.A,{groupId:"interface",children:[(0,o.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Click the gear icon ",(0,o.jsx)(n.code,{children:"\u2699\ufe0f"})," on the top toolbar"]}),"\n",(0,o.jsxs)(n.li,{children:["Click ",(0,o.jsx)(n.code,{children:"Advanced settings"})]}),"\n",(0,o.jsxs)(n.li,{children:["Scroll to ",(0,o.jsx)(n.code,{children:"Conversation Limits"})," and enter a value for ",(0,o.jsx)(n.code,{children:"Max Turns"})]}),"\n"]})}),(0,o.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Run the ",(0,o.jsx)(n.code,{children:"configuration"})," command:"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"Goose Settings"}),":"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure\n\u2502\n\u25c6 What would you like to configure?\n\u2502 \u25cb Configure Providers\n\u2502 \u25cb Add Extension\n\u2502 \u25cb Toggle Extensions\n\u2502 \u25cb Remove Extension\n// highlight-start\n\u2502 \u25cf Goose Settings (Set the Goose Mode, Tool Output, Tool Permissions, Experiment, Goose recipe github repo and more)\n// highlight-end\n\u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["Select ",(0,o.jsx)(n.code,{children:"Max Turns"}),":"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Goose Settings\n\u2502\n\u25c6 What setting would you like to configure?\n\u2502 \u25cb Goose Mode \n\u2502 \u25cb Router Tool Selection Strategy \n\u2502 \u25cb Tool Permission \n\u2502 \u25cb Tool Output \n// highlight-start\n\u2502 \u25cf Max Turns (Set maximum number of turns without user input)\n// highlight-end\n\u2502 \u25cb Toggle Experiment \n\u2502 \u25cb Goose recipe github repo \n\u2502 \u25cb Scheduler Type \n\u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsx)(n.li,{children:"Enter the maximum number of turns:"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Goose Settings \n\u2502\n\u25c7 What setting would you like to configure?\n\u2502 Max Turns \n\u2502\n // highlight-start\n\u25c6 Set maximum number of agent turns without user input:\n\u2502 10\n // highlight-end\n\u2502\n\u2514 Set maximum turns to 10 - Goose will ask for input after 10 consecutive actions\n"})}),(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["In addition to the persistent ",(0,o.jsx)(n.code,{children:"Max Turns"})," setting, you can provide a runtime override for a specific session or task via the ",(0,o.jsx)(n.code,{children:"goose session --max-turns"})," and ",(0,o.jsx)(n.code,{children:"goose run --max-turns"})," ",(0,o.jsx)(n.a,{href:"/docs/guides/goose-cli-commands",children:"CLI commands"}),"."]})})]})]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Choosing the Right Value"})}),"\n",(0,o.jsx)(n.p,{children:"The appropriate max turns value depends on your use case and comfort level with automation:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"5-10 turns"}),': Good for exploratory tasks, debugging, or when you want frequent check-ins. For example, "analyze this codebase and suggest improvements" where you want to review each step']}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"25-50 turns"}),': Effective for well-defined tasks with moderate complexity, such as "refactor this module to use the new API" or "set up a basic CI/CD pipeline"']}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"100+ turns"}),': More suitable for complex, multi-step automation where you trust Goose to work independently, like "migrate this entire project from React 16 to React 18" or "implement comprehensive test coverage for this service"']}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:'Remember that even simple-seeming tasks often require multiple turns. For example, asking Goose to "fix the failing tests" might involve analyzing test output (1 turn), identifying the root cause (1 turn), making code changes (1 turn), and verifying the fix (1 turn).'}),"\n",(0,o.jsx)(n.h2,{id:"token-usage",children:"Token Usage"}),"\n",(0,o.jsx)(n.p,{children:"After sending your first message, Goose Desktop and Goose CLI display token usage."}),"\n",(0,o.jsxs)(r.A,{groupId:"interface",children:[(0,o.jsxs)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,o.jsx)(n.p,{children:"The Desktop displays a colored circle next to the model name at the bottom of the session window. The color provides a visual indicator of your token usage for the session."}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Green"}),": Normal usage - Plenty of context space available"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Orange"}),": Warning state - Approaching limit (80% of capacity)"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Red"}),": Error state - Context limit reached"]}),"\n"]}),(0,o.jsx)(n.p,{children:"Hover over this circle to display:"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"The number of tokens used"}),"\n",(0,o.jsx)(n.li,{children:"The percentage of available tokens used"}),"\n",(0,o.jsx)(n.li,{children:"The total available tokens"}),"\n",(0,o.jsx)(n.li,{children:"A progress bar showing your current token usage"}),"\n"]})]}),(0,o.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsx)(n.p,{children:"The CLI displays a context label above each command prompt, showing:"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["A visual indicator using dots (\u25cf\u25cb) and colors to represent your token usage:","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Green"}),": Below 50% usage"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Yellow"}),": Between 50-85% usage"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Red"}),": Above 85% usage"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.li,{children:"Usage percentage"}),"\n",(0,o.jsx)(n.li,{children:"Current token count and context limit"}),"\n"]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"model-context-limit-overrides",children:"Model Context Limit Overrides"}),"\n",(0,o.jsx)(n.p,{children:"Context limits are automatically detected based on your model name, but Goose provides settings to override the default limits:"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Model"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Best For"}),(0,o.jsx)(n.th,{children:"Setting"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Main"})}),(0,o.jsx)(n.td,{children:"Set context limit for the main model (also serves as fallback for other models)"}),(0,o.jsx)(n.td,{children:"LiteLLM proxies, custom models with non-standard names"}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GOOSE_CONTEXT_LIMIT"})})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Lead"})}),(0,o.jsxs)(n.td,{children:["Set larger context for planning in ",(0,o.jsx)(n.a,{href:"/docs/tutorials/lead-worker",children:"lead/worker mode"})]}),(0,o.jsx)(n.td,{children:"Complex planning tasks requiring more context"}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GOOSE_LEAD_CONTEXT_LIMIT"})})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Worker"})}),(0,o.jsx)(n.td,{children:"Set smaller context for execution in lead/worker mode"}),(0,o.jsx)(n.td,{children:"Cost optimization during execution phase"}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GOOSE_WORKER_CONTEXT_LIMIT"})})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.strong,{children:"Planner"})}),(0,o.jsxs)(n.td,{children:["Set context for ",(0,o.jsx)(n.a,{href:"/docs/guides/creating-plans",children:"planner models"})]}),(0,o.jsx)(n.td,{children:"Large planning tasks requiring extensive context"}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"GOOSE_PLANNER_CONTEXT_LIMIT"})})]})]})]}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsx)(n.p,{children:"This setting only affects the displayed token usage and progress indicators. Actual context management is handled by your LLM, so you may experience more or less usage than the limit you set, regardless of what the display shows."})}),"\n",(0,o.jsx)(n.p,{children:"This feature is particularly useful with:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"LiteLLM Proxy Models"}),": When using LiteLLM with custom model names that don't match Goose's patterns"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Enterprise Deployments"}),": Custom model deployments with non-standard naming"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Fine-tuned Models"}),": Custom models with different context limits than their base versions"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Development/Testing"}),": Temporarily adjusting context limits for testing purposes"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Goose resolves context limits with the following precedence (highest to lowest):"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Explicit context_limit in model configuration (if set programmatically)"}),"\n",(0,o.jsxs)(n.li,{children:["Specific environment variable (e.g., ",(0,o.jsx)(n.code,{children:"GOOSE_LEAD_CONTEXT_LIMIT"}),")"]}),"\n",(0,o.jsxs)(n.li,{children:["Global environment variable (",(0,o.jsx)(n.code,{children:"GOOSE_CONTEXT_LIMIT"}),")"]}),"\n",(0,o.jsx)(n.li,{children:"Model-specific default based on name pattern matching"}),"\n",(0,o.jsx)(n.li,{children:"Global default (128,000 tokens)"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Configuration"})}),"\n",(0,o.jsxs)(r.A,{groupId:"interface",children:[(0,o.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,o.jsx)(n.p,{children:"Model context limit overrides are not yet available in the Goose Desktop app."})}),(0,o.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(n.p,{children:["Context limit overrides only work as ",(0,o.jsx)(n.a,{href:"/docs/guides/environment-variables#model-context-limit-overrides",children:"environment variables"}),", not in the config file."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export GOOSE_CONTEXT_LIMIT=1000\ngoose session\n"})})]})]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Scenarios"})}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"LiteLLM proxy with custom model name"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'# LiteLLM proxy with custom model name\nexport GOOSE_PROVIDER="openai"\nexport GOOSE_MODEL="my-custom-gpt4-proxy"\nexport GOOSE_CONTEXT_LIMIT=200000 # Override the 32k default\n'})}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsx)(n.li,{children:"Lead/worker setup with different context limits"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'# Different context limits for planning vs execution\nexport GOOSE_LEAD_MODEL="claude-opus-custom"\nexport GOOSE_LEAD_CONTEXT_LIMIT=500000 # Large context for planning\nexport GOOSE_WORKER_CONTEXT_LIMIT=128000 # Smaller context for execution\n'})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"Planner with large context"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'# Large context for complex planning\nexport GOOSE_PLANNER_MODEL="gpt-4-custom"\nexport GOOSE_PLANNER_CONTEXT_LIMIT=1000000\n'})}),"\n",(0,o.jsx)(n.h2,{id:"cost-tracking",children:"Cost Tracking"}),"\n",(0,o.jsx)(n.p,{children:"Display estimated real-time costs of your session at the bottom of the Goose Desktop window."}),"\n",(0,o.jsxs)(r.A,{groupId:"interface",children:[(0,o.jsxs)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,o.jsx)(n.p,{children:"To manage live cost tracking:"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Click the gear icon ",(0,o.jsx)(n.code,{children:"\u2699\ufe0f"})," on the top toolbar"]}),"\n",(0,o.jsxs)(n.li,{children:["Click ",(0,o.jsx)(n.code,{children:"Advanced settings"})]}),"\n",(0,o.jsxs)(n.li,{children:["Scroll to ",(0,o.jsx)(n.code,{children:"App Settings"})," and toggle ",(0,o.jsx)(n.code,{children:"Cost Tracking"})," on or off"]}),"\n"]}),(0,o.jsx)(n.p,{children:"The session cost updates dynamically as tokens are consumed. Hover over the cost to see a detailed breakdown of token usage. If multiple models are used in the session, this includes a cost breakdown by model. Ollama and local deployments always show a cost of $0.00."}),(0,o.jsxs)(n.p,{children:["Pricing data is regularly fetched from the OpenRouter API and cached locally. The ",(0,o.jsx)(n.code,{children:"Advanced settings"})," tab shows when the data was last updated and allows you to refresh."]}),(0,o.jsx)(n.p,{children:"These costs are estimates only, and not connected to your actual provider bill. The cost shown is an approximation based on token counts and public pricing data."})]}),(0,o.jsx)(l.A,{value:"cli",label:"Goose CLI",children:(0,o.jsxs)(n.p,{children:["Cost tracking is ",(0,o.jsx)(n.a,{href:"https://github.com/block/goose/issues/3206",children:"not yet available"})," in the Goose CLI."]})})]})]})}function x(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}},79329:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var s=t(34164);const o={tabItem:"tabItem_Ymn6"};var i=t(74848);function r(e){let{children:n,hidden:t,className:r}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,s.A)(o.tabItem,r),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>T});var s=t(96540),o=t(34164),i=t(65627),r=t(56347),l=t(50372),a=t(30604),c=t(11861),d=t(78749);function h(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:t}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:t,attributes:s,default:o}}=e;return{value:n,label:t,attributes:s,default:o}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function x(e){let{queryString:n=!1,groupId:t}=e;const o=(0,r.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,a.aZ)(i),(0,s.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(o.location.search);n.set(i,e),o.replace({...o.location,search:n.toString()})}),[i,o])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:o}=e,i=u(e),[r,a]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=t.find((e=>e.default))??t[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:i}))),[c,h]=x({queryString:t,groupId:o}),[g,p]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[o,i]=(0,d.Dv)(t);return[o,(0,s.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:o}),j=(()=>{const e=c??g;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{j&&a(j)}),[j]);return{selectedValue:r,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);a(e),h(e),p(e)}),[h,p,i]),tabValues:i}}var p=t(9136);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=t(74848);function v(e){let{className:n,block:t,selectedValue:s,selectValue:r,tabValues:l}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),o=l[t].value;o!==s&&(c(n),r(o))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>{a.push(e)},onKeyDown:h,onClick:d,...i,className:(0,o.A)("tabs__item",j.tabItem,i?.className,{"tabs__item--active":s===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:i}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===i));return e?(0,s.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=g(e);return(0,f.jsxs)("div",{className:(0,o.A)("tabs-container",j.tabList),children:[(0,f.jsx)(v,{...n,...e}),(0,f.jsx)(b,{...n,...e})]})}function T(e){const n=(0,p.A)();return(0,f.jsx)(y,{...e,children:h(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>l});var s=t(96540);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}},75395:(e,n,t)=>{t.d(n,{A:()=>l});var s=t(96540);const o=(...e)=>e.filter(((e,n,t)=>Boolean(e)&&""!==e.trim()&&t.indexOf(e)===n)).join(" ").trim();var i={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const r=(0,s.forwardRef)((({color:e="currentColor",size:n=24,strokeWidth:t=2,absoluteStrokeWidth:r,className:l="",children:a,iconNode:c,...d},h)=>(0,s.createElement)("svg",{ref:h,...i,width:n,height:n,stroke:e,strokeWidth:r?24*Number(t)/Number(n):t,className:o("lucide",l),...d},[...c.map((([e,n])=>(0,s.createElement)(e,n))),...Array.isArray(a)?a:[a]]))),l=(e,n)=>{const t=(0,s.forwardRef)((({className:t,...i},l)=>{return(0,s.createElement)(r,{ref:l,iconNode:n,className:o(`lucide-${a=e,a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,t),...i});var a}));return t.displayName=`${e}`,t}}}]); \ No newline at end of file diff --git a/assets/js/12714b95.3c8755aa.js.LICENSE.txt b/assets/js/12714b95.3c8755aa.js.LICENSE.txt new file mode 100644 index 00000000..f02ba941 --- /dev/null +++ b/assets/js/12714b95.3c8755aa.js.LICENSE.txt @@ -0,0 +1,6 @@ +/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/144b023b.b605b2d4.js b/assets/js/144b023b.b605b2d4.js new file mode 100644 index 00000000..6ddb7771 --- /dev/null +++ b/assets/js/144b023b.b605b2d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9015],{45268:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>g,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var i=o(25571),n=o(74848),s=o(28453);const a={title:"Finetuning Toolshim Models for Tool Calling",description:"Addressing performance limitations in models without native tool calling support",authors:["alice","mic"]},l=void 0,r={authorsImageUrls:[void 0,void 0]},c=[];function m(e){const t={a:"a",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"blog cover",src:o(1905).A+"",width:"1200",height:"630"})}),"\n",(0,n.jsxs)(t.p,{children:["Our recently published ",(0,n.jsx)(t.a,{href:"https://block.github.io/goose/blog/2025/03/31/goose-benchmark",children:"Goose benchmark"})," revealed significant performance limitations in models where tool calling is not straightforwardly supported (e.g., Gemma3, Deepseek-r1, phi4). These models often fail to invoke tools at appropriate times or produce malformed or inconsistently formatted tool calls. With the most recent releases of Llama4 and Deepseek v3 (0324), we are again observing challenges with effective tool calling performance, even on these flagship openweight models."]})]})}function g(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},1905:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png"},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>l});var i=o(96540);const n={},s=i.createContext(n);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:t},e.children)}},25571:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/11/finetuning-toolshim","source":"@site/blog/2025-04-11-finetuning-toolshim/index.md","title":"Finetuning Toolshim Models for Tool Calling","description":"Addressing performance limitations in models without native tool calling support","date":"2025-04-11T00:00:00.000Z","tags":[],"readingTime":5.46,"hasTruncateMarker":true,"authors":[{"name":"Alice Hau","title":"Machine Learning Engineer","page":{"permalink":"/goose/blog/authors/alice"},"socials":{"linkedin":"https://www.linkedin.com/in/alice-hau/","github":"https://github.com/alicehau"},"imageURL":"https://avatars.githubusercontent.com/u/110418948?v=4","key":"alice"},{"name":"Michael Neale","title":"Principal Engineer","page":{"permalink":"/goose/blog/authors/mic"},"socials":{"github":"https://github.com/michaelneale"},"imageURL":"https://avatars.githubusercontent.com/u/14976?v=4","key":"mic"}],"frontMatter":{"title":"Finetuning Toolshim Models for Tool Calling","description":"Addressing performance limitations in models without native tool calling support","authors":["alice","mic"]},"unlisted":false,"prevItem":{"title":"How ATrueLight4 Helped Goose Navigate Windows","permalink":"/goose/blog/2025/04/14/community-atruelight4"},"nextItem":{"title":"A Visual Guide To MCP Ecosystem","permalink":"/goose/blog/2025/04/10/visual-guide-mcp"}}')}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.d0606c48.js b/assets/js/14eb3368.d0606c48.js new file mode 100644 index 00000000..1f319b4e --- /dev/null +++ b/assets/js/14eb3368.d0606c48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6969],{57519:(e,t,n)=>{n.d(t,{A:()=>g});n(96540);var s=n(34164),r=n(204),i=n(93751),a=n(30214),l=n(56289),o=n(50539),c=n(29030),d=n(74848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.A,{"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const b={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function x(e){let{children:t,href:n,isLast:s}=e;const r="breadcrumbs__link";return s?(0,d.jsx)("span",{className:r,itemProp:"name",children:t}):n?(0,d.jsx)(l.A,{className:r,href:n,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:t})}):(0,d.jsx)("span",{className:r,children:t})}function p(e){let{children:t,active:n,index:r,addMicrodata:i}=e;return(0,d.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,d.jsx)("meta",{itemProp:"position",content:String(r+1)})]})}function g(){const e=(0,i.OF)(),t=(0,a.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(r.G.docs.docBreadcrumbs,b.breadcrumbsContainer),"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,d.jsx)(h,{}),e.map(((t,n)=>{const s=n===e.length-1,r="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(p,{active:s,index:n,addMicrodata:!!r,children:(0,d.jsx)(x,{href:r,isLast:s,children:t.label})},n)}))]})}):null}},67981:(e,t,n)=>{n.r(t),n.d(t,{default:()=>w});n(96540);var s=n(81082),r=n(93751),i=n(29030),a=n(34164),l=n(56289),o=n(81430),c=n(22887),d=n(50539),u=n(9303);const m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var h=n(74848);function b(e){let{href:t,children:n}=e;return(0,h.jsx)(l.A,{href:t,className:(0,a.A)("card padding--lg",m.cardContainer),children:n})}function x(e){let{href:t,icon:n,title:s,description:r}=e;return(0,h.jsxs)(b,{href:t,children:[(0,h.jsxs)(u.A,{as:"h2",className:(0,a.A)("text--truncate",m.cardTitle),title:s,children:[n," ",s]}),r&&(0,h.jsx)("p",{className:(0,a.A)("text--truncate",m.cardDescription),title:r,children:r})]})}function p(e){let{item:t}=e;const n=(0,r.Nr)(t),s=function(){const{selectMessage:e}=(0,o.W)();return t=>e(t,(0,d.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,h.jsx)(x,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??s(t.items.length)}):null}function g(e){let{item:t}=e;const n=(0,c.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",s=(0,r.cC)(t.docId??void 0);return(0,h.jsx)(x,{href:t.href,icon:n,title:t.label,description:t.description??s?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,h.jsx)(g,{item:t});case"category":return(0,h.jsx)(p,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function f(e){let{className:t}=e;const n=(0,r.$S)();return(0,h.jsx)(j,{items:n.items,className:t})}function j(e){const{items:t,className:n}=e;if(!t)return(0,h.jsx)(f,{...e});const s=(0,r.d1)(t);return(0,h.jsx)("section",{className:(0,a.A)("row",n),children:s.map(((e,t)=>(0,h.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,h.jsx)(v,{item:e})},t)))})}var A=n(43600),N=n(15833),T=n(55730),L=n(57519);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function k(e){let{categoryGeneratedIndex:t}=e;return(0,h.jsx)(s.be,{title:t.title,description:t.description,keywords:t.keywords,image:(0,i.Ay)(t.image)})}function y(e){let{categoryGeneratedIndex:t}=e;const n=(0,r.$S)();return(0,h.jsxs)("div",{className:_.generatedIndexPage,children:[(0,h.jsx)(N.A,{}),(0,h.jsx)(L.A,{}),(0,h.jsx)(T.A,{}),(0,h.jsxs)("header",{children:[(0,h.jsx)(u.A,{as:"h1",className:_.title,children:t.title}),t.description&&(0,h.jsx)("p",{children:t.description})]}),(0,h.jsx)("article",{className:"margin-top--lg",children:(0,h.jsx)(j,{items:n.items,className:_.list})}),(0,h.jsx)("footer",{className:"margin-top--lg",children:(0,h.jsx)(A.A,{previous:t.navigation.previous,next:t.navigation.next})})]})}function w(e){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(k,{...e}),(0,h.jsx)(y,{...e})]})}},43600:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var s=n(50539),r=n(11865),i=n(74848);function a(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(r.A,{...t,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(r.A,{...n,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},55730:(e,t,n)=>{n.d(t,{A:()=>o});n(96540);var s=n(34164),r=n(50539),i=n(204),a=n(21858),l=n(74848);function o(e){let{className:t}=e;const n=(0,a.r)();return n.badge?(0,l.jsx)("span",{className:(0,s.A)(t,i.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(r.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},15833:(e,t,n)=>{n.d(t,{A:()=>p});n(96540);var s=n(34164),r=n(40797),i=n(56289),a=n(50539),l=n(56942),o=n(204),c=n(96351),d=n(21858),u=n(74848);const m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const t=m[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function b(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.A,{to:n,onClick:s,children:(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:i}}=(0,r.A)(),{pluginId:a}=(0,l.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(a),{latestDocSuggestion:m,latestVersionSuggestion:x}=(0,l.HW)(a),p=m??(g=x).docs.find((e=>e.id===g.mainDocId));var g;return(0,u.jsxs)("div",{className:(0,s.A)(t,o.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:n})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(b,{versionLabel:x.label,to:p.path,onClick:()=>d(x.name)})})]})}function p(e){let{className:t}=e;const n=(0,d.r)();return n.banner?(0,u.jsx)(x,{className:t,versionMetadata:n}):null}},11865:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var s=n(34164),r=n(56289),i=n(74848);function a(e){const{permalink:t,title:n,subLabel:a,isNext:l}=e;return(0,i.jsxs)(r.A,{className:(0,s.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[a&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},81430:(e,t,n)=>{n.d(t,{W:()=>c});var s=n(96540),r=n(40797);const i=["zero","one","two","few","many","other"];function a(e){return i.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,r.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function c(){const e=o();return{selectMessage:(t,n)=>function(e,t,n){const s=e.split("|");if(1===s.length)return s[0];s.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const r=n.select(t),i=n.pluralForms.indexOf(r);return s[Math.min(i,s.length-1)]}(n,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/15a67330.e5a7fa6d.js b/assets/js/15a67330.e5a7fa6d.js new file mode 100644 index 00000000..62461060 --- /dev/null +++ b/assets/js/15a67330.e5a7fa6d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1875],{32704:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>n,toc:()=>c});var n=o(88124),s=o(74848),i=o(28453);const a={title:"MCP in the Enterprise: Real World Adoption at Block",description:"How Block is using MCP to power real world automation company-wide.",authors:["angie"]},r=void 0,l={authorsImageUrls:[void 0]},c=[];function p(e){const t={a:"a",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"blog cover",src:o(71708).A+"",width:"1200",height:"630"})}),"\n",(0,s.jsxs)(t.p,{children:["At Block, we've been exploring how to make AI agents genuinely useful in a business setting. Not just for demos or prototypes, but for real, everyday work.\nAs one of the early collaborators on the ",(0,s.jsx)(t.a,{href:"https://www.anthropic.com/news/model-context-protocol",children:"Model Context Protocol (MCP)"}),", we partnered with Anthropic to help shape and define the open standard that bridges AI agents with real-world tools and data."]}),"\n",(0,s.jsx)(t.p,{children:"MCP lets AI agents interact with APIs, tools, and data systems through a common interface. It eliminates the guesswork by exposing deterministic tool definitions, so the agent doesn't have to guess how to call an API.\nInstead, it focuses on what we actually want... results!"}),"\n",(0,s.jsx)(t.p,{children:"While others are still experimenting, we've rolled this out company-wide at Block, and with real impact."})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},71708:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/mcp-for-enterprise-5912379e407d5f5139b2636dcfc138f5.png"},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>r});var n=o(96540);const s={},i=n.createContext(s);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}},88124:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/21/mcp-in-enterprise","source":"@site/blog/2025-04-21-mcp-in-enterprise/index.mdx","title":"MCP in the Enterprise: Real World Adoption at Block","description":"How Block is using MCP to power real world automation company-wide.","date":"2025-04-21T00:00:00.000Z","tags":[],"readingTime":5.085,"hasTruncateMarker":true,"authors":[{"name":"Angie Jones","title":"Head of Developer Relations","url":"https://angiejones.tech","page":{"permalink":"/goose/blog/authors/angie"},"socials":{"linkedin":"https://www.linkedin.com/in/angiejones/","github":"https://github.com/angiejones","x":"https://x.com/techgirl1908","bluesky":"https://bsky.app/profile/angiejones.tech"},"imageURL":"https://avatars.githubusercontent.com/u/15972783?v=4","key":"angie"}],"frontMatter":{"title":"MCP in the Enterprise: Real World Adoption at Block","description":"How Block is using MCP to power real world automation company-wide.","authors":["angie"]},"unlisted":false,"prevItem":{"title":"MCP Is Rewriting the Rules of API Integration","permalink":"/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration"},"nextItem":{"title":"11 Practical Ways I Use AI Agents Without Losing My Authenticity","permalink":"/goose/blog/2025/04/21/practical-use-cases-of-ai"}}')}}]); \ No newline at end of file diff --git a/assets/js/16df7e74.1fbd415b.js b/assets/js/16df7e74.1fbd415b.js new file mode 100644 index 00000000..216f0cf0 --- /dev/null +++ b/assets/js/16df7e74.1fbd415b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1905],{65783:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>n,toc:()=>d});var n=o(64187),i=o(74848),a=o(28453);const s={title:"Cracking the Code with VS Code MCP",description:"Connect Goose directly to your code editor with this Visual Studio Code MCP.",authors:["tania"]},r=void 0,c={authorsImageUrls:[void 0]},d=[];function h(e){const t={a:"a",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"blog cover",src:o(25929).A+"",width:"1206",height:"633"})}),"\n",(0,i.jsxs)(t.p,{children:["Want to use Goose in VS Code? On the recent ",(0,i.jsx)(t.a,{href:"https://www.youtube.com/watch?v=hG7AnTw-GLU&ab_channel=BlockOpenSource",children:"Wild Goose Case livestream"}),", hosts ",(0,i.jsx)(t.a,{href:"https://www.linkedin.com/in/ebonylouis/",children:"Ebony Louis"})," and ",(0,i.jsx)(t.a,{href:"https://www.linkedin.com/in/acekyd/",children:"Adewale Abati"})," were joined by ",(0,i.jsx)(t.a,{href:"https://www.linkedin.com/in/andrewgertig/",children:"Andrew Gertig"}),", Engineering Lead at Cash App, as he demonstrated the new VSCode MCP and how it brings powerful Goose-assisted coding capabilities directly into VS Code."]})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},25929:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/vscodestream-74eafa34e7ae10cfb738feddecc98519.png"},28453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>r});var n=o(96540);const i={},a=n.createContext(i);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(a.Provider,{value:t},e.children)}},64187:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/21/goose-vscode","source":"@site/blog/2025-03-21-goose-vscode/index.md","title":"Cracking the Code with VS Code MCP","description":"Connect Goose directly to your code editor with this Visual Studio Code MCP.","date":"2025-03-21T00:00:00.000Z","tags":[],"readingTime":3.045,"hasTruncateMarker":true,"authors":[{"name":"Tania Chakraborty","title":"Senior Technical Community Manager","url":"https://taniachakraborty.com","page":{"permalink":"/goose/blog/authors/tania"},"socials":{"linkedin":"https://www.linkedin.com/in/taniachakraborty/","x":"https://x.com/taniashiba","github":"https://github.com/taniashiba","bluesky":"https://bsky.app/profile/taniachakraborty.com"},"imageURL":"https://avatars.githubusercontent.com/u/126204004?v=4","key":"tania"}],"frontMatter":{"title":"Cracking the Code with VS Code MCP","description":"Connect Goose directly to your code editor with this Visual Studio Code MCP.","authors":["tania"]},"unlisted":false,"prevItem":{"title":"Codename Goose Goes to Boston","permalink":"/goose/blog/2025/03/21/goose-boston-meetup"},"nextItem":{"title":"How I Use Goose to Plan My Week with Asana and Google Calendar MCPs","permalink":"/goose/blog/2025/03/20/asana-calendar-mcp"}}')}}]); \ No newline at end of file diff --git a/assets/js/17153df0.3d1c05af.js b/assets/js/17153df0.3d1c05af.js new file mode 100644 index 00000000..ea1be740 --- /dev/null +++ b/assets/js/17153df0.3d1c05af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6082],{46911:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"guides/goose-cli-commands","title":"CLI Commands","description":"Goose provides a command-line interface (CLI) with several commands for managing sessions, configurations and extensions. Below is a list of the available commands and their descriptions:","source":"@site/docs/guides/goose-cli-commands.md","sourceDirName":"guides","slug":"/guides/goose-cli-commands","permalink":"/goose/docs/guides/goose-cli-commands","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"CLI Commands","sidebar_label":"CLI Commands"},"sidebar":"tutorialSidebar","previous":{"title":"Quick Tips","permalink":"/goose/docs/guides/tips"},"next":{"title":"CLI Providers","permalink":"/goose/docs/guides/cli-providers"}}');var o=n(74848),r=n(28453);const t={sidebar_position:7,title:"CLI Commands",sidebar_label:"CLI Commands"},l=void 0,d={},c=[{value:"Commands",id:"commands",level:2},{value:"help",id:"help",level:3},{value:"configure [options]",id:"configure-options",level:3},{value:"session [options]",id:"session-options",level:3},{value:"Start a session and give it a name",id:"start-a-session-and-give-it-a-name",level:4},{value:"Resume a previous session",id:"resume-a-previous-session",level:4},{value:"Start a session with the specified extension",id:"start-a-session-with-the-specified-extension",level:4},{value:"Start a session with the specified remote extension over SSE",id:"start-a-session-with-the-specified-remote-extension-over-sse",level:4},{value:"Start a session with the specified remote extension over Streaming HTTP",id:"start-a-session-with-the-specified-remote-extension-over-streaming-http",level:4},{value:"Start a session with the specified built-in extension enabled (e.g. 'developer')",id:"start-a-session-with-the-specified-built-in-extension-enabled-eg-developer",level:4},{value:"Enable debug mode to output complete tool responses, detailed parameter values, and full file paths",id:"enable-debug-mode-to-output-complete-tool-responses-detailed-parameter-values-and-full-file-paths",level:4},{value:"Limit the maximum number of turns the agent can take before asking for user input to continue",id:"limit-the-maximum-number-of-turns-the-agent-can-take-before-asking-for-user-input-to-continue",level:4},{value:"Set the maximum number of turns allowed without user input (default: 1000)",id:"set-the-maximum-number-of-turns-allowed-without-user-input-default-1000",level:4},{value:"session list [options]",id:"session-list-options",level:3},{value:"session remove [options]",id:"session-remove-options",level:3},{value:"session export [options]",id:"session-export-options",level:3},{value:"info [options]",id:"info-options",level:3},{value:"version",id:"version",level:3},{value:"update [options]",id:"update-options",level:3},{value:"mcp",id:"mcp",level:3},{value:"run [options]",id:"run-options",level:3},{value:"bench",id:"bench",level:3},{value:"recipe",id:"recipe",level:3},{value:"schedule",id:"schedule",level:3},{value:"project",id:"project",level:3},{value:"projects",id:"projects",level:3},{value:"web",id:"web",level:3},{value:"Prompt Completion",id:"prompt-completion",level:2},{value:"Available Commands",id:"available-commands",level:4},{value:"Examples",id:"examples",level:4},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:2},{value:"Keyboard Navigation",id:"keyboard-navigation",level:3},{value:"Slash Commands",id:"slash-commands",level:3},{value:"Themes",id:"themes",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:"Goose provides a command-line interface (CLI) with several commands for managing sessions, configurations and extensions. Below is a list of the available commands and their descriptions:"}),"\n",(0,o.jsx)(s.h2,{id:"commands",children:"Commands"}),"\n",(0,o.jsx)(s.h3,{id:"help",children:"help"}),"\n",(0,o.jsx)(s.p,{children:"Used to display the help menu"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose --help\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"configure-options",children:"configure [options]"}),"\n",(0,o.jsx)(s.p,{children:"Configure Goose settings - providers, extensions, etc."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose configure\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"session-options",children:"session [options]"}),"\n",(0,o.jsx)(s.h4,{id:"start-a-session-and-give-it-a-name",children:"Start a session and give it a name"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-n, --name "})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --name \n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h4,{id:"resume-a-previous-session",children:"Resume a previous session"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-r, --resume"})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --resume --name \n"})}),"\n",(0,o.jsxs)(s.p,{children:["Or, if you didn't name your session, you can locate it by the session id generated by Goose, e.g. ",(0,o.jsx)(s.code,{children:"2025250620_013617"}),"."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --resume --id \n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h4,{id:"start-a-session-with-the-specified-extension",children:"Start a session with the specified extension"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-extension "})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --with-extension \n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:'goose session --with-extension "npx -y @modelcontextprotocol/server-memory"\n'})}),"\n",(0,o.jsx)(s.p,{children:"With environment variable:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:'goose session --with-extension "GITHUB_PERSONAL_ACCESS_TOKEN= npx -y @modelcontextprotocol/server-github"\n'})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h4,{id:"start-a-session-with-the-specified-remote-extension-over-sse",children:"Start a session with the specified remote extension over SSE"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-remote-extension "})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --with-remote-extension \n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:'goose session --with-remote-extension "http://localhost:8080/sse"\n'})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h4,{id:"start-a-session-with-the-specified-remote-extension-over-streaming-http",children:"Start a session with the specified remote extension over Streaming HTTP"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-streamable-http-extension "})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --with-streamable-http-extension \n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:'goose session --with-streamable-http-extension "https://example.com/streamable"\n'})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Advanced Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:'# Start a session with a streamable HTTP extension\ngoose session --with-streamable-http-extension "http://api.example.com"\n\n# Use multiple streamable HTTP extensions\ngoose session \\\n --with-streamable-http-extension "http://api1.example.com" \\\n --with-streamable-http-extension "http://api2.example.com"\n\n# Mix different extension types\ngoose session \\\n --with-extension "echo hello" \\\n --with-remote-extension "http://sse.example.com/sse" \\\n --with-streamable-http-extension "http://http.example.com" \\\n --with-builtin "developer"\n'})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsxs)(s.h4,{id:"start-a-session-with-the-specified-built-in-extension-enabled-eg-developer",children:["Start a session with the specified ",(0,o.jsx)(s.a,{href:"/docs/getting-started/using-extensions#built-in-extensions",children:"built-in extension"})," enabled (e.g. 'developer')"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-builtin "})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --with-builtin \n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Example:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --with-builtin computercontroller\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h4,{id:"enable-debug-mode-to-output-complete-tool-responses-detailed-parameter-values-and-full-file-paths",children:"Enable debug mode to output complete tool responses, detailed parameter values, and full file paths"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--debug"})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --name my-session --debug\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h4,{id:"limit-the-maximum-number-of-turns-the-agent-can-take-before-asking-for-user-input-to-continue",children:"Limit the maximum number of turns the agent can take before asking for user input to continue"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--max-turns "})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --max-turns 50\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsxs)(s.h4,{id:"set-the-maximum-number-of-turns-allowed-without-user-input-default-1000",children:["Set the ",(0,o.jsx)(s.a,{href:"/docs/guides/smart-context-management#maximum-turns",children:"maximum number of turns"})," allowed without user input (default: 1000)"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--max-turns "})})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose session --max-turns 10\n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Low limit for step-by-step control\ngoose session --max-turns 3\n\n# Moderate limit for controlled automation\ngoose session --max-turns 25\n\n# Combined with other options\ngoose session --name my-project --max-turns 10 --debug\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"session-list-options",children:"session list [options]"}),"\n",(0,o.jsx)(s.p,{children:"List all saved sessions."}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-v, --verbose"})}),": (Optional) Includes session file paths in the output."]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-f, --format "})}),": Specify output format (",(0,o.jsx)(s.code,{children:"text"})," or ",(0,o.jsx)(s.code,{children:"json"}),"). Default is ",(0,o.jsx)(s.code,{children:"text"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--ascending"})}),": Sort sessions by date in ascending order (oldest first). Default is descending order (newest first)."]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# List all sessions in text format (default)\ngoose session list\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# List sessions with file paths\ngoose session list --verbose\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# List sessions in JSON format\ngoose session list --format json\n"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Sort sessions by date in ascending order.\ngoose session list --ascending\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"session-remove-options",children:"session remove [options]"}),"\n",(0,o.jsx)(s.p,{children:"Remove one or more saved sessions."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-i, --id "})}),": Remove a specific session by its ID"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-r, --regex "})}),": Remove sessions matching a regex pattern. For example:"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:'# Remove a specific session by ID\ngoose session remove -i 20250305_113223\n\n# Remove all sessions starting with "project-"\ngoose session remove -r "project-.*"\n\n# Remove all sessions containing "migration"\ngoose session remove -r ".*migration.*"\n'})}),"\n",(0,o.jsx)(s.admonition,{type:"caution",children:(0,o.jsx)(s.p,{children:"Session removal is permanent and cannot be undone. Goose will show which sessions will be removed and ask for confirmation before deleting."})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"session-export-options",children:"session export [options]"}),"\n",(0,o.jsx)(s.p,{children:"Export a session to Markdown format for sharing, documentation, or archival purposes."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-n, --name "})}),": Export a specific session by name"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-p, --path "})}),": Export a specific session by file path"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-o, --output "})}),": Save exported content to a file (default: stdout)"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Export specific session to file\ngoose session export --name my-session --output session.md\n\n# Export specific session to stdout\ngoose session export --name my-session\n\n# Interactive export (prompts for session selection)\ngoose session export\n\n# Export session by path\ngoose session export --path ./my-session.jsonl --output exported.md\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"info-options",children:"info [options]"}),"\n",(0,o.jsx)(s.p,{children:"Shows Goose information, including the version, configuration file location, session storage, and logs."}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-v, --verbose"})}),": (Optional) Show detailed configuration settings, including environment variables and enabled extensions."]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose info\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"version",children:"version"}),"\n",(0,o.jsx)(s.p,{children:"Used to check the current Goose version you have installed"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose --version\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"update-options",children:"update [options]"}),"\n",(0,o.jsx)(s.p,{children:"Update the Goose CLI to a newer version."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--canary, -c"})}),": Update to the canary (development) version instead of the stable version"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--reconfigure, -r"})}),": Forces Goose to reset configuration settings during the update process"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Update to latest stable version\ngoose update\n\n# Update to latest canary version\ngoose update --canary\n\n# Update and reconfigure settings\ngoose update --reconfigure\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"mcp",children:"mcp"}),"\n",(0,o.jsxs)(s.p,{children:["Run an enabled MCP server specified by ",(0,o.jsx)(s.code,{children:""})," (e.g. ",(0,o.jsx)(s.code,{children:"'Google Drive'"}),")"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose mcp \n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"run-options",children:"run [options]"}),"\n",(0,o.jsxs)(s.p,{children:["Execute commands from an instruction file or stdin. Check out the ",(0,o.jsx)(s.a,{href:"/docs/guides/running-tasks",children:"full guide"})," for more info."]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-i, --instructions "})}),": Path to instruction file containing commands. Use - for stdin."]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-t, --text "})}),": Input text to provide to Goose directly"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-s, --interactive"})}),": Continue in interactive mode after processing initial input"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-n, --name "})}),": Name for this run session (e.g. ",(0,o.jsx)(s.code,{children:"daily-tasks"}),")"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-r, --resume"})}),": Resume from a previous run"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--recipe "})}),": Load a custom recipe in current session"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-p, --path "})}),": Path for this run session (e.g. ",(0,o.jsx)(s.code,{children:"./playground.jsonl"}),")"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-extension "})}),": Add stdio extensions (can be used multiple times in the same command)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-remote-extension "})}),": Add remote extensions over SSE (can be used multiple times in the same command)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-streamable-http-extension "})}),": Add remote extensions over Streaming HTTP (can be used multiple times in the same command)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--with-builtin "})}),": Add builtin extensions by name (e.g., 'developer' or multiple: 'developer,github')"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--debug"})}),": Output complete tool responses, detailed parameter values, and full file paths"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--max-turns "})}),": ",(0,o.jsx)(s.a,{href:"/docs/guides/smart-context-management#maximum-turns",children:"Maximum number of turns"})," allowed without user input (default: 1000)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--explain"})}),": Show a recipe's title, description, and parameters"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--no-session"})}),": Run goose commands without creating or storing a session file"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--max-turns "})}),": Limit the maximum number of turns the agent can take before asking for user input to continue (default: 1000)"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose run --instructions plan.md\n\n#Load a recipe with a prompt that Goose executes and then exits \ngoose run --recipe recipe.yaml\n\n#Load a recipe from this chat and then stays in an interactive session\ngoose run --recipe recipe.yaml -s\n\n#Load a recipe containing a prompt which Goose executes and then drops into an interactive session\ngoose run --recipe recipe.yaml --interactive\n\n#Generates an error: no text provided for prompt in headless mode\ngoose run --recipe recipe_no_prompt.yaml\n\n#Load a recipe in debug mode\ngoose run --recipe recipe.yaml --debug\n\n#Show recipe details\ngoose run --recipe recipe.yaml --explain\n\n#Run instructions from a file without session storage\ngoose run --no-session -i instructions.txt\n\n#Run with a limit of 25 turns before asking for user input\ngoose run --max-turns 25 -i plan.md\n\n#Run with limited turns before prompting user\ngoose run --recipe recipe.yaml --max-turns 10\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"bench",children:"bench"}),"\n",(0,o.jsxs)(s.p,{children:["Used to evaluate system-configuration across a range of practical tasks. See the ",(0,o.jsx)(s.a,{href:"/docs/tutorials/benchmarking",children:"detailed guide"})," for more information."]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose bench ...etc.\n"})}),"\n",(0,o.jsx)(s.h3,{id:"recipe",children:"recipe"}),"\n",(0,o.jsx)(s.p,{children:"Used to validate recipe files and manage recipe sharing."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose recipe \n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Commands:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"validate "}),": Validate a recipe file"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"deeplink "}),": Generate a shareable link for a recipe file"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"--help, -h"}),": Print help information"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Validate a recipe file\ngoose recipe validate my-recipe.yaml\n\n# Generate a shareable link\ngoose recipe deeplink my-recipe.yaml\n\n# Get help about recipe commands\ngoose recipe help\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"schedule",children:"schedule"}),"\n",(0,o.jsx)(s.p,{children:"Automate recipes by running them on a schedule using a cron job."}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose schedule \n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Commands:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"add "}),": Create a new scheduled job. Copies the current version of the recipe to ",(0,o.jsx)(s.code,{children:"~/.local/share/goose/scheduled_recipes"})]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"list"}),": View all scheduled jobs"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"remove"}),": Delete a scheduled job"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"sessions"}),": List sessions created by a scheduled recipe"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"run-now"}),": Run a scheduled recipe immediately"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"--id "}),": A unique ID for the scheduled job (e.g. ",(0,o.jsx)(s.code,{children:"daily-report"}),")"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:'--cron "* * * * * *"'}),": Specifies when a job should run using a 6-field ",(0,o.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Cron#Cron_expression",children:"cron expression"}),' represented as a string in the format "seconds minutes hours day-of-month month day-of-week"']}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"--recipe-source "}),": Path to the recipe YAML file"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"--limit "}),": (Optional) max number of sessions to display when using the ",(0,o.jsx)(s.code,{children:"sessions"})," command"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:'# Add a new scheduled recipe which runs every day at 9 AM\ngoose schedule add --id daily-report --cron "0 0 9 * * *" --recipe-source ./recipes/daily-report.yaml\n\n# List all scheduled jobs\ngoose schedule list\n\n# List the 10 most recent Goose sessions created by a scheduled job\ngoose schedule sessions --id daily-report --limit 10\n\n# Run a recipe immediately\ngoose schedule run-now --id daily-report\n\n# Remove a scheduled job\ngoose schedule remove --id daily-report\n'})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"project",children:"project"}),"\n",(0,o.jsx)(s.p,{children:"Start working on your last project or create a new one."}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Alias"}),": ",(0,o.jsx)(s.code,{children:"p"})]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose project\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For a complete guide, see ",(0,o.jsx)(s.a,{href:"/docs/guides/managing-projects",children:"Managing Projects Guide"}),"."]}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"projects",children:"projects"}),"\n",(0,o.jsx)(s.p,{children:"Choose one of your projects to start working on."}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.strong,{children:"Alias"}),": ",(0,o.jsx)(s.code,{children:"ps"})]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose projects\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For detailed usage examples and workflows, see ",(0,o.jsx)(s.a,{href:"/docs/guides/managing-projects",children:"Managing Projects Guide"}),"."]}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h3,{id:"web",children:"web"}),"\n",(0,o.jsx)(s.p,{children:"Start a new session in Goose Web, a lightweight web-based interface launched via the CLI that mirrors the desktop app's chat experience."}),"\n",(0,o.jsx)(s.p,{children:"Goose Web is particularly useful when:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"You want to access Goose with a graphical interface without installing the desktop app"}),"\n",(0,o.jsx)(s.li,{children:"You need to use Goose from different devices, including mobile"}),"\n",(0,o.jsx)(s.li,{children:"You're working in an environment where installing desktop apps isn't practical"}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Usage:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"goose web\n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Options:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"-p, --port "})}),": Port number to run the web server on. Default is ",(0,o.jsx)(s.code,{children:"3000"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--host "})}),": Host to bind the web server to. Default is ",(0,o.jsx)(s.code,{children:"127.0.0.1"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"--open"})}),": Automatically open the browser when the server starts."]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Start web interface at `http://127.0.0.1:3000` and open the browser\ngoose web --open\n\n# Start web interface at `http://127.0.0.1:8080` \ngoose web --port 8080\n\n# Start web interface accessible from local network at `http://192.168.1.7:8080`\ngoose web --host 192.168.1.7 --port 8080\n"})}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Limitations:"})}),"\n",(0,o.jsx)(s.p,{children:"While the web interface provides most core features, be aware of these limitations:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"Some file system operations may require additional confirmation"}),"\n",(0,o.jsx)(s.li,{children:"Extension management must be done through the CLI"}),"\n",(0,o.jsx)(s.li,{children:"Certain tool interactions might need extra setup"}),"\n",(0,o.jsx)(s.li,{children:"Configuration changes require a server restart"}),"\n"]}),"\n",(0,o.jsx)(s.admonition,{type:"warning",children:(0,o.jsx)(s.p,{children:"Don't expose the web interface to the internet without proper security measures."})}),"\n",(0,o.jsx)(s.admonition,{type:"info",children:(0,o.jsxs)(s.p,{children:["Use ",(0,o.jsx)(s.code,{children:"Ctrl-C"})," to stop the server."]})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h2,{id:"prompt-completion",children:"Prompt Completion"}),"\n",(0,o.jsx)(s.p,{children:"The CLI provides a set of slash commands that can be accessed during a session. These commands support tab completion for easier use."}),"\n",(0,o.jsx)(s.h4,{id:"available-commands",children:"Available Commands"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/?"})," or ",(0,o.jsx)(s.code,{children:"/help"})," - Display this help message"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/builtin "})," - Add builtin extensions by name (comma-separated)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/exit"})," or ",(0,o.jsx)(s.code,{children:"/quit"})," - Exit the current session"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/extension "})," - Add a stdio extension (format: ENV1=val1 command args...)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/mode "})," - Set the goose mode to use ('auto', 'approve', 'chat')"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/plan "})," - Create a structured plan based on the given message"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/prompt [--info] [key=value...]"})," - Get prompt info or execute a prompt"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/prompts [--extension ]"})," - List all available prompts, optionally filtered by extension"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/recipe "})," - Generate and save a session recipe to ",(0,o.jsx)(s.code,{children:"recipe.yaml"})," or the filename specified by the command parameter."]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/summarize"})," - Summarize the current session to reduce context length while preserving key information"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/t"})," - Toggle between ",(0,o.jsx)(s.code,{children:"light"}),", ",(0,o.jsx)(s.code,{children:"dark"}),", and ",(0,o.jsx)(s.code,{children:"ansi"})," themes"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/t "})," - Set the ",(0,o.jsx)(s.code,{children:"light"}),", ",(0,o.jsx)(s.code,{children:"dark"}),", or ",(0,o.jsx)(s.code,{children:"ansi"})," theme"]}),"\n"]}),"\n",(0,o.jsxs)(s.p,{children:["All commands support tab completion. Press ",(0,o.jsx)(s.code,{children:""})," after a slash (/) to cycle through available commands or to complete partial commands."]}),"\n",(0,o.jsx)(s.h4,{id:"examples",children:"Examples"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Create a plan for triaging test failures\n/plan let's create a plan for triaging test failures\n\n# List all prompts from the developer extension\n/prompts --extension developer\n\n# Switch to chat mode\n/mode chat\n"})}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsx)(s.h2,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,o.jsx)(s.p,{children:"Goose CLI supports several shortcuts and built-in commands for easier navigation."}),"\n",(0,o.jsx)(s.h3,{id:"keyboard-navigation",children:"Keyboard Navigation"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"Ctrl+C"})})," - Interrupt the current request"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"Ctrl+J"})})," - Add a newline"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"Cmd+Up/Down arrows"})})," - Navigate through command history"]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"slash-commands",children:"Slash Commands"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsxs)(s.strong,{children:[(0,o.jsx)(s.code,{children:"/exit"})," or ",(0,o.jsx)(s.code,{children:"/quit"})]})," - Exit the session"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"/t"})})," - Toggle between ",(0,o.jsx)(s.code,{children:"light"}),", ",(0,o.jsx)(s.code,{children:"dark"}),", and ",(0,o.jsx)(s.code,{children:"ansi"})," themes"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.strong,{children:(0,o.jsx)(s.code,{children:"/t "})})," - Set the ",(0,o.jsx)(s.code,{children:"light"}),", ",(0,o.jsx)(s.code,{children:"dark"}),", or ",(0,o.jsx)(s.code,{children:"ansi"})," theme"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsxs)(s.strong,{children:[(0,o.jsx)(s.code,{children:"/?"})," or ",(0,o.jsx)(s.code,{children:"/help"})]})," - Display the help menu"]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"themes",children:"Themes"}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"/t"})," command controls the syntax highlighting theme for markdown content in Goose CLI responses. This affects the styles used for headers, code blocks, bold/italic text, and other markdown elements in the response output."]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Commands:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/t"})," - Cycles through themes: ",(0,o.jsx)(s.code,{children:"light"})," \u2192 ",(0,o.jsx)(s.code,{children:"dark"})," \u2192 ",(0,o.jsx)(s.code,{children:"ansi"})," \u2192 ",(0,o.jsx)(s.code,{children:"light"})]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/t light"})," - Sets ",(0,o.jsx)(s.code,{children:"light"})," theme (subtle light colors)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/t dark"})," - Sets ",(0,o.jsx)(s.code,{children:"dark"})," theme (subtle darker colors)"]}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"/t ansi"})," - Sets ",(0,o.jsx)(s.code,{children:"ansi"})," theme (most visually distinct option with brighter colors)"]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Configuration:"})}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["The default theme is ",(0,o.jsx)(s.code,{children:"dark"})]}),"\n",(0,o.jsxs)(s.li,{children:["The theme setting is saved to the ",(0,o.jsx)(s.a,{href:"/docs/guides/config-file",children:"configuration file"})," as ",(0,o.jsx)(s.code,{children:"GOOSE_CLI_THEME"})," and persists between sessions"]}),"\n",(0,o.jsxs)(s.li,{children:["The saved configuration can be overridden for the session using the ",(0,o.jsx)(s.code,{children:"GOOSE_CLI_THEME"})," ",(0,o.jsx)(s.a,{href:"/docs/guides/environment-variables#session-management",children:"environment variable"})]}),"\n"]}),"\n",(0,o.jsxs)(s.admonition,{type:"info",children:[(0,o.jsxs)(s.p,{children:["Syntax highlighting styles only affect the font, not the overall terminal interface. The ",(0,o.jsx)(s.code,{children:"light"})," and ",(0,o.jsx)(s.code,{children:"dark"})," themes have subtle differences in font color and weight."]}),(0,o.jsx)(s.p,{children:"The Goose CLI theme is independent from the Goose Desktop theme."})]}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.strong,{children:"Examples:"})}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"# Set ANSI theme for the session via environment variable\nexport GOOSE_CLI_THEME=ansi\ngoose session --name use-custom-theme\n\n# Toggle theme during a session\n/t\n\n# Set the light theme during a session\n/t light\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},28453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>l});var i=n(96540);const o={},r=i.createContext(o);function t(e){const s=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),i.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1718.6b1e85d3.js b/assets/js/1718.6b1e85d3.js new file mode 100644 index 00000000..8abfac87 --- /dev/null +++ b/assets/js/1718.6b1e85d3.js @@ -0,0 +1,2 @@ +/*! For license information please see 1718.6b1e85d3.js.LICENSE.txt */ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1718],{52362:(e,n,t)=>{t.d(n,{A:()=>H});var i=t(96540),o=t(74848);function s(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=i.Children.toArray(e),t=n.find((e=>i.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),s=n.filter((e=>e!==t)),r=t?.props.children;return{mdxAdmonitionTitle:r,rest:s.length>0?(0,o.jsx)(o.Fragment,{children:s}):null}}(e.children),s=e.title??n;return{...e,...s&&{title:s},children:t}}var r=t(34164),c=t(50539),l=t(204);const a="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function f(e){let{type:n,className:t,children:i}=e;return(0,o.jsx)("div",{className:(0,r.A)(l.G.common.admonition,l.G.common.admonitionType(n),a,t),children:i})}function m(e){let{icon:n,title:t}=e;return(0,o.jsxs)("div",{className:d,children:[(0,o.jsx)("span",{className:u,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,o.jsx)("div",{className:h,children:n}):null}function x(e){const{type:n,icon:t,title:i,children:s,className:r}=e;return(0,o.jsxs)(f,{type:n,className:r,children:[i||t?(0,o.jsx)(m,{title:i,icon:t}):null,(0,o.jsx)(p,{children:s})]})}function v(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,o.jsx)(v,{}),title:(0,o.jsx)(c.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,o.jsx)(x,{...j,...e,className:(0,r.A)("alert alert--secondary",e.className),children:e.children})}function y(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const A={icon:(0,o.jsx)(y,{}),title:(0,o.jsx)(c.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,o.jsx)(x,{...A,...e,className:(0,r.A)("alert alert--success",e.className),children:e.children})}function C(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,o.jsx)(C,{}),title:(0,o.jsx)(c.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function M(e){return(0,o.jsx)(x,{...N,...e,className:(0,r.A)("alert alert--info",e.className),children:e.children})}function z(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const R={icon:(0,o.jsx)(z,{}),title:(0,o.jsx)(c.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function k(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const E={icon:(0,o.jsx)(k,{}),title:(0,o.jsx)(c.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const T={icon:(0,o.jsx)(z,{}),title:(0,o.jsx)(c.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const b={...{note:g,tip:w,info:M,warning:function(e){return(0,o.jsx)(x,{...R,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(x,{...E,...e,className:(0,r.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(g,{title:"secondary",...e}),important:e=>(0,o.jsx)(M,{title:"important",...e}),success:e=>(0,o.jsx)(w,{title:"success",...e}),caution:function(e){return(0,o.jsx)(x,{...T,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})}}};function H(e){const n=s(e),t=(i=n.type,b[i]||(console.warn(`No admonition component found for admonition type "${i}". Using Info as fallback.`),b.info));var i;return(0,o.jsx)(t,{...n})}},86297:(e,n,t)=>{t.d(n,{N:()=>v});var i=t(74848),o=t(96540),s=t(29473),r=t(28601),c=t(86719),l=t(35446);class a extends o.Component{getSnapshotBeforeUpdate(e){const n=this.props.childRef.current;if(n&&e.isPresent&&!this.props.isPresent){const e=this.props.sizeRef.current;e.height=n.offsetHeight||0,e.width=n.offsetWidth||0,e.top=n.offsetTop,e.left=n.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function d({children:e,isPresent:n}){const t=(0,o.useId)(),s=(0,o.useRef)(null),r=(0,o.useRef)({width:0,height:0,top:0,left:0}),{nonce:c}=(0,o.useContext)(l.Q);return(0,o.useInsertionEffect)((()=>{const{width:e,height:i,top:o,left:l}=r.current;if(n||!s.current||!e||!i)return;s.current.dataset.motionPopId=t;const a=document.createElement("style");return c&&(a.nonce=c),document.head.appendChild(a),a.sheet&&a.sheet.insertRule(`\n [data-motion-pop-id="${t}"] {\n position: absolute !important;\n width: ${e}px !important;\n height: ${i}px !important;\n top: ${o}px !important;\n left: ${l}px !important;\n }\n `),()=>{document.head.removeChild(a)}}),[n]),(0,i.jsx)(a,{isPresent:n,childRef:s,sizeRef:r,children:o.cloneElement(e,{ref:s})})}const u=({children:e,initial:n,isPresent:t,onExitComplete:s,custom:l,presenceAffectsLayout:a,mode:u})=>{const f=(0,r.M)(h),m=(0,o.useId)(),p=(0,o.useCallback)((e=>{f.set(e,!0);for(const n of f.values())if(!n)return;s&&s()}),[f,s]),x=(0,o.useMemo)((()=>({id:m,initial:n,isPresent:t,custom:l,onExitComplete:p,register:e=>(f.set(e,!1),()=>f.delete(e))})),a?[Math.random(),p]:[t,p]);return(0,o.useMemo)((()=>{f.forEach(((e,n)=>f.set(n,!1)))}),[t]),o.useEffect((()=>{!t&&!f.size&&s&&s()}),[t]),"popLayout"===u&&(e=(0,i.jsx)(d,{isPresent:t,children:e})),(0,i.jsx)(c.t.Provider,{value:x,children:e})};function h(){return new Map}var f=t(89120);const m=e=>e.key||"";function p(e){const n=[];return o.Children.forEach(e,(e=>{(0,o.isValidElement)(e)&&n.push(e)})),n}var x=t(25128);const v=({children:e,custom:n,initial:t=!0,onExitComplete:c,presenceAffectsLayout:l=!0,mode:a="sync",propagate:d=!1})=>{const[h,v]=(0,f.xQ)(d),j=(0,o.useMemo)((()=>p(e)),[e]),g=d&&!h?[]:j.map(m),y=(0,o.useRef)(!0),A=(0,o.useRef)(j),w=(0,r.M)((()=>new Map)),[C,N]=(0,o.useState)(j),[M,z]=(0,o.useState)(j);(0,x.E)((()=>{y.current=!1,A.current=j;for(let e=0;e{const o=m(e),s=!(d&&!h)&&(j===M||g.includes(o));return(0,i.jsx)(u,{isPresent:s,initial:!(y.current&&!t)&&void 0,custom:s?void 0:n,presenceAffectsLayout:l,mode:a,onExitComplete:s?void 0:()=>{if(!w.has(o))return;w.set(o,!0);let e=!0;w.forEach((n=>{n||(e=!1)})),e&&(null==k||k(),z(A.current),d&&(null==v||v()),c&&c())},children:e},o)}))})}},58368:(e,n,t)=>{t.d(n,{A:()=>i});const i=(0,t(75395).A)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]])},54472:(e,n,t)=>{t.d(n,{A:()=>i});const i=(0,t(75395).A)("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]])}}]); \ No newline at end of file diff --git a/assets/js/1718.6b1e85d3.js.LICENSE.txt b/assets/js/1718.6b1e85d3.js.LICENSE.txt new file mode 100644 index 00000000..f02ba941 --- /dev/null +++ b/assets/js/1718.6b1e85d3.js.LICENSE.txt @@ -0,0 +1,6 @@ +/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/17896441.3df026d8.js b/assets/js/17896441.3df026d8.js new file mode 100644 index 00000000..6a856de5 --- /dev/null +++ b/assets/js/17896441.3df026d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8401],{28467:(e,t,n)=>{n.d(t,{A:()=>g});n(96540);var s=n(34164),a=n(50539),i=n(27143),l=n(74848);function o(){return(0,l.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,l.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function d(){return(0,l.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function u(){return(0,l.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var m=n(204),h=n(52362);function b(e){let{className:t}=e;return(0,l.jsx)(h.A,{type:"caution",title:(0,l.jsx)(d,{}),className:(0,s.A)(t,m.G.common.draftBanner),children:(0,l.jsx)(u,{})})}function v(e){let{className:t}=e;return(0,l.jsx)(h.A,{type:"caution",title:(0,l.jsx)(o,{}),className:(0,s.A)(t,m.G.common.unlistedBanner),children:(0,l.jsx)(r,{})})}function x(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(v,{...e})]})}function g(e){let{metadata:t}=e;const{unlisted:n,frontMatter:s}=t;return(0,l.jsxs)(l.Fragment,{children:[(n||s.unlisted)&&(0,l.jsx)(x,{}),s.draft&&(0,l.jsx)(b,{})]})}},57519:(e,t,n)=>{n.d(t,{A:()=>g});n(96540);var s=n(34164),a=n(204),i=n(93751),l=n(30214),o=n(56289),r=n(50539),c=n(29030),d=n(74848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(o.A,{"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const b={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function v(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,d.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,d.jsx)(o.A,{className:a,href:n,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:t})}):(0,d.jsx)("span",{className:a,children:t})}function x(e){let{children:t,active:n,index:a,addMicrodata:i}=e;return(0,d.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,d.jsx)("meta",{itemProp:"position",content:String(a+1)})]})}function g(){const e=(0,i.OF)(),t=(0,l.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(a.G.docs.docBreadcrumbs,b.breadcrumbsContainer),"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,d.jsx)(h,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(x,{active:s,index:n,addMicrodata:!!a,children:(0,d.jsx)(v,{href:a,isLast:s,children:t.label})},n)}))]})}):null}},6648:(e,t,n)=>{n.r(t),n.d(t,{default:()=>S});var s=n(96540),a=n(81082),i=n(26849),l=n(74848);const o=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,l.jsx)(o.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(34164),m=n(86682),h=n(43600);function b(){const{metadata:e}=c();return(0,l.jsx)(h.A,{previous:e.previous,next:e.next})}var v=n(15833),x=n(55730),g=n(204),p=n(46547),f=n(5783);function j(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,o=!!(t||n||s);return i||o?(0,l.jsxs)("footer",{className:(0,u.A)(g.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",g.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(p.A,{tags:a})})}),o&&(0,l.jsx)(f.A,{className:(0,u.A)("margin-top--sm",g.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var A=n(33535),N=n(71021),L=n(50539);const C={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function _(e){let{collapsed:t,...n}=e;return(0,l.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",C.tocCollapsibleButton,!t&&C.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(L.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const k={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function T(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,A.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(k.tocCollapsible,!i&&k.tocCollapsibleExpanded,n),children:[(0,l.jsx)(_,{collapsed:i,onClick:o}),(0,l.jsx)(A.N,{lazy:!0,className:k.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(N.A,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const H={tocMobile:"tocMobile_ITEo"};function y(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(T,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(g.G.docs.docTocMobile,H.tocMobile)})}var M=n(97959);function w(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(M.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:g.G.docs.docTocDesktop})}var B=n(9303),I=n(57985);function E(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(g.G.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)(B.A,{as:"h1",children:n})}),(0,l.jsx)(I.A,{children:t})]})}var V=n(57519),O=n(28467);const G={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function R(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(y,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,l.jsx)(w,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&G.docItemCol),children:[(0,l.jsx)(O.A,{metadata:s}),(0,l.jsx)(v.A,{}),(0,l.jsxs)("div",{className:G.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(V.A,{}),(0,l.jsx)(x.A,{}),n.mobile,(0,l.jsx)(E,{children:t}),(0,l.jsx)(j,{})]}),(0,l.jsx)(b,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function S(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.e3,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(R,{children:(0,l.jsx)(n,{})})]})})}},43600:(e,t,n)=>{n.d(t,{A:()=>l});n(96540);var s=n(50539),a=n(11865),i=n(74848);function l(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(a.A,{...t,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(a.A,{...n,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},55730:(e,t,n)=>{n.d(t,{A:()=>r});n(96540);var s=n(34164),a=n(50539),i=n(204),l=n(21858),o=n(74848);function r(e){let{className:t}=e;const n=(0,l.r)();return n.badge?(0,o.jsx)("span",{className:(0,s.A)(t,i.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(a.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},15833:(e,t,n)=>{n.d(t,{A:()=>x});n(96540);var s=n(34164),a=n(40797),i=n(56289),l=n(50539),o=n(56942),r=n(204),c=n(96351),d=n(21858),u=n(74848);const m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const t=m[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function b(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,u.jsx)(l.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.A,{to:n,onClick:s,children:(0,u.jsx)(l.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function v(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:i}}=(0,a.A)(),{pluginId:l}=(0,o.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(l),{latestDocSuggestion:m,latestVersionSuggestion:v}=(0,o.HW)(l),x=m??(g=v).docs.find((e=>e.id===g.mainDocId));var g;return(0,u.jsxs)("div",{className:(0,s.A)(t,r.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:n})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(b,{versionLabel:v.label,to:x.path,onClick:()=>d(v.name)})})]})}function x(e){let{className:t}=e;const n=(0,d.r)();return n.banner?(0,u.jsx)(v,{className:t,versionMetadata:n}):null}},11865:(e,t,n)=>{n.d(t,{A:()=>l});n(96540);var s=n(34164),a=n(56289),i=n(74848);function l(e){const{permalink:t,title:n,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},97959:(e,t,n)=>{n.d(t,{A:()=>c});n(96540);var s=n(34164),a=n(71021);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=n(74848);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,l.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,l.jsx)(a.A,{...n,linkClassName:o,linkActiveClassName:r})})}},71021:(e,t,n)=>{n.d(t,{A:()=>v});var s=n(96540),a=n(53115);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function o(e){const t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>o(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}var u=n(56289),m=n(74848);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const b=s.memo(h);function v(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const v=(0,a.p)(),x=c??v.tableOfContents.minHeadingLevel,g=u??v.tableOfContents.maxHeadingLevel,p=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:g});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:g}}),[o,r,x,g])),(0,m.jsx)(b,{toc:p,className:n,linkClassName:o,...h})}},46547:(e,t,n)=>{n.d(t,{A:()=>d});n(96540);var s=n(34164),a=n(50539),i=n(56289);const l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var o=n(74848);function r(e){let{permalink:t,label:n,count:a,description:r}=e;return(0,o.jsxs)(i.A,{href:t,title:r,className:(0,s.A)(l.tag,a?l.tagWithCount:l.tagRegular),children:[n,a&&(0,o.jsx)("span",{children:a})]})}const c={tags:"tags_jXut",tag:"tag_QGVx"};function d(e){let{tags:t}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.A)(c.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,o.jsx)("li",{className:c.tag,children:(0,o.jsx)(r,{...e})},e.permalink)))})]})}},94591:(e,t,n)=>{n.d(t,{A:()=>r});n(96540);var s=n(88602),a=n(34164),i=n(56289),l=n(74848);const o=e=>{let{size:t=null,outline:n=!1,variant:s="primary",block:o=!1,disabled:r=!1,className:c,style:d,link:u,label:m}=e;const h=t?{sm:"sm",small:"sm",lg:"lg",large:"lg",medium:null}[t]:"",b=h?`button--${h}`:"",v=n?"button--outline":"",x=s?`button--${s}`:"",g=o?"button--block":"",p=r?"disabled":"",f=r?null:u,j=m.replace(":arrow_down:","\u2b07\ufe0f");return(0,l.jsx)(i.A,{to:f,children:(0,l.jsx)("button",{className:(0,a.A)("button",b,v,x,g,p,c),style:d,role:"button","aria-disabled":r,children:j})})},r={...s.A,Button:o}}}]); \ No newline at end of file diff --git a/assets/js/17de5c69.3a68ebe2.js b/assets/js/17de5c69.3a68ebe2.js new file mode 100644 index 00000000..fa397aa4 --- /dev/null +++ b/assets/js/17de5c69.3a68ebe2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9617],{51854:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var i=n(81447),o=n(74848),s=n(28453);const r={title:"Vibe Coding with Goose and the Speech MCP",description:"Explore the new Speech MCP server that enables voice-controlled coding and natural conversation with your AI agent",authors:["adewale"]},a=void 0,c={authorsImageUrls:[void 0]},l=[{value:"The Speech MCP Server",id:"the-speech-mcp-server",level:2},{value:"Key Features",id:"key-features",level:3},{value:"Live Demo Highlights",id:"live-demo-highlights",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Join the Development",id:"join-the-development",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Head:i}=t;return i||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"blog cover",src:n(30621).A+"",width:"1280",height:"720"})}),"\n",(0,o.jsxs)(t.p,{children:["Imagine creating an app just by describing what you want out loud, like you\u2019re talking to a friend. That\u2019s the magic of vibe coding: turning natural language into working code with the help of an AI agent. And while typing a prompt gets the job done, saying it out loud hits different \ud83d\udd25 The new ",(0,o.jsx)(t.a,{href:"/docs/mcp/speech-mcp",children:"Speech MCP server"})," has quite literally entered the chat."]}),"\n",(0,o.jsxs)(t.p,{children:["In a recent ",(0,o.jsx)(t.a,{href:"https://www.youtube.com/watch?v=Zey9GHyXlHY&ab_channel=BlockOpenSource",children:"Wild Goose Case livestream"}),", hosts ",(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/ebonylouis/",children:"Ebony Louis"})," and ",(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/acekyd/",children:"Adewale Abati"})," were joined by ",(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/maksym-stepanenko-26404867",children:"Max Novich"})," from Block's AI tools team, who demonstrated an exciting new extension - the ",(0,o.jsx)(t.a,{href:"https://github.com/Kvadratni/speech-mcp",children:"Speech MCP server"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"During the livestream, Max demonstrated this by creating an entire web application using only voice commands - no keyboard or mouse required. This resulted in a vibrant, animated webpage with 3D effects, synthwave aesthetics, and interactive elements, all created through natural conversation with Goose."}),"\n",(0,o.jsx)("iframe",{class:"aspect-ratio",src:"https://www.youtube.com/embed/Zey9GHyXlHY?start=437&end=752",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:!0}),"\n",(0,o.jsx)(t.h2,{id:"the-speech-mcp-server",children:"The Speech MCP Server"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"https://github.com/Kvadratni/speech-mcp",children:"Speech MCP"})," is an open source MCP server that enables voice interaction with AI agents like Goose. What makes it special is that it runs entirely locally on your machine, making it:"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"LLM agnostic"}),"\n",(0,o.jsx)(t.li,{children:"Privacy-focused"}),"\n",(0,o.jsx)(t.li,{children:"Cost-effective compared to cloud-based alternatives"}),"\n",(0,o.jsx)(t.li,{children:"Accessible without internet connectivity"}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"key-features",children:"Key Features"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Local Speech Processing"}),": Uses two main models:"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Faster Whisper: An efficient method to convert speech to text"}),"\n",(0,o.jsx)(t.li,{children:"Coqui TTS: A Japanese-engineered text-to-speech model with 54 natural-sounding voices"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Voice Selection"}),": Choose from 54 different voices with varying characteristics and personalities"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Multi-Speaker Narration"}),": Generate and play conversations between multiple voices"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Audio Transcription"}),": Convert audio/video content to text with timestamps and speaker detection"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"live-demo-highlights",children:"Live Demo Highlights"}),"\n",(0,o.jsx)(t.p,{children:"During the demonstration, Max showcased several impressive capabilities:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Voice-Controlled Development"}),":"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Created animated text effects"}),"\n",(0,o.jsx)(t.li,{children:"Implemented 3D transformations"}),"\n",(0,o.jsx)(t.li,{children:"Added synthwave aesthetics with gradients and grids"}),"\n",(0,o.jsx)(t.li,{children:"Integrated music controls"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"System Integration"}),":"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Controlled applications like Discord using voice commands"}),"\n",(0,o.jsx)(t.li,{children:"Navigated file system and development environment"}),"\n",(0,o.jsx)(t.li,{children:"Generated and managed audio content"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Natural Interaction"}),":"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Fluid conversation with Goose"}),"\n",(0,o.jsx)(t.li,{children:"Real-time feedback and adjustments"}),"\n",(0,o.jsx)(t.li,{children:"Multi-voice narration for documentation"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,o.jsx)(t.p,{children:"To try the Speech MCP server yourself:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsx)(t.p,{children:"Install the required audio library (PortAudio):"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"# For macOS\nbrew install portaudio\n\n# For Linux\napt-get install portaudio # or dnf install portaudio\n"})}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:["Install the extension directly using the one-click ",(0,o.jsx)(t.a,{href:"goose://extension?cmd=uvx&&arg=-p&arg=3.10.14&arg=speech-mcp@latest&id=speech_mcp&name=Speech%20Interface&description=Voice%20interaction%20with%20audio%20visualization%20for%20Goose",children:"deep link install"})," in Goose"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"join-the-development",children:"Join the Development"}),"\n",(0,o.jsxs)(t.p,{children:["The Speech MCP server is ",(0,o.jsx)(t.a,{href:"https://github.com/Kvadratni/speech-mcp",children:"open-source"})," and welcomes contributions. You can also connect with Max on ",(0,o.jsx)(t.a,{href:"https://discord.gg/block-opensource",children:"Discord"})," for questions and collaboration."]}),"\n",(0,o.jsx)(t.p,{children:"Voice interactions with AI agents like Goose with the power and tools to act on instructions provides a different kind of vibe that makes the future feel closer than ever. Whether you're interested in vibe coding, accessibility improvements, or just want to feel a bit more like Tony Stark while getting Goose to pull a J.A.R.V.I.S, the Speech MCP server offers a glimpse into the future of human-AI collaboration - and it's available today."}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("meta",{property:"og:title",content:"Vibe Coding with Goose and the Speech MCP"}),(0,o.jsx)("meta",{property:"og:type",content:"article"}),(0,o.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/03/28/vibe-coding-with-goose"}),(0,o.jsx)("meta",{property:"og:description",content:"Explore the new Speech MCP server that enables voice-controlled coding and natural conversation with your AI agent."}),(0,o.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/vibe-coding-b2efeed37ea43f4773da5f1ff96f4184.png"}),(0,o.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,o.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,o.jsx)("meta",{name:"twitter:title",content:"Vibe Coding with Goose and the Speech MCP"}),(0,o.jsx)("meta",{name:"twitter:description",content:"Explore the new Speech MCP server that enables voice-controlled coding and natural conversation with your AI agent."}),(0,o.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/vibe-coding-b2efeed37ea43f4773da5f1ff96f4184.png"})]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},30621:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/vibe-coding-b2efeed37ea43f4773da5f1ff96f4184.png"},28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(96540);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}},81447:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/28/vibe-coding-with-goose","source":"@site/blog/2025-03-28-vibe-coding-with-goose/index.md","title":"Vibe Coding with Goose and the Speech MCP","description":"Explore the new Speech MCP server that enables voice-controlled coding and natural conversation with your AI agent","date":"2025-03-28T00:00:00.000Z","tags":[],"readingTime":2.985,"hasTruncateMarker":true,"authors":[{"name":"Adewale Abati","title":"Staff Developer Advocate","url":"https://adewaleabati.com","page":{"permalink":"/goose/blog/authors/adewale"},"socials":{"x":"https://x.com/ace_kyd","github":"https://github.com/acekyd"},"imageURL":"https://avatars.githubusercontent.com/u/4003538?v=4","key":"adewale"}],"frontMatter":{"title":"Vibe Coding with Goose and the Speech MCP","description":"Explore the new Speech MCP server that enables voice-controlled coding and natural conversation with your AI agent","authors":["adewale"]},"unlisted":false,"prevItem":{"title":"Securing the Model Context Protocol","permalink":"/goose/blog/2025/03/31/securing-mcp"},"nextItem":{"title":"How to Determine If An MCP Server Is Safe","permalink":"/goose/blog/2025/03/26/mcp-security"}}')}}]); \ No newline at end of file diff --git a/assets/js/182b90e6.6e11f051.js b/assets/js/182b90e6.6e11f051.js new file mode 100644 index 00000000..0a3af85d --- /dev/null +++ b/assets/js/182b90e6.6e11f051.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4594],{78439:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"MCP Servers","description":"How to integrate and use MCP servers as Goose extensions","slug":"/category/mcp-servers","permalink":"/goose/docs/category/mcp-servers","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Goose Recipes","permalink":"/goose/docs/tutorials/recipes-tutorial"},"next":{"title":"AgentQL Extension","permalink":"/goose/docs/mcp/agentql-mcp"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/1842f38c.499ca3ab.js b/assets/js/1842f38c.499ca3ab.js new file mode 100644 index 00000000..1a4699fd --- /dev/null +++ b/assets/js/1842f38c.499ca3ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6568],{62364:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>d,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"guides/goose-permissions","title":"Goose Permission Modes","description":"Goose\u2019s permissions determine how much autonomy it has when modifying files, using extensions, and performing automated actions. By selecting a permission mode, you have full control over how Goose interacts with your development environment.","source":"@site/docs/guides/goose-permissions.md","sourceDirName":"guides","slug":"/guides/goose-permissions","permalink":"/goose/docs/guides/goose-permissions","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Goose Permission Modes","sidebar_label":"Goose Permissions"},"sidebar":"tutorialSidebar","previous":{"title":"Updating Goose","permalink":"/goose/docs/guides/updating-goose"},"next":{"title":"Using Goosehints","permalink":"/goose/docs/guides/using-goosehints"}}');var t=n(74848),r=n(28453),i=n(65537),l=n(79329);const a={sidebar_position:3,title:"Goose Permission Modes",sidebar_label:"Goose Permissions"},d=void 0,c={},u=[{value:"Permission Modes",id:"permission-modes",level:2},{value:"Configuring Goose Mode",id:"configuring-goose-mode",level:2}];function h(e){const o={admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components},{Details:n}=o;return n||function(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.p,{children:"Goose\u2019s permissions determine how much autonomy it has when modifying files, using extensions, and performing automated actions. By selecting a permission mode, you have full control over how Goose interacts with your development environment."}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Permission Modes Video Walkthrough"}),(0,t.jsx)("iframe",{class:"aspect-ratio",src:"https://www.youtube.com/embed/bMVFFnPS_Uk",title:"Goose Permission Modes Explained",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})]}),"\n",(0,t.jsx)(o.h2,{id:"permission-modes",children:"Permission Modes"}),"\n",(0,t.jsxs)(o.table,{children:[(0,t.jsx)(o.thead,{children:(0,t.jsxs)(o.tr,{children:[(0,t.jsx)(o.th,{children:"Mode"}),(0,t.jsx)(o.th,{children:"Description"}),(0,t.jsx)(o.th,{children:"Best For"})]})}),(0,t.jsxs)(o.tbody,{children:[(0,t.jsxs)(o.tr,{children:[(0,t.jsx)(o.td,{children:(0,t.jsx)(o.strong,{children:"Completely Autonomous"})}),(0,t.jsxs)(o.td,{children:["Goose can modify files, use extensions, and delete files ",(0,t.jsx)(o.strong,{children:"without requiring approval"}),"."]}),(0,t.jsxs)(o.td,{children:["Users who want ",(0,t.jsx)(o.strong,{children:"full automation"})," and seamless integration into their workflow."]})]}),(0,t.jsxs)(o.tr,{children:[(0,t.jsx)(o.td,{children:(0,t.jsx)(o.strong,{children:"Manual Approval"})}),(0,t.jsxs)(o.td,{children:["Goose ",(0,t.jsx)(o.strong,{children:"asks for confirmation"})," before using any tools or extensions."]}),(0,t.jsxs)(o.td,{children:["Users who want to ",(0,t.jsx)(o.strong,{children:"review and approve"})," every change and tool usage."]})]}),(0,t.jsxs)(o.tr,{children:[(0,t.jsx)(o.td,{children:(0,t.jsx)(o.strong,{children:"Smart Approval"})}),(0,t.jsxs)(o.td,{children:["Goose uses a risk-based approach to ",(0,t.jsx)(o.strong,{children:"automatically approve low-risk actions"})," and ",(0,t.jsx)(o.strong,{children:"flag others"})," for approval."]}),(0,t.jsxs)(o.td,{children:["Users who want a ",(0,t.jsx)(o.strong,{children:"balanced mix of autonomy and oversight"})," based on the action\u2019s impact."]})]}),(0,t.jsxs)(o.tr,{children:[(0,t.jsx)(o.td,{children:(0,t.jsx)(o.strong,{children:"Chat Only"})}),(0,t.jsxs)(o.td,{children:["Goose ",(0,t.jsx)(o.strong,{children:"only engages in chat"}),", with no extension use or file modifications."]}),(0,t.jsxs)(o.td,{children:["Users who prefer a ",(0,t.jsx)(o.strong,{children:"conversational AI experience"})," without automation."]})]}),(0,t.jsxs)(o.tr,{children:[(0,t.jsx)(o.td,{}),(0,t.jsx)(o.td,{}),(0,t.jsx)(o.td,{})]})]})]}),"\n",(0,t.jsx)(o.admonition,{type:"warning",children:(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.code,{children:"Autonomous Mode"})," is applied by default."]})}),"\n",(0,t.jsx)(o.h2,{id:"configuring-goose-mode",children:"Configuring Goose Mode"}),"\n",(0,t.jsx)(o.p,{children:"Here's how to configure:"}),"\n",(0,t.jsxs)(i.A,{groupId:"interface",children:[(0,t.jsxs)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,t.jsx)(o.p,{children:"You can change modes before or during a session and it will take effect immediately."}),(0,t.jsxs)(i.A,{children:[(0,t.jsx)(l.A,{value:"session",label:"In Session",default:!0,children:(0,t.jsx)(o.p,{children:"Click the Goose Mode option from the bottom menu."})}),(0,t.jsx)(l.A,{value:"settings",label:"From Settings",children:(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["Click ",(0,t.jsx)(o.code,{children:"..."})," in the upper right corner"]}),"\n",(0,t.jsxs)(o.li,{children:["Click ",(0,t.jsx)(o.code,{children:"Settings"})]}),"\n",(0,t.jsxs)(o.li,{children:["Under ",(0,t.jsx)(o.code,{children:"Mode Selection"}),", choose the mode you'd like"]}),"\n"]})})]})]}),(0,t.jsx)(l.A,{value:"cli",label:"Goose CLI",children:(0,t.jsxs)(i.A,{children:[(0,t.jsxs)(l.A,{value:"session",label:"In Session",default:!0,children:[(0,t.jsxs)(o.p,{children:["To change modes mid-session, use the ",(0,t.jsx)(o.code,{children:"/mode"})," command."]}),(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:["Autonomous: ",(0,t.jsx)(o.code,{children:"/mode auto"})]}),"\n",(0,t.jsxs)(o.li,{children:["Approve: ",(0,t.jsx)(o.code,{children:"/mode approve"})]}),"\n",(0,t.jsxs)(o.li,{children:["Chat: ",(0,t.jsx)(o.code,{children:"/mode chat"})]}),"\n"]})]}),(0,t.jsxs)(l.A,{value:"settings",label:"From Settings",children:[(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsx)(o.li,{children:"Run the following command:"}),"\n"]}),(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-sh",children:"goose configure\n"})}),(0,t.jsxs)(o.ol,{start:"2",children:["\n",(0,t.jsxs)(o.li,{children:["Select ",(0,t.jsx)(o.code,{children:"Goose Settings"})," from the menu and press Enter."]}),"\n"]}),(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-sh",children:"\u250c goose-configure\n\u2502\n\u25c6 What would you like to configure?\n| \u25cb Configure Providers\n| \u25cb Add Extension\n| \u25cb Toggle Extensions\n| \u25cb Remove Extension\n// highlight-start\n| \u25cf Goose Settings (Set the Goose Mode, Tool Output, Experiment and more)\n// highlight-end\n\u2514\n"})}),(0,t.jsxs)(o.ol,{start:"3",children:["\n",(0,t.jsxs)(o.li,{children:["Choose ",(0,t.jsx)(o.code,{children:"Goose Mode"})," from the menu and press Enter."]}),"\n"]}),(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-sh",children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Goose Settings\n\u2502\n\u25c6 What setting would you like to configure?\n// highlight-start\n\u2502 \u25cf Goose Mode (Configure Goose mode)\n// highlight-end\n| \u25cb Tool Output\n\u2514\n"})}),(0,t.jsxs)(o.ol,{start:"4",children:["\n",(0,t.jsx)(o.li,{children:"Choose the Goose mode you would like to configure."}),"\n"]}),(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-sh",children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Goose Settings\n\u2502\n\u25c7 What setting would you like to configure?\n\u2502 Goose Mode\n\u2502\n\u25c6 Which Goose mode would you like to configure?\n// highlight-start\n\u2502 \u25cf Auto Mode\n// highlight-end\n| \u25cb Approve Mode\n| \u25cb Smart Approve Mode \n| \u25cb Chat Mode\n|\n\u2514 Set to Auto Mode - full file modification enabled\n"})})]})]})})]}),"\n",(0,t.jsxs)(o.admonition,{type:"info",children:[(0,t.jsxs)(o.p,{children:["If you choose ",(0,t.jsx)(o.code,{children:"Approve"})," mode, you will see \"Allow\" and \"Deny\" buttons in your session windows during tool calls.\nGoose will only ask for permission for tools that it deems are 'write' tools, e.g. any 'text editor write', 'text editor edit', 'bash - rm, cp, mv' commands."]}),(0,t.jsx)(o.p,{children:"Read/write approval makes best effort attempt at classifying read or write tools. This is interpreted by your LLM provider."})]})]})}function m(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},79329:(e,o,n)=>{n.d(o,{A:()=>i});n(96540);var s=n(34164);const t={tabItem:"tabItem_Ymn6"};var r=n(74848);function i(e){let{children:o,hidden:n,className:i}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,i),hidden:n,children:o})}},65537:(e,o,n)=>{n.d(o,{A:()=>w});var s=n(96540),t=n(34164),r=n(65627),i=n(56347),l=n(50372),a=n(30604),d=n(11861),c=n(78749);function u(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:o}=e;return!!o&&"object"==typeof o&&"value"in o}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:o,children:n}=e;return(0,s.useMemo)((()=>{const e=o??function(e){return u(e).map((e=>{let{props:{value:o,label:n,attributes:s,default:t}}=e;return{value:o,label:n,attributes:s,default:t}}))}(n);return function(e){const o=(0,d.XI)(e,((e,o)=>e.value===o.value));if(o.length>0)throw new Error(`Docusaurus error: Duplicate values "${o.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[o,n])}function m(e){let{value:o,tabValues:n}=e;return n.some((e=>e.value===o))}function p(e){let{queryString:o=!1,groupId:n}=e;const t=(0,i.W6)(),r=function(e){let{queryString:o=!1,groupId:n}=e;if("string"==typeof o)return o;if(!1===o)return null;if(!0===o&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:o,groupId:n});return[(0,a.aZ)(r),(0,s.useCallback)((e=>{if(!r)return;const o=new URLSearchParams(t.location.search);o.set(r,e),t.replace({...t.location,search:o.toString()})}),[r,t])]}function g(e){const{defaultValue:o,queryString:n=!1,groupId:t}=e,r=h(e),[i,a]=(0,s.useState)((()=>function(e){let{defaultValue:o,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(o){if(!m({value:o,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${o}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return o}const s=n.find((e=>e.default))??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:o,tabValues:r}))),[d,u]=p({queryString:n,groupId:t}),[g,f]=function(e){let{groupId:o}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(o),[t,r]=(0,c.Dv)(n);return[t,(0,s.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:t}),x=(()=>{const e=d??g;return m({value:e,tabValues:r})?e:null})();(0,l.A)((()=>{x&&a(x)}),[x]);return{selectedValue:i,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),f(e)}),[u,f,r]),tabValues:r}}var f=n(9136);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=n(74848);function b(e){let{className:o,block:n,selectedValue:s,selectValue:i,tabValues:l}=e;const a=[],{blockElementScrollPositionUntilNextRender:d}=(0,r.a_)(),c=e=>{const o=e.currentTarget,n=a.indexOf(o),t=l[n].value;t!==s&&(d(o),i(t))},u=e=>{let o=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=a.indexOf(e.currentTarget)+1;o=a[n]??a[0];break}case"ArrowLeft":{const n=a.indexOf(e.currentTarget)-1;o=a[n]??a[a.length-1];break}}o?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},o),children:l.map((e=>{let{value:o,label:n,attributes:r}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:s===o?0:-1,"aria-selected":s===o,ref:e=>{a.push(e)},onKeyDown:u,onClick:c,...r,className:(0,t.A)("tabs__item",x.tabItem,r?.className,{"tabs__item--active":s===o}),children:n??o},o)}))})}function v(e){let{lazy:o,children:n,selectedValue:r}=e;const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(o){const e=i.find((e=>e.props.value===r));return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:i.map(((e,o)=>(0,s.cloneElement)(e,{key:o,hidden:e.props.value!==r})))})}function y(e){const o=g(e);return(0,j.jsxs)("div",{className:(0,t.A)("tabs-container",x.tabList),children:[(0,j.jsx)(b,{...o,...e}),(0,j.jsx)(v,{...o,...e})]})}function w(e){const o=(0,f.A)();return(0,j.jsx)(y,{...e,children:u(e.children)},String(o))}},28453:(e,o,n)=>{n.d(o,{R:()=>i,x:()=>l});var s=n(96540);const t={},r=s.createContext(t);function i(e){const o=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function l(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/19eb0775.27a5384a.js b/assets/js/19eb0775.27a5384a.js new file mode 100644 index 00000000..49315d6b --- /dev/null +++ b/assets/js/19eb0775.27a5384a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5919],{225:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});var n=t(11335),s=t(74848),a=t(28453);const r={title:"How I Manage Localhost Port Conflicts With an AI Agent",description:"Learn how I use Goose, an open source AI agent and MCP client, to manage conflicting ports without breaking my flow.",authors:["rizel"]},i="How I Manage Localhost Port Conflicts With an AI Agent",l={authorsImageUrls:[void 0]},c=[{value:"Localhost Ports Hoarding",id:"localhost-ports-hoarding",level:2},{value:"Traditional Ports Management",id:"traditional-ports-management",level:2},{value:"Using Goose as My Port Manager",id:"using-goose-as-my-port-manager",level:2},{value:"Why Use AI for Simple Tasks",id:"why-use-ai-for-simple-tasks",level:2}];function p(e){const o={a:"a",blockquote:"blockquote",code:"code",h2:"h2",img:"img",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components},{Head:n}=o;return n||function(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"blog cover",src:t(75085).A+"",width:"2240",height:"1260"})}),"\n",(0,s.jsx)(o.h2,{id:"localhost-ports-hoarding",children:"Localhost Ports Hoarding"}),"\n",(0,s.jsx)(o.p,{children:"I'm perpetually drowning in open tabs. Yes, I do need Bluesky, ChatGPT, Claude, Goose, Cursor, Discord, Slack, Netflix, and Google Docs all open at the same time. I've learned that tab management isn't my only vice."}),"\n",(0,s.jsxs)(o.blockquote,{children:["\n",(0,s.jsx)(o.p,{children:'"Hi, my name is Rizel, and I\'m a localhost ports hoarder. \ud83d\udc4b\ud83c\udfff"'}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"It always starts innocently with me running one project that uses localhost:3000. Then a teammate pings me to review their PR. Their project also runs on localhost:3000. Fortunately, modern frameworks are smart enough to automatically bump to ports 3001 or 3002. Before I know it, 3003, 3004, and 3005 are running too, and my laptop sounds like it\u2019s about to take off as it crawls under the weight of too many processes."}),"\n",(0,s.jsx)(o.h2,{id:"traditional-ports-management",children:"Traditional Ports Management"}),"\n",(0,s.jsx)(o.p,{children:"Typically, freeing up ports involves running the following commands:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-shell",children:"# Step 1: list all open ports\nlsof -i -P | grep LISTEN\n\n# Step 2: find a specific port\nlsof -i :3000\n\n# Step 3: kill the process\nkill -9 98026\n"})}),"\n",(0,s.jsx)(o.p,{children:"Because I don't do this often, I often end up searching for the commands, which derails what I was initially working on."}),"\n",(0,s.jsx)(o.h2,{id:"using-goose-as-my-port-manager",children:"Using Goose as My Port Manager"}),"\n",(0,s.jsxs)(o.p,{children:["To avoid that interruption, I started offloading the task to ",(0,s.jsx)(o.a,{href:"/",children:"Goose"}),", an open source AI agent."]}),"\n",(0,s.jsxs)(o.p,{children:["Goose uses its built-in ",(0,s.jsx)(o.a,{href:"/docs/mcp/developer-mcp",children:"Developer"})," MCP server to handle coding-related tasks on my machine. Here's what the interaction looks like:"]}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Prompt to Goose:"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"Can you tell me which ports I have running?\n"})}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Goose Response:"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"Development Servers:\n- Node.js servers on ports 3000, 3001, 3002\n- Port 18030\n\nDatabase:\n- PostgreSQL on port 5432\n\nDevelopment Tools:\n- Ollama on port 11434\n- Multiple Goose instances (ports 49377, 49899, 63594, 64365)\n\nApplications:\n- Okta Verify (port 8769)\n- inSync (ports 7010, 49831, 49830)\n- Pieces (ports 39300, 62638)\n- Rapportd macOS service (port 60151)\n"})}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Prompt to Goose:"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"Kill all the Node.js servers running on localhost.\n"})}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.strong,{children:"Goose Response:"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"The command executed successfully, freeing up ports 3000, 3001, and 3002.\n"})}),"\n",(0,s.jsx)(o.h2,{id:"why-use-ai-for-simple-tasks",children:"Why Use AI for Simple Tasks"}),"\n",(0,s.jsx)(o.p,{children:"Freeing up ports is something I know how to do. But I use AI tools like Goose for small tasks that create friction and slow me down. I'm not trying to cram more work into the day. My goal is to work efficiently, make a positive impact, and still have time for my personal life."}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("meta",{property:"og:title",content:"How I Manage Localhost Port Conflicts With an AI Agent"}),(0,s.jsx)("meta",{property:"og:type",content:"article"}),(0,s.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose"}),(0,s.jsx)("meta",{property:"og:description",content:"Learn how I use Goose, an open source AI agent, to manage conflicting ports without breaking my flow."}),(0,s.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png"}),(0,s.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,s.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,s.jsx)("meta",{name:"twitter:title",content:"How I Manage Localhost Port Conflicts With an AI Agent"}),(0,s.jsx)("meta",{name:"twitter:description",content:"Learn how I use Goose, an open source AI agent, to manage conflicting ports without breaking my flow."}),(0,s.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png"})]})]})}function h(e={}){const{wrapper:o}={...(0,a.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},75085:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png"},28453:(e,o,t)=>{t.d(o,{R:()=>r,x:()=>i});var n=t(96540);const s={},a=n.createContext(s);function r(e){const o=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:o},e.children)}},11335:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose","source":"@site/blog/2025-05-22-manage-local-host-conflicts-with-goose/index.md","title":"How I Manage Localhost Port Conflicts With an AI Agent","description":"Learn how I use Goose, an open source AI agent and MCP client, to manage conflicting ports without breaking my flow.","date":"2025-05-22T00:00:00.000Z","tags":[],"readingTime":2.565,"hasTruncateMarker":true,"authors":[{"name":"Rizel Scarlett","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/rizel"},"socials":{"x":"https://x.com/blackgirlbytes","github":"https://github.com/blackgirlbytes","bluesky":"https://bsky.app/profile/blackgirlbytes.bsky.social","linkedin":"https://www.linkedin.com/in/rizel-bobb-semple/"},"imageURL":"https://avatars.githubusercontent.com/u/22990146?v=4","key":"rizel"}],"frontMatter":{"title":"How I Manage Localhost Port Conflicts With an AI Agent","description":"Learn how I use Goose, an open source AI agent and MCP client, to manage conflicting ports without breaking my flow.","authors":["rizel"]},"unlisted":false,"prevItem":{"title":"3 Prompts to Test for Agent Readiness","permalink":"/goose/blog/2025/05/22/llm-agent-readiness"},"nextItem":{"title":"Goose Gets a Driver\'s License!","permalink":"/goose/blog/2025/05/20/goose-gets-a-drivers-license"}}')}}]); \ No newline at end of file diff --git a/assets/js/1bbdccc0.e40be4bd.js b/assets/js/1bbdccc0.e40be4bd.js new file mode 100644 index 00000000..f9caed68 --- /dev/null +++ b/assets/js/1bbdccc0.e40be4bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9659],{11959:t=>{t.exports=JSON.parse('{"author":{"name":"Dalton Turner","title":"Software Engineer","page":{"permalink":"/goose/blog/authors/dalton"},"socials":{"github":"https://github.com/dalton-turner"},"imageURL":"https://avatars.githubusercontent.com/u/78099245?v=4","key":"dalton","count":1},"listMetadata":{"permalink":"/goose/blog/authors/dalton","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/1c42408f.05f4bde6.js b/assets/js/1c42408f.05f4bde6.js new file mode 100644 index 00000000..7f0f19cc --- /dev/null +++ b/assets/js/1c42408f.05f4bde6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202,8339],{88143:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>p,frontMatter:()=>c,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"mcp/jetbrains-mcp","title":"JetBrains Extension","description":"Use JetBrains MCP Server as a Goose Extension","source":"@site/docs/mcp/jetbrains-mcp.md","sourceDirName":"mcp","slug":"/mcp/jetbrains-mcp","permalink":"/goose/docs/mcp/jetbrains-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"JetBrains Extension","description":"Use JetBrains MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Google Maps Extension","permalink":"/goose/docs/mcp/google-maps-mcp"},"next":{"title":"Knowledge Graph Memory Extension","permalink":"/goose/docs/mcp/knowledge-graph-mcp"}}');var o=t(74848),s=t(28453),a=t(65537),r=t(79329),l=t(25887);const c={title:"JetBrains Extension",description:"Use JetBrains MCP Server as a Goose Extension"},d=void 0,u={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function m(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{videoUrl:"https://www.youtube.com/embed/1fP5elf9qQM"}),"\n",(0,o.jsx)(n.p,{children:"The JetBrains extension is designed to work within your IDE. Goose can accomplish a lot of the developer-centric tasks with the Developer extension that is enabled on install, however, the JetBrains extension provides a more integrated and project-aware way to work with code."}),"\n",(0,o.jsx)(n.p,{children:"This tutorial covers how to enable and use the JetBrains MCP Server as a built-in Goose extension to integrate with any JetBrains IDE."}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Add the ",(0,o.jsx)(n.a,{href:"https://plugins.jetbrains.com/plugin/26071-mcp-server",children:"MCP Server plugin"})," to your IDE."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Enable built-in Goose extension:"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(a.A,{groupId:"interface",children:[(0,o.jsx)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Click ",(0,o.jsx)(n.code,{children:"..."})," in the upper right corner"]}),"\n",(0,o.jsxs)(n.li,{children:["Click ",(0,o.jsx)(n.code,{children:"Advanced Settings"})]}),"\n",(0,o.jsxs)(n.li,{children:["Under ",(0,o.jsx)(n.code,{children:"Extensions"}),", toggle ",(0,o.jsx)(n.code,{children:"Jetbrains"})," to on."]}),"\n"]})}),(0,o.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Run the ",(0,o.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["Choose to add a ",(0,o.jsx)(n.code,{children:"Built-in Extension"})]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c6 What type of extension would you like to add?\n// highlight-start \n\u2502 \u25cf Built-in Extension (Use an extension that comes with Goose)\n// highlight-end \n\u2502 \u25cb Command-line Extension \n\u2502 \u25cb Remote Extension (SSE) \n\u2502 \u25cb Remote Extension (Streaming HTTP) \n\u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["Arrow down to the ",(0,o.jsx)(n.code,{children:"JetBrains"})," extension and press Enter"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Built-in Extension \n\u2502\n\u25c6 Which built-in extension would you like to enable?\n\u2502 \u25cb Developer Tools \n\u2502 \u25cb Computer Controller \n\u2502 \u25cb Google Drive \n\u2502 \u25cb Memory \n// highlight-start\n\u2502 \u25cf JetBrains (Connect to jetbrains IDEs)\n// highlight-end\n\u2514\n"})}),(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Built-in Extension \n\u2502\n\u25c7 Which built-in extension would you like to enable?\n\u2502 JetBrains\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 300\n// highlight-end\n\u2502\n\u2514 Enabled jetbrains extension\n"})}),(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Built-in Extension \n\u2502\n\u25c7 Which built-in extension would you like to enable?\n\u2502 JetBrains\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n// highlight-start\n\u25c6 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2502\n\u2514\n"})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,o.jsx)(n.p,{children:"In this example, I'm going to upgrade a Java project to the latest LTS version."}),"\n",(0,o.jsx)(n.admonition,{title:"LLM",type:"info",children:(0,o.jsx)(n.p,{children:"Anthropic's Claude 3.5 Sonnet was used for this task."})}),"\n",(0,o.jsxs)(a.A,{groupId:"interface",children:[(0,o.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Open ",(0,o.jsx)(n.a,{href:"https://www.jetbrains.com/idea/download",children:"IntelliJ"})," (JetBrains' Java and Kotlin IDE)"]}),"\n",(0,o.jsx)(n.li,{children:"Open a new session in Goose Desktop"}),"\n"]}),(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsx)(n.p,{children:"You will interact with two separate apps: the Goose Desktop app and the IntelliJ IDE."})})]}),(0,o.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Open ",(0,o.jsx)(n.a,{href:"https://www.jetbrains.com/idea/download",children:"IntelliJ"})," (JetBrains' Java and Kotlin IDE)"]}),"\n",(0,o.jsx)(n.li,{children:"Open a terminal within your IDE and start a new Goose session:"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"goose session\n"})})]})]}),"\n",(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsx)(n.mdxAdmonitionTitle,{}),(0,o.jsxs)(n.p,{children:["When using Goose to refactor code, it's recommended to commit your code to version control ",(0,o.jsx)(n.em,{children:"before"})," making changes. This way, you have a clean snapshot to compare against, making it easy to review Goose\u2019s modifications, revert if needed, and track improvements."]})]}),"\n",(0,o.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"using the JetBrains IDE tools, upgrade this project to use the latest Java LTS version and refactor the codebase to use newer Java features where beneficial.\n"})}),"\n",(0,o.jsx)(n.p,{children:"After 2 minutes, Goose was done with the upgrade! \ud83c\udf89"}),"\n",(0,o.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-md",children:"I'll make several improvements to modernize this codebase to use Java 21 (latest LTS) features. Here are the changes I'll implement:\n\n1. Update the `pom.xml` to use Java 21\n2. Use newer Java features \n\n[... code changes ...]\n\nHere's a summary of the modernization changes made:\n\n1. `pom.xml`:\n - Set Java version to 21\n - Enabled preview features\n - Updated all dependencies to their latest stable versions\n\n2. `AccountsOverviewPage.java`:\n - Made the class `final` since it extends the sealed `Page` class\n - Updated stream collection to use `.toList()` instead of `collect(Collectors.toList())`\n - Made fields final for better immutability\n\n3. `Page.java`:\n - Converted to a sealed class\n - Restricted which classes can extend it using `permits`\n - Made fields protected and final where appropriate\n - Added pattern matching for exception handling\n - Implemented Optional for null safety\n - Used String Templates for error messages\n - Added functional programming concepts with Supplier\n - Enhanced error handling with specific exception types\n\n4. `LoginComponent.java`:\n - Added a private record for credentials\n - Implemented pattern matching with record patterns\n - Made fields final for better immutability\n\n5. `AccountTests.java`:\n - Implemented structured concurrency using `StructuredTaskScope`\n - Used parallel execution for UI and API tasks\n - Improved error handling with structured task management\n - Used pattern matching and type inference with `var`\n\n6. `BaseTests.java`:\n - Implemented structured concurrency for setup tasks\n - Improved resource management\n - Better exception handling\n - Used modern Duration API\n\n7. `APIUtil.java`:\n - Implemented String Templates (Java 21 preview feature)\n - Used modern text blocks\n\n8. `Customers.java`:\n - Added sealed interface for customer types\n - Implemented pattern matching for switch expressions\n - Added pattern matching for instanceof\n - Enhanced type safety with records\n\nKey modern Java features used:\n- String Templates (Java 21 Preview)\n- Pattern Matching for switch (Java 21)\n- Sealed Classes and Interfaces (Java 17)\n- Records (Java 16)\n- Pattern Matching for instanceof (Java 16)\n- Text Blocks (Java 15)\n- Switch Expressions (Java 14)\n\nThe codebase is now using the latest Java LTS version (21) and incorporates many modern Java features that improve:\n- Type safety\n- Null safety\n- Code readability\n- Error handling\n- Performance\n"})}),"\n",(0,o.jsx)(n.p,{children:"Using the JetBrains extension provided several advantages and made it easier for Goose to:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"navigate through the codebase"}),"\n",(0,o.jsx)(n.li,{children:"track changes"}),"\n",(0,o.jsx)(n.li,{children:"make consistent modifications across files"}),"\n",(0,o.jsx)(n.li,{children:"verify the content of files before and after changes"}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>B});var i=t(96540),o=t(74848);function s(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=i.Children.toArray(e),t=n.find((e=>i.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),s=n.filter((e=>e!==t)),a=t?.props.children;return{mdxAdmonitionTitle:a,rest:s.length>0?(0,o.jsx)(o.Fragment,{children:s}):null}}(e.children),s=e.title??n;return{...e,...s&&{title:s},children:t}}var a=t(34164),r=t(50539),l=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:i}=e;return(0,o.jsx)("div",{className:(0,a.A)(l.G.common.admonition,l.G.common.admonitionType(n),c,t),children:i})}function p(e){let{icon:n,title:t}=e;return(0,o.jsxs)("div",{className:d,children:[(0,o.jsx)("span",{className:u,children:n}),t]})}function x(e){let{children:n}=e;return n?(0,o.jsx)("div",{className:h,children:n}):null}function f(e){const{type:n,icon:t,title:i,children:s,className:a}=e;return(0,o.jsxs)(m,{type:n,className:a,children:[i||t?(0,o.jsx)(p,{title:i,icon:t}):null,(0,o.jsx)(x,{children:s})]})}function g(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const v={icon:(0,o.jsx)(g,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function j(e){return(0,o.jsx)(f,{...v,...e,className:(0,a.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const w={icon:(0,o.jsx)(b,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function y(e){return(0,o.jsx)(f,{...w,...e,className:(0,a.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const E={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function I(e){return(0,o.jsx)(f,{...E,...e,className:(0,a.A)("alert alert--info",e.className),children:e.children})}function k(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const C={icon:(0,o.jsx)(k,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function T(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const J={icon:(0,o.jsx)(T,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const N={icon:(0,o.jsx)(k,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const S={...{note:j,tip:y,info:I,warning:function(e){return(0,o.jsx)(f,{...C,...e,className:(0,a.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(f,{...J,...e,className:(0,a.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(j,{title:"secondary",...e}),important:e=>(0,o.jsx)(I,{title:"important",...e}),success:e=>(0,o.jsx)(y,{title:"success",...e}),caution:function(e){return(0,o.jsx)(f,{...N,...e,className:(0,a.A)("alert alert--warning",e.className),children:e.children})}}};function B(e){const n=s(e),t=(i=n.type,S[i]||(console.warn(`No admonition component found for admonition type "${i}". Using Info as fallback.`),S.info));var i;return(0,o.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>a});t(96540);var i=t(34164);const o={tabItem:"tabItem_Ymn6"};var s=t(74848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,i.A)(o.tabItem,a),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>y});var i=t(96540),o=t(34164),s=t(65627),a=t(56347),r=t(50372),l=t(30604),c=t(11861),d=t(78749);function u(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:o}}=e;return{value:n,label:t,attributes:i,default:o}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const o=(0,a.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(s),(0,i.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(o.location.search);n.set(s,e),o.replace({...o.location,search:n.toString()})}),[s,o])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:o}=e,s=h(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:s}))),[c,u]=p({queryString:t,groupId:o}),[x,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[o,s]=(0,d.Dv)(t);return[o,(0,i.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:o}),g=(()=>{const e=c??x;return m({value:e,tabValues:s})?e:null})();(0,r.A)((()=>{g&&l(g)}),[g]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,s]),tabValues:s}}var f=t(9136);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(74848);function j(e){let{className:n,block:t,selectedValue:i,selectValue:a,tabValues:r}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,t=l.indexOf(n),o=r[t].value;o!==i&&(c(n),a(o))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":t},n),children:r.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>{l.push(e)},onKeyDown:u,onClick:d,...s,className:(0,o.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":i===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:s}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function w(e){const n=x(e);return(0,v.jsxs)("div",{className:(0,o.A)("tabs-container",g.tabList),children:[(0,v.jsx)(j,{...n,...e}),(0,v.jsx)(b,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,v.jsx)(w,{...e,children:u(e.children)},String(n))}},25887:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var i=t(52362),o=t(74848);const s=e=>{let{videoUrl:n}=e;return(0,o.jsxs)("div",{children:[(0,o.jsx)(i.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,o.jsxs)("details",{children:[(0,o.jsx)("summary",{children:"Watch the demo"}),(0,o.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,o.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,o.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var i=t(96540);const o={},s=i.createContext(o);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1d2bec02.599d724b.js b/assets/js/1d2bec02.599d724b.js new file mode 100644 index 00000000..f6f6ffce --- /dev/null +++ b/assets/js/1d2bec02.599d724b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4962],{13870:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>x,frontMatter:()=>a,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"mcp/repomix-mcp","title":"Repomix Extension","description":"Add Repomix MCP Server as a Goose Extension","source":"@site/docs/mcp/repomix-mcp.md","sourceDirName":"mcp","slug":"/mcp/repomix-mcp","permalink":"/goose/docs/mcp/repomix-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Repomix Extension","description":"Add Repomix MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Reddit Extension","permalink":"/goose/docs/mcp/reddit-mcp"},"next":{"title":"Selenium Extension","permalink":"/goose/docs/mcp/selenium-mcp"}}');var i=s(74848),t=s(28453),r=s(65537),c=s(79329),l=s(25887);const a={title:"Repomix Extension",description:"Add Repomix MCP Server as a Goose Extension"},d=void 0,h={},u=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function p(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.A,{videoUrl:"https://www.youtube.com/embed/69h4LLkIg_E"}),"\n",(0,i.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,i.jsx)(n.a,{href:"https://github.com/yamadashy/repomix",children:"Repomix MCP Server"})," as a Goose extension to enable automated repository packing, codebase analysis, architecture summaries, test generation, and code exploration, all while compressing the codebase to minimize token usage and stay within your LLM's context limits."]}),"\n",(0,i.jsx)(n.admonition,{title:"TLDR",type:"tip",children:(0,i.jsxs)(r.A,{groupId:"interface",children:[(0,i.jsx)(c.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=repomix&arg=--mcp&id=repomix&name=Repomix&description=Pack%20repositories%20into%20AI-friendly%20formats%20for%20Goose",children:"Launch the installer"})})}),(0,i.jsxs)(c.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Command"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"npx -y repomix --mcp\n"})})]})]})}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Note that you'll need ",(0,i.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," installed on your system to run this command, as it uses ",(0,i.jsx)(n.code,{children:"npx"}),"."]})}),"\n",(0,i.jsxs)(r.A,{groupId:"interface",children:[(0,i.jsx)(c.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=repomix&arg=--mcp&id=repomix&name=Repomix&description=Pack%20repositories%20into%20AI-friendly%20formats%20for%20Goose",children:"Launch the installer"})}),"\n",(0,i.jsxs)(n.li,{children:["Press ",(0,i.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.code,{children:"Save Configuration"})]}),"\n",(0,i.jsxs)(n.li,{children:["Scroll to the top and click ",(0,i.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,i.jsxs)(c.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Run the ",(0,i.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Choose to add a ",(0,i.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 repomix\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 repomix\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 npx -y repomix --mcp\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 repomix\n\u2502\n\u25c7 What command should be run?\n\u2502 npx -y repomix --mcp\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 300\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 repomix\n\u2502\n\u25c7 What command should be run?\n\u2502 npx -y repomix --mcp\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n// highlight-start\n\u25c7 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"7",children:["\n",(0,i.jsx)(n.li,{children:"Choose No when asked to add environment variables"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 repomix\n \u2502\n \u25c7 What command should be run?\n \u2502 npx -y repomix --mcp\n \u2502 \n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502 \n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 No\n \u2502\n // highlight-end\n \u2514 Added repomix extension\n"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsxs)(n.p,{children:["In this example, I\u2019ll show you how to use Goose with the Repomix Extension to analyze the compressed Axios repository. Goose will focus on the ",(0,i.jsx)(n.code,{children:"lib/core/Axios.js"})," file, explain its role in the architecture, spot missing tests, write new unit tests, and suggest improvements to the testing strategy and code maintainability."]}),"\n",(0,i.jsx)(n.p,{children:"By compressing the entire codebase into an AI-friendly format, Repomix helps Goose stay within token limits while providing detailed, file-specific insights."}),"\n",(0,i.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Review the file lib/core/Axios.js from the Axios repository and identify any missing unit tests needed to thoroughly cover its core functions and classes. Explain the role this file plays in the overall Axios architecture, how it integrates with other modules, and how well it is currently tested. Write new unit tests to improve coverage, and recommend improvements to the testing strategy or refactoring opportunities to make the code more maintainable."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,i.jsxs)(n.admonition,{title:"CLI",type:"note",children:[(0,i.jsx)(n.p,{children:"I'll help analyze the Axios.js core file and its testing coverage. Let's break this down into steps:"}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"First, let's fetch and examine the Axios repository using repomix"}),"\n",(0,i.jsx)(n.li,{children:"Then analyze the specific file and its related tests"}),"\n",(0,i.jsx)(n.li,{children:"Finally provide recommendations and new unit tests"}),"\n"]}),(0,i.jsx)(n.p,{children:"Let's start by getting the repository:"}),(0,i.jsx)(n.p,{children:"--- Pack Remote Repository ---"}),(0,i.jsx)(n.p,{children:"Now let's read the core Axios.js file and its related test files:"}),(0,i.jsx)(n.p,{children:"--- Read Repomix Output ---"}),(0,i.jsx)(n.p,{children:"Based on my analysis of the Axios codebase, I'll provide you with a comprehensive overview of the project structure and create an improved README. Let me break this down into sections:"}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Role in Axios Architecture"})}),(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"Axios.js"})," file is one of the most critical core components of the Axios library. It serves several key purposes:"]}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Request Handling: It contains the main ",(0,i.jsx)(n.code,{children:"Axios"})," class that processes and dispatches HTTP requests"]}),"\n",(0,i.jsx)(n.li,{children:"Configuration Management: Handles merging of default configs with request-specific configs"}),"\n",(0,i.jsx)(n.li,{children:"Interceptor Management: Manages request and response interceptors"}),"\n",(0,i.jsx)(n.li,{children:"HTTP Method Convenience: Provides convenience methods for different HTTP verbs (get, post, etc.)"}),"\n"]}),(0,i.jsx)(n.p,{children:"The file integrates with other core modules through:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"InterceptorManager"})," for handling request/response interceptors"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"dispatchRequest"})," for making the actual HTTP requests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"mergeConfig"})," for configuration processing"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"buildFullPath"})," for URL resolution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"AxiosHeaders"})," for header management"]}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Current Test Coverage Analysis"})}),(0,i.jsx)(n.p,{children:"The current test coverage for Axios.js is fairly good but has some gaps. Looking at the test files:"}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"test/unit/core/Axios.js"})," - Focuses mainly on error handling cases, particularly un-writable error stacks"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"test/specs/api.spec.js"})," - Tests the public API surface"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"test/specs/interceptors.spec.js"})," - Tests interceptor functionality"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"test/specs/instance.spec.js"})," - Tests instance creation and configuration"]}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Missing Test Coverage"})}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Error Handling:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"// Missing tests for error propagation in request chain\n_request(configOrUrl, config) {\n // Error handling here needs more coverage\n}\n"})}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Config Processing:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"// Missing edge cases for config validation\nrequest(configOrUrl, config) {\n // Config validation edge cases not fully tested\n}\n"})}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Method Aliases:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"// Missing tests for all HTTP method aliases with various parameter combinations\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n // Missing tests for these methods with different data types\n});\n"})}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Interceptor Chain:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"// Missing tests for complex interceptor chains and error scenarios\nconst chain = [dispatchRequest.bind(this), undefined];\nchain.unshift.apply(chain, requestInterceptorChain);\nchain.push.apply(chain, responseInterceptorChain);\n"})}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"New Unit Tests"}),"\nHere are new unit tests to improve coverage:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"describe('core::Axios', function() {\n describe('request method', function() {\n it('should handle null/undefined config values', function(done) {\n const instance = new Axios({});\n \n instance.request({\n url: '/foo',\n params: null,\n data: undefined\n }).then(function(response) {\n expect(response.config.params).toBeNull();\n expect(response.config.data).toBeUndefined();\n done();\n }).catch(done);\n });\n\n it('should properly merge nested config objects', function(done) {\n const instance = new Axios({\n headers: {\n common: {\n 'X-Common': 'common'\n },\n get: {\n 'X-Method': 'get'\n }\n }\n });\n\n instance.request({\n method: 'get',\n headers: {\n 'X-Custom': 'custom'\n }\n }).then(function(response) {\n expect(response.config.headers['X-Common']).toBe('common');\n expect(response.config.headers['X-Method']).toBe('get');\n expect(response.config.headers['X-Custom']).toBe('custom');\n done();\n }).catch(done);\n });\n });\n\n describe('interceptor chain', function() {\n it('should handle async interceptors correctly', async function() {\n const instance = new Axios({});\n const order = [];\n\n instance.interceptors.request.use(async function(config) {\n await new Promise(resolve => setTimeout(resolve, 100));\n order.push(1);\n return config;\n });\n\n instance.interceptors.request.use(async function(config) {\n await new Promise(resolve => setTimeout(resolve, 50));\n order.push(2);\n return config;\n });\n\n instance.interceptors.response.use(async function(response) {\n await new Promise(resolve => setTimeout(resolve, 100));\n order.push(3);\n return response;\n });\n\n await instance.request('/foo');\n expect(order).toEqual([2, 1, 3]); // Interceptors should execute in correct order\n });\n\n it('should handle interceptor errors properly', function(done) {\n const instance = new Axios({});\n const error = new Error('Interceptor Error');\n\n instance.interceptors.request.use(function() {\n throw error;\n });\n\n instance.request('/foo').catch(function(e) {\n expect(e).toBe(error);\n done();\n });\n });\n });\n\n describe('HTTP method aliases', function() {\n it('should handle various data types in post/put/patch', function(done) {\n const instance = new Axios({});\n const testCases = [\n {method: 'post', data: {foo: 'bar'}},\n {method: 'put', data: 'string data'},\n {method: 'patch', data: new URLSearchParams('foo=bar')},\n {method: 'post', data: new FormData()},\n {method: 'put', data: new Blob(['test'])},\n {method: 'patch', data: null}\n ];\n\n Promise.all(testCases.map(({method, data}) => {\n return instance[method]('/foo', data).then(response => {\n expect(response.config.data).toEqual(data);\n return response;\n });\n })).then(() => done()).catch(done);\n });\n });\n});\n"})}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Recommendations for Testing Strategy"})}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Modular Testing:"}),"\n"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Break down tests into smaller, focused units"}),"\n",(0,i.jsx)(n.li,{children:"Test each HTTP method alias separately"}),"\n",(0,i.jsx)(n.li,{children:"Create dedicated test suites for config processing, interceptors, and error handling"}),"\n"]}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Mock Integration Points:"}),"\n"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use dependency injection for better isolation"}),"\n",(0,i.jsx)(n.li,{children:"Mock external dependencies consistently"}),"\n",(0,i.jsx)(n.li,{children:"Create reusable mock factories"}),"\n"]}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Error Handling:"}),"\n"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Add more tests for error cases"}),"\n",(0,i.jsx)(n.li,{children:"Test error propagation through interceptor chains"}),"\n",(0,i.jsx)(n.li,{children:"Verify error object properties and inheritance"}),"\n"]}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Config Processing:"}),"\n"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Test complex config merging scenarios"}),"\n",(0,i.jsx)(n.li,{children:"Verify default values are applied correctly"}),"\n",(0,i.jsx)(n.li,{children:"Test config validation edge cases"}),"\n"]}),(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:"Interceptor Testing:"}),"\n"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Test complex chains of interceptors"}),"\n",(0,i.jsx)(n.li,{children:"Verify async interceptor behavior"}),"\n",(0,i.jsx)(n.li,{children:"Test interceptor error handling"}),"\n"]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Refactoring Opportunities"})}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Error Handling:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"// Current\n_request(configOrUrl, config) {\n try {\n return this.request(configOrUrl, config);\n } catch (err) {\n // Error handling\n }\n}\n\n// Suggested\nasync _request(configOrUrl, config) {\n try {\n return await this.request(configOrUrl, config);\n } catch (err) {\n if (err instanceof AxiosError) {\n throw err;\n }\n throw AxiosError.from(err);\n }\n}\n"})}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Config Processing:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"// Current\nrequest(configOrUrl, config) {\n // Config processing\n}\n\n// Suggested\nrequest(configOrUrl, config) {\n const normalizedConfig = this._normalizeConfig(configOrUrl, config);\n this._validateConfig(normalizedConfig);\n return this._processRequest(normalizedConfig);\n}\n"})}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Interceptor Chain:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"// Current\n// Interceptor chain building mixed with request logic\n\n// Suggested\nclass InterceptorChain {\n constructor(request, config) {\n this.request = request;\n this.config = config;\n this.chain = [];\n }\n\n addRequestInterceptors(interceptors) {\n // Add request interceptors\n }\n\n addResponseInterceptors(interceptors) {\n // Add response interceptors\n }\n\n execute() {\n // Execute chain\n }\n}\n"})}),(0,i.jsx)(n.p,{children:"These improvements would make the code more maintainable and easier to test, while also improving error handling and separation of concerns."}),(0,i.jsx)(n.p,{children:"The current test coverage is good but could be improved in these specific areas to ensure more robust functionality. The suggested new tests and refactoring opportunities would help catch edge cases and make the code more maintainable."})]})]})}function x(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},25887:(e,n,s)=>{s.d(n,{A:()=>t});s(96540);var o=s(52362),i=s(74848);const t=e=>{let{videoUrl:n}=e;return(0,i.jsxs)("div",{children:[(0,i.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Watch the demo"}),(0,i.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,i.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,i.jsx)("hr",{})]})}}}]); \ No newline at end of file diff --git a/assets/js/1df93b7f.bc028c35.js b/assets/js/1df93b7f.bc028c35.js new file mode 100644 index 00000000..af749b8e --- /dev/null +++ b/assets/js/1df93b7f.bc028c35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4583],{67354:(e,t,n)=>{n.d(t,{A:()=>l});var o,a=n(96540);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:n,...l}=e;return a.createElement("svg",i({xmlns:"http://www.w3.org/2000/svg",width:32,height:32,fill:"none",viewBox:"0 0 32 32","aria-labelledby":n},l),t?a.createElement("title",{id:n},t):null,o||(o=a.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M13.5 4A1.5 1.5 0 0 0 12 2.5H6a1.5 1.5 0 1 0 0 3h2.379l-5.44 5.44a1.5 1.5 0 0 0 2.122 2.12L10.5 7.622V10a1.5 1.5 0 0 0 3 0zm16 0A1.5 1.5 0 0 0 28 2.5H18A1.5 1.5 0 0 0 16.5 4v10a1.5 1.5 0 0 0 1.5 1.5h10a1.5 1.5 0 0 0 1.5-1.5zm-10 1.5h7v7h-7zm9.56 13.44a1.5 1.5 0 0 1 0 2.12l-5.439 5.44H26a1.5 1.5 0 0 1 0 3h-6a1.5 1.5 0 0 1-1.5-1.5v-6a1.5 1.5 0 0 1 3 0v2.379l5.44-5.44a1.5 1.5 0 0 1 2.12 0M5.5 23a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0M9 16.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13",clipRule:"evenodd"})))}},29829:(e,t,n)=>{n.d(t,{A:()=>l});var o,a=n(96540);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:n,...l}=e;return a.createElement("svg",i({xmlns:"http://www.w3.org/2000/svg",width:32,height:32,fill:"none",viewBox:"0 0 32 32","aria-labelledby":n},l),t?a.createElement("title",{id:n},t):null,o||(o=a.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M1.5 4A1.5 1.5 0 0 1 3 2.5h26A1.5 1.5 0 0 1 30.5 4v6a1.5 1.5 0 0 1-1.5 1.5h-.5V28a1.5 1.5 0 0 1-1.5 1.5H5A1.5 1.5 0 0 1 3.5 28V11.5H3A1.5 1.5 0 0 1 1.5 10zm5 7.5h19v15h-19zm21-3h-23v-3h23zm-14.5 7a1.5 1.5 0 0 0 0 3h6a1.5 1.5 0 0 0 0-3z",clipRule:"evenodd"})))}},69819:(e,t,n)=>{n.d(t,{A:()=>l});var o,a=n(96540);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:n,...l}=e;return a.createElement("svg",i({xmlns:"http://www.w3.org/2000/svg",width:32,height:32,fill:"none",viewBox:"0 0 32 32","aria-labelledby":n},l),t?a.createElement("title",{id:n},t):null,o||(o=a.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M11.5 8a4.5 4.5 0 1 1 9 0v.5a1.5 1.5 0 0 0 3 0V8a7.5 7.5 0 0 0-15 0v5h3zM28 15v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V15a2 2 0 0 1 2-2h20a2 2 0 0 1 2 2m-9 6a3 3 0 0 1-1.75 2.728V25a1.25 1.25 0 1 1-2.5 0v-1.272A3 3 0 1 1 19 21",clipRule:"evenodd"})))}},30697:(e,t,n)=>{n.d(t,{A:()=>l});var o,a=n(96540);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:n,...l}=e;return a.createElement("svg",i({xmlns:"http://www.w3.org/2000/svg",width:32,height:32,fill:"none",viewBox:"0 0 32 32","aria-labelledby":n},l),t?a.createElement("title",{id:n},t):null,o||(o=a.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M23 11a2 2 0 1 1 0-4 2 2 0 0 1 0 4m-5-2a5 5 0 1 1 10 0 5 5 0 0 1-10 0m5 16a2 2 0 1 1 0-4 2 2 0 0 1 0 4m-5-2a5 5 0 1 1 10 0 5 5 0 0 1-10 0M7 23a2 2 0 1 0 4 0 2 2 0 0 0-4 0m2-5a5 5 0 1 0 0 10 5 5 0 0 0 0-10M9 4a5 5 0 1 0 0 10A5 5 0 0 0 9 4",clipRule:"evenodd"})))}},93132:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var o=n(56289),a=n(40797),i=n(43938),l=n(34164),r=n(9303);const s={features:"features_t9lD",featureSvg:"featureSvg_GfXr",featureIcon:"featureIcon_GA8l",videoContainer:"videoContainer_B4Kr",video:"video_hjvp"};var c=n(74848);const d=[{title:"Open Source",Svg:n(69819).A,description:(0,c.jsx)(c.Fragment,{children:"Built with transparency and collaboration in mind, goose empowers developers to contribute, customize, and innovate freely."})},{title:"Runs Locally",Svg:n(29829).A,description:(0,c.jsx)(c.Fragment,{children:"Goose runs locally to execute tasks efficiently, keeping control in your hands."})},{title:"Extensible",Svg:n(67354).A,description:(0,c.jsx)(c.Fragment,{children:"Customize goose with your preferred LLM and enhance its capabilities by connecting it to any external MCP server or API."})},{title:"Autonomous",Svg:n(30697).A,description:(0,c.jsx)(c.Fragment,{children:"Goose independently handles complex tasks, from debugging to deployment, freeing you to focus on what matters most."})}],C=[{name:"Prem Pillai",github:"https://github.com/cloud-on-prem",role:"Software Engineer",testimonial:"With Goose, I feel like I am Maverick. Thanks a ton for creating this. \ud83d\ude4f I have been having way too much fun with it today."},{name:"Jarrod Sibbison",github:"https://github.com/jsibbison-square",role:"Software Engineer",testimonial:"I wanted to construct some fake data for an API with a large request body and business rules I haven't memorized. So I told Goose which object to update and a test to run that calls the vendor. Got it to use the errors descriptions from the vendor response to keep correcting the request until it was successful. So good!"},{name:"Manik Surtani",github:"https://github.com/maniksurtani",role:"Head of Open Source",testimonial:"I asked Goose to write up a few Google Scripts that mimic Clockwise's functionality (particularly, creating blocks on my work calendar based on events in my personal calendar, as well as color-coding calendar entries based on type and importance). Took me under an hour. If you haven't tried Goose yet, I highly encourage you to do so!"},{name:"Andrey Bolduzev",github:"https://github.com/andrey-bolduzev",role:"Android Engineer",testimonial:"If anyone was looking for another reason to check it out: I just asked Goose to break a string-array into individual string resources across eleven localizations, and it performed amazingly well and saved me a bunch of time doing it manually or figuring out some way to semi-automate it."},{name:"Kang Huang",github:"https://github.com/kang-square",role:"Software Engineer",testimonial:"Hi team, thank you for much for making Goose, it's so amazing. Our team is working on migrating Dashboard components to React components. I am working with Goose to help the migration."},{name:"Lily Delalande",github:"https://github.com/lily-de",role:"Software Engineer",testimonial:"Wanted to document what I had Goose do -- took about 30 minutes end to end! I created a custom CLI command in the gh CLI library to download in-line comments on PRs about code changes (currently they aren't directly viewable). I don't know Go that well and I definitely didn't know where to start looking in the code base or how to even test the new command was working and Goose did it all for me \ud83d\ude01"},{name:"Rizel Scarlett",github:"blackgirlbytes",role:"Developer Advocate",testimonial:"My sister had been asking me for months to help her build a Google Docs extension but I kept putting it off. Today, we hopped on FaceTime and built one in just 30 minutes with Goose!"}];function u(e){let{title:t,Svg:n,description:o}=e;return(0,c.jsxs)("div",{className:(0,l.A)("col col--3"),children:[(0,c.jsx)("div",{className:"text--left padding-horiz--md",children:(0,c.jsx)(n,{className:s.featureIcon,role:"img"})}),(0,c.jsxs)("div",{className:"text--left padding-horiz--md",children:[(0,c.jsx)(r.A,{as:"h3",children:t}),(0,c.jsx)("p",{children:o})]})]})}function h(e){let{name:t,github:n,role:o,testimonial:a}=e;return(0,c.jsx)("div",{className:"col col--6",children:(0,c.jsxs)("div",{className:"text--left padding-horiz--md padding-bottom--xl",style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"left"},children:[(0,c.jsxs)("div",{className:"avatar",children:[(0,c.jsx)("img",{className:"avatar__photo",src:`https://github.com/${n.split("/").pop()}.png`,alt:`${t}'s profile picture`}),(0,c.jsxs)("div",{className:"avatar__intro",children:[(0,c.jsx)("div",{className:"avatar__name",children:t}),(0,c.jsx)("small",{className:"avatar__subtitle",children:o})]})]}),(0,c.jsx)("p",{children:a})]})})}function m(){return(0,c.jsx)("section",{className:s.features,children:(0,c.jsx)("div",{className:"container",children:(0,c.jsxs)("div",{className:"row",children:[d.map(((e,t)=>(0,c.jsx)(u,{...e},t))),(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",marginTop:"60px"},children:[(0,c.jsx)("h3",{style:{textAlign:"center",marginBottom:"40px"},children:"Loved by engineers"}),(0,c.jsx)("div",{style:{display:"flex",flexWrap:"wrap"},children:C.map(((e,t)=>(0,c.jsx)(h,{...e},t)))})]})]})})})}const g={header:"header_gB2a",wrapper:"wrapper_fthM",textColumn:"textColumn_jfBU",logo:"logo_Ukns",subtitle:"subtitle_RlPM",videoColumn:"videoColumn_qOfe","aspect-ratio":"aspect-ratio_NVrr",heroBanner:"heroBanner_qdFl",ctaButton:"ctaButton_g0jw"},p=e=>(0,c.jsxs)("svg",{width:"1283",height:"1174",viewBox:"0 0 1283 1174",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[(0,c.jsx)("path",{d:"M176.929 815.98C176.929 838.188 188.562 851.057 205.596 851.057C218.892 851.057 226.993 842.34 230.11 830.301L251.507 841.094C245.898 858.737 229.279 872.643 205.596 872.643C174.436 872.643 152 849.604 152 815.98C152 782.356 174.436 759.317 205.596 759.317C229.071 759.317 245.274 772.601 251.091 790.036L230.11 801.451C226.993 789.62 218.892 780.695 205.596 780.695C188.562 780.695 176.929 793.771 176.929 815.98Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M366.293 815.98C366.293 849.812 344.481 872.643 313.735 872.643C282.99 872.643 261.178 849.812 261.178 815.98C261.178 782.148 282.99 759.317 313.735 759.317C344.481 759.317 366.293 782.148 366.293 815.98ZM286.314 815.98C286.314 838.188 296.909 851.68 313.735 851.68C330.562 851.68 341.157 838.188 341.157 815.98C341.157 793.771 330.562 780.28 313.735 780.28C296.909 780.28 286.314 793.771 286.314 815.98Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M428.284 872.643C397.746 872.643 380.296 846.906 380.296 815.98C380.296 785.054 397.746 759.317 428.284 759.317C442.41 759.317 452.797 764.921 459.652 773.016V721.334H484.581V870.36H459.652V858.944C452.797 867.039 442.41 872.643 428.284 872.643ZM460.275 812.867C460.275 792.319 448.642 781.111 433.269 781.111C415.196 781.111 405.432 795.224 405.432 815.98C405.432 836.736 415.196 850.849 433.269 850.849C448.642 850.849 460.275 839.434 460.275 819.301V812.867Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M558.271 872.643C527.11 872.643 505.298 849.604 505.298 815.98C505.298 784.016 526.902 759.317 557.232 759.317C588.808 759.317 605.635 783.186 605.635 813.074V821.376H529.187C531.057 840.057 542.275 851.472 558.271 851.472C570.527 851.472 580.291 845.245 583.615 834.037L605.012 842.132C597.326 861.227 580.083 872.643 558.271 872.643ZM557.024 780.28C544.145 780.28 534.173 787.96 530.434 802.696H580.499C580.291 790.658 572.812 780.28 557.024 780.28Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M625.794 870.36V761.393H650.722V773.016C656.955 765.751 666.718 759.317 680.844 759.317C703.696 759.317 717.406 775.091 717.406 798.545V870.36H692.478V805.81C692.478 792.319 687.077 782.563 673.366 782.563C662.148 782.563 650.722 790.866 650.722 806.432V870.36H625.794Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M773.179 872.228C752.405 872.228 736.409 859.567 736.409 840.057C736.409 819.301 751.99 810.168 772.971 805.81L803.093 799.583V797.715C803.093 787.337 797.692 780.903 784.397 780.903C772.556 780.903 766.324 786.299 763.415 796.885L739.941 791.488C745.342 773.431 761.338 759.317 785.436 759.317C811.611 759.317 827.399 771.771 827.399 796.885V843.793C827.399 850.019 830.099 851.887 836.955 851.057V870.36C818.881 872.435 809.326 868.907 805.586 859.982C798.731 867.661 787.305 872.228 773.179 872.228ZM803.093 831.962V818.678L779.619 823.66C769.024 825.943 761.13 829.264 761.13 839.019C761.13 847.529 767.362 852.302 776.918 852.302C790.214 852.302 803.093 845.245 803.093 831.962Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M881.047 806.432V870.36H856.118V761.393H881.047V773.016C887.071 765.751 896.42 759.317 910.961 759.317C924.049 759.317 933.812 765.129 939.837 774.469C946.484 767.412 956.872 759.317 973.698 759.317C996.134 759.317 1010.68 775.091 1010.68 798.545V870.36H985.747V805.81C985.747 792.319 980.761 782.563 967.466 782.563C956.872 782.563 945.861 790.866 945.861 806.432V870.36H920.933V805.81C920.933 792.319 915.947 782.563 902.652 782.563C892.057 782.563 881.047 790.866 881.047 806.432Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M1083.64 872.643C1052.47 872.643 1030.66 849.604 1030.66 815.98C1030.66 784.016 1052.27 759.317 1082.6 759.317C1114.17 759.317 1131 783.186 1131 813.074V821.376H1054.55C1056.42 840.057 1067.64 851.472 1083.64 851.472C1095.89 851.472 1105.66 845.245 1108.98 834.037L1130.38 842.132C1122.69 861.227 1105.45 872.643 1083.64 872.643ZM1082.39 780.28C1069.51 780.28 1059.54 787.96 1055.8 802.696H1105.86C1105.66 790.658 1098.18 780.28 1082.39 780.28Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M460.616 1009.15C460.616 1041.45 438.498 1060 407.197 1060C381.949 1060 364.212 1049.37 357.326 1028.11L380.697 1019.78C384.035 1032.07 393.425 1039.78 407.197 1039.78C424.1 1039.78 435.576 1031.45 435.576 1011.44V1003.73C429.734 1011.44 418.674 1017.48 404.693 1017.48C374.645 1017.48 356.7 993.1 356.7 963.088C356.7 933.077 374.645 908.692 404.693 908.692C418.466 908.692 429.734 914.736 435.576 922.448V910.777H460.616V1009.15ZM435.994 962.046C435.994 942.039 425.143 930.576 409.493 930.576C392.173 930.576 381.949 942.664 381.949 963.088C381.949 983.305 392.173 995.601 409.493 995.601C425.143 995.601 435.994 984.138 435.994 964.547V962.046Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M587.225 965.589C587.225 999.561 565.315 1022.49 534.432 1022.49C503.55 1022.49 481.64 999.561 481.64 965.589C481.64 931.618 503.55 908.692 534.432 908.692C565.315 908.692 587.225 931.618 587.225 965.589ZM506.888 965.589C506.888 987.89 517.53 1001.44 534.432 1001.44C551.335 1001.44 561.977 987.89 561.977 965.589C561.977 943.289 551.335 929.742 534.432 929.742C517.53 929.742 506.888 943.289 506.888 965.589Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M706.877 965.589C706.877 999.561 684.966 1022.49 654.084 1022.49C623.201 1022.49 601.291 999.561 601.291 965.589C601.291 931.618 623.201 908.692 654.084 908.692C684.966 908.692 706.877 931.618 706.877 965.589ZM626.539 965.589C626.539 987.89 637.182 1001.44 654.084 1001.44C670.986 1001.44 681.628 987.89 681.628 965.589C681.628 943.289 670.986 929.742 654.084 929.742C637.182 929.742 626.539 943.289 626.539 965.589Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M716.351 999.352L735.131 984.347C741.6 994.976 754.12 1002.06 766.849 1002.06C777.491 1002.06 787.298 998.31 787.298 988.515C787.298 979.136 778.117 978.094 760.797 974.551C743.478 971.008 723.655 966.631 723.655 943.289C723.655 923.281 741.183 908.692 766.431 908.692C785.629 908.692 802.74 917.237 810.669 929.325L793.767 944.54C787.507 934.744 777.073 929.117 764.971 929.117C754.746 929.117 748.069 933.702 748.069 940.997C748.069 948.916 755.998 950.375 769.77 953.293C788.341 957.253 811.712 961.213 811.712 986.222C811.712 1008.31 791.472 1022.49 766.64 1022.49C746.399 1022.49 726.159 1014.36 716.351 999.352Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M878.724 1022.49C847.424 1022.49 825.514 999.352 825.514 965.589C825.514 933.494 847.215 908.692 877.68 908.692C909.398 908.692 926.3 932.66 926.3 962.672V971.008H849.51C851.388 989.765 862.656 1001.23 878.724 1001.23C891.035 1001.23 900.843 994.976 904.181 983.721L925.674 991.849C917.953 1011.02 900.634 1022.49 878.724 1022.49ZM877.472 929.742C864.534 929.742 854.518 937.453 850.762 952.251H901.051C900.843 940.163 893.331 929.742 877.472 929.742Z",fill:"currentColor"}),(0,c.jsx)("path",{d:"M819.393 589.784C841.031 585.085 863.985 572.295 863.985 572.295L823.812 539.201C803.952 522.855 787.048 503.214 773.832 481.148C755.571 450.659 730.34 424.931 700.22 406.08L685.51 397.514C680.47 394.01 676.956 388.549 676.456 382.388C676.135 378.416 677.088 374.864 679.308 371.739C686.968 360.943 726.557 313.965 733.812 307.962C743.155 300.238 753.567 293.814 763.226 286.459C764.599 285.412 765.978 284.37 767.335 283.307C767.382 283.26 767.451 283.223 767.493 283.181C770.592 280.734 773.517 278.135 775.842 275.052C784.239 265.329 786.28 256.732 786.78 252.928C785.643 249.267 782.255 241.08 772.812 231.636C778.73 231.999 785.896 236.681 792.393 242.19C796.755 235.219 801.321 227.853 805.883 220.471C808.929 215.542 804.409 211.853 804.283 211.738L804.257 211.732L804.252 211.706C804.136 211.58 800.448 207.06 795.529 210.107C785.012 216.615 774.5 223.128 765.152 229.047C765.152 229.047 754.072 228.816 740.951 240.149C737.863 242.479 735.264 245.405 732.823 248.498C732.775 248.546 732.733 248.609 732.696 248.656C731.628 250.008 730.587 251.387 729.545 252.765C722.185 262.43 715.767 272.837 708.043 282.181C702.046 289.442 655.065 329.028 644.269 336.688C641.144 338.909 637.598 339.866 633.621 339.54C627.466 339.045 621.999 335.526 618.496 330.485L609.931 315.775C591.08 285.643 565.354 260.42 534.866 242.158C512.802 228.942 493.168 212.032 476.816 192.176L443.714 152.001C443.714 152.001 430.919 174.951 426.226 196.596C432.755 204.535 449.785 224.238 469.609 239.286C448.296 229.263 432.54 221.513 420.113 215.031C418.198 229.205 418.945 250.64 420.918 267.239C434.371 273.127 457.277 282.197 480.594 287.016C461.944 291.378 441.483 292.172 425.685 291.862C428.468 302.137 432.34 312.618 437.548 323.162C439.763 328.039 442.188 332.8 444.808 337.462C453.168 339.761 485.992 344.544 503.458 340.619C486.081 346.822 456.909 357.244 456.909 357.244C479.315 385.124 504.079 407.805 504.079 407.805C541.748 387.549 550.334 384.782 578.586 366.304C532.836 403.533 520.962 418.733 508.119 434.354L499.17 446.913C494.52 453.437 490.484 460.366 487.112 467.632C475.827 491.913 459.855 543.652 459.855 543.652C457.003 552.67 463.611 559.278 472.366 556.164C472.366 556.164 524.092 540.19 548.382 528.905C555.642 525.527 562.581 521.492 569.1 516.846L581.658 507.897C585.872 504.429 590.06 501.031 594.658 497.021C594.658 497.021 626.271 534.477 658.769 559.115C658.769 559.115 669.191 529.941 675.393 512.563C671.464 530.036 676.246 562.861 678.55 571.216C683.201 573.837 687.973 576.262 692.85 578.477C703.398 583.691 713.873 587.558 724.147 590.341C723.842 574.536 724.631 554.08 728.993 535.429C733.812 558.747 742.877 581.66 748.769 595.108C765.367 597.081 786.801 597.828 800.974 595.913C794.492 583.486 786.743 567.718 776.721 546.415C791.767 566.239 811.47 583.27 819.409 589.799L819.393 589.784Z",fill:"currentColor"})]});function f(){const{siteConfig:e}=(0,a.A)();return(0,c.jsx)("header",{className:g.header,children:(0,c.jsxs)("div",{className:g.wrapper,children:[(0,c.jsxs)("div",{className:g.textColumn,children:[(0,c.jsx)("div",{className:"hero--logo",children:(0,c.jsx)(p,{})}),(0,c.jsx)("p",{className:g.subtitle,children:e.tagline}),(0,c.jsx)(o.A,{className:"button button--primary button--lg",to:"docs/getting-started/installation",children:"install goose"})]}),(0,c.jsx)("div",{className:g.videoColumn,children:(0,c.jsx)("iframe",{src:"https://www.youtube.com/embed/D-DpDunrbpo",className:"aspect-ratio",title:"vibe coding with goose",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})})}function v(){const{siteConfig:e}=(0,a.A)();return(0,c.jsxs)(i.A,{title:`${e.title}`,description:"Your open source AI agent, automating engineering tasks seamlessly.",children:[(0,c.jsx)(f,{}),(0,c.jsx)("main",{children:(0,c.jsx)(m,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/1e349b01.a317c6df.js b/assets/js/1e349b01.a317c6df.js new file mode 100644 index 00000000..bc7051b2 --- /dev/null +++ b/assets/js/1e349b01.a317c6df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8780],{77257:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>n,toc:()=>c});var n=o(36149),s=o(74848),a=o(28453);const r={title:"AI, But Make It Local With Goose and Ollama",description:"Integrate Goose with Ollama for a fully local experience.",authors:["tania"]},i="Getting Started",l={authorsImageUrls:[void 0]},c=[];function h(e){const t={a:"a",code:"code",h1:"h1",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"blog cover",src:o(40584).A+"",width:"1206",height:"633"})}),"\n",(0,s.jsxs)(t.p,{children:["On the ",(0,s.jsx)(t.a,{href:"https://youtube.com/playlist?list=PLyMFt_U2IX4uFFhd_2TD9-tlJkgHMMb6F&feature=shared",children:"Goosing Around"})," stream series, host ",(0,s.jsx)(t.a,{href:"https://www.linkedin.com/in/rizel-bobb-semple/",children:"Rizel Scarlett"})," ",(0,s.jsx)(t.a,{href:"https://youtube.com/watch?v=WG10r2N0IwM?feature=share",children:"demonstrated how to use Goose locally with Ollama"})," for a fully local experience on your device. Her guest, ",(0,s.jsx)(t.a,{href:"https://www.linkedin.com/in/parthsareen/",children:"Parth Sareen"}),", an experienced software engineer with a focus on building frameworks and systems for AI/ML, showed us the magic of structured outputs and how Goose and Ollama work together under the hood."]}),"\n",(0,s.jsx)(t.p,{children:"Goose serves as an on-machine AI agent that can interact with your applications and tools through extensions, providing the framework and interface for AI-powered workflows. Ollama enables running large language models locally with a simple API, handling the optimization of models to run efficiently on consumer hardware."}),"\n",(0,s.jsx)(t.p,{children:"Together, they create a self-contained AI agent workflow that puts advanced capabilities directly in the hands of developers."}),"\n",(0,s.jsxs)(t.p,{children:["Before diving deep into various capabilities, Rizel walked us through how to set yourself up for success by integrating Goose with Ollama. To follow along, you can download Goose ",(0,s.jsx)(t.a,{href:"https://block.github.io/goose/",children:"here"})," and follow a step-by-step walk through in the ",(0,s.jsx)(t.a,{href:"https://block.github.io/goose/docs/getting-started/providers",children:"Configure LLM Provider"})," guide."]}),"\n",(0,s.jsxs)(t.p,{children:["If you have any questions or get stuck, feel free to chat with us on ",(0,s.jsx)(t.a,{href:"https://discord.gg/block-opensource",children:"Discord"})," or post an issue/discussion on ",(0,s.jsx)(t.a,{href:"https://github.com/block/goose/",children:"GitHub"}),". Thanks for reading!"]}),"\n",(0,s.jsx)(t.h1,{id:"why-go-local",children:"Why Go Local?"}),"\n",(0,s.jsx)(t.p,{children:"Using cloud-based LLMs and providers make it so you don't need substantial computing resources, so why go local? Here's some benefits you may want to consider:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"True data privacy"}),' since your conversations never leave your device. You have complete control over sensitive information. As Parth emphasized during the discussion, "Your data stays with you, period."']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Offline capability"}),' transforms when and where you can use AI. "I use Ollama all the time on planes\u2014it\'s a lot of fun!" Parth shared, highlighting how local models free you from the constraints of internet connectivity.']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Direct control over model behavior"})," means you can fine-tune parameters without subscription fees or API limits. Open source models allow you to get a closer look at what's happening behind the scenes."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Personal use cases like development assistance, personal knowledge management, education, and content management are but some examples that can benefit from working locally and offline. You can keep research and sensitive data private, and utilize Goose when you have limited connectivity."}),"\n",(0,s.jsx)(t.h1,{id:"can-my-machine-handle-this",children:"Can My Machine Handle This?"}),"\n",(0,s.jsx)(t.p,{children:"This question came up repeatedly, and the answer is more encouraging than you think. As Parth pointed out, \"You don't need to run the largest models to get excellent results.\" The requirements you'll want to look out for on your device boils down to this:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"RAM is key"}),": 32GB is a solid baseline for larger models and outputs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"For MacBooks, RAM is your primary concern"})," given the unified memory architecture."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"For Windows/Linux, GPU memory is more important"})," for acceleration"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Use cases can start with smaller, more efficient models that run on modest hardware. Models optimized for efficiency can deliver impressive performance even on standard laptops! Just start with a smaller model to test your workflow, then scale up as you need. This way you can figure out if you need the beefy hardware or not."}),"\n",(0,s.jsx)(t.h1,{id:"the-magic-of-structured-outputs",children:"The Magic of Structured Outputs"}),"\n",(0,s.jsxs)(t.p,{children:["Ollama supports ",(0,s.jsx)(t.a,{href:"https://ollama.com/blog/structured-outputs",children:"structured outputs"}),', making it possible to constrain a model\u2019s output to a specific format\u2014essentially teaching models to respond in specific formats like JSON. Parth explained the concept with an elegant analogy: "It\'s like teaching someone math operations. You show them how to add, subtract, multiply, and then they can solve different problems following those patterns."']}),"\n",(0,s.jsx)(t.p,{children:"Parth showed us how these structured outputs can dramatically improve reliability. By constraining the model to respond within specific parameters, you get more consistent, predictable results. This structured approach ensures the model's response can be reliably parsed and integrated into applications\u2014all while running locally on your device."}),"\n",(0,s.jsx)(t.p,{children:"Here's an example of how to structure an output from the livestream:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'// Example of image analysis with structured output\n{\n "scene": "sunset over mountains",\n "objects": [\n {\n "type": "sun",\n "attributes": ["orange", "setting", "partially visible"],\n "confidence": 0.95\n },\n {\n "type": "mountains",\n "attributes": ["silhouetted", "range", "distant"],\n "confidence": 0.92\n },\n {\n "type": "sky",\n "attributes": ["gradient", "orange to purple", "clear"],\n "confidence": 0.98\n }\n ],\n "mood": "peaceful",\n "lighting": "golden hour",\n "composition": "rule of thirds"\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"As Parth walked through these examples, he shared key practices to ensure you get the most out of local LLMs:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"For precision tasks, lower the temperature"}),". Setting it to 0 makes responses more deterministic and factual."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Use structured outputs whenever possible"}),", be explicit about the format you want in your prompts."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Be mindful of context windows"}),", local models have limits on how much information they can process at once."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Experiment with different models"}),"! Each has strengths and weaknesses you'll want to explore for your needs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"For larger documents, chunk them"})," into manageable pieces, this helps a lot when you're working with larger files."]}),"\n"]}),"\n",(0,s.jsx)(t.h1,{id:"its-about-the-freedom-to-choose",children:"It's About The Freedom To Choose"}),"\n",(0,s.jsx)(t.p,{children:"While there are trade-offs in terms of raw processing power when you go local vs cloud, you don't have to choose one over the other. As Parth summarized during the livestream: \"Local AI isn't about replacing cloud options\u2014it's about having the freedom to choose the right approach for your specific needs.\""}),"\n",(0,s.jsx)(t.p,{children:"The benefits of owning your AI experience can be compelling for a variety of use cases. Whether you're a developer building tools, a writer working with confidential material, or simply someone who values privacy and control, I hope the Goose-Ollama integration offers a glimpse into how a local experience can benefit you, and explore a future where sophisticated AI is as personal and private as the data on your hard drive. Thanks for reading!"}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("meta",{property:"og:title",content:"Goosing Around: AI, But Make It Local With Goose and Ollama"}),(0,s.jsx)("meta",{property:"og:type",content:"article"}),(0,s.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/03/13/goose-ollama-local"}),(0,s.jsx)("meta",{property:"og:description",content:"Integrate Goose with Ollama for a fully local experience."}),(0,s.jsx)("meta",{property:"og:image",content:"http://block.github.io/goose/assets/images/gooseollama-fbb2cb67117c81eaa189a6b6174e6c6c.png"}),(0,s.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,s.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,s.jsx)("meta",{name:"twitter:title",content:"Goosing Around: AI, But Make It Local With Goose and Ollama"}),(0,s.jsx)("meta",{name:"twitter:description",content:"Integrate Goose with Ollama for a fully local experience."}),(0,s.jsx)("meta",{name:"twitter:image",content:"http://block.github.io/goose/assets/images/gooseollama-fbb2cb67117c81eaa189a6b6174e6c6c.png"})]})]})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},40584:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/gooseollama-fbb2cb67117c81eaa189a6b6174e6c6c.png"},28453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>i});var n=o(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}},36149:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/14/goose-ollama","source":"@site/blog/2025-03-14-goose-ollama/index.md","title":"AI, But Make It Local With Goose and Ollama","description":"Integrate Goose with Ollama for a fully local experience.","date":"2025-03-14T00:00:00.000Z","tags":[],"readingTime":5.07,"hasTruncateMarker":true,"authors":[{"name":"Tania Chakraborty","title":"Senior Technical Community Manager","url":"https://taniachakraborty.com","page":{"permalink":"/goose/blog/authors/tania"},"socials":{"linkedin":"https://www.linkedin.com/in/taniachakraborty/","x":"https://x.com/taniashiba","github":"https://github.com/taniashiba","bluesky":"https://bsky.app/profile/taniachakraborty.com"},"imageURL":"https://avatars.githubusercontent.com/u/126204004?v=4","key":"tania"}],"frontMatter":{"title":"AI, But Make It Local With Goose and Ollama","description":"Integrate Goose with Ollama for a fully local experience.","authors":["tania"]},"unlisted":false,"prevItem":{"title":"How Goose Catches AI Errors with Langfuse","permalink":"/goose/blog/2025/03/18/goose-langfuse"},"nextItem":{"title":"Turn Figma Designs Into Code With Goose","permalink":"/goose/blog/2025/03/12/goose-figma-mcp"}}')}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.707d3c66.js b/assets/js/1f391b9e.707d3c66.js new file mode 100644 index 00000000..8bb4c630 --- /dev/null +++ b/assets/js/1f391b9e.707d3c66.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6061],{28467:(e,n,t)=>{t.d(n,{A:()=>x});t(96540);var a=t(34164),i=t(50539),l=t(27143),s=t(74848);function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,s.jsx)(l.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function m(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var u=t(204),f=t(52362);function h(e){let{className:n}=e;return(0,s.jsx)(f.A,{type:"caution",title:(0,s.jsx)(d,{}),className:(0,a.A)(n,u.G.common.draftBanner),children:(0,s.jsx)(m,{})})}function g(e){let{className:n}=e;return(0,s.jsx)(f.A,{type:"caution",title:(0,s.jsx)(r,{}),className:(0,a.A)(n,u.G.common.unlistedBanner),children:(0,s.jsx)(o,{})})}function v(e){return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c,{}),(0,s.jsx)(g,{...e})]})}function x(e){let{metadata:n}=e;const{unlisted:t,frontMatter:a}=n;return(0,s.jsxs)(s.Fragment,{children:[(t||a.unlisted)&&(0,s.jsx)(v,{}),a.draft&&(0,s.jsx)(h,{})]})}},39181:(e,n,t)=>{t.r(n),t.d(n,{default:()=>f});t(96540);var a=t(34164),i=t(81082),l=t(204),s=t(43938),r=t(57985),o=t(97959),c=t(28467),d=t(5783);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};var u=t(74848);function f(e){const{content:n}=e,{metadata:t,assets:f}=n,{title:h,editUrl:g,description:v,frontMatter:x,lastUpdatedBy:p,lastUpdatedAt:b}=t,{keywords:j,wrapperClassName:A,hide_table_of_contents:N}=x,L=f.image??x.image,C=!!(g||b||p);return(0,u.jsx)(i.e3,{className:(0,a.A)(A??l.G.wrapper.mdxPages,l.G.page.mdxPage),children:(0,u.jsxs)(s.A,{children:[(0,u.jsx)(i.be,{title:h,description:v,keywords:j,image:L}),(0,u.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,u.jsxs)("div",{className:(0,a.A)("row",m.mdxPageWrapper),children:[(0,u.jsxs)("div",{className:(0,a.A)("col",!N&&"col--8"),children:[(0,u.jsx)(c.A,{metadata:t}),(0,u.jsx)("article",{children:(0,u.jsx)(r.A,{children:(0,u.jsx)(n,{})})}),C&&(0,u.jsx)(d.A,{className:(0,a.A)("margin-top--sm",l.G.pages.pageFooterEditMetaRow),editUrl:g,lastUpdatedAt:b,lastUpdatedBy:p})]}),!N&&n.toc.length>0&&(0,u.jsx)("div",{className:"col col--2",children:(0,u.jsx)(o.A,{toc:n.toc,minHeadingLevel:x.toc_min_heading_level,maxHeadingLevel:x.toc_max_heading_level})})]})})]})})}},97959:(e,n,t)=>{t.d(n,{A:()=>c});t(96540);var a=t(34164),i=t(71021);const l={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var s=t(74848);const r="table-of-contents__link toc-highlight",o="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,s.jsx)("div",{className:(0,a.A)(l.tableOfContents,"thin-scrollbar",n),children:(0,s.jsx)(i.A,{...t,linkClassName:r,linkActiveClassName:o})})}},71021:(e,n,t)=>{t.d(n,{A:()=>g});var a=t(96540),i=t(53115);function l(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const a=t.slice(2,e.level);e.parentIndex=Math.max(...a),t[e.level]=n}));const a=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):a.push(i)})),a}function s(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=s({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function o(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>r(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,a.useRef)(void 0),t=c();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:i,minHeadingLevel:l,maxHeadingLevel:s}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),r=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const a=[];for(let i=n;i<=t;i+=1)a.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:l,maxHeadingLevel:s}),c=o(r,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(56289),u=t(74848);function f(e){let{toc:n,className:t,linkClassName:a,isChild:i}=e;return n.length?(0,u.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:a})]},e.id)))}):null}const h=a.memo(f);function g(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:c,maxHeadingLevel:m,...f}=e;const g=(0,i.p)(),v=c??g.tableOfContents.minHeadingLevel,x=m??g.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,a.useMemo)((()=>s({toc:l(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:v,maxHeadingLevel:x});return d((0,a.useMemo)((()=>{if(r&&o)return{linkClassName:r,linkActiveClassName:o,minHeadingLevel:v,maxHeadingLevel:x}}),[r,o,v,x])),(0,u.jsx)(h,{toc:p,className:t,linkClassName:r,...f})}},94591:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var a=t(88602),i=t(34164),l=t(56289),s=t(74848);const r=e=>{let{size:n=null,outline:t=!1,variant:a="primary",block:r=!1,disabled:o=!1,className:c,style:d,link:m,label:u}=e;const f=n?{sm:"sm",small:"sm",lg:"lg",large:"lg",medium:null}[n]:"",h=f?`button--${f}`:"",g=t?"button--outline":"",v=a?`button--${a}`:"",x=r?"button--block":"",p=o?"disabled":"",b=o?null:m,j=u.replace(":arrow_down:","\u2b07\ufe0f");return(0,s.jsx)(l.A,{to:b,children:(0,s.jsx)("button",{className:(0,i.A)("button",h,g,v,x,p,c),style:d,role:"button","aria-disabled":o,children:j})})},o={...a.A,Button:r}}}]); \ No newline at end of file diff --git a/assets/js/1f73d56c.fe119637.js b/assets/js/1f73d56c.fe119637.js new file mode 100644 index 00000000..5e21fa35 --- /dev/null +++ b/assets/js/1f73d56c.fe119637.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5788],{94149:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"guides/enhanced-code-editing","title":"Enhanced Code Editing with AI Models","description":"Use AI models to intelligently apply code changes","source":"@site/docs/guides/enhanced-code-editing.md","sourceDirName":"guides","slug":"/guides/enhanced-code-editing","permalink":"/goose/docs/guides/enhanced-code-editing","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Enhanced Code Editing with AI Models","sidebar_label":"Enhanced Code Editing","description":"Use AI models to intelligently apply code changes"},"sidebar":"tutorialSidebar","previous":{"title":"Smart Context Management","permalink":"/goose/docs/guides/smart-context-management"},"next":{"title":"Tutorials","permalink":"/goose/docs/category/tutorials"}}');var o=s(74848),i=s(28453);const r={title:"Enhanced Code Editing with AI Models",sidebar_label:"Enhanced Code Editing",description:"Use AI models to intelligently apply code changes"},l=void 0,c={},d=[{value:"Configuration",id:"configuration",level:2},{value:"Supported Providers",id:"supported-providers",level:3},{value:"How It Works",id:"how-it-works",level:2}];function a(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.a,{href:"/docs/mcp/developer-mcp",children:"Developer extension"})," supports using AI models for enhanced code editing through the ",(0,o.jsx)(n.code,{children:"str_replace"})," command. When configured, it intelligently applies code changes using an AI model instead of simple string replacement."]}),"\n",(0,o.jsx)(n.p,{children:"The use of models specializing in code editing can reduce the load on the main LLM providers while increasing accuracy, quality, and speed and lowering cost. This enhanced approach provides:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Context-aware editing"}),": The AI understands code structure and can make more intelligent changes"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Better formatting"}),": Maintains consistent code style and formatting"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Error prevention"}),": Can catch and fix potential issues during the edit"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Flexible model support"}),": Works with any OpenAI-compatible API"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Clean implementation"}),": Uses proper control flow instead of exception handling for configuration checks"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["Set these ",(0,o.jsx)(n.a,{href:"/docs/guides/environment-variables#enhanced-code-editing",children:"environment variables"})," to enable AI-powered code editing:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export GOOSE_EDITOR_API_KEY="your-api-key-here"\nexport GOOSE_EDITOR_HOST="https://api.openai.com/v1"\nexport GOOSE_EDITOR_MODEL="gpt-4o"\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"All three environment variables must be set and non-empty for the feature to activate."})}),"\n",(0,o.jsx)(n.p,{children:"This optional feature is completely backwards compatible - if not configured, the extension works exactly as before with simple string replacement."}),"\n",(0,o.jsx)(n.h3,{id:"supported-providers",children:"Supported Providers"}),"\n",(0,o.jsx)(n.p,{children:"Any OpenAI-compatible API endpoint should work. Examples:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"OpenAI:"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export GOOSE_EDITOR_API_KEY="sk-..."\nexport GOOSE_EDITOR_HOST="https://api.openai.com/v1"\nexport GOOSE_EDITOR_MODEL="gpt-4o"\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Anthropic (via OpenAI-compatible proxy):"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export GOOSE_EDITOR_API_KEY="sk-ant-..."\nexport GOOSE_EDITOR_HOST="https://api.anthropic.com/v1"\nexport GOOSE_EDITOR_MODEL="claude-3-5-sonnet-20241022"\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Morph:"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export GOOSE_EDITOR_API_KEY="sk-..."\nexport GOOSE_EDITOR_HOST="https://api.morphllm.com/v1"\nexport GOOSE_EDITOR_MODEL="morph-v0"\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Relace:"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export GOOSE_EDITOR_API_KEY="rlc-..."\nexport GOOSE_EDITOR_HOST="https://instantapply.endpoint.relace.run/v1/apply"\nexport GOOSE_EDITOR_MODEL="auto"\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Local/Custom endpoints:"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export GOOSE_EDITOR_API_KEY="your-key"\nexport GOOSE_EDITOR_HOST="http://localhost:8000/v1"\nexport GOOSE_EDITOR_MODEL="your-model"\n'})}),"\n",(0,o.jsx)(n.h2,{id:"how-it-works",children:"How It Works"}),"\n",(0,o.jsxs)(n.p,{children:["When the ",(0,o.jsx)(n.code,{children:"str_replace"})," tool is used to edit code:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Configuration Check"}),": Goose checks if all three environment variables are properly set and non-empty."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"With AI Enabled"}),": If configured, Goose sends the original code and your requested change to the configured AI model for processing."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Fallback"}),": If the AI API is not configured or the API call fails, it falls back to simple string replacement."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"User Feedback"}),": The first time you use ",(0,o.jsx)(n.code,{children:"str_replace"})," without AI configuration, you'll see a helpful message explaining how to enable the feature."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var t=s(96540);const o={},i=t.createContext(o);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/203a101a.da2ba455.js b/assets/js/203a101a.da2ba455.js new file mode 100644 index 00000000..fe67616f --- /dev/null +++ b/assets/js/203a101a.da2ba455.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1804],{49849:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>d});var n=o(31262),s=o(74848),a=o(28453);const i={title:"Introducing codename goose",description:"codename goose is your open source AI agent, automating engineering tasks and improving productivity.",authors:["adewale"]},r=void 0,c={authorsImageUrls:[void 0]},d=[];function g(e){const t={a:"a",img:"img",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Introducing codename goose",src:o(51802).A+"",width:"2240",height:"1260"})}),"\n",(0,s.jsxs)(t.p,{children:["We are thrilled to announce ",(0,s.jsx)(t.strong,{children:"codename goose"}),", your on-machine, open source AI agent built to automate your tasks."]}),"\n",(0,s.jsxs)(t.p,{children:["Powered by your choice of ",(0,s.jsx)(t.a,{href:"/docs/getting-started/providers",children:"large language models (LLMs)"}),", a user-friendly desktop interface and CLI, and ",(0,s.jsx)(t.a,{href:"/docs/getting-started/using-extensions",children:"extensions"})," that integrate with your existing tools and applications, Goose is designed to enhance your productivity and workflow."]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(g,{...e})}):g(e)}},51802:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/introducing-codename-goose-89cac25816e0ea215dd47d4b9768c8ab.png"},28453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var n=o(96540);const s={},a=n.createContext(s);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(a.Provider,{value:t},e.children)}},31262:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/01/28/introducing-codename-goose","source":"@site/blog/2025-01-28-introducing-codename-goose/index.md","title":"Introducing codename goose","description":"codename goose is your open source AI agent, automating engineering tasks and improving productivity.","date":"2025-01-28T00:00:00.000Z","tags":[],"readingTime":2.465,"hasTruncateMarker":true,"authors":[{"name":"Adewale Abati","title":"Staff Developer Advocate","url":"https://adewaleabati.com","page":{"permalink":"/goose/blog/authors/adewale"},"socials":{"x":"https://x.com/ace_kyd","github":"https://github.com/acekyd"},"imageURL":"https://avatars.githubusercontent.com/u/4003538?v=4","key":"adewale"}],"frontMatter":{"title":"Introducing codename goose","description":"codename goose is your open source AI agent, automating engineering tasks and improving productivity.","authors":["adewale"]},"unlisted":false,"prevItem":{"title":"Agentic AI and the MCP Ecosystem","permalink":"/goose/blog/2025/02/17/agentic-ai-mcp"},"nextItem":{"title":"Resolving CI Issues with Goose: A Practical Walkthrough","permalink":"/goose/blog/2024/12/11/resolving-ci-issues-with-goose-a-practical-walkthrough"}}')}}]); \ No newline at end of file diff --git a/assets/js/214f955a.7b4cdf73.js b/assets/js/214f955a.7b4cdf73.js new file mode 100644 index 00000000..264734f6 --- /dev/null +++ b/assets/js/214f955a.7b4cdf73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[7058],{47794:o=>{o.exports=JSON.parse('{"author":{"name":"Ebony Louis","title":"Developer Advocate","page":{"permalink":"/goose/blog/authors/ebony"},"socials":{"linkedin":"https://www.linkedin.com/in/ebonylouis/","x":"https://x.com/ebonyjlouis","github":"https://github.com/ebonylouis"},"imageURL":"https://avatars.githubusercontent.com/u/55366651?v=4","key":"ebony","count":5},"listMetadata":{"permalink":"/goose/blog/authors/ebony","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/2224f483.d4600e2d.js b/assets/js/2224f483.d4600e2d.js new file mode 100644 index 00000000..4e724734 --- /dev/null +++ b/assets/js/2224f483.d4600e2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5864],{58905:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var s=o(94578),a=o(74848),r=o(28453);const n={title:"Top 5 MCP Servers I Use as a Developer with Goose",description:"These 5 MCP servers help me automate my workflow and make me a better developer.",date:new Date("2025-04-02T00:00:00.000Z"),authors:["adewale"]},i=void 0,l={authorsImageUrls:[void 0]},c=[];function p(e){const t={img:"img",p:"p",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"blog cover",src:o(73308).A+"",width:"2240",height:"1260"})}),"\n",(0,a.jsx)(t.p,{children:"As a developer, finding the right tools that seamlessly work together can feel like discovering a superpower. And when you have a working process, it can sometimes be difficult to try out new tools."}),"\n",(0,a.jsx)(t.p,{children:"With the introduction of MCPs, AI agents like Goose are able to plug in to my existing tools, and the only thing that changes with my workflow is that much welcomed automation that comes with it. I still do the same things I do, but backed by AI, I can now do them faster and with more confidence."}),"\n",(0,a.jsx)(t.p,{children:"Today, I'm excited to share not just my favorite MCP servers, but the ones I actually use almost everyday with real applications that you can probably relate to as well."})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},73308:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/mcp-servers-cover-99742334f4c2581d18eb092cd0c737f9.png"},28453:(e,t,o)=>{o.d(t,{R:()=>n,x:()=>i});var s=o(96540);const a={},r=s.createContext(a);function n(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),s.createElement(r.Provider,{value:t},e.children)}},94578:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/01/top-5-mcp-servers","source":"@site/blog/2025-04-01-top-5-mcp-servers/index.md","title":"Top 5 MCP Servers I Use as a Developer with Goose","description":"These 5 MCP servers help me automate my workflow and make me a better developer.","date":"2025-04-02T00:00:00.000Z","tags":[],"readingTime":5.105,"hasTruncateMarker":true,"authors":[{"name":"Adewale Abati","title":"Staff Developer Advocate","url":"https://adewaleabati.com","page":{"permalink":"/goose/blog/authors/adewale"},"socials":{"x":"https://x.com/ace_kyd","github":"https://github.com/acekyd"},"imageURL":"https://avatars.githubusercontent.com/u/4003538?v=4","key":"adewale"}],"frontMatter":{"title":"Top 5 MCP Servers I Use as a Developer with Goose","description":"These 5 MCP servers help me automate my workflow and make me a better developer.","date":"2025-04-02T00:00:00.000Z","authors":["adewale"]},"unlisted":false,"prevItem":{"title":"How to Vibe Code Responsibly (with Goose)","permalink":"/goose/blog/2025/04/08/vibe-code-responsibly"},"nextItem":{"title":"MCP Explained for Non-Developers","permalink":"/goose/blog/2025/04/01/mcp-nondevs"}}')}}]); \ No newline at end of file diff --git a/assets/js/234c79f1.7b1ee518.js b/assets/js/234c79f1.7b1ee518.js new file mode 100644 index 00000000..aa4a8b66 --- /dev/null +++ b/assets/js/234c79f1.7b1ee518.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8042],{66551:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=o(57999),s=o(74848),i=o(28453);const r={title:"Codename Goose Goes to Boston",description:"We hosted our first Goose Meetup in Boston, bringing together over 70 community members for lightning talks, hacking, and lively conversations about agentic systems and the future of MCPs.",authors:["rizel"]},a=void 0,c={authorsImageUrls:[void 0]},l=[];function g(e){const t={a:"a",em:"em",img:"img",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"blog cover",src:o(66598).A+"",width:"2240",height:"1260"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.em,{children:"Question: What happens when you bring 70+ AI enthusiasts, open source contributors, and curious learners together in one room?"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Answer: You get an electric night filled with great conversations, hands-on hacking, and mind-blowing insights into agentic systems."})}),"\n",(0,s.jsxs)(t.p,{children:["This week, we hosted our very first ",(0,s.jsx)(t.a,{href:"https://block.github.io/goose",children:"Goose"})," Meetup in Boston at the Cambridge Innovation Center. The turnout and energy exceeded all expectations! From first-time Goose users to seasoned AI engineers, attendees gathered to explore how Goose and the ",(0,s.jsx)(t.a,{href:"https://modelcontextprotocol.io/introduction",children:"Model Context Protocol (MCP)"})," are shaping the future of AI automation."]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(g,{...e})}):g(e)}},66598:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/goose_goes_to_boston_banner-3ef0eedeb9d3eac56907c0c5e615d919.png"},28453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>a});var n=o(96540);const s={},i=n.createContext(s);function r(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(i.Provider,{value:t},e.children)}},57999:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/21/goose-boston-meetup","source":"@site/blog/2025-03-21-goose-boston-meetup/index.mdx","title":"Codename Goose Goes to Boston","description":"We hosted our first Goose Meetup in Boston, bringing together over 70 community members for lightning talks, hacking, and lively conversations about agentic systems and the future of MCPs.","date":"2025-03-21T00:00:00.000Z","tags":[],"readingTime":4.815,"hasTruncateMarker":true,"authors":[{"name":"Rizel Scarlett","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/rizel"},"socials":{"x":"https://x.com/blackgirlbytes","github":"https://github.com/blackgirlbytes","bluesky":"https://bsky.app/profile/blackgirlbytes.bsky.social","linkedin":"https://www.linkedin.com/in/rizel-bobb-semple/"},"imageURL":"https://avatars.githubusercontent.com/u/22990146?v=4","key":"rizel"}],"frontMatter":{"title":"Codename Goose Goes to Boston","description":"We hosted our first Goose Meetup in Boston, bringing together over 70 community members for lightning talks, hacking, and lively conversations about agentic systems and the future of MCPs.","authors":["rizel"]},"unlisted":false,"prevItem":{"title":"How to Determine If An MCP Server Is Safe","permalink":"/goose/blog/2025/03/26/mcp-security"},"nextItem":{"title":"Cracking the Code with VS Code MCP","permalink":"/goose/blog/2025/03/21/goose-vscode"}}')}}]); \ No newline at end of file diff --git a/assets/js/23c2c20d.c8995a9f.js b/assets/js/23c2c20d.c8995a9f.js new file mode 100644 index 00000000..2e66aef6 --- /dev/null +++ b/assets/js/23c2c20d.c8995a9f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5766],{9630:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Quickstart","href":"/goose/docs/quickstart","docId":"quickstart","unlisted":false},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Install Goose","href":"/goose/docs/getting-started/installation","docId":"getting-started/installation","unlisted":false},{"type":"link","label":"Configure LLM Provider","href":"/goose/docs/getting-started/providers","docId":"getting-started/providers","unlisted":false},{"type":"link","label":"Using Extensions","href":"/goose/docs/getting-started/using-extensions","docId":"getting-started/using-extensions","unlisted":false}],"href":"/goose/docs/category/getting-started"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Managing Sessions","href":"/goose/docs/guides/managing-goose-sessions","docId":"guides/managing-goose-sessions","unlisted":false},{"type":"category","label":"Recipes","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Shareable Recipes","href":"/goose/docs/guides/recipes/session-recipes","docId":"guides/recipes/session-recipes","unlisted":false},{"type":"link","label":"Recipe Reference Guide","href":"/goose/docs/guides/recipes/recipe-reference","docId":"guides/recipes/recipe-reference","unlisted":false},{"type":"link","label":"Sub-Recipes","href":"/goose/docs/guides/recipes/sub-recipes","docId":"guides/recipes/sub-recipes","unlisted":false},{"type":"link","label":"Saving Recipes","href":"/goose/docs/guides/recipes/storing-recipes","docId":"guides/recipes/storing-recipes","unlisted":false}],"href":"/goose/docs/guides/recipes/"},{"type":"link","label":"Managing Projects","href":"/goose/docs/guides/managing-projects","docId":"guides/managing-projects","unlisted":false},{"type":"category","label":"Managing Tools","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Tool Permissions","href":"/goose/docs/guides/managing-tools/tool-permissions","docId":"guides/managing-tools/tool-permissions","unlisted":false},{"type":"link","label":"Adjust Tool Output","href":"/goose/docs/guides/managing-tools/adjust-tool-output","docId":"guides/managing-tools/adjust-tool-output","unlisted":false},{"type":"link","label":"Tool Selection Strategy","href":"/goose/docs/guides/managing-tools/tool-router","docId":"guides/managing-tools/tool-router","unlisted":false}],"href":"/goose/docs/guides/managing-tools/"},{"type":"link","label":"Updating Goose","href":"/goose/docs/guides/updating-goose","docId":"guides/updating-goose","unlisted":false},{"type":"link","label":"Goose Permissions","href":"/goose/docs/guides/goose-permissions","docId":"guides/goose-permissions","unlisted":false},{"type":"link","label":"Using Goosehints","href":"/goose/docs/guides/using-goosehints","docId":"guides/using-goosehints","unlisted":false},{"type":"link","label":"Quick Tips","href":"/goose/docs/guides/tips","docId":"guides/tips","unlisted":false},{"type":"link","label":"CLI Commands","href":"/goose/docs/guides/goose-cli-commands","docId":"guides/goose-cli-commands","unlisted":false},{"type":"link","label":"CLI Providers","href":"/goose/docs/guides/cli-providers","docId":"guides/cli-providers","unlisted":false},{"type":"link","label":"LLM Rate Limits","href":"/goose/docs/guides/handling-llm-rate-limits-with-goose","docId":"guides/handling-llm-rate-limits-with-goose","unlisted":false},{"type":"link","label":"Logging System","href":"/goose/docs/guides/logs","docId":"guides/logs","unlisted":false},{"type":"link","label":"File Management","href":"/goose/docs/guides/file-management","docId":"guides/file-management","unlisted":false},{"type":"link","label":"Run Tasks","href":"/goose/docs/guides/running-tasks","docId":"guides/running-tasks","unlisted":false},{"type":"link","label":"Using Gooseignore","href":"/goose/docs/guides/using-gooseignore","docId":"guides/using-gooseignore","unlisted":false},{"type":"link","label":"Configuration File","href":"/goose/docs/guides/config-file","docId":"guides/config-file","unlisted":false},{"type":"link","label":"Creating Plans","href":"/goose/docs/guides/creating-plans","docId":"guides/creating-plans","unlisted":false},{"type":"link","label":"Extension Allowlist","href":"/goose/docs/guides/allowlist","docId":"guides/allowlist","unlisted":false},{"type":"link","label":"Environment Variables","href":"/goose/docs/guides/environment-variables","docId":"guides/environment-variables","unlisted":false},{"type":"link","label":"Smart Context Management","href":"/goose/docs/guides/smart-context-management","docId":"guides/smart-context-management","unlisted":false},{"type":"link","label":"Enhanced Code Editing","href":"/goose/docs/guides/enhanced-code-editing","docId":"guides/enhanced-code-editing","unlisted":false}],"href":"/goose/docs/category/guides"},{"type":"category","label":"Tutorials","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Advanced Cognee Usage with Goose","href":"/goose/docs/tutorials/advanced-cognee-usage","docId":"tutorials/advanced-cognee-usage","unlisted":false},{"type":"link","label":"Benchmark with Goose","href":"/goose/docs/tutorials/benchmarking","docId":"tutorials/benchmarking","unlisted":false},{"type":"link","label":"CI/CD Environments","href":"/goose/docs/tutorials/cicd","docId":"tutorials/cicd","unlisted":false},{"type":"link","label":"Building Custom Extensions","href":"/goose/docs/tutorials/custom-extensions","docId":"tutorials/custom-extensions","unlisted":false},{"type":"link","label":"Goose in Docker","href":"/goose/docs/tutorials/goose-in-docker","docId":"tutorials/goose-in-docker","unlisted":false},{"type":"link","label":"Isolated Development Environments","href":"/goose/docs/tutorials/isolated-development-environments","docId":"tutorials/isolated-development-environments","unlisted":false},{"type":"link","label":"Observability with Langfuse","href":"/goose/docs/tutorials/langfuse","docId":"tutorials/langfuse","unlisted":false},{"type":"link","label":"Lead/Worker Multi-Model Setup","href":"/goose/docs/tutorials/lead-worker","docId":"tutorials/lead-worker","unlisted":false},{"type":"link","label":"Goose Recipes","href":"/goose/docs/tutorials/recipes-tutorial","docId":"tutorials/recipes-tutorial","unlisted":false}],"href":"/goose/docs/category/tutorials"},{"type":"category","label":"MCP Servers","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AgentQL Extension","href":"/goose/docs/mcp/agentql-mcp","docId":"mcp/agentql-mcp","unlisted":false},{"type":"link","label":"Alby Bitcoin Payments MCP","href":"/goose/docs/mcp/alby-mcp","docId":"mcp/alby-mcp","unlisted":false},{"type":"link","label":"Asana Extension","href":"/goose/docs/mcp/asana-mcp","docId":"mcp/asana-mcp","unlisted":false},{"type":"link","label":"Blender Extension","href":"/goose/docs/mcp/blender-mcp","docId":"mcp/blender-mcp","unlisted":false},{"type":"link","label":"Brave Search Extension","href":"/goose/docs/mcp/brave-mcp","docId":"mcp/brave-mcp","unlisted":false},{"type":"link","label":"Browserbase Extension","href":"/goose/docs/mcp/browserbase-mcp","docId":"mcp/browserbase-mcp","unlisted":false},{"type":"link","label":"Cloudinary Asset Management Extension","href":"/goose/docs/mcp/cloudinary-asset-management-mcp","docId":"mcp/cloudinary-asset-management-mcp","unlisted":false},{"type":"link","label":"Cognee Extension","href":"/goose/docs/mcp/cognee-mcp","docId":"mcp/cognee-mcp","unlisted":false},{"type":"link","label":"Computer Controller Extension","href":"/goose/docs/mcp/computer-controller-mcp","docId":"mcp/computer-controller-mcp","unlisted":false},{"type":"link","label":"Context7 Extension","href":"/goose/docs/mcp/context7-mcp","docId":"mcp/context7-mcp","unlisted":false},{"type":"link","label":"Developer Extension","href":"/goose/docs/mcp/developer-mcp","docId":"mcp/developer-mcp","unlisted":false},{"type":"link","label":"ElevenLabs Extension","href":"/goose/docs/mcp/elevenlabs-mcp","docId":"mcp/elevenlabs-mcp","unlisted":false},{"type":"link","label":"Fetch Extension","href":"/goose/docs/mcp/fetch-mcp","docId":"mcp/fetch-mcp","unlisted":false},{"type":"link","label":"Figma Extension","href":"/goose/docs/mcp/figma-mcp","docId":"mcp/figma-mcp","unlisted":false},{"type":"link","label":"Filesystem Extension","href":"/goose/docs/mcp/filesystem-mcp","docId":"mcp/filesystem-mcp","unlisted":false},{"type":"link","label":"GitHub Extension","href":"/goose/docs/mcp/github-mcp","docId":"mcp/github-mcp","unlisted":false},{"type":"link","label":"Google Drive Extension","href":"/goose/docs/mcp/google-drive-mcp","docId":"mcp/google-drive-mcp","unlisted":false},{"type":"link","label":"Google Maps Extension","href":"/goose/docs/mcp/google-maps-mcp","docId":"mcp/google-maps-mcp","unlisted":false},{"type":"link","label":"JetBrains Extension","href":"/goose/docs/mcp/jetbrains-mcp","docId":"mcp/jetbrains-mcp","unlisted":false},{"type":"link","label":"Knowledge Graph Memory Extension","href":"/goose/docs/mcp/knowledge-graph-mcp","docId":"mcp/knowledge-graph-mcp","unlisted":false},{"type":"link","label":"mbot Extension","href":"/goose/docs/mcp/mbot-mcp","docId":"mcp/mbot-mcp","unlisted":false},{"type":"link","label":"Memory Extension","href":"/goose/docs/mcp/memory-mcp","docId":"mcp/memory-mcp","unlisted":false},{"type":"link","label":"Netlify Extension","href":"/goose/docs/mcp/netlify-mcp","docId":"mcp/netlify-mcp","unlisted":false},{"type":"link","label":"Nostrbook Extension","href":"/goose/docs/mcp/nostrbook-mcp","docId":"mcp/nostrbook-mcp","unlisted":false},{"type":"link","label":"PDF Reader Extension","href":"/goose/docs/mcp/pdf-mcp","docId":"mcp/pdf-mcp","unlisted":false},{"type":"link","label":"Pieces for Developers Extension","href":"/goose/docs/mcp/pieces-mcp","docId":"mcp/pieces-mcp","unlisted":false},{"type":"link","label":"Playwright Extension","href":"/goose/docs/mcp/playwright-mcp","docId":"mcp/playwright-mcp","unlisted":false},{"type":"link","label":"PostgreSQL Extension","href":"/goose/docs/mcp/postgres-mcp","docId":"mcp/postgres-mcp","unlisted":false},{"type":"link","label":"Puppeteer Extension","href":"/goose/docs/mcp/puppeteer-mcp","docId":"mcp/puppeteer-mcp","unlisted":false},{"type":"link","label":"Reddit Extension","href":"/goose/docs/mcp/reddit-mcp","docId":"mcp/reddit-mcp","unlisted":false},{"type":"link","label":"Repomix Extension","href":"/goose/docs/mcp/repomix-mcp","docId":"mcp/repomix-mcp","unlisted":false},{"type":"link","label":"Selenium Extension","href":"/goose/docs/mcp/selenium-mcp","docId":"mcp/selenium-mcp","unlisted":false},{"type":"link","label":"Speech Extension","href":"/goose/docs/mcp/speech-mcp","docId":"mcp/speech-mcp","unlisted":false},{"type":"link","label":"Square MCP Extension","href":"/goose/docs/mcp/square-mcp","docId":"mcp/square-mcp","unlisted":false},{"type":"link","label":"Tavily Web Search Extension","href":"/goose/docs/mcp/tavily-mcp","docId":"mcp/tavily-mcp","unlisted":false},{"type":"link","label":"Tutorial Extension","href":"/goose/docs/mcp/tutorial-mcp","docId":"mcp/tutorial-mcp","unlisted":false},{"type":"link","label":"VS Code Extension","href":"/goose/docs/mcp/vscode-mcp","docId":"mcp/vscode-mcp","unlisted":false},{"type":"link","label":"YouTube Transcript Extension","href":"/goose/docs/mcp/youtube-transcript-mcp","docId":"mcp/youtube-transcript-mcp","unlisted":false}],"href":"/goose/docs/category/mcp-servers"},{"type":"category","label":"Architecture Overview","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Goose Architecture","href":"/goose/docs/goose-architecture/","docId":"goose-architecture/goose-architecture","unlisted":false},{"type":"link","label":"Extensions Design","href":"/goose/docs/goose-architecture/extensions-design","docId":"goose-architecture/extensions-design","unlisted":false},{"type":"link","label":"Error Handling","href":"/goose/docs/goose-architecture/error-handling","docId":"goose-architecture/error-handling","unlisted":false}],"href":"/goose/docs/category/architecture-overview"},{"type":"category","label":"Experimental","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Subagents","href":"/goose/docs/experimental/subagents","docId":"experimental/subagents","unlisted":false},{"type":"link","label":"Ollama Tool Shim","href":"/goose/docs/experimental/ollama","docId":"experimental/ollama","unlisted":false},{"type":"link","label":"Goose Mobile","href":"/goose/docs/experimental/goose-mobile","docId":"experimental/goose-mobile","unlisted":false}],"href":"/goose/docs/experimental/"},{"type":"link","label":"Troubleshooting","href":"/goose/docs/troubleshooting","docId":"troubleshooting","unlisted":false}]},"docs":{"experimental/goose-mobile":{"id":"experimental/goose-mobile","title":"Goose Mobile","description":"Goose Mobile is an experimental Android project inspired by the Goose application. It acts as an open agent on your phone, automating multistep tasks, responding to notifications, and even replacing your home screen for maximum efficiency.","sidebar":"tutorialSidebar"},"experimental/index":{"id":"experimental/index","title":"Experimental","description":"Experimental and radically unstable, but lot\'s of fun.","sidebar":"tutorialSidebar"},"experimental/ollama":{"id":"experimental/ollama","title":"Ollama Tool Shim","description":"The Ollama tool shim is an experimental feature that enables tool calling capabilities for language models that don\'t natively support tool calling (like DeepSeek). It works by instructing the primary model to output json for intended tool usage, the interpretive model uses ollama structured outputs to translate the primary model\'s message into valid json, and then that json is translated into valid tool calls to be invoked.","sidebar":"tutorialSidebar"},"experimental/subagents":{"id":"experimental/subagents","title":"Subagents","description":"Subagents are independent instances that execute tasks while keeping your main conversation clean and focused. They bring process isolation and context preservation by offloading work to separate instances. Think of them as temporary assistants that handle specific jobs without cluttering your chat with tool execution details.","sidebar":"tutorialSidebar"},"getting-started/installation":{"id":"getting-started/installation","title":"Install Goose","description":"Choose to install Goose on CLI and/or Desktop:","sidebar":"tutorialSidebar"},"getting-started/providers":{"id":"getting-started/providers","title":"Configure LLM Provider","description":"Goose is compatible with a wide range of LLM providers, allowing you to choose and integrate your preferred model.","sidebar":"tutorialSidebar"},"getting-started/using-extensions":{"id":"getting-started/using-extensions","title":"Using Extensions","description":"Extensions are add-ons that provide a way to extend the functionality of Goose by connecting with applications and tools you already use in your workflow. These extensions can be used to add new features, access data and resources, or integrate with other systems.","sidebar":"tutorialSidebar"},"goose-architecture/error-handling":{"id":"goose-architecture/error-handling","title":"Error Handling","description":"Error handling is a key performance-driving part of Goose. There are many ways that the non-determinism","sidebar":"tutorialSidebar"},"goose-architecture/extensions-design":{"id":"goose-architecture/extensions-design","title":"Extensions Design","description":"This document describes the design and implementation of the Extensions framework in Goose, which enables AI agents to interact with different extensions through a unified tool-based interface.","sidebar":"tutorialSidebar"},"goose-architecture/goose-architecture":{"id":"goose-architecture/goose-architecture","title":"Goose Architecture","description":"Goose, an open source AI Agent, builds upon the basic interaction framework of Large Language Models (LLMs), which primarily functions as a text-based conversational interface. It processes text input and generates text output. This \\"text in, text out\\" approach is enhanced with tool integrations, which allows the AI agent to complete tasks, creating Goose.","sidebar":"tutorialSidebar"},"guides/allowlist":{"id":"guides/allowlist","title":"Goose Extension Allowlist","description":"Goose is an extensible framework that, by default, allows you to install any MCP server. However, you may want stricter controls on which MCP servers can be installed as extensions (e.g. in a corporate setting).","sidebar":"tutorialSidebar"},"guides/cli-providers":{"id":"guides/cli-providers","title":"CLI Providers","description":"Use Claude Code or Gemini CLI subscriptions in Goose","sidebar":"tutorialSidebar"},"guides/config-file":{"id":"guides/config-file","title":"Configuration File","description":"Goose uses a YAML configuration file to manage settings and extensions. This file is located at:","sidebar":"tutorialSidebar"},"guides/creating-plans":{"id":"guides/creating-plans","title":"Creating Plans Before Working","description":"Starting a project without a clear plan is like building a house without a blueprint. It can lead to:","sidebar":"tutorialSidebar"},"guides/enhanced-code-editing":{"id":"guides/enhanced-code-editing","title":"Enhanced Code Editing with AI Models","description":"Use AI models to intelligently apply code changes","sidebar":"tutorialSidebar"},"guides/environment-variables":{"id":"guides/environment-variables","title":"Environment Variables","description":"Goose supports various environment variables that allow you to customize its behavior. This guide provides a comprehensive list of available environment variables grouped by their functionality.","sidebar":"tutorialSidebar"},"guides/file-management":{"id":"guides/file-management","title":"File Access and Management","description":"Efficiently find and reference files in Goose Desktop and follow best practices for safe file operations","sidebar":"tutorialSidebar"},"guides/goose-cli-commands":{"id":"guides/goose-cli-commands","title":"CLI Commands","description":"Goose provides a command-line interface (CLI) with several commands for managing sessions, configurations and extensions. Below is a list of the available commands and their descriptions:","sidebar":"tutorialSidebar"},"guides/goose-permissions":{"id":"guides/goose-permissions","title":"Goose Permission Modes","description":"Goose\u2019s permissions determine how much autonomy it has when modifying files, using extensions, and performing automated actions. By selecting a permission mode, you have full control over how Goose interacts with your development environment.","sidebar":"tutorialSidebar"},"guides/handling-llm-rate-limits-with-goose":{"id":"guides/handling-llm-rate-limits-with-goose","title":"Set LLM Rate Limits","description":"Rate limiting is the process of restricting the number of requests a user or application can send to an LLM API within a specific timeframe. LLM providers enforce this with the purpose of managing resources and preventing abuse.","sidebar":"tutorialSidebar"},"guides/logs":{"id":"guides/logs","title":"Goose Logging System","description":"Goose uses a unified storage system for conversations and interactions. All conversations and interactions (both CLI and Desktop) are stored locally in the following locations:","sidebar":"tutorialSidebar"},"guides/managing-goose-sessions":{"id":"guides/managing-goose-sessions","title":"Managing Goose Sessions","description":"A session is a single, continuous interaction between you and Goose, providing a space to ask questions and prompt action. In this guide, we\'ll cover how to start, exit, and resume a session.","sidebar":"tutorialSidebar"},"guides/managing-projects":{"id":"guides/managing-projects","title":"Managing Projects","description":"Goose Projects automatically track your working directories and associated sessions, making it easy to resume work across multiple codebases with full context preservation.","sidebar":"tutorialSidebar"},"guides/managing-tools/adjust-tool-output":{"id":"guides/managing-tools/adjust-tool-output","title":"Adjusting Tool Output Verbosity","description":"Response Styles customize how tool interactions are displayed in the Goose Desktop chat window.","sidebar":"tutorialSidebar"},"guides/managing-tools/index":{"id":"guides/managing-tools/index","title":"Managing Tools","description":"Control and configure the tools and extensions that power your Goose workflows","sidebar":"tutorialSidebar"},"guides/managing-tools/tool-permissions":{"id":"guides/managing-tools/tool-permissions","title":"Managing Tool Permissions","description":"Tool permissions provide fine-grained control over how Goose uses different tools within extensions. This guide will help you understand and configure these permissions effectively.","sidebar":"tutorialSidebar"},"guides/managing-tools/tool-router":{"id":"guides/managing-tools/tool-router","title":"Tool Selection Strategy","description":"Configure smart tool selection to load only relevant tools, improving performance with multiple extensions","sidebar":"tutorialSidebar"},"guides/recipes/index":{"id":"guides/recipes/index","title":"Recipes","description":"Reusable and shareable AI workflows","sidebar":"tutorialSidebar"},"guides/recipes/recipe-reference":{"id":"guides/recipes/recipe-reference","title":"Recipe Reference Guide","description":"Complete technical reference for creating and customizing recipes in Goose via the CLI.","sidebar":"tutorialSidebar"},"guides/recipes/session-recipes":{"id":"guides/recipes/session-recipes","title":"Shareable Recipes","description":"Share a Goose session setup (including tools, goals, and instructions) as a reusable recipe that others can launch with a single click","sidebar":"tutorialSidebar"},"guides/recipes/storing-recipes":{"id":"guides/recipes/storing-recipes","title":"Saving Recipes","description":"This guide covers storing, organizing, and finding Goose recipes when you need to access them again later.","sidebar":"tutorialSidebar"},"guides/recipes/sub-recipes":{"id":"guides/recipes/sub-recipes","title":"Sub-Recipes For Specialized Tasks","description":"Learn how a recipe can use sub-recipes to perform specific tasks","sidebar":"tutorialSidebar"},"guides/running-tasks":{"id":"guides/running-tasks","title":"Running Tasks","description":"When working with the Goose CLI, you can pass files and instructions to the goose run command to execute tasks and workflows. This could be a simple one-liner command or a complex set of instructions stored in a file.","sidebar":"tutorialSidebar"},"guides/smart-context-management":{"id":"guides/smart-context-management","title":"Smart Context Management","description":"When working with Large Language Models (LLMs), there are limits to how much conversation history they can process at once. Goose provides smart context management features to help handle context and conversation limits so you can maintain productive sessions. Here are some key concepts:","sidebar":"tutorialSidebar"},"guides/tips":{"id":"guides/tips","title":"Quick Goose Tips","description":"Best practices for working with Goose","sidebar":"tutorialSidebar"},"guides/updating-goose":{"id":"guides/updating-goose","title":"Updating Goose","description":"The Goose CLI and desktop apps are under active and continuous development. To get the newest features and fixes, you should periodically update your Goose client using the following instructions.","sidebar":"tutorialSidebar"},"guides/using-goosehints":{"id":"guides/using-goosehints","title":"Providing Hints to Goose","description":".goosehints is a text file used to provide additional context about your project and improve the communication with Goose. The use of goosehints ensures that Goose understands your requirements better and can execute tasks more effectively.","sidebar":"tutorialSidebar"},"guides/using-gooseignore":{"id":"guides/using-gooseignore","title":"Prevent Goose from Accessing Files","description":".gooseignore is a text file that defines patterns for files and directories that Goose will not access. This means Goose cannot read, modify, delete, or run shell commands on these files when using the Developer extension\'s tools.","sidebar":"tutorialSidebar"},"mcp/agentql-mcp":{"id":"mcp/agentql-mcp","title":"AgentQL Extension","description":"Add AgentQL MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/alby-mcp":{"id":"mcp/alby-mcp","title":"Alby Bitcoin Payments MCP","description":"Connect Goose to your Bitcoin Lightning Wallet","sidebar":"tutorialSidebar"},"mcp/asana-mcp":{"id":"mcp/asana-mcp","title":"Asana Extension","description":"Add Asana MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/blender-mcp":{"id":"mcp/blender-mcp","title":"Blender Extension","description":"Add Blender MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/brave-mcp":{"id":"mcp/brave-mcp","title":"Brave Search Extension","description":"Add Brave Search API as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/browserbase-mcp":{"id":"mcp/browserbase-mcp","title":"Browserbase Extension","description":"Add Browserbase MCP Server as a Goose Extension for Web Automation","sidebar":"tutorialSidebar"},"mcp/cloudinary-asset-management-mcp":{"id":"mcp/cloudinary-asset-management-mcp","title":"Cloudinary Asset Management Extension","description":"Add Cloudinary Asset Management MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/cognee-mcp":{"id":"mcp/cognee-mcp","title":"Cognee Extension","description":"Add Cognee MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/computer-controller-mcp":{"id":"mcp/computer-controller-mcp","title":"Computer Controller Extension","description":"Use Computer Controller MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/context7-mcp":{"id":"mcp/context7-mcp","title":"Context7 Extension","description":"This tutorial covers how to add the Context7 MCP Server as a Goose extension to pull up-to-date, version-specific code and docs so Goose can vibe code with real context, not hallucinated or outdated answers.","sidebar":"tutorialSidebar"},"mcp/developer-mcp":{"id":"mcp/developer-mcp","title":"Developer Extension","description":"Use Developer MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/elevenlabs-mcp":{"id":"mcp/elevenlabs-mcp","title":"ElevenLabs Extension","description":"Add ElevenLabs MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/fetch-mcp":{"id":"mcp/fetch-mcp","title":"Fetch Extension","description":"Add Fetch MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/figma-mcp":{"id":"mcp/figma-mcp","title":"Figma Extension","description":"Add Figma MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/filesystem-mcp":{"id":"mcp/filesystem-mcp","title":"Filesystem Extension","description":"Add Filesystem MCP Server as Goose Extension","sidebar":"tutorialSidebar"},"mcp/github-mcp":{"id":"mcp/github-mcp","title":"GitHub Extension","description":"Add GitHub MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/google-drive-mcp":{"id":"mcp/google-drive-mcp","title":"Google Drive Extension","description":"Add Google Drive MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/google-maps-mcp":{"id":"mcp/google-maps-mcp","title":"Google Maps Extension","description":"Add Google Maps MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/jetbrains-mcp":{"id":"mcp/jetbrains-mcp","title":"JetBrains Extension","description":"Use JetBrains MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/knowledge-graph-mcp":{"id":"mcp/knowledge-graph-mcp","title":"Knowledge Graph Memory Extension","description":"Add Knowledge Graph Memory MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/mbot-mcp":{"id":"mcp/mbot-mcp","title":"mbot Extension","description":"Control a MakeBlock mbot2 rover through MQTT and MCP as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/memory-mcp":{"id":"mcp/memory-mcp","title":"Memory Extension","description":"Use Memory MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/netlify-mcp":{"id":"mcp/netlify-mcp","title":"Netlify Extension","description":"Add Netlify MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/nostrbook-mcp":{"id":"mcp/nostrbook-mcp","title":"Nostrbook Extension","description":"Add Nostrbook MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/pdf-mcp":{"id":"mcp/pdf-mcp","title":"PDF Reader Extension","description":"Add PDF Reader MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/pieces-mcp":{"id":"mcp/pieces-mcp","title":"Pieces for Developers Extension","description":"Add Pieces for Developers MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/playwright-mcp":{"id":"mcp/playwright-mcp","title":"Playwright Extension","description":"Add Playwright MCP Server as a Goose Extension for Modern Web Testing","sidebar":"tutorialSidebar"},"mcp/postgres-mcp":{"id":"mcp/postgres-mcp","title":"PostgreSQL Extension","description":"Add PostgreSQL MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/puppeteer-mcp":{"id":"mcp/puppeteer-mcp","title":"Puppeteer Extension","description":"Add Puppeteer MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/reddit-mcp":{"id":"mcp/reddit-mcp","title":"Reddit Extension","description":"Add Reddit MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/repomix-mcp":{"id":"mcp/repomix-mcp","title":"Repomix Extension","description":"Add Repomix MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/selenium-mcp":{"id":"mcp/selenium-mcp","title":"Selenium Extension","description":"Add Selenium MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/speech-mcp":{"id":"mcp/speech-mcp","title":"Speech Extension","description":"Add Speech MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/square-mcp":{"id":"mcp/square-mcp","title":"Square MCP Extension","description":"Add the Square API as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/tavily-mcp":{"id":"mcp/tavily-mcp","title":"Tavily Web Search Extension","description":"Add Tavily MCP Server as a Goose Extension","sidebar":"tutorialSidebar"},"mcp/tutorial-mcp":{"id":"mcp/tutorial-mcp","title":"Tutorial Extension","description":"Learn how to use Goose\'s built-in Tutorial extension for guided learning","sidebar":"tutorialSidebar"},"mcp/vscode-mcp":{"id":"mcp/vscode-mcp","title":"VS Code Extension","description":"Use the Goose VS Code Extension to connect Goose to your editor","sidebar":"tutorialSidebar"},"mcp/youtube-transcript-mcp":{"id":"mcp/youtube-transcript-mcp","title":"YouTube Transcript Extension","description":"Add YouTube Transcript MCP Server as a Goose Extension for accessing YouTube video transcripts","sidebar":"tutorialSidebar"},"quickstart":{"id":"quickstart","title":"Quickstart","description":"Goose is an extensible open source AI agent enhances your software development by automating coding tasks.","sidebar":"tutorialSidebar"},"troubleshooting":{"id":"troubleshooting","title":"Troubleshooting","description":"Goose, like any system, may run into occasional issues. This guide provides solutions for common problems.","sidebar":"tutorialSidebar"},"tutorials/advanced-cognee-usage":{"id":"tutorials/advanced-cognee-usage","title":"Advanced Cognee Usage with Goose","description":"Advanced patterns for using Cognee knowledge graph with Goose for enhanced memory and automation","sidebar":"tutorialSidebar"},"tutorials/benchmarking":{"id":"tutorials/benchmarking","title":"Benchmarking with Goose","description":"The Goose benchmarking system allows you to evaluate goose performance on complex tasks with one or more system","sidebar":"tutorialSidebar"},"tutorials/cicd":{"id":"tutorials/cicd","title":"CI/CD Environments","description":"Set up Goose in your CI/CD pipeline to automate tasks","sidebar":"tutorialSidebar"},"tutorials/custom-extensions":{"id":"tutorials/custom-extensions","title":"Building Custom Extensions","description":"Create your own custom MCP Server to use as a Goose extension","sidebar":"tutorialSidebar"},"tutorials/goose-in-docker":{"id":"tutorials/goose-in-docker","title":"Building Goose in Docker","description":"There are various scenarios where you might want to build Goose in Docker. If the instructions below do not meet your needs, please contact us by replying to our discussion topic.","sidebar":"tutorialSidebar"},"tutorials/isolated-development-environments":{"id":"tutorials/isolated-development-environments","title":"Isolated Development Environments","description":"This guide shows you how to set up isolated development environments using the Container Use MCP with Goose. With this setup, your development work will be isolated to both git branches and containers, allowing you to experiment freely without affecting your main system state.","sidebar":"tutorialSidebar"},"tutorials/langfuse":{"id":"tutorials/langfuse","title":"Observability with Langfuse","description":"Integrate Goose with Langfuse to observe performance","sidebar":"tutorialSidebar"},"tutorials/lead-worker":{"id":"tutorials/lead-worker","title":"Lead/Worker Multi-Model Setup","description":"Enable multi-model functionality by pairing LLMs to complete your tasks","sidebar":"tutorialSidebar"},"tutorials/recipes-tutorial":{"id":"tutorials/recipes-tutorial","title":"Goose Recipes","description":"Learn how to create and use Goose recipes with this comprehensive tutorial covering prompts, parameters, and MCP servers","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/240375a0.f79dcee0.js b/assets/js/240375a0.f79dcee0.js new file mode 100644 index 00000000..2b9824e1 --- /dev/null +++ b/assets/js/240375a0.f79dcee0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3513],{25592:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>l});var n=t(89961),s=t(74848),i=t(28453);const a={title:"MCP Explained for Non-Developers",description:"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks.",authors:["tania"]},r=void 0,c={authorsImageUrls:[void 0]},l=[{value:"What is MCP?",id:"what-is-mcp",level:2},{value:"MCP Servers You Should Try Right Now",id:"mcp-servers-you-should-try-right-now",level:2},{value:"Example MCP Prompts",id:"example-mcp-prompts",level:2},{value:"Google Maps",id:"google-maps",level:3},{value:"YouTube Transcript",id:"youtube-transcript",level:3},{value:"Google Drive",id:"google-drive",level:3},{value:"Asana",id:"asana",level:3},{value:"GitHub",id:"github",level:3},{value:"The Possibilities Are Endless",id:"the-possibilities-are-endless",level:2}];function d(e){const o={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Head:n}=o;return n||function(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"blog cover",src:t(29180).A+"",width:"1206",height:"633"})}),"\n",(0,s.jsx)(o.p,{children:"MCP this, MCP that, what exactly is it, and can you use them if you're not a developer? \ud83e\udd14"}),"\n",(0,s.jsx)(o.h2,{id:"what-is-mcp",children:"What is MCP?"}),"\n",(0,s.jsxs)(o.p,{children:["MCP stands for ",(0,s.jsx)(o.a,{href:"https://modelcontextprotocol.io/introduction",children:"Model Context Protocol"}),", an open standard created by Anthropic."]}),"\n",(0,s.jsx)(o.p,{children:"Let's say you're looking for ways to use AI at work to become more efficient and save as much time as possible. So you go off and learn about large language models (LLMs) like OpenAI or Claude, and start chatting with one. It's amazing being able to chat with AI and have it instantly answer questions or have it tell you how to do something, but how about getting the AI to do stuff for you?"}),"\n",(0,s.jsx)(o.p,{children:"Now there are AI agents, or AI assistants, that can take actions and make decisions for you. But in order to have your AI agent interact with your systems, like Google Drive, Asana, or Slack, there wasn't a standard way to do it. At least not without figuring it out from scratch each time you needed your AI agent to work with what you need it to work with. That's super tedious."}),"\n",(0,s.jsx)(o.p,{children:"That's exactly where MCP comes in. Best part is, you don't need to be a developer to start using them! MCP essentially allows you to give AI agents access to your external systems without having to code. You can think of MCP as the connector for a system and your AI agent, or like the USB-C of AI integrations."}),"\n",(0,s.jsx)(o.h2,{id:"mcp-servers-you-should-try-right-now",children:"MCP Servers You Should Try Right Now"}),"\n",(0,s.jsxs)(o.p,{children:["So what can you connect your AI agent to? MCP Servers! MCP servers give your agent access to your tools. With ",(0,s.jsx)(o.a,{href:"https://glama.ai/mcp/servers",children:"over 3000 MCP servers"})," you can connect to, here is your top list of popular MCP servers you should try:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/google-drive-mcp",children:"Google Drive"})}),": File access and search capabilities for Google Drive"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/youtube-transcript-mcp",children:"YouTube Transcript"})}),": Grab and work with YouTube video transcripts"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/google-maps-mcp",children:"Google Maps"})}),": Location services, directions, and place details"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/tavily-mcp",children:"Tavily Web Search"})}),": Web and local search using Tavily's Search API"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/asana-mcp",children:"Asana"})}),": View asana tasks, projects, workspaces, and/or comments"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/speech-mcp",children:"Speech"})}),": Real-time voice interaction, audio/video transcription, text-to-speech conversion and more"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/github-mcp",children:"GitHub"})}),": Tools to read, search, and manage Git repositories"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:(0,s.jsx)(o.a,{href:"/docs/mcp/fetch-mcp",children:"Fetch"})}),": Web content fetching and conversion for efficient LLM usage"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["This quick list should give you an idea of all the ways you can now use AI agents with your workflow. You can also explore community favorites in ",(0,s.jsx)(o.a,{href:"https://dev.to/techgirl1908/my-favorite-mcp-directories-573n",children:"handy MCP directories"}),", and learn ",(0,s.jsx)(o.a,{href:"/blog/2025/03/26/mcp-security",children:"how to check MCP servers are safe"})," before installing."]}),"\n",(0,s.jsxs)(o.p,{children:["You can also check out these ",(0,s.jsx)(o.a,{href:"/docs/category/mcp-servers",children:"Goose tutorials"}),", showing you exactly how you can use some of these popular MCP servers with Goose, or use ",(0,s.jsx)(o.a,{href:"/docs/mcp/tutorial-mcp",children:"Goose's Tutorial extension"})," to get extra help walking you through using or building extensions."]}),"\n",(0,s.jsx)(o.h2,{id:"example-mcp-prompts",children:"Example MCP Prompts"}),"\n",(0,s.jsx)(o.p,{children:"Now that you've caught a glimpse of some of the MCP servers that out there, how do you make sure you're using MCPs with AI agents the best you can? This is where prompts come in."}),"\n",(0,s.jsx)(o.p,{children:"Prompts are ultimately the text you input when interacting with an AI assistant, and prompts can range from super simple questions to detailed instructions! Here are some example prompts you can ask an AI agent like Goose right now that use some of the MCP servers mentioned above:"}),"\n",(0,s.jsx)(o.h3,{id:"google-maps",children:"Google Maps"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"Google Maps: Track the live GPS location of driver ID #{driver_id}. Query Google Maps for real-time traffic data and adjust the estimated delivery time if delays exceed 5 minutes. If ETA changes, update the customer's live tracker and send an SMS notification. If the delay is greater than 20 minutes, check if another driver within a 1-mile radius can take over the delivery.\n"})}),"\n",(0,s.jsx)(o.h3,{id:"youtube-transcript",children:"YouTube Transcript"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"YouTube Transcript: Get the transcript from this youtube video [link to video]. Then, summarize it into a blog post.\n"})}),"\n",(0,s.jsx)(o.h3,{id:"google-drive",children:"Google Drive"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"I have an important marketing budget review meeting in 30 minutes and I need your help getting prepared. I have several documents in my Google Drive from our previous meetings and planning sessions. Could you help me by:\n\n1. Finding all relevant documents about our marketing budget and performance\n2. Giving me a quick summary of our Q1 performance\n3. Highlighting the key decisions we need to make about the marketing automation tool and video production\n4. Identifying any outstanding action items from our last meeting\n"})}),"\n",(0,s.jsx)(o.h3,{id:"asana",children:"Asana"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"Asana: Create a new task in my Asana workspace called 'Review Q4 metrics' and set the due date to next Friday. Then, find all tasks assigned to me that are due this week and summarize them.\n"})}),"\n",(0,s.jsx)(o.h3,{id:"github",children:"GitHub"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:'GitHub: Create a new branch called hello-world in my angiejones/goose-demo repository. Update the README.md file to say "this was written by goose" and commit it. Open a pull request with your changes.\n'})}),"\n",(0,s.jsxs)(o.p,{children:["To see more examples just like this, along with the results you can get, check out this ",(0,s.jsx)(o.a,{href:"https://block.github.io/goose/prompt-library",children:"Prompt Library"}),"! This is your central directory for discovering and using effective prompts with Goose."]}),"\n",(0,s.jsx)(o.h2,{id:"the-possibilities-are-endless",children:"The Possibilities Are Endless"}),"\n",(0,s.jsx)(o.p,{children:"While some are developed by official providers, a vast majority of MCP servers you see are actually developed by community members! Plus, because MCP is an open standard, anyone can build an MCP server for any resource. You could even use Goose to help you build one!"}),"\n",(0,s.jsx)(o.p,{children:"Hopefully now, instead of spending hours manually gathering data and creating your next marketing report, or manually sorting through your todo-backlog on a Monday, you will use MCP with Goose and have it done for you in minutes."}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsxs)(o.em,{children:["To learn more about using MCP servers and Goose, check out the ",(0,s.jsx)(o.a,{href:"https://block.github.io/goose/docs/category/getting-started",children:"Goose documentation"}),", or join the ",(0,s.jsx)(o.a,{href:"https://discord.gg/block-opensource",children:"Block Open Source Discord"})," to connect with other open source community members."]})}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("meta",{property:"og:title",content:"MCP Explained for Non-Developers"}),(0,s.jsx)("meta",{property:"og:type",content:"article"}),(0,s.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/04/01/mcp-nondevs"}),(0,s.jsx)("meta",{property:"og:description",content:"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks."}),(0,s.jsx)("meta",{property:"og:image",content:"http://block.github.io/goose/assets/images/mcp_nondevs-5ce7f39de923cab01de6e14e5dc06744.png"}),(0,s.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,s.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,s.jsx)("meta",{name:"twitter:title",content:"MCP Explained for Non-Developers"}),(0,s.jsx)("meta",{name:"twitter:description",content:"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks."}),(0,s.jsx)("meta",{name:"twitter:image",content:"http://block.github.io/goose/assets/images/mcp_nondevs-5ce7f39de923cab01de6e14e5dc06744.png"})]})]})}function h(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},29180:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/mcp_nondevs-5ce7f39de923cab01de6e14e5dc06744.png"},28453:(e,o,t)=>{t.d(o,{R:()=>a,x:()=>r});var n=t(96540);const s={},i=n.createContext(s);function a(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:o},e.children)}},89961:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/01/mcp-nondevs","source":"@site/blog/2025-04-01-mcp-nondevs/index.md","title":"MCP Explained for Non-Developers","description":"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks.","date":"2025-04-01T00:00:00.000Z","tags":[],"readingTime":5.19,"hasTruncateMarker":true,"authors":[{"name":"Tania Chakraborty","title":"Senior Technical Community Manager","url":"https://taniachakraborty.com","page":{"permalink":"/goose/blog/authors/tania"},"socials":{"linkedin":"https://www.linkedin.com/in/taniachakraborty/","x":"https://x.com/taniashiba","github":"https://github.com/taniashiba","bluesky":"https://bsky.app/profile/taniachakraborty.com"},"imageURL":"https://avatars.githubusercontent.com/u/126204004?v=4","key":"tania"}],"frontMatter":{"title":"MCP Explained for Non-Developers","description":"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks.","authors":["tania"]},"unlisted":false,"prevItem":{"title":"Top 5 MCP Servers I Use as a Developer with Goose","permalink":"/goose/blog/2025/04/01/top-5-mcp-servers"},"nextItem":{"title":"Community-Inspired Benchmarking: The Goose Vibe Check","permalink":"/goose/blog/2025/03/31/goose-benchmark"}}')}}]); \ No newline at end of file diff --git a/assets/js/241bbc51.4292feca.js b/assets/js/241bbc51.4292feca.js new file mode 100644 index 00000000..e957e85c --- /dev/null +++ b/assets/js/241bbc51.4292feca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[739],{66210:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var o=n(10691),i=n(74848),s=n(28453);const r={title:"MCP Is Rewriting the Rules of API Integration",description:"A developer's guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations.",authors:["ian"]},a=void 0,c={authorsImageUrls:[void 0]},l=[];function u(e){const t={img:"img",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"blog cover",src:n(31579).A+"",width:"1920",height:"1080"})}),"\n",(0,i.jsx)(t.p,{children:"As developers, we're always looking for ways to build more efficient, scalable, and intelligent applications. For years, RESTful APIs have been our go-to for connecting services. Here are some ways you can integrate AI agents and MCP into your existing API infrastructure to make it smarter, more efficient, and easier to maintain."})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},31579:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png"},28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(96540);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}},10691:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration","source":"@site/blog/2025-04-22-mcp-is-rewriting-the-rules-of-api-integration/index.md","title":"MCP Is Rewriting the Rules of API Integration","description":"A developer\'s guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations.","date":"2025-04-22T00:00:00.000Z","tags":[],"readingTime":9.69,"hasTruncateMarker":true,"authors":[{"name":"W Ian Douglas","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/ian"},"socials":{"linkedin":"https://www.linkedin.com/in/iandouglas736/","github":"https://github.com/iandouglas","bluesky":"https://bsky.app/profile/iandouglas736.com","x":"https://x.com/iandouglas736"},"imageURL":"https://avatars.githubusercontent.com/u/168030?v=4","key":"ian"}],"frontMatter":{"title":"MCP Is Rewriting the Rules of API Integration","description":"A developer\'s guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations.","authors":["ian"]},"unlisted":false,"prevItem":{"title":"How One Contribution Can Spark Many Wins","permalink":"/goose/blog/2025/04/22/community-bestcodes"},"nextItem":{"title":"MCP in the Enterprise: Real World Adoption at Block","permalink":"/goose/blog/2025/04/21/mcp-in-enterprise"}}')}}]); \ No newline at end of file diff --git a/assets/js/2482.367a2044.js b/assets/js/2482.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/2482.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2591.9ea46e15.js b/assets/js/2591.9ea46e15.js new file mode 100644 index 00000000..7bf6e088 --- /dev/null +++ b/assets/js/2591.9ea46e15.js @@ -0,0 +1,2 @@ +/*! For license information please see 2591.9ea46e15.js.LICENSE.txt */ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2591],{25191:(e,o,r)=>{r.d(o,{A:()=>t});const t=(0,r(75395).A)("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]])},69158:(e,o,r)=>{r.d(o,{A:()=>t});const t=(0,r(75395).A)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},50856:(e,o,r)=>{r.d(o,{QP:()=>de});const t=e=>{const o=l(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:t}=e;return{getClassGroupId:e=>{const r=e.split("-");return""===r[0]&&1!==r.length&&r.shift(),s(r,o)||n(e)},getConflictingClassGroupIds:(e,o)=>{const s=r[e]||[];return o&&t[e]?[...s,...t[e]]:s}}},s=(e,o)=>{if(0===e.length)return o.classGroupId;const r=e[0],t=o.nextPart.get(r),a=t?s(e.slice(1),t):void 0;if(a)return a;if(0===o.validators.length)return;const n=e.join("-");return o.validators.find((({validator:e})=>e(n)))?.classGroupId},a=/^\[(.+)\]$/,n=e=>{if(a.test(e)){const o=a.exec(e)[1],r=o?.substring(0,o.indexOf(":"));if(r)return"arbitrary.."+r}},l=e=>{const{theme:o,classGroups:r}=e,t={nextPart:new Map,validators:[]};for(const s in r)i(r[s],t,s,o);return t},i=(e,o,r,t)=>{e.forEach((e=>{if("string"!=typeof e){if("function"==typeof e)return c(e)?void i(e(t),o,r,t):void o.validators.push({validator:e,classGroupId:r});Object.entries(e).forEach((([e,s])=>{i(s,d(o,e),r,t)}))}else{(""===e?o:d(o,e)).classGroupId=r}}))},d=(e,o)=>{let r=e;return o.split("-").forEach((e=>{r.nextPart.has(e)||r.nextPart.set(e,{nextPart:new Map,validators:[]}),r=r.nextPart.get(e)})),r},c=e=>e.isThemeGetter,m=e=>{if(e<1)return{get:()=>{},set:()=>{}};let o=0,r=new Map,t=new Map;const s=(s,a)=>{r.set(s,a),o++,o>e&&(o=0,t=r,r=new Map)};return{get(e){let o=r.get(e);return void 0!==o?o:void 0!==(o=t.get(e))?(s(e,o),o):void 0},set(e,o){r.has(e)?r.set(e,o):s(e,o)}}},p=e=>{const{prefix:o,experimentalParseClassName:r}=e;let t=e=>{const o=[];let r,t=0,s=0,a=0;for(let i=0;ia?r-a:void 0}};if(o){const e=o+":",r=t;t=o=>o.startsWith(e)?r(o.substring(e.length)):{isExternal:!0,modifiers:[],hasImportantModifier:!1,baseClassName:o,maybePostfixModifierPosition:void 0}}if(r){const e=t;t=o=>r({className:o,parseClassName:e})}return t},u=e=>e.endsWith("!")?e.substring(0,e.length-1):e.startsWith("!")?e.substring(1):e,b=e=>{const o=Object.fromEntries(e.orderSensitiveModifiers.map((e=>[e,!0])));return e=>{if(e.length<=1)return e;const r=[];let t=[];return e.forEach((e=>{"["===e[0]||o[e]?(r.push(...t.sort(),e),t=[]):t.push(e)})),r.push(...t.sort()),r}},f=/\s+/;function g(){let e,o,r=0,t="";for(;r{if("string"==typeof e)return e;let o,r="";for(let t=0;to(e)),e());return r=(e=>({cache:m(e.cacheSize),parseClassName:p(e),sortModifiers:b(e),...t(e)}))(d),s=r.cache.get,a=r.cache.set,n=l,l(i)};function l(e){const o=s(e);if(o)return o;const t=((e,o)=>{const{parseClassName:r,getClassGroupId:t,getConflictingClassGroupIds:s,sortModifiers:a}=o,n=[],l=e.trim().split(f);let i="";for(let d=l.length-1;d>=0;d-=1){const e=l[d],{isExternal:o,modifiers:c,hasImportantModifier:m,baseClassName:p,maybePostfixModifierPosition:u}=r(e);if(o){i=e+(i.length>0?" "+i:i);continue}let b=!!u,f=t(b?p.substring(0,u):p);if(!f){if(!b){i=e+(i.length>0?" "+i:i);continue}if(f=t(p),!f){i=e+(i.length>0?" "+i:i);continue}b=!1}const g=a(c).join(":"),h=m?g+"!":g,k=h+f;if(n.includes(k))continue;n.push(k);const x=s(f,b);for(let r=0;r0?" "+i:i)}return i})(e,r);return a(e,t),t}return function(){return n(g.apply(null,arguments))}}const x=e=>{const o=o=>o[e]||[];return o.isThemeGetter=!0,o},w=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,y=/^\((?:(\w[\w-]*):)?(.+)\)$/i,v=/^\d+\/\d+$/,z=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,C=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,M=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,j=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,G=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,N=e=>v.test(e),P=e=>!!e&&!Number.isNaN(Number(e)),I=e=>!!e&&Number.isInteger(Number(e)),$=e=>e.endsWith("%")&&P(e.slice(0,-1)),E=e=>z.test(e),S=()=>!0,A=e=>C.test(e)&&!M.test(e),W=()=>!1,O=e=>j.test(e),T=e=>G.test(e),q=e=>!Q(e)&&!J(e),_=e=>Z(e,te,W),Q=e=>w.test(e),X=e=>Z(e,se,A),B=e=>Z(e,ae,P),D=e=>Z(e,oe,W),F=e=>Z(e,re,T),H=e=>Z(e,le,O),J=e=>y.test(e),K=e=>ee(e,se),L=e=>ee(e,ne),R=e=>ee(e,oe),U=e=>ee(e,te),V=e=>ee(e,re),Y=e=>ee(e,le,!0),Z=(e,o,r)=>{const t=w.exec(e);return!!t&&(t[1]?o(t[1]):r(t[2]))},ee=(e,o,r=!1)=>{const t=y.exec(e);return!!t&&(t[1]?o(t[1]):r)},oe=e=>"position"===e||"percentage"===e,re=e=>"image"===e||"url"===e,te=e=>"length"===e||"size"===e||"bg-size"===e,se=e=>"length"===e,ae=e=>"number"===e,ne=e=>"family-name"===e,le=e=>"shadow"===e,ie=(Symbol.toStringTag,()=>{const e=x("color"),o=x("font"),r=x("text"),t=x("font-weight"),s=x("tracking"),a=x("leading"),n=x("breakpoint"),l=x("container"),i=x("spacing"),d=x("radius"),c=x("shadow"),m=x("inset-shadow"),p=x("text-shadow"),u=x("drop-shadow"),b=x("blur"),f=x("perspective"),g=x("aspect"),h=x("ease"),k=x("animate"),w=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom",J,Q],y=()=>[J,Q,i],v=()=>[N,"full","auto",...y()],z=()=>[I,"none","subgrid",J,Q],C=()=>["auto",{span:["full",I,J,Q]},I,J,Q],M=()=>[I,"auto",J,Q],j=()=>["auto","min","max","fr",J,Q],G=()=>["auto",...y()],A=()=>[N,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...y()],W=()=>[e,J,Q],O=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom",R,D,{position:[J,Q]}],T=()=>["auto","cover","contain",U,_,{size:[J,Q]}],Z=()=>[$,K,X],ee=()=>["","none","full",d,J,Q],oe=()=>["",P,K,X],re=()=>[P,$,R,D],te=()=>["","none",b,J,Q],se=()=>["none",P,J,Q],ae=()=>["none",P,J,Q],ne=()=>[P,J,Q],le=()=>[N,"full",...y()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[E],breakpoint:[E],color:[S],container:[E],"drop-shadow":[E],ease:["in","out","in-out"],font:[q],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[E],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[E],shadow:[E],spacing:["px",P],text:[E],"text-shadow":[E],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",N,Q,J,g]}],container:["container"],columns:[{columns:[P,Q,J,l]}],"break-after":[{"break-after":["auto","avoid","all","avoid-page","page","left","right","column"]}],"break-before":[{"break-before":["auto","avoid","all","avoid-page","page","left","right","column"]}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:w()}],overflow:[{overflow:["auto","hidden","clip","visible","scroll"]}],"overflow-x":[{"overflow-x":["auto","hidden","clip","visible","scroll"]}],"overflow-y":[{"overflow-y":["auto","hidden","clip","visible","scroll"]}],overscroll:[{overscroll:["auto","contain","none"]}],"overscroll-x":[{"overscroll-x":["auto","contain","none"]}],"overscroll-y":[{"overscroll-y":["auto","contain","none"]}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:v()}],"inset-x":[{"inset-x":v()}],"inset-y":[{"inset-y":v()}],start:[{start:v()}],end:[{end:v()}],top:[{top:v()}],right:[{right:v()}],bottom:[{bottom:v()}],left:[{left:v()}],visibility:["visible","invisible","collapse"],z:[{z:[I,"auto",J,Q]}],basis:[{basis:[N,"full","auto",l,...y()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[P,N,"auto","initial","none",Q]}],grow:[{grow:["",P,J,Q]}],shrink:[{shrink:["",P,J,Q]}],order:[{order:[I,"first","last","none",J,Q]}],"grid-cols":[{"grid-cols":z()}],"col-start-end":[{col:C()}],"col-start":[{"col-start":M()}],"col-end":[{"col-end":M()}],"grid-rows":[{"grid-rows":z()}],"row-start-end":[{row:C()}],"row-start":[{"row-start":M()}],"row-end":[{"row-end":M()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":j()}],"auto-rows":[{"auto-rows":j()}],gap:[{gap:y()}],"gap-x":[{"gap-x":y()}],"gap-y":[{"gap-y":y()}],"justify-content":[{justify:["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe","normal"]}],"justify-items":[{"justify-items":["start","end","center","stretch","center-safe","end-safe","normal"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch","center-safe","end-safe"]}],"align-content":[{content:["normal","start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"]}],"align-items":[{items:["start","end","center","stretch","center-safe","end-safe",{baseline:["","last"]}]}],"align-self":[{self:["auto","start","end","center","stretch","center-safe","end-safe",{baseline:["","last"]}]}],"place-content":[{"place-content":["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"]}],"place-items":[{"place-items":["start","end","center","stretch","center-safe","end-safe","baseline"]}],"place-self":[{"place-self":["auto","start","end","center","stretch","center-safe","end-safe"]}],p:[{p:y()}],px:[{px:y()}],py:[{py:y()}],ps:[{ps:y()}],pe:[{pe:y()}],pt:[{pt:y()}],pr:[{pr:y()}],pb:[{pb:y()}],pl:[{pl:y()}],m:[{m:G()}],mx:[{mx:G()}],my:[{my:G()}],ms:[{ms:G()}],me:[{me:G()}],mt:[{mt:G()}],mr:[{mr:G()}],mb:[{mb:G()}],ml:[{ml:G()}],"space-x":[{"space-x":y()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":y()}],"space-y-reverse":["space-y-reverse"],size:[{size:A()}],w:[{w:[l,"screen",...A()]}],"min-w":[{"min-w":[l,"screen","none",...A()]}],"max-w":[{"max-w":[l,"screen","none","prose",{screen:[n]},...A()]}],h:[{h:["screen",...A()]}],"min-h":[{"min-h":["screen","none",...A()]}],"max-h":[{"max-h":["screen",...A()]}],"font-size":[{text:["base",r,K,X]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[t,J,B]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",$,Q]}],"font-family":[{font:[L,Q,o]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[s,J,Q]}],"line-clamp":[{"line-clamp":[P,"none",J,B]}],leading:[{leading:[a,...y()]}],"list-image":[{"list-image":["none",J,Q]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",J,Q]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:W()}],"text-color":[{text:W()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:["solid","dashed","dotted","double","wavy"]}],"text-decoration-thickness":[{decoration:[P,"from-font","auto",J,X]}],"text-decoration-color":[{decoration:W()}],"underline-offset":[{"underline-offset":[P,"auto",J,Q]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:y()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",J,Q]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",J,Q]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:O()}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","space","round"]}]}],"bg-size":[{bg:T()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},I,J,Q],radial:["",J,Q],conic:[I,J,Q]},V,F]}],"bg-color":[{bg:W()}],"gradient-from-pos":[{from:Z()}],"gradient-via-pos":[{via:Z()}],"gradient-to-pos":[{to:Z()}],"gradient-from":[{from:W()}],"gradient-via":[{via:W()}],"gradient-to":[{to:W()}],rounded:[{rounded:ee()}],"rounded-s":[{"rounded-s":ee()}],"rounded-e":[{"rounded-e":ee()}],"rounded-t":[{"rounded-t":ee()}],"rounded-r":[{"rounded-r":ee()}],"rounded-b":[{"rounded-b":ee()}],"rounded-l":[{"rounded-l":ee()}],"rounded-ss":[{"rounded-ss":ee()}],"rounded-se":[{"rounded-se":ee()}],"rounded-ee":[{"rounded-ee":ee()}],"rounded-es":[{"rounded-es":ee()}],"rounded-tl":[{"rounded-tl":ee()}],"rounded-tr":[{"rounded-tr":ee()}],"rounded-br":[{"rounded-br":ee()}],"rounded-bl":[{"rounded-bl":ee()}],"border-w":[{border:oe()}],"border-w-x":[{"border-x":oe()}],"border-w-y":[{"border-y":oe()}],"border-w-s":[{"border-s":oe()}],"border-w-e":[{"border-e":oe()}],"border-w-t":[{"border-t":oe()}],"border-w-r":[{"border-r":oe()}],"border-w-b":[{"border-b":oe()}],"border-w-l":[{"border-l":oe()}],"divide-x":[{"divide-x":oe()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":oe()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:["solid","dashed","dotted","double","hidden","none"]}],"divide-style":[{divide:["solid","dashed","dotted","double","hidden","none"]}],"border-color":[{border:W()}],"border-color-x":[{"border-x":W()}],"border-color-y":[{"border-y":W()}],"border-color-s":[{"border-s":W()}],"border-color-e":[{"border-e":W()}],"border-color-t":[{"border-t":W()}],"border-color-r":[{"border-r":W()}],"border-color-b":[{"border-b":W()}],"border-color-l":[{"border-l":W()}],"divide-color":[{divide:W()}],"outline-style":[{outline:["solid","dashed","dotted","double","none","hidden"]}],"outline-offset":[{"outline-offset":[P,J,Q]}],"outline-w":[{outline:["",P,K,X]}],"outline-color":[{outline:W()}],shadow:[{shadow:["","none",c,Y,H]}],"shadow-color":[{shadow:W()}],"inset-shadow":[{"inset-shadow":["none",m,Y,H]}],"inset-shadow-color":[{"inset-shadow":W()}],"ring-w":[{ring:oe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:W()}],"ring-offset-w":[{"ring-offset":[P,X]}],"ring-offset-color":[{"ring-offset":W()}],"inset-ring-w":[{"inset-ring":oe()}],"inset-ring-color":[{"inset-ring":W()}],"text-shadow":[{"text-shadow":["none",p,Y,H]}],"text-shadow-color":[{"text-shadow":W()}],opacity:[{opacity:[P,J,Q]}],"mix-blend":[{"mix-blend":["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity","plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"]}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[P]}],"mask-image-linear-from-pos":[{"mask-linear-from":re()}],"mask-image-linear-to-pos":[{"mask-linear-to":re()}],"mask-image-linear-from-color":[{"mask-linear-from":W()}],"mask-image-linear-to-color":[{"mask-linear-to":W()}],"mask-image-t-from-pos":[{"mask-t-from":re()}],"mask-image-t-to-pos":[{"mask-t-to":re()}],"mask-image-t-from-color":[{"mask-t-from":W()}],"mask-image-t-to-color":[{"mask-t-to":W()}],"mask-image-r-from-pos":[{"mask-r-from":re()}],"mask-image-r-to-pos":[{"mask-r-to":re()}],"mask-image-r-from-color":[{"mask-r-from":W()}],"mask-image-r-to-color":[{"mask-r-to":W()}],"mask-image-b-from-pos":[{"mask-b-from":re()}],"mask-image-b-to-pos":[{"mask-b-to":re()}],"mask-image-b-from-color":[{"mask-b-from":W()}],"mask-image-b-to-color":[{"mask-b-to":W()}],"mask-image-l-from-pos":[{"mask-l-from":re()}],"mask-image-l-to-pos":[{"mask-l-to":re()}],"mask-image-l-from-color":[{"mask-l-from":W()}],"mask-image-l-to-color":[{"mask-l-to":W()}],"mask-image-x-from-pos":[{"mask-x-from":re()}],"mask-image-x-to-pos":[{"mask-x-to":re()}],"mask-image-x-from-color":[{"mask-x-from":W()}],"mask-image-x-to-color":[{"mask-x-to":W()}],"mask-image-y-from-pos":[{"mask-y-from":re()}],"mask-image-y-to-pos":[{"mask-y-to":re()}],"mask-image-y-from-color":[{"mask-y-from":W()}],"mask-image-y-to-color":[{"mask-y-to":W()}],"mask-image-radial":[{"mask-radial":[J,Q]}],"mask-image-radial-from-pos":[{"mask-radial-from":re()}],"mask-image-radial-to-pos":[{"mask-radial-to":re()}],"mask-image-radial-from-color":[{"mask-radial-from":W()}],"mask-image-radial-to-color":[{"mask-radial-to":W()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"]}],"mask-image-conic-pos":[{"mask-conic":[P]}],"mask-image-conic-from-pos":[{"mask-conic-from":re()}],"mask-image-conic-to-pos":[{"mask-conic-to":re()}],"mask-image-conic-from-color":[{"mask-conic-from":W()}],"mask-image-conic-to-color":[{"mask-conic-to":W()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:O()}],"mask-repeat":[{mask:["no-repeat",{repeat:["","x","y","space","round"]}]}],"mask-size":[{mask:T()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",J,Q]}],filter:[{filter:["","none",J,Q]}],blur:[{blur:te()}],brightness:[{brightness:[P,J,Q]}],contrast:[{contrast:[P,J,Q]}],"drop-shadow":[{"drop-shadow":["","none",u,Y,H]}],"drop-shadow-color":[{"drop-shadow":W()}],grayscale:[{grayscale:["",P,J,Q]}],"hue-rotate":[{"hue-rotate":[P,J,Q]}],invert:[{invert:["",P,J,Q]}],saturate:[{saturate:[P,J,Q]}],sepia:[{sepia:["",P,J,Q]}],"backdrop-filter":[{"backdrop-filter":["","none",J,Q]}],"backdrop-blur":[{"backdrop-blur":te()}],"backdrop-brightness":[{"backdrop-brightness":[P,J,Q]}],"backdrop-contrast":[{"backdrop-contrast":[P,J,Q]}],"backdrop-grayscale":[{"backdrop-grayscale":["",P,J,Q]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[P,J,Q]}],"backdrop-invert":[{"backdrop-invert":["",P,J,Q]}],"backdrop-opacity":[{"backdrop-opacity":[P,J,Q]}],"backdrop-saturate":[{"backdrop-saturate":[P,J,Q]}],"backdrop-sepia":[{"backdrop-sepia":["",P,J,Q]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":y()}],"border-spacing-x":[{"border-spacing-x":y()}],"border-spacing-y":[{"border-spacing-y":y()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",J,Q]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[P,"initial",J,Q]}],ease:[{ease:["linear","initial",h,J,Q]}],delay:[{delay:[P,J,Q]}],animate:[{animate:["none",k,J,Q]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[f,J,Q]}],"perspective-origin":[{"perspective-origin":w()}],rotate:[{rotate:se()}],"rotate-x":[{"rotate-x":se()}],"rotate-y":[{"rotate-y":se()}],"rotate-z":[{"rotate-z":se()}],scale:[{scale:ae()}],"scale-x":[{"scale-x":ae()}],"scale-y":[{"scale-y":ae()}],"scale-z":[{"scale-z":ae()}],"scale-3d":["scale-3d"],skew:[{skew:ne()}],"skew-x":[{"skew-x":ne()}],"skew-y":[{"skew-y":ne()}],transform:[{transform:[J,Q,"","none","gpu","cpu"]}],"transform-origin":[{origin:w()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:le()}],"translate-x":[{"translate-x":le()}],"translate-y":[{"translate-y":le()}],"translate-z":[{"translate-z":le()}],"translate-none":["translate-none"],accent:[{accent:W()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:W()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",J,Q]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":y()}],"scroll-mx":[{"scroll-mx":y()}],"scroll-my":[{"scroll-my":y()}],"scroll-ms":[{"scroll-ms":y()}],"scroll-me":[{"scroll-me":y()}],"scroll-mt":[{"scroll-mt":y()}],"scroll-mr":[{"scroll-mr":y()}],"scroll-mb":[{"scroll-mb":y()}],"scroll-ml":[{"scroll-ml":y()}],"scroll-p":[{"scroll-p":y()}],"scroll-px":[{"scroll-px":y()}],"scroll-py":[{"scroll-py":y()}],"scroll-ps":[{"scroll-ps":y()}],"scroll-pe":[{"scroll-pe":y()}],"scroll-pt":[{"scroll-pt":y()}],"scroll-pr":[{"scroll-pr":y()}],"scroll-pb":[{"scroll-pb":y()}],"scroll-pl":[{"scroll-pl":y()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",J,Q]}],fill:[{fill:["none",...W()]}],"stroke-w":[{stroke:[P,K,X,B]}],stroke:[{stroke:["none",...W()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}}),de=k(ie)}}]); \ No newline at end of file diff --git a/assets/js/2591.9ea46e15.js.LICENSE.txt b/assets/js/2591.9ea46e15.js.LICENSE.txt new file mode 100644 index 00000000..f02ba941 --- /dev/null +++ b/assets/js/2591.9ea46e15.js.LICENSE.txt @@ -0,0 +1,6 @@ +/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/25e030ab.93a803fd.js b/assets/js/25e030ab.93a803fd.js new file mode 100644 index 00000000..f71bcf49 --- /dev/null +++ b/assets/js/25e030ab.93a803fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1799],{2857:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"experimental/goose-mobile","title":"Goose Mobile","description":"Goose Mobile is an experimental Android project inspired by the Goose application. It acts as an open agent on your phone, automating multistep tasks, responding to notifications, and even replacing your home screen for maximum efficiency.","source":"@site/docs/experimental/goose-mobile.md","sourceDirName":"experimental","slug":"/experimental/goose-mobile","permalink":"/goose/docs/experimental/goose-mobile","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Goose Mobile","sidebar_position":3,"sidebar_label":"Goose Mobile"},"sidebar":"tutorialSidebar","previous":{"title":"Ollama Tool Shim","permalink":"/goose/docs/experimental/ollama"},"next":{"title":"Troubleshooting","permalink":"/goose/docs/troubleshooting"}}');var n=i(74848),s=i(28453);const r={title:"Goose Mobile",sidebar_position:3,sidebar_label:"Goose Mobile"},l=void 0,a={},c=[{value:"What It Does",id:"what-it-does",level:2},{value:"Installation",id:"installation",level:2},{value:"Extending Goose Mobile",id:"extending-goose-mobile",level:2},{value:"Contribute",id:"contribute",level:2}];function d(e){const o={a:"a",admonition:"admonition",h2:"h2",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"Goose Mobile is an experimental Android project inspired by the Goose application. It acts as an open agent on your phone, automating multistep tasks, responding to notifications, and even replacing your home screen for maximum efficiency."}),"\n",(0,n.jsx)(o.admonition,{title:"Experimental",type:"danger",children:(0,n.jsx)(o.p,{children:"Goose Mobile requires deep access to your device. Use at your own risk \u2014 best on a spare phone or emulator."})}),"\n",(0,n.jsx)("div",{style:{textAlign:"center"},children:(0,n.jsx)("img",{src:"https://github.com/user-attachments/assets/af9d7d83-54f4-4ace-ad66-9e19f86c8fb9",alt:"Goose Mobile Screenshot"})}),"\n",(0,n.jsx)(o.h2,{id:"what-it-does",children:"What It Does"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Automation:"})," Orchestrates tasks using your installed apps."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Notification Handling:"})," Responds to incoming notifications based on your rules."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Extensibility:"})," Leverages extensions from other apps to perform background tasks seamlessly."]}),"\n"]}),"\n",(0,n.jsx)(o.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Pre-built APK:"})," Install quickly via ",(0,n.jsx)(o.a,{href:"https://appdistribution.firebase.google.com/pub/i/3f111ea732d5f7f6",children:"Firebase distribution link"}),"."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Build from Source:"})," Developer instructions are in the ",(0,n.jsx)(o.a,{href:"https://github.com/block/goose-mobile",children:"Goose Mobile repository"}),"."]}),"\n"]}),"\n",(0,n.jsx)(o.h2,{id:"extending-goose-mobile",children:"Extending Goose Mobile"}),"\n",(0,n.jsxs)(o.p,{children:["Goose Mobile supports the ",(0,n.jsx)(o.strong,{children:"mobile MCP"})," system, which lets it use tools from other apps without leaving context \u2014 e.g., fetching weather data via a weather extension."]}),"\n",(0,n.jsxs)(o.p,{children:["Sample code and setup instructions are in the repository ",(0,n.jsx)(o.a,{href:"https://github.com/block/goose-mobile",children:"README"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"contribute",children:"Contribute"}),"\n",(0,n.jsxs)(o.p,{children:["We welcome contributions! See the ",(0,n.jsx)(o.a,{href:"https://github.com/block/goose-mobile/blob/main/CONTRIBUTING.md",children:"Contributing Guide"})," for details."]}),"\n",(0,n.jsx)(o.hr,{}),"\n",(0,n.jsxs)(o.p,{children:["For more scenarios, instructions, and development setup, visit the ",(0,n.jsx)(o.a,{href:"https://github.com/block/goose-mobile",children:"Goose Mobile repository"}),"."]})]})}function h(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},28453:(e,o,i)=>{i.d(o,{R:()=>r,x:()=>l});var t=i(96540);const n={},s=t.createContext(n);function r(e){const o=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function l(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/265f8c6c.12b3a79f.js b/assets/js/265f8c6c.12b3a79f.js new file mode 100644 index 00000000..d811191b --- /dev/null +++ b/assets/js/265f8c6c.12b3a79f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4212],{15800:(e,a,n)=>{n.r(a),n.d(a,{StarsCard:()=>u,default:()=>p});var t=n(96540),r=n(56289),s=n(43938),l=n(9303);const o=JSON.parse('{"H":[{"id":"april-2025","display":"April 2025","file":"april-2025.json"},{"id":"may-2025","display":"May 2025","file":"may-2025.json"}],"u":"may-2025"}'),d=JSON.parse('{"month":"April 2025","communityStars":[{"name":"Vinny Fiano","handle":"ynniv"},{"name":"Carine B","handle":"TBD","avatarUrl":"https://cdn.discordapp.com/avatars/1177778226957926540/186b0898f793e7292a5b385de35a19fc?size=1024"},{"name":"Best Codes","handle":"The-Best-Codes"},{"name":"comoyomalove","handle":"TBD","avatarUrl":"https://cdn.discordapp.com/avatars/552168841992732673/2d88c30d3e0fc3fda6a3815b819f4546?size=1024"},{"name":"jokellyfenton","handle":"jokellyfenton"}],"teamStars":[{"name":"Shea Craig","handle":"sheagcraig"},{"name":"Jim Bennett","handle":"jimbobbennett"},{"name":"Oliver","handle":"opdich"}],"leaderboard":[{"handle":"The-Best-Codes","rank":1,"medal":"\ud83e\udd47"},{"handle":"dbraduan","rank":2,"medal":"\ud83e\udd48"},{"handle":"sheagcraig","rank":3,"medal":"\ud83e\udd49"},{"handle":"sana-db","rank":4},{"handle":"jimbobbennett","rank":5},{"handle":"opdich","rank":6},{"handle":"rockwotj","rank":7},{"handle":"alexgleason","rank":8},{"handle":"ArtBears","rank":9},{"handle":"GlyneG","rank":10},{"handle":"DOsinga","rank":11},{"handle":"omo","rank":12},{"handle":"allisonjoycarter","rank":13},{"handle":"mpaquettePax8","rank":14},{"handle":"capttrousers","rank":15}]}'),i=JSON.parse('{"month":"May 2025","communityStars":[{"name":"GitMurf","handle":"GitMurf"},{"name":"Anil Muppalla","handle":"anilmuppalla"},{"name":"Ben Walding","handle":"bwalding"},{"name":"Gustavo Hoirisch","handle":"gugahoi"},{"name":"Antonio Cheong","handle":"acheong08"}],"teamStars":[{"name":"Oliver","handle":"opdich"},{"name":"Jack Amadeo","handle":"jamadeo"},{"name":"Shea Craig","handle":"sheagcraig"}],"leaderboard":[{"handle":"dbraduan","rank":1,"medal":"\ud83e\udd47"},{"handle":"The-Best-Codes","rank":2,"medal":"\ud83e\udd48"},{"handle":"opdich","rank":3,"medal":"\ud83e\udd49"},{"handle":"patrickReiis","rank":4},{"handle":"sheagcraig","rank":5},{"handle":"bwalding","rank":6},{"handle":"jamadeo","rank":7},{"handle":"rockwotj","rank":8},{"handle":"danielzayas","rank":9},{"handle":"svenstaro","rank":10},{"handle":"adaug","rank":11},{"handle":"loganmoseley","rank":12},{"handle":"tiborvass","rank":13},{"handle":"xuv","rank":14},{"handle":"anilmuppalla","rank":15},{"handle":"spencrmartin","rank":16},{"handle":"gknoblauch","rank":17},{"handle":"acheong08","rank":18},{"handle":"faces-of-eth","rank":19},{"handle":"wesbillman","rank":20}]}');var c=n(74848);const h={"april-2025":d,"may-2025":i};function m(){return(0,c.jsxs)("section",{className:"w-full flex flex-col items-center gap-8 my-8",children:[(0,c.jsxs)("div",{className:"text-center",children:[(0,c.jsx)(l.A,{as:"h1",children:"Upcoming Events"}),(0,c.jsx)("p",{children:"Join us for livestreams, workshops, and discussions about goose and open source projects."})]}),(0,c.jsx)("iframe",{src:"https://calget.com/c/t7jszrie",className:"w-full h-[600px] border-0 rounded-lg",title:"Goose Community Calendar"}),(0,c.jsxs)("p",{className:"italic text-textStandard",children:["Want to join us on a livestream or have ideas for future events? Reach out to the team on ",(0,c.jsx)(r.A,{href:"https://discord.gg/block-opensource",children:"Discord"}),"."]})]})}function x(){const[e,a]=t.useState(o.u),[n,s]=t.useState(!0),d=h[e];return(0,c.jsxs)("section",{className:"w-full flex flex-col items-center gap-8 my-8",children:[(0,c.jsxs)("div",{className:"text-center",children:[(0,c.jsx)(l.A,{as:"h1",children:"Community All Stars"}),(0,c.jsx)("p",{children:"Every month, we take a moment and celebrate the open source community. Here are the top contributors and community champions!"})]}),(0,c.jsx)("div",{className:"flex justify-center gap-2 flex-wrap",children:o.H.map((n=>(0,c.jsxs)("button",{className:"button button--primary",onClick:()=>a(n.id),style:e===n.id?{border:"3px solid var(--ifm-color-primary-dark)",boxShadow:"0 2px 8px rgba(0,0,0,0.15)"}:{},children:[e===n.id?"\ud83d\udcc5 ":"",n.display]},n.id)))}),(0,c.jsxs)("div",{className:"text-center",children:[(0,c.jsx)(l.A,{as:"h3",children:"\u2b50 Community Stars"}),(0,c.jsx)("p",{className:"text-sm text-textStandard",children:"Top 5 Contributors from the open source community!"})]}),(0,c.jsx)("div",{className:"flex justify-center",children:d.communityStars.map(((e,a)=>(0,c.jsx)(u,{contributor:e},a)))}),(0,c.jsxs)("div",{className:"text-center",children:[(0,c.jsx)(l.A,{as:"h3",children:"\u2b50 Team Stars"}),(0,c.jsx)("p",{className:"text-sm text-textStandard",children:"Top 5 Contributors from all Block teams!"})]}),(0,c.jsx)("div",{className:"flex justify-center",children:d.teamStars.map(((e,a)=>(0,c.jsx)(u,{contributor:{...e,totalCount:d.teamStars.length}},a)))}),(0,c.jsxs)("div",{className:"text-center",children:[(0,c.jsx)(l.A,{as:"h3",children:"\ud83c\udfc6 Monthly Leaderboard"}),(0,c.jsx)("p",{className:"text-sm text-textStandard",children:"Rankings of all goose contributors getting loose this month!"})]}),(0,c.jsxs)("div",{className:"card w-full max-w-xl p-5 relative",children:[(0,c.jsx)("div",{className:"flex flex-col gap-2 text-sm max-h-[550px] overflow-y-auto pr-2",onScroll:e=>{const{scrollTop:a,scrollHeight:n,clientHeight:t}=e.target;s(!(a+t>=n-10))},children:d.leaderboard.map(((e,a)=>{const n=a<3,t=0===a?"bg-yellow-400":1===a?"bg-gray-300":2===a?"bg-yellow-600":null;return(0,c.jsxs)("div",{className:"flex items-center p-3 rounded-lg font-medium cursor-pointer transition-all duration-200 hover:-translate-y-0.5 "+(n?`${t} font-bold shadow-md hover:shadow-lg`:"bg-bgSubtle border border-borderStandard hover:bg-bgApp hover:shadow-md"),children:[e.medal&&(0,c.jsx)("span",{className:"mr-3 text-lg",children:e.medal}),(0,c.jsxs)("span",{className:"mr-3 min-w-[30px] "+(n?"text-base text-black":"text-sm"),children:[e.rank,"."]}),"TBD"!==e.handle?(0,c.jsxs)(r.A,{href:`https://github.com/${e.handle}`,className:""+(n?"text-black text-base":"text-inherit text-sm"),children:["@",e.handle]}):(0,c.jsx)("span",{className:"text-textSubtle italic",children:"@TBD"})]},a)}))}),n&&(0,c.jsx)("div",{className:"absolute bottom-5 inset-x-0 flex justify-center",children:(0,c.jsx)("span",{className:"w-fit text-xs bg-bgProminent p-2 rounded-full font-medium pointer-events-none flex items-center gap-1.5",children:"Scroll for more \u2193"})})]}),(0,c.jsx)("div",{className:"text-center",children:(0,c.jsx)("p",{children:"Thank you all for contributing! \u2764\ufe0f"})}),(0,c.jsx)("div",{className:"text-center",children:(0,c.jsx)(l.A,{as:"h2",children:"Want to be featured?"})}),(0,c.jsxs)("div",{className:"card max-w-xl",children:[(0,c.jsx)("div",{className:"card__header text-center",children:(0,c.jsx)("div",{className:"avatar avatar--vertical",children:(0,c.jsx)("div",{className:"w-16 h-16 rounded-full bg-blue-400 flex items-center justify-center text-2xl text-blue-500",children:"\u2b50"})})}),(0,c.jsxs)("div",{className:"card__body text--center",children:[(0,c.jsxs)("div",{className:"mb-4",children:[(0,c.jsx)("strong",{children:"Your Name Here"}),(0,c.jsx)("br",{}),(0,c.jsx)("small",{children:"Future Community Star"})]}),(0,c.jsxs)("div",{className:"text-sm",children:["Want to be a Community All Star? Just start contributing on"," ",(0,c.jsx)(r.A,{href:"https://github.com/block/goose",children:"GitHub"}),", helping others on"," ",(0,c.jsx)(r.A,{href:"https://discord.gg/block-opensource",children:"Discord"}),", or share your goose projects with the community! You can check out the"," ",(0,c.jsx)(r.A,{href:"https://github.com/block/goose/blob/main/CONTRIBUTING.md",children:"contributing guide"})," ","for more tips."]})]})]})]})}function u(e){let{contributor:a}=e;return(0,c.jsx)("div",{className:`col ${a.totalCount<=3?"col--4":"col--2"} mb-8`,children:(0,c.jsxs)("div",{className:"h-full border-2 border-borderSubtle rounded-2xl cursor-pointer hover:shadow-xl hover:border-[var(--ifm-color-primary-dark)]",children:[(0,c.jsx)("div",{className:"card__header text-center",children:(0,c.jsx)("div",{className:"avatar avatar--vertical",children:a.avatarUrl?(0,c.jsx)("img",{className:"avatar__photo avatar__photo--lg",src:a.avatarUrl,alt:a.name}):"TBD"!==a.handle?(0,c.jsx)("img",{className:"avatar__photo avatar__photo--lg",src:`https://github.com/${a.handle}.png`,alt:a.name}):(0,c.jsx)("div",{className:"w-16 h-16 rounded-full bg-gray-200 flex items-center justify-center text-xl text-textSubtle",children:"?"})})}),(0,c.jsx)("div",{className:"card__body text-center",children:(0,c.jsx)("div",{className:"mb-2",children:(0,c.jsx)("strong",{children:"TBD"!==a.handle?(0,c.jsxs)(r.A,{href:`https://github.com/${a.handle}`,children:[a.name," (@",a.handle,")"]}):`${a.name}`})})})]})})}function p(){return(0,c.jsx)(s.A,{title:"Community",description:"Join the Goose community - connect with developers, contribute to the project, and help shape the future of AI-powered development tools.",children:(0,c.jsxs)("main",{className:"container",children:[(0,c.jsx)(m,{}),(0,c.jsx)(x,{})]})})}}}]); \ No newline at end of file diff --git a/assets/js/26c5ad2c.4fb473b4.js b/assets/js/26c5ad2c.4fb473b4.js new file mode 100644 index 00000000..abc73d14 --- /dev/null +++ b/assets/js/26c5ad2c.4fb473b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2657],{38861:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var o=s(50971),n=s(74848),a=s(28453);const r={title:"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)",description:"Forget the flashy demos. Here's everyday use cases for AI.",authors:["angie"]},i=void 0,c={authorsImageUrls:[void 0]},d=[];function l(e){const t={a:"a",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"blog cover",src:s(45503).A+"",width:"1200",height:"630"})}),"\n",(0,n.jsx)(t.p,{children:"Whenever people talk about AI, they highlight the flashiest use cases like fully coded apps built by agents or cinematic video generation. Those things are certainly cool, but most days I'm just delegating mundane tasks to the bots."}),"\n",(0,n.jsx)(t.p,{children:"Today, I didn't build an app. I didn't write a screenplay. I just got stuff done."}),"\n",(0,n.jsxs)(t.p,{children:["Here are 5 real, everyday tasks I gave to my AI agent, ",(0,n.jsx)(t.a,{href:"/",children:"Goose"}),", that saved me hours. None of them took more than one minute from prompt to result."]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},45503:(e,t,s)=>{s.d(t,{A:()=>o});const o=s.p+"assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png"},28453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>i});var o=s(96540);const n={},a=o.createContext(n);function r(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(a.Provider,{value:t},e.children)}},50971:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/06/27/everyday-usecases-ai","source":"@site/blog/2025-06-27-everyday-usecases-ai/index.md","title":"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)","description":"Forget the flashy demos. Here\'s everyday use cases for AI.","date":"2025-06-27T00:00:00.000Z","tags":[],"readingTime":3.445,"hasTruncateMarker":true,"authors":[{"name":"Angie Jones","title":"Head of Developer Relations","url":"https://angiejones.tech","page":{"permalink":"/goose/blog/authors/angie"},"socials":{"linkedin":"https://www.linkedin.com/in/angiejones/","github":"https://github.com/angiejones","x":"https://x.com/techgirl1908","bluesky":"https://bsky.app/profile/angiejones.tech"},"imageURL":"https://avatars.githubusercontent.com/u/15972783?v=4","key":"angie"}],"frontMatter":{"title":"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)","description":"Forget the flashy demos. Here\'s everyday use cases for AI.","authors":["angie"]},"unlisted":false,"nextItem":{"title":"Isolated Dev Environments in Goose with container-use","permalink":"/goose/blog/2025/06/19/isolated-development-environments"}}')}}]); \ No newline at end of file diff --git a/assets/js/275.40cb497e.js b/assets/js/275.40cb497e.js new file mode 100644 index 00000000..adf51b57 --- /dev/null +++ b/assets/js/275.40cb497e.js @@ -0,0 +1,2 @@ +/*! For license information please see 275.40cb497e.js.LICENSE.txt */ +(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[275],{92849:e=>{"use strict";var n=Object.prototype.hasOwnProperty,t=Object.prototype.toString,r=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=function(e){return"function"==typeof Array.isArray?Array.isArray(e):"[object Array]"===t.call(e)},l=function(e){if(!e||"[object Object]"!==t.call(e))return!1;var r,o=n.call(e,"constructor"),i=e.constructor&&e.constructor.prototype&&n.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!o&&!i)return!1;for(r in e);return void 0===r||n.call(e,r)},s=function(e,n){r&&"__proto__"===n.name?r(e,n.name,{enumerable:!0,configurable:!0,value:n.newValue,writable:!0}):e[n.name]=n.newValue},a=function(e,t){if("__proto__"===t){if(!n.call(e,t))return;if(o)return o(e,t).value}return e[t]};e.exports=function e(){var n,t,r,o,u,c,f=arguments[0],p=1,d=arguments.length,h=!1;for("boolean"==typeof f&&(h=f,f=arguments[1]||{},p=2),(null==f||"object"!=typeof f&&"function"!=typeof f)&&(f={});p{var n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,r=/^\s*/,o=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,l=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,s=/^[;\s]*/,a=/^\s+|\s+$/g,u="";function c(e){return e?e.replace(a,u):u}e.exports=function(e,a){if("string"!=typeof e)throw new TypeError("First argument must be a string");if(!e)return[];a=a||{};var f=1,p=1;function d(e){var n=e.match(t);n&&(f+=n.length);var r=e.lastIndexOf("\n");p=~r?e.length-r:p+e.length}function h(){var e={line:f,column:p};return function(n){return n.position=new m(e),v(),n}}function m(e){this.start=e,this.end={line:f,column:p},this.source=a.source}m.prototype.content=e;var g=[];function y(n){var t=new Error(a.source+":"+f+":"+p+": "+n);if(t.reason=n,t.filename=a.source,t.line=f,t.column=p,t.source=e,!a.silent)throw t;g.push(t)}function x(n){var t=n.exec(e);if(t){var r=t[0];return d(r),e=e.slice(r.length),t}}function v(){x(r)}function k(e){var n;for(e=e||[];n=b();)!1!==n&&e.push(n);return e}function b(){var n=h();if("/"==e.charAt(0)&&"*"==e.charAt(1)){for(var t=2;u!=e.charAt(t)&&("*"!=e.charAt(t)||"/"!=e.charAt(t+1));)++t;if(t+=2,u===e.charAt(t-1))return y("End of comment missing");var r=e.slice(2,t-2);return p+=2,d(r),e=e.slice(t),p+=2,n({type:"comment",comment:r})}}function w(){var e=h(),t=x(o);if(t){if(b(),!x(i))return y("property missing ':'");var r=x(l),a=e({type:"declaration",property:c(t[0].replace(n,u)),value:r?c(r[0].replace(n,u)):u});return x(s),a}}return v(),function(){var e,n=[];for(k(n);e=w();)!1!==e&&(n.push(e),k(n));return n}()}},51133:function(e,n,t){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e,n){var t=null;if(!e||"string"!=typeof e)return t;var r=(0,o.default)(e),i="function"==typeof n;return r.forEach((function(e){if("declaration"===e.type){var r=e.property,o=e.value;i?n(r,o,e):o&&((t=t||{})[r]=o)}})),t};var o=r(t(19788))},16445:(e,n,t)=>{"use strict";t.d(n,{A:()=>r});const r=(0,t(75395).A)("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]])},54655:(e,n,t)=>{"use strict";t.d(n,{oz:()=>Vr});var r={};t.r(r),t.d(r,{boolean:()=>g,booleanish:()=>y,commaOrSpaceSeparated:()=>w,commaSeparated:()=>b,number:()=>v,overloadedBoolean:()=>x,spaceSeparated:()=>k});var o={};t.r(o),t.d(o,{attentionMarkers:()=>mt,contentInitial:()=>ut,disable:()=>gt,document:()=>at,flow:()=>ft,flowInitial:()=>ct,insideSpan:()=>ht,string:()=>pt,text:()=>dt});const i=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,l=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,s={};function a(e,n){return((n||s).jsx?l:i).test(e)}const u=/[ \t\n\f\r]/g;function c(e){return""===e.replace(u,"")}class f{constructor(e,n,t){this.property=e,this.normal=n,t&&(this.space=t)}}function p(e,n){const t={},r={};let o=-1;for(;++o"xlink:"+n.slice(5).toLowerCase(),properties:{xLinkActuate:null,xLinkArcRole:null,xLinkHref:null,xLinkRole:null,xLinkShow:null,xLinkTitle:null,xLinkType:null}}),z=A({space:"xml",transform:(e,n)=>"xml:"+n.slice(3).toLowerCase(),properties:{xmlLang:null,xmlBase:null,xmlSpace:null}});function D(e,n){return n in e?e[n]:n}function L(e,n){return D(e,n.toLowerCase())}const O=A({space:"xmlns",attributes:{xmlnsxlink:"xmlns:xlink"},transform:L,properties:{xmlns:null,xmlnsXLink:null}}),F=A({transform:(e,n)=>"role"===n?n:"aria-"+n.slice(4).toLowerCase(),properties:{ariaActiveDescendant:null,ariaAtomic:y,ariaAutoComplete:null,ariaBusy:y,ariaChecked:y,ariaColCount:v,ariaColIndex:v,ariaColSpan:v,ariaControls:k,ariaCurrent:null,ariaDescribedBy:k,ariaDetails:null,ariaDisabled:y,ariaDropEffect:k,ariaErrorMessage:null,ariaExpanded:y,ariaFlowTo:k,ariaGrabbed:y,ariaHasPopup:null,ariaHidden:y,ariaInvalid:null,ariaKeyShortcuts:null,ariaLabel:null,ariaLabelledBy:k,ariaLevel:v,ariaLive:null,ariaModal:y,ariaMultiLine:y,ariaMultiSelectable:y,ariaOrientation:null,ariaOwns:k,ariaPlaceholder:null,ariaPosInSet:v,ariaPressed:y,ariaReadOnly:y,ariaRelevant:null,ariaRequired:y,ariaRoleDescription:k,ariaRowCount:v,ariaRowIndex:v,ariaRowSpan:v,ariaSelected:y,ariaSetSize:v,ariaSort:null,ariaValueMax:v,ariaValueMin:v,ariaValueNow:v,ariaValueText:null,role:null}}),N=A({space:"html",attributes:{acceptcharset:"accept-charset",classname:"class",htmlfor:"for",httpequiv:"http-equiv"},transform:L,mustUseProperty:["checked","multiple","muted","selected"],properties:{abbr:null,accept:b,acceptCharset:k,accessKey:k,action:null,allow:null,allowFullScreen:g,allowPaymentRequest:g,allowUserMedia:g,alt:null,as:null,async:g,autoCapitalize:null,autoComplete:k,autoFocus:g,autoPlay:g,blocking:k,capture:null,charSet:null,checked:g,cite:null,className:k,cols:v,colSpan:null,content:null,contentEditable:y,controls:g,controlsList:k,coords:v|b,crossOrigin:null,data:null,dateTime:null,decoding:null,default:g,defer:g,dir:null,dirName:null,disabled:g,download:x,draggable:y,encType:null,enterKeyHint:null,fetchPriority:null,form:null,formAction:null,formEncType:null,formMethod:null,formNoValidate:g,formTarget:null,headers:k,height:v,hidden:g,high:v,href:null,hrefLang:null,htmlFor:k,httpEquiv:k,id:null,imageSizes:null,imageSrcSet:null,inert:g,inputMode:null,integrity:null,is:null,isMap:g,itemId:null,itemProp:k,itemRef:k,itemScope:g,itemType:k,kind:null,label:null,lang:null,language:null,list:null,loading:null,loop:g,low:v,manifest:null,max:null,maxLength:v,media:null,method:null,min:null,minLength:v,multiple:g,muted:g,name:null,nonce:null,noModule:g,noValidate:g,onAbort:null,onAfterPrint:null,onAuxClick:null,onBeforeMatch:null,onBeforePrint:null,onBeforeToggle:null,onBeforeUnload:null,onBlur:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onContextLost:null,onContextMenu:null,onContextRestored:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnded:null,onError:null,onFocus:null,onFormData:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLanguageChange:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadEnd:null,onLoadStart:null,onMessage:null,onMessageError:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRejectionHandled:null,onReset:null,onResize:null,onScroll:null,onScrollEnd:null,onSecurityPolicyViolation:null,onSeeked:null,onSeeking:null,onSelect:null,onSlotChange:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnhandledRejection:null,onUnload:null,onVolumeChange:null,onWaiting:null,onWheel:null,open:g,optimum:v,pattern:null,ping:k,placeholder:null,playsInline:g,popover:null,popoverTarget:null,popoverTargetAction:null,poster:null,preload:null,readOnly:g,referrerPolicy:null,rel:k,required:g,reversed:g,rows:v,rowSpan:v,sandbox:k,scope:null,scoped:g,seamless:g,selected:g,shadowRootClonable:g,shadowRootDelegatesFocus:g,shadowRootMode:null,shape:null,size:v,sizes:null,slot:null,span:v,spellCheck:y,src:null,srcDoc:null,srcLang:null,srcSet:null,start:v,step:null,style:null,tabIndex:v,target:null,title:null,translate:null,type:null,typeMustMatch:g,useMap:null,value:y,width:v,wrap:null,writingSuggestions:null,align:null,aLink:null,archive:k,axis:null,background:null,bgColor:null,border:v,borderColor:null,bottomMargin:v,cellPadding:null,cellSpacing:null,char:null,charOff:null,classId:null,clear:null,code:null,codeBase:null,codeType:null,color:null,compact:g,declare:g,event:null,face:null,frame:null,frameBorder:null,hSpace:v,leftMargin:v,link:null,longDesc:null,lowSrc:null,marginHeight:v,marginWidth:v,noResize:g,noHref:g,noShade:g,noWrap:g,object:null,profile:null,prompt:null,rev:null,rightMargin:v,rules:null,scheme:null,scrolling:y,standby:null,summary:null,text:null,topMargin:v,valueType:null,version:null,vAlign:null,vLink:null,vSpace:v,allowTransparency:null,autoCorrect:null,autoSave:null,disablePictureInPicture:g,disableRemotePlayback:g,prefix:null,property:null,results:v,security:null,unselectable:null}}),M=A({space:"svg",attributes:{accentHeight:"accent-height",alignmentBaseline:"alignment-baseline",arabicForm:"arabic-form",baselineShift:"baseline-shift",capHeight:"cap-height",className:"class",clipPath:"clip-path",clipRule:"clip-rule",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorProfile:"color-profile",colorRendering:"color-rendering",crossOrigin:"crossorigin",dataType:"datatype",dominantBaseline:"dominant-baseline",enableBackground:"enable-background",fillOpacity:"fill-opacity",fillRule:"fill-rule",floodColor:"flood-color",floodOpacity:"flood-opacity",fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",glyphName:"glyph-name",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",hrefLang:"hreflang",horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",horizOriginY:"horiz-origin-y",imageRendering:"image-rendering",letterSpacing:"letter-spacing",lightingColor:"lighting-color",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",navDown:"nav-down",navDownLeft:"nav-down-left",navDownRight:"nav-down-right",navLeft:"nav-left",navNext:"nav-next",navPrev:"nav-prev",navRight:"nav-right",navUp:"nav-up",navUpLeft:"nav-up-left",navUpRight:"nav-up-right",onAbort:"onabort",onActivate:"onactivate",onAfterPrint:"onafterprint",onBeforePrint:"onbeforeprint",onBegin:"onbegin",onCancel:"oncancel",onCanPlay:"oncanplay",onCanPlayThrough:"oncanplaythrough",onChange:"onchange",onClick:"onclick",onClose:"onclose",onCopy:"oncopy",onCueChange:"oncuechange",onCut:"oncut",onDblClick:"ondblclick",onDrag:"ondrag",onDragEnd:"ondragend",onDragEnter:"ondragenter",onDragExit:"ondragexit",onDragLeave:"ondragleave",onDragOver:"ondragover",onDragStart:"ondragstart",onDrop:"ondrop",onDurationChange:"ondurationchange",onEmptied:"onemptied",onEnd:"onend",onEnded:"onended",onError:"onerror",onFocus:"onfocus",onFocusIn:"onfocusin",onFocusOut:"onfocusout",onHashChange:"onhashchange",onInput:"oninput",onInvalid:"oninvalid",onKeyDown:"onkeydown",onKeyPress:"onkeypress",onKeyUp:"onkeyup",onLoad:"onload",onLoadedData:"onloadeddata",onLoadedMetadata:"onloadedmetadata",onLoadStart:"onloadstart",onMessage:"onmessage",onMouseDown:"onmousedown",onMouseEnter:"onmouseenter",onMouseLeave:"onmouseleave",onMouseMove:"onmousemove",onMouseOut:"onmouseout",onMouseOver:"onmouseover",onMouseUp:"onmouseup",onMouseWheel:"onmousewheel",onOffline:"onoffline",onOnline:"ononline",onPageHide:"onpagehide",onPageShow:"onpageshow",onPaste:"onpaste",onPause:"onpause",onPlay:"onplay",onPlaying:"onplaying",onPopState:"onpopstate",onProgress:"onprogress",onRateChange:"onratechange",onRepeat:"onrepeat",onReset:"onreset",onResize:"onresize",onScroll:"onscroll",onSeeked:"onseeked",onSeeking:"onseeking",onSelect:"onselect",onShow:"onshow",onStalled:"onstalled",onStorage:"onstorage",onSubmit:"onsubmit",onSuspend:"onsuspend",onTimeUpdate:"ontimeupdate",onToggle:"ontoggle",onUnload:"onunload",onVolumeChange:"onvolumechange",onWaiting:"onwaiting",onZoom:"onzoom",overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pointerEvents:"pointer-events",referrerPolicy:"referrerpolicy",renderingIntent:"rendering-intent",shapeRendering:"shape-rendering",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",strokeDashArray:"stroke-dasharray",strokeDashOffset:"stroke-dashoffset",strokeLineCap:"stroke-linecap",strokeLineJoin:"stroke-linejoin",strokeMiterLimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",tabIndex:"tabindex",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",transformOrigin:"transform-origin",typeOf:"typeof",underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",vectorEffect:"vector-effect",vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",wordSpacing:"word-spacing",writingMode:"writing-mode",xHeight:"x-height",playbackOrder:"playbackorder",timelineBegin:"timelinebegin"},transform:D,properties:{about:w,accentHeight:v,accumulate:null,additive:null,alignmentBaseline:null,alphabetic:v,amplitude:v,arabicForm:null,ascent:v,attributeName:null,attributeType:null,azimuth:v,bandwidth:null,baselineShift:null,baseFrequency:null,baseProfile:null,bbox:null,begin:null,bias:v,by:null,calcMode:null,capHeight:v,className:k,clip:null,clipPath:null,clipPathUnits:null,clipRule:null,color:null,colorInterpolation:null,colorInterpolationFilters:null,colorProfile:null,colorRendering:null,content:null,contentScriptType:null,contentStyleType:null,crossOrigin:null,cursor:null,cx:null,cy:null,d:null,dataType:null,defaultAction:null,descent:v,diffuseConstant:v,direction:null,display:null,dur:null,divisor:v,dominantBaseline:null,download:g,dx:null,dy:null,edgeMode:null,editable:null,elevation:v,enableBackground:null,end:null,event:null,exponent:v,externalResourcesRequired:null,fill:null,fillOpacity:v,fillRule:null,filter:null,filterRes:null,filterUnits:null,floodColor:null,floodOpacity:null,focusable:null,focusHighlight:null,fontFamily:null,fontSize:null,fontSizeAdjust:null,fontStretch:null,fontStyle:null,fontVariant:null,fontWeight:null,format:null,fr:null,from:null,fx:null,fy:null,g1:b,g2:b,glyphName:b,glyphOrientationHorizontal:null,glyphOrientationVertical:null,glyphRef:null,gradientTransform:null,gradientUnits:null,handler:null,hanging:v,hatchContentUnits:null,hatchUnits:null,height:null,href:null,hrefLang:null,horizAdvX:v,horizOriginX:v,horizOriginY:v,id:null,ideographic:v,imageRendering:null,initialVisibility:null,in:null,in2:null,intercept:v,k:v,k1:v,k2:v,k3:v,k4:v,kernelMatrix:w,kernelUnitLength:null,keyPoints:null,keySplines:null,keyTimes:null,kerning:null,lang:null,lengthAdjust:null,letterSpacing:null,lightingColor:null,limitingConeAngle:v,local:null,markerEnd:null,markerMid:null,markerStart:null,markerHeight:null,markerUnits:null,markerWidth:null,mask:null,maskContentUnits:null,maskUnits:null,mathematical:null,max:null,media:null,mediaCharacterEncoding:null,mediaContentEncodings:null,mediaSize:v,mediaTime:null,method:null,min:null,mode:null,name:null,navDown:null,navDownLeft:null,navDownRight:null,navLeft:null,navNext:null,navPrev:null,navRight:null,navUp:null,navUpLeft:null,navUpRight:null,numOctaves:null,observer:null,offset:null,onAbort:null,onActivate:null,onAfterPrint:null,onBeforePrint:null,onBegin:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnd:null,onEnded:null,onError:null,onFocus:null,onFocusIn:null,onFocusOut:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadStart:null,onMessage:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onMouseWheel:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRepeat:null,onReset:null,onResize:null,onScroll:null,onSeeked:null,onSeeking:null,onSelect:null,onShow:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnload:null,onVolumeChange:null,onWaiting:null,onZoom:null,opacity:null,operator:null,order:null,orient:null,orientation:null,origin:null,overflow:null,overlay:null,overlinePosition:v,overlineThickness:v,paintOrder:null,panose1:null,path:null,pathLength:v,patternContentUnits:null,patternTransform:null,patternUnits:null,phase:null,ping:k,pitch:null,playbackOrder:null,pointerEvents:null,points:null,pointsAtX:v,pointsAtY:v,pointsAtZ:v,preserveAlpha:null,preserveAspectRatio:null,primitiveUnits:null,propagate:null,property:w,r:null,radius:null,referrerPolicy:null,refX:null,refY:null,rel:w,rev:w,renderingIntent:null,repeatCount:null,repeatDur:null,requiredExtensions:w,requiredFeatures:w,requiredFonts:w,requiredFormats:w,resource:null,restart:null,result:null,rotate:null,rx:null,ry:null,scale:null,seed:null,shapeRendering:null,side:null,slope:null,snapshotTime:null,specularConstant:v,specularExponent:v,spreadMethod:null,spacing:null,startOffset:null,stdDeviation:null,stemh:null,stemv:null,stitchTiles:null,stopColor:null,stopOpacity:null,strikethroughPosition:v,strikethroughThickness:v,string:null,stroke:null,strokeDashArray:w,strokeDashOffset:null,strokeLineCap:null,strokeLineJoin:null,strokeMiterLimit:v,strokeOpacity:v,strokeWidth:null,style:null,surfaceScale:v,syncBehavior:null,syncBehaviorDefault:null,syncMaster:null,syncTolerance:null,syncToleranceDefault:null,systemLanguage:w,tabIndex:v,tableValues:null,target:null,targetX:v,targetY:v,textAnchor:null,textDecoration:null,textRendering:null,textLength:null,timelineBegin:null,title:null,transformBehavior:null,type:null,typeOf:w,to:null,transform:null,transformOrigin:null,u1:null,u2:null,underlinePosition:v,underlineThickness:v,unicode:null,unicodeBidi:null,unicodeRange:null,unitsPerEm:v,values:null,vAlphabetic:v,vMathematical:v,vectorEffect:null,vHanging:v,vIdeographic:v,version:null,vertAdvY:v,vertOriginX:v,vertOriginY:v,viewBox:null,viewTarget:null,visibility:null,width:null,widths:null,wordSpacing:null,writingMode:null,x:null,x1:null,x2:null,xChannelSelector:null,xHeight:v,y:null,y1:null,y2:null,yChannelSelector:null,z:null,zoomAndPan:null}}),R=p([z,T,O,F,N],"html"),_=p([z,T,O,F,M],"svg"),B=/^data[-\w.:]+$/i,j=/-[a-z]/g,H=/[A-Z]/g;function U(e){return"-"+e.toLowerCase()}function V(e){return e.charAt(1).toUpperCase()}const q={classId:"classID",dataType:"datatype",itemId:"itemID",strokeDashArray:"strokeDasharray",strokeDashOffset:"strokeDashoffset",strokeLineCap:"strokeLinecap",strokeLineJoin:"strokeLinejoin",strokeMiterLimit:"strokeMiterlimit",typeOf:"typeof",xLinkActuate:"xlinkActuate",xLinkArcRole:"xlinkArcrole",xLinkHref:"xlinkHref",xLinkRole:"xlinkRole",xLinkShow:"xlinkShow",xLinkTitle:"xlinkTitle",xLinkType:"xlinkType",xmlnsXLink:"xmlnsXlink"};var Z=t(51133);const Y=Z.default||Z,W=Q("end"),K=Q("start");function Q(e){return function(n){const t=n&&n.position&&n.position[e]||{};if("number"==typeof t.line&&t.line>0&&"number"==typeof t.column&&t.column>0)return{line:t.line,column:t.column,offset:"number"==typeof t.offset&&t.offset>-1?t.offset:void 0}}}function X(e){return e&&"object"==typeof e?"position"in e||"type"in e?J(e.position):"start"in e||"end"in e?J(e):"line"in e||"column"in e?$(e):"":""}function $(e){return G(e&&e.line)+":"+G(e&&e.column)}function J(e){return $(e&&e.start)+"-"+$(e&&e.end)}function G(e){return e&&"number"==typeof e?e:1}class ee extends Error{constructor(e,n,t){super(),"string"==typeof n&&(t=n,n=void 0);let r="",o={},i=!1;if(n&&(o="line"in n&&"column"in n||"start"in n&&"end"in n?{place:n}:"type"in n?{ancestors:[n],place:n.position}:{...n}),"string"==typeof e?r=e:!o.cause&&e&&(i=!0,r=e.message,o.cause=e),!o.ruleId&&!o.source&&"string"==typeof t){const e=t.indexOf(":");-1===e?o.ruleId=t:(o.source=t.slice(0,e),o.ruleId=t.slice(e+1))}if(!o.place&&o.ancestors&&o.ancestors){const e=o.ancestors[o.ancestors.length-1];e&&(o.place=e.position)}const l=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=l?l.column:void 0,this.fatal=void 0,this.file,this.message=r,this.line=l?l.line:void 0,this.name=X(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=i&&o.cause&&"string"==typeof o.cause.stack?o.cause.stack:"",this.actual,this.expected,this.note,this.url}}ee.prototype.file="",ee.prototype.name="",ee.prototype.reason="",ee.prototype.message="",ee.prototype.stack="",ee.prototype.column=void 0,ee.prototype.line=void 0,ee.prototype.ancestors=void 0,ee.prototype.cause=void 0,ee.prototype.fatal=void 0,ee.prototype.place=void 0,ee.prototype.ruleId=void 0,ee.prototype.source=void 0;const ne={}.hasOwnProperty,te=new Map,re=/[A-Z]/g,oe=/-([a-z])/g,ie=new Set(["table","tbody","thead","tfoot","tr"]),le=new Set(["td","th"]),se="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function ae(e,n){if(!n||void 0===n.Fragment)throw new TypeError("Expected `Fragment` in options");const t=n.filePath||void 0;let r;if(n.development){if("function"!=typeof n.jsxDEV)throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=function(e,n){return t;function t(t,r,o,i){const l=Array.isArray(o.children),s=K(t);return n(r,o,i,l,{columnNumber:s?s.column-1:void 0,fileName:e,lineNumber:s?s.line:void 0},void 0)}}(t,n.jsxDEV)}else{if("function"!=typeof n.jsx)throw new TypeError("Expected `jsx` in production options");if("function"!=typeof n.jsxs)throw new TypeError("Expected `jsxs` in production options");r=function(e,n,t){return r;function r(e,r,o,i){const l=Array.isArray(o.children)?t:n;return i?l(r,o,i):l(r,o)}}(0,n.jsx,n.jsxs)}const o={Fragment:n.Fragment,ancestors:[],components:n.components||{},create:r,elementAttributeNameCase:n.elementAttributeNameCase||"react",evaluater:n.createEvaluater?n.createEvaluater():void 0,filePath:t,ignoreInvalidStyle:n.ignoreInvalidStyle||!1,passKeys:!1!==n.passKeys,passNode:n.passNode||!1,schema:"svg"===n.space?_:R,stylePropertyNameCase:n.stylePropertyNameCase||"dom",tableCellAlignToStyle:!1!==n.tableCellAlignToStyle},i=ue(o,e,void 0);return i&&"string"!=typeof i?i:o.create(e,o.Fragment,{children:i||void 0},void 0)}function ue(e,n,t){return"element"===n.type?function(e,n,t){const r=e.schema;let o=r;"svg"===n.tagName.toLowerCase()&&"html"===r.space&&(o=_,e.schema=o);e.ancestors.push(n);const i=he(e,n.tagName,!1),l=function(e,n){const t={};let r,o;for(o in n.properties)if("children"!==o&&ne.call(n.properties,o)){const i=de(e,o,n.properties[o]);if(i){const[o,l]=i;e.tableCellAlignToStyle&&"align"===o&&"string"==typeof l&&le.has(n.tagName)?r=l:t[o]=l}}if(r){(t.style||(t.style={}))["css"===e.stylePropertyNameCase?"text-align":"textAlign"]=r}return t}(e,n);let s=pe(e,n);ie.has(n.tagName)&&(s=s.filter((function(e){return"string"!=typeof e||!("object"==typeof(n=e)?"text"===n.type&&c(n.value):c(n));var n})));return ce(e,l,i,n),fe(l,s),e.ancestors.pop(),e.schema=r,e.create(n,i,l,t)}(e,n,t):"mdxFlowExpression"===n.type||"mdxTextExpression"===n.type?function(e,n){if(n.data&&n.data.estree&&e.evaluater){const t=n.data.estree.body[0];return t.type,e.evaluater.evaluateExpression(t.expression)}me(e,n.position)}(e,n):"mdxJsxFlowElement"===n.type||"mdxJsxTextElement"===n.type?function(e,n,t){const r=e.schema;let o=r;"svg"===n.name&&"html"===r.space&&(o=_,e.schema=o);e.ancestors.push(n);const i=null===n.name?e.Fragment:he(e,n.name,!0),l=function(e,n){const t={};for(const r of n.attributes)if("mdxJsxExpressionAttribute"===r.type)if(r.data&&r.data.estree&&e.evaluater){const n=r.data.estree.body[0];n.type;const o=n.expression;o.type;const i=o.properties[0];i.type,Object.assign(t,e.evaluater.evaluateExpression(i.argument))}else me(e,n.position);else{const o=r.name;let i;if(r.value&&"object"==typeof r.value)if(r.value.data&&r.value.data.estree&&e.evaluater){const n=r.value.data.estree.body[0];n.type,i=e.evaluater.evaluateExpression(n.expression)}else me(e,n.position);else i=null===r.value||r.value;t[o]=i}return t}(e,n),s=pe(e,n);return ce(e,l,i,n),fe(l,s),e.ancestors.pop(),e.schema=r,e.create(n,i,l,t)}(e,n,t):"mdxjsEsm"===n.type?function(e,n){if(n.data&&n.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(n.data.estree);me(e,n.position)}(e,n):"root"===n.type?function(e,n,t){const r={};return fe(r,pe(e,n)),e.create(n,e.Fragment,r,t)}(e,n,t):"text"===n.type?function(e,n){return n.value}(0,n):void 0}function ce(e,n,t,r){"string"!=typeof t&&t!==e.Fragment&&e.passNode&&(n.node=r)}function fe(e,n){if(n.length>0){const t=n.length>1?n:n[0];t&&(e.children=t)}}function pe(e,n){const t=[];let r=-1;const o=e.passKeys?new Map:te;for(;++r4&&"data"===t.slice(0,4)&&B.test(n)){if("-"===n.charAt(4)){const e=n.slice(5).replace(j,V);r="data"+e.charAt(0).toUpperCase()+e.slice(1)}else{const e=n.slice(4);if(!j.test(e)){let t=e.replace(H,U);"-"!==t.charAt(0)&&(t="-"+t),n="data"+t}}o=C}return new o(r,n)}(e.schema,n);if(!(null==t||"number"==typeof t&&Number.isNaN(t))){if(Array.isArray(t)&&(t=r.commaSeparated?function(e,n){const t=n||{};return(""===e[e.length-1]?[...e,""]:e).join((t.padRight?" ":"")+","+(!1===t.padLeft?"":" ")).trim()}(t):t.join(" ").trim()),"style"===r.property){let n="object"==typeof t?t:function(e,n){const t={};try{Y(n,r)}catch(o){if(!e.ignoreInvalidStyle){const n=o,t=new ee("Cannot parse `style` attribute",{ancestors:e.ancestors,cause:n,ruleId:"style",source:"hast-util-to-jsx-runtime"});throw t.file=e.filePath||void 0,t.url=se+"#cannot-parse-style-attribute",t}}return t;function r(e,n){let r=e;"--"!==r.slice(0,2)&&("-ms-"===r.slice(0,4)&&(r="ms-"+r.slice(4)),r=r.replace(oe,ye)),t[r]=n}}(e,String(t));return"css"===e.stylePropertyNameCase&&(n=function(e){const n={};let t;for(t in e)ne.call(e,t)&&(n[ge(t)]=e[t]);return n}(n)),["style",n]}return["react"===e.elementAttributeNameCase&&r.space?q[r.property]||r.property:r.attribute,t]}}function he(e,n,t){let r;if(t)if(n.includes(".")){const e=n.split(".");let t,o=-1;for(;++oo?0:o+n:n>o?o:n,t=t>0?t:0,r.length<1e4)i=Array.from(r),i.unshift(n,t),e.splice(...i);else for(t&&e.splice(n,t);l0?(Ie(e,e.length,0,n),e):n}class Ee{constructor(e){this.left=e?[...e]:[],this.right=[]}get(e){if(e<0||e>=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+e+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return ethis.left.length?this.right.slice(this.right.length-t+this.left.length,this.right.length-e+this.left.length).reverse():this.left.slice(e).concat(this.right.slice(this.right.length-t+this.left.length).reverse())}splice(e,n,t){const r=n||0;this.setCursor(Math.trunc(e));const o=this.right.splice(this.right.length-r,Number.POSITIVE_INFINITY);return t&&Pe(this.left,t),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(e){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(e)}pushMany(e){this.setCursor(Number.POSITIVE_INFINITY),Pe(this.left,e)}unshift(e){this.setCursor(0),this.right.push(e)}unshiftMany(e){this.setCursor(0),Pe(this.right,e.reverse())}setCursor(e){if(!(e===this.left.length||e>this.left.length&&0===this.right.length||e<0&&0===this.left.length))if(e-1&&e.test(String.fromCharCode(n))}}function Me(e,n,t,r){const o=r?r-1:Number.POSITIVE_INFINITY;let i=0;return function(r){if(Fe(r))return e.enter(t),l(r);return n(r)};function l(r){return Fe(r)&&i++i))return;const t=n.events.length;let o,s,a=t;for(;a--;)if("exit"===n.events[a][0]&&"chunkFlow"===n.events[a][1].type){if(o){s=n.events[a][1].end;break}o=!0}for(y(l),e=t;er;){const r=t[o];n.containerState=r[1],r[0].exit.call(n,e)}t.length=r}function x(){r.write([null]),o=void 0,r=void 0,n.containerState._closeFlow=void 0}}},Be={tokenize:function(e,n,t){return Me(e,e.attempt(this.parser.constructs.document,n,t),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}};const je=Qe(/[A-Za-z]/),He=Qe(/[\dA-Za-z]/),Ue=Qe(/[#-'*+\--9=?A-Z^-~]/);const Ve=Qe(/\d/),qe=Qe(/[\dA-Fa-f]/),Ze=Qe(/[!-/:-@[-`{-~]/);function Ye(e){return null!==e&&e<-2}function We(e){return null!==e&&(e<0||32===e)}function Ke(e){return-2===e||-1===e||32===e}Qe(/\p{P}|\p{S}/u),Qe(/\s/);function Qe(e){return function(n){return null!==n&&n>-1&&e.test(String.fromCharCode(n))}}function Xe(e,n,t,r){const o=r?r-1:Number.POSITIVE_INFINITY;let i=0;return function(r){if(Ke(r))return e.enter(t),l(r);return n(r)};function l(r){return Ke(r)&&i++=4?n(o):e.interrupt(r.parser.constructs.flow,t,n)(o)}}};const en={tokenize:function(e){const n=this,t=e.attempt($e,(function(r){if(null===r)return void e.consume(r);return e.enter("lineEndingBlank"),e.consume(r),e.exit("lineEndingBlank"),n.currentConstruct=void 0,t}),e.attempt(this.parser.constructs.flowInitial,r,Me(e,e.attempt(this.parser.constructs.flow,r,e.attempt(Je,r)),"linePrefix")));return t;function r(r){if(null!==r)return e.enter("lineEnding"),e.consume(r),e.exit("lineEnding"),n.currentConstruct=void 0,t;e.consume(r)}}};const nn={resolveAll:ln()},tn=on("string"),rn=on("text");function on(e){return{resolveAll:ln("text"===e?sn:void 0),tokenize:function(n){const t=this,r=this.parser.constructs[e],o=n.attempt(r,i,l);return i;function i(e){return a(e)?o(e):l(e)}function l(e){if(null!==e)return n.enter("data"),n.consume(e),s;n.consume(e)}function s(e){return a(e)?(n.exit("data"),o(e)):(n.consume(e),s)}function a(e){if(null===e)return!0;const n=r[e];let o=-1;if(n)for(;++o=3&&(null===i||Ye(i))?(e.exit("thematicBreak"),n(i)):t(i)}function l(n){return n===r?(e.consume(n),o++,l):(e.exit("thematicBreakSequence"),Ke(n)?Xe(e,i,"whitespace")(n):i(n))}}};const un={continuation:{tokenize:function(e,n,t){const r=this;return r.containerState._closeFlow=void 0,e.check($e,o,i);function o(t){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,Xe(e,n,"listItemIndent",r.containerState.size+1)(t)}function i(t){return r.containerState.furtherBlankLines||!Ke(t)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,l(t)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(fn,n,l)(t))}function l(o){return r.containerState._closeFlow=!0,r.interrupt=void 0,Xe(e,e.attempt(un,n,t),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(o)}}},exit:function(e){e.exit(this.containerState.type)},name:"list",tokenize:function(e,n,t){const r=this,o=r.events[r.events.length-1];let i=o&&"linePrefix"===o[1].type?o[2].sliceSerialize(o[1],!0).length:0,l=0;return function(n){const o=r.containerState.type||(42===n||43===n||45===n?"listUnordered":"listOrdered");if("listUnordered"===o?!r.containerState.marker||n===r.containerState.marker:Ve(n)){if(r.containerState.type||(r.containerState.type=o,e.enter(o,{_container:!0})),"listUnordered"===o)return e.enter("listItemPrefix"),42===n||45===n?e.check(an,t,a)(n):a(n);if(!r.interrupt||49===n)return e.enter("listItemPrefix"),e.enter("listItemValue"),s(n)}return t(n)};function s(n){return Ve(n)&&++l<10?(e.consume(n),s):(!r.interrupt||l<2)&&(r.containerState.marker?n===r.containerState.marker:41===n||46===n)?(e.exit("listItemValue"),a(n)):t(n)}function a(n){return e.enter("listItemMarker"),e.consume(n),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||n,e.check($e,r.interrupt?t:u,e.attempt(cn,f,c))}function u(e){return r.containerState.initialBlankLine=!0,i++,f(e)}function c(n){return Ke(n)?(e.enter("listItemPrefixWhitespace"),e.consume(n),e.exit("listItemPrefixWhitespace"),f):t(n)}function f(t){return r.containerState.size=i+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,n(t)}}},cn={partial:!0,tokenize:function(e,n,t){const r=this;return Xe(e,(function(e){const o=r.events[r.events.length-1];return!Ke(e)&&o&&"listItemPrefixWhitespace"===o[1].type?n(e):t(e)}),"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5)}},fn={partial:!0,tokenize:function(e,n,t){const r=this;return Xe(e,(function(e){const o=r.events[r.events.length-1];return o&&"listItemIndent"===o[1].type&&o[2].sliceSerialize(o[1],!0).length===r.containerState.size?n(e):t(e)}),"listItemIndent",r.containerState.size+1)}};const pn={continuation:{tokenize:function(e,n,t){const r=this;return function(n){if(Ke(n))return Xe(e,o,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(n);return o(n)};function o(r){return e.attempt(pn,n,t)(r)}}},exit:function(e){e.exit("blockQuote")},name:"blockQuote",tokenize:function(e,n,t){const r=this;return function(n){if(62===n){const t=r.containerState;return t.open||(e.enter("blockQuote",{_container:!0}),t.open=!0),e.enter("blockQuotePrefix"),e.enter("blockQuoteMarker"),e.consume(n),e.exit("blockQuoteMarker"),o}return t(n)};function o(t){return Ke(t)?(e.enter("blockQuotePrefixWhitespace"),e.consume(t),e.exit("blockQuotePrefixWhitespace"),e.exit("blockQuotePrefix"),n):(e.exit("blockQuotePrefix"),n(t))}}};hn(/[A-Za-z]/),hn(/[\dA-Za-z]/),hn(/[#-'*+\--9=?A-Z^-~]/);function dn(e){return null!==e&&(e<32||127===e)}hn(/\d/),hn(/[\dA-Fa-f]/),hn(/[!-/:-@[-`{-~]/);hn(/\p{P}|\p{S}/u),hn(/\s/);function hn(e){return function(n){return null!==n&&n>-1&&e.test(String.fromCharCode(n))}}function mn(e,n,t,r,o,i,l,s,a){const u=a||Number.POSITIVE_INFINITY;let c=0;return function(n){if(60===n)return e.enter(r),e.enter(o),e.enter(i),e.consume(n),e.exit(i),f;if(null===n||32===n||41===n||dn(n))return t(n);return e.enter(r),e.enter(l),e.enter(s),e.enter("chunkString",{contentType:"string"}),h(n)};function f(t){return 62===t?(e.enter(i),e.consume(t),e.exit(i),e.exit(o),e.exit(r),n):(e.enter(s),e.enter("chunkString",{contentType:"string"}),p(t))}function p(n){return 62===n?(e.exit("chunkString"),e.exit(s),f(n)):null===n||60===n||function(e){return null!==e&&e<-2}(n)?t(n):(e.consume(n),92===n?d:p)}function d(n){return 60===n||62===n||92===n?(e.consume(n),p):p(n)}function h(o){return c||null!==o&&41!==o&&!function(e){return null!==e&&(e<0||32===e)}(o)?c-1&&e.test(String.fromCharCode(n))}}function xn(e,n,t,r,o,i){const l=this;let s,a=0;return function(n){return e.enter(r),e.enter(o),e.consume(n),e.exit(o),e.enter(i),u};function u(f){return a>999||null===f||91===f||93===f&&!s||94===f&&!a&&"_hiddenFootnoteSupport"in l.parser.constructs?t(f):93===f?(e.exit(i),e.enter(o),e.consume(f),e.exit(o),e.exit(r),n):gn(f)?(e.enter("lineEnding"),e.consume(f),e.exit("lineEnding"),u):(e.enter("chunkString",{contentType:"string"}),c(f))}function c(n){return null===n||91===n||93===n||gn(n)||a++>999?(e.exit("chunkString"),u(n)):(e.consume(n),s||(s=!function(e){return-2===e||-1===e||32===e}(n)),92===n?f:c)}function f(n){return 91===n||92===n||93===n?(e.consume(n),a++,c):c(n)}}bn(/[A-Za-z]/),bn(/[\dA-Za-z]/),bn(/[#-'*+\--9=?A-Z^-~]/);bn(/\d/),bn(/[\dA-Fa-f]/),bn(/[!-/:-@[-`{-~]/);function vn(e){return null!==e&&e<-2}function kn(e){return-2===e||-1===e||32===e}bn(/\p{P}|\p{S}/u),bn(/\s/);function bn(e){return function(n){return null!==n&&n>-1&&e.test(String.fromCharCode(n))}}function wn(e,n,t,r,o,i){let l;return function(n){if(34===n||39===n||40===n)return e.enter(r),e.enter(o),e.consume(n),e.exit(o),l=40===n?41:n,s;return t(n)};function s(t){return t===l?(e.enter(o),e.consume(t),e.exit(o),e.exit(r),n):(e.enter(i),a(t))}function a(n){return n===l?(e.exit(i),s(l)):null===n?t(n):vn(n)?(e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),function(e,n,t,r){const o=r?r-1:Number.POSITIVE_INFINITY;let i=0;return function(r){return kn(r)?(e.enter(t),l(r)):n(r)};function l(r){return kn(r)&&i++-1&&e.test(String.fromCharCode(n))}}function Cn(e,n){let t;return function r(o){if(function(e){return null!==e&&e<-2}(o))return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t=!0,r;if(Sn(o))return function(e,n,t,r){const o=r?r-1:Number.POSITIVE_INFINITY;let i=0;return function(r){return Sn(r)?(e.enter(t),l(r)):n(r)};function l(r){return Sn(r)&&i++=4?i(e):t(e)}function i(n){return null===n?s(n):Ye(n)?e.attempt(zn,i,s)(n):(e.enter("codeFlowValue"),l(n))}function l(n){return null===n||Ye(n)?(e.exit("codeFlowValue"),i(n)):(e.consume(n),l)}function s(t){return e.exit("codeIndented"),n(t)}}},zn={partial:!0,tokenize:function(e,n,t){const r=this;return o;function o(n){return r.parser.lazy[r.now().line]?t(n):Ye(n)?(e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),o):Xe(e,i,"linePrefix",5)(n)}function i(e){const i=r.events[r.events.length-1];return i&&"linePrefix"===i[1].type&&i[2].sliceSerialize(i[1],!0).length>=4?n(e):Ye(e)?o(e):t(e)}}};const Dn={name:"headingAtx",resolve:function(e,n){let t,r,o=e.length-2,i=3;"whitespace"===e[i][1].type&&(i+=2);o-2>i&&"whitespace"===e[o][1].type&&(o-=2);"atxHeadingSequence"===e[o][1].type&&(i===o-1||o-4>i&&"whitespace"===e[o-2][1].type)&&(o-=i+1===o?2:4);o>i&&(t={type:"atxHeadingText",start:e[i][1].start,end:e[o][1].end},r={type:"chunkText",start:e[i][1].start,end:e[o][1].end,contentType:"text"},Ie(e,i,o-i+1,[["enter",t,n],["enter",r,n],["exit",r,n],["exit",t,n]]));return e},tokenize:function(e,n,t){let r=0;return function(n){return e.enter("atxHeading"),function(n){return e.enter("atxHeadingSequence"),o(n)}(n)};function o(n){return 35===n&&r++<6?(e.consume(n),o):null===n||We(n)?(e.exit("atxHeadingSequence"),i(n)):t(n)}function i(t){return 35===t?(e.enter("atxHeadingSequence"),l(t)):null===t||Ye(t)?(e.exit("atxHeading"),n(t)):Ke(t)?Xe(e,i,"whitespace")(t):(e.enter("atxHeadingText"),s(t))}function l(n){return 35===n?(e.consume(n),l):(e.exit("atxHeadingSequence"),i(n))}function s(n){return null===n||35===n||We(n)?(e.exit("atxHeadingText"),i(n)):(e.consume(n),s)}}};const Ln={name:"setextUnderline",resolveTo:function(e,n){let t,r,o,i=e.length;for(;i--;)if("enter"===e[i][0]){if("content"===e[i][1].type){t=i;break}"paragraph"===e[i][1].type&&(r=i)}else"content"===e[i][1].type&&e.splice(i,1),o||"definition"!==e[i][1].type||(o=i);const l={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};e[r][1].type="setextHeadingText",o?(e.splice(r,0,["enter",l,n]),e.splice(o+1,0,["exit",e[t][1],n]),e[t][1].end={...e[o][1].end}):e[t][1]=l;return e.push(["exit",l,n]),e},tokenize:function(e,n,t){const r=this;let o;return function(n){let l,s=r.events.length;for(;s--;)if("lineEnding"!==r.events[s][1].type&&"linePrefix"!==r.events[s][1].type&&"content"!==r.events[s][1].type){l="paragraph"===r.events[s][1].type;break}if(!r.parser.lazy[r.now().line]&&(r.interrupt||l))return e.enter("setextHeadingLine"),o=n,function(n){return e.enter("setextHeadingLineSequence"),i(n)}(n);return t(n)};function i(n){return n===o?(e.consume(n),i):(e.exit("setextHeadingLineSequence"),Ke(n)?Xe(e,l,"lineSuffix")(n):l(n))}function l(r){return null===r||Ye(r)?(e.exit("setextHeadingLine"),n(r)):t(r)}}};const On=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],Fn=["pre","script","style","textarea"],Nn={concrete:!0,name:"htmlFlow",resolveTo:function(e){let n=e.length;for(;n--&&("enter"!==e[n][0]||"htmlFlow"!==e[n][1].type););n>1&&"linePrefix"===e[n-2][1].type&&(e[n][1].start=e[n-2][1].start,e[n+1][1].start=e[n-2][1].start,e.splice(n-2,2));return e},tokenize:function(e,n,t){const r=this;let o,i,l,s,a;return function(n){return function(n){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(n),u}(n)};function u(s){return 33===s?(e.consume(s),c):47===s?(e.consume(s),i=!0,d):63===s?(e.consume(s),o=3,r.interrupt?n:F):je(s)?(e.consume(s),l=String.fromCharCode(s),h):t(s)}function c(i){return 45===i?(e.consume(i),o=2,f):91===i?(e.consume(i),o=5,s=0,p):je(i)?(e.consume(i),o=4,r.interrupt?n:F):t(i)}function f(o){return 45===o?(e.consume(o),r.interrupt?n:F):t(o)}function p(o){const i="CDATA[";return o===i.charCodeAt(s++)?(e.consume(o),6===s?r.interrupt?n:E:p):t(o)}function d(n){return je(n)?(e.consume(n),l=String.fromCharCode(n),h):t(n)}function h(s){if(null===s||47===s||62===s||We(s)){const a=47===s,u=l.toLowerCase();return a||i||!Fn.includes(u)?On.includes(l.toLowerCase())?(o=6,a?(e.consume(s),m):r.interrupt?n(s):E(s)):(o=7,r.interrupt&&!r.parser.lazy[r.now().line]?t(s):i?g(s):y(s)):(o=1,r.interrupt?n(s):E(s))}return 45===s||He(s)?(e.consume(s),l+=String.fromCharCode(s),h):t(s)}function m(o){return 62===o?(e.consume(o),r.interrupt?n:E):t(o)}function g(n){return Ke(n)?(e.consume(n),g):I(n)}function y(n){return 47===n?(e.consume(n),I):58===n||95===n||je(n)?(e.consume(n),x):Ke(n)?(e.consume(n),y):I(n)}function x(n){return 45===n||46===n||58===n||95===n||He(n)?(e.consume(n),x):v(n)}function v(n){return 61===n?(e.consume(n),k):Ke(n)?(e.consume(n),v):y(n)}function k(n){return null===n||60===n||61===n||62===n||96===n?t(n):34===n||39===n?(e.consume(n),a=n,b):Ke(n)?(e.consume(n),k):w(n)}function b(n){return n===a?(e.consume(n),a=null,S):null===n||Ye(n)?t(n):(e.consume(n),b)}function w(n){return null===n||34===n||39===n||47===n||60===n||61===n||62===n||96===n||We(n)?v(n):(e.consume(n),w)}function S(e){return 47===e||62===e||Ke(e)?y(e):t(e)}function I(n){return 62===n?(e.consume(n),C):t(n)}function C(n){return null===n||Ye(n)?E(n):Ke(n)?(e.consume(n),C):t(n)}function E(n){return 45===n&&2===o?(e.consume(n),z):60===n&&1===o?(e.consume(n),D):62===n&&4===o?(e.consume(n),N):63===n&&3===o?(e.consume(n),F):93===n&&5===o?(e.consume(n),O):!Ye(n)||6!==o&&7!==o?null===n||Ye(n)?(e.exit("htmlFlowData"),P(n)):(e.consume(n),E):(e.exit("htmlFlowData"),e.check(Mn,M,P)(n))}function P(n){return e.check(Rn,A,M)(n)}function A(n){return e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),T}function T(n){return null===n||Ye(n)?P(n):(e.enter("htmlFlowData"),E(n))}function z(n){return 45===n?(e.consume(n),F):E(n)}function D(n){return 47===n?(e.consume(n),l="",L):E(n)}function L(n){if(62===n){const t=l.toLowerCase();return Fn.includes(t)?(e.consume(n),N):E(n)}return je(n)&&l.length<8?(e.consume(n),l+=String.fromCharCode(n),L):E(n)}function O(n){return 93===n?(e.consume(n),F):E(n)}function F(n){return 62===n?(e.consume(n),N):45===n&&2===o?(e.consume(n),F):E(n)}function N(n){return null===n||Ye(n)?(e.exit("htmlFlowData"),M(n)):(e.consume(n),N)}function M(t){return e.exit("htmlFlow"),n(t)}}},Mn={partial:!0,tokenize:function(e,n,t){return function(r){return e.enter("lineEnding"),e.consume(r),e.exit("lineEnding"),e.attempt($e,n,t)}}},Rn={partial:!0,tokenize:function(e,n,t){const r=this;return function(n){if(Ye(n))return e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),o;return t(n)};function o(e){return r.parser.lazy[r.now().line]?t(e):n(e)}}};const _n={partial:!0,tokenize:function(e,n,t){const r=this;return function(n){if(null===n)return t(n);return e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),o};function o(e){return r.parser.lazy[r.now().line]?t(e):n(e)}}},Bn={concrete:!0,name:"codeFenced",tokenize:function(e,n,t){const r=this,o={partial:!0,tokenize:function(e,n,t){let o=0;return l;function l(n){return e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),a}function a(n){return e.enter("codeFencedFence"),Ke(n)?Xe(e,u,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(n):u(n)}function u(n){return n===i?(e.enter("codeFencedFenceSequence"),c(n)):t(n)}function c(n){return n===i?(o++,e.consume(n),c):o>=s?(e.exit("codeFencedFenceSequence"),Ke(n)?Xe(e,f,"whitespace")(n):f(n)):t(n)}function f(r){return null===r||Ye(r)?(e.exit("codeFencedFence"),n(r)):t(r)}}};let i,l=0,s=0;return function(n){return function(n){const t=r.events[r.events.length-1];return l=t&&"linePrefix"===t[1].type?t[2].sliceSerialize(t[1],!0).length:0,i=n,e.enter("codeFenced"),e.enter("codeFencedFence"),e.enter("codeFencedFenceSequence"),a(n)}(n)};function a(n){return n===i?(s++,e.consume(n),a):s<3?t(n):(e.exit("codeFencedFenceSequence"),Ke(n)?Xe(e,u,"whitespace")(n):u(n))}function u(t){return null===t||Ye(t)?(e.exit("codeFencedFence"),r.interrupt?n(t):e.check(_n,d,x)(t)):(e.enter("codeFencedFenceInfo"),e.enter("chunkString",{contentType:"string"}),c(t))}function c(n){return null===n||Ye(n)?(e.exit("chunkString"),e.exit("codeFencedFenceInfo"),u(n)):Ke(n)?(e.exit("chunkString"),e.exit("codeFencedFenceInfo"),Xe(e,f,"whitespace")(n)):96===n&&n===i?t(n):(e.consume(n),c)}function f(n){return null===n||Ye(n)?u(n):(e.enter("codeFencedFenceMeta"),e.enter("chunkString",{contentType:"string"}),p(n))}function p(n){return null===n||Ye(n)?(e.exit("chunkString"),e.exit("codeFencedFenceMeta"),u(n)):96===n&&n===i?t(n):(e.consume(n),p)}function d(n){return e.attempt(o,x,h)(n)}function h(n){return e.enter("lineEnding"),e.consume(n),e.exit("lineEnding"),m}function m(n){return l>0&&Ke(n)?Xe(e,g,"linePrefix",l+1)(n):g(n)}function g(n){return null===n||Ye(n)?e.check(_n,d,x)(n):(e.enter("codeFlowValue"),y(n))}function y(n){return null===n||Ye(n)?(e.exit("codeFlowValue"),g(n)):(e.consume(n),y)}function x(t){return e.exit("codeFenced"),n(t)}}};const jn=document.createElement("i");function Hn(e){const n="&"+e+";";jn.innerHTML=n;const t=jn.textContent;return(59!==t.charCodeAt(t.length-1)||"semi"===e)&&(t!==n&&t)}const Un={name:"characterReference",tokenize:function(e,n,t){const r=this;let o,i,l=0;return function(n){return e.enter("characterReference"),e.enter("characterReferenceMarker"),e.consume(n),e.exit("characterReferenceMarker"),s};function s(n){return 35===n?(e.enter("characterReferenceMarkerNumeric"),e.consume(n),e.exit("characterReferenceMarkerNumeric"),a):(e.enter("characterReferenceValue"),o=31,i=He,u(n))}function a(n){return 88===n||120===n?(e.enter("characterReferenceMarkerHexadecimal"),e.consume(n),e.exit("characterReferenceMarkerHexadecimal"),e.enter("characterReferenceValue"),o=6,i=qe,u):(e.enter("characterReferenceValue"),o=7,i=Ve,u(n))}function u(s){if(59===s&&l){const o=e.exit("characterReferenceValue");return i!==He||Hn(r.sliceSerialize(o))?(e.enter("characterReferenceMarker"),e.consume(s),e.exit("characterReferenceMarker"),e.exit("characterReference"),n):t(s)}return i(s)&&l++-1&&e.test(String.fromCharCode(n))}}function et(e){return null===e||function(e){return null!==e&&(e<0||32===e)}(e)||Jn(e)?1:$n(e)?2:void 0}const nt={name:"attention",resolveAll:function(e,n){let t,r,o,i,l,s,a,u,c=-1;for(;++c1&&e[c][1].end.offset-e[c][1].start.offset>1?2:1;const f={...e[t][1].end},p={...e[c][1].start};tt(f,-s),tt(p,s),i={type:s>1?"strongSequence":"emphasisSequence",start:f,end:{...e[t][1].end}},l={type:s>1?"strongSequence":"emphasisSequence",start:{...e[c][1].start},end:p},o={type:s>1?"strongText":"emphasisText",start:{...e[t][1].end},end:{...e[c][1].start}},r={type:s>1?"strong":"emphasis",start:{...i.start},end:{...l.end}},e[t][1].end={...i.start},e[c][1].start={...l.end},a=[],e[t][1].end.offset-e[t][1].start.offset&&(a=Ce(a,[["enter",e[t][1],n],["exit",e[t][1],n]])),a=Ce(a,[["enter",r,n],["enter",i,n],["exit",i,n],["enter",o,n]]),a=Ce(a,Zn(n.parser.constructs.insideSpan.null,e.slice(t+1,c),n)),a=Ce(a,[["exit",o,n],["enter",l,n],["exit",l,n],["exit",r,n]]),e[c][1].end.offset-e[c][1].start.offset?(u=2,a=Ce(a,[["enter",e[c][1],n],["exit",e[c][1],n]])):u=0,Ie(e,t-1,c-t+3,a),c=t+a.length-u-2;break}c=-1;for(;++c-1){const e=l[0];"string"==typeof e?l[0]=e.slice(r):l.shift()}i>0&&l.push(e[o].slice(0,i))}return l}(l,e)}function h(){const{_bufferIndex:e,_index:n,line:t,column:o,offset:i}=r;return{_bufferIndex:e,_index:n,line:t,column:o,offset:i}}function m(){let e;for(;r._index13&&t<32||t>126&&t<160||t>55295&&t<57344||t>64975&&t<65008||!(65535&~t)||65534==(65535&t)||t>1114111?"\ufffd":String.fromCodePoint(t)}const bt=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function wt(e,n,t){if(n)return n;if(35===t.charCodeAt(0)){const e=t.charCodeAt(1),n=120===e||88===e;return kt(t.slice(n?2:1),n?16:10)}return Hn(t)||e}const St={}.hasOwnProperty;function It(e,n,t){return"string"!=typeof n&&(t=n,n=void 0),function(e){const n={transforms:[],canContainEols:["emphasis","fragment","heading","paragraph","strong"],enter:{autolink:i(te),autolinkProtocol:C,autolinkEmail:C,atxHeading:i(J),blockQuote:i(Y),characterEscape:C,characterReference:C,codeFenced:i(W),codeFencedFenceInfo:l,codeFencedFenceMeta:l,codeIndented:i(W,l),codeText:i(K,l),codeTextData:C,data:C,codeFlowValue:C,definition:i(Q),definitionDestinationString:l,definitionLabelString:l,definitionTitleString:l,emphasis:i($),hardBreakEscape:i(G),hardBreakTrailing:i(G),htmlFlow:i(ee,l),htmlFlowData:C,htmlText:i(ee,l),htmlTextData:C,image:i(ne),label:l,link:i(te),listItem:i(oe),listItemValue:p,listOrdered:i(re,f),listUnordered:i(re),paragraph:i(ie),reference:B,referenceString:l,resourceDestinationString:l,resourceTitleString:l,setextHeading:i(J),strong:i(le),thematicBreak:i(ae)},exit:{atxHeading:a(),atxHeadingSequence:b,autolink:a(),autolinkEmail:Z,autolinkProtocol:q,blockQuote:a(),characterEscapeValue:E,characterReferenceMarkerHexadecimal:H,characterReferenceMarkerNumeric:H,characterReferenceValue:U,characterReference:V,codeFenced:a(g),codeFencedFence:m,codeFencedFenceInfo:d,codeFencedFenceMeta:h,codeFlowValue:E,codeIndented:a(y),codeText:a(D),codeTextData:E,data:E,definition:a(),definitionDestinationString:k,definitionLabelString:x,definitionTitleString:v,emphasis:a(),hardBreakEscape:a(A),hardBreakTrailing:a(A),htmlFlow:a(T),htmlFlowData:E,htmlText:a(z),htmlTextData:E,image:a(O),label:N,labelText:F,lineEnding:P,link:a(L),listItem:a(),listOrdered:a(),listUnordered:a(),paragraph:a(),referenceString:j,resourceDestinationString:M,resourceTitleString:R,resource:_,setextHeading:a(I),setextHeadingLineSequence:S,setextHeadingText:w,strong:a(),thematicBreak:a()}};Et(n,(e||{}).mdastExtensions||[]);const t={};return r;function r(e){let r={type:"root",children:[]};const i={stack:[r],tokenStack:[],config:n,enter:s,exit:u,buffer:l,resume:c,data:t},a=[];let f=-1;for(;++f0){const e=i.tokenStack[i.tokenStack.length-1];(e[1]||At).call(i,void 0,e[0])}for(r.position={start:Ct(e.length>0?e[0][1].start:{line:1,column:1,offset:0}),end:Ct(e.length>0?e[e.length-2][1].end:{line:1,column:1,offset:0})},f=-1;++f((e,n)=>{const t=(n,t)=>(e.set(t,n),n),r=o=>{if(e.has(o))return e.get(o);const[i,l]=n[o];switch(i){case 0:case-1:return t(l,o);case 1:{const e=t([],o);for(const n of l)e.push(r(n));return e}case 2:{const e=t({},o);for(const[n,t]of l)e[r(n)]=r(t);return e}case 3:return t(new Date(l),o);case 4:{const{source:e,flags:n}=l;return t(new RegExp(e,n),o)}case 5:{const e=t(new Map,o);for(const[n,t]of l)e.set(r(n),r(t));return e}case 6:{const e=t(new Set,o);for(const n of l)e.add(r(n));return e}case 7:{const{name:e,message:n}=l;return t(new zt[e](n),o)}case 8:return t(BigInt(l),o);case"BigInt":return t(Object(BigInt(l)),o);case"ArrayBuffer":return t(new Uint8Array(l).buffer,l);case"DataView":{const{buffer:e}=new Uint8Array(l);return t(new DataView(e),l)}}return t(new zt[i](l),o)};return r})(new Map,e)(0),Lt="",{toString:Ot}={},{keys:Ft}=Object,Nt=e=>{const n=typeof e;if("object"!==n||!e)return[0,n];const t=Ot.call(e).slice(8,-1);switch(t){case"Array":return[1,Lt];case"Object":return[2,Lt];case"Date":return[3,Lt];case"RegExp":return[4,Lt];case"Map":return[5,Lt];case"Set":return[6,Lt];case"DataView":return[1,t]}return t.includes("Array")?[1,t]:t.includes("Error")?[7,t]:[2,t]},Mt=([e,n])=>0===e&&("function"===n||"symbol"===n),Rt=(e,{json:n,lossy:t}={})=>{const r=[];return((e,n,t,r)=>{const o=(e,n)=>{const o=r.push(e)-1;return t.set(n,o),o},i=r=>{if(t.has(r))return t.get(r);let[l,s]=Nt(r);switch(l){case 0:{let n=r;switch(s){case"bigint":l=8,n=r.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+s);n=null;break;case"undefined":return o([-1],r)}return o([l,n],r)}case 1:{if(s){let e=r;return"DataView"===s?e=new Uint8Array(r.buffer):"ArrayBuffer"===s&&(e=new Uint8Array(r)),o([s,[...e]],r)}const e=[],n=o([l,e],r);for(const t of r)e.push(i(t));return n}case 2:{if(s)switch(s){case"BigInt":return o([s,r.toString()],r);case"Boolean":case"Number":case"String":return o([s,r.valueOf()],r)}if(n&&"toJSON"in r)return i(r.toJSON());const t=[],a=o([l,t],r);for(const n of Ft(r))!e&&Mt(Nt(r[n]))||t.push([i(n),i(r[n])]);return a}case 3:return o([l,r.toISOString()],r);case 4:{const{source:e,flags:n}=r;return o([l,{source:e,flags:n}],r)}case 5:{const n=[],t=o([l,n],r);for(const[o,l]of r)(e||!Mt(Nt(o))&&!Mt(Nt(l)))&&n.push([i(o),i(l)]);return t}case 6:{const n=[],t=o([l,n],r);for(const o of r)!e&&Mt(Nt(o))||n.push(i(o));return t}}const{message:a}=r;return o([l,{name:s,message:a}],r)};return i})(!(n||t),!!n,new Map,r)(e),r},_t="function"==typeof structuredClone?(e,n)=>n&&("json"in n||"lossy"in n)?Dt(Rt(e,n)):structuredClone(e):(e,n)=>Dt(Rt(e,n)),Bt=(jt(/[A-Za-z]/),jt(/[\dA-Za-z]/));jt(/[#-'*+\--9=?A-Z^-~]/);jt(/\d/),jt(/[\dA-Fa-f]/),jt(/[!-/:-@[-`{-~]/);jt(/\p{P}|\p{S}/u),jt(/\s/);function jt(e){return function(n){return null!==n&&n>-1&&e.test(String.fromCharCode(n))}}function Ht(e){const n=[];let t=-1,r=0,o=0;for(;++t55295&&i<57344){const n=e.charCodeAt(t+1);i<56320&&n>56319&&n<57344?(l=String.fromCharCode(i,n),o=1):l="\ufffd"}else l=String.fromCharCode(i);l&&(n.push(e.slice(r,t),encodeURIComponent(l)),r=t+o+1,l=""),o&&(t+=o,o=0)}return n.join("")+e.slice(r)}function Ut(e,n){const t=[{type:"text",value:"\u21a9"}];return n>1&&t.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(n)}]}),t}function Vt(e,n){return"Back to reference "+(e+1)+(n>1?"-"+n:"")}const qt=function(e){if(null==e)return Yt;if("function"==typeof e)return Zt(e);if("object"==typeof e)return Array.isArray(e)?function(e){const n=[];let t=-1;for(;++t":"")+")"})}return c;function c(){let u,c,f,p=Kt;if((!n||i(o,s,a[a.length-1]||void 0))&&(p=function(e){if(Array.isArray(e))return e;if("number"==typeof e)return[Qt,e];return null==e?Kt:[e]}(t(o,a)),p[0]===Xt))return p;if("children"in o&&o.children){const n=o;if(n.children&&p[0]!==$t)for(c=(r?n.children.length:-1)+l,f=a.concat(n);c>-1&&c1:n}function tr(e){const n=String(e),t=/\r?\n|\r/g;let r=t.exec(n),o=0;const i=[];for(;r;)i.push(rr(n.slice(o,r.index),o>0,!0),r[0]),o=r.index+r[0].length,r=t.exec(n);return i.push(rr(n.slice(o),o>0,!1)),i.join("")}function rr(e,n,t){let r=0,o=e.length;if(n){let n=e.codePointAt(r);for(;9===n||32===n;)r++,n=e.codePointAt(r)}if(t){let n=e.codePointAt(o-1);for(;9===n||32===n;)o--,n=e.codePointAt(o-1)}return o>r?e.slice(r,o):""}const or={blockquote:function(e,n){const t={type:"element",tagName:"blockquote",properties:{},children:e.wrap(e.all(n),!0)};return e.patch(n,t),e.applyData(n,t)},break:function(e,n){const t={type:"element",tagName:"br",properties:{},children:[]};return e.patch(n,t),[e.applyData(n,t),{type:"text",value:"\n"}]},code:function(e,n){const t=n.value?n.value+"\n":"",r={};n.lang&&(r.className=["language-"+n.lang]);let o={type:"element",tagName:"code",properties:r,children:[{type:"text",value:t}]};return n.meta&&(o.data={meta:n.meta}),e.patch(n,o),o=e.applyData(n,o),o={type:"element",tagName:"pre",properties:{},children:[o]},e.patch(n,o),o},delete:function(e,n){const t={type:"element",tagName:"del",properties:{},children:e.all(n)};return e.patch(n,t),e.applyData(n,t)},emphasis:function(e,n){const t={type:"element",tagName:"em",properties:{},children:e.all(n)};return e.patch(n,t),e.applyData(n,t)},footnoteReference:function(e,n){const t="string"==typeof e.options.clobberPrefix?e.options.clobberPrefix:"user-content-",r=String(n.identifier).toUpperCase(),o=Ht(r.toLowerCase()),i=e.footnoteOrder.indexOf(r);let l,s=e.footnoteCounts.get(r);void 0===s?(s=0,e.footnoteOrder.push(r),l=e.footnoteOrder.length):l=i+1,s+=1,e.footnoteCounts.set(r,s);const a={type:"element",tagName:"a",properties:{href:"#"+t+"fn-"+o,id:t+"fnref-"+o+(s>1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(l)}]};e.patch(n,a);const u={type:"element",tagName:"sup",properties:{},children:[a]};return e.patch(n,u),e.applyData(n,u)},heading:function(e,n){const t={type:"element",tagName:"h"+n.depth,properties:{},children:e.all(n)};return e.patch(n,t),e.applyData(n,t)},html:function(e,n){if(e.options.allowDangerousHtml){const t={type:"raw",value:n.value};return e.patch(n,t),e.applyData(n,t)}},imageReference:function(e,n){const t=String(n.identifier).toUpperCase(),r=e.definitionById.get(t);if(!r)return er(e,n);const o={src:Ht(r.url||""),alt:n.alt};null!==r.title&&void 0!==r.title&&(o.title=r.title);const i={type:"element",tagName:"img",properties:o,children:[]};return e.patch(n,i),e.applyData(n,i)},image:function(e,n){const t={src:Ht(n.url)};null!==n.alt&&void 0!==n.alt&&(t.alt=n.alt),null!==n.title&&void 0!==n.title&&(t.title=n.title);const r={type:"element",tagName:"img",properties:t,children:[]};return e.patch(n,r),e.applyData(n,r)},inlineCode:function(e,n){const t={type:"text",value:n.value.replace(/\r?\n|\r/g," ")};e.patch(n,t);const r={type:"element",tagName:"code",properties:{},children:[t]};return e.patch(n,r),e.applyData(n,r)},linkReference:function(e,n){const t=String(n.identifier).toUpperCase(),r=e.definitionById.get(t);if(!r)return er(e,n);const o={href:Ht(r.url||"")};null!==r.title&&void 0!==r.title&&(o.title=r.title);const i={type:"element",tagName:"a",properties:o,children:e.all(n)};return e.patch(n,i),e.applyData(n,i)},link:function(e,n){const t={href:Ht(n.url)};null!==n.title&&void 0!==n.title&&(t.title=n.title);const r={type:"element",tagName:"a",properties:t,children:e.all(n)};return e.patch(n,r),e.applyData(n,r)},listItem:function(e,n,t){const r=e.all(n),o=t?function(e){let n=!1;if("list"===e.type){n=e.spread||!1;const t=e.children;let r=-1;for(;!n&&++r0&&t.children.unshift({type:"text",value:" "}),t.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:n.checked,disabled:!0},children:[]}),i.className=["task-list-item"]}let s=-1;for(;++s0){const r={type:"element",tagName:"tbody",properties:{},children:e.wrap(t,!0)},i=K(n.children[1]),l=W(n.children[n.children.length-1]);i&&l&&(r.position={start:i,end:l}),o.push(r)}const i={type:"element",tagName:"table",properties:{},children:e.wrap(o,!0)};return e.patch(n,i),e.applyData(n,i)},tableCell:function(e,n){const t={type:"element",tagName:"td",properties:{},children:e.all(n)};return e.patch(n,t),e.applyData(n,t)},tableRow:function(e,n,t){const r=t?t.children:void 0,o=0===(r?r.indexOf(n):1)?"th":"td",i=t&&"table"===t.type?t.align:void 0,l=i?i.length:n.children.length;let s=-1;const a=[];for(;++s0&&t.push({type:"text",value:"\n"}),t}function pr(e){let n=0,t=e.charCodeAt(n);for(;9===t||32===t;)n++,t=e.charCodeAt(n);return e.slice(n)}function dr(e,n){const t=function(e,n){const t=n||sr,r=new Map,o=new Map,i=new Map,l={...or,...t.handlers},s={all:function(e){const n=[];if("children"in e){const t=e.children;let r=-1;for(;++r0&&f.push({type:"text",value:" "});let e="string"==typeof t?t:t(a,c);"string"==typeof e&&(e={type:"text",value:e}),f.push({type:"element",tagName:"a",properties:{href:"#"+n+"fnref-"+u+(c>1?"-"+c:""),dataFootnoteBackref:"",ariaLabel:"string"==typeof r?r:r(a,c),className:["data-footnote-backref"]},children:Array.isArray(e)?e:[e]})}const d=i[i.length-1];if(d&&"element"===d.type&&"p"===d.tagName){const e=d.children[d.children.length-1];e&&"text"===e.type?e.value+=" ":d.children.push({type:"text",value:" "}),d.children.push(...f)}else i.push(...f);const h={type:"element",tagName:"li",properties:{id:n+"fn-"+u},children:e.wrap(i,!0)};e.patch(o,h),s.push(h)}if(0!==s.length)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:i,properties:{..._t(l),id:"footnote-label"},children:[{type:"text",value:o}]},{type:"text",value:"\n"},{type:"element",tagName:"ol",properties:{},children:e.wrap(s,!0)},{type:"text",value:"\n"}]}}(t),i=Array.isArray(r)?{type:"root",children:r}:r||{type:"root",children:[]};return o&&i.children.push({type:"text",value:"\n"},o),i}function hr(e,n){return e&&"run"in e?async function(t,r){const o=dr(t,{file:r,...n});await e.run(o,r)}:function(t,r){return dr(t,{file:r,...e||n})}}function mr(e){if(e)throw e}var gr=t(92849);function yr(e){if("object"!=typeof e||null===e)return!1;const n=Object.getPrototypeOf(e);return!(null!==n&&n!==Object.prototype&&null!==Object.getPrototypeOf(n)||Symbol.toStringTag in e||Symbol.iterator in e)}function xr(){const e=[],n={run:function(...n){let t=-1;const r=n.pop();if("function"!=typeof r)throw new TypeError("Expected function as last argument, not "+r);!function o(i,...l){const s=e[++t];let a=-1;if(i)r(i);else{for(;++an.length;let s;r&&n.push(o);try{s=e.apply(this,n)}catch(i){if(r&&t)throw i;return o(i)}r||(s&&s.then&&"function"==typeof s.then?s.then(l,o):s instanceof Error?o(s):l(s))}function o(e,...r){t||(t=!0,n(e,...r))}function l(e){o(null,e)}}(s,o)(...l):r(null,...l)}}(null,...n)},use:function(t){if("function"!=typeof t)throw new TypeError("Expected `middelware` to be a function, not "+t);return e.push(t),n}};return n}const vr={basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');kr(e);let t,r=0,o=-1,i=e.length;if(void 0===n||0===n.length||n.length>e.length){for(;i--;)if(47===e.codePointAt(i)){if(t){r=i+1;break}}else o<0&&(t=!0,o=i+1);return o<0?"":e.slice(r,o)}if(n===e)return"";let l=-1,s=n.length-1;for(;i--;)if(47===e.codePointAt(i)){if(t){r=i+1;break}}else l<0&&(t=!0,l=i+1),s>-1&&(e.codePointAt(i)===n.codePointAt(s--)?s<0&&(o=i):(s=-1,o=l));r===o?o=l:o<0&&(o=e.length);return e.slice(r,o)},dirname:function(e){if(kr(e),0===e.length)return".";let n,t=-1,r=e.length;for(;--r;)if(47===e.codePointAt(r)){if(n){t=r;break}}else n||(n=!0);return t<0?47===e.codePointAt(0)?"/":".":1===t&&47===e.codePointAt(0)?"//":e.slice(0,t)},extname:function(e){kr(e);let n,t=e.length,r=-1,o=0,i=-1,l=0;for(;t--;){const s=e.codePointAt(t);if(47!==s)r<0&&(n=!0,r=t+1),46===s?i<0?i=t:1!==l&&(l=1):i>-1&&(l=-1);else if(n){o=t+1;break}}if(i<0||r<0||0===l||1===l&&i===r-1&&i===o+1)return"";return e.slice(i,r)},join:function(...e){let n,t=-1;for(;++t2){if(r=o.lastIndexOf("/"),r!==o.length-1){r<0?(o="",i=0):(o=o.slice(0,r),i=o.length-1-o.lastIndexOf("/")),l=a,s=0;continue}}else if(o.length>0){o="",i=0,l=a,s=0;continue}n&&(o=o.length>0?o+"/..":"..",i=2)}else o.length>0?o+="/"+e.slice(l+1,a):o=e.slice(l+1,a),i=a-l-1;l=a,s=0}else 46===t&&s>-1?s++:s=-1}return o}(e,!n);0!==t.length||n||(t=".");t.length>0&&47===e.codePointAt(e.length-1)&&(t+="/");return n?"/"+t:t}(n)},sep:"/"};function kr(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const br={cwd:function(){return"/"}};function wr(e){return Boolean(null!==e&&"object"==typeof e&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&void 0===e.auth)}function Sr(e){if("string"==typeof e)e=new URL(e);else if(!wr(e)){const n=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw n.code="ERR_INVALID_ARG_TYPE",n}if("file:"!==e.protocol){const e=new TypeError("The URL must be of scheme file");throw e.code="ERR_INVALID_URL_SCHEME",e}return function(e){if(""!==e.hostname){const e=new TypeError('File URL host must be "localhost" or empty on darwin');throw e.code="ERR_INVALID_FILE_URL_HOST",e}const n=e.pathname;let t=-1;for(;++t0){let[r,...i]=n;const l=t[o][1];yr(l)&&yr(r)&&(r=gr(!0,l,r)),t[o]=[e,r,...i]}}}}const Lr=(new Dr).freeze();function Or(e,n){if("function"!=typeof n)throw new TypeError("Cannot `"+e+"` without `parser`")}function Fr(e,n){if("function"!=typeof n)throw new TypeError("Cannot `"+e+"` without `compiler`")}function Nr(e,n){if(n)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function Mr(e){if(!yr(e)||"string"!=typeof e.type)throw new TypeError("Expected node, got `"+e+"`")}function Rr(e,n,t){if(!t)throw new Error("`"+e+"` finished async. Use `"+n+"` instead")}function _r(e){return function(e){return Boolean(e&&"object"==typeof e&&"message"in e&&"messages"in e)}(e)?e:new Cr(e)}const Br=[],jr={allowDangerousHtml:!0},Hr=/^(https?|ircs?|mailto|xmpp)$/i,Ur=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"className",id:"remove-classname"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function Vr(e){const n=qr(e),t=Zr(e);return Yr(n.runSync(n.parse(t),t),e)}function qr(e){const n=e.rehypePlugins||Br,t=e.remarkPlugins||Br,r=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...jr}:jr;return Lr().use(Tt).use(t).use(hr,r).use(n)}function Zr(e){const n=e.children||"",t=new Cr;return"string"==typeof n&&(t.value=n),t}function Yr(e,n){const t=n.allowedElements,r=n.allowElement,o=n.components,i=n.disallowedElements,l=n.skipHtml,s=n.unwrapDisallowed,a=n.urlTransform||Wr;for(const u of Ur)Object.hasOwn(n,u.from)&&(u.from,u.to&&u.to,u.id);return Gt(e,(function(e,n,o){if("raw"===e.type&&o&&"number"==typeof n)return l?o.children.splice(n,1):o.children[n]={type:"text",value:e.value},n;if("element"===e.type){let n;for(n in ve)if(Object.hasOwn(ve,n)&&Object.hasOwn(e.properties,n)){const t=e.properties[n],r=ve[n];(null===r||r.includes(e.tagName))&&(e.properties[n]=a(String(t||""),n,e))}}if("element"===e.type){let l=t?!t.includes(e.tagName):!!i&&i.includes(e.tagName);if(!l&&r&&"number"==typeof n&&(l=!r(e,n,o)),l&&o&&"number"==typeof n)return s&&e.children?o.children.splice(n,1,...e.children):o.children.splice(n,1),n}})),ae(e,{Fragment:ke.Fragment,components:o,ignoreInvalidStyle:!0,jsx:ke.jsx,jsxs:ke.jsxs,passKeys:!0,passNode:!0})}function Wr(e){const n=e.indexOf(":"),t=e.indexOf("?"),r=e.indexOf("#"),o=e.indexOf("/");return-1===n||-1!==o&&n>o||-1!==t&&n>t||-1!==r&&n>r||Hr.test(e.slice(0,n))?e:""}}}]); \ No newline at end of file diff --git a/assets/js/275.40cb497e.js.LICENSE.txt b/assets/js/275.40cb497e.js.LICENSE.txt new file mode 100644 index 00000000..f02ba941 --- /dev/null +++ b/assets/js/275.40cb497e.js.LICENSE.txt @@ -0,0 +1,6 @@ +/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/2958.367a2044.js b/assets/js/2958.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/2958.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2964.367a2044.js b/assets/js/2964.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/2964.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2d462e6f.63cd139a.js b/assets/js/2d462e6f.63cd139a.js new file mode 100644 index 00000000..1f0491c5 --- /dev/null +++ b/assets/js/2d462e6f.63cd139a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9112],{14877:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>g,frontMatter:()=>l,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"mcp/cognee-mcp","title":"Cognee Extension","description":"Add Cognee MCP Server as a Goose Extension","source":"@site/docs/mcp/cognee-mcp.md","sourceDirName":"mcp","slug":"/mcp/cognee-mcp","permalink":"/goose/docs/mcp/cognee-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Cognee Extension","description":"Add Cognee MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Cloudinary Asset Management Extension","permalink":"/goose/docs/mcp/cloudinary-asset-management-mcp"},"next":{"title":"Computer Controller Extension","permalink":"/goose/docs/mcp/computer-controller-mcp"}}');var i=o(74848),s=o(28453),r=o(65537),a=o(79329);o(28799);const l={title:"Cognee Extension",description:"Add Cognee MCP Server as a Goose Extension"},d=void 0,c={},u=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function h(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Details:o}=n;return o||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,i.jsx)(n.a,{href:"https://github.com/topoteretes/cognee",children:"Cognee MCP Server"})," as a Goose extension to enable knowledge graph memory capabilities, connecting to over 30 data sources for enhanced context and retrieval."]}),"\n",(0,i.jsxs)(n.admonition,{title:"TLDR",type:"tip",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Command"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"uv --directory /path/to/cognee-mcp run python src/server.py\n"})}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Environment Variables"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"LLM_API_KEY: \nEMBEDDING_API_KEY: \n"})})]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Note that you'll need ",(0,i.jsx)(n.a,{href:"https://docs.astral.sh/uv/#installation",children:"uv"})," installed on your system to run this command, as it uses ",(0,i.jsx)(n.code,{children:"uv"}),"."]})}),"\n",(0,i.jsx)(r.A,{groupId:"interface",children:(0,i.jsxs)(a.A,{value:"cli",label:"Goose CLI",default:!0,children:[(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"First, install Cognee:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Clone and install Cognee\ngit clone https://github.com/topoteretes/cognee\ncd cognee-mcp\nuv sync --dev --all-extras --reinstall\n\n# On Linux, install additional dependencies\nsudo apt install -y libpq-dev python3-dev\n"})}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Run the ",(0,i.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsxs)(n.li,{children:["Choose to add a ",(0,i.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 Cognee\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Cognee\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 uv --directory /path/to/cognee-mcp run python src/server.py\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Cognee\n\u2502\n\u25c7 What command should be run?\n\u2502 uv --directory /path/to/cognee-mcp run python src/server.py\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 300\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"7",children:["\n",(0,i.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Cognee\n\u2502\n\u25c7 What command should be run?\n\u2502 uv --directory /path/to/cognee-mcp run python src/server.py\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n// highlight-start\n\u25c7 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"8",children:["\n",(0,i.jsx)(n.li,{children:"Add the required environment variables:"}),"\n"]}),(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["You'll need OpenAI API keys for both LLM and embedding models. ",(0,i.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"Get your API keys here"}),"."]})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Cognee\n \u2502\n \u25c7 What command should be run?\n \u2502 uv --directory /path/to/cognee-mcp run python src/server.py\n \u2502 \n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502 \n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 Yes \n \u2502\n \u25c7 Environment variable name:\n \u2502 LLM_API_KEY\n \u2502\n \u25c7 Environment variable value:\n \u2502 \u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n \u2502\n \u25c7 Add another environment variable?\n \u2502 Yes\n \u2502\n \u25c7 Environment variable name:\n \u2502 EMBEDDING_API_KEY\n \u2502\n \u25c7 Environment variable value:\n \u2502 \u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n \u2502\n \u25c7 Add another environment variable?\n \u2502 No \n // highlight-end\n \u2514 Added Cognee extension\n"})})]})}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsx)(n.p,{children:"Cognee provides knowledge graph memory capabilities for Goose, allowing it to remember and connect information across conversations and documents."}),"\n",(0,i.jsx)(n.admonition,{title:"LLM",type:"info",children:(0,i.jsx)(n.p,{children:"OpenAI's GPT-4o was used for this task."})}),"\n",(0,i.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:'Goose, please cognify this information: "I prefer Python for data analysis and use pandas extensively. My current project involves analyzing customer behavior data." Then search for information about my programming preferences.'})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,i.jsxs)(n.admonition,{title:"CLI",type:"note",children:[(0,i.jsxs)(o,{children:[(0,i.jsx)("summary",{children:"Tool Calls"}),(0,i.jsx)(n.p,{children:"\u2500\u2500\u2500 cognee_cognify | abcdefgh \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,i.jsx)(n.p,{children:"data: I prefer Python for data analysis and use pandas extensively. My current project involves analyzing customer behavior data."}),(0,i.jsx)(n.p,{children:"\u2500\u2500\u2500 cognee_search | abcdefgh \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,i.jsx)(n.p,{children:"search_query: programming preferences Python data analysis"}),(0,i.jsx)(n.p,{children:"search_type: GRAPH_COMPLETION"})]}),(0,i.jsx)(n.p,{children:"I'll help you store that information in the knowledge graph and then search for your programming preferences."}),(0,i.jsx)(n.p,{children:"First, let me cognify the information about your preferences:"}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Cognify Status:"}),"\nBackground process launched due to MCP timeout limitations. The information about your Python and pandas preferences for data analysis has been added to the knowledge graph."]}),(0,i.jsx)(n.p,{children:"Now let me search for information about your programming preferences:"}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Search Results:"}),"\nBased on the knowledge graph, I found information about your programming preferences:"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Language Preference"}),": You prefer Python for data analysis"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Key Libraries"}),": You use pandas extensively for data manipulation"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Current Focus"}),": Your current project involves analyzing customer behavior data"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Domain"}),": Data science and analytics workflows"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Technical Stack"}),": Python + pandas for data analysis tasks"]}),"\n"]}),(0,i.jsx)(n.p,{children:"The knowledge graph has successfully stored and can now retrieve your programming preferences and project context for future conversations."})]})]})}function g(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},79329:(e,n,o)=>{o.d(n,{A:()=>r});o(96540);var t=o(34164);const i={tabItem:"tabItem_Ymn6"};var s=o(74848);function r(e){let{children:n,hidden:o,className:r}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(i.tabItem,r),hidden:o,children:n})}},65537:(e,n,o)=>{o.d(n,{A:()=>w});var t=o(96540),i=o(34164),s=o(65627),r=o(56347),a=o(50372),l=o(30604),d=o(11861),c=o(78749);function u(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:o}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:o,attributes:t,default:i}}=e;return{value:n,label:o,attributes:t,default:i}}))}(o);return function(e){const n=(0,d.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,o])}function g(e){let{value:n,tabValues:o}=e;return o.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:o}=e;const i=(0,r.W6)(),s=function(e){let{queryString:n=!1,groupId:o}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!o)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return o??null}({queryString:n,groupId:o});return[(0,l.aZ)(s),(0,t.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(i.location.search);n.set(s,e),i.replace({...i.location,search:n.toString()})}),[s,i])]}function p(e){const{defaultValue:n,queryString:o=!1,groupId:i}=e,s=h(e),[r,l]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:o}=e;if(0===o.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!g({value:n,tabValues:o}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${o.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=o.find((e=>e.default))??o[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s}))),[d,u]=m({queryString:o,groupId:i}),[p,x]=function(e){let{groupId:n}=e;const o=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,s]=(0,c.Dv)(o);return[i,(0,t.useCallback)((e=>{o&&s.set(e)}),[o,s])]}({groupId:i}),f=(()=>{const e=d??p;return g({value:e,tabValues:s})?e:null})();(0,a.A)((()=>{f&&l(f)}),[f]);return{selectedValue:r,selectValue:(0,t.useCallback)((e=>{if(!g({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),x(e)}),[u,x,s]),tabValues:s}}var x=o(9136);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=o(74848);function j(e){let{className:n,block:o,selectedValue:t,selectValue:r,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),c=e=>{const n=e.currentTarget,o=l.indexOf(n),i=a[o].value;i!==t&&(d(n),r(i))},u=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const o=l.indexOf(e.currentTarget)+1;n=l[o]??l[0];break}case"ArrowLeft":{const o=l.indexOf(e.currentTarget)-1;n=l[o]??l[l.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":o},n),children:a.map((e=>{let{value:n,label:o,attributes:s}=e;return(0,y.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>{l.push(e)},onKeyDown:u,onClick:c,...s,className:(0,i.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":t===n}),children:o??n},n)}))})}function v(e){let{lazy:n,children:o,selectedValue:s}=e;const r=(Array.isArray(o)?o:[o]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,t.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function b(e){const n=p(e);return(0,y.jsxs)("div",{className:(0,i.A)("tabs-container",f.tabList),children:[(0,y.jsx)(j,{...n,...e}),(0,y.jsx)(v,{...n,...e})]})}function w(e){const n=(0,x.A)();return(0,y.jsx)(b,{...e,children:u(e.children)},String(n))}},28799:(e,n,o)=>{o.d(n,{A:()=>s});o(96540);var t=o(58069),i=o(74848);function s(e){let{name:n,command:o,timeout:s=300,envVars:r=[],infoNote:a}=e;const l=r.length>0,d=l?`Add environment variable${r.length>1?"s":""} for ${n}`:"Choose No when asked to add environment variables";return(0,i.jsxs)("div",{children:[(0,i.jsx)("ol",{children:(0,i.jsxs)("li",{children:["Run the ",(0,i.jsx)("code",{children:"configure"})," command:"]})}),(0,i.jsx)(t.A,{language:"sh",children:"goose configure"}),(0,i.jsx)("ol",{start:2,children:(0,i.jsxs)("li",{children:["Choose to add a ",(0,i.jsx)("code",{children:"Command-line Extension"}),"."]})}),(0,i.jsx)(t.A,{language:"sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c6 What type of extension would you like to add?\n\u2502 \u25cb Built-in Extension \n// highlight-start \n\u2502 \u25cf Command-line Extension (Run a local command or script)\n// highlight-end \n\u2502 \u25cb Remote Extension \n\u2514"}),(0,i.jsx)("ol",{start:3,children:(0,i.jsx)("li",{children:"Give your extension a name."})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n// highlight-start\n\u25c6 What would you like to call this extension?\n\u2502 ${n}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:4,children:(0,i.jsx)("li",{children:"Enter the command to run when this extension is used."})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n// highlight-start\n\u25c6 What command should be run?\n\u2502 ${o}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:5,children:(0,i.jsxs)("li",{children:["Enter the number of seconds Goose should wait for actions to complete before timing out. Default is ",(0,i.jsx)("code",{children:"300"})," seconds."]})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:6,children:(0,i.jsxs)("li",{children:["Choose to add a description. If you select ",(0,i.jsx)("code",{children:"Yes"}),", you\u2019ll be prompted to enter a description for the extension."]})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n// highlight-start\n\u25c6 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:7,children:(0,i.jsx)("li",{children:d})}),!l&&(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n\u25c7 Would you like to add a description?\n\u2502 No\n\u2502\n// highlight-start\n\u25c6 Would you like to add environment variables?\n\u2502 No\n// highlight-end\n\u2514 Added ${n} extension`}),l&&(0,i.jsxs)(i.Fragment,{children:[a&&(0,i.jsx)("div",{className:"alert alert--info",children:a}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n\u25c7 Would you like to add a description?\n\u2502 No\n\u2502\n// highlight-start\n\u25c6 Would you like to add environment variables?\n\u2502 Yes\n${r.map(((e,n)=>{let{key:o,value:t}=e;return`\u2502\n\u25c7 Environment variable name:\n\u2502 ${o}\n\u2502\n\u25c7 Environment variable value:\n\u2502 ${t}\n\u2502\n\u25c7 Add another environment variable?\n\u2502 ${n===r.length-1?"No":"Yes"}`})).join("\n")}\n// highlight-end\n\u2514 Added ${n} extension`})]})]})}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>a});var t=o(96540);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3042.8882fd3c.js b/assets/js/3042.8882fd3c.js new file mode 100644 index 00000000..d252bf29 --- /dev/null +++ b/assets/js/3042.8882fd3c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3042],{65932:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var o=n(34164),i=n(50539),s=n(9303),r=n(74848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,o.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(i.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(i.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(i.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},73042:(e,t,n)=>{n.r(t),n.d(t,{default:()=>l});n(96540);var o=n(50539),i=n(81082),s=n(43938),r=n(65932),a=n(74848);function l(){const e=(0,o.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/3099.80faf26d.js b/assets/js/3099.80faf26d.js new file mode 100644 index 00000000..02116eaf --- /dev/null +++ b/assets/js/3099.80faf26d.js @@ -0,0 +1,2 @@ +/*! For license information please see 3099.80faf26d.js.LICENSE.txt */ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3099],{89120:(t,e,n)=>{n.d(e,{xQ:()=>o});var i=n(96540),s=n(86719);function o(t=!0){const e=(0,i.useContext)(s.t);if(null===e)return[!0,null];const{isPresent:n,onExitComplete:o,register:r}=e,a=(0,i.useId)();(0,i.useEffect)((()=>{t&&r(a)}),[t]);const l=(0,i.useCallback)((()=>t&&o&&o(a)),[a,o,t]);return!n&&o?[!1,l]:[!0]}},29473:(t,e,n)=>{n.d(e,{L:()=>i});const i=(0,n(96540).createContext)({})},35446:(t,e,n)=>{n.d(e,{Q:()=>i});const i=(0,n(96540).createContext)({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"})},86719:(t,e,n)=>{n.d(e,{t:()=>i});const i=(0,n(96540).createContext)(null)},51657:(t,e,n)=>{function i(t){if("undefined"==typeof Proxy)return t;const e=new Map;return new Proxy(((...e)=>t(...e)),{get:(n,i)=>"create"===i?t:(e.has(i)||e.set(i,t(i)),e.get(i))})}function s(t){return null!==t&&"object"==typeof t&&"function"==typeof t.start}n.d(e,{P:()=>ea});const o=t=>Array.isArray(t);function r(t,e){if(!Array.isArray(e))return!1;const n=e.length;if(n!==t.length)return!1;for(let i=0;i{e[0][n]=t.get(),e[1][n]=t.getVelocity()})),e}function u(t,e,n,i){if("function"==typeof e){const[s,o]=l(i);e=e(void 0!==n?n:t.custom,s,o)}if("string"==typeof e&&(e=t.variants&&t.variants[e]),"function"==typeof e){const[s,o]=l(i);e=e(void 0!==n?n:t.custom,s,o)}return e}function c(t,e,n){const i=t.getProps();return u(i,e,void 0!==n?n:i.custom,t)}const h=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],d=["initial",...h];function p(t){let e;return()=>(void 0===e&&(e=t()),e)}const m=p((()=>void 0!==window.ScrollTimeline));class f{constructor(t){this.stop=()=>this.runAll("stop"),this.animations=t.filter(Boolean)}get finished(){return Promise.all(this.animations.map((t=>"finished"in t?t.finished:t)))}getAll(t){return this.animations[0][t]}setAll(t,e){for(let n=0;nm()&&n.attachTimeline?n.attachTimeline(t):"function"==typeof e?e(n):void 0));return()=>{n.forEach(((t,e)=>{t&&t(),this.animations[e].stop()}))}}get time(){return this.getAll("time")}set time(t){this.setAll("time",t)}get speed(){return this.getAll("speed")}set speed(t){this.setAll("speed",t)}get startTime(){return this.getAll("startTime")}get duration(){let t=0;for(let e=0;ee[t]()))}flatten(){this.runAll("flatten")}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}class v extends f{then(t,e){return Promise.all(this.animations).then(t).catch(e)}}function g(t,e){return t?t[e]||t.default||t:void 0}const y=2e4;function x(t){let e=0;let n=t.next(e);for(;!n.done&&e=y?1/0:e}function P(t){return"function"==typeof t}function w(t,e){t.timeline=e,t.onfinish=null}const T=t=>Array.isArray(t)&&"number"==typeof t[0],S={linearEasing:void 0};function b(t,e){const n=p(t);return()=>{var t;return null!==(t=S[e])&&void 0!==t?t:n()}}const A=b((()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch(t){return!1}return!0}),"linearEasing"),E=(t,e,n)=>{const i=e-t;return 0===i?1:(n-t)/i},V=(t,e,n=10)=>{let i="";const s=Math.max(Math.round(e/n),2);for(let o=0;o`cubic-bezier(${t}, ${e}, ${n}, ${i})`,D={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:M([0,.65,.55,1]),circOut:M([.55,0,1,.45]),backIn:M([.31,.01,.66,-.59]),backOut:M([.33,1.53,.69,.99])};function k(t,e){return t?"function"==typeof t&&A()?V(t,e):T(t)?M(t):Array.isArray(t)?t.map((t=>k(t,e)||D.easeOut)):D[t]:void 0}const R={x:!1,y:!1};function L(){return R.x||R.y}function j(t,e){const n=function(t,e,n){var i;if(t instanceof Element)return[t];if("string"==typeof t){let s=document;e&&(s=e.current);const o=null!==(i=null==n?void 0:n[t])&&void 0!==i?i:s.querySelectorAll(t);return o?Array.from(o):[]}return Array.from(t)}(t),i=new AbortController;return[n,{passive:!0,...e,signal:i.signal},()=>i.abort()]}function B(t){return e=>{"touch"===e.pointerType||L()||t(e)}}const F=(t,e)=>!!e&&(t===e||F(t,e.parentElement)),O=t=>"mouse"===t.pointerType?"number"!=typeof t.button||t.button<=0:!1!==t.isPrimary,I=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);const U=new WeakSet;function N(t){return e=>{"Enter"===e.key&&t(e)}}function $(t,e){t.dispatchEvent(new PointerEvent("pointer"+e,{isPrimary:!0,bubbles:!0}))}function W(t){return O(t)&&!L()}function z(t,e,n={}){const[i,s,o]=j(t,n),r=t=>{const i=t.currentTarget;if(!W(t)||U.has(i))return;U.add(i);const o=e(t),r=(t,e)=>{window.removeEventListener("pointerup",a),window.removeEventListener("pointercancel",l),W(t)&&U.has(i)&&(U.delete(i),"function"==typeof o&&o(t,{success:e}))},a=t=>{r(t,n.useGlobalTarget||F(i,t.target))},l=t=>{r(t,!1)};window.addEventListener("pointerup",a,s),window.addEventListener("pointercancel",l,s)};return i.forEach((t=>{(function(t){return I.has(t.tagName)||-1!==t.tabIndex})(t)||null!==t.getAttribute("tabindex")||(t.tabIndex=0);(n.useGlobalTarget?window:t).addEventListener("pointerdown",r,s),t.addEventListener("focus",(t=>((t,e)=>{const n=t.currentTarget;if(!n)return;const i=N((()=>{if(U.has(n))return;$(n,"down");const t=N((()=>{$(n,"up")}));n.addEventListener("keyup",t,e),n.addEventListener("blur",(()=>$(n,"cancel")),e)}));n.addEventListener("keydown",i,e),n.addEventListener("blur",(()=>n.removeEventListener("keydown",i)),e)})(t,s)),s)})),o}const K=t=>1e3*t,Y=t=>t/1e3,X=t=>t;const H=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],G=new Set(H),q=new Set(["width","height","top","left","right","bottom",...H]),Z=!1,_=!1;const Q=["read","resolveKeyframes","update","preRender","render","postRender"];function J(t,e){let n=!1,i=!0;const s={delta:0,timestamp:0,isProcessing:!1},o=()=>n=!0,r=Q.reduce(((t,e)=>(t[e]=function(t){let e=new Set,n=new Set,i=!1,s=!1;const o=new WeakSet;let r={delta:0,timestamp:0,isProcessing:!1};function a(e){o.has(e)&&(l.schedule(e),t()),e(r)}const l={schedule:(t,s=!1,r=!1)=>{const a=r&&i?e:n;return s&&o.add(t),a.has(t)||a.add(t),t},cancel:t=>{n.delete(t),o.delete(t)},process:t=>{r=t,i?s=!0:(i=!0,[e,n]=[n,e],e.forEach(a),e.clear(),i=!1,s&&(s=!1,l.process(t)))}};return l}(o),t)),{}),{read:a,resolveKeyframes:l,update:u,preRender:c,render:h,postRender:d}=r,p=()=>{const o=_?s.timestamp:performance.now();n=!1,s.delta=i?1e3/60:Math.max(Math.min(o-s.timestamp,40),1),s.timestamp=o,s.isProcessing=!0,a.process(s),l.process(s),u.process(s),c.process(s),h.process(s),d.process(s),s.isProcessing=!1,n&&e&&(i=!1,t(p))};return{schedule:Q.reduce(((e,o)=>{const a=r[o];return e[o]=(e,o=!1,r=!1)=>(n||(n=!0,i=!0,s.isProcessing||t(p)),a.schedule(e,o,r)),e}),{}),cancel:t=>{for(let e=0;e(void 0===st&&rt.set(nt.isProcessing||_?nt.timestamp:performance.now()),st),set:t=>{st=t,queueMicrotask(ot)}};function at(t,e){-1===t.indexOf(e)&&t.push(e)}function lt(t,e){const n=t.indexOf(e);n>-1&&t.splice(n,1)}class ut{constructor(){this.subscriptions=[]}add(t){return at(this.subscriptions,t),()=>lt(this.subscriptions,t)}notify(t,e,n){const i=this.subscriptions.length;if(i)if(1===i)this.subscriptions[0](t,e,n);else for(let s=0;s{const n=rt.now();this.updatedAt!==n&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(t),this.current!==this.prev&&this.events.change&&this.events.change.notify(this.current),e&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.hasAnimated=!1,this.setCurrent(t),this.owner=e.owner}setCurrent(t){var e;this.current=t,this.updatedAt=rt.now(),null===this.canTrackVelocity&&void 0!==t&&(this.canTrackVelocity=(e=this.current,!isNaN(parseFloat(e))))}setPrevFrameValue(t=this.current){this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt}onChange(t){return this.on("change",t)}on(t,e){this.events[t]||(this.events[t]=new ut);const n=this.events[t].add(e);return"change"===t?()=>{n(),tt.read((()=>{this.events.change.getSize()||this.stop()}))}:n}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,e){this.passiveEffect=t,this.stopPassiveEffect=e}set(t,e=!0){e&&this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t,e)}setWithVelocity(t,e,n){this.set(e),this.prev=void 0,this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt-n}jump(t,e=!0){this.updateAndNotify(t),this.prev=t,this.prevUpdatedAt=this.prevFrameValue=void 0,e&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return ht.current&&ht.current.push(this),this.current}getPrevious(){return this.prev}getVelocity(){const t=rt.now();if(!this.canTrackVelocity||void 0===this.prevFrameValue||t-this.updatedAt>30)return 0;const e=Math.min(this.updatedAt-this.prevUpdatedAt,30);return ct(parseFloat(this.current)-parseFloat(this.prevFrameValue),e)}start(t){return this.stop(),new Promise((e=>{this.hasAnimated=!0,this.animation=t(e),this.events.animationStart&&this.events.animationStart.notify()})).then((()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()}))}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function pt(t,e){return new dt(t,e)}function mt(t,e,n){t.hasValue(e)?t.getValue(e).set(n):t.addValue(e,pt(n))}const ft=t=>Boolean(t&&t.getVelocity);function vt(t,e){const n=t.getValue("willChange");if(i=n,Boolean(ft(i)&&i.add))return n.add(e);var i}const gt=t=>t.replace(/([a-z])([A-Z])/gu,"$1-$2").toLowerCase(),yt="data-"+gt("framerAppearId");function xt(t){return t.props[yt]}const Pt=!1,wt=(t,e,n)=>(((1-3*n+3*e)*t+(3*n-6*e))*t+3*e)*t;function Tt(t,e,n,i){if(t===e&&n===i)return X;const s=e=>function(t,e,n,i,s){let o,r,a=0;do{r=e+(n-e)/2,o=wt(r,i,s)-t,o>0?n=r:e=r}while(Math.abs(o)>1e-7&&++a<12);return r}(e,0,1,t,n);return t=>0===t||1===t?t:wt(s(t),e,i)}const St=t=>e=>e<=.5?t(2*e)/2:(2-t(2*(1-e)))/2,bt=t=>e=>1-t(1-e),At=Tt(.33,1.53,.69,.99),Et=bt(At),Vt=St(Et),Ct=t=>(t*=2)<1?.5*Et(t):.5*(2-Math.pow(2,-10*(t-1))),Mt=t=>1-Math.sin(Math.acos(t)),Dt=bt(Mt),kt=St(Mt),Rt=t=>/^0[^.\s]+$/u.test(t);const Lt=(t,e,n)=>n>e?e:n"number"==typeof t,parse:parseFloat,transform:t=>t},Bt={...jt,transform:t=>Lt(0,1,t)},Ft={...jt,default:1},Ot=t=>Math.round(1e5*t)/1e5,It=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;const Ut=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,Nt=(t,e)=>n=>Boolean("string"==typeof n&&Ut.test(n)&&n.startsWith(t)||e&&!function(t){return null==t}(n)&&Object.prototype.hasOwnProperty.call(n,e)),$t=(t,e,n)=>i=>{if("string"!=typeof i)return i;const[s,o,r,a]=i.match(It);return{[t]:parseFloat(s),[e]:parseFloat(o),[n]:parseFloat(r),alpha:void 0!==a?parseFloat(a):1}},Wt={...jt,transform:t=>Math.round((t=>Lt(0,255,t))(t))},zt={test:Nt("rgb","red"),parse:$t("red","green","blue"),transform:({red:t,green:e,blue:n,alpha:i=1})=>"rgba("+Wt.transform(t)+", "+Wt.transform(e)+", "+Wt.transform(n)+", "+Ot(Bt.transform(i))+")"};const Kt={test:Nt("#"),parse:function(t){let e="",n="",i="",s="";return t.length>5?(e=t.substring(1,3),n=t.substring(3,5),i=t.substring(5,7),s=t.substring(7,9)):(e=t.substring(1,2),n=t.substring(2,3),i=t.substring(3,4),s=t.substring(4,5),e+=e,n+=n,i+=i,s+=s),{red:parseInt(e,16),green:parseInt(n,16),blue:parseInt(i,16),alpha:s?parseInt(s,16)/255:1}},transform:zt.transform},Yt=t=>({test:e=>"string"==typeof e&&e.endsWith(t)&&1===e.split(" ").length,parse:parseFloat,transform:e=>`${e}${t}`}),Xt=Yt("deg"),Ht=Yt("%"),Gt=Yt("px"),qt=Yt("vh"),Zt=Yt("vw"),_t={...Ht,parse:t=>Ht.parse(t)/100,transform:t=>Ht.transform(100*t)},Qt={test:Nt("hsl","hue"),parse:$t("hue","saturation","lightness"),transform:({hue:t,saturation:e,lightness:n,alpha:i=1})=>"hsla("+Math.round(t)+", "+Ht.transform(Ot(e))+", "+Ht.transform(Ot(n))+", "+Ot(Bt.transform(i))+")"},Jt={test:t=>zt.test(t)||Kt.test(t)||Qt.test(t),parse:t=>zt.test(t)?zt.parse(t):Qt.test(t)?Qt.parse(t):Kt.parse(t),transform:t=>"string"==typeof t?t:t.hasOwnProperty("red")?zt.transform(t):Qt.transform(t)},te=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;const ee="number",ne="color",ie=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function se(t){const e=t.toString(),n=[],i={color:[],number:[],var:[]},s=[];let o=0;const r=e.replace(ie,(t=>(Jt.test(t)?(i.color.push(o),s.push(ne),n.push(Jt.parse(t))):t.startsWith("var(")?(i.var.push(o),s.push("var"),n.push(t)):(i.number.push(o),s.push(ee),n.push(parseFloat(t))),++o,"${}"))).split("${}");return{values:n,split:r,indexes:i,types:s}}function oe(t){return se(t).values}function re(t){const{split:e,types:n}=se(t),i=e.length;return t=>{let s="";for(let o=0;o"number"==typeof t?0:t;const le={test:function(t){var e,n;return isNaN(t)&&"string"==typeof t&&((null===(e=t.match(It))||void 0===e?void 0:e.length)||0)+((null===(n=t.match(te))||void 0===n?void 0:n.length)||0)>0},parse:oe,createTransformer:re,getAnimatableNone:function(t){const e=oe(t);return re(t)(e.map(ae))}},ue=new Set(["brightness","contrast","saturate","opacity"]);function ce(t){const[e,n]=t.slice(0,-1).split("(");if("drop-shadow"===e)return t;const[i]=n.match(It)||[];if(!i)return t;const s=n.replace(i,"");let o=ue.has(e)?1:0;return i!==n&&(o*=100),e+"("+o+s+")"}const he=/\b([a-z-]*)\(.*?\)/gu,de={...le,getAnimatableNone:t=>{const e=t.match(he);return e?e.map(ce).join(" "):t}},pe={borderWidth:Gt,borderTopWidth:Gt,borderRightWidth:Gt,borderBottomWidth:Gt,borderLeftWidth:Gt,borderRadius:Gt,radius:Gt,borderTopLeftRadius:Gt,borderTopRightRadius:Gt,borderBottomRightRadius:Gt,borderBottomLeftRadius:Gt,width:Gt,maxWidth:Gt,height:Gt,maxHeight:Gt,top:Gt,right:Gt,bottom:Gt,left:Gt,padding:Gt,paddingTop:Gt,paddingRight:Gt,paddingBottom:Gt,paddingLeft:Gt,margin:Gt,marginTop:Gt,marginRight:Gt,marginBottom:Gt,marginLeft:Gt,backgroundPositionX:Gt,backgroundPositionY:Gt},me={rotate:Xt,rotateX:Xt,rotateY:Xt,rotateZ:Xt,scale:Ft,scaleX:Ft,scaleY:Ft,scaleZ:Ft,skew:Xt,skewX:Xt,skewY:Xt,distance:Gt,translateX:Gt,translateY:Gt,translateZ:Gt,x:Gt,y:Gt,z:Gt,perspective:Gt,transformPerspective:Gt,opacity:Bt,originX:_t,originY:_t,originZ:Gt},fe={...jt,transform:Math.round},ve={...pe,...me,zIndex:fe,size:Gt,fillOpacity:Bt,strokeOpacity:Bt,numOctaves:fe},ge={...ve,color:Jt,backgroundColor:Jt,outlineColor:Jt,fill:Jt,stroke:Jt,borderColor:Jt,borderTopColor:Jt,borderRightColor:Jt,borderBottomColor:Jt,borderLeftColor:Jt,filter:de,WebkitFilter:de},ye=t=>ge[t];function xe(t,e){let n=ye(t);return n!==de&&(n=le),n.getAnimatableNone?n.getAnimatableNone(e):void 0}const Pe=new Set(["auto","none","0"]);const we=t=>t===jt||t===Gt,Te=(t,e)=>parseFloat(t.split(", ")[e]),Se=(t,e)=>(n,{transform:i})=>{if("none"===i||!i)return 0;const s=i.match(/^matrix3d\((.+)\)$/u);if(s)return Te(s[1],e);{const e=i.match(/^matrix\((.+)\)$/u);return e?Te(e[1],t):0}},be=new Set(["x","y","z"]),Ae=H.filter((t=>!be.has(t)));const Ee={width:({x:t},{paddingLeft:e="0",paddingRight:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),height:({y:t},{paddingTop:e="0",paddingBottom:n="0"})=>t.max-t.min-parseFloat(e)-parseFloat(n),top:(t,{top:e})=>parseFloat(e),left:(t,{left:e})=>parseFloat(e),bottom:({y:t},{top:e})=>parseFloat(e)+(t.max-t.min),right:({x:t},{left:e})=>parseFloat(e)+(t.max-t.min),x:Se(4,13),y:Se(5,14)};Ee.translateX=Ee.x,Ee.translateY=Ee.y;const Ve=new Set;let Ce=!1,Me=!1;function De(){if(Me){const t=Array.from(Ve).filter((t=>t.needsMeasurement)),e=new Set(t.map((t=>t.element))),n=new Map;e.forEach((t=>{const e=function(t){const e=[];return Ae.forEach((n=>{const i=t.getValue(n);void 0!==i&&(e.push([n,i.get()]),i.set(n.startsWith("scale")?1:0))})),e}(t);e.length&&(n.set(t,e),t.render())})),t.forEach((t=>t.measureInitialState())),e.forEach((t=>{t.render();const e=n.get(t);e&&e.forEach((([e,n])=>{var i;null===(i=t.getValue(e))||void 0===i||i.set(n)}))})),t.forEach((t=>t.measureEndState())),t.forEach((t=>{void 0!==t.suspendedScrollY&&window.scrollTo(0,t.suspendedScrollY)}))}Me=!1,Ce=!1,Ve.forEach((t=>t.complete())),Ve.clear()}function ke(){Ve.forEach((t=>{t.readKeyframes(),t.needsMeasurement&&(Me=!0)}))}class Re{constructor(t,e,n,i,s,o=!1){this.isComplete=!1,this.isAsync=!1,this.needsMeasurement=!1,this.isScheduled=!1,this.unresolvedKeyframes=[...t],this.onComplete=e,this.name=n,this.motionValue=i,this.element=s,this.isAsync=o}scheduleResolve(){this.isScheduled=!0,this.isAsync?(Ve.add(this),Ce||(Ce=!0,tt.read(ke),tt.resolveKeyframes(De))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:t,name:e,element:n,motionValue:i}=this;for(let s=0;s/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(t),Fe=t=>e=>"string"==typeof e&&e.startsWith(t),Oe=Fe("--"),Ie=Fe("var(--"),Ue=t=>!!Ie(t)&&Ne.test(t.split("/*")[0].trim()),Ne=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu,$e=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function We(t,e,n=1){je(n<=4,`Max CSS variable fallback depth detected in property "${t}". This may indicate a circular fallback dependency.`);const[i,s]=function(t){const e=$e.exec(t);if(!e)return[,];const[,n,i,s]=e;return[`--${null!=n?n:i}`,s]}(t);if(!i)return;const o=window.getComputedStyle(e).getPropertyValue(i);if(o){const t=o.trim();return Be(t)?parseFloat(t):t}return Ue(s)?We(s,e,n+1):s}const ze=t=>e=>e.test(t),Ke=[jt,Gt,Ht,Xt,Zt,qt,{test:t=>"auto"===t,parse:t=>t}],Ye=t=>Ke.find(ze(t));class Xe extends Re{constructor(t,e,n,i,s){super(t,e,n,i,s,!0)}readKeyframes(){const{unresolvedKeyframes:t,element:e,name:n}=this;if(!e||!e.current)return;super.readKeyframes();for(let a=0;a{e.getValue(t).set(n)})),this.resolveNoneKeyframes()}}const He=(t,e)=>"zIndex"!==e&&(!("number"!=typeof t&&!Array.isArray(t))||!("string"!=typeof t||!le.test(t)&&"0"!==t||t.startsWith("url(")));function Ge(t,e,n,i){const s=t[0];if(null===s)return!1;if("display"===e||"visibility"===e)return!0;const o=t[t.length-1],r=He(s,e),a=He(o,e);return Le(r===a,`You are trying to animate ${e} from "${s}" to "${o}". ${s} is not an animatable value - to enable this animation set ${s} to a value animatable to ${o} via the \`style\` property.`),!(!r||!a)&&(function(t){const e=t[0];if(1===t.length)return!0;for(let n=0;nnull!==t;function Ze(t,{repeat:e,repeatType:n="loop"},i){const s=t.filter(qe),o=e&&"loop"!==n&&e%2==1?0:s.length-1;return o&&void 0!==i?i:s[o]}class _e{constructor({autoplay:t=!0,delay:e=0,type:n="keyframes",repeat:i=0,repeatDelay:s=0,repeatType:o="loop",...r}){this.isStopped=!1,this.hasAttemptedResolve=!1,this.createdAt=rt.now(),this.options={autoplay:t,delay:e,type:n,repeat:i,repeatDelay:s,repeatType:o,...r},this.updateFinishedPromise()}calcStartTime(){return this.resolvedAt&&this.resolvedAt-this.createdAt>40?this.resolvedAt:this.createdAt}get resolved(){return this._resolved||this.hasAttemptedResolve||(ke(),De()),this._resolved}onKeyframesResolved(t,e){this.resolvedAt=rt.now(),this.hasAttemptedResolve=!0;const{name:n,type:i,velocity:s,delay:o,onComplete:r,onUpdate:a,isGenerator:l}=this.options;if(!l&&!Ge(t,n,i,s)){if(Pt||!o)return a&&a(Ze(t,this.options,e)),r&&r(),void this.resolveFinishedPromise();this.options.duration=0}const u=this.initPlayback(t,e);!1!==u&&(this._resolved={keyframes:t,finalKeyframe:e,...u},this.onPostResolved())}onPostResolved(){}then(t,e){return this.currentFinishedPromise.then(t,e)}flatten(){this.options.type="keyframes",this.options.ease="linear"}updateFinishedPromise(){this.currentFinishedPromise=new Promise((t=>{this.resolveFinishedPromise=t}))}}const Qe=(t,e,n)=>t+(e-t)*n;function Je(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}function tn(t,e){return n=>n>0?e:t}const en=(t,e,n)=>{const i=t*t,s=n*(e*e-i)+i;return s<0?0:Math.sqrt(s)},nn=[Kt,zt,Qt];function sn(t){const e=(n=t,nn.find((t=>t.test(n))));var n;if(Le(Boolean(e),`'${t}' is not an animatable color. Use the equivalent color code instead.`),!Boolean(e))return!1;let i=e.parse(t);return e===Qt&&(i=function({hue:t,saturation:e,lightness:n,alpha:i}){t/=360,n/=100;let s=0,o=0,r=0;if(e/=100){const i=n<.5?n*(1+e):n+e-n*e,a=2*n-i;s=Je(a,i,t+1/3),o=Je(a,i,t),r=Je(a,i,t-1/3)}else s=o=r=n;return{red:Math.round(255*s),green:Math.round(255*o),blue:Math.round(255*r),alpha:i}}(i)),i}const on=(t,e)=>{const n=sn(t),i=sn(e);if(!n||!i)return tn(t,e);const s={...n};return t=>(s.red=en(n.red,i.red,t),s.green=en(n.green,i.green,t),s.blue=en(n.blue,i.blue,t),s.alpha=Qe(n.alpha,i.alpha,t),zt.transform(s))},rn=(t,e)=>n=>e(t(n)),an=(...t)=>t.reduce(rn),ln=new Set(["none","hidden"]);function un(t,e){return n=>Qe(t,e,n)}function cn(t){return"number"==typeof t?un:"string"==typeof t?Ue(t)?tn:Jt.test(t)?on:pn:Array.isArray(t)?hn:"object"==typeof t?Jt.test(t)?on:dn:tn}function hn(t,e){const n=[...t],i=n.length,s=t.map(((t,n)=>cn(t)(t,e[n])));return t=>{for(let e=0;e{for(const e in i)n[e]=i[e](t);return n}}const pn=(t,e)=>{const n=le.createTransformer(e),i=se(t),s=se(e);return i.indexes.var.length===s.indexes.var.length&&i.indexes.color.length===s.indexes.color.length&&i.indexes.number.length>=s.indexes.number.length?ln.has(t)&&!s.values.length||ln.has(e)&&!i.values.length?function(t,e){return ln.has(t)?n=>n<=0?t:e:n=>n>=1?e:t}(t,e):an(hn(function(t,e){var n;const i=[],s={color:0,var:0,number:0};for(let o=0;o{const i=e*r,s=i*t,o=i-n,a=Rn(e,r),l=Math.exp(-s);return Mn-o/a*l},o=e=>{const i=e*r*t,o=i*n+n,a=Math.pow(r,2)*Math.pow(e,2)*t,l=Math.exp(-i),u=Rn(Math.pow(e,2),r);return(-s(e)+Mn>0?-1:1)*((o-a)*l)/u}):(s=e=>Math.exp(-e*t)*((e-n)*t+1)-.001,o=e=>Math.exp(-e*t)*(t*t*(n-e)));const a=function(t,e,n){let i=n;for(let s=1;svoid 0!==t[e]))}function Fn(t=Tn,e=wn){const n="object"!=typeof t?{visualDuration:t,keyframes:[0,1],bounce:e}:t;let{restSpeed:i,restDelta:s}=n;const o=n.keyframes[0],r=n.keyframes[n.keyframes.length-1],a={done:!1,value:o},{stiffness:l,damping:u,mass:c,duration:h,velocity:d,isResolvedFromDuration:p}=function(t){let e={velocity:xn,stiffness:vn,damping:gn,mass:yn,isResolvedFromDuration:!1,...t};if(!Bn(t,jn)&&Bn(t,Ln))if(t.visualDuration){const n=t.visualDuration,i=2*Math.PI/(1.2*n),s=i*i,o=2*Lt(.05,1,1-(t.bounce||0))*Math.sqrt(s);e={...e,mass:yn,stiffness:s,damping:o}}else{const n=Dn(t);e={...e,...n,mass:yn},e.isResolvedFromDuration=!0}return e}({...n,velocity:-Y(n.velocity||0)}),m=d||0,f=u/(2*Math.sqrt(l*c)),v=r-o,g=Y(Math.sqrt(l/c)),P=Math.abs(v)<5;let w;if(i||(i=P?Sn.granular:Sn.default),s||(s=P?bn.granular:bn.default),f<1){const t=Rn(g,f);w=e=>{const n=Math.exp(-f*g*e);return r-n*((m+f*g*v)/t*Math.sin(t*e)+v*Math.cos(t*e))}}else if(1===f)w=t=>r-Math.exp(-g*t)*(v+(m+g*v)*t);else{const t=g*Math.sqrt(f*f-1);w=e=>{const n=Math.exp(-f*g*e),i=Math.min(t*e,300);return r-n*((m+f*g*v)*Math.sinh(i)+t*v*Math.cosh(i))/t}}const T={calculatedDuration:p&&h||null,next:t=>{const e=w(t);if(p)a.done=t>=h;else{let n=0;f<1&&(n=0===t?K(m):fn(w,t,e));const o=Math.abs(n)<=i,l=Math.abs(r-e)<=s;a.done=o&&l}return a.value=a.done?r:e,a},toString:()=>{const t=Math.min(x(T),y),e=V((e=>T.next(t*e).value),t,30);return t+"ms "+e}};return T}function On({keyframes:t,velocity:e=0,power:n=.8,timeConstant:i=325,bounceDamping:s=10,bounceStiffness:o=500,modifyTarget:r,min:a,max:l,restDelta:u=.5,restSpeed:c}){const h=t[0],d={done:!1,value:h},p=t=>void 0===a?l:void 0===l||Math.abs(a-t)-m*Math.exp(-t/i),y=t=>v+g(t),x=t=>{const e=g(t),n=y(t);d.done=Math.abs(e)<=u,d.value=d.done?v:n};let P,w;const T=t=>{var e;(e=d.value,void 0!==a&&el)&&(P=t,w=Fn({keyframes:[d.value,p(d.value)],velocity:fn(y,t,d.value),damping:s,stiffness:o,restDelta:u,restSpeed:c}))};return T(0),{calculatedDuration:null,next:t=>{let e=!1;return w||void 0!==P||(e=!0,x(t),T(t)),void 0!==P&&t>=P?w.next(t-P):(!e&&x(t),d)}}}const In=Tt(.42,0,1,1),Un=Tt(0,0,.58,1),Nn=Tt(.42,0,.58,1),$n={linear:X,easeIn:In,easeInOut:Nn,easeOut:Un,circIn:Mt,circInOut:kt,circOut:Dt,backIn:Et,backInOut:Vt,backOut:At,anticipate:Ct},Wn=t=>{if(T(t)){je(4===t.length,"Cubic bezier arrays must contain four numerical values.");const[e,n,i,s]=t;return Tt(e,n,i,s)}return"string"==typeof t?(je(void 0!==$n[t],`Invalid easing type '${t}'`),$n[t]):t};function zn(t,e,{clamp:n=!0,ease:i,mixer:s}={}){const o=t.length;if(je(o===e.length,"Both input and output ranges must be the same length"),1===o)return()=>e[0];if(2===o&&e[0]===e[1])return()=>e[1];const r=t[0]===t[1];t[0]>t[o-1]&&(t=[...t].reverse(),e=[...e].reverse());const a=function(t,e,n){const i=[],s=n||mn,o=t.length-1;for(let r=0;r{if(r&&n1)for(;iu(Lt(t[0],t[o-1],e)):u}function Kn(t){const e=[0];return function(t,e){const n=t[t.length-1];for(let i=1;i<=e;i++){const s=E(0,e,i);t.push(Qe(n,1,s))}}(e,t.length-1),e}function Yn({duration:t=300,keyframes:e,times:n,ease:i="easeInOut"}){const s=(t=>Array.isArray(t)&&"number"!=typeof t[0])(i)?i.map(Wn):Wn(i),o={done:!1,value:e[0]},r=function(t,e){return t.map((t=>t*e))}(n&&n.length===e.length?n:Kn(e),t),a=zn(r,e,{ease:Array.isArray(s)?s:(l=e,u=s,l.map((()=>u||Nn)).splice(0,l.length-1))});var l,u;return{calculatedDuration:t,next:e=>(o.value=a(e),o.done=e>=t,o)}}const Xn=t=>{const e=({timestamp:e})=>t(e);return{start:()=>tt.update(e,!0),stop:()=>et(e),now:()=>nt.isProcessing?nt.timestamp:rt.now()}},Hn={decay:On,inertia:On,tween:Yn,keyframes:Yn,spring:Fn},Gn=t=>t/100;class qn extends _e{constructor(t){super(t),this.holdTime=null,this.cancelTime=null,this.currentTime=0,this.playbackSpeed=1,this.pendingPlayState="running",this.startTime=null,this.state="idle",this.stop=()=>{if(this.resolver.cancel(),this.isStopped=!0,"idle"===this.state)return;this.teardown();const{onStop:t}=this.options;t&&t()};const{name:e,motionValue:n,element:i,keyframes:s}=this.options,o=(null==i?void 0:i.KeyframeResolver)||Re;this.resolver=new o(s,((t,e)=>this.onKeyframesResolved(t,e)),e,n,i),this.resolver.scheduleResolve()}flatten(){super.flatten(),this._resolved&&Object.assign(this._resolved,this.initPlayback(this._resolved.keyframes))}initPlayback(t){const{type:e="keyframes",repeat:n=0,repeatDelay:i=0,repeatType:s,velocity:o=0}=this.options,r=P(e)?e:Hn[e]||Yn;let a,l;r!==Yn&&"number"!=typeof t[0]&&(a=an(Gn,mn(t[0],t[1])),t=[0,100]);const u=r({...this.options,keyframes:t});"mirror"===s&&(l=r({...this.options,keyframes:[...t].reverse(),velocity:-o})),null===u.calculatedDuration&&(u.calculatedDuration=x(u));const{calculatedDuration:c}=u,h=c+i;return{generator:u,mirroredGenerator:l,mapPercentToKeyframes:a,calculatedDuration:c,resolvedDuration:h,totalDuration:h*(n+1)-i}}onPostResolved(){const{autoplay:t=!0}=this.options;this.play(),"paused"!==this.pendingPlayState&&t?this.state=this.pendingPlayState:this.pause()}tick(t,e=!1){const{resolved:n}=this;if(!n){const{keyframes:t}=this.options;return{done:!0,value:t[t.length-1]}}const{finalKeyframe:i,generator:s,mirroredGenerator:o,mapPercentToKeyframes:r,keyframes:a,calculatedDuration:l,totalDuration:u,resolvedDuration:c}=n;if(null===this.startTime)return s.next(0);const{delay:h,repeat:d,repeatType:p,repeatDelay:m,onUpdate:f}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,t):this.speed<0&&(this.startTime=Math.min(t-u/this.speed,this.startTime)),e?this.currentTime=t:null!==this.holdTime?this.currentTime=this.holdTime:this.currentTime=Math.round(t-this.startTime)*this.speed;const v=this.currentTime-h*(this.speed>=0?1:-1),g=this.speed>=0?v<0:v>u;this.currentTime=Math.max(v,0),"finished"===this.state&&null===this.holdTime&&(this.currentTime=u);let y=this.currentTime,x=s;if(d){const t=Math.min(this.currentTime,u)/c;let e=Math.floor(t),n=t%1;!n&&t>=1&&(n=1),1===n&&e--,e=Math.min(e,d+1);Boolean(e%2)&&("reverse"===p?(n=1-n,m&&(n-=m/c)):"mirror"===p&&(x=o)),y=Lt(0,1,n)*c}const P=g?{done:!1,value:a[0]}:x.next(y);r&&(P.value=r(P.value));let{done:w}=P;g||null===l||(w=this.speed>=0?this.currentTime>=u:this.currentTime<=0);const T=null===this.holdTime&&("finished"===this.state||"running"===this.state&&w);return T&&void 0!==i&&(P.value=Ze(a,this.options,i)),f&&f(P.value),T&&this.finish(),P}get duration(){const{resolved:t}=this;return t?Y(t.calculatedDuration):0}get time(){return Y(this.currentTime)}set time(t){t=K(t),this.currentTime=t,null!==this.holdTime||0===this.speed?this.holdTime=t:this.driver&&(this.startTime=this.driver.now()-t/this.speed)}get speed(){return this.playbackSpeed}set speed(t){const e=this.playbackSpeed!==t;this.playbackSpeed=t,e&&(this.time=Y(this.currentTime))}play(){if(this.resolver.isScheduled||this.resolver.resume(),!this._resolved)return void(this.pendingPlayState="running");if(this.isStopped)return;const{driver:t=Xn,onPlay:e,startTime:n}=this.options;this.driver||(this.driver=t((t=>this.tick(t)))),e&&e();const i=this.driver.now();null!==this.holdTime?this.startTime=i-this.holdTime:this.startTime?"finished"===this.state&&(this.startTime=i):this.startTime=null!=n?n:this.calcStartTime(),"finished"===this.state&&this.updateFinishedPromise(),this.cancelTime=this.startTime,this.holdTime=null,this.state="running",this.driver.start()}pause(){var t;this._resolved?(this.state="paused",this.holdTime=null!==(t=this.currentTime)&&void 0!==t?t:0):this.pendingPlayState="paused"}complete(){"running"!==this.state&&this.play(),this.pendingPlayState=this.state="finished",this.holdTime=null}finish(){this.teardown(),this.state="finished";const{onComplete:t}=this.options;t&&t()}cancel(){null!==this.cancelTime&&this.tick(this.cancelTime),this.teardown(),this.updateFinishedPromise()}teardown(){this.state="idle",this.stopDriver(),this.resolveFinishedPromise(),this.updateFinishedPromise(),this.startTime=this.cancelTime=null,this.resolver.cancel()}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(t){return this.startTime=0,this.tick(t,!0)}}const Zn=new Set(["opacity","clipPath","filter","transform"]);const _n=p((()=>Object.hasOwnProperty.call(Element.prototype,"animate")));const Qn={anticipate:Ct,backInOut:Vt,circInOut:kt};class Jn extends _e{constructor(t){super(t);const{name:e,motionValue:n,element:i,keyframes:s}=this.options;this.resolver=new Xe(s,((t,e)=>this.onKeyframesResolved(t,e)),e,n,i),this.resolver.scheduleResolve()}initPlayback(t,e){let{duration:n=300,times:i,ease:s,type:o,motionValue:r,name:a,startTime:l}=this.options;if(!r.owner||!r.owner.current)return!1;var u;if("string"==typeof s&&A()&&s in Qn&&(s=Qn[s]),P((u=this.options).type)||"spring"===u.type||!C(u.ease)){const{onComplete:e,onUpdate:r,motionValue:a,element:l,...u}=this.options,c=function(t,e){const n=new qn({...e,keyframes:t,repeat:0,delay:0,isGenerator:!0});let i={done:!1,value:t[0]};const s=[];let o=0;for(;!i.done&&o<2e4;)i=n.sample(o),s.push(i.value),o+=10;return{times:void 0,keyframes:s,duration:o-10,ease:"linear"}}(t,u);1===(t=c.keyframes).length&&(t[1]=t[0]),n=c.duration,i=c.times,s=c.ease,o="keyframes"}const c=function(t,e,n,{delay:i=0,duration:s=300,repeat:o=0,repeatType:r="loop",ease:a="easeInOut",times:l}={}){const u={[e]:n};l&&(u.offset=l);const c=k(a,s);return Array.isArray(c)&&(u.easing=c),t.animate(u,{delay:i,duration:s,easing:Array.isArray(c)?"linear":c,fill:"both",iterations:o+1,direction:"reverse"===r?"alternate":"normal"})}(r.owner.current,a,t,{...this.options,duration:n,times:i,ease:s});return c.startTime=null!=l?l:this.calcStartTime(),this.pendingTimeline?(w(c,this.pendingTimeline),this.pendingTimeline=void 0):c.onfinish=()=>{const{onComplete:n}=this.options;r.set(Ze(t,this.options,e)),n&&n(),this.cancel(),this.resolveFinishedPromise()},{animation:c,duration:n,times:i,type:o,ease:s,keyframes:t}}get duration(){const{resolved:t}=this;if(!t)return 0;const{duration:e}=t;return Y(e)}get time(){const{resolved:t}=this;if(!t)return 0;const{animation:e}=t;return Y(e.currentTime||0)}set time(t){const{resolved:e}=this;if(!e)return;const{animation:n}=e;n.currentTime=K(t)}get speed(){const{resolved:t}=this;if(!t)return 1;const{animation:e}=t;return e.playbackRate}set speed(t){const{resolved:e}=this;if(!e)return;const{animation:n}=e;n.playbackRate=t}get state(){const{resolved:t}=this;if(!t)return"idle";const{animation:e}=t;return e.playState}get startTime(){const{resolved:t}=this;if(!t)return null;const{animation:e}=t;return e.startTime}attachTimeline(t){if(this._resolved){const{resolved:e}=this;if(!e)return X;const{animation:n}=e;w(n,t)}else this.pendingTimeline=t;return X}play(){if(this.isStopped)return;const{resolved:t}=this;if(!t)return;const{animation:e}=t;"finished"===e.playState&&this.updateFinishedPromise(),e.play()}pause(){const{resolved:t}=this;if(!t)return;const{animation:e}=t;e.pause()}stop(){if(this.resolver.cancel(),this.isStopped=!0,"idle"===this.state)return;this.resolveFinishedPromise(),this.updateFinishedPromise();const{resolved:t}=this;if(!t)return;const{animation:e,keyframes:n,duration:i,type:s,ease:o,times:r}=t;if("idle"===e.playState||"finished"===e.playState)return;if(this.time){const{motionValue:t,onUpdate:e,onComplete:a,element:l,...u}=this.options,c=new qn({...u,keyframes:n,duration:i,type:s,ease:o,times:r,isGenerator:!0}),h=K(this.time);t.setWithVelocity(c.sample(h-10).value,c.sample(h).value,10)}const{onStop:a}=this.options;a&&a(),this.cancel()}complete(){const{resolved:t}=this;t&&t.animation.finish()}cancel(){const{resolved:t}=this;t&&t.animation.cancel()}static supports(t){const{motionValue:e,name:n,repeatDelay:i,repeatType:s,damping:o,type:r}=t;if(!(e&&e.owner&&e.owner.current instanceof HTMLElement))return!1;const{onUpdate:a,transformTemplate:l}=e.owner.getProps();return _n()&&n&&Zn.has(n)&&!a&&!l&&!i&&"mirror"!==s&&0!==o&&"inertia"!==r}}const ti={type:"spring",stiffness:500,damping:25,restSpeed:10},ei={type:"keyframes",duration:.8},ni={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},ii=(t,{keyframes:e})=>e.length>2?ei:G.has(t)?t.startsWith("scale")?{type:"spring",stiffness:550,damping:0===e[1]?2*Math.sqrt(550):30,restSpeed:10}:ti:ni;const si=(t,e,n,i={},s,o)=>r=>{const a=g(i,t)||{},l=a.delay||i.delay||0;let{elapsed:u=0}=i;u-=K(l);let c={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:e.getVelocity(),...a,delay:-u,onUpdate:t=>{e.set(t),a.onUpdate&&a.onUpdate(t)},onComplete:()=>{r(),a.onComplete&&a.onComplete()},name:t,motionValue:e,element:o?void 0:s};(function({when:t,delay:e,delayChildren:n,staggerChildren:i,staggerDirection:s,repeat:o,repeatType:r,repeatDelay:a,from:l,elapsed:u,...c}){return!!Object.keys(c).length})(a)||(c={...c,...ii(t,c)}),c.duration&&(c.duration=K(c.duration)),c.repeatDelay&&(c.repeatDelay=K(c.repeatDelay)),void 0!==c.from&&(c.keyframes[0]=c.from);let h=!1;if((!1===c.type||0===c.duration&&!c.repeatDelay)&&(c.duration=0,0===c.delay&&(h=!0)),(Pt||Z)&&(h=!0,c.duration=0,c.delay=0),h&&!o&&void 0!==e.get()){const t=Ze(c.keyframes,a);if(void 0!==t)return tt.update((()=>{c.onUpdate(t),c.onComplete()})),new v([])}return!o&&Jn.supports(c)?new Jn(c):new qn(c)};function oi({protectedKeys:t,needsAnimating:e},n){const i=t.hasOwnProperty(n)&&!0!==e[n];return e[n]=!1,i}function ri(t,e,{delay:n=0,transitionOverride:i,type:s}={}){var r;let{transition:a=t.getDefaultTransition(),transitionEnd:l,...u}=e;i&&(a=i);const h=[],d=s&&t.animationState&&t.animationState.getState()[s];for(const o in u){const e=t.getValue(o,null!==(r=t.latestValues[o])&&void 0!==r?r:null),i=u[o];if(void 0===i||d&&oi(d,o))continue;const s={delay:n,...g(a||{},o)};let l=!1;if(window.MotionHandoffAnimation){const e=xt(t);if(e){const t=window.MotionHandoffAnimation(e,o,tt);null!==t&&(s.startTime=t,l=!0)}}vt(t,o),e.start(si(o,e,i,t.shouldReduceMotion&&q.has(o)?{type:!1}:s,t,l));const c=e.animation;c&&h.push(c)}return l&&Promise.all(h).then((()=>{tt.update((()=>{l&&function(t,e){const n=c(t,e);let{transitionEnd:i={},transition:s={},...r}=n||{};r={...r,...i};for(const l in r)mt(t,l,(a=r[l],o(a)?a[a.length-1]||0:a));var a}(t,l)}))})),h}function ai(t,e,n={}){var i;const s=c(t,e,"exit"===n.type?null===(i=t.presenceContext)||void 0===i?void 0:i.custom:void 0);let{transition:o=t.getDefaultTransition()||{}}=s||{};n.transitionOverride&&(o=n.transitionOverride);const r=s?()=>Promise.all(ri(t,s,n)):()=>Promise.resolve(),a=t.variantChildren&&t.variantChildren.size?(i=0)=>{const{delayChildren:s=0,staggerChildren:r,staggerDirection:a}=o;return function(t,e,n=0,i=0,s=1,o){const r=[],a=(t.variantChildren.size-1)*i,l=1===s?(t=0)=>t*i:(t=0)=>a-t*i;return Array.from(t.variantChildren).sort(li).forEach(((t,i)=>{t.notify("AnimationStart",e),r.push(ai(t,e,{...o,delay:n+l(i)}).then((()=>t.notify("AnimationComplete",e))))})),Promise.all(r)}(t,e,s+i,r,a,n)}:()=>Promise.resolve(),{when:l}=o;if(l){const[t,e]="beforeChildren"===l?[r,a]:[a,r];return t().then((()=>e()))}return Promise.all([r(),a(n.delay)])}function li(t,e){return t.sortNodePosition(e)}const ui=d.length;function ci(t){if(!t)return;if(!t.isControllingVariants){const e=t.parent&&ci(t.parent)||{};return void 0!==t.props.initial&&(e.initial=t.props.initial),e}const e={};for(let n=0;nPromise.all(e.map((({animation:e,options:n})=>function(t,e,n={}){let i;if(t.notify("AnimationStart",e),Array.isArray(e)){const s=e.map((e=>ai(t,e,n)));i=Promise.all(s)}else if("string"==typeof e)i=ai(t,e,n);else{const s="function"==typeof e?c(t,e,n.custom):e;i=Promise.all(ri(t,s,n))}return i.then((()=>{t.notify("AnimationComplete",e)}))}(t,e,n))))}function mi(t){let e=pi(t),n=gi(),i=!0;const l=e=>(n,i)=>{var s;const o=c(t,i,"exit"===e?null===(s=t.presenceContext)||void 0===s?void 0:s.custom:void 0);if(o){const{transition:t,transitionEnd:e,...i}=o;n={...n,...i,...e}}return n};function u(u){const{props:c}=t,h=ci(t.parent)||{},d=[],p=new Set;let m={},f=1/0;for(let e=0;ef&&x,b=!1;const A=Array.isArray(y)?y:[y];let E=A.reduce(l(v),{});!1===P&&(E={});const{prevResolvedValues:V={}}=g,C={...V,...E},M=e=>{S=!0,p.has(e)&&(b=!0,p.delete(e)),g.needsAnimating[e]=!0;const n=t.getValue(e);n&&(n.liveStyle=!1)};for(const t in C){const e=E[t],n=V[t];if(m.hasOwnProperty(t))continue;let i=!1;i=o(e)&&o(n)?!r(e,n):e!==n,i?null!=e?M(t):p.add(t):void 0!==e&&p.has(t)?M(t):g.protectedKeys[t]=!0}g.prevProp=y,g.prevResolvedValues=E,g.isActive&&(m={...m,...E}),i&&t.blockInitialAnimation&&(S=!1);S&&(!(w&&T)||b)&&d.push(...A.map((t=>({animation:t,options:{type:v}}))))}if(p.size){const e={};p.forEach((n=>{const i=t.getBaseTarget(n),s=t.getValue(n);s&&(s.liveStyle=!0),e[n]=null!=i?i:null})),d.push({animation:e})}let v=Boolean(d.length);return!i||!1!==c.initial&&c.initial!==c.animate||t.manuallyAnimateOnMount||(v=!1),i=!1,v?e(d):Promise.resolve()}return{animateChanges:u,setActive:function(e,i){var s;if(n[e].isActive===i)return Promise.resolve();null===(s=t.variantChildren)||void 0===s||s.forEach((t=>{var n;return null===(n=t.animationState)||void 0===n?void 0:n.setActive(e,i)})),n[e].isActive=i;const o=u(e);for(const t in n)n[t].protectedKeys={};return o},setAnimateFunction:function(n){e=n(t)},getState:()=>n,reset:()=>{n=gi(),i=!0}}}function fi(t,e){return"string"==typeof e?e!==t:!!Array.isArray(e)&&!r(e,t)}function vi(t=!1){return{isActive:t,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function gi(){return{animate:vi(!0),whileInView:vi(),whileHover:vi(),whileTap:vi(),whileDrag:vi(),whileFocus:vi(),exit:vi()}}class yi{constructor(t){this.isMounted=!1,this.node=t}update(){}}let xi=0;const Pi={animation:{Feature:class extends yi{constructor(t){super(t),t.animationState||(t.animationState=mi(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();s(t)&&(this.unmountControls=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:e}=this.node.prevProps||{};t!==e&&this.updateAnimationControlsSubscription()}unmount(){var t;this.node.animationState.reset(),null===(t=this.unmountControls)||void 0===t||t.call(this)}}},exit:{Feature:class extends yi{constructor(){super(...arguments),this.id=xi++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:e}=this.node.presenceContext,{isPresent:n}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===n)return;const i=this.node.animationState.setActive("exit",!t);e&&!t&&i.then((()=>e(this.id)))}mount(){const{register:t}=this.node.presenceContext||{};t&&(this.unmount=t(this.id))}unmount(){}}}};function wi(t,e,n,i={passive:!0}){return t.addEventListener(e,n,i),()=>t.removeEventListener(e,n)}function Ti(t){return{point:{x:t.pageX,y:t.pageY}}}function Si(t,e,n,i){return wi(t,e,(t=>e=>O(e)&&t(e,Ti(e)))(n),i)}const bi=(t,e)=>Math.abs(t-e);class Ai{constructor(t,e,{transformPagePoint:n,contextWindow:i,dragSnapToOrigin:s=!1}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!this.lastMoveEvent||!this.lastMoveEventInfo)return;const t=Ci(this.lastMoveEventInfo,this.history),e=null!==this.startEvent,n=function(t,e){const n=bi(t.x,e.x),i=bi(t.y,e.y);return Math.sqrt(n**2+i**2)}(t.offset,{x:0,y:0})>=3;if(!e&&!n)return;const{point:i}=t,{timestamp:s}=nt;this.history.push({...i,timestamp:s});const{onStart:o,onMove:r}=this.handlers;e||(o&&o(this.lastMoveEvent,t),this.startEvent=this.lastMoveEvent),r&&r(this.lastMoveEvent,t)},this.handlePointerMove=(t,e)=>{this.lastMoveEvent=t,this.lastMoveEventInfo=Ei(e,this.transformPagePoint),tt.update(this.updatePoint,!0)},this.handlePointerUp=(t,e)=>{this.end();const{onEnd:n,onSessionEnd:i,resumeAnimation:s}=this.handlers;if(this.dragSnapToOrigin&&s&&s(),!this.lastMoveEvent||!this.lastMoveEventInfo)return;const o=Ci("pointercancel"===t.type?this.lastMoveEventInfo:Ei(e,this.transformPagePoint),this.history);this.startEvent&&n&&n(t,o),i&&i(t,o)},!O(t))return;this.dragSnapToOrigin=s,this.handlers=e,this.transformPagePoint=n,this.contextWindow=i||window;const o=Ei(Ti(t),this.transformPagePoint),{point:r}=o,{timestamp:a}=nt;this.history=[{...r,timestamp:a}];const{onSessionStart:l}=e;l&&l(t,Ci(o,this.history)),this.removeListeners=an(Si(this.contextWindow,"pointermove",this.handlePointerMove),Si(this.contextWindow,"pointerup",this.handlePointerUp),Si(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),et(this.updatePoint)}}function Ei(t,e){return e?{point:e(t.point)}:t}function Vi(t,e){return{x:t.x-e.x,y:t.y-e.y}}function Ci({point:t},e){return{point:t,delta:Vi(t,Di(e)),offset:Vi(t,Mi(e)),velocity:ki(e,.1)}}function Mi(t){return t[0]}function Di(t){return t[t.length-1]}function ki(t,e){if(t.length<2)return{x:0,y:0};let n=t.length-1,i=null;const s=Di(t);for(;n>=0&&(i=t[n],!(s.timestamp-i.timestamp>K(e)));)n--;if(!i)return{x:0,y:0};const o=Y(s.timestamp-i.timestamp);if(0===o)return{x:0,y:0};const r={x:(s.x-i.x)/o,y:(s.y-i.y)/o};return r.x===1/0&&(r.x=0),r.y===1/0&&(r.y=0),r}function Ri(t){return t&&"object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"current")}function Li(t){return t.max-t.min}function ji(t,e,n,i=.5){t.origin=i,t.originPoint=Qe(e.min,e.max,t.origin),t.scale=Li(n)/Li(e),t.translate=Qe(n.min,n.max,t.origin)-t.originPoint,(t.scale>=.9999&&t.scale<=1.0001||isNaN(t.scale))&&(t.scale=1),(t.translate>=-.01&&t.translate<=.01||isNaN(t.translate))&&(t.translate=0)}function Bi(t,e,n,i){ji(t.x,e.x,n.x,i?i.originX:void 0),ji(t.y,e.y,n.y,i?i.originY:void 0)}function Fi(t,e,n){t.min=n.min+e.min,t.max=t.min+Li(e)}function Oi(t,e,n){t.min=e.min-n.min,t.max=t.min+Li(e)}function Ii(t,e,n){Oi(t.x,e.x,n.x),Oi(t.y,e.y,n.y)}function Ui(t,e,n){return{min:void 0!==e?t.min+e:void 0,max:void 0!==n?t.max+n-(t.max-t.min):void 0}}function Ni(t,e){let n=e.min-t.min,i=e.max-t.max;return e.max-e.min({x:{min:0,max:0},y:{min:0,max:0}});function Yi(t){return[t("x"),t("y")]}function Xi({top:t,left:e,right:n,bottom:i}){return{x:{min:e,max:n},y:{min:t,max:i}}}function Hi(t){return void 0===t||1===t}function Gi({scale:t,scaleX:e,scaleY:n}){return!Hi(t)||!Hi(e)||!Hi(n)}function qi(t){return Gi(t)||Zi(t)||t.z||t.rotate||t.rotateX||t.rotateY||t.skewX||t.skewY}function Zi(t){return _i(t.x)||_i(t.y)}function _i(t){return t&&"0%"!==t}function Qi(t,e,n){return n+e*(t-n)}function Ji(t,e,n,i,s){return void 0!==s&&(t=Qi(t,s,i)),Qi(t,n,i)+e}function ts(t,e=0,n=1,i,s){t.min=Ji(t.min,e,n,i,s),t.max=Ji(t.max,e,n,i,s)}function es(t,{x:e,y:n}){ts(t.x,e.translate,e.scale,e.originPoint),ts(t.y,n.translate,n.scale,n.originPoint)}const ns=.999999999999,is=1.0000000000001;function ss(t,e){t.min=t.min+e,t.max=t.max+e}function os(t,e,n,i,s=.5){ts(t,e,n,Qe(t.min,t.max,s),i)}function rs(t,e){os(t.x,e.x,e.scaleX,e.scale,e.originX),os(t.y,e.y,e.scaleY,e.scale,e.originY)}function as(t,e){return Xi(function(t,e){if(!e)return t;const n=e({x:t.left,y:t.top}),i=e({x:t.right,y:t.bottom});return{top:n.y,left:n.x,bottom:i.y,right:i.x}}(t.getBoundingClientRect(),e))}const ls=({current:t})=>t?t.ownerDocument.defaultView:null,us=new WeakMap;class cs{constructor(t){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic={x:{min:0,max:0},y:{min:0,max:0}},this.visualElement=t}start(t,{snapToCursor:e=!1}={}){const{presenceContext:n}=this.visualElement;if(n&&!1===n.isPresent)return;const{dragSnapToOrigin:i}=this.getProps();this.panSession=new Ai(t,{onSessionStart:t=>{const{dragSnapToOrigin:n}=this.getProps();n?this.pauseAnimation():this.stopAnimation(),e&&this.snapToCursor(Ti(t).point)},onStart:(t,e)=>{const{drag:n,dragPropagation:i,onDragStart:s}=this.getProps();if(n&&!i&&(this.openDragLock&&this.openDragLock(),this.openDragLock="x"===(o=n)||"y"===o?R[o]?null:(R[o]=!0,()=>{R[o]=!1}):R.x||R.y?null:(R.x=R.y=!0,()=>{R.x=R.y=!1}),!this.openDragLock))return;var o;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Yi((t=>{let e=this.getAxisMotionValue(t).get()||0;if(Ht.test(e)){const{projection:n}=this.visualElement;if(n&&n.layout){const i=n.layout.layoutBox[t];if(i){e=Li(i)*(parseFloat(e)/100)}}}this.originPoint[t]=e})),s&&tt.postRender((()=>s(t,e))),vt(this.visualElement,"transform");const{animationState:r}=this.visualElement;r&&r.setActive("whileDrag",!0)},onMove:(t,e)=>{const{dragPropagation:n,dragDirectionLock:i,onDirectionLock:s,onDrag:o}=this.getProps();if(!n&&!this.openDragLock)return;const{offset:r}=e;if(i&&null===this.currentDirection)return this.currentDirection=function(t,e=10){let n=null;Math.abs(t.y)>e?n="y":Math.abs(t.x)>e&&(n="x");return n}(r),void(null!==this.currentDirection&&s&&s(this.currentDirection));this.updateAxis("x",e.point,r),this.updateAxis("y",e.point,r),this.visualElement.render(),o&&o(t,e)},onSessionEnd:(t,e)=>this.stop(t,e),resumeAnimation:()=>Yi((t=>{var e;return"paused"===this.getAnimationState(t)&&(null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.play())}))},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:i,contextWindow:ls(this.visualElement)})}stop(t,e){const n=this.isDragging;if(this.cancel(),!n)return;const{velocity:i}=e;this.startAnimation(i);const{onDragEnd:s}=this.getProps();s&&tt.postRender((()=>s(t,e)))}cancel(){this.isDragging=!1;const{projection:t,animationState:e}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:n}=this.getProps();!n&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),e&&e.setActive("whileDrag",!1)}updateAxis(t,e,n){const{drag:i}=this.getProps();if(!n||!hs(t,i,this.currentDirection))return;const s=this.getAxisMotionValue(t);let o=this.originPoint[t]+n[t];this.constraints&&this.constraints[t]&&(o=function(t,{min:e,max:n},i){return void 0!==e&&tn&&(t=i?Qe(n,t,i.max):Math.min(t,n)),t}(o,this.constraints[t],this.elastic[t])),s.set(o)}resolveConstraints(){var t;const{dragConstraints:e,dragElastic:n}=this.getProps(),i=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):null===(t=this.visualElement.projection)||void 0===t?void 0:t.layout,s=this.constraints;e&&Ri(e)?this.constraints||(this.constraints=this.resolveRefConstraints()):this.constraints=!(!e||!i)&&function(t,{top:e,left:n,bottom:i,right:s}){return{x:Ui(t.x,n,s),y:Ui(t.y,e,i)}}(i.layoutBox,e),this.elastic=function(t=$i){return!1===t?t=0:!0===t&&(t=$i),{x:Wi(t,"left","right"),y:Wi(t,"top","bottom")}}(n),s!==this.constraints&&i&&this.constraints&&!this.hasMutatedConstraints&&Yi((t=>{!1!==this.constraints&&this.getAxisMotionValue(t)&&(this.constraints[t]=function(t,e){const n={};return void 0!==e.min&&(n.min=e.min-t.min),void 0!==e.max&&(n.max=e.max-t.min),n}(i.layoutBox[t],this.constraints[t]))}))}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:e}=this.getProps();if(!t||!Ri(t))return!1;const n=t.current;je(null!==n,"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.");const{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const s=function(t,e,n){const i=as(t,n),{scroll:s}=e;return s&&(ss(i.x,s.offset.x),ss(i.y,s.offset.y)),i}(n,i.root,this.visualElement.getTransformPagePoint());let o=function(t,e){return{x:Ni(t.x,e.x),y:Ni(t.y,e.y)}}(i.layout.layoutBox,s);if(e){const t=e(function({x:t,y:e}){return{top:e.min,right:t.max,bottom:e.max,left:t.min}}(o));this.hasMutatedConstraints=!!t,t&&(o=Xi(t))}return o}startAnimation(t){const{drag:e,dragMomentum:n,dragElastic:i,dragTransition:s,dragSnapToOrigin:o,onDragTransitionEnd:r}=this.getProps(),a=this.constraints||{},l=Yi((r=>{if(!hs(r,e,this.currentDirection))return;let l=a&&a[r]||{};o&&(l={min:0,max:0});const u=i?200:1e6,c=i?40:1e7,h={type:"inertia",velocity:n?t[r]:0,bounceStiffness:u,bounceDamping:c,timeConstant:750,restDelta:1,restSpeed:10,...s,...l};return this.startAxisValueAnimation(r,h)}));return Promise.all(l).then(r)}startAxisValueAnimation(t,e){const n=this.getAxisMotionValue(t);return vt(this.visualElement,t),n.start(si(t,n,0,e,this.visualElement,!1))}stopAnimation(){Yi((t=>this.getAxisMotionValue(t).stop()))}pauseAnimation(){Yi((t=>{var e;return null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.pause()}))}getAnimationState(t){var e;return null===(e=this.getAxisMotionValue(t).animation)||void 0===e?void 0:e.state}getAxisMotionValue(t){const e=`_drag${t.toUpperCase()}`,n=this.visualElement.getProps(),i=n[e];return i||this.visualElement.getValue(t,(n.initial?n.initial[t]:void 0)||0)}snapToCursor(t){Yi((e=>{const{drag:n}=this.getProps();if(!hs(e,n,this.currentDirection))return;const{projection:i}=this.visualElement,s=this.getAxisMotionValue(e);if(i&&i.layout){const{min:n,max:o}=i.layout.layoutBox[e];s.set(t[e]-Qe(n,o,.5))}}))}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:e}=this.getProps(),{projection:n}=this.visualElement;if(!Ri(e)||!n||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Yi((t=>{const e=this.getAxisMotionValue(t);if(e&&!1!==this.constraints){const n=e.get();i[t]=function(t,e){let n=.5;const i=Li(t),s=Li(e);return s>i?n=E(e.min,e.max-i,t.min):i>s&&(n=E(t.min,t.max-s,e.min)),Lt(0,1,n)}({min:n,max:n},this.constraints[t])}}));const{transformTemplate:s}=this.visualElement.getProps();this.visualElement.current.style.transform=s?s({},""):"none",n.root&&n.root.updateScroll(),n.updateLayout(),this.resolveConstraints(),Yi((e=>{if(!hs(e,t,null))return;const n=this.getAxisMotionValue(e),{min:s,max:o}=this.constraints[e];n.set(Qe(s,o,i[e]))}))}addListeners(){if(!this.visualElement.current)return;us.set(this.visualElement,this);const t=Si(this.visualElement.current,"pointerdown",(t=>{const{drag:e,dragListener:n=!0}=this.getProps();e&&n&&this.start(t)})),e=()=>{const{dragConstraints:t}=this.getProps();Ri(t)&&t.current&&(this.constraints=this.resolveRefConstraints())},{projection:n}=this.visualElement,i=n.addEventListener("measure",e);n&&!n.layout&&(n.root&&n.root.updateScroll(),n.updateLayout()),tt.read(e);const s=wi(window,"resize",(()=>this.scalePositionWithinConstraints())),o=n.addEventListener("didUpdate",(({delta:t,hasLayoutChanged:e})=>{this.isDragging&&e&&(Yi((e=>{const n=this.getAxisMotionValue(e);n&&(this.originPoint[e]+=t[e].translate,n.set(n.get()+t[e].translate))})),this.visualElement.render())}));return()=>{s(),t(),i(),o&&o()}}getProps(){const t=this.visualElement.getProps(),{drag:e=!1,dragDirectionLock:n=!1,dragPropagation:i=!1,dragConstraints:s=!1,dragElastic:o=$i,dragMomentum:r=!0}=t;return{...t,drag:e,dragDirectionLock:n,dragPropagation:i,dragConstraints:s,dragElastic:o,dragMomentum:r}}}function hs(t,e,n){return!(!0!==e&&e!==t||null!==n&&n!==t)}const ds=t=>(e,n)=>{t&&tt.postRender((()=>t(e,n)))};var ps=n(74848),ms=n(96540),fs=n(89120),vs=n(29473);const gs=(0,ms.createContext)({}),ys={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function xs(t,e){return e.max===e.min?0:t/(e.max-e.min)*100}const Ps={correct:(t,e)=>{if(!e.target)return t;if("string"==typeof t){if(!Gt.test(t))return t;t=parseFloat(t)}return`${xs(t,e.target.x)}% ${xs(t,e.target.y)}%`}},ws={correct:(t,{treeScale:e,projectionDelta:n})=>{const i=t,s=le.parse(t);if(s.length>5)return i;const o=le.createTransformer(t),r="number"!=typeof s[0]?1:0,a=n.x.scale*e.x,l=n.y.scale*e.y;s[0+r]/=a,s[1+r]/=l;const u=Qe(a,l,.5);return"number"==typeof s[2+r]&&(s[2+r]/=u),"number"==typeof s[3+r]&&(s[3+r]/=u),o(s)}},Ts={};const{schedule:Ss,cancel:bs}=J(queueMicrotask,!1);class As extends ms.Component{componentDidMount(){const{visualElement:t,layoutGroup:e,switchLayoutGroup:n,layoutId:i}=this.props,{projection:s}=t;var o;o=Vs,Object.assign(Ts,o),s&&(e.group&&e.group.add(s),n&&n.register&&i&&n.register(s),s.root.didUpdate(),s.addEventListener("animationComplete",(()=>{this.safeToRemove()})),s.setOptions({...s.options,onExitComplete:()=>this.safeToRemove()})),ys.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:e,visualElement:n,drag:i,isPresent:s}=this.props,o=n.projection;return o?(o.isPresent=s,i||t.layoutDependency!==e||void 0===e?o.willUpdate():this.safeToRemove(),t.isPresent!==s&&(s?o.promote():o.relegate()||tt.postRender((()=>{const t=o.getStack();t&&t.members.length||this.safeToRemove()}))),null):null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),Ss.postRender((()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()})))}componentWillUnmount(){const{visualElement:t,layoutGroup:e,switchLayoutGroup:n}=this.props,{projection:i}=t;i&&(i.scheduleCheckAfterUnmount(),e&&e.group&&e.group.remove(i),n&&n.deregister&&n.deregister(i))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function Es(t){const[e,n]=(0,fs.xQ)(),i=(0,ms.useContext)(vs.L);return(0,ps.jsx)(As,{...t,layoutGroup:i,switchLayoutGroup:(0,ms.useContext)(gs),isPresent:e,safeToRemove:n})}const Vs={borderRadius:{...Ps,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Ps,borderTopRightRadius:Ps,borderBottomLeftRadius:Ps,borderBottomRightRadius:Ps,boxShadow:ws};const Cs=(t,e)=>t.depth-e.depth;class Ms{constructor(){this.children=[],this.isDirty=!1}add(t){at(this.children,t),this.isDirty=!0}remove(t){lt(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(Cs),this.isDirty=!1,this.children.forEach(t)}}function Ds(t,e){const n=rt.now(),i=({timestamp:s})=>{const o=s-n;o>=e&&(et(i),t(o-e))};return tt.read(i,!0),()=>et(i)}function ks(t){const e=ft(t)?t.get():t;return n=e,Boolean(n&&"object"==typeof n&&n.mix&&n.toValue)?e.toValue():e;var n}const Rs=["TopLeft","TopRight","BottomLeft","BottomRight"],Ls=Rs.length,js=t=>"string"==typeof t?parseFloat(t):t,Bs=t=>"number"==typeof t||Gt.test(t);function Fs(t,e){return void 0!==t[e]?t[e]:t.borderRadius}const Os=Us(0,.5,Dt),Is=Us(.5,.95,X);function Us(t,e,n){return i=>ie?1:n(E(t,e,i))}function Ns(t,e){t.min=e.min,t.max=e.max}function $s(t,e){Ns(t.x,e.x),Ns(t.y,e.y)}function Ws(t,e){t.translate=e.translate,t.scale=e.scale,t.originPoint=e.originPoint,t.origin=e.origin}function zs(t,e,n,i,s){return t=Qi(t-=e,1/n,i),void 0!==s&&(t=Qi(t,1/s,i)),t}function Ks(t,e,[n,i,s],o,r){!function(t,e=0,n=1,i=.5,s,o=t,r=t){Ht.test(e)&&(e=parseFloat(e),e=Qe(r.min,r.max,e/100)-r.min);if("number"!=typeof e)return;let a=Qe(o.min,o.max,i);t===o&&(a-=e),t.min=zs(t.min,e,n,a,s),t.max=zs(t.max,e,n,a,s)}(t,e[n],e[i],e[s],e.scale,o,r)}const Ys=["x","scaleX","originX"],Xs=["y","scaleY","originY"];function Hs(t,e,n,i){Ks(t.x,e,Ys,n?n.x:void 0,i?i.x:void 0),Ks(t.y,e,Xs,n?n.y:void 0,i?i.y:void 0)}function Gs(t){return 0===t.translate&&1===t.scale}function qs(t){return Gs(t.x)&&Gs(t.y)}function Zs(t,e){return t.min===e.min&&t.max===e.max}function _s(t,e){return Math.round(t.min)===Math.round(e.min)&&Math.round(t.max)===Math.round(e.max)}function Qs(t,e){return _s(t.x,e.x)&&_s(t.y,e.y)}function Js(t){return Li(t.x)/Li(t.y)}function to(t,e){return t.translate===e.translate&&t.scale===e.scale&&t.originPoint===e.originPoint}class eo{constructor(){this.members=[]}add(t){at(this.members,t),t.scheduleRender()}remove(t){if(lt(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const t=this.members[this.members.length-1];t&&this.promote(t)}}relegate(t){const e=this.members.findIndex((e=>t===e));if(0===e)return!1;let n;for(let i=e;i>=0;i--){const t=this.members[i];if(!1!==t.isPresent){n=t;break}}return!!n&&(this.promote(n),!0)}promote(t,e){const n=this.lead;if(t!==n&&(this.prevLead=n,this.lead=t,t.show(),n)){n.instance&&n.scheduleRender(),t.scheduleRender(),t.resumeFrom=n,e&&(t.resumeFrom.preserveOpacity=!0),n.snapshot&&(t.snapshot=n.snapshot,t.snapshot.latestValues=n.animationValues||n.latestValues),t.root&&t.root.isUpdating&&(t.isLayoutDirty=!0);const{crossfade:i}=t.options;!1===i&&n.hide()}}exitAnimationComplete(){this.members.forEach((t=>{const{options:e,resumingFrom:n}=t;e.onExitComplete&&e.onExitComplete(),n&&n.options.onExitComplete&&n.options.onExitComplete()}))}scheduleRender(){this.members.forEach((t=>{t.instance&&t.scheduleRender(!1)}))}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}const no={type:"projectionFrame",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0},io="undefined"!=typeof window&&void 0!==window.MotionDebug,so=["","X","Y","Z"],oo={visibility:"hidden"};let ro=0;function ao(t,e,n,i){const{latestValues:s}=e;s[t]&&(n[t]=s[t],e.setStaticValue(t,0),i&&(i[t]=0))}function lo(t){if(t.hasCheckedOptimisedAppear=!0,t.root===t)return;const{visualElement:e}=t.options;if(!e)return;const n=xt(e);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:e,layoutId:i}=t.options;window.MotionCancelOptimisedAnimation(n,"transform",tt,!(e||i))}const{parent:i}=t;i&&!i.hasCheckedOptimisedAppear&&lo(i)}function uo({attachResizeListener:t,defaultParent:e,measureScroll:n,checkIsScrollRoot:i,resetTransform:s}){return class{constructor(t={},n=(null==e?void 0:e())){this.id=ro++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,io&&(no.totalNodes=no.resolvedTargetDeltas=no.recalculatedProjection=0),this.nodes.forEach(po),this.nodes.forEach(Po),this.nodes.forEach(wo),this.nodes.forEach(mo),io&&window.MotionDebug.record(no)},this.resolvedRelativeTargetAt=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=t,this.root=n?n.root||n:this,this.path=n?[...n.path,n]:[],this.parent=n,this.depth=n?n.depth+1:0;for(let e=0;ethis.root.updateBlockedByResize=!1;t(e,(()=>{this.root.updateBlockedByResize=!0,n&&n(),n=Ds(i,250),ys.hasAnimatedSinceResize&&(ys.hasAnimatedSinceResize=!1,this.nodes.forEach(xo))}))}s&&this.root.registerSharedNode(s,this),!1!==this.options.animate&&r&&(s||o)&&this.addEventListener("didUpdate",(({delta:t,hasLayoutChanged:e,hasRelativeTargetChanged:n,layout:i})=>{if(this.isTreeAnimationBlocked())return this.target=void 0,void(this.relativeTarget=void 0);const s=this.options.transition||r.getDefaultTransition()||Vo,{onLayoutAnimationStart:o,onLayoutAnimationComplete:a}=r.getProps(),l=!this.targetLayout||!Qs(this.targetLayout,i)||n,u=!e&&n;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||u||e&&(l||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(t,u);const e={...g(s,"layout"),onPlay:o,onComplete:a};(r.shouldReduceMotion||this.options.layoutRoot)&&(e.delay=0,e.type=!1),this.startAnimation(e)}else e||xo(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=i}))}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const t=this.getStack();t&&t.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,et(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(To),this.animationId++)}getTransformTemplate(){const{visualElement:t}=this.options;return t&&t.getProps().transformTemplate}willUpdate(t=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked())return void(this.options.onExitComplete&&this.options.onExitComplete());if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&lo(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let s=0;s{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()}))}updateSnapshot(){!this.snapshot&&this.instance&&(this.snapshot=this.measure())}updateLayout(){if(!this.instance)return;if(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead()||this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let n=0;nns&&(e.x=1),e.yns&&(e.y=1)}(this.layoutCorrected,this.treeScale,this.path,n),!e.layout||e.target||1===this.treeScale.x&&1===this.treeScale.y||(e.target=e.layout.layoutBox,e.targetWithTransforms={x:{min:0,max:0},y:{min:0,max:0}});const{target:l}=e;l?(this.projectionDelta&&this.prevProjectionDelta?(Ws(this.prevProjectionDelta.x,this.projectionDelta.x),Ws(this.prevProjectionDelta.y,this.projectionDelta.y)):this.createProjectionDeltas(),Bi(this.projectionDelta,this.layoutCorrected,l,this.latestValues),this.treeScale.x===r&&this.treeScale.y===a&&to(this.projectionDelta.x,this.prevProjectionDelta.x)&&to(this.projectionDelta.y,this.prevProjectionDelta.y)||(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",l)),io&&no.recalculatedProjection++):this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender())}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(t=!0){var e;if(null===(e=this.options.visualElement)||void 0===e||e.scheduleRender(),t){const t=this.getStack();t&&t.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}},this.projectionDelta={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}},this.projectionDeltaWithTransform={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}}}setAnimationOrigin(t,e=!1){const n=this.snapshot,i=n?n.latestValues:{},s={...this.latestValues},o={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};this.relativeParent&&this.relativeParent.options.layoutRoot||(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!e;const r={x:{min:0,max:0},y:{min:0,max:0}},a=(n?n.source:void 0)!==(this.layout?this.layout.source:void 0),l=this.getStack(),u=!l||l.members.length<=1,c=Boolean(a&&!u&&!0===this.options.crossfade&&!this.path.some(Eo));let h;this.animationProgress=0,this.mixTargetDelta=e=>{const n=e/1e3;var l,d,p,m,f,v;bo(o.x,t.x,n),bo(o.y,t.y,n),this.setTargetDelta(o),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(Ii(r,this.layout.layoutBox,this.relativeParent.layout.layoutBox),p=this.relativeTarget,m=this.relativeTargetOrigin,f=r,v=n,Ao(p.x,m.x,f.x,v),Ao(p.y,m.y,f.y,v),h&&(l=this.relativeTarget,d=h,Zs(l.x,d.x)&&Zs(l.y,d.y))&&(this.isProjectionDirty=!1),h||(h={x:{min:0,max:0},y:{min:0,max:0}}),$s(h,this.relativeTarget)),a&&(this.animationValues=s,function(t,e,n,i,s,o){s?(t.opacity=Qe(0,void 0!==n.opacity?n.opacity:1,Os(i)),t.opacityExit=Qe(void 0!==e.opacity?e.opacity:1,0,Is(i))):o&&(t.opacity=Qe(void 0!==e.opacity?e.opacity:1,void 0!==n.opacity?n.opacity:1,i));for(let r=0;r{ys.hasAnimatedSinceResize=!0,this.currentAnimation=function(t,e,n){const i=ft(t)?t:pt(t);return i.start(si("",i,e,n)),i.animation}(0,1e3,{...t,onUpdate:e=>{this.mixTargetDelta(e),t.onUpdate&&t.onUpdate(e)},onComplete:()=>{t.onComplete&&t.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0}))}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const t=this.getStack();t&&t.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(1e3),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const t=this.getLead();let{targetWithTransforms:e,target:n,layout:i,latestValues:s}=t;if(e&&n&&i){if(this!==t&&this.layout&&i&&ko(this.options.animationType,this.layout.layoutBox,i.layoutBox)){n=this.target||{x:{min:0,max:0},y:{min:0,max:0}};const e=Li(this.layout.layoutBox.x);n.x.min=t.target.x.min,n.x.max=n.x.min+e;const i=Li(this.layout.layoutBox.y);n.y.min=t.target.y.min,n.y.max=n.y.min+i}$s(e,n),rs(e,s),Bi(this.projectionDeltaWithTransform,this.layoutCorrected,e,s)}}registerSharedNode(t,e){this.sharedNodes.has(t)||this.sharedNodes.set(t,new eo);this.sharedNodes.get(t).add(e);const n=e.options.initialPromotionConfig;e.promote({transition:n?n.transition:void 0,preserveFollowOpacity:n&&n.shouldPreserveFollowOpacity?n.shouldPreserveFollowOpacity(e):void 0})}isLead(){const t=this.getStack();return!t||t.lead===this}getLead(){var t;const{layoutId:e}=this.options;return e&&(null===(t=this.getStack())||void 0===t?void 0:t.lead)||this}getPrevLead(){var t;const{layoutId:e}=this.options;return e?null===(t=this.getStack())||void 0===t?void 0:t.prevLead:void 0}getStack(){const{layoutId:t}=this.options;if(t)return this.root.sharedNodes.get(t)}promote({needsReset:t,transition:e,preserveFollowOpacity:n}={}){const i=this.getStack();i&&i.promote(this,n),t&&(this.projectionDelta=void 0,this.needsReset=!0),e&&this.setOptions({transition:e})}relegate(){const t=this.getStack();return!!t&&t.relegate(this)}resetSkewAndRotation(){const{visualElement:t}=this.options;if(!t)return;let e=!1;const{latestValues:n}=t;if((n.z||n.rotate||n.rotateX||n.rotateY||n.rotateZ||n.skewX||n.skewY)&&(e=!0),!e)return;const i={};n.z&&ao("z",t,i,this.animationValues);for(let s=0;s{var e;return null===(e=t.currentAnimation)||void 0===e?void 0:e.stop()})),this.root.nodes.forEach(vo),this.root.sharedNodes.clear()}}}function co(t){t.updateLayout()}function ho(t){var e;const n=(null===(e=t.resumeFrom)||void 0===e?void 0:e.snapshot)||t.snapshot;if(t.isLead()&&t.layout&&n&&t.hasListeners("didUpdate")){const{layoutBox:e,measuredBox:i}=t.layout,{animationType:s}=t.options,o=n.source!==t.layout.source;"size"===s?Yi((t=>{const i=o?n.measuredBox[t]:n.layoutBox[t],s=Li(i);i.min=e[t].min,i.max=i.min+s})):ko(s,n.layoutBox,e)&&Yi((i=>{const s=o?n.measuredBox[i]:n.layoutBox[i],r=Li(e[i]);s.max=s.min+r,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[i].max=t.relativeTarget[i].min+r)}));const r={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};Bi(r,e,n.layoutBox);const a={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};o?Bi(a,t.applyTransform(i,!0),n.measuredBox):Bi(a,e,n.layoutBox);const l=!qs(r);let u=!1;if(!t.resumeFrom){const i=t.getClosestProjectingParent();if(i&&!i.resumeFrom){const{snapshot:s,layout:o}=i;if(s&&o){const r={x:{min:0,max:0},y:{min:0,max:0}};Ii(r,n.layoutBox,s.layoutBox);const a={x:{min:0,max:0},y:{min:0,max:0}};Ii(a,e,o.layoutBox),Qs(r,a)||(u=!0),i.options.layoutRoot&&(t.relativeTarget=a,t.relativeTargetOrigin=r,t.relativeParent=i)}}}t.notifyListeners("didUpdate",{layout:e,snapshot:n,delta:a,layoutDelta:r,hasLayoutChanged:l,hasRelativeTargetChanged:u})}else if(t.isLead()){const{onExitComplete:e}=t.options;e&&e()}t.options.transition=void 0}function po(t){io&&no.totalNodes++,t.parent&&(t.isProjecting()||(t.isProjectionDirty=t.parent.isProjectionDirty),t.isSharedProjectionDirty||(t.isSharedProjectionDirty=Boolean(t.isProjectionDirty||t.parent.isProjectionDirty||t.parent.isSharedProjectionDirty)),t.isTransformDirty||(t.isTransformDirty=t.parent.isTransformDirty))}function mo(t){t.isProjectionDirty=t.isSharedProjectionDirty=t.isTransformDirty=!1}function fo(t){t.clearSnapshot()}function vo(t){t.clearMeasurements()}function go(t){t.isLayoutDirty=!1}function yo(t){const{visualElement:e}=t.options;e&&e.getProps().onBeforeLayoutMeasure&&e.notify("BeforeLayoutMeasure"),t.resetTransform()}function xo(t){t.finishAnimation(),t.targetDelta=t.relativeTarget=t.target=void 0,t.isProjectionDirty=!0}function Po(t){t.resolveTargetDelta()}function wo(t){t.calcProjection()}function To(t){t.resetSkewAndRotation()}function So(t){t.removeLeadSnapshot()}function bo(t,e,n){t.translate=Qe(e.translate,0,n),t.scale=Qe(e.scale,1,n),t.origin=e.origin,t.originPoint=e.originPoint}function Ao(t,e,n,i){t.min=Qe(e.min,n.min,i),t.max=Qe(e.max,n.max,i)}function Eo(t){return t.animationValues&&void 0!==t.animationValues.opacityExit}const Vo={duration:.45,ease:[.4,0,.1,1]},Co=t=>"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(t),Mo=Co("applewebkit/")&&!Co("chrome/")?Math.round:X;function Do(t){t.min=Mo(t.min),t.max=Mo(t.max)}function ko(t,e,n){return"position"===t||"preserve-aspect"===t&&(i=Js(e),s=Js(n),o=.2,!(Math.abs(i-s)<=o));var i,s,o}function Ro(t){var e;return t!==t.root&&(null===(e=t.scroll)||void 0===e?void 0:e.wasRoot)}const Lo=uo({attachResizeListener:(t,e)=>wi(t,"resize",e),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),jo={current:void 0},Bo=uo({measureScroll:t=>({x:t.scrollLeft,y:t.scrollTop}),defaultParent:()=>{if(!jo.current){const t=new Lo({});t.mount(window),t.setOptions({layoutScroll:!0}),jo.current=t}return jo.current},resetTransform:(t,e)=>{t.style.transform=void 0!==e?e:"none"},checkIsScrollRoot:t=>Boolean("fixed"===window.getComputedStyle(t).position)}),Fo={pan:{Feature:class extends yi{constructor(){super(...arguments),this.removePointerDownListener=X}onPointerDown(t){this.session=new Ai(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:ls(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:e,onPan:n,onPanEnd:i}=this.node.getProps();return{onSessionStart:ds(t),onStart:ds(e),onMove:n,onEnd:(t,e)=>{delete this.session,i&&tt.postRender((()=>i(t,e)))}}}mount(){this.removePointerDownListener=Si(this.node.current,"pointerdown",(t=>this.onPointerDown(t)))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}},drag:{Feature:class extends yi{constructor(t){super(t),this.removeGroupControls=X,this.removeListeners=X,this.controls=new cs(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||X}unmount(){this.removeGroupControls(),this.removeListeners()}},ProjectionNode:Bo,MeasureLayout:Es}};function Oo(t,e,n){const{props:i}=t;t.animationState&&i.whileHover&&t.animationState.setActive("whileHover","Start"===n);const s=i["onHover"+n];s&&tt.postRender((()=>s(e,Ti(e))))}function Io(t,e,n){const{props:i}=t;t.animationState&&i.whileTap&&t.animationState.setActive("whileTap","Start"===n);const s=i["onTap"+("End"===n?"":n)];s&&tt.postRender((()=>s(e,Ti(e))))}const Uo=new WeakMap,No=new WeakMap,$o=t=>{const e=Uo.get(t.target);e&&e(t)},Wo=t=>{t.forEach($o)};function zo(t,e,n){const i=function({root:t,...e}){const n=t||document;No.has(n)||No.set(n,{});const i=No.get(n),s=JSON.stringify(e);return i[s]||(i[s]=new IntersectionObserver(Wo,{root:t,...e})),i[s]}(e);return Uo.set(t,n),i.observe(t),()=>{Uo.delete(t),i.unobserve(t)}}const Ko={some:0,all:1};const Yo={inView:{Feature:class extends yi{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:e,margin:n,amount:i="some",once:s}=t,o={root:e?e.current:void 0,rootMargin:n,threshold:"number"==typeof i?i:Ko[i]};return zo(this.node.current,o,(t=>{const{isIntersecting:e}=t;if(this.isInView===e)return;if(this.isInView=e,s&&!e&&this.hasEnteredView)return;e&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",e);const{onViewportEnter:n,onViewportLeave:i}=this.node.getProps(),o=e?n:i;o&&o(t)}))}mount(){this.startObserver()}update(){if("undefined"==typeof IntersectionObserver)return;const{props:t,prevProps:e}=this.node;["amount","margin","root"].some(function({viewport:t={}},{viewport:e={}}={}){return n=>t[n]!==e[n]}(t,e))&&this.startObserver()}unmount(){}}},tap:{Feature:class extends yi{mount(){const{current:t}=this.node;t&&(this.unmount=z(t,(t=>(Io(this.node,t,"Start"),(t,{success:e})=>Io(this.node,t,e?"End":"Cancel"))),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}},focus:{Feature:class extends yi{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch(e){t=!0}t&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=an(wi(this.node.current,"focus",(()=>this.onFocus())),wi(this.node.current,"blur",(()=>this.onBlur())))}unmount(){}}},hover:{Feature:class extends yi{mount(){const{current:t}=this.node;t&&(this.unmount=function(t,e,n={}){const[i,s,o]=j(t,n),r=B((t=>{const{target:n}=t,i=e(t);if("function"!=typeof i||!n)return;const o=B((t=>{i(t),n.removeEventListener("pointerleave",o)}));n.addEventListener("pointerleave",o,s)}));return i.forEach((t=>{t.addEventListener("pointerenter",r,s)})),o}(t,(t=>(Oo(this.node,t,"Start"),t=>Oo(this.node,t,"End")))))}unmount(){}}}},Xo={layout:{ProjectionNode:Bo,MeasureLayout:Es}},Ho=(0,ms.createContext)({strict:!1});var Go=n(35446);const qo=(0,ms.createContext)({});function Zo(t){return s(t.animate)||d.some((e=>a(t[e])))}function _o(t){return Boolean(Zo(t)||t.variants)}function Qo(t){const{initial:e,animate:n}=function(t,e){if(Zo(t)){const{initial:e,animate:n}=t;return{initial:!1===e||a(e)?e:void 0,animate:a(n)?n:void 0}}return!1!==t.inherit?e:{}}(t,(0,ms.useContext)(qo));return(0,ms.useMemo)((()=>({initial:e,animate:n})),[Jo(e),Jo(n)])}function Jo(t){return Array.isArray(t)?t.join(" "):t}var tr=n(98288);const er={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},nr={};for(const ia in er)nr[ia]={isEnabled:t=>er[ia].some((e=>!!t[e]))};const ir=Symbol.for("motionComponentSymbol");function sr(t,e,n){return(0,ms.useCallback)((i=>{i&&t.onMount&&t.onMount(i),e&&(i?e.mount(i):e.unmount()),n&&("function"==typeof n?n(i):Ri(n)&&(n.current=i))}),[e])}var or=n(86719),rr=n(25128);function ar(t,e,n,i,s){var o,r;const{visualElement:a}=(0,ms.useContext)(qo),l=(0,ms.useContext)(Ho),u=(0,ms.useContext)(or.t),c=(0,ms.useContext)(Go.Q).reducedMotion,h=(0,ms.useRef)(null);i=i||l.renderer,!h.current&&i&&(h.current=i(t,{visualState:e,parent:a,props:n,presenceContext:u,blockInitialAnimation:!!u&&!1===u.initial,reducedMotionConfig:c}));const d=h.current,p=(0,ms.useContext)(gs);!d||d.projection||!s||"html"!==d.type&&"svg"!==d.type||function(t,e,n,i){const{layoutId:s,layout:o,drag:r,dragConstraints:a,layoutScroll:l,layoutRoot:u}=e;t.projection=new n(t.latestValues,e["data-framer-portal-id"]?void 0:lr(t.parent)),t.projection.setOptions({layoutId:s,layout:o,alwaysMeasureLayout:Boolean(r)||a&&Ri(a),visualElement:t,animationType:"string"==typeof o?o:"both",initialPromotionConfig:i,layoutScroll:l,layoutRoot:u})}(h.current,n,s,p);const m=(0,ms.useRef)(!1);(0,ms.useInsertionEffect)((()=>{d&&m.current&&d.update(n,u)}));const f=n[yt],v=(0,ms.useRef)(Boolean(f)&&!(null===(o=window.MotionHandoffIsComplete)||void 0===o?void 0:o.call(window,f))&&(null===(r=window.MotionHasOptimisedAnimation)||void 0===r?void 0:r.call(window,f)));return(0,rr.E)((()=>{d&&(m.current=!0,window.MotionIsMounted=!0,d.updateFeatures(),Ss.render(d.render),v.current&&d.animationState&&d.animationState.animateChanges())})),(0,ms.useEffect)((()=>{d&&(!v.current&&d.animationState&&d.animationState.animateChanges(),v.current&&(queueMicrotask((()=>{var t;null===(t=window.MotionHandoffMarkAsComplete)||void 0===t||t.call(window,f)})),v.current=!1))})),d}function lr(t){if(t)return!1!==t.options.allowProjection?t.projection:lr(t.parent)}function ur({preloadedFeatures:t,createVisualElement:e,useRender:n,useVisualState:i,Component:s}){var o,r;function a(t,o){let r;const a={...(0,ms.useContext)(Go.Q),...t,layoutId:cr(t)},{isStatic:l}=a,u=Qo(t),c=i(t,l);if(!l&&tr.B){!function(){(0,ms.useContext)(Ho).strict;0}();const t=function(t){const{drag:e,layout:n}=nr;if(!e&&!n)return{};const i={...e,...n};return{MeasureLayout:(null==e?void 0:e.isEnabled(t))||(null==n?void 0:n.isEnabled(t))?i.MeasureLayout:void 0,ProjectionNode:i.ProjectionNode}}(a);r=t.MeasureLayout,u.visualElement=ar(s,c,a,e,t.ProjectionNode)}return(0,ps.jsxs)(qo.Provider,{value:u,children:[r&&u.visualElement?(0,ps.jsx)(r,{visualElement:u.visualElement,...a}):null,n(s,t,sr(c,u.visualElement,o),c,l,u.visualElement)]})}t&&function(t){for(const e in t)nr[e]={...nr[e],...t[e]}}(t),a.displayName=`motion.${"string"==typeof s?s:`create(${null!==(r=null!==(o=s.displayName)&&void 0!==o?o:s.name)&&void 0!==r?r:""})`}`;const l=(0,ms.forwardRef)(a);return l[ir]=s,l}function cr({layoutId:t}){const e=(0,ms.useContext)(vs.L).id;return e&&void 0!==t?e+"-"+t:t}const hr=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function dr(t){return"string"==typeof t&&!t.includes("-")&&!!(hr.indexOf(t)>-1||/[A-Z]/u.test(t))}var pr=n(28601);const mr=t=>(e,n)=>{const i=(0,ms.useContext)(qo),s=(0,ms.useContext)(or.t),o=()=>function({scrapeMotionValuesFromProps:t,createRenderState:e,onUpdate:n},i,s,o){const r={latestValues:fr(i,s,o,t),renderState:e()};return n&&(r.onMount=t=>n({props:i,current:t,...r}),r.onUpdate=t=>n(t)),r}(t,e,i,s);return n?o():(0,pr.M)(o)};function fr(t,e,n,i){const o={},r=i(t,{});for(const s in r)o[s]=ks(r[s]);let{initial:a,animate:l}=t;const c=Zo(t),h=_o(t);e&&h&&!c&&!1!==t.inherit&&(void 0===a&&(a=e.initial),void 0===l&&(l=e.animate));let d=!!n&&!1===n.initial;d=d||!1===a;const p=d?l:a;if(p&&"boolean"!=typeof p&&!s(p)){const e=Array.isArray(p)?p:[p];for(let n=0;ne&&"number"==typeof t?e.transform(t):t,gr={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},yr=H.length;function xr(t,e,n){const{style:i,vars:s,transformOrigin:o}=t;let r=!1,a=!1;for(const l in e){const t=e[l];if(G.has(l))r=!0;else if(Oe(l))s[l]=t;else{const e=vr(t,ve[l]);l.startsWith("origin")?(a=!0,o[l]=e):i[l]=e}}if(e.transform||(r||n?i.transform=function(t,e,n){let i="",s=!0;for(let o=0;o({style:{},transform:{},transformOrigin:{},vars:{}}),Ar=()=>({style:{},transform:{},transformOrigin:{},vars:{},attrs:{}}),Er=t=>"string"==typeof t&&"svg"===t.toLowerCase();function Vr(t,{style:e,vars:n},i,s){Object.assign(t.style,e,s&&s.getProjectionStyles(i));for(const o in n)t.style.setProperty(o,n[o])}const Cr=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function Mr(t,e,n,i){Vr(t,e,void 0,i);for(const s in e.attrs)t.setAttribute(Cr.has(s)?s:gt(s),e.attrs[s])}function Dr(t,{layout:e,layoutId:n}){return G.has(t)||t.startsWith("origin")||(e||void 0!==n)&&(!!Ts[t]||"opacity"===t)}function kr(t,e,n){var i;const{style:s}=t,o={};for(const r in s)(ft(s[r])||e.style&&ft(e.style[r])||Dr(r,t)||void 0!==(null===(i=null==n?void 0:n.getValue(r))||void 0===i?void 0:i.liveStyle))&&(o[r]=s[r]);return o}function Rr(t,e,n){const i=kr(t,e,n);for(const s in t)if(ft(t[s])||ft(e[s])){i[-1!==H.indexOf(s)?"attr"+s.charAt(0).toUpperCase()+s.substring(1):s]=t[s]}return i}const Lr=["x","y","width","height","cx","cy","r"],jr={useVisualState:mr({scrapeMotionValuesFromProps:Rr,createRenderState:Ar,onUpdate:({props:t,prevProps:e,current:n,renderState:i,latestValues:s})=>{if(!n)return;let o=!!t.drag;if(!o)for(const a in s)if(G.has(a)){o=!0;break}if(!o)return;let r=!e;if(e)for(let a=0;a{!function(t,e){try{e.dimensions="function"==typeof t.getBBox?t.getBBox():t.getBoundingClientRect()}catch(n){e.dimensions={x:0,y:0,width:0,height:0}}}(n,i),tt.render((()=>{Sr(i,s,Er(n.tagName),t.transformTemplate),Mr(n,i)}))}))}})},Br={useVisualState:mr({scrapeMotionValuesFromProps:kr,createRenderState:br})};function Fr(t,e,n){for(const i in e)ft(e[i])||Dr(i,n)||(t[i]=e[i])}function Or(t,e){const n={};return Fr(n,t.style||{},t),Object.assign(n,function({transformTemplate:t},e){return(0,ms.useMemo)((()=>{const n={style:{},transform:{},transformOrigin:{},vars:{}};return xr(n,e,t),Object.assign({},n.vars,n.style)}),[e])}(t,e)),n}function Ir(t,e){const n={},i=Or(t,e);return t.drag&&!1!==t.dragListener&&(n.draggable=!1,i.userSelect=i.WebkitUserSelect=i.WebkitTouchCallout="none",i.touchAction=!0===t.drag?"none":"pan-"+("x"===t.drag?"y":"x")),void 0===t.tabIndex&&(t.onTap||t.onTapStart||t.whileTap)&&(n.tabIndex=0),n.style=i,n}const Ur=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function Nr(t){return t.startsWith("while")||t.startsWith("drag")&&"draggable"!==t||t.startsWith("layout")||t.startsWith("onTap")||t.startsWith("onPan")||t.startsWith("onLayout")||Ur.has(t)}let $r=t=>!Nr(t);try{(Wr=require("@emotion/is-prop-valid").default)&&($r=t=>t.startsWith("on")?!Nr(t):Wr(t))}catch(na){}var Wr;function zr(t,e,n,i){const s=(0,ms.useMemo)((()=>{const n={style:{},transform:{},transformOrigin:{},vars:{},attrs:{}};return Sr(n,e,Er(i),t.transformTemplate),{...n.attrs,style:{...n.style}}}),[e]);if(t.style){const e={};Fr(e,t.style,t),s.style={...e,...s.style}}return s}function Kr(t=!1){return(e,n,i,{latestValues:s},o)=>{const r=(dr(e)?zr:Ir)(n,s,o,e),a=function(t,e,n){const i={};for(const s in t)"values"===s&&"object"==typeof t.values||($r(s)||!0===n&&Nr(s)||!e&&!Nr(s)||t.draggable&&s.startsWith("onDrag"))&&(i[s]=t[s]);return i}(n,"string"==typeof e,t),l=e!==ms.Fragment?{...a,...r,ref:i}:{},{children:u}=n,c=(0,ms.useMemo)((()=>ft(u)?u.get():u),[u]);return(0,ms.createElement)(e,{...l,children:c})}}function Yr(t,e){return function(n,{forwardMotionProps:i}={forwardMotionProps:!1}){return ur({...dr(n)?jr:Br,preloadedFeatures:t,useRender:Kr(i),createVisualElement:e,Component:n})}}const Xr={current:null},Hr={current:!1};const Gr=[...Ke,Jt,le],qr=new WeakMap;const Zr=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];class _r{scrapeMotionValuesFromProps(t,e,n){return{}}constructor({parent:t,props:e,presenceContext:n,reducedMotionConfig:i,blockInitialAnimation:s,visualState:o},r={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=Re,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const t=rt.now();this.renderScheduledAtthis.bindToMotionValue(e,t))),Hr.current||function(){if(Hr.current=!0,tr.B)if(window.matchMedia){const t=window.matchMedia("(prefers-reduced-motion)"),e=()=>Xr.current=t.matches;t.addListener(e),e()}else Xr.current=!1}(),this.shouldReduceMotion="never"!==this.reducedMotionConfig&&("always"===this.reducedMotionConfig||Xr.current),this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){qr.delete(this.current),this.projection&&this.projection.unmount(),et(this.notifyUpdate),et(this.render),this.valueSubscriptions.forEach((t=>t())),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const t in this.events)this.events[t].clear();for(const t in this.features){const e=this.features[t];e&&(e.unmount(),e.isMounted=!1)}this.current=null}bindToMotionValue(t,e){this.valueSubscriptions.has(t)&&this.valueSubscriptions.get(t)();const n=G.has(t),i=e.on("change",(e=>{this.latestValues[t]=e,this.props.onUpdate&&tt.preRender(this.notifyUpdate),n&&this.projection&&(this.projection.isTransformDirty=!0)})),s=e.on("renderRequest",this.scheduleRender);let o;window.MotionCheckAppearSync&&(o=window.MotionCheckAppearSync(this,t,e)),this.valueSubscriptions.set(t,(()=>{i(),s(),o&&o(),e.owner&&e.stop()}))}sortNodePosition(t){return this.current&&this.sortInstanceNodePosition&&this.type===t.type?this.sortInstanceNodePosition(this.current,t.current):0}updateFeatures(){let t="animation";for(t in nr){const e=nr[t];if(!e)continue;const{isEnabled:n,Feature:i}=e;if(!this.features[t]&&i&&n(this.props)&&(this.features[t]=new i(this)),this.features[t]){const e=this.features[t];e.isMounted?e.update():(e.mount(),e.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):{x:{min:0,max:0},y:{min:0,max:0}}}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,e){this.latestValues[t]=e}update(t,e){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=e;for(let n=0;ne.variantChildren.delete(t)}addValue(t,e){const n=this.values.get(t);e!==n&&(n&&this.removeValue(t),this.bindToMotionValue(t,e),this.values.set(t,e),this.latestValues[t]=e.get())}removeValue(t){this.values.delete(t);const e=this.valueSubscriptions.get(t);e&&(e(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,e){if(this.props.values&&this.props.values[t])return this.props.values[t];let n=this.values.get(t);return void 0===n&&void 0!==e&&(n=pt(null===e?void 0:e,{owner:this}),this.addValue(t,n)),n}readValue(t,e){var n;let i=void 0===this.latestValues[t]&&this.current?null!==(n=this.getBaseTargetFromProps(this.props,t))&&void 0!==n?n:this.readValueFromInstance(this.current,t,this.options):this.latestValues[t];var s;return null!=i&&("string"==typeof i&&(Be(i)||Rt(i))?i=parseFloat(i):(s=i,!Gr.find(ze(s))&&le.test(e)&&(i=xe(t,e))),this.setBaseTarget(t,ft(i)?i.get():i)),ft(i)?i.get():i}setBaseTarget(t,e){this.baseTarget[t]=e}getBaseTarget(t){var e;const{initial:n}=this.props;let i;if("string"==typeof n||"object"==typeof n){const s=u(this.props,n,null===(e=this.presenceContext)||void 0===e?void 0:e.custom);s&&(i=s[t])}if(n&&void 0!==i)return i;const s=this.getBaseTargetFromProps(this.props,t);return void 0===s||ft(s)?void 0!==this.initialValues[t]&&void 0===i?void 0:this.baseTarget[t]:s}on(t,e){return this.events[t]||(this.events[t]=new ut),this.events[t].add(e)}notify(t,...e){this.events[t]&&this.events[t].notify(...e)}}class Qr extends _r{constructor(){super(...arguments),this.KeyframeResolver=Xe}sortInstanceNodePosition(t,e){return 2&t.compareDocumentPosition(e)?1:-1}getBaseTargetFromProps(t,e){return t.style?t.style[e]:void 0}removeValueFromRenderState(t,{vars:e,style:n}){delete e[t],delete n[t]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;ft(t)&&(this.childSubscription=t.on("change",(t=>{this.current&&(this.current.textContent=`${t}`)})))}}class Jr extends Qr{constructor(){super(...arguments),this.type="html",this.renderInstance=Vr}readValueFromInstance(t,e){if(G.has(e)){const t=ye(e);return t&&t.default||0}{const i=(n=t,window.getComputedStyle(n)),s=(Oe(e)?i.getPropertyValue(e):i[e])||0;return"string"==typeof s?s.trim():s}var n}measureInstanceViewportBox(t,{transformPagePoint:e}){return as(t,e)}build(t,e,n){xr(t,e,n.transformTemplate)}scrapeMotionValuesFromProps(t,e,n){return kr(t,e,n)}}class ta extends Qr{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=Ki}getBaseTargetFromProps(t,e){return t[e]}readValueFromInstance(t,e){if(G.has(e)){const t=ye(e);return t&&t.default||0}return e=Cr.has(e)?e:gt(e),t.getAttribute(e)}scrapeMotionValuesFromProps(t,e,n){return Rr(t,e,n)}build(t,e,n){Sr(t,e,this.isSVGTag,n.transformTemplate)}renderInstance(t,e,n,i){Mr(t,e,0,i)}mount(t){this.isSVGTag=Er(t.tagName),super.mount(t)}}const ea=i(Yr({...Pi,...Yo,...Fo,...Xo},((t,e)=>dr(t)?new ta(e):new Jr(e,{allowProjection:t!==ms.Fragment}))))},98288:(t,e,n)=>{n.d(e,{B:()=>i});const i="undefined"!=typeof window},28601:(t,e,n)=>{n.d(e,{M:()=>s});var i=n(96540);function s(t){const e=(0,i.useRef)(null);return null===e.current&&(e.current=t()),e.current}},25128:(t,e,n)=>{n.d(e,{E:()=>s});var i=n(96540);const s=n(98288).B?i.useLayoutEffect:i.useEffect},75395:(t,e,n)=>{n.d(e,{A:()=>a});var i=n(96540);const s=(...t)=>t.filter(((t,e,n)=>Boolean(t)&&""!==t.trim()&&n.indexOf(t)===e)).join(" ").trim();var o={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const r=(0,i.forwardRef)((({color:t="currentColor",size:e=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:a="",children:l,iconNode:u,...c},h)=>(0,i.createElement)("svg",{ref:h,...o,width:e,height:e,stroke:t,strokeWidth:r?24*Number(n)/Number(e):n,className:s("lucide",a),...c},[...u.map((([t,e])=>(0,i.createElement)(t,e))),...Array.isArray(l)?l:[l]]))),a=(t,e)=>{const n=(0,i.forwardRef)((({className:n,...o},a)=>{return(0,i.createElement)(r,{ref:a,iconNode:e,className:s(`lucide-${l=t,l.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,n),...o});var l}));return n.displayName=`${t}`,n}}}]); \ No newline at end of file diff --git a/assets/js/3099.80faf26d.js.LICENSE.txt b/assets/js/3099.80faf26d.js.LICENSE.txt new file mode 100644 index 00000000..f02ba941 --- /dev/null +++ b/assets/js/3099.80faf26d.js.LICENSE.txt @@ -0,0 +1,6 @@ +/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/3380767f.3e1f661c.js b/assets/js/3380767f.3e1f661c.js new file mode 100644 index 00000000..e9972ddd --- /dev/null +++ b/assets/js/3380767f.3e1f661c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4229],{47528:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"tutorials/lead-worker","title":"Lead/Worker Multi-Model Setup","description":"Enable multi-model functionality by pairing LLMs to complete your tasks","source":"@site/docs/tutorials/lead-worker.md","sourceDirName":"tutorials","slug":"/tutorials/lead-worker","permalink":"/goose/docs/tutorials/lead-worker","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"description":"Enable multi-model functionality by pairing LLMs to complete your tasks"},"sidebar":"tutorialSidebar","previous":{"title":"Observability with Langfuse","permalink":"/goose/docs/tutorials/langfuse"},"next":{"title":"Goose Recipes","permalink":"/goose/docs/tutorials/recipes-tutorial"}}');var o=n(74848),s=n(28453),a=n(65537),i=n(79329);const l={description:"Enable multi-model functionality by pairing LLMs to complete your tasks"},d="Lead/Worker Multi-Model Setup",c={},u=[{value:"Turn-Based System",id:"turn-based-system",level:2},{value:"Quick Example",id:"quick-example",level:2},{value:"Configuration",id:"configuration",level:2},{value:"What Counts as a Failure?",id:"what-counts-as-a-failure",level:2},{value:"Reasons to Use Lead/Worker",id:"reasons-to-use-leadworker",level:2},{value:"Best Practices",id:"best-practices",level:2},{value:"Planning Mode Compatibility",id:"planning-mode-compatibility",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"leadworker-multi-model-setup",children:"Lead/Worker Multi-Model Setup"})}),"\n",(0,o.jsx)(t.p,{children:"Goose supports a lead/worker model configuration that lets you pair two different AI models - one that's great at thinking and another that's fast at doing. This setup tackles a major pain point: premium models are powerful but expensive, while cheaper models are faster but can struggle with complex tasks. With lead/worker mode, you get the best of both worlds."}),"\n",(0,o.jsx)(t.p,{children:'The lead/worker model is a smart hand-off system. The "lead" model (think: GPT-4 or Claude Opus) kicks things off, handling the early planning and big picture reasoning. Once the direction is set, Goose hands the task over to the "worker" model (like GPT-4o-mini or Claude Sonnet) to carry out the steps.'}),"\n",(0,o.jsx)(t.p,{children:"If things go sideways (e.g. the worker model gets confused or keeps making mistakes), Goose notices and automatically pulls the lead model back in to recover. Once things are back on track, the worker takes over again."}),"\n",(0,o.jsx)(t.h2,{id:"turn-based-system",children:"Turn-Based System"}),"\n",(0,o.jsxs)(t.p,{children:["A ",(0,o.jsx)(t.strong,{children:"turn"})," is one full interaction - your prompt and the model's response. Goose switches models based on turns:"]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Initial turns"})," (default: 3) go to the lead model"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Subsequent turns"})," use the worker model"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Fallback kicks in"})," if the worker model fails too many times in a row"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Recovery"})," returns the session to the worker model once things stabilize"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"quick-example",children:"Quick Example"}),"\n",(0,o.jsx)(t.p,{children:"You might configure Goose like this:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'export GOOSE_LEAD_MODEL="gpt-4o" # strong reasoning\nexport GOOSE_MODEL="gpt-4o-mini" # fast execution\nexport GOOSE_PROVIDER="openai"\n'})}),"\n",(0,o.jsxs)(t.p,{children:["Goose will start with ",(0,o.jsx)(t.code,{children:"gpt-4o"})," for the first three turns, then hand off to ",(0,o.jsx)(t.code,{children:"gpt-4o-mini"}),". If the worker gets tripped up twice in a row, Goose temporarily switches back to the lead model for two fallback turns before trying the worker again."]}),"\n",(0,o.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsxs)(t.p,{children:["Ensure you have ",(0,o.jsx)(t.a,{href:"/docs/getting-started/providers",children:"added the LLMs to Goose"})]})}),"\n",(0,o.jsxs)(a.A,{groupId:"interface",children:[(0,o.jsx)(i.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsx)(t.li,{children:"Click the model name at the bottom of the Goose Desktop window"}),"\n",(0,o.jsxs)(t.li,{children:["Click ",(0,o.jsx)(t.strong,{children:"Lead/Worker Settings"})]}),"\n",(0,o.jsxs)(t.li,{children:["Check the box to ",(0,o.jsx)(t.strong,{children:"Enable lead/worker mode"})]}),"\n",(0,o.jsxs)(t.li,{children:["Select your ",(0,o.jsx)(t.strong,{children:"Lead Model"})," and ",(0,o.jsx)(t.strong,{children:"Worker Model"})," from the dropdown menus"]}),"\n",(0,o.jsxs)(t.li,{children:["(Optional) Change the default number of ",(0,o.jsx)(t.strong,{children:"initial lead turns"}),", the ",(0,o.jsx)(t.strong,{children:"failure threshold"})," before switching back to the leavd model, or the number of ",(0,o.jsx)(t.strong,{children:"fallback turns"})," to use the lead model during fallback"]}),"\n"]})}),(0,o.jsxs)(i.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(t.p,{children:["The only required configuration is setting the ",(0,o.jsx)(t.code,{children:"GOOSE_LEAD_MODEL"})," ",(0,o.jsx)(t.a,{href:"/docs/guides/environment-variables#leadworker-model-configuration",children:"environment variable"}),":"]}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'export GOOSE_LEAD_MODEL="gpt-4o"\n'})}),(0,o.jsxs)(t.p,{children:["That's it. Goose treats your regular ",(0,o.jsx)(t.code,{children:"GOOSE_MODEL"})," as the worker model by default."]}),(0,o.jsx)(t.p,{children:"For more control, you can also set these optional environment variables:"}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'export GOOSE_LEAD_PROVIDER="anthropic" # If different from the main provider\nexport GOOSE_LEAD_TURNS=5 # Use lead model for first 5 turns\nexport GOOSE_LEAD_FAILURE_THRESHOLD=3 # Switch back to lead after 3 failures\nexport GOOSE_LEAD_FALLBACK_TURNS=2 # Use lead model for 2 turns before retrying worker\n'})}),(0,o.jsx)(t.p,{children:"After making these configurations, the lead/worker models will be used in new CLI and Desktop sessions."})]})]}),"\n",(0,o.jsx)(t.h2,{id:"what-counts-as-a-failure",children:"What Counts as a Failure?"}),"\n",(0,o.jsx)(t.p,{children:"Goose is smart about detecting actual task failures, not just API errors. The fallback kicks in when the worker:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Generates broken code (syntax errors, tool failures, missing files)"}),"\n",(0,o.jsx)(t.li,{children:"Hits permission issues"}),"\n",(0,o.jsx)(t.li,{children:'Gets corrected by the user ("that\'s wrong", "try again", etc.)'}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Technical hiccups like timeouts, authentication issues, or service downtime don't trigger fallback mode. Goose retries those quietly."}),"\n",(0,o.jsx)(t.h2,{id:"reasons-to-use-leadworker",children:"Reasons to Use Lead/Worker"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Lower your costs"})," by using cheaper models for routine execution"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Speed things up"})," while still getting solid plans from more capable models"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Mix and match providers"})," (e.g., Claude for reasoning, OpenAI for execution)"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Handle long dev sessions"})," without worrying about model fatigue or performance"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,o.jsx)(t.p,{children:"If you're just getting started, the default settings will work fine. But here's how to tune things:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Bump up ",(0,o.jsx)(t.code,{children:"GOOSE_LEAD_TURNS"})," to 5\u20137 for heavier planning upfront"]}),"\n",(0,o.jsxs)(t.li,{children:["Lower ",(0,o.jsx)(t.code,{children:"GOOSE_LEAD_FAILURE_THRESHOLD"})," to 1 if you want Goose to correct issues quickly"]}),"\n",(0,o.jsx)(t.li,{children:"Choose a fast, lightweight worker model (Claude Haiku, GPT-4o-mini) for day-to-day tasks"}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"For debugging, you can see model switching behavior by turning on this log:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"export RUST_LOG=goose::providers::lead_worker=info\n"})}),"\n",(0,o.jsx)(t.h2,{id:"planning-mode-compatibility",children:"Planning Mode Compatibility"}),"\n",(0,o.jsxs)(t.p,{children:["The lead/worker model is an automatic alternative to the ",(0,o.jsxs)(t.a,{href:"/goose/docs/guides/creating-plans",children:["Goose CLI's ",(0,o.jsx)(t.code,{children:"/plan"})," command"]}),". You can assign separate models to use as the lead/worker and planning models. For example:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'export GOOSE_PROVIDER="openai"\nexport GOOSE_MODEL="gpt-4o-mini" # the main conversational model\n\nexport GOOSE_LEAD_MODEL="o1-preview" # the lead model used automatically\nexport GOOSE_PLANNER_MODEL="gpt-4o" # the model used when you explicitly call /plan\n'})}),"\n",(0,o.jsxs)(t.p,{children:["Use ",(0,o.jsx)(t.strong,{children:"planning mode"})," when you want a dedicated reasoning model to generate comprehensive strategies that you can review and approve before execution. Use the ",(0,o.jsx)(t.strong,{children:"lead/worker model"})," for iterative development work where you want smart automation without interruption - like implementing features, debugging issues, or exploratory coding. Your workflow can combine both: use ",(0,o.jsx)(t.code,{children:"/plan"})," to strategize major decisions, then let the lead/worker models handle the tactical implementation with automatic optimization."]})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},79329:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var r=n(34164);const o={tabItem:"tabItem_Ymn6"};var s=n(74848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(o.tabItem,a),hidden:n,children:t})}},65537:(e,t,n)=>{n.d(t,{A:()=>v});var r=n(96540),o=n(34164),s=n(65627),a=n(56347),i=n(50372),l=n(30604),d=n(11861),c=n(78749);function u(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:o}}=e;return{value:t,label:n,attributes:r,default:o}}))}(n);return function(e){const t=(0,d.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const o=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(o.location.search);t.set(s,e),o.replace({...o.location,search:t.toString()})}),[s,o])]}function g(e){const{defaultValue:t,queryString:n=!1,groupId:o}=e,s=h(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[d,u]=m({queryString:n,groupId:o}),[g,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[o,s]=(0,c.Dv)(n);return[o,(0,r.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:o}),x=(()=>{const e=d??g;return p({value:e,tabValues:s})?e:null})();(0,i.A)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,s]),tabValues:s}}var f=n(9136);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(74848);function j(e){let{className:t,block:n,selectedValue:r,selectValue:a,tabValues:i}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),c=e=>{const t=e.currentTarget,n=l.indexOf(t),o=i[n].value;o!==r&&(d(t),a(o))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":n},t),children:i.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>{l.push(e)},onKeyDown:u,onClick:c,...s,className:(0,o.A)("tabs__item",x.tabItem,s?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function k(e){let{lazy:t,children:n,selectedValue:s}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,r.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function w(e){const t=g(e);return(0,b.jsxs)("div",{className:(0,o.A)("tabs-container",x.tabList),children:[(0,b.jsx)(j,{...t,...e}),(0,b.jsx)(k,{...t,...e})]})}function v(e){const t=(0,f.A)();return(0,b.jsx)(w,{...e,children:u(e.children)},String(t))}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var r=n(96540);const o={},s=r.createContext(o);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33fc5bb8.1c858f6d.js b/assets/js/33fc5bb8.1c858f6d.js new file mode 100644 index 00000000..5f9b1ffe --- /dev/null +++ b/assets/js/33fc5bb8.1c858f6d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[867],{54003:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(96540);var s=a(34164),n=a(81082),r=a(204),l=a(11926),i=a(56289),o=a(83750),c=a(60569),d=a(17448),u=a(37220),g=a(14005),h=a(95921),m=a(74848);function p(e){let{author:t}=e;const a=(0,l.wI)(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(n.be,{title:a}),(0,m.jsx)(u.A,{tag:"blog_authors_posts"})]})}function x(){const{authorsListPath:e}=(0,o.x)();return(0,m.jsx)(i.A,{href:e,children:(0,m.jsx)(l.np,{})})}function j(e){let{author:t,items:a,sidebar:s,listMetadata:n}=e;return(0,m.jsxs)(c.A,{sidebar:s,children:[(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(h.A,{as:"h1",author:t}),t.description&&(0,m.jsx)("p",{children:t.description}),(0,m.jsx)(x,{})]}),0===a.length?(0,m.jsx)("p",{children:(0,m.jsx)(l.Y4,{})}):(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)("hr",{}),(0,m.jsx)(g.A,{items:a}),(0,m.jsx)(d.A,{metadata:n})]})]})}function b(e){return(0,m.jsxs)(n.e3,{className:(0,s.A)(r.G.wrapper.blogPages,r.G.page.blogAuthorsPostsPage),children:[(0,m.jsx)(p,{...e}),(0,m.jsx)(j,{...e})]})}},17448:(e,t,a)=>{a.d(t,{A:()=>l});a(96540);var s=a(50539),n=a(11865),r=a(74848);function l(e){const{metadata:t}=e,{previousPage:a,nextPage:l}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(n.A,{permalink:a,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),l&&(0,r.jsx)(n.A,{permalink:l,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},18189:(e,t,a)=>{a.d(t,{A:()=>C});a(96540);var s=a(34164),n=a(83750),r=a(74848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(56289);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,n.e7)(),{permalink:c,title:d}=a,u=l?"h1":"h2";return(0,r.jsx)(u,{className:(0,s.A)(o.title,t),children:l?d:(0,r.jsx)(i.A,{to:c,children:d})})}var d=a(50539),u=a(81430),g=a(98569);const h={container:"container_mt6G"};function m(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,n.e7)(),{date:l,readingTime:i}=a,o=(0,g.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(p,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(m,{readingTime:i})]})]});var c}var b=a(95921);const A={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function f(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,n.e7)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",i?A.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,s.A)(!i&&(o?"col col--12":"col col--6"),i?A.imageOnlyAuthorCol:A.authorCol),children:(0,r.jsx)(b.A,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function v(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(j,{}),(0,r.jsx)(f,{})]})}var N=a(30099),T=a(57985);function w(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,n.e7)();return(0,r.jsx)("div",{id:l?N.LU:void 0,className:(0,s.A)("markdown",a),children:(0,r.jsx)(T.A,{children:t})})}var _=a(204),k=a(5783),y=a(46547);function P(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function R(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(P,{})})}function U(){const{metadata:e,isBlogPostPage:t}=(0,n.e7)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,u=!t&&o,g=a.length>0;if(!(g||u||i))return null;if(t){const e=!!(i||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("row","margin-top--sm",_.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(y.A,{tags:a})})}),e&&(0,r.jsx)(k.A,{className:(0,s.A)("margin-top--sm",_.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("col",{"col--9":u}),children:(0,r.jsx)(y.A,{tags:a})}),u&&(0,r.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":g}),children:(0,r.jsx)(R,{blogPostTitle:l,to:e.permalink})})]})}function C(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,s.A)(i,a),children:[(0,r.jsx)(v,{}),(0,r.jsx)(w,{children:t}),(0,r.jsx)(U,{})]})}},14005:(e,t,a)=>{a.d(t,{A:()=>l});a(96540);var s=a(83750),n=a(18189),r=a(74848);function l(e){let{items:t,component:a=n.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(s.in,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},11865:(e,t,a)=>{a.d(t,{A:()=>l});a(96540);var s=a(34164),n=a(56289),r=a(74848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(n.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},46547:(e,t,a)=>{a.d(t,{A:()=>d});a(96540);var s=a(34164),n=a(50539),r=a(56289);const l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var i=a(74848);function o(e){let{permalink:t,label:a,count:n,description:o}=e;return(0,i.jsxs)(r.A,{href:t,title:o,className:(0,s.A)(l.tag,n?l.tagWithCount:l.tagRegular),children:[a,n&&(0,i.jsx)("span",{children:n})]})}const c={tags:"tags_jXut",tag:"tag_QGVx"};function d(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(c.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:c.tag,children:(0,i.jsx)(o,{...e})},e.permalink)))})]})}},11926:(e,t,a)=>{a.d(t,{Y4:()=>d,np:()=>c,uz:()=>o,wI:()=>i});a(96540);var s=a(50539),n=a(81430),r=a(74848);function l(){const{selectMessage:e}=(0,n.W)();return t=>e(t,(0,s.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function i(e){const t=l();return(0,s.T)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:t(e.count),authorName:e.name||e.key})}const o=()=>(0,s.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function c(){return(0,r.jsx)(s.A,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}function d(){return(0,r.jsx)(s.A,{id:"theme.blog.author.noPosts",description:"The text for authors with 0 blog post",children:"This author has not written any posts yet."})}},94591:(e,t,a)=>{a.d(t,{A:()=>o});a(96540);var s=a(88602),n=a(34164),r=a(56289),l=a(74848);const i=e=>{let{size:t=null,outline:a=!1,variant:s="primary",block:i=!1,disabled:o=!1,className:c,style:d,link:u,label:g}=e;const h=t?{sm:"sm",small:"sm",lg:"lg",large:"lg",medium:null}[t]:"",m=h?`button--${h}`:"",p=a?"button--outline":"",x=s?`button--${s}`:"",j=i?"button--block":"",b=o?"disabled":"",A=o?null:u,f=g.replace(":arrow_down:","\u2b07\ufe0f");return(0,l.jsx)(r.A,{to:A,children:(0,l.jsx)("button",{className:(0,n.A)("button",m,p,x,j,b,c),style:d,role:"button","aria-disabled":o,children:f})})},o={...s.A,Button:i}}}]); \ No newline at end of file diff --git a/assets/js/3434.367a2044.js b/assets/js/3434.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/3434.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/34b105eb.45acfb80.js b/assets/js/34b105eb.45acfb80.js new file mode 100644 index 00000000..f970efe3 --- /dev/null +++ b/assets/js/34b105eb.45acfb80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,7865,8196,8202],{76869:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>p,frontMatter:()=>c,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"mcp/vscode-mcp","title":"VS Code Extension","description":"Use the Goose VS Code Extension to connect Goose to your editor","source":"@site/docs/mcp/vscode-mcp.md","sourceDirName":"mcp","slug":"/mcp/vscode-mcp","permalink":"/goose/docs/mcp/vscode-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"VS Code Extension","description":"Use the Goose VS Code Extension to connect Goose to your editor"},"sidebar":"tutorialSidebar","previous":{"title":"Tutorial Extension","permalink":"/goose/docs/mcp/tutorial-mcp"},"next":{"title":"YouTube Transcript Extension","permalink":"/goose/docs/mcp/youtube-transcript-mcp"}}');var i=t(74848),r=t(28453),s=t(65537),l=t(79329),a=t(25887);const c={title:"VS Code Extension",description:"Use the Goose VS Code Extension to connect Goose to your editor"},d=void 0,u={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function m(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.A,{videoUrl:"https://www.youtube.com/embed/gddEgvCLrgU"}),"\n",(0,i.jsxs)(n.p,{children:["This tutorial covers how to install and use the ",(0,i.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=block.vscode-goose",children:"Goose VS Code Extension"})," so you can use Goose interactively for file operations and development workflow management from within VS Code."]}),"\n",(0,i.jsx)(n.admonition,{title:"Prerequisite",type:"info",children:(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://code.visualstudio.com/",children:"VS Code"})," version 1.95.0 or higher is required"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://block.github.io/goose/",children:"Goose Desktop"})," must be installed and running"]}),"\n"]})}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(s.A,{children:[(0,i.jsx)(l.A,{value:"desktop",label:"Goose Desktop",children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Open VS Code"}),"\n",(0,i.jsxs)(n.li,{children:["Open the Extensions view in VS Code:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Windows/Linux: ",(0,i.jsx)(n.code,{children:"Ctrl+Shift+X"})]}),"\n",(0,i.jsxs)(n.li,{children:["macOS: ",(0,i.jsx)(n.code,{children:"Cmd+Shift+X"})]}),"\n",(0,i.jsx)(n.li,{children:"Or use: View \u2192 Extensions"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Search for ",(0,i.jsx)(n.code,{children:"VS Code Goose"})]}),"\n",(0,i.jsxs)(n.li,{children:["Click Install on ",(0,i.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=block.vscode-goose",children:"VS Code Goose"})," by Block"]}),"\n",(0,i.jsx)(n.li,{children:"Restart VS Code if prompted"}),"\n",(0,i.jsx)(n.li,{children:"Open the Goose: Chat side panel to start a new conversation or view conversation history"}),"\n"]})}),(0,i.jsx)(l.A,{value:"cli",label:"Goose CLI",children:(0,i.jsx)(n.p,{children:"Not available via CLI."})})]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"You can ask Goose about a particular file or code block by:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Selecting the code you want to discuss"}),"\n",(0,i.jsx)(n.li,{children:'Right-clicking and choosing "Ask Goose about this code"'}),"\n",(0,i.jsx)(n.li,{children:"The code will appear as a reference chip above the chat input"}),"\n"]})]}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsx)(n.p,{children:"The Goose VS Code Extension connects directly to your editor, letting you manage files, projects, and workflows with AI. It includes the following features:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Interactive chat UI"}),"\n",(0,i.jsx)(n.li,{children:"Access to Goose's AI capabilities directly within VS Code"}),"\n",(0,i.jsx)(n.li,{children:"Unified session switching"}),"\n",(0,i.jsx)(n.li,{children:"Code referencing with visual chips in the chat UI"}),"\n",(0,i.jsx)(n.li,{children:"Quick actions for common coding tasks"}),"\n",(0,i.jsx)(n.li,{children:"Clipboard tools to copy code snippets/responses for easy sharing"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Update the contributing guide at /goose/CONTRIBUTING.md with instructions on how to start docusaurus dev server\n"})}),"\n",(0,i.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"\nI'll help you update the CONTRIBUTING.md file with instructions for starting the Docusaurus dev server. First, let me check the current content of the file.\n\n\u2500\u2500\u2500 developer__text_editor | view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nI'll now update the CONTRIBUTING.md file to include instructions for starting the Docusaurus dev server. I'll add this information in a new section under the Node section.\n\n\u2500\u2500\u2500 developer__text_editor | str_replace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nI've successfully updated the CONTRIBUTING.md file to include instructions for starting the Docusaurus dev server. I added a new \"Documentation\" section right after the Node section, which provides clear step-by-step instructions for:\n\nNavigating to the docs directory\nInstalling dependencies\nStarting the development server\nI also included helpful information about the hot-reloading feature and the local server URL. The formatting is consistent with the rest of the document, using proper markdown syntax for code blocks and headers.\n\nIs there anything else you'd like me to add or modify in the contributing guide?\n\n"})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>G});var o=t(96540),i=t(74848);function r(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=o.Children.toArray(e),t=n.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),r=n.filter((e=>e!==t)),s=t?.props.children;return{mdxAdmonitionTitle:s,rest:r.length>0?(0,i.jsx)(i.Fragment,{children:r}):null}}(e.children),r=e.title??n;return{...e,...r&&{title:r},children:t}}var s=t(34164),l=t(50539),a=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:o}=e;return(0,i.jsx)("div",{className:(0,s.A)(a.G.common.admonition,a.G.common.admonitionType(n),c,t),children:o})}function p(e){let{icon:n,title:t}=e;return(0,i.jsxs)("div",{className:d,children:[(0,i.jsx)("span",{className:u,children:n}),t]})}function f(e){let{children:n}=e;return n?(0,i.jsx)("div",{className:h,children:n}):null}function x(e){const{type:n,icon:t,title:o,children:r,className:s}=e;return(0,i.jsxs)(m,{type:n,className:s,children:[o||t?(0,i.jsx)(p,{title:o,icon:t}):null,(0,i.jsx)(f,{children:r})]})}function v(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const g={icon:(0,i.jsx)(v,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function j(e){return(0,i.jsx)(x,{...g,...e,className:(0,s.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,i.jsx)(b,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,i.jsx)(x,{...y,...e,className:(0,s.A)("alert alert--success",e.className),children:e.children})}function C(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,i.jsx)(C,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function I(e){return(0,i.jsx)(x,{...N,...e,className:(0,s.A)("alert alert--info",e.className),children:e.children})}function A(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const k={icon:(0,i.jsx)(A,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function T(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const V={icon:(0,i.jsx)(T,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const S={icon:(0,i.jsx)(A,{}),title:(0,i.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:j,tip:w,info:I,warning:function(e){return(0,i.jsx)(x,{...k,...e,className:(0,s.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(x,{...V,...e,className:(0,s.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(j,{title:"secondary",...e}),important:e=>(0,i.jsx)(I,{title:"important",...e}),success:e=>(0,i.jsx)(w,{title:"success",...e}),caution:function(e){return(0,i.jsx)(x,{...S,...e,className:(0,s.A)("alert alert--warning",e.className),children:e.children})}}};function G(e){const n=r(e),t=(o=n.type,E[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),E.info));var o;return(0,i.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var o=t(34164);const i={tabItem:"tabItem_Ymn6"};var r=t(74848);function s(e){let{children:n,hidden:t,className:s}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,o.A)(i.tabItem,s),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),i=t(34164),r=t(65627),s=t(56347),l=t(50372),a=t(30604),c=t(11861),d=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:i}}=e;return{value:n,label:t,attributes:o,default:i}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const i=(0,s.W6)(),r=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,a.aZ)(r),(0,o.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(i.location.search);n.set(r,e),i.replace({...i.location,search:n.toString()})}),[r,i])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,r=h(e),[s,a]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:r}))),[c,u]=p({queryString:t,groupId:i}),[f,x]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,r]=(0,d.Dv)(t);return[i,(0,o.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:i}),v=(()=>{const e=c??f;return m({value:e,tabValues:r})?e:null})();(0,l.A)((()=>{v&&a(v)}),[v]);return{selectedValue:s,selectValue:(0,o.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),x(e)}),[u,x,r]),tabValues:r}}var x=t(9136);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(74848);function j(e){let{className:n,block:t,selectedValue:o,selectValue:s,tabValues:l}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),i=l[t].value;i!==o&&(c(n),s(i))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:r}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{a.push(e)},onKeyDown:u,onClick:d,...r,className:(0,i.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:r}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function y(e){const n=f(e);return(0,g.jsxs)("div",{className:(0,i.A)("tabs-container",v.tabList),children:[(0,g.jsx)(j,{...n,...e}),(0,g.jsx)(b,{...n,...e})]})}function w(e){const n=(0,x.A)();return(0,g.jsx)(y,{...e,children:u(e.children)},String(n))}},25887:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(52362),i=t(74848);const r=e=>{let{videoUrl:n}=e;return(0,i.jsxs)("div",{children:[(0,i.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Watch the demo"}),(0,i.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,i.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,i.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var o=t(96540);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/350e0713.04c78aad.js b/assets/js/350e0713.04c78aad.js new file mode 100644 index 00000000..4c74777f --- /dev/null +++ b/assets/js/350e0713.04c78aad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6761],{15528:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var i=o(25571),n=o(74848),s=o(28453);const l={title:"Finetuning Toolshim Models for Tool Calling",description:"Addressing performance limitations in models without native tool calling support",authors:["alice","mic"]},a=void 0,r={authorsImageUrls:[void 0,void 0]},c=[{value:"Why tool calling is important",id:"why-tool-calling-is-important",level:2},{value:"Background: using a local model as a "toolshim"",id:"background-using-a-local-model-as-a-toolshim",level:2},{value:"Proposal: Fine-tune a lightweight toolshim model (up to 12b)",id:"proposal-fine-tune-a-lightweight-toolshim-model-up-to-12b",level:2},{value:"Key Observations on Current Challenges with Tool Call Generation",id:"key-observations-on-current-challenges-with-tool-call-generation",level:2},{value:"Some examples of model-specific quirks wrt tool calling:",id:"some-examples-of-model-specific-quirks-wrt-tool-calling",level:3},{value:"Experimentation Approach",id:"experimentation-approach",level:2},{value:"Data Collection",id:"data-collection",level:3},{value:"Modeling",id:"modeling",level:3},{value:"Evaluations",id:"evaluations",level:3},{value:"Future approaches",id:"future-approaches",level:2}];function h(e){const t={a:"a",br:"br",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Head:i}=t;return i||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"blog cover",src:o(1905).A+"",width:"1200",height:"630"})}),"\n",(0,n.jsxs)(t.p,{children:["Our recently published ",(0,n.jsx)(t.a,{href:"https://block.github.io/goose/blog/2025/03/31/goose-benchmark",children:"Goose benchmark"})," revealed significant performance limitations in models where tool calling is not straightforwardly supported (e.g., Gemma3, Deepseek-r1, phi4). These models often fail to invoke tools at appropriate times or produce malformed or inconsistently formatted tool calls. With the most recent releases of Llama4 and Deepseek v3 (0324), we are again observing challenges with effective tool calling performance, even on these flagship openweight models."]}),"\n",(0,n.jsx)(t.h2,{id:"why-tool-calling-is-important",children:"Why tool calling is important"}),"\n",(0,n.jsx)(t.p,{children:"Tool calling is a critical capability for agents like goose. It allows models to go beyond text and image generation and take concrete actions, such as executing code, querying databases, searching the web, or interacting with design tools like Figma. Equipping agents with a broad set of tools empowers them to discover and interface with external systems, much like a human would. While this might be overkill for narrow, more deterministic applications of LLMs, it is essential for general-purpose agents like goose. Without reliable tool calling, we limit what models can do to help us automate, remove toil and navigate complex systems. Pure generation\u2013of text, images, speech, and video\u2013is just the first step on the path to more powerful agentic capabilities. There is so much more that models can do if we give them the legs to run."}),"\n",(0,n.jsx)(t.h2,{id:"background-using-a-local-model-as-a-toolshim",children:'Background: using a local model as a "toolshim"'}),"\n",(0,n.jsxs)(t.p,{children:['The goal is to allow goose to work with the widest variety of models possible. A "toolshim" in this case is a thin layer which sits between the main model doing the agent work, and the tools that can perform actual actions (making the agent take action, vs being a chatbot). Previously we have been trying this approach with open models including in this ',(0,n.jsx)(t.a,{href:"https://block.github.io/goose/blog/2025/03/31/goose-benchmark",children:"past benchmark"})," post. A toolshim, if it can work, unlocks both powerful cutting edge models (open weight and closed) which while may perform well on various benchmarks, fall well short when tool calling for agents is required (or perhaps don't, by design, support tool calling at all, such as the case with some reasoning models)."]}),"\n",(0,n.jsx)(t.h2,{id:"proposal-fine-tune-a-lightweight-toolshim-model-up-to-12b",children:"Proposal: Fine-tune a lightweight toolshim model (up to 12b)"}),"\n",(0,n.jsx)(t.p,{children:"Develop a dedicated toolshim model that translates open-source model outputs into well-structured tool calls, acting as a reliable post-processor to standardize across model families trained that currently exhibit inconsistent and unreliable tool call generation behavior. We do not use tool calling apis even if available, but provide tool context in the system prompts."}),"\n",(0,n.jsxs)(t.p,{children:["We already experimented with this in the ",(0,n.jsx)(t.a,{href:"https://block.github.io/goose/blog/2025/03/31/goose-benchmark",children:"benchmarking effort"}),", finding that phi4 (14b) and gemma3 (27b) achieved close performance to llama3.3 (70b) when used with a generic local model (mistral-nemo) as the shim. This shows potential for furthering their performance with more focused attention on improving the shim's performance."]}),"\n",(0,n.jsx)(t.p,{children:"Toolshim System Sketch:"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Toolshim System Sketch",src:o(954).A+"",width:"1132",height:"828"})}),"\n",(0,n.jsx)(t.h2,{id:"key-observations-on-current-challenges-with-tool-call-generation",children:"Key Observations on Current Challenges with Tool Call Generation"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Model training templates are inconsistent"}),(0,n.jsx)(t.br,{}),"\n","For example, ",(0,n.jsx)(t.a,{href:"https://qwen.readthedocs.io/en/latest/framework/function_call.html",children:"Qwen models use"})," ",(0,n.jsx)(t.a,{href:"https://github.com/NousResearch/Hermes-Function-Calling",children:"Hermes-style tool formats"}),", while Openhands generates Markdown despite explicit JSON instructions\u2014suggesting training data shape can have an underestimated impact on reliable tool call generation"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Current workarounds aren't enough"}),(0,n.jsx)(t.br,{}),"\n",(0,n.jsx)(t.a,{href:"https://docs.vllm.ai/en/latest/features/tool_calling.html",children:"Model providers may implement approaches like guided decoding"})," to guarantee validly-parsable function calls, but these may not produce high-quality outputs if the model wasn't trained on schemas matching what users provide in context. The widespread challenges with tool use with Llama4 may be indicative of the challenges providers have in effectively serving new models to make full use of their capabilities"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Hosting providers vary wildly in how well they work with tool calls"}),(0,n.jsx)(t.br,{}),"\n","Hosting providers helpfully provide chat templates or similar which can, in many cases, prompt some of the larger models to reply correctly formatted tool calls, and thus can support openai-like apis where tools are provided, but in practice these can fall short after one shot, or vary a lot between providers (an issue exacerbated if using model routers such as openrouter or huggingface hosted inference)"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"some-examples-of-model-specific-quirks-wrt-tool-calling",children:"Some examples of model-specific quirks wrt tool calling:"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Openhands"}),": Despite instructions to generate JSON-formatted tool calls, still generates markdown (likely due to shape of their training data)"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Openhands example",src:o(50958).A+"",width:"1287",height:"233"})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Llama4 Maverick"}),": Generates malformed tool calls, but performs somewhat better when specifically prompted to generate tool calls as JSON"]}),"\n",(0,n.jsxs)(t.p,{children:['With "tool calls" on OpenRouter:',(0,n.jsx)(t.br,{}),"\n",(0,n.jsx)(t.img,{alt:"OpenRouter tool calls example",src:o(62437).A+"",width:"1295",height:"621"})]}),"\n",(0,n.jsxs)(t.p,{children:["Llama4 Maverick when instead just prompted to generate tool calls in JSON:",(0,n.jsx)(t.br,{}),"\n",(0,n.jsx)(t.img,{alt:"Llama4 example",src:o(48439).A+"",width:"1296",height:"767"})]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Gemma3"}),": A DeepMind engineer ",(0,n.jsx)(t.a,{href:"https://www.philschmid.de/gemma-function-calling",children:"suggested providing a function calling template in-context in Python format"}),(0,n.jsx)(t.br,{}),"\n","The 12B model also outputs valid JSON tool calls reasonably well:",(0,n.jsx)(t.br,{}),"\n",(0,n.jsx)(t.img,{alt:"Gemma3 example",src:o(19148).A+"",width:"1293",height:"299"})]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Functionary models"}),": ",(0,n.jsx)(t.a,{href:"https://github.com/MeetKai/functionary/issues/302#issuecomment-2650187280",children:"Ollama couldn't support the tool calling capabilities"})," because these models were trained with prompt templates in a TypeScript schema incompatible with Ollama's supported JSON schema"]}),"\n",(0,n.jsx)(t.h2,{id:"experimentation-approach",children:"Experimentation Approach"}),"\n",(0,n.jsx)(t.h3,{id:"data-collection",children:"Data Collection"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Extract user messages from historical Goose sessions, and for messages followed by tool calls from Anthropic/OpenAI (all tool calls up to today):","\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Regenerate tool calls with open models:"})," Regenerate the tool calls with the most capable open models that have supported tool calling capabilities (e.g., QwQ, Qwen, deepseek chat v3)"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Generate json/markdown-formatted tool calls to parse:"})," Instruct the most capable open models (e.g., DeepSeek-r1, Llama4, Gemma3), that don't necessarily have strong tool calling to output tool calls in the correct schema (JSON/markdown). Parse the output into the appropriate tool calls."]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.strong,{children:"Discard any malformed tool calls, tool calls that fail to properly execute, or tool calls that meet other rejection criteria"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.li,{children:"Generate a few thousand examples with this approach"}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"modeling",children:"Modeling"}),"\n",(0,n.jsx)(t.p,{children:"Fine tune small models like mistral-nemo (14b), gemma 4-12b, qwen2.5-coder 7-14b."}),"\n",(0,n.jsx)(t.h3,{id:"evaluations",children:"Evaluations"}),"\n",(0,n.jsx)(t.p,{children:"Test with Goosebench evals run in the benchmarking blogpost. We can directly compare performance of models with and without the finetuned toolshim models supporting them."}),"\n",(0,n.jsx)(t.h2,{id:"future-approaches",children:"Future approaches"}),"\n",(0,n.jsx)(t.p,{children:"On top of local models, we would like to consider parsers, parser combinators, context-free grammars and more (even very large ones) which are constructed based on 1000s of examples of tool results. Even if large, these can operate at every low latencies extracting parameters for suggested tool calls. There are likely other structured text extraction techniques to be explored to assist with discovery and extraction of tool calls from rich responses from powerful general models."}),"\n",(0,n.jsxs)(i,{children:[(0,n.jsx)("meta",{property:"og:title",content:"Finetuning Toolshim Models for Tool Calling"}),(0,n.jsx)("meta",{property:"og:type",content:"article"}),(0,n.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/04/11/finetuning-toolshim"}),(0,n.jsx)("meta",{property:"og:description",content:"Addressing performance limitations in models without native tool calling support"}),(0,n.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png"}),(0,n.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,n.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,n.jsx)("meta",{name:"twitter:title",content:"Finetuning Toolshim Models for Tool Calling"}),(0,n.jsx)("meta",{name:"twitter:description",content:"Addressing performance limitations in models without native tool calling support"}),(0,n.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png"})]})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},19148:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/gemma3-eca1a363fea57b818a967883e567a481.png"},48439:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/llama4-2ebc0ab8f18d31c450ee2bf34aa82191.png"},50958:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/openhands-7fe1d878c7108c846e6275ed3157be6e.png"},62437:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/openrouter_toolcalls-01ef22c3d91ff5580c49b89f6599293f.png"},954:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/sketch-0bb4b0e6fb7fdbd194fff4db41c3806f.png"},1905:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/toolshim-header-42611f614e7722f90cf83991debe3046.png"},28453:(e,t,o)=>{o.d(t,{R:()=>l,x:()=>a});var i=o(96540);const n={},s=i.createContext(n);function l(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(s.Provider,{value:t},e.children)}},25571:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/11/finetuning-toolshim","source":"@site/blog/2025-04-11-finetuning-toolshim/index.md","title":"Finetuning Toolshim Models for Tool Calling","description":"Addressing performance limitations in models without native tool calling support","date":"2025-04-11T00:00:00.000Z","tags":[],"readingTime":5.46,"hasTruncateMarker":true,"authors":[{"name":"Alice Hau","title":"Machine Learning Engineer","page":{"permalink":"/goose/blog/authors/alice"},"socials":{"linkedin":"https://www.linkedin.com/in/alice-hau/","github":"https://github.com/alicehau"},"imageURL":"https://avatars.githubusercontent.com/u/110418948?v=4","key":"alice"},{"name":"Michael Neale","title":"Principal Engineer","page":{"permalink":"/goose/blog/authors/mic"},"socials":{"github":"https://github.com/michaelneale"},"imageURL":"https://avatars.githubusercontent.com/u/14976?v=4","key":"mic"}],"frontMatter":{"title":"Finetuning Toolshim Models for Tool Calling","description":"Addressing performance limitations in models without native tool calling support","authors":["alice","mic"]},"unlisted":false,"prevItem":{"title":"How ATrueLight4 Helped Goose Navigate Windows","permalink":"/goose/blog/2025/04/14/community-atruelight4"},"nextItem":{"title":"A Visual Guide To MCP Ecosystem","permalink":"/goose/blog/2025/04/10/visual-guide-mcp"}}')}}]); \ No newline at end of file diff --git a/assets/js/3595da8b.31ddc3d5.js b/assets/js/3595da8b.31ddc3d5.js new file mode 100644 index 00000000..2feaf205 --- /dev/null +++ b/assets/js/3595da8b.31ddc3d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4894],{42752:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});var n=o(70672),i=o(74848),s=o(28453);const r={title:"Why I Used Goose to Build a Chaotic Emotion Detection App",description:"The joys of experimenting with computer vision using Goose, an MCP host",authors:["rizel"]},a=void 0,l={authorsImageUrls:[void 0]},c=[];function p(e){const t={a:"a",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"blog cover",src:o(18853).A+"",width:"2240",height:"1260"})}),"\n",(0,i.jsx)(t.p,{children:"Developers deserve to have fun. There was a time when the internet felt magical. I remember going to the library just to create a character on The Doll Palace. At home, I'd spend hours changing fonts with WordArt. But as I grew up, the industry did too. We've shifted away from marquees and glittery cursors. Grown-up me started using ones and zeros to build reliable systems for insurance, banking, and healthcare companies. There's pride in that, but it's harder to justify doing something just because it's fun."}),"\n",(0,i.jsxs)(t.p,{children:["That's why I tapped into my inner child and used ",(0,i.jsx)(t.a,{href:"/",children:"Goose"})," to ",(0,i.jsx)(t.a,{href:"https://chaotic-emotion-detector-production.up.railway.app/",children:"build a UI that reacts to users' emotions"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},18853:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/emotion-powered-ui-83b0e779f22a3a060eef7bb29e04090d.png"},28453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>a});var n=o(96540);const i={},s=n.createContext(i);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}},70672:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/06/17/goose-emotion-detection-app","source":"@site/blog/2025-06-17-goose-emotion-detection-app/index.mdx","title":"Why I Used Goose to Build a Chaotic Emotion Detection App","description":"The joys of experimenting with computer vision using Goose, an MCP host","date":"2025-06-17T00:00:00.000Z","tags":[],"readingTime":4.52,"hasTruncateMarker":true,"authors":[{"name":"Rizel Scarlett","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/rizel"},"socials":{"x":"https://x.com/blackgirlbytes","github":"https://github.com/blackgirlbytes","bluesky":"https://bsky.app/profile/blackgirlbytes.bsky.social","linkedin":"https://www.linkedin.com/in/rizel-bobb-semple/"},"imageURL":"https://avatars.githubusercontent.com/u/22990146?v=4","key":"rizel"}],"frontMatter":{"title":"Why I Used Goose to Build a Chaotic Emotion Detection App","description":"The joys of experimenting with computer vision using Goose, an MCP host","authors":["rizel"]},"unlisted":false,"prevItem":{"title":"Isolated Dev Environments in Goose with container-use","permalink":"/goose/blog/2025/06/19/isolated-development-environments"},"nextItem":{"title":"Treating LLMs Like Tools in a Toolbox: A Multi-Model Approach to Smarter AI Agents","permalink":"/goose/blog/2025/06/16/multi-model-in-goose"}}')}}]); \ No newline at end of file diff --git a/assets/js/36994c47.b3429105.js b/assets/js/36994c47.b3429105.js new file mode 100644 index 00000000..c7754a2f --- /dev/null +++ b/assets/js/36994c47.b3429105.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9858],{45516:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/384b152f.381b9dd9.js b/assets/js/384b152f.381b9dd9.js new file mode 100644 index 00000000..732f845b --- /dev/null +++ b/assets/js/384b152f.381b9dd9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4194],{6325:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>k,contentTitle:()=>y,default:()=>G,frontMatter:()=>b,metadata:()=>s,toc:()=>v});var s=n(6727),o=n(74848),a=n(28453),i=n(16198),r=n(83349),d=n(7626),l=n(59975),c=n(79032),h=n(85349),p=n(22683),g=n(21374),m=n(41096),u=n(68709),x=n(92946),j=n(17533),w=n(93022),f=n(97921);const b={title:"Codename Goose Goes to New York",description:"Goose lands in NYC for its second community meetup",authors:["ebony"]},y="Codename Goose Goes to New York \ud83d\uddfd",k={authorsImageUrls:[void 0]},v=[{value:"Why We Brought Goose to NYC",id:"why-we-brought-goose-to-nyc",level:2},{value:"In Case You Missed It",id:"in-case-you-missed-it",level:2},{value:"What People Said",id:"what-people-said",level:2},{value:"Moments We Loved \u2764\ufe0f",id:"moments-we-loved-\ufe0f",level:2},{value:"Up Next: Goose Flies South \ud83d\udeeb",id:"up-next-goose-flies-south-",level:2},{value:"Big Thanks \ud83d\ude4c",id:"big-thanks-",level:2}];function A(e){const t={a:"a",blockquote:"blockquote",br:"br",em:"em",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components},{Head:s}=t;return s||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"blog cover",src:n(94184).A+"",width:"2240",height:"1260"})}),"\n",(0,o.jsx)(t.p,{children:"We brought Goose to New York City and it was one for the books."}),"\n",(0,o.jsxs)(t.p,{children:["Over 100 people registered, plus 87 on the waitlist, and we had a packed room full of folks who were curious, thoughtful, and ready to dive in. Some were developers already exploring Goose and MCP, others were totally new to the world of AI agents. That\u2019s the beauty of Goose, it\u2019s for developers ",(0,o.jsx)(t.em,{children:"and"})," non-developers."]}),"\n",(0,o.jsx)(t.p,{children:"The energy was there from the moment the event began - music, pizza, and authentic networking. We had lightning talks, a Goose-themed game, hands-on hacking, and yeah\u2026 a few Ebbs IPAs might\u2019ve ended up in people\u2019s backpacks by the end of the night."}),"\n",(0,o.jsx)(t.h2,{id:"why-we-brought-goose-to-nyc",children:"Why We Brought Goose to NYC"}),"\n",(0,o.jsx)(t.p,{children:"After the Boston meetup, we wanted to keep the momentum going and test things in a new city. New York felt like the perfect place. It\u2019s a melting pot of people and has a really strong tech scene. Our goals were simple:"}),"\n",(0,o.jsxs)(t.p,{children:["\u2705 Keep building the Goose community",(0,o.jsx)(t.br,{}),"\n","\u2705 Get real feedback and ideas from the community in person",(0,o.jsx)(t.br,{}),"\n","\u2705 Have some fun while learning together"]}),"\n",(0,o.jsx)(t.p,{children:"NYC didn\u2019t disappoint."}),"\n",(0,o.jsx)(t.h2,{id:"in-case-you-missed-it",children:"In Case You Missed It"}),"\n",(0,o.jsx)(i.A,{id:"test-carousel",images:[u.A,h.A,p.A,g.A,m.A]}),"\n",(0,o.jsx)(t.p,{children:"We kicked things off with food and free time to meet people, chat, and ask questions before jumping into the talks:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/erinmikail/",children:"Erin Mikail"})})," from Galileo ran a Goose-themed game that got people laughing ",(0,o.jsx)(t.em,{children:"and"})," learning about the importance of agent evaluation."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/ebonylouis/",children:"I, Ebony Louis"})})," gave a walkthrough of Goose and MCP, showing how quick it is to get started with any MCP server."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/alexjhancock/",children:"Alex Hancock"})})," went deep on MCP, and how it powers secure, extendable agent workflows."]}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["Then came the best part \u2014 hack time. ",(0,o.jsx)(t.strong,{children:"27 people got Goose up and running live"})," during the event, which was amazing to see. It\u2019s always fun watching that moment when it clicks for someone, ideas start flowing, people get inspired, and they walk away ready to actually ",(0,o.jsx)(t.em,{children:"use"})," Goose."]}),"\n",(0,o.jsx)(t.h2,{id:"what-people-said",children:"What People Said"}),"\n",(0,o.jsx)(i.A,{id:"test-carousel",images:[r.A,d.A,l.A,c.A]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["\u201cIt took me less than 5 mins to get myself set up with a sample project and running the Goose CLI in GitHub Codespaces! Overall it felt great to be back in a physical venue for a hands-on event with an engaged community and a timely topic for discussion.\u201d",(0,o.jsx)(t.br,{}),"\n","\u2014 ",(0,o.jsx)(t.em,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/nityan/",children:"Nitya Narasimhan, Senior Cloud Advocate @ Microsoft"})})]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["\u201cThe live demos, open discussions, and practical exercises made it an exceptional learning experience. Feeling energized and inspired to explore how Goose and MCP can be leveraged in future data engineering projects!\u201d",(0,o.jsx)(t.br,{}),"\n","\u2014 ",(0,o.jsx)(t.em,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/manireddy12/",children:"Manikumarreddy Gajjela, Full Stack Developer @ Tetra Computing"})})]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["\u201cEveryone seems bullish on Model Context Protocol (MCP) these days\u2026 Goose is an open-source, on-machine AI agent built to automate your tasks. The coolest part? You can even plug in your own hosted Ollama LLM with Goose!\u201d",(0,o.jsx)(t.br,{}),"\n","\u2014 ",(0,o.jsx)(t.em,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/rijuldahiya/",children:"Rijul Dahiya, Graduate Teaching Assistant @ NYU"})})]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["\u201cGreat event \u2013 great mix of introductory and technical material as well as fun, and I liked that it provided a bunch of time at the beginning and end that was unstructured.\u201d",(0,o.jsx)(t.br,{}),"\n","\u2014 ",(0,o.jsx)(t.em,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/matthewhillnewyork/",children:"Matthew Hill, Sr Director of AI Engineering @ Dataminr"})})]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"moments-we-loved-\ufe0f",children:"Moments We Loved \u2764\ufe0f"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"\ud83c\udf55 Pizza, music, and people catching up before things even kicked off"}),"\n",(0,o.jsx)(t.li,{children:"\ud83c\udfae The Goose game- yes, it got competitive and oddly dark lol"}),"\n",(0,o.jsx)(t.li,{children:"\ud83e\uddf3 Folks traveled from Philly and DC just to attend"}),"\n",(0,o.jsx)(t.li,{children:"\ud83d\udcf8 Having a photographer to capture candid and fun moments"}),"\n",(0,o.jsxs)(t.li,{children:["\ud83e\udde0 A bunch of thoughtful \u201cI\u2019m not a dev but\u2026\u201d questions that we ",(0,o.jsx)(t.em,{children:"loved"})," hearing"]}),"\n"]}),"\n",(0,o.jsx)(i.A,{id:"test-carousel",images:[j.A,x.A,w.A,f.A,p.A]}),"\n",(0,o.jsx)(t.p,{children:"At the end, people were asking when the next one is and yes, we may have let it slip early\u2026"}),"\n",(0,o.jsx)(t.h2,{id:"up-next-goose-flies-south-",children:"Up Next: Goose Flies South \ud83d\udeeb"}),"\n",(0,o.jsx)(t.p,{children:"Our next Goose Meetup is already locked in!"}),"\n",(0,o.jsxs)(t.p,{children:["\ud83d\udc49 ",(0,o.jsx)(t.strong,{children:"Atlanta \u2013 Wednesday, April 30"}),(0,o.jsx)(t.br,{}),"\n","\ud83d\udd55 ",(0,o.jsx)(t.strong,{children:"6:00 PM \u2013 8:30 PM ET"}),(0,o.jsx)(t.br,{}),"\n","\ud83d\udccd ",(0,o.jsx)(t.a,{href:"https://lu.ma/x9ccqruq",children:"RSVP here"})]}),"\n",(0,o.jsx)(t.h2,{id:"big-thanks-",children:"Big Thanks \ud83d\ude4c"}),"\n",(0,o.jsxs)(t.p,{children:["Huge shoutout to ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/taniachakraborty/",children:"Tania Chakraborty"})})," and ",(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.a,{href:"https://www.linkedin.com/in/anthonygiuliano1/",children:"Anthony Giuliano"})})," for being there, and to everyone who came through, asked questions, helped out, and made it a night to remember."]}),"\n",(0,o.jsx)(t.p,{children:"The community truly made this one special, people stayed after to chat, helped clean up without being asked, and brought such a good energy into the room. We couldn\u2019t have asked for a better crowd."}),"\n",(0,o.jsx)(t.p,{children:"We\u2019ll see you in Atlanta \ud83d\udc40"}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("meta",{property:"og:title",content:"Codename Goose Goes to New York"}),(0,o.jsx)("meta",{property:"og:type",content:"article"}),(0,o.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/04/17/goose-goes-to-NY"}),(0,o.jsx)("meta",{property:"og:description",content:"Goose lands in NYC for its second community meetup"}),(0,o.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png"}),(0,o.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,o.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,o.jsx)("meta",{name:"twitter:title",content:"Codename Goose Goes to New York"}),(0,o.jsx)("meta",{name:"twitter:description",content:"Goose lands in NYC for its second community meetup"}),(0,o.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png"})]})]})}function G(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(A,{...e})}):A(e)}},16198:(e,t,n)=>{n.d(t,{A:()=>r});var s=n(96540),o=n(46874),a=n(58943),i=n(74848);const r=e=>{let{images:t,id:n,width:r="100%",names:d=[]}=e;const[l,c]=s.useState(0),h=()=>Array.isArray(d)&&d.length>l&&d[l]?d[l]:"";return(0,i.jsxs)("div",{className:"carousel-container",children:[h()&&(0,i.jsx)("h3",{className:"carousel-header",children:h()}),(0,i.jsx)(o.RC,{spaceBetween:10,slidesPerView:1,navigation:!0,pagination:{clickable:!0},modules:[a.Vx,a.dK],className:`swiper-container-${n}`,style:{width:r},onSlideChange:e=>c(e.activeIndex),children:t.map(((e,t)=>(0,i.jsx)(o.qr,{children:(0,i.jsx)("img",{src:e,alt:`Slide ${t+1}`,className:"carousel-image"})},t)))})]})}},85349:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/focus-4927104eb487e6b1f9480d8149e26c36.jpg"},22683:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/focus2-4ca4bc40c7a86ec46ec566d4d1fd2001.jpg"},21374:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/focus3-8ba8fb623d148fa5583c41c0a7a721a4.jpg"},68709:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/focus4-8232c187021a690519cfa1e8f1c18014.jpg"},41096:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/focus5-afe81c949e09dc788989d1c20c3a74fe.jpg"},93022:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/fun-340fa01a11fd04982ae7e2e612bded03.jpg"},97921:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/fun1-b0d7060f8629eec662b2c9f5a22dd7d0.jpg"},92946:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/speaker-bd71c5b83c6e0cd202ea8aa8af867b58.jpg"},17533:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/speaker1-45d20237329fb76d724e73b6ee1f7a89.jpg"},59975:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/swag-8eaec6e42aea06511f6334c6e9e21ec1.jpg"},7626:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/swag1-7e7ee0095446a64f5dbcffe6b5b69460.jpg"},83349:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/swag2-6ed2a0029c159d14013e366f6f945268.jpg"},79032:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/swag3-50d943bd7ee6e68c65ad0bed5e339f9a.jpg"},94184:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png"},6727:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/17/goose-goes-to-NY","source":"@site/blog/2025-04-17-goose-goes-to-NY/index.mdx","title":"Codename Goose Goes to New York","description":"Goose lands in NYC for its second community meetup","date":"2025-04-17T00:00:00.000Z","tags":[],"readingTime":4.35,"hasTruncateMarker":true,"authors":[{"name":"Ebony Louis","title":"Developer Advocate","page":{"permalink":"/goose/blog/authors/ebony"},"socials":{"linkedin":"https://www.linkedin.com/in/ebonylouis/","x":"https://x.com/ebonyjlouis","github":"https://github.com/ebonylouis"},"imageURL":"https://avatars.githubusercontent.com/u/55366651?v=4","key":"ebony"}],"frontMatter":{"title":"Codename Goose Goes to New York","description":"Goose lands in NYC for its second community meetup","authors":["ebony"]},"unlisted":false,"prevItem":{"title":"11 Practical Ways I Use AI Agents Without Losing My Authenticity","permalink":"/goose/blog/2025/04/21/practical-use-cases-of-ai"},"nextItem":{"title":"How ATrueLight4 Helped Goose Navigate Windows","permalink":"/goose/blog/2025/04/14/community-atruelight4"}}')}}]); \ No newline at end of file diff --git a/assets/js/393be207.8e2c7255.js b/assets/js/393be207.8e2c7255.js new file mode 100644 index 00000000..e9b1e03f --- /dev/null +++ b/assets/js/393be207.8e2c7255.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4134],{41943:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>p,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"type":"mdx","permalink":"/goose/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}');var a=t(74848),r=t(28453);const s={title:"Markdown page example"},p="Markdown page example",c={},d=[];function i(e){const n={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,a.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(i,{...e})}):i(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>p});var o=t(96540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function p(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3a4b97be.db5f6443.js b/assets/js/3a4b97be.db5f6443.js new file mode 100644 index 00000000..a0801954 --- /dev/null +++ b/assets/js/3a4b97be.db5f6443.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1570],{14454:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>g,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var i=o(36561),n=o(74848),s=o(28453);const a={title:"Turn Figma Designs Into Code With Goose",description:"Give Goose the ability to turn Figma designs into code with the Figma extension.",authors:["tania"]},r="How It Works",l={authorsImageUrls:[void 0]},c=[];function h(e){const t={a:"a",h1:"h1",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components},{Head:i}=t;return i||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"blog cover",src:o(39431).A+"",width:"1206",height:"633"})}),"\n",(0,n.jsxs)(t.p,{children:["In our previous episode of ",(0,n.jsx)(t.a,{href:"https://www.youtube.com/playlist?list=PLyMFt_U2IX4s1pMaidir5P4lSfjUK6Nzm",children:"Goose Flight School"}),", our host ",(0,n.jsx)(t.a,{href:"https://www.linkedin.com/in/acekyd/",children:"Adewale Abati"})," showed us how to use Goose to take a Figma design and transform it into a functional Nuxt application. In this stream he covered the entire process, from initial setup to final implementation, highlighting how Goose can help developers bridge the gap between design and development."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://block.github.io/goose/docs/getting-started/using-extensions",children:"Extensions"})," enhance Goose's functionality by connecting with your existing tools and workflows. They add new features, access external data resources, and integrate with other systems. Learn how multiple extensions, including Figma and Developer, worked together seamlessly to dramatically accelerate development."]}),"\n",(0,n.jsx)(t.h1,{id:"live-tutorial-goose-builds-live",children:"Live Tutorial: Goose Builds Live"}),"\n",(0,n.jsx)(t.p,{children:"During the livestream, Adewale demonstrated step-by-step how Goose handled each development phase, from creating the basic application structure to generating responsive layouts using Tailwind CSS. Adewale also highlighted how Goose addresses potential limitations as you go, showcasing the powerful balance between the Goose's automation and developer control."}),"\n",(0,n.jsx)("iframe",{class:"aspect-ratio",src:"https://www.youtube.com/embed/_9t_N9zKwKM?si=r3e1MkrjS-f2AvkI",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:!0}),"\n",(0,n.jsx)(t.p,{children:"Throughout the stream, Adewale shared valuable tips to prepare your design for Goose. His key recommendations include:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"start with a well-structured Figma design"}),"\n",(0,n.jsx)(t.li,{children:"use Goose to make targeted improvements after the initial generation"}),"\n",(0,n.jsx)(t.li,{children:"fine-tune specific elements as needed"}),"\n",(0,n.jsx)(t.li,{children:"make sure you thoroughly test for functionality and responsiveness"}),"\n"]}),"\n",(0,n.jsx)(t.h1,{id:"getting-started-with-goose-and-figma",children:"Getting Started with Goose and Figma"}),"\n",(0,n.jsxs)(t.p,{children:["Whether you're a designer wanting to rapidly turn concepts into working code or a developer curious about streamlining design implementation, you can download Goose with its built-in ",(0,n.jsx)(t.a,{href:"https://block.github.io/goose/docs/getting-started/installation",children:"Developer extension"})," and add the ",(0,n.jsx)(t.a,{href:"https://block.github.io/goose/v1/extensions/",children:"Figma extension"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["For step-by-step instructions, check out the ",(0,n.jsx)(t.a,{href:"/docs/mcp/figma-mcp",children:"Figma tutorial"}),"."]}),"\n",(0,n.jsxs)(i,{children:[(0,n.jsx)("meta",{property:"og:title",content:"Goose Flight School: Turn Figma Designs Into Code With Goose"}),(0,n.jsx)("meta",{property:"og:type",content:"article"}),(0,n.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/03/12/goose-figma-mcp"}),(0,n.jsx)("meta",{property:"og:description",content:"Give Goose the ability to turn Figma designs into code with the Figma extension."}),(0,n.jsx)("meta",{property:"og:image",content:"http://block.github.io/goose/assets/images/goosefigma-e6f84a734bd56cb431bb02452331a5d5.png"}),(0,n.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,n.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,n.jsx)("meta",{name:"twitter:title",content:"Goose Flight School: Turn Figma Designs Into Code With Goose"}),(0,n.jsx)("meta",{name:"twitter:description",content:"Give Goose the ability to turn Figma designs into code with the Figma extension."}),(0,n.jsx)("meta",{name:"twitter:image",content:"http://block.github.io/goose/assets/images/goosefigma-e6f84a734bd56cb431bb02452331a5d5.png"})]})]})}function g(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},39431:(e,t,o)=>{o.d(t,{A:()=>i});const i=o.p+"assets/images/goosefigma-e6f84a734bd56cb431bb02452331a5d5.png"},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>r});var i=o(96540);const n={},s=i.createContext(n);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:t},e.children)}},36561:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/12/goose-figma-mcp","source":"@site/blog/2025-03-12-goose-figma-mcp/index.md","title":"Turn Figma Designs Into Code With Goose","description":"Give Goose the ability to turn Figma designs into code with the Figma extension.","date":"2025-03-12T00:00:00.000Z","tags":[],"readingTime":1.8,"hasTruncateMarker":true,"authors":[{"name":"Tania Chakraborty","title":"Senior Technical Community Manager","url":"https://taniachakraborty.com","page":{"permalink":"/goose/blog/authors/tania"},"socials":{"linkedin":"https://www.linkedin.com/in/taniachakraborty/","x":"https://x.com/taniashiba","github":"https://github.com/taniashiba","bluesky":"https://bsky.app/profile/taniachakraborty.com"},"imageURL":"https://avatars.githubusercontent.com/u/126204004?v=4","key":"tania"}],"frontMatter":{"title":"Turn Figma Designs Into Code With Goose","description":"Give Goose the ability to turn Figma designs into code with the Figma extension.","authors":["tania"]},"unlisted":false,"prevItem":{"title":"AI, But Make It Local With Goose and Ollama","permalink":"/goose/blog/2025/03/14/goose-ollama"},"nextItem":{"title":"Automating Phone Calls with Goose","permalink":"/goose/blog/2025/03/10/goose-calls-vyop"}}')}}]); \ No newline at end of file diff --git a/assets/js/3b1a06c8.3b7a6b3a.js b/assets/js/3b1a06c8.3b7a6b3a.js new file mode 100644 index 00000000..ba473f00 --- /dev/null +++ b/assets/js/3b1a06c8.3b7a6b3a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9213],{81507:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>h,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=t(7686),s=t(74848),i=t(28453);const r={unlisted:!0,title:"What's in my .goosehints file (and why it probably shouldn't be)",description:"A deep dive into .goosehints vs Memory Extension, and how to optimize your Goose configuration for better performance",authors:["ian"]},a="What's in my .goosehints file (and why it probably shouldn't be)",h={authorsImageUrls:[void 0]},l=[{value:"AI Agents and Memory",id:"ai-agents-and-memory",level:2},{value:"What is .goosehints?",id:"what-is-goosehints",level:3},{value:"What is the Memory Extension?",id:"what-is-the-memory-extension",level:3},{value:"How are .goosehints and Memory Extension used in Goose?",id:"how-are-goosehints-and-memory-extension-used-in-goose",level:2},{value:"The Implications of .goosehints",id:"the-implications-of-goosehints",level:2},{value:"Where I went wrong with my .goosehints",id:"where-i-went-wrong-with-my-goosehints",level:2},{value:"So what "belongs" in .goosehints?",id:"so-what-belongs-in-goosehints",level:3},{value:"Everything else got moved into the Memory Extension",id:"everything-else-got-moved-into-the-memory-extension",level:2},{value:"To hint, or not to hint?",id:"to-hint-or-not-to-hint",level:2}];function d(e){const o={a:"a",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Head:n}=o;return n||function(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"blog cover",src:t(66786).A+"",width:"1809",height:"950"})}),"\n",(0,s.jsxs)(o.p,{children:["As Goose users, we have two main ways to provide persistent context to our AI assistant: the ",(0,s.jsx)(o.code,{children:".goosehints"})," file and the ",(0,s.jsx)(o.a,{href:"/docs/mcp/memory-mcp",children:"Memory Extension"})," MCP server. Today, I'll share what's in my ",(0,s.jsx)(o.code,{children:".goosehints"})," file, why some of it should probably move to the Memory Extension, and how you can make that choice."]}),"\n",(0,s.jsx)(o.h2,{id:"ai-agents-and-memory",children:"AI Agents and Memory"}),"\n",(0,s.jsx)(o.p,{children:'Imagine ordering coffee at two different cafes. At the first cafe, you\'re a first-time customer, carefully explaining "medium mocha latte, fat-free milk, extra hot, no foam, with one pump of vanilla." At your regular coffee spot, though, the barista sees you coming and just says "the usual?"'}),"\n",(0,s.jsx)(o.p,{children:"That stored knowledge \u2013 your preferences, quirks, and routine \u2013 makes the whole interaction faster and more pleasant for everyone."}),"\n",(0,s.jsx)(o.p,{children:"This is exactly the challenge we face with AI assistants. By default, they start each conversation (aka, \"context window\") fresh \u2013 no memory of your coding standards, documentation preferences, or how you like your pull requests structured. The same way you'd get tired of reciting your detailed coffee order every morning, it's inefficient to repeatedly explain to your AI assistant that you prefer Python's Black formatter, want detailed commit messages, and or how you want to construct a briefing going to everyone in the company."}),"\n",(0,s.jsxs)(o.p,{children:["This is where persistent context comes in. Through tools like ",(0,s.jsx)(o.code,{children:".goosehints"})," and the ",(0,s.jsx)(o.a,{href:"/docs/mcp/memory-mcp",children:"Memory Extension"})," MCP server, we can give our AI assistants the equivalent of a barista's \"regular customer\" knowledge. But just as you wouldn't want your barista memorizing your entire life story just to make your coffee, we need to be thoughtful about what context we make persistent. The key is finding the right balance between having enough context to work efficiently and not overwhelming our systems with unnecessary information."]}),"\n",(0,s.jsx)(o.p,{children:"Let's explore how to strike that balance."}),"\n",(0,s.jsx)(o.h3,{id:"what-is-goosehints",children:"What is .goosehints?"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:".goosehints"})," is a configuration file that lives in your Goose directory (usually ",(0,s.jsx)(o.code,{children:"~/.config/goose/"}),"). It can contain any information that you want Goose to process every time you interact with Goose, providing a foundation for how it interacts with you."]}),"\n",(0,s.jsxs)(o.p,{children:["You can read more about ",(0,s.jsx)(o.code,{children:".goosehints"})," in the ",(0,s.jsx)(o.a,{href:"/docs/guides/using-goosehints",children:"Goose documentation"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"what-is-the-memory-extension",children:"What is the Memory Extension?"}),"\n",(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.a,{href:"/docs/mcp/memory-mcp",children:"Memory Extension"})," is a dynamic storage system using the Model Context Protocol that allows you to store and retrieve context on-demand using tags or keywords. It lives in your ",(0,s.jsx)(o.code,{children:"~/.goose/memory"})," directory (local) or ",(0,s.jsx)(o.code,{children:"~/.config/goose/memory"})," (global)."]}),"\n",(0,s.jsxs)(o.p,{children:["Unlike ",(0,s.jsx)(o.code,{children:".goosehints"}),", which is static and loaded entirely with every request, Memory Extension can be updated and accessed as needed, allowing for more flexible and user-specific configurations."]}),"\n",(0,s.jsx)(o.h2,{id:"how-are-goosehints-and-memory-extension-used-in-goose",children:"How are .goosehints and Memory Extension used in Goose?"}),"\n",(0,s.jsx)(o.p,{children:"At a very high level, when you have a conversation with Goose, it processes your request in two main steps:"}),"\n",(0,s.jsxs)(o.p,{children:["Goose interprets your request to detect tags or keywords needed for possible Memory Extension lookups. Then it loads your entire ",(0,s.jsx)(o.code,{children:".goosehints"})," file, and sends that, along with any relevant Memory Extension entries to the LLM to generate a response."]}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"how a user interaction works with Goose",src:t(83356).A+"",width:"1024",height:"1024"})}),"\n",(0,s.jsx)(o.h2,{id:"the-implications-of-goosehints",children:"The Implications of .goosehints"}),"\n",(0,s.jsxs)(o.p,{children:["To reiterate, ",(0,s.jsxs)(o.strong,{children:["every single line in your ",(0,s.jsx)(o.code,{children:".goosehints"})," file gets sent with every request to Goose"]}),'. If you write a ton of rules and ideas with all your project preferences, coding standards, and workflow documentation and so on into the .goosehints file, the ENTIRE file is being transmitted and processed every time you ask Goose anything, even something as simple as "what time is it?"']}),"\n",(0,s.jsx)(o.p,{children:"This is particularly important for users who are paying for their own LLM access (like ChatGPT or Gemini). Here's why:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.strong,{children:"Input Tokens = Real Money"}),": Every line in your ",(0,s.jsx)(o.code,{children:".goosehints"})," file consumes input tokens. The LLM must process these tokens as part of its system instructions before it even looks at your question. While a small ",(0,s.jsx)(o.code,{children:".goosehints"})," file might not seem like a big deal, it can quickly add up if you're not careful. All-day vibe coding sessions are going to be using lots of tokens just interpreting that whole ",(0,s.jsx)(o.code,{children:".goosehints"})," file every time."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.strong,{children:"Context Window Impact"}),": Large ",(0,s.jsx)(o.code,{children:".goosehints"})," files eat into your ",(0,s.jsx)(o.a,{href:"https://zapier.com/blog/context-window/#:~:text=The%20cons%20of%20a%20large%20context%20window%20in%20AI&text=The%20requirements%20to%20process%20AI,request%2C%20things%20quickly%20add%20up.",children:"context window"}),", which is the amount of information the LLM can consider at one time. If your ",(0,s.jsx)(o.code,{children:".goosehints"})," file is too big, it can push out important context from your actual question or task, leading to less accurate or helpful responses."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["This means a large ",(0,s.jsx)(o.code,{children:".goosehints"})," file can:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Increase your AI costs"}),"\n",(0,s.jsx)(o.li,{children:"Reduce the amount of context available for actual work"}),"\n",(0,s.jsx)(o.li,{children:"Limit the complexity of tasks you can perform"}),"\n"]}),"\n",(0,s.jsx)(o.h2,{id:"where-i-went-wrong-with-my-goosehints",children:"Where I went wrong with my .goosehints"}),"\n",(0,s.jsxs)(o.p,{children:["When I first started using Goose, I treated ",(0,s.jsx)(o.code,{children:".goosehints"})," like a catch-all for everything I wanted Goose to remember. I included:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"rules on writing outlines for blog posts"}),"\n",(0,s.jsx)(o.li,{children:"how I like Python code written and formatted"}),"\n",(0,s.jsx)(o.li,{children:"notes about frontend development"}),"\n",(0,s.jsx)(o.li,{children:"etc"}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"That meant that every request I would make asking Goose to help come up with a catchy blog title was sending all of my rules about Python and using Tailwind CSS."}),"\n",(0,s.jsx)(o.h3,{id:"so-what-belongs-in-goosehints",children:'So what "belongs" in .goosehints?'}),"\n",(0,s.jsx)(o.p,{children:"Here's something I end nearly every AI prompt with:"}),"\n",(0,s.jsxs)(o.blockquote,{children:["\n",(0,s.jsxs)(o.p,{children:["If you're not 95% sure how to complete these instructions, or that you'll be at least 95% factually accurate, ",(0,s.jsx)(o.strong,{children:"do not guess or make things up"}),". Stop and ask me for more information or direction. If you're finding resources online, give me 1 or 2 URLs that informed your response."]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"I also like to end many of my prompts asking if Goose has any clarifying questions before doing the work I'm attempting:"}),"\n",(0,s.jsxs)(o.blockquote,{children:["\n",(0,s.jsxs)(o.p,{children:["Based on the information I've provided, ask me any clarifying questions ",(0,s.jsx)(o.strong,{children:"before"})," doing any work, or tell me that you're ready to proceed."]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"Since these are things that I definitely want to add to every request I make to Goose, I've simplified my .goosehints file to include only these types of rules and standards."}),"\n",(0,s.jsx)(o.h2,{id:"everything-else-got-moved-into-the-memory-extension",children:"Everything else got moved into the Memory Extension"}),"\n",(0,s.jsx)(o.p,{children:'The Memory Extension uses a tagging system to remember context based on keywords. You can give Goose a command to "remember" something, and Goose will write a Memory entry with appropriate tags. The next time you ask Goose to do something with Python, it will parse your request, look for relevant tags, and use appropriate Memory entries to send as part of the context for just that request.'}),"\n",(0,s.jsx)(o.p,{children:"So all of my Python rules can be written as a command to Goose like this:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-text",children:"Remember that when I ask about Python, I want to conform to the following standards and guidelines:\n- use Python 3.12+ syntax\n- use type hints for all function signatures\n- use f-strings for string formatting\n- use the latest Python features and libraries\n- use Flake8 for linting\n- use black for formatting\n- if I ask to build a CLI based tool, expect to take command line arguments and make a colorful interface using ANSI colors and the rich library\n- if I ask to build an API, expect to build a RESTful API use FastAPI and to send back data in JSON format\n"})}),"\n",(0,s.jsx)(o.p,{children:"Now, Goose will only send these Python-related rules when I ask it to do something with Python. This is far more efficient."}),"\n",(0,s.jsx)(o.p,{children:"Here's the resulting Memory file that Goose made:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-text",children:"# python standards development formatting linting api cli\nPython Development Standards:\n- Python version: 3.12+\n- Mandatory type hints for all function signatures\n- Use f-strings for string formatting\n- Use latest Python features and libraries\n- Code formatting: black\n- Linting: Flake8\n- CLI tools: Use command line arguments and rich library for colorful interface\n- APIs: Use FastAPI for RESTful APIs with JSON responses\n"})}),"\n",(0,s.jsxs)(o.p,{children:["The first line starts with a hash ",(0,s.jsx)(o.code,{children:"#"})," and a space-separated list of keywords and tags that it will use to discern when or whether to retrieve this content to send with a request to my LLM."]}),"\n",(0,s.jsx)(o.h2,{id:"to-hint-or-not-to-hint",children:"To hint, or not to hint?"}),"\n",(0,s.jsxs)(o.p,{children:["While ",(0,s.jsx)(o.code,{children:".goosehints"})," is powerful, it's important to use it judiciously. By moving appropriate content to the Memory Extension, you can optimize your Goose experience and keep your AI context use more efficient. Remember: every line in ",(0,s.jsx)(o.code,{children:".goosehints"})," is sent with every request, so choose wisely what goes there."]}),"\n",(0,s.jsxs)(o.p,{children:["Share your own ",(0,s.jsx)(o.code,{children:".goosehints"})," optimization stories in the ",(0,s.jsx)(o.a,{href:"http://discord.gg/block-opensource",children:"Goose community on Discord"}),"!"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("meta",{property:"og:title",content:"What's in my .goosehints file (and why it probably shouldn't be)"}),(0,s.jsx)("meta",{property:"og:type",content:"article"}),(0,s.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/06/05/whats-in-my-goosehints-file"}),(0,s.jsx)("meta",{property:"og:description",content:"Learn how to optimize your Goose configuration by understanding when to use .goosehints vs Memory Extension for better performance and maintainability."}),(0,s.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/blog-banner-7f0e5ed1cf875e64e3ebb3250932baaf.png"}),(0,s.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,s.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,s.jsx)("meta",{name:"twitter:title",content:"What's in my .goosehints file (and why it probably shouldn't be)"}),(0,s.jsx)("meta",{name:"twitter:description",content:"Learn how to optimize your Goose configuration by understanding when to use .goosehints vs Memory Extension for better performance and maintainability."}),(0,s.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/blog-banner-7f0e5ed1cf875e64e3ebb3250932baaf.png"}),(0,s.jsx)("meta",{name:"keywords",content:"Goose; .goosehints; Memory Extension MCP; AI configuration; performance optimization; developer productivity; context management; AI assistant; token costs; LLM efficiency"})]})]})}function c(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},66786:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/blog-banner-7f0e5ed1cf875e64e3ebb3250932baaf.png"},83356:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/goosehints-vs-memory-1f0cc2cadcfda38e903e66f5b82ef808.png"},28453:(e,o,t)=>{t.d(o,{R:()=>r,x:()=>a});var n=t(96540);const s={},i=n.createContext(s);function r(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(i.Provider,{value:o},e.children)}},7686:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/06/05/whats-in-my-goosehints-file","source":"@site/blog/2025-06-05-whats-in-my-goosehints-file/index.md","title":"What\'s in my .goosehints file (and why it probably shouldn\'t be)","description":"A deep dive into .goosehints vs Memory Extension, and how to optimize your Goose configuration for better performance","date":"2025-06-05T00:00:00.000Z","tags":[],"readingTime":7.565,"hasTruncateMarker":true,"authors":[{"name":"W Ian Douglas","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/ian"},"socials":{"linkedin":"https://www.linkedin.com/in/iandouglas736/","github":"https://github.com/iandouglas","bluesky":"https://bsky.app/profile/iandouglas736.com","x":"https://x.com/iandouglas736"},"imageURL":"https://avatars.githubusercontent.com/u/168030?v=4","key":"ian"}],"frontMatter":{"unlisted":true,"title":"What\'s in my .goosehints file (and why it probably shouldn\'t be)","description":"A deep dive into .goosehints vs Memory Extension, and how to optimize your Goose configuration for better performance","authors":["ian"]},"unlisted":true}')}}]); \ No newline at end of file diff --git a/assets/js/3c30a4c5.86334867.js b/assets/js/3c30a4c5.86334867.js new file mode 100644 index 00000000..d69b9dfd --- /dev/null +++ b/assets/js/3c30a4c5.86334867.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3023],{74717:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"mcp/nostrbook-mcp","title":"Nostrbook Extension","description":"Add Nostrbook MCP Server as a Goose Extension","source":"@site/docs/mcp/nostrbook-mcp.md","sourceDirName":"mcp","slug":"/mcp/nostrbook-mcp","permalink":"/goose/docs/mcp/nostrbook-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Nostrbook Extension","description":"Add Nostrbook MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Netlify Extension","permalink":"/goose/docs/mcp/netlify-mcp"},"next":{"title":"PDF Reader Extension","permalink":"/goose/docs/mcp/pdf-mcp"}}');var o=t(74848),s=t(28453),r=t(65537),l=t(79329);const a={title:"Nostrbook Extension",description:"Add Nostrbook MCP Server as a Goose Extension"},c=void 0,d={},u=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3},{value:"Core Concept",id:"core-concept",level:2},{value:"Implementation Guide",id:"implementation-guide",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Set Up Recipient Information (For Receiving Nutzaps)",id:"step-1-set-up-recipient-information-for-receiving-nutzaps",level:3},{value:"Step 2: Building the Sender Functionality",id:"step-2-building-the-sender-functionality",level:3},{value:"Step 3: Building the Recipient Functionality",id:"step-3-building-the-recipient-functionality",level:3},{value:"Important Implementation Details",id:"important-implementation-details",level:3},{value:"Testing",id:"testing",level:2},{value:"Security Considerations",id:"security-considerations",level:2}];function h(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,o.jsx)(n.a,{href:"https://gitlab.com/soapbox-pub/nostrbook",children:"Nostrbook MCP Server"})," as a Goose extension to provide access to a comprehensive registry of Nostr documentation that helps users understand the decentralized social protocol, its implementation possibilities, and technical specifications."]}),"\n",(0,o.jsxs)(n.admonition,{title:"TLDR",type:"tip",children:[(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Command"})}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"npx -y @nostrbook/mcp@latest\n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["Note that you'll need ",(0,o.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," installed on your system to run this command, as it uses ",(0,o.jsx)(n.code,{children:"npx"}),"."]})}),"\n",(0,o.jsxs)(r.A,{groupId:"interface",children:[(0,o.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=%40nostrbook%2Fmcp&id=nostrbook&name=Nostrbook&description=A%20comprehensive%20registry%20of%20Nostr%20documentation%20with%20structured%20knowledge",children:"Launch the installer"})}),"\n",(0,o.jsxs)(n.li,{children:["Press ",(0,o.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n",(0,o.jsxs)(n.li,{children:["Click ",(0,o.jsx)(n.code,{children:"Save Configuration"})]}),"\n",(0,o.jsxs)(n.li,{children:["Scroll to the top and click ",(0,o.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,o.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Run the ",(0,o.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["Choose to add a ",(0,o.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 Nostrbook\n // highlight-end\n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Nostrbook\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 npx -y @nostrbook/mcp@latest\n // highlight-end\n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Nostrbook\n\u2502\n\u25c7 What command should be run?\n\u2502 npx -y @nostrbook/mcp@latest\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 300\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"6",children:["\n",(0,o.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Nostrbook\n\u2502\n\u25c7 What command should be run?\n\u2502 npx -y @nostrbook/mcp@latest\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n// highlight-start\n\u25c7 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"7",children:["\n",(0,o.jsx)(n.li,{children:"Choose No when asked to add environment variables"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Nostrbook\n \u2502\n \u25c7 What command should be run?\n \u2502 npx -y @nostrbook/mcp@latest\n \u2502 \n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502 \n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 No\n \u2502 \n // highlight-end\n \u2514 Added Nostrbook extension\n"})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,o.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.em,{children:"Goose, what is the NIP-61 and how can I implement it?."})}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,o.jsx)(n.p,{children:"Note that IDs have been changed to generic ones"}),"\n",(0,o.jsxs)(n.admonition,{title:"CLI",type:"note",children:[(0,o.jsxs)(t,{children:[(0,o.jsx)("summary",{children:"Tool Calls"}),(0,o.jsx)(n.p,{children:"\u2500\u2500\u2500 read_nip | nostrbook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"}),(0,o.jsx)(n.p,{children:"nip: 61"})]}),(0,o.jsx)(n.h1,{id:"nip-61-implementing-nutzaps",children:"NIP-61: Implementing Nutzaps"}),(0,o.jsx)(n.p,{children:'NIP-61 defines "Nutzaps," which are P2PK Cashu tokens where the payment itself acts as the receipt. This protocol allows for Bitcoin micropayments through the Nostr ecosystem using Cashu tokens.'}),(0,o.jsx)(n.h2,{id:"core-concept",children:"Core Concept"}),(0,o.jsx)(n.p,{children:"Nutzaps enable users to send small Bitcoin payments to each other through Nostr events, with the tokens being locked to the recipient's specified public key."}),(0,o.jsx)(n.h2,{id:"implementation-guide",children:"Implementation Guide"}),(0,o.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Familiarize yourself with ",(0,o.jsx)(n.a,{href:"https://cashu.space/",children:"Cashu"})," and ",(0,o.jsx)(n.a,{href:"https://github.com/cashubtc/nuts/blob/main/11.md",children:"P2PK token locking"})]}),"\n",(0,o.jsxs)(n.li,{children:["Understand ",(0,o.jsx)(n.a,{href:"https://github.com/nostr-protocol/nips/blob/master/60.md",children:"NIP-60"})," for wallet functionality"]}),"\n",(0,o.jsx)(n.li,{children:"Ensure your implementation supports NUT-11 (P2PK) and NUT-12 (DLEQ proofs)"}),"\n"]}),(0,o.jsx)(n.h3,{id:"step-1-set-up-recipient-information-for-receiving-nutzaps",children:"Step 1: Set Up Recipient Information (For Receiving Nutzaps)"}),(0,o.jsxs)(n.p,{children:["Create and publish a ",(0,o.jsx)(n.code,{children:"kind:10019"})," event to inform others how to send you money:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "kind": 10019,\n "tags": [\n ["relay", "wss://your-relay1.com"],\n ["relay", "wss://your-relay2.com"],\n ["mint", "https://your-trusted-mint.com", "sat"],\n ["pubkey", ""]\n ]\n}\n'})}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["The ",(0,o.jsx)(n.code,{children:"pubkey"})," should be a dedicated public key (NOT your Nostr identity key)"]}),"\n",(0,o.jsx)(n.li,{children:"Store the corresponding private key safely in your NIP-60 wallet event"}),"\n",(0,o.jsx)(n.li,{children:"List only mints you trust and monitor"}),"\n"]}),(0,o.jsx)(n.h3,{id:"step-2-building-the-sender-functionality",children:"Step 2: Building the Sender Functionality"}),(0,o.jsx)(n.p,{children:"To implement nutzapping:"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Query recipient information"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-javascript",children:"// Fetch recipient's kind:10019 event\nconst recipientInfo = await relay.get({\n kinds: [10019],\n authors: [recipientPubkey]\n});\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Extract mint and P2PK information"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-javascript",children:"const recipientMints = recipientInfo.tags\n .filter(tag => tag[0] === 'mint')\n .map(tag => tag[1]);\n\nconst recipientLockKey = recipientInfo.tags\n .find(tag => tag[0] === 'pubkey')?.[1];\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Mint or swap tokens"})," at one of the recipient's trusted mints, P2PK-locking them to their specified key"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Publish the nutzap event"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "kind": 9321,\n "content": "Thanks for your post!",\n "tags": [\n ["proof", "{\\"amount\\":1,\\"C\\":\\"02...3f\\",\\"id\\":\\"000...\\",\\"secret\\":\\"[\\\\\\"P2PK\\\\\\",...]\\"}"],\n ["u", "https://recipient-specified-mint.com"],\n ["e", "", ""],\n ["p", ""]\n ]\n}\n'})}),"\n"]}),"\n"]}),(0,o.jsx)(n.h3,{id:"step-3-building-the-recipient-functionality",children:"Step 3: Building the Recipient Functionality"}),(0,o.jsx)(n.p,{children:"To implement nutzap receiving:"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Query for incoming nutzaps"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-javascript",children:'// Subscribe to nutzap events\nrelay.subscribe([\n {\n kinds: [9321],\n "#p": [myPubkey],\n "#u": myTrustedMints,\n since: lastCheckTimestamp\n }\n]);\n'})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Validate incoming nutzaps"}),":"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Verify the token is from a mint you've specified"}),"\n",(0,o.jsx)(n.li,{children:"Verify the token is locked to your P2PK key"}),"\n",(0,o.jsx)(n.li,{children:"Verify the DLEQ proof"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Redeem the token"}),":"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Swap the P2PK token into your wallet"}),"\n",(0,o.jsxs)(n.li,{children:["Create a ",(0,o.jsx)(n.code,{children:"kind:7376"})," event to record redemption:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "kind": 7376,\n "content": "", \n "tags": [\n ["e", "", "", "redeemed"],\n ["p", ""]\n ]\n}\n'})}),"\n"]}),"\n"]}),(0,o.jsx)(n.h3,{id:"important-implementation-details",children:"Important Implementation Details"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"P2PK Key Prefixing"}),': Always prefix the P2PK-lock public key with "02" for compatibility']}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Token Verification"}),": Implement local verification of DLEQ proofs"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Mint URL Normalization"}),": Normalize mint URLs to avoid issues with slight URL variations"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"User Guidance"}),": Guide users to use only NUT-11 and NUT-12 compatible mints"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Publishing Locations"}),": Publish nutzap events to the recipient's specified relays"]}),"\n"]}),(0,o.jsx)(n.h2,{id:"testing",children:"Testing"}),(0,o.jsx)(n.p,{children:"When testing your implementation:"}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Create test nutzaps with small amounts"}),"\n",(0,o.jsx)(n.li,{children:"Verify token redemption works correctly"}),"\n",(0,o.jsx)(n.li,{children:"Check that redemption records are properly created"}),"\n",(0,o.jsx)(n.li,{children:"Test with multiple mints for compatibility"}),"\n"]}),(0,o.jsx)(n.h2,{id:"security-considerations",children:"Security Considerations"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Never use the user's main Nostr key for P2PK operations"}),"\n",(0,o.jsx)(n.li,{children:"Ensure proper encryption of sensitive wallet data"}),"\n",(0,o.jsx)(n.li,{children:"Validate all proofs before attempting to redeem tokens"}),"\n",(0,o.jsx)(n.li,{children:"Only interact with explicitly trusted mints"}),"\n"]}),(0,o.jsx)(n.p,{children:"By following these steps, you can implement a complete nutzap solution that allows users to send and receive Bitcoin micropayments through the Nostr protocol using Cashu tokens."})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},79329:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var i=t(34164);const o={tabItem:"tabItem_Ymn6"};var s=t(74848);function r(e){let{children:n,hidden:t,className:r}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,i.A)(o.tabItem,r),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>v});var i=t(96540),o=t(34164),s=t(65627),r=t(56347),l=t(50372),a=t(30604),c=t(11861),d=t(78749);function u(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:o}}=e;return{value:n,label:t,attributes:i,default:o}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const o=(0,r.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,a.aZ)(s),(0,i.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(o.location.search);n.set(s,e),o.replace({...o.location,search:n.toString()})}),[s,o])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:o}=e,s=h(e),[r,a]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:s}))),[c,u]=m({queryString:t,groupId:o}),[x,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[o,s]=(0,d.Dv)(t);return[o,(0,i.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:o}),f=(()=>{const e=c??x;return p({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{f&&a(f)}),[f]);return{selectedValue:r,selectValue:(0,i.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=t(9136);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(74848);function y(e){let{className:n,block:t,selectedValue:i,selectValue:r,tabValues:l}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),o=l[t].value;o!==i&&(c(n),r(o))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>{a.push(e)},onKeyDown:u,onClick:d,...s,className:(0,o.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":i===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:s}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function k(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,o.A)("tabs-container",f.tabList),children:[(0,j.jsx)(y,{...n,...e}),(0,j.jsx)(b,{...n,...e})]})}function v(e){const n=(0,g.A)();return(0,j.jsx)(k,{...e,children:u(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>l});var i=t(96540);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3d2ff19f.9b08adf7.js b/assets/js/3d2ff19f.9b08adf7.js new file mode 100644 index 00000000..5cfdb989 --- /dev/null +++ b/assets/js/3d2ff19f.9b08adf7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6828],{34299:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});var n=s(50971),o=s(74848),i=s(28453);const a={title:"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)",description:"Forget the flashy demos. Here's everyday use cases for AI.",authors:["angie"]},r=void 0,d={authorsImageUrls:[void 0]},c=[{value:"1\ufe0f\u20e3 Summarizing GitHub Activity into Actionable Insights",id:"1\ufe0f\u20e3-summarizing-github-activity-into-actionable-insights",level:2},{value:"2\ufe0f\u20e3 Extracting Action Items from a Long Slack Thread",id:"2\ufe0f\u20e3-extracting-action-items-from-a-long-slack-thread",level:2},{value:"3\ufe0f\u20e3 Creating a Roadmap from Community Feedback",id:"3\ufe0f\u20e3-creating-a-roadmap-from-community-feedback",level:2},{value:"4\ufe0f\u20e3 Fixing My CSS Breakpoints (Because I Gave Up)",id:"4\ufe0f\u20e3-fixing-my-css-breakpoints-because-i-gave-up",level:2},{value:"5\ufe0f\u20e3 Fixing Broken Links After a Big Doc Restructure",id:"5\ufe0f\u20e3-fixing-broken-links-after-a-big-doc-restructure",level:2}];function l(e){const t={a:"a",admonition:"admonition",h2:"h2",hr:"hr",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"blog cover",src:s(45503).A+"",width:"1200",height:"630"})}),"\n",(0,o.jsx)(t.p,{children:"Whenever people talk about AI, they highlight the flashiest use cases like fully coded apps built by agents or cinematic video generation. Those things are certainly cool, but most days I'm just delegating mundane tasks to the bots."}),"\n",(0,o.jsx)(t.p,{children:"Today, I didn't build an app. I didn't write a screenplay. I just got stuff done."}),"\n",(0,o.jsxs)(t.p,{children:["Here are 5 real, everyday tasks I gave to my AI agent, ",(0,o.jsx)(t.a,{href:"/",children:"Goose"}),", that saved me hours. None of them took more than one minute from prompt to result."]}),"\n",(0,o.jsx)(t.admonition,{title:"LLM",type:"info",children:(0,o.jsx)(t.p,{children:"For all of these, I used Anthropic's Claude 4 Sonnet"})}),"\n",(0,o.jsx)(t.h2,{id:"1\ufe0f\u20e3-summarizing-github-activity-into-actionable-insights",children:"1\ufe0f\u20e3 Summarizing GitHub Activity into Actionable Insights"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Task"})}),"\n",(0,o.jsx)(t.p,{children:"I asked Goose to review all closed GitHub issues across my organization for the month and give me a breakdown. I wanted to see where our time went, how work was distributed, and any patterns or dependencies across projects."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Result"})}),"\n",(0,o.jsx)(t.p,{children:"In under a minute, Goose gave me a report with productivity metrics, workload distribution, and notable dependencies between issue threads (e.g. one fix blocking another)."}),"\n",(0,o.jsx)(t.p,{children:"This kind of synthesis normally requires me to manually scan a bunch of repos and cross-reference PRs or issue comments. Not today."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"MCPs used"})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/mcp/github-mcp",children:"GitHub"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"2\ufe0f\u20e3-extracting-action-items-from-a-long-slack-thread",children:"2\ufe0f\u20e3 Extracting Action Items from a Long Slack Thread"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Task"})}),"\n",(0,o.jsx)(t.p,{children:"You know when a Slack thread starts as a quick brainstorm and somehow grows into a novel? Ours had 169 replies today \ud83d\ude02, and buried in there were some important ideas."}),"\n",(0,o.jsx)(t.p,{children:"So, I asked Goose to analyze the entire thread and extract a clean list of action items."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Result"})}),"\n",(0,o.jsx)(t.p,{children:"In one minute, I had a focused to-do list with responsible parties, deadlines (when mentioned), and themes. These takeaways will likely shape our Q3 goals, and when I'm ready, I can even have Goose go create GitHub issues for all of them!"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"MCPs used"})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Slack"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"3\ufe0f\u20e3-creating-a-roadmap-from-community-feedback",children:"3\ufe0f\u20e3 Creating a Roadmap from Community Feedback"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Task"})}),"\n",(0,o.jsx)(t.p,{children:"Our Goose community is active across GitHub, Slack, and Discord. There's tons of feedback, but it's scattered.\nI had Goose pull and analyze open questions, bug reports, feature requests, and discussion threads across all three platforms."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Results"})}),"\n",(0,o.jsx)(t.p,{children:"A ranked list of the top 10 items we need to address, including a short description of each issue along with the estimated effort of the tasks. This gave us a nice jumpstart on our roadmap planning."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"MCPs used"})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/mcp/github-mcp",children:"GitHub"})}),"\n",(0,o.jsx)(t.li,{children:"Slack"}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://github.com/hanweg/mcp-discord",children:"Discord"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"4\ufe0f\u20e3-fixing-my-css-breakpoints-because-i-gave-up",children:"4\ufe0f\u20e3 Fixing My CSS Breakpoints (Because I Gave Up)"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Task"})}),"\n",(0,o.jsx)(t.p,{children:"Confession: CSS and I are not friends. After 30 minutes of fighting with breakpoints, spacing, and container widths, I gave the problem to Goose by showing it a screenshot of the page."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Result"})}),"\n",(0,o.jsx)(t.p,{children:"Goose spotted the issue immediately and rewrote my media query logic as well as some other key CSS I was missing."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"MCPs used"})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/mcp/developer-mcp",children:"Developer"})}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"5\ufe0f\u20e3-fixing-broken-links-after-a-big-doc-restructure",children:"5\ufe0f\u20e3 Fixing Broken Links After a Big Doc Restructure"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Task"})}),"\n",(0,o.jsx)(t.p,{children:"I restructured a big internal doc set and needed to update all internal links, reroute old paths, and make sure nothing was broken.\nI handled the restructure manually (it was delicate so I wanted to do it myself), then asked Goose to crawl the doc, find broken or outdated links, fix them and add redirects where needed."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"Result"})}),"\n",(0,o.jsx)(t.p,{children:"No dead ends. No 404s. Just tidy documentation."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.strong,{children:"MCP used"})}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"/docs/mcp/developer-mcp",children:"Developer"})}),"\n"]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.p,{children:"Most AI posts show off what's possible. I'm focused on what was promised.\nThe whole point was to offload the tedious stuff so we could focus on the work that actually matters, and that's exactly what I'm using AI for."}),"\n",(0,o.jsxs)(t.p,{children:["What everyday tasks are you delegating to AI agents? Let us know in ",(0,o.jsx)(t.a,{href:"https://discord.gg/block-opensource",children:"Discord"}),"."]}),"\n",(0,o.jsxs)(n,{children:[(0,o.jsx)("meta",{property:"og:title",content:"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)"}),(0,o.jsx)("meta",{property:"og:type",content:"article"}),(0,o.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/06/27/everyday-usecases-ai"}),(0,o.jsx)("meta",{property:"og:description",content:"Forget the flashy demos. Here's everyday use cases for AI."}),(0,o.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png"}),(0,o.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,o.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,o.jsx)("meta",{name:"twitter:title",content:"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)"}),(0,o.jsx)("meta",{name:"twitter:description",content:"Forget the flashy demos. Here's everyday use cases for AI."}),(0,o.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png"})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},45503:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/everyday-usage-of-ai-69f4444328b28bdc945e5ff9fc92034d.png"},28453:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>r});var n=s(96540);const o={},i=n.createContext(o);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(i.Provider,{value:t},e.children)}},50971:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/06/27/everyday-usecases-ai","source":"@site/blog/2025-06-27-everyday-usecases-ai/index.md","title":"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)","description":"Forget the flashy demos. Here\'s everyday use cases for AI.","date":"2025-06-27T00:00:00.000Z","tags":[],"readingTime":3.445,"hasTruncateMarker":true,"authors":[{"name":"Angie Jones","title":"Head of Developer Relations","url":"https://angiejones.tech","page":{"permalink":"/goose/blog/authors/angie"},"socials":{"linkedin":"https://www.linkedin.com/in/angiejones/","github":"https://github.com/angiejones","x":"https://x.com/techgirl1908","bluesky":"https://bsky.app/profile/angiejones.tech"},"imageURL":"https://avatars.githubusercontent.com/u/15972783?v=4","key":"angie"}],"frontMatter":{"title":"5 Boring Tasks I Gave to My AI Agent Today (That Saved Me Hours)","description":"Forget the flashy demos. Here\'s everyday use cases for AI.","authors":["angie"]},"unlisted":false,"nextItem":{"title":"Isolated Dev Environments in Goose with container-use","permalink":"/goose/blog/2025/06/19/isolated-development-environments"}}')}}]); \ No newline at end of file diff --git a/assets/js/3dae7375.5c5d6841.js b/assets/js/3dae7375.5c5d6841.js new file mode 100644 index 00000000..f4c3be32 --- /dev/null +++ b/assets/js/3dae7375.5c5d6841.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[430],{78604:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>h,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>p});var n=o(8307),s=o(74848),r=o(28453);const i={title:"AI Prompting 101: How to Get the Best Responses from Your AI Agent",description:"How to prompt your AI agent the right way.",authors:["ebony"]},a=void 0,h={authorsImageUrls:[void 0]},p=[];function c(e){const t={em:"em",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"blog cover",src:o(31368).A+"",width:"2240",height:"1260"})}),"\n",(0,s.jsxs)(t.p,{children:['Remember that saying, "it\u2019s not what you ask, but ',(0,s.jsx)(t.strong,{children:"how you ask"}),'"?']}),"\n",(0,s.jsxs)(t.p,{children:["When I first started working with Goose as an AI agent, I was convinced there had to be one \u2018best' prompting style. I spent so much time trying to figure out which one was superior, but the more I used Goose, the more I realized that couldn't be further from the truth. There isn\u2019t one ",(0,s.jsx)(t.em,{children:"right"})," way to prompt AI, but there are better approaches depending on what your end goal is."]}),"\n",(0,s.jsxs)(t.p,{children:["So, let\u2019s go through ",(0,s.jsx)(t.strong,{children:"which prompt style works best for your specific needs"}),", and how you can use them to vibe code a little better with Goose."]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},31368:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/prompt-078b12695f95c4f0eac3861a8a2611ef.png"},28453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>a});var n=o(96540);const s={},r=n.createContext(s);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(r.Provider,{value:t},e.children)}},8307:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/19/better-ai-prompting","source":"@site/blog/2025-03-19-better-ai-prompting/index.md","title":"AI Prompting 101: How to Get the Best Responses from Your AI Agent","description":"How to prompt your AI agent the right way.","date":"2025-03-19T00:00:00.000Z","tags":[],"readingTime":6.845,"hasTruncateMarker":true,"authors":[{"name":"Ebony Louis","title":"Developer Advocate","page":{"permalink":"/goose/blog/authors/ebony"},"socials":{"linkedin":"https://www.linkedin.com/in/ebonylouis/","x":"https://x.com/ebonyjlouis","github":"https://github.com/ebonylouis"},"imageURL":"https://avatars.githubusercontent.com/u/55366651?v=4","key":"ebony"}],"frontMatter":{"title":"AI Prompting 101: How to Get the Best Responses from Your AI Agent","description":"How to prompt your AI agent the right way.","authors":["ebony"]},"unlisted":false,"prevItem":{"title":"How I Use Goose to Plan My Week with Asana and Google Calendar MCPs","permalink":"/goose/blog/2025/03/20/asana-calendar-mcp"},"nextItem":{"title":"How Goose Catches AI Errors with Langfuse","permalink":"/goose/blog/2025/03/18/goose-langfuse"}}')}}]); \ No newline at end of file diff --git a/assets/js/3e64d7e1.24f41bca.js b/assets/js/3e64d7e1.24f41bca.js new file mode 100644 index 00000000..b331bfe3 --- /dev/null +++ b/assets/js/3e64d7e1.24f41bca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2172],{28476:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>c,contentTitle:()=>t,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/using-gooseignore","title":"Prevent Goose from Accessing Files","description":".gooseignore is a text file that defines patterns for files and directories that Goose will not access. This means Goose cannot read, modify, delete, or run shell commands on these files when using the Developer extension\'s tools.","source":"@site/docs/guides/using-gooseignore.md","sourceDirName":"guides","slug":"/guides/using-gooseignore","permalink":"/goose/docs/guides/using-gooseignore","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":14,"frontMatter":{"title":"Prevent Goose from Accessing Files","sidebar_label":"Using Gooseignore","sidebar_position":14},"sidebar":"tutorialSidebar","previous":{"title":"Run Tasks","permalink":"/goose/docs/guides/running-tasks"},"next":{"title":"Configuration File","permalink":"/goose/docs/guides/config-file"}}');var s=n(74848),r=n(28453);const l={title:"Prevent Goose from Accessing Files",sidebar_label:"Using Gooseignore",sidebar_position:14},t=void 0,c={},d=[{value:"Creating your .gooseignore file",id:"creating-your-gooseignore-file",level:2},{value:"Example .gooseignore file",id:"example-gooseignore-file",level:2},{value:"Ignore File Types and Priority",id:"ignore-file-types-and-priority",level:2},{value:"1. Global .gooseignore",id:"1-global-gooseignore",level:3},{value:"2. Local .gooseignore",id:"2-local-gooseignore",level:3},{value:"3. .gitignore Fallback",id:"3-gitignore-fallback",level:3},{value:"4. Default Patterns",id:"4-default-patterns",level:3},{value:"Common use cases",id:"common-use-cases",level:2}];function a(e){const o={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:".gooseignore"})," is a text file that defines patterns for files and directories that Goose will not access. This means Goose cannot read, modify, delete, or run shell commands on these files when using the Developer extension's tools."]}),"\n",(0,s.jsx)(o.admonition,{title:"Developer extension only",type:"info",children:(0,s.jsxs)(o.p,{children:["The .gooseignore feature currently only affects tools in the ",(0,s.jsx)(o.a,{href:"/docs/mcp/developer-mcp",children:"Developer"})," extension. Other extensions are not restricted by these rules."]})}),"\n",(0,s.jsxs)(o.p,{children:["This guide will show you how to use ",(0,s.jsx)(o.code,{children:".gooseignore"})," files to prevent Goose from changing specific files and directories."]}),"\n",(0,s.jsxs)(o.h2,{id:"creating-your-gooseignore-file",children:["Creating your ",(0,s.jsx)(o.code,{children:".gooseignore"})," file"]}),"\n",(0,s.jsxs)(o.p,{children:["Goose supports two types of ",(0,s.jsx)(o.code,{children:".gooseignore"})," files:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Global ignore file"})," - Create a ",(0,s.jsx)(o.code,{children:".gooseignore"})," file in ",(0,s.jsx)(o.code,{children:"~/.config/goose"}),". These restrictions will apply to all your sessions with Goose, regardless of directory."]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Local ignore file"})," - Create a ",(0,s.jsx)(o.code,{children:".gooseignore"})," file at the root of the directory you'd like it applied to. These restrictions will only apply when working in a specific directory."]}),"\n"]}),"\n",(0,s.jsx)(o.admonition,{type:"tip",children:(0,s.jsxs)(o.p,{children:["You can use both global and local ",(0,s.jsx)(o.code,{children:".gooseignore"})," files simultaneously. When both exist, Goose will combine the restrictions from both files to determine which paths are restricted."]})}),"\n",(0,s.jsxs)(o.h2,{id:"example-gooseignore-file",children:["Example ",(0,s.jsx)(o.code,{children:".gooseignore"})," file"]}),"\n",(0,s.jsxs)(o.p,{children:["In your ",(0,s.jsx)(o.code,{children:".gooseignore"})," file, you can write patterns to match files you want Goose to ignore. Here are some common patterns:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-plaintext",children:'# Ignore specific files by name\nsettings.json # Ignore only the file named "settings.json"\n\n# Ignore files by extension\n*.pdf # Ignore all PDF files\n*.config # Ignore all files ending in .config\n\n# Ignore directories and their contents\nbackup/ # Ignore everything in the "backup" directory\ndownloads/ # Ignore everything in the "downloads" directory\n\n# Ignore all files with this name in any directory\n**/credentials.json # Ignore all files named "credentials.json" in any directory\n\n# Complex patterns\n*.log # Ignore all .log files\n!error.log # Except for error.log file\n'})}),"\n",(0,s.jsx)(o.h2,{id:"ignore-file-types-and-priority",children:"Ignore File Types and Priority"}),"\n",(0,s.jsxs)(o.p,{children:["Goose respects ignore rules from three sources: global ",(0,s.jsx)(o.code,{children:".gooseignore"}),", local ",(0,s.jsx)(o.code,{children:".gooseignore"}),", and ",(0,s.jsx)(o.code,{children:".gitignore"}),". It uses a priority system to determine which files should be ignored."]}),"\n",(0,s.jsxs)(o.h3,{id:"1-global-gooseignore",children:["1. Global ",(0,s.jsx)(o.code,{children:".gooseignore"})]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Highest priority and always applied first"}),"\n",(0,s.jsxs)(o.li,{children:["Located at ",(0,s.jsx)(o.code,{children:"~/.config/goose/.gooseignore"})]}),"\n",(0,s.jsx)(o.li,{children:"Affects all projects on your machine"}),"\n"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"~/.config/goose/\n\u2514\u2500\u2500 .gooseignore \u2190 Applied to all projects\n"})}),"\n",(0,s.jsxs)(o.h3,{id:"2-local-gooseignore",children:["2. Local ",(0,s.jsx)(o.code,{children:".gooseignore"})]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Project-specific rules"}),"\n",(0,s.jsx)(o.li,{children:"Located in your project root directory"}),"\n",(0,s.jsxs)(o.li,{children:["Overrides ",(0,s.jsx)(o.code,{children:".gitignore"})," completely"]}),"\n"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"~/.config/goose/\n\u2514\u2500\u2500 .gooseignore \u2190 Global rules applied first\n\nProject/\n\u251c\u2500\u2500 .gooseignore \u2190 Local rules applied second\n\u251c\u2500\u2500 .gitignore \u2190 Ignored when .gooseignore exists\n\u2514\u2500\u2500 src/\n"})}),"\n",(0,s.jsxs)(o.h3,{id:"3-gitignore-fallback",children:["3. ",(0,s.jsx)(o.code,{children:".gitignore"})," Fallback"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["Used when no local ",(0,s.jsx)(o.code,{children:".gooseignore"})," exists"]}),"\n",(0,s.jsxs)(o.li,{children:["Goose automatically uses your ",(0,s.jsx)(o.code,{children:".gitignore"})," rules"]}),"\n",(0,s.jsxs)(o.li,{children:["If a global ",(0,s.jsx)(o.code,{children:".gooseignore"})," file exists, those rules will be applied in addition to the ",(0,s.jsx)(o.code,{children:".gitignore"})," patterns."]}),"\n"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"Project/\n\u251c\u2500\u2500 .gitignore \u2190 Used by Goose (when no local .gooseignore)\n\u2514\u2500\u2500 src/\n"})}),"\n",(0,s.jsx)(o.h3,{id:"4-default-patterns",children:"4. Default Patterns"}),"\n",(0,s.jsx)(o.p,{children:"By default, if you haven't created any .gooseignore files and no .gitignore file exists, Goose will not modify files matching these patterns:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-plaintext",children:"**/.env\n**/.env.*\n**/secrets.*\n"})}),"\n",(0,s.jsx)(o.h2,{id:"common-use-cases",children:"Common use cases"}),"\n",(0,s.jsxs)(o.p,{children:["Here are some typical scenarios where ",(0,s.jsx)(o.code,{children:".gooseignore"})," is helpful:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Generated Files"}),": Prevent Goose from modifying auto-generated code or build outputs"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Third-Party Code"}),": Keep Goose from changing external libraries or dependencies"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Important Configurations"}),": Protect critical configuration files from accidental modifications"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Version Control"}),": Prevent changes to version control files like ",(0,s.jsx)(o.code,{children:".git"})," directory"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Existing Projects"}),": Most projects already have ",(0,s.jsx)(o.code,{children:".gitignore"})," files that work automatically as ignore patterns for Goose"]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.strong,{children:"Custom Restrictions"}),": Create ",(0,s.jsx)(o.code,{children:".gooseignore"})," when you need different patterns than your ",(0,s.jsx)(o.code,{children:".gitignore"})," (e.g., allowing Goose to read files that Git ignores)"]}),"\n"]})]})}function g(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,o,n)=>{n.d(o,{R:()=>l,x:()=>t});var i=n(96540);const s={},r=i.createContext(s);function l(e){const o=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function t(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3f6ca340.77b4617c.js b/assets/js/3f6ca340.77b4617c.js new file mode 100644 index 00000000..b5ed8cfd --- /dev/null +++ b/assets/js/3f6ca340.77b4617c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3853],{19088:e=>{e.exports=JSON.parse('{"author":{"name":"Alex Rosenzweig","title":"Staff Security Engineer","page":{"permalink":"/goose/blog/authors/alex"},"socials":{"linkedin":"https://www.linkedin.com/in/alex-rosenzweig/","github":"https://github.com/shellz-n-stuff"},"imageURL":"https://media.licdn.com/dms/image/v2/C5103AQGrOYDDHn8z6g/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1520985744775?e=1749081600&v=beta&t=krNAyF8rFRnInDfEZcO2TlLOHXWKMzt-fJdkgHVfFNs","key":"alex","count":1},"listMetadata":{"permalink":"/goose/blog/authors/alex","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/405905ef.fbc4e658.js b/assets/js/405905ef.fbc4e658.js new file mode 100644 index 00000000..2ff74ccb --- /dev/null +++ b/assets/js/405905ef.fbc4e658.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4593],{8552:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"guides/recipes/sub-recipes","title":"Sub-Recipes For Specialized Tasks","description":"Learn how a recipe can use sub-recipes to perform specific tasks","source":"@site/docs/guides/recipes/sub-recipes.md","sourceDirName":"guides/recipes","slug":"/guides/recipes/sub-recipes","permalink":"/goose/docs/guides/recipes/sub-recipes","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Sub-Recipes For Specialized Tasks","sidebar_label":"Sub-Recipes","description":"Learn how a recipe can use sub-recipes to perform specific tasks"},"sidebar":"tutorialSidebar","previous":{"title":"Recipe Reference Guide","permalink":"/goose/docs/guides/recipes/recipe-reference"},"next":{"title":"Saving Recipes","permalink":"/goose/docs/guides/recipes/storing-recipes"}}');var r=i(74848),t=i(28453);const a={sidebar_position:3,title:"Sub-Recipes For Specialized Tasks",sidebar_label:"Sub-Recipes",description:"Learn how a recipe can use sub-recipes to perform specific tasks"},o=void 0,c={},l=[{value:"How Sub-Recipes Work",id:"how-sub-recipes-work",level:2},{value:"Parameter Handling",id:"parameter-handling",level:3},{value:"Examples",id:"examples",level:2},{value:"Sequential Processing",id:"sequential-processing",level:3},{value:"Conditional Processing",id:"conditional-processing",level:3},{value:"Best Practices",id:"best-practices",level:2},{value:"Learn More",id:"learn-more",level:2}];function p(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Sub-recipes are recipes that are used by another recipe to perform specific tasks. They enable:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Multi-step workflows"})," - Break complex tasks into distinct phases with specialized expertise"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Reusable components"})," - Create common tasks that can be used in various workflows"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"how-sub-recipes-work",children:"How Sub-Recipes Work"}),"\n",(0,r.jsxs)(n.p,{children:['The "main recipe" registers its sub-recipes in the ',(0,r.jsx)(n.code,{children:"sub_recipes"})," field, which contains the following fields:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"name"}),": Unique identifier for the sub-recipe, used to generate the tool name"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"path"}),": File path to the sub-recipe file (relative or absolute)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"values"}),": (Optional) Pre-configured parameter values that are always passed to the sub-recipe"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"When the main recipe is run, Goose generates a tool for each sub-recipe that:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Accepts parameters defined by the sub-recipe"}),"\n",(0,r.jsx)(n.li,{children:"Executes the sub-recipe in a separate session with its own context"}),"\n",(0,r.jsx)(n.li,{children:"Returns output to the main recipe"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Sub-recipe sessions run in isolation - they don't share conversation history, memory, or state with the main recipe or other sub-recipes. Additionally, sub-recipes cannot define their own sub-recipes (no nesting allowed)."}),"\n",(0,r.jsx)(n.h3,{id:"parameter-handling",children:"Parameter Handling"}),"\n",(0,r.jsx)(n.p,{children:"Sub-recipes receive parameters in two ways:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pre-set values"}),": Fixed parameter values defined in the ",(0,r.jsx)(n.code,{children:"values"})," field are automatically provided and cannot be overridden at runtime"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Automatic parameter inheritance"}),": Sub-recipes automatically have access to all parameters passed to the main recipe at runtime."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Pre-set values take precedence over inherited parameters. If both the main recipe and ",(0,r.jsx)(n.code,{children:"values"})," field provide the same parameter, the ",(0,r.jsx)(n.code,{children:"values"})," version is used."]}),"\n",(0,r.jsx)(n.admonition,{title:"Template Variables",type:"info",children:(0,r.jsxs)(n.p,{children:["Parameters received by sub-recipes can be used in prompts and instructions using ",(0,r.jsx)(n.code,{children:"{{ parameter_name }}"})," syntax."]})}),"\n",(0,r.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(n.h3,{id:"sequential-processing",children:"Sequential Processing"}),"\n",(0,r.jsx)(n.p,{children:"This Code Review Pipeline example shows a main recipe that uses two sub-recipes to perform a comprehensive code review:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"goose run --recipe code-review-pipeline.yaml --params repository_path=/path/to/repo\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Main Recipe:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'# code-review-pipeline.yaml\nversion: "1.0.0"\ntitle: "Code Review Pipeline"\ndescription: "Automated code review using sub-recipes"\ninstructions: |\n Perform a code review using the available sub-recipe tools.\n Run security analysis first, then code quality analysis.\n\nparameters:\n - key: repository_path\n input_type: string\n requirement: required\n description: "Path to the repository to review"\n\nsub_recipes:\n - name: "security_scan"\n path: "./sub-recipes/security-analysis.yaml"\n values:\n scan_level: "comprehensive"\n \n - name: "quality_check"\n path: "./sub-recipes/quality-analysis.yaml"\n\nextensions:\n - type: builtin\n name: developer\n timeout: 300\n bundled: true\n\nprompt: |\n Review the code at {{ repository_path }} using the sub-recipe tools.\n Run security scan first, then quality analysis.\n'})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sub-Recipes:"})}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"security_scan"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'# sub-recipes/security-analysis.yaml\nversion: "1.0.0"\ntitle: "Security Scanner"\ndescription: "Analyze code for security vulnerabilities"\ninstructions: |\n You are a security expert. Analyze the provided code for security issues.\n Focus on common vulnerabilities like SQL injection, XSS, and authentication flaws.\n\nparameters:\n - key: repository_path\n input_type: string\n requirement: required\n description: "Path to the code to analyze"\n \n - key: scan_level\n input_type: string\n requirement: optional\n default: "standard"\n description: "Depth of security scan (basic, standard, comprehensive)"\n\nextensions:\n - type: builtin\n name: developer\n timeout: 300\n bundled: true\n\nprompt: |\n Perform a {{ scan_level }} security analysis on the code at {{ repository_path }}.\n Report any security vulnerabilities found with severity levels and recommendations.\n'})})]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"quality_check"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'# sub-recipes/quality-analysis.yaml\nversion: "1.0.0"\ntitle: "Code Quality Analyzer"\ndescription: "Analyze code quality and best practices"\ninstructions: |\n You are a code quality expert. Review code for maintainability, \n readability, and adherence to best practices.\n\nparameters:\n - key: repository_path\n input_type: string\n requirement: required\n description: "Path to the code to analyze"\n\nextensions:\n - type: builtin\n name: developer\n timeout: 300\n bundled: true\n\nprompt: |\n Analyze the code quality at {{ repository_path }}.\n Check for code smells, complexity issues, and suggest improvements.\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"conditional-processing",children:"Conditional Processing"}),"\n",(0,r.jsx)(n.p,{children:"This Smart Project Analyzer example shows conditional logic that chooses between different sub-recipes based on analysis:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Usage:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"goose run --recipe smart-analyzer.yaml --params repository_path=/path/to/project\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Main Recipe:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'# smart-analyzer.yaml\nversion: "1.0.0"\ntitle: "Smart Project Analyzer"\ndescription: "Analyze project and choose appropriate processing based on type"\ninstructions: |\n First examine the repository to determine the project type (web app, CLI tool, library, etc.).\n Based on what you find:\n - If it\'s a web application, use the web_security_audit sub-recipe\n - If it\'s a CLI tool or library, use the api_documentation sub-recipe\n Only run one sub-recipe based on your analysis.\n\nparameters:\n - key: repository_path\n input_type: string\n requirement: required\n description: "Path to the repository to analyze"\n\nsub_recipes:\n - name: "web_security_audit"\n path: "./sub-recipes/web-security.yaml"\n values:\n check_cors: "true"\n check_csrf: "true"\n \n - name: "api_documentation"\n path: "./sub-recipes/api-docs.yaml"\n values:\n format: "markdown"\n\nextensions:\n - type: builtin\n name: developer\n timeout: 300\n bundled: true\n\nprompt: |\n Analyze the project at {{ repository_path }} and determine its type.\n Then run the appropriate sub-recipe tool based on your findings.\n'})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sub-Recipes:"})}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"web_security_audit"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'# sub-recipes/web-security.yaml\nversion: "1.0.0"\ntitle: "Web Security Auditor"\ndescription: "Security audit for web applications"\ninstructions: |\n You are a web security specialist. Audit web applications for \n security vulnerabilities specific to web technologies.\n\nparameters:\n - key: repository_path\n input_type: string\n requirement: required\n description: "Path to the web application code"\n \n - key: check_cors\n input_type: string\n requirement: optional\n default: "false"\n description: "Whether to check CORS configuration"\n \n - key: check_csrf\n input_type: string\n requirement: optional\n default: "false"\n description: "Whether to check CSRF protection"\n\nextensions:\n - type: builtin\n name: developer\n timeout: 300\n bundled: true\n\nprompt: |\n Perform a web security audit on {{ repository_path }}.\n {% if check_cors == "true" %}Check CORS configuration for security issues.{% endif %}\n {% if check_csrf == "true" %}Verify CSRF protection is properly implemented.{% endif %}\n Focus on web-specific vulnerabilities like XSS, authentication flaws, and session management.\n'})})]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"api_documentation"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'# sub-recipes/api-docs.yaml\nversion: "1.0.0"\ntitle: "API Documentation Generator"\ndescription: "Generate documentation for APIs and libraries"\ninstructions: |\n You are a technical writer specializing in API documentation.\n Create comprehensive documentation for code libraries and APIs.\n\nparameters:\n - key: repository_path\n input_type: string\n requirement: required\n description: "Path to the code to document"\n \n - key: format\n input_type: string\n requirement: optional\n default: "markdown"\n description: "Output format for documentation (markdown, html, rst)"\n\nextensions:\n - type: builtin\n name: developer\n timeout: 300\n bundled: true\n\nprompt: |\n Generate {{ format }} documentation for the code at {{ repository_path }}.\n Include API endpoints, function signatures, usage examples, and installation instructions.\n Focus on making it easy for developers to understand and use this code.\n'})})]}),"\n",(0,r.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Single responsibility"}),": Each sub-recipe should have one clear purpose"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Clear parameters"}),": Use descriptive names and descriptions"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pre-set fixed values"}),": Use ",(0,r.jsx)(n.code,{children:"values"})," for parameters that don't change"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Test independently"}),": Verify sub-recipes work alone before combining"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"learn-more",children:"Learn More"}),"\n",(0,r.jsxs)(n.p,{children:["Check out the ",(0,r.jsx)(n.a,{href:"/docs/guides/recipes",children:"Goose Recipes"})," guide for more docs, tools, and resources to help you master Goose recipes."]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>o});var s=i(96540);const r={},t=s.createContext(r);function a(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43860c2b.a4a67a45.js b/assets/js/43860c2b.a4a67a45.js new file mode 100644 index 00000000..b07ff27a --- /dev/null +++ b/assets/js/43860c2b.a4a67a45.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4821],{3740:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Guides","description":"Learn essential tips and recommendations for using Goose","slug":"/category/guides","permalink":"/goose/docs/category/guides","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Using Extensions","permalink":"/goose/docs/getting-started/using-extensions"},"next":{"title":"Managing Sessions","permalink":"/goose/docs/guides/managing-goose-sessions"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/43aee873.411dcfc2.js b/assets/js/43aee873.411dcfc2.js new file mode 100644 index 00000000..f500b148 --- /dev/null +++ b/assets/js/43aee873.411dcfc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1019],{38384:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var s=o(10374),n=o(74848),a=o(28453);const i={draft:!1,title:"Previewing Goose v1.0 Beta",description:"Goose v1.0 Beta is here! Learn about the latest features and improvements.",date:new Date("2024-12-06T00:00:00.000Z"),authors:["adewale"]},r=void 0,c={authorsImageUrls:[void 0]},l=[{value:"Exciting Features of Goose 1.0 Beta",id:"exciting-features-of-goose-10-beta",level:2},{value:"1. Transition to Rust",id:"1-transition-to-rust",level:3},{value:"2. Contextual Memory",id:"2-contextual-memory",level:3},{value:"3. Improved Plugin System",id:"3-improved-plugin-system",level:3},{value:"4. Headless mode",id:"4-headless-mode",level:3},{value:"5. Goose now has a GUI",id:"5-goose-now-has-a-gui",level:3},{value:"6. Goose alignment with open protocols",id:"6-goose-alignment-with-open-protocols",level:3}];function d(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",...(0,a.R)(),...e.components},{Head:s}=t;return s||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.img,{alt:"Goose v1.0 Beta",src:o(57914).A+"",width:"1280",height:"720"}),"\nWe are excited to share a preview of the new updates coming to Goose with Goose v1.0 Beta!"]}),"\n",(0,n.jsx)(t.p,{children:"This major update comes with a bunch of new features and improvements that make Goose more powerful and user-friendly. Here are some of the key highlights."}),"\n",(0,n.jsx)(t.h2,{id:"exciting-features-of-goose-10-beta",children:"Exciting Features of Goose 1.0 Beta"}),"\n",(0,n.jsx)(t.h3,{id:"1-transition-to-rust",children:"1. Transition to Rust"}),"\n",(0,n.jsx)(t.p,{children:"The core of Goose has been rewritten in Rust. Why does this matter? Rust allows for a more portable and stable experience. This change means that Goose can run smoothly on different systems without the need for Python to be installed, making it easier for anyone to start using it."}),"\n",(0,n.jsx)(t.h3,{id:"2-contextual-memory",children:"2. Contextual Memory"}),"\n",(0,n.jsx)(t.p,{children:"Goose will remember previous interactions to better understand ongoing projects. This means you won\u2019t have to keep repeating yourself. Imagine having a conversation with someone who remembers every detail\u2014this is the kind of support Goose aims to offer."}),"\n",(0,n.jsx)(t.h3,{id:"3-improved-plugin-system",children:"3. Improved Plugin System"}),"\n",(0,n.jsx)(t.p,{children:"In Goose v1.0, the Goose toolkit system is being replaced with Extensions. Extensions are modular daemons that Goose can interact with dynamically. As a result, Goose will be able to support more complex plugins and integrations. This will make it easier to extend Goose with new features and functionality."}),"\n",(0,n.jsx)(t.h3,{id:"4-headless-mode",children:"4. Headless mode"}),"\n",(0,n.jsx)(t.p,{children:"You can now run Goose in headless mode - this is useful for running Goose on servers or in environments where a graphical interface is not available."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"cargo run --bin goose -- run -i instructions.md\n"})}),"\n",(0,n.jsx)(t.h3,{id:"5-goose-now-has-a-gui",children:"5. Goose now has a GUI"}),"\n",(0,n.jsx)(t.p,{children:"Goose now has an electron-based GUI macOS application that provides and alternative to the CLI to interact with Goose and manage your projects."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Goose GUI",src:o(8027).A+"",width:"752",height:"800"})}),"\n",(0,n.jsx)(t.h3,{id:"6-goose-alignment-with-open-protocols",children:"6. Goose alignment with open protocols"}),"\n",(0,n.jsxs)(t.p,{children:["Goose v1.0 Beta now uses a custom protocol, that is designed in parallel with ",(0,n.jsx)(t.a,{href:"https://www.anthropic.com/news/model-context-protocol",children:"Anthropic\u2019s Model Context Protocol"})," (MCP) to communicate with Systems. This makes it possible for developers to create their own systems (e.g Jira, ) that Goose can integrate with."]}),"\n",(0,n.jsxs)(t.p,{children:["Excited for many more feature updates and improvements? Stay tuned for more updates on Goose! Check out the ",(0,n.jsx)(t.a,{href:"https://github.com/block/goose",children:"Goose repo"})," and join our ",(0,n.jsx)(t.a,{href:"https://discord.gg/block-opensource",children:"Discord community"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("meta",{property:"og:title",content:"Previewing Goose v1.0 Beta"}),(0,n.jsx)("meta",{property:"og:type",content:"article"}),(0,n.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2024/12/06/previewing-goose-v10-beta"}),(0,n.jsx)("meta",{property:"og:description",content:"AI Agent uses screenshots to assist in styling."}),(0,n.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/goose-v1.0-beta-5d469fa73edea37cfccfe8a8ca0b47e2.png"}),(0,n.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,n.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,n.jsx)("meta",{name:"twitter:title",content:"Screenshot-Driven Development"}),(0,n.jsx)("meta",{name:"twitter:description",content:"AI Agent uses screenshots to assist in styling."}),(0,n.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/goose-v1.0-beta-5d469fa73edea37cfccfe8a8ca0b47e2.png"})]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8027:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/goose-gui-a7479dd08b0ddc839348b2a83a62ccfc.png"},57914:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/goose-v1.0-beta-5d469fa73edea37cfccfe8a8ca0b47e2.png"},28453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var s=o(96540);const n={},a=s.createContext(n);function i(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(a.Provider,{value:t},e.children)}},10374:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2024/12/06/previewing-goose-v10-beta","source":"@site/blog/2024-12-06-previewing-goose-v10-beta/index.md","title":"Previewing Goose v1.0 Beta","description":"Goose v1.0 Beta is here! Learn about the latest features and improvements.","date":"2024-12-06T00:00:00.000Z","tags":[],"readingTime":2.075,"hasTruncateMarker":true,"authors":[{"name":"Adewale Abati","title":"Staff Developer Advocate","url":"https://adewaleabati.com","page":{"permalink":"/goose/blog/authors/adewale"},"socials":{"x":"https://x.com/ace_kyd","github":"https://github.com/acekyd"},"imageURL":"https://avatars.githubusercontent.com/u/4003538?v=4","key":"adewale"}],"frontMatter":{"draft":false,"title":"Previewing Goose v1.0 Beta","description":"Goose v1.0 Beta is here! Learn about the latest features and improvements.","date":"2024-12-06T00:00:00.000Z","authors":["adewale"]},"unlisted":false,"prevItem":{"title":"Connecting AI Agents to Your Systems with MCP","permalink":"/goose/blog/2024/12/10/connecting-ai-agents-to-your-systems-with-mcp"},"nextItem":{"title":"Screenshot-Driven Development","permalink":"/goose/blog/2024/11/22/screenshot-driven-development"}}')}}]); \ No newline at end of file diff --git a/assets/js/4622.8a2eb56f.js b/assets/js/4622.8a2eb56f.js new file mode 100644 index 00000000..fe789cfe --- /dev/null +++ b/assets/js/4622.8a2eb56f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[4622],{83750:(e,t,s)=>{s.d(t,{in:()=>c,OU:()=>A,Ki:()=>k,kJ:()=>f,x:()=>i,e7:()=>h,J_:()=>p,Gx:()=>N});var a=s(96540),n=s(26849),l=s(69062),r=s(74848);function i(){const e=(0,l.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=a.createContext(null);function c(e){let{children:t,content:s,isBlogPostPage:n=!1}=e;const l=function(e){let{content:t,isBlogPostPage:s}=e;return(0,a.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:s})),[t,s])}({content:s,isBlogPostPage:n});return(0,r.jsx)(o.Provider,{value:l,children:t})}function h(){const e=(0,a.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var m=s(29030),u=s(40797);const d=e=>new Date(e).toISOString();function g(e){const t=e.map(v);return{author:1===t.length?t[0]:t}}function x(e,t,s){return e?{image:w({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${s}`})}:{}}function f(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:s}=(0,m.hH)(),{metadata:{blogDescription:a,blogTitle:n,permalink:l}}=e,r=`${t.url}${l}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:a,blogPost:e.items.map((e=>function(e,t,s){const{assets:a,frontMatter:n,metadata:l}=e,{date:r,title:i,description:o,lastUpdatedAt:c}=l,h=a.image??n.image,m=n.keywords??[],u=`${t.url}${l.permalink}`,f=c?d(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:i,name:i,description:o,datePublished:r,...f?{dateModified:f}:{},...g(l.authors),...x(h,s,i),...m?{keywords:m}:{}}}(e.content,t,s)))}}function p(){const e=i(),{assets:t,metadata:s}=h(),{siteConfig:a}=(0,u.A)(),{withBaseUrl:n}=(0,m.hH)(),{date:l,title:r,description:o,frontMatter:c,lastUpdatedAt:f}=s,p=t.image??c.image,v=c.keywords??[],w=f?d(f):void 0,j=`${a.url}${s.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":j,mainEntityOfPage:j,url:j,headline:r,name:r,description:o,datePublished:l,...w?{dateModified:w}:{},...g(s.authors),...x(p,n,r),...v?{keywords:v}:{},isPartOf:{"@type":"Blog","@id":`${a.url}${e.blogBasePath}`,name:e.blogTitle}}}function v(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function w(e){let{imageUrl:t,caption:s}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:s}}var j=s(56347),b=s(56289),C=s(11861),M=s(30214);function N(e){const{pathname:t}=(0,j.zy)();return(0,a.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,M.ys)(e.permalink,t))}(e,t)))),[e,t])}function k(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),s=Object.entries(t);return s.reverse(),s}function A(e){let{items:t,ulClassName:s,liClassName:a,linkClassName:n,linkActiveClassName:l}=e;return(0,r.jsx)("ul",{className:s,children:t.map((e=>(0,r.jsx)("li",{className:a,children:(0,r.jsx)(b.A,{isNavLink:!0,to:e.permalink,className:n,activeClassName:l,children:e.title})},e.permalink)))})}},95921:(e,t,s)=>{s.d(t,{A:()=>C});var a=s(96540),n=s(34164),l=s(56289),r=s(74848);const i="githubSvg_Uu4N";const o="xSvg_y3PF";const c=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})};const h="instagramSvg_YC40";const m="threadsSvg_PTXY";const u={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},d={twitter:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 209",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 256 250",preserveAspectRatio:"xMidYMid",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,i),children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,o),children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"},bluesky:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 226",...e,children:(0,r.jsx)("path",{fill:"#1185FE",d:"M55.491 15.172c29.35 22.035 60.917 66.712 72.509 90.686 11.592-23.974 43.159-68.651 72.509-90.686C221.686-.727 256-13.028 256 26.116c0 7.818-4.482 65.674-7.111 75.068-9.138 32.654-42.436 40.983-72.057 35.942 51.775 8.812 64.946 38 36.501 67.187-54.021 55.433-77.644-13.908-83.696-31.676-1.11-3.257-1.63-4.78-1.637-3.485-.008-1.296-.527.228-1.637 3.485-6.052 17.768-29.675 87.11-83.696 31.676-28.445-29.187-15.274-58.375 36.5-67.187-29.62 5.041-62.918-3.288-72.056-35.942C4.482 91.79 0 33.934 0 26.116 0-13.028 34.314-.727 55.491 15.172Z"})})},label:"Bluesky"},instagram:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,h),children:(0,r.jsx)("path",{d:"M128 23.064c34.177 0 38.225.13 51.722.745 12.48.57 19.258 2.655 23.769 4.408 5.974 2.322 10.238 5.096 14.717 9.575 4.48 4.479 7.253 8.743 9.575 14.717 1.753 4.511 3.838 11.289 4.408 23.768.615 13.498.745 17.546.745 51.723 0 34.178-.13 38.226-.745 51.723-.57 12.48-2.655 19.257-4.408 23.768-2.322 5.974-5.096 10.239-9.575 14.718-4.479 4.479-8.743 7.253-14.717 9.574-4.511 1.753-11.289 3.839-23.769 4.408-13.495.616-17.543.746-51.722.746-34.18 0-38.228-.13-51.723-.746-12.48-.57-19.257-2.655-23.768-4.408-5.974-2.321-10.239-5.095-14.718-9.574-4.479-4.48-7.253-8.744-9.574-14.718-1.753-4.51-3.839-11.288-4.408-23.768-.616-13.497-.746-17.545-.746-51.723 0-34.177.13-38.225.746-51.722.57-12.48 2.655-19.258 4.408-23.769 2.321-5.974 5.095-10.238 9.574-14.717 4.48-4.48 8.744-7.253 14.718-9.575 4.51-1.753 11.288-3.838 23.768-4.408 13.497-.615 17.545-.745 51.723-.745M128 0C93.237 0 88.878.147 75.226.77c-13.625.622-22.93 2.786-31.071 5.95-8.418 3.271-15.556 7.648-22.672 14.764C14.367 28.6 9.991 35.738 6.72 44.155 3.555 52.297 1.392 61.602.77 75.226.147 88.878 0 93.237 0 128c0 34.763.147 39.122.77 52.774.622 13.625 2.785 22.93 5.95 31.071 3.27 8.417 7.647 15.556 14.763 22.672 7.116 7.116 14.254 11.492 22.672 14.763 8.142 3.165 17.446 5.328 31.07 5.95 13.653.623 18.012.77 52.775.77s39.122-.147 52.774-.77c13.624-.622 22.929-2.785 31.07-5.95 8.418-3.27 15.556-7.647 22.672-14.763 7.116-7.116 11.493-14.254 14.764-22.672 3.164-8.142 5.328-17.446 5.95-31.07.623-13.653.77-18.012.77-52.775s-.147-39.122-.77-52.774c-.622-13.624-2.786-22.929-5.95-31.07-3.271-8.418-7.648-15.556-14.764-22.672C227.4 14.368 220.262 9.99 211.845 6.72c-8.142-3.164-17.447-5.328-31.071-5.95C167.122.147 162.763 0 128 0Zm0 62.27C91.698 62.27 62.27 91.7 62.27 128c0 36.302 29.428 65.73 65.73 65.73 36.301 0 65.73-29.428 65.73-65.73 0-36.301-29.429-65.73-65.73-65.73Zm0 108.397c-23.564 0-42.667-19.103-42.667-42.667S104.436 85.333 128 85.333s42.667 19.103 42.667 42.667-19.103 42.667-42.667 42.667Zm83.686-110.994c0 8.484-6.876 15.36-15.36 15.36-8.483 0-15.36-6.876-15.36-15.36 0-8.483 6.877-15.36 15.36-15.36 8.484 0 15.36 6.877 15.36 15.36Z"})})},label:"Instagram"},threads:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-label":"Threads",viewBox:"0 0 192 192",width:"1em",fill:"none",height:"1em",style:{"--dark":"#000","--light":"#fff"},...e,className:(0,n.A)(e.className,m),children:(0,r.jsx)("path",{d:"M141.537 88.988a66.667 66.667 0 0 0-2.518-1.143c-1.482-27.307-16.403-42.94-41.457-43.1h-.34c-14.986 0-27.449 6.396-35.12 18.036l13.779 9.452c5.73-8.695 14.724-10.548 21.348-10.548h.229c8.249.053 14.474 2.452 18.503 7.129 2.932 3.405 4.893 8.111 5.864 14.05-7.314-1.243-15.224-1.626-23.68-1.14-23.82 1.371-39.134 15.264-38.105 34.568.522 9.792 5.4 18.216 13.735 23.719 7.047 4.652 16.124 6.927 25.557 6.412 12.458-.683 22.231-5.436 29.049-14.127 5.178-6.6 8.453-15.153 9.899-25.93 5.937 3.583 10.337 8.298 12.767 13.966 4.132 9.635 4.373 25.468-8.546 38.376-11.319 11.308-24.925 16.2-45.488 16.351-22.809-.169-40.06-7.484-51.275-21.742C35.236 139.966 29.808 120.682 29.605 96c.203-24.682 5.63-43.966 16.133-57.317C56.954 24.425 74.204 17.11 97.013 16.94c22.975.17 40.526 7.52 52.171 21.847 5.71 7.026 10.015 15.86 12.853 26.162l16.147-4.308c-3.44-12.68-8.853-23.606-16.219-32.668C147.036 9.607 125.202.195 97.07 0h-.113C68.882.194 47.292 9.642 32.788 28.08 19.882 44.485 13.224 67.315 13.001 95.932L13 96v.067c.224 28.617 6.882 51.447 19.788 67.854C47.292 182.358 68.882 191.806 96.957 192h.113c24.96-.173 42.554-6.708 57.048-21.189 18.963-18.945 18.392-42.692 12.142-57.27-4.484-10.454-13.033-18.945-24.723-24.553ZM98.44 129.507c-10.44.588-21.286-4.098-21.82-14.135-.397-7.442 5.296-15.746 22.461-16.735 1.966-.114 3.895-.169 5.79-.169 6.235 0 12.068.606 17.371 1.765-1.978 24.702-13.58 28.713-23.802 29.274Z"})})},label:"Threads"},mastodon:{Icon:function(e){const t=(0,a.useId)();return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 61 65",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{fill:`url(#${t})`,d:"M60.754 14.39C59.814 7.406 53.727 1.903 46.512.836 45.294.656 40.682 0 29.997 0h-.08C19.23 0 16.938.656 15.72.836 8.705 1.873 2.299 6.82.745 13.886c-.748 3.48-.828 7.338-.689 10.877.198 5.075.237 10.142.697 15.197a71.482 71.482 0 0 0 1.664 9.968c1.477 6.056 7.458 11.096 13.317 13.152a35.718 35.718 0 0 0 19.484 1.028 28.365 28.365 0 0 0 2.107-.576c1.572-.5 3.413-1.057 4.766-2.038a.154.154 0 0 0 .062-.118v-4.899a.146.146 0 0 0-.055-.111.145.145 0 0 0-.122-.028 54 54 0 0 1-12.644 1.478c-7.328 0-9.298-3.478-9.863-4.925a15.258 15.258 0 0 1-.857-3.882.142.142 0 0 1 .178-.145 52.976 52.976 0 0 0 12.437 1.477c1.007 0 2.012 0 3.02-.026 4.213-.119 8.654-.334 12.8-1.144.103-.02.206-.038.295-.065 6.539-1.255 12.762-5.196 13.394-15.176.024-.393.083-4.115.083-4.523.003-1.386.446-9.829-.065-15.017Z"}),(0,r.jsx)("path",{fill:"#fff",d:"M50.394 22.237v17.35H43.52V22.749c0-3.545-1.478-5.353-4.483-5.353-3.303 0-4.958 2.139-4.958 6.364v9.217h-6.835V23.76c0-4.225-1.657-6.364-4.96-6.364-2.988 0-4.48 1.808-4.48 5.353v16.84H10.93V22.237c0-3.545.905-6.362 2.715-8.45 1.868-2.082 4.317-3.152 7.358-3.152 3.519 0 6.178 1.354 7.951 4.057l1.711 2.871 1.714-2.871c1.773-2.704 4.432-4.056 7.945-4.056 3.038 0 5.487 1.069 7.36 3.152 1.81 2.085 2.712 4.902 2.71 8.449Z"}),(0,r.jsx)("defs",{children:(0,r.jsxs)("linearGradient",{id:t,x1:30.5,x2:30.5,y1:0,y2:65,gradientUnits:"userSpaceOnUse",children:[(0,r.jsx)("stop",{stopColor:"#6364FF"}),(0,r.jsx)("stop",{offset:1,stopColor:"#563ACC"})]})})]})},label:"Mastodon"},youtube:{Icon:function(e){return(0,r.jsxs)("svg",{viewBox:"0 0 256 180",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:[(0,r.jsx)("path",{d:"M250.346 28.075A32.18 32.18 0 0 0 227.69 5.418C207.824 0 127.87 0 127.87 0S47.912.164 28.046 5.582A32.18 32.18 0 0 0 5.39 28.24c-6.009 35.298-8.34 89.084.165 122.97a32.18 32.18 0 0 0 22.656 22.657c19.866 5.418 99.822 5.418 99.822 5.418s79.955 0 99.82-5.418a32.18 32.18 0 0 0 22.657-22.657c6.338-35.348 8.291-89.1-.164-123.134Z",fill:"red"}),(0,r.jsx)("path",{fill:"#FFF",d:"m102.421 128.06 66.328-38.418-66.328-38.418z"})]})},label:"YouTube"},twitch:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",x:0,y:0,viewBox:"0 0 2400 2800",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"m2200 1300-400 400h-400l-350 350v-350H600V200h1600z",fill:"#fff"}),(0,r.jsxs)("g",{children:[(0,r.jsx)("path",{d:"M500 0 0 500v1800h600v500l500-500h400l900-900V0H500zm1700 1300-400 400h-400l-350 350v-350H600V200h1600v1100z",fill:"#9146ff"}),(0,r.jsx)("path",{d:"M1700 550h200v600h-200zM1150 550h200v600h-200z",fill:"#9146ff"})]})]})},label:"Twitch"}};function g(e){let{platform:t,link:s}=e;const{Icon:a,label:i}=d[o=t]??{Icon:c,label:o};var o;return(0,r.jsx)(l.A,{className:u.authorSocialLink,href:s,title:i,children:(0,r.jsx)(a,{className:(0,n.A)(u.authorSocialLink)})})}function x(e){let{author:t}=e;const s=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:u.authorSocials,children:s.map((e=>{let[t,s]=e;return(0,r.jsx)(g,{platform:t,link:s},t)}))})}var f=s(9303);const p={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function v(e){return e.href?(0,r.jsx)(l.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function w(e){let{title:t}=e;return(0,r.jsx)("small",{className:p.authorTitle,title:t,children:t})}function j(e){let{name:t,as:s}=e;return s?(0,r.jsx)(f.A,{as:s,className:p.authorName,children:t}):(0,r.jsx)("span",{className:p.authorName,children:t})}function b(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(p.authorBlogPostCount),children:t})}function C(e){let{as:t,author:s,className:a,count:l}=e;const{name:i,title:o,url:c,imageURL:h,email:m,page:u}=s,d=u?.permalink||c||m&&`mailto:${m}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",a,p[`author-as-${t}`]),children:[h&&(0,r.jsx)(v,{href:d,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",p.authorImage),src:h,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",p.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(v,{href:d,children:(0,r.jsx)(j,{name:i,as:t})}),void 0!==l&&(0,r.jsx)(b,{count:l})]}),!!o&&(0,r.jsx)(w,{title:o}),(0,r.jsx)(x,{author:s})]})]})}},60569:(e,t,s)=>{s.d(t,{A:()=>L});var a=s(96540),n=s(34164),l=s(43938),r=s(86682),i=s(50539),o=s(83750),c=s(53115),h=s(9303),m=s(74848);function u(e){let{year:t,yearGroupHeadingClassName:s,children:a}=e;return(0,m.jsxs)("div",{role:"group",children:[(0,m.jsx)(h.A,{as:"h3",className:s,children:t}),a]})}function d(e){let{items:t,yearGroupHeadingClassName:s,ListComponent:a}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,m.jsx)(m.Fragment,{children:e.map((e=>{let[t,n]=e;return(0,m.jsx)(u,{year:t,yearGroupHeadingClassName:s,children:(0,m.jsx)(a,{items:n})},t)}))})}return(0,m.jsx)(a,{items:t})}const g=(0,a.memo)(d),x="sidebar_re4s",f="sidebarItemTitle_pO2u",p="sidebarItemList_Yudw",v="sidebarItem__DBe",w="sidebarItemLink_mo7H",j="sidebarItemLinkActive_I1ZP",b="yearGroupHeading_rMGB",C=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:(0,n.A)(p,"clean-list"),liClassName:v,linkClassName:w,linkActiveClassName:j})};function M(e){let{sidebar:t}=e;const s=(0,o.Gx)(t.items);return(0,m.jsx)("aside",{className:"col col--3",children:(0,m.jsxs)("nav",{className:(0,n.A)(x,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,m.jsx)("div",{className:(0,n.A)(f,"margin-bottom--md"),children:t.title}),(0,m.jsx)(g,{items:s,ListComponent:C,yearGroupHeadingClassName:b})]})})}const N=(0,a.memo)(M);var k=s(63065);const A="yearGroupHeading_QT03",_=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function y(e){let{sidebar:t}=e;const s=(0,o.Gx)(t.items);return(0,m.jsx)(g,{items:s,ListComponent:_,yearGroupHeadingClassName:A})}function B(e){return(0,m.jsx)(k.GX,{component:y,props:e})}const I=(0,a.memo)(B);function P(e){let{sidebar:t}=e;const s=(0,r.l)();return t?.items.length?"mobile"===s?(0,m.jsx)(I,{sidebar:t}):(0,m.jsx)(N,{sidebar:t}):null}function L(e){const{sidebar:t,toc:s,children:a,...r}=e,i=t&&t.items.length>0;return(0,m.jsx)(l.A,{...r,children:(0,m.jsx)("div",{className:"container margin-vert--lg",children:(0,m.jsxs)("div",{className:"row",children:[(0,m.jsx)(P,{sidebar:t}),(0,m.jsx)("main",{className:(0,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:a}),s&&(0,m.jsx)("div",{className:"col col--2",children:s})]})})})}},81430:(e,t,s)=>{s.d(t,{W:()=>c});var a=s(96540),n=s(40797);const l=["zero","one","two","few","many","other"];function r(e){return l.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:r(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,a.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:r(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,s)=>function(e,t,s){const a=e.split("|");if(1===a.length)return a[0];a.length>s.pluralForms.length&&console.error(`For locale=${s.locale}, a maximum of ${s.pluralForms.length} plural forms are expected (${s.pluralForms.join(",")}), but the message contains ${a.length}: ${e}`);const n=s.select(t),l=s.pluralForms.indexOf(n);return a[Math.min(l,a.length-1)]}(s,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/47bee437.836b183c.js b/assets/js/47bee437.836b183c.js new file mode 100644 index 00000000..f40ff7b0 --- /dev/null +++ b/assets/js/47bee437.836b183c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2306],{61568:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=o(5666),s=o(74848),a=o(28453);const r={title:"A Recipe for Success: Cooking Up Repeatable Agentic Workflows",description:"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook.",authors:["rizel"]},i="A Recipe for Success: Cooking Up Repeatable Agentic Workflows",c={authorsImageUrls:[void 0]},l=[];function p(e){const t={a:"a",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"blog cover",src:o(44007).A+"",width:"2240",height:"1260"})}),"\n",(0,s.jsxs)(t.p,{children:["Ratatouille isn't just a heartwarming (and slightly unhygienic) film about a rat chef. It's also analogous to a popular tech trend: AI agents and the ",(0,s.jsx)(t.a,{href:"https://modelcontextprotocol.io/",children:"Model Context Protocol (MCP)"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},44007:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png"},28453:(e,t,o)=>{o.d(t,{R:()=>r,x:()=>i});var n=o(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}},5666:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/05/06/recipe-for-success","source":"@site/blog/2025-05-06-recipe-for-success/index.md","title":"A Recipe for Success: Cooking Up Repeatable Agentic Workflows","description":"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook.","date":"2025-05-06T00:00:00.000Z","tags":[],"readingTime":7.555,"hasTruncateMarker":true,"authors":[{"name":"Rizel Scarlett","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/rizel"},"socials":{"x":"https://x.com/blackgirlbytes","github":"https://github.com/blackgirlbytes","bluesky":"https://bsky.app/profile/blackgirlbytes.bsky.social","linkedin":"https://www.linkedin.com/in/rizel-bobb-semple/"},"imageURL":"https://avatars.githubusercontent.com/u/22990146?v=4","key":"rizel"}],"frontMatter":{"title":"A Recipe for Success: Cooking Up Repeatable Agentic Workflows","description":"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook.","authors":["rizel"]},"unlisted":false,"prevItem":{"title":"Championship Driven Development: Your Team\'s AI Playbook for Peak Performance","permalink":"/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency"},"nextItem":{"title":"4 Things You Need to Know Before Using Goose","permalink":"/goose/blog/2025/04/23/things-need-to-know"}}')}}]); \ No newline at end of file diff --git a/assets/js/492dcbf0.7d3faa28.js b/assets/js/492dcbf0.7d3faa28.js new file mode 100644 index 00000000..418922bd --- /dev/null +++ b/assets/js/492dcbf0.7d3faa28.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[621],{94361:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>p,frontMatter:()=>d,metadata:()=>t,toc:()=>m});const t=JSON.parse('{"id":"mcp/figma-mcp","title":"Figma Extension","description":"Add Figma MCP Server as a Goose Extension","source":"@site/docs/mcp/figma-mcp.md","sourceDirName":"mcp","slug":"/mcp/figma-mcp","permalink":"/goose/docs/mcp/figma-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Figma Extension","description":"Add Figma MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Fetch Extension","permalink":"/goose/docs/mcp/fetch-mcp"},"next":{"title":"Filesystem Extension","permalink":"/goose/docs/mcp/filesystem-mcp"}}');var o=i(74848),s=i(28453),a=i(65537),l=i(79329),r=i(25887);const d={title:"Figma Extension",description:"Add Figma MCP Server as a Goose Extension"},c=void 0,h={},m=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3},{value:"Result",id:"result",level:3}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.A,{videoUrl:"https://www.youtube.com/embed/vHK9Xg_d6Sk"}),"\n",(0,o.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,o.jsx)(n.a,{href:"https://github.com/hapins/figma-mcp",children:"Figma MCP Server"})," as a Goose extension to enable interaction with Figma files, designs, and components."]}),"\n",(0,o.jsxs)(n.admonition,{title:"TLDR",type:"tip",children:[(0,o.jsxs)(a.A,{groupId:"interface",children:[(0,o.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=%40hapins%2Ffigma-mcp&id=figma&name=Figma&description=Figma%20design%20tool%20integration&env=FIGMA_ACCESS_TOKEN%3DAccess%20token%20from%20Figma%20user%20settings",children:"Launch the installer"})})}),(0,o.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Command"})}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"npx -y @hapins/figma-mcp\n"})})]})]}),(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Environment Variable"})}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"FIGMA_ACCESS_TOKEN: \n"})})]}),"\n",(0,o.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["Note that you'll need ",(0,o.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," installed on your system to run this command, as it uses ",(0,o.jsx)(n.code,{children:"npx"}),"."]})}),"\n",(0,o.jsxs)(a.A,{groupId:"interface",children:[(0,o.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=%40hapins%2Ffigma-mcp&id=figma&name=Figma&description=Figma%20design%20tool%20integration&env=FIGMA_ACCESS_TOKEN%3DAccess%20token%20from%20Figma%20user%20settings",children:"Launch the installer"})}),"\n",(0,o.jsxs)(n.li,{children:["Press ",(0,o.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n",(0,o.jsxs)(n.li,{children:["Obtain a ",(0,o.jsx)(n.a,{href:"https://www.figma.com/developers/api#access-tokens",children:"Figma Access Token"})," and paste it in"]}),"\n",(0,o.jsxs)(n.li,{children:["Click ",(0,o.jsx)(n.code,{children:"Save Configuration"})]}),"\n",(0,o.jsxs)(n.li,{children:["Scroll to the top and click ",(0,o.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,o.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Run the ",(0,o.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["Choose to add a ",(0,o.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 figma\n // highlight-end\n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 figma\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 npx -y @hapins/figma-mcp\n // highlight-end\n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 figma\n \u2502\n \u25c7 What command should be run?\n \u2502 npx -y @hapins/figma-mcp\n \u2502\n // highlight-start\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n // highlight-end\n \u2502\n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"6",children:["\n",(0,o.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 figma\n \u2502\n \u25c7 What command should be run?\n \u2502 npx -y @hapins/figma-mcp\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n // highlight-start\n \u25c7 Would you like to add a description?\n \u2502 No\n // highlight-end\n \u2514 \n"})}),(0,o.jsxs)(n.ol,{start:"7",children:["\n",(0,o.jsxs)(n.li,{children:["Obtain a ",(0,o.jsx)(n.a,{href:"https://www.figma.com/developers/api#access-tokens",children:"Figma Access Token"})," and paste it in."]}),"\n"]}),(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsx)(n.p,{children:"You can generate an access token from your Figma account settings under the Personal access tokens section."})}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 figma\n \u2502\n \u25c7 What command should be run?\n \u2502 npx -y @hapins/figma-mcp\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502\n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 Yes \n \u2502\n \u25c7 Environment variable name:\n \u2502 FIGMA_ACCESS_TOKEN\n \u2502\n \u25c7 Environment variable value:\n \u2502 \u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n \u2502\n \u25c7 Add another environment variable?\n \u2502 No \n // highlight-end\n \u2514 Added figma extension\n"})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,o.jsx)(n.p,{children:"The Figma MCP server allows you to interact with your Figma files and designs programmatically. When creating your access token, make sure you give it the appropriate access and scope:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Read access for files"}),"\n",(0,o.jsx)(n.li,{children:"Write access for Comments"}),"\n",(0,o.jsx)(n.li,{children:"And any other scopes of your choice."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Given this ",(0,o.jsx)(n.a,{href:"https://www.figma.com/community/file/1037030891378807455",children:"Community Figma design"}),", we'll have Goose build a webpage."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Figma Design",src:i(403).A+"",width:"3600",height:"2062"})}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["Get the Figma File ID from the URL. For example, ",(0,o.jsx)(n.code,{children:"https://www.figma.com/file/KvR8Wpe6ITaCD3et3H7l6k/AI-Landing-Page"})," has a file ID of ",(0,o.jsx)(n.code,{children:"KvR8Wpe6ITaCD3et3H7l6k"}),"."]})}),"\n",(0,o.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"( O)> Convert my figma design with file ID 7r0mLHWx2rrjwn79mcNVNE into a webpage. Get specific detailed information and styling about each element and components within each frame. Make sure to implement any interactions or animations and use a placeholder div with a gray background for images. \n\nSome elements are centralized, some are duplicated, make sure to get them correct. And ensure correct alignment and spacing between elements.\n"})}),"\n",(0,o.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"I'll help you convert your Figma design into a webpage. Let's break this down into steps and\n gather all the necessary information from your Figma file.\n\n1. First, let's get the file information to understand the overall structure:\n\n\u2500\u2500\u2500 get_file_info | figma \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndepth: 4\nfile_key: 7r0mLHWx2rrjwn79mcNVNE\n\n\n\nLet me help you convert this Figma design into a webpage. I'll create the HTML and CSS based\n on the design specifications from the Figma file. I'll break it down into sections and impl\nement all the styling and interactions.\n\nLet's create the files:\n\n\u2500\u2500\u2500 text_editor | developer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\npath: ~/D/w/l/m/figma-example/index.html\ncommand: write\nfile_text: ...\n\n\n### .../figma-example/index.html\n\n--- HTML content hidden ---\n\nNow, let's create the CSS file with all the styling:\n\n\u2500\u2500\u2500 text_editor | developer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\npath: ~/D/w/l/m/figma-example/styles.css\ncommand: write\nfile_text: ...\n\n\n### .../figma-example/styles.css\n\n--- CSS content hidden ---\n\nI've created a complete implementation of the Figma design with the following features and c\nonsiderations:\n\n1. **Typography**:\n- Used the exact fonts from the design: Poppins, Overpass, Nunito Sans, Public Sans, and Ral\neway\n- Implemented correct font weights, sizes, and letter spacing\n- Maintained the text hierarchy as shown in the design\n\n2. **Colors**:\n- Used the exact color codes from the Figma file\n- Implemented the proper background colors (#250b71 for header and footer)\n- Used correct text colors for different sections\n\n3. **Layout**:\n- Created a responsive layout that matches the design\n- Implemented proper spacing and alignment\n- Used CSS Grid for the book cards\n- Used Flexbox for navigation and content alignment\n\n4. **Components**:\n- Navigation bar with social media links\n- About Me section with placeholder for image\n- Education section with ordered list\n- Book cards with proper styling\n- Mood section with image placeholders\n- Footer with copyright text\n\n5. **Interactive Elements**:\n- Hover effects on navigation links\n- \"Next Section\" buttons with icons\n- \"Go on Top\" button at the bottom\n\n6. **Responsive Design**:\n- Added media queries for different screen sizes\n- Responsive adjustments for mobile and tablet views\n- Flexible layouts that adapt to different screen sizes\n\n7. **Images**:\n- Used placeholder divs with background colors for images\n- Maintained aspect ratios from the original design\n\n8. **Accessibility**:\n- Semantic HTML structure\n- Proper heading hierarchy\n- Alt text placeholders for images\n- Readable text contrast\n\nTo use this implementation:\n\n1. Make sure all the fonts are properly loaded (they're being loaded from Google Fonts)\n2. Replace the image placeholders with actual images\n3. Add proper links to the social media navigation\n4. Add any additional interactive features or animations as needed\n\nThe implementation maintains the visual hierarchy and styling of the original Figma design while \nensuring it's responsive and accessible. You can further customize the colors, spacing, \nand other properties by modifying the CSS variables if needed.\n\nWould you like me to add any specific interactions or make any adjustments to the implementation?\n"})}),"\n",(0,o.jsx)(n.h3,{id:"result",children:"Result"}),"\n",(0,o.jsx)(n.p,{children:"The Figma design has been successfully converted into a webpage with the styling, content and components from the original design."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Figma MCP Output",src:i(45478).A+"",width:"3600",height:"2068"})}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsx)(n.p,{children:"In cases where you need to make additional changes, or the final output is not as expected - you can continue to interact with Goose to make adjustments."})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(g,{...e})}):g(e)}},25887:(e,n,i)=>{i.d(n,{A:()=>s});i(96540);var t=i(52362),o=i(74848);const s=e=>{let{videoUrl:n}=e;return(0,o.jsxs)("div",{children:[(0,o.jsx)(t.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,o.jsxs)("details",{children:[(0,o.jsx)("summary",{children:"Watch the demo"}),(0,o.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,o.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,o.jsx)("hr",{})]})}},403:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/figma-mcp-design-dac4a1618225011a385bb592858e3b3b.png"},45478:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/figma-mcp-output-3fa01318977684f5673d44f5b9ad7a19.png"}}]); \ No newline at end of file diff --git a/assets/js/4b7d5bc9.8bb022c3.js b/assets/js/4b7d5bc9.8bb022c3.js new file mode 100644 index 00000000..06597300 --- /dev/null +++ b/assets/js/4b7d5bc9.8bb022c3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2725],{30675:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>g,frontMatter:()=>a,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"guides/managing-tools/tool-router","title":"Tool Selection Strategy","description":"Configure smart tool selection to load only relevant tools, improving performance with multiple extensions","source":"@site/docs/guides/managing-tools/tool-router.md","sourceDirName":"guides/managing-tools","slug":"/guides/managing-tools/tool-router","permalink":"/goose/docs/guides/managing-tools/tool-router","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Tool Selection Strategy","sidebar_label":"Tool Selection Strategy","description":"Configure smart tool selection to load only relevant tools, improving performance with multiple extensions"},"sidebar":"tutorialSidebar","previous":{"title":"Adjust Tool Output","permalink":"/goose/docs/guides/managing-tools/adjust-tool-output"},"next":{"title":"Updating Goose","permalink":"/goose/docs/guides/updating-goose"}}');var r=n(74848),s=n(28453),l=n(65537),i=n(79329);const a={sidebar_position:3,title:"Tool Selection Strategy",sidebar_label:"Tool Selection Strategy",description:"Configure smart tool selection to load only relevant tools, improving performance with multiple extensions"},c=void 0,d={},u=[{value:"Tool Selection Strategies",id:"tool-selection-strategies",level:2},{value:"Default Strategy",id:"default-strategy",level:3},{value:"Vector Strategy",id:"vector-strategy",level:3},{value:"LLM-based Strategy",id:"llm-based-strategy",level:3},{value:"Configuration",id:"configuration",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.admonition,{title:"Preview Feature",type:"info",children:(0,r.jsx)(t.p,{children:"The Tool Selection Strategy is currently in preview. The Vector selection strategy is currently limited to Claude models served on Databricks."})}),"\n",(0,r.jsxs)(t.p,{children:["When you enable an ",(0,r.jsx)(t.a,{href:"/docs/getting-started/using-extensions",children:"extension"}),", you gain access to all of its tools. For example, the Google Drive extension provides tools for reading documents, updating permissions, managing comments, and more. By default, Goose loads all tools into context when interacting with the LLM."]}),"\n",(0,r.jsx)(t.p,{children:"Enabling multiple extensions gives you access to a wider range of tools, but loading a lot of tools into context can be inefficient and confusing for the LLM. It's like having every tool in your workshop spread out on your bench when you only need one or two."}),"\n",(0,r.jsx)(t.p,{children:"Choosing an intelligent tool selection strategy helps avoid this problem. Instead of loading all tools for every interaction, it loads only the tools needed for your current task. Both vector and LLM-based strategies ensure that only the functionality you need is loaded into context, so you can keep more of your favorite extensions enabled. These strategies provide:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Reduced token consumption"}),"\n",(0,r.jsx)(t.li,{children:"Improved LLM performance"}),"\n",(0,r.jsx)(t.li,{children:"Better context management"}),"\n",(0,r.jsx)(t.li,{children:"More accurate and efficient tool selection"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"tool-selection-strategies",children:"Tool Selection Strategies"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Strategy"}),(0,r.jsx)(t.th,{children:"Speed"}),(0,r.jsx)(t.th,{children:"Best For"}),(0,r.jsx)(t.th,{children:"Example Query"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Default"})}),(0,r.jsx)(t.td,{children:"Fastest"}),(0,r.jsx)(t.td,{children:"Few extensions, simple setups"}),(0,r.jsx)(t.td,{children:"Any query (loads all tools)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Vector"})}),(0,r.jsx)(t.td,{children:"Fast"}),(0,r.jsx)(t.td,{children:"Keyword-based matching"}),(0,r.jsx)(t.td,{children:'"read pdf file"'})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"LLM-based"})}),(0,r.jsx)(t.td,{children:"Slower"}),(0,r.jsx)(t.td,{children:"Complex, ambiguous queries"}),(0,r.jsx)(t.td,{children:'"analyze document contents"'})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"default-strategy",children:"Default Strategy"}),"\n",(0,r.jsx)(t.p,{children:"The default strategy loads all tools from enabled extensions into context, which works well if you only have a few extensions enabled. When you have more than a few extensions enabled, you should use the vector or LLM-based strategy for intelligent tool selection."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Best for:"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Simple setups with few extensions"}),"\n",(0,r.jsx)(t.li,{children:"When you want all tools available at all times"}),"\n",(0,r.jsx)(t.li,{children:"Maximum tool availability without selection logic"}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"vector-strategy",children:"Vector Strategy"}),"\n",(0,r.jsx)(t.p,{children:"The vector strategy uses mathematical similarity between embeddings to find relevant tools, providing efficient matching based on vector similarity between your query and available tools."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Best for:"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Situations where fast response times are critical"}),"\n",(0,r.jsx)(t.li,{children:"Queries with keywords that match tool names or descriptions"}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Example:"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:'Prompt: "read pdf file"'}),"\n",(0,r.jsx)(t.li,{children:"Result: Quickly matches with PDF-related tools based on keyword similarity"}),"\n"]}),"\n",(0,r.jsx)(t.admonition,{title:"Embedding Model",type:"info",children:(0,r.jsxs)(t.p,{children:["The default embedding model is ",(0,r.jsx)(t.code,{children:"text-embedding-3-small"}),". You can change it using ",(0,r.jsx)(t.a,{href:"/docs/guides/environment-variables#tool-selection-strategy",children:"environment variables"}),"."]})}),"\n",(0,r.jsx)(t.h3,{id:"llm-based-strategy",children:"LLM-based Strategy"}),"\n",(0,r.jsx)(t.p,{children:"The LLM-based strategy leverages natural language understanding to analyze tools and queries semantically, making selections based on the full meaning of your request."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Best for:"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Complex or ambiguous queries that require understanding context"}),"\n",(0,r.jsx)(t.li,{children:"Cases where exact keyword matches might miss relevant tools"}),"\n",(0,r.jsx)(t.li,{children:"Situations where nuanced tool selection is important"}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Example:"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:'Prompt: "help me analyze the contents of my document"'}),"\n",(0,r.jsx)(t.li,{children:"Result: Understands context and might suggest both PDF readers and content analysis tools"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(l.A,{groupId:"interface",children:[(0,r.jsx)(i.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"Click the gear icon \u2699\ufe0f on the top toolbar"}),"\n",(0,r.jsxs)(t.li,{children:["Click ",(0,r.jsx)(t.code,{children:"Advanced settings"})]}),"\n",(0,r.jsxs)(t.li,{children:["Under ",(0,r.jsx)(t.code,{children:"Tool Selection Strategy"}),", select your preferred strategy:","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"Default"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"Vector"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"LLM-based"})}),"\n"]}),"\n"]}),"\n"]})}),(0,r.jsxs)(i.A,{value:"cli",label:"Goose CLI",children:[(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Run the ",(0,r.jsx)(t.code,{children:"configuration"})," command:"]}),"\n"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-sh",children:"goose configure\n"})}),(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsxs)(t.li,{children:["Select ",(0,r.jsx)(t.code,{children:"Goose Settings"}),":"]}),"\n"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-sh",children:"\u250c goose-configure\n\u2502\n\u25c6 What would you like to configure?\n\u2502 \u25cb Configure Providers\n\u2502 \u25cb Add Extension\n\u2502 \u25cb Toggle Extensions\n\u2502 \u25cb Remove Extension\n// highlight-start\n\u2502 \u25cf Goose Settings (Set the Goose Mode, Tool Output, Tool Permissions, Experiment, Goose recipe github repo and more)\n// highlight-end\n\u2514 \n"})}),(0,r.jsxs)(t.ol,{start:"3",children:["\n",(0,r.jsxs)(t.li,{children:["Select ",(0,r.jsx)(t.code,{children:"Router Tool Selection Strategy"}),":"]}),"\n"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-sh",children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Goose Settings\n\u2502\n\u25c6 What setting would you like to configure?\n\u2502 \u25cb Goose Mode \n// highlight-start\n\u2502 \u25cf Router Tool Selection Strategy (Configure the strategy for selecting tools to use)\n// highlight-end\n\u2502 \u25cb Tool Permission \n\u2502 \u25cb Tool Output \n\u2502 \u25cb Toggle Experiment \n\u2502 \u25cb Goose recipe github repo \n\u2514 \n"})}),(0,r.jsxs)(t.ol,{start:"4",children:["\n",(0,r.jsx)(t.li,{children:"Select your preferred strategy:"}),"\n"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Goose Settings \n\u2502\n\u25c7 What setting would you like to configure?\n\u2502 Router Tool Selection Strategy \n\u2502\n// highlight-start\n\u25c6 Which router strategy would you like to use?\n\u2502 \u25cf Vector Strategy (Use vector-based similarity to select tools)\n\u2502 \u25cb Default Strategy \n// highlight-end\n\u2514 \n"})}),(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(t.p,{children:"Currently, the LLM-based strategy can't be configured using the CLI."})}),(0,r.jsxs)(t.p,{children:["This example output shows the ",(0,r.jsx)(t.code,{children:"Vector Strategy"})," was selected:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Goose Settings\n\u2502\n\u25c7 What setting would you like to configure?\n\u2502 Router Tool Selection Strategy\n\u2502\n\u25c7 Which router strategy would you like to use?\n\u2502 Vector Strategy\n\u2502\n\u2514 Set to Vector Strategy - using vector-based similarity for tool selection\n"})}),(0,r.jsx)(t.p,{children:"Goose CLI display a message indicating when the vector or LLM-based strategy is currently being used."})]})]})]})}function g(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},79329:(e,t,n)=>{n.d(t,{A:()=>l});n(96540);var o=n(34164);const r={tabItem:"tabItem_Ymn6"};var s=n(74848);function l(e){let{children:t,hidden:n,className:l}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,l),hidden:n,children:t})}},65537:(e,t,n)=>{n.d(t,{A:()=>w});var o=n(96540),r=n(34164),s=n(65627),l=n(56347),i=n(50372),a=n(30604),c=n(11861),d=n(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function g(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function x(e){let{queryString:t=!1,groupId:n}=e;const r=(0,l.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,a.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(r.location.search);t.set(s,e),r.replace({...r.location,search:t.toString()})}),[s,r])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,s=h(e),[l,a]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!g({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:s}))),[c,u]=x({queryString:n,groupId:r}),[m,p]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,s]=(0,d.Dv)(n);return[r,(0,o.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:r}),f=(()=>{const e=c??m;return g({value:e,tabValues:s})?e:null})();(0,i.A)((()=>{f&&a(f)}),[f]);return{selectedValue:l,selectValue:(0,o.useCallback)((e=>{if(!g({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),p(e)}),[u,p,s]),tabValues:s}}var p=n(9136);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=n(74848);function j(e){let{className:t,block:n,selectedValue:o,selectValue:l,tabValues:i}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,n=a.indexOf(t),r=i[n].value;r!==o&&(c(t),l(r))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=a.indexOf(e.currentTarget)+1;t=a[n]??a[0];break}case"ArrowLeft":{const n=a.indexOf(e.currentTarget)-1;t=a[n]??a[a.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t),children:i.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,y.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>{a.push(e)},onKeyDown:u,onClick:d,...s,className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function b(e){let{lazy:t,children:n,selectedValue:s}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===s));return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:l.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function v(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,r.A)("tabs-container",f.tabList),children:[(0,y.jsx)(j,{...t,...e}),(0,y.jsx)(b,{...t,...e})]})}function w(e){const t=(0,p.A)();return(0,y.jsx)(v,{...e,children:u(e.children)},String(t))}},28453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>i});var o=n(96540);const r={},s=o.createContext(r);function l(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4cc4c9f0.cfe97cf7.js b/assets/js/4cc4c9f0.cfe97cf7.js new file mode 100644 index 00000000..dd4028a6 --- /dev/null +++ b/assets/js/4cc4c9f0.cfe97cf7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[7235],{90493:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var o=n(54095),s=n(74848),a=n(28453);const i={draft:!1,title:"Connecting AI Agents to Your Systems with MCP",date:new Date("2024-12-10T00:00:00.000Z"),authors:["angie"]},r=void 0,l={authorsImageUrls:[void 0]},c=[];function h(e){const t={img:"img",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"mcp",src:n(26547).A+"",width:"1200",height:"630"})}),"\n",(0,s.jsx)(t.p,{children:"Open standards are a critical ingredient for interoperable systems. They have enabled most of the technologies that we all rely on. The ability to connect to the internet no matter where we are relies on open standards such as Wi-Fi, TCP/IP and DNS. When you receive an email in your Gmail account from an Outlook sender, it's the use of open standards like SMTP, IMAP, and POP3 that makes this seamless. One of the most transformative technologies of our lifetime - the internet - enables anyone to have their web page accessible to the entire world thanks to the HTTP and HTML standards."}),"\n",(0,s.jsx)(t.p,{children:"We're in the early days of a new era in tech, one where companies are innovating and building practical AI solutions for the masses. To ensure the longevity of this technology, open standards will be essential in guiding the development of AI tools so that the diverse systems built by various companies can work together seamlessly."})]})}function g(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},26547:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/goose-mcp-34a5252d18d18dff26157d673f7af779.png"},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var o=n(96540);const s={},a=o.createContext(s);function i(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:t},e.children)}},54095:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2024/12/10/connecting-ai-agents-to-your-systems-with-mcp","source":"@site/blog/2024-12-10-connecting-ai-agents-to-your-systems-with-mcp/index.md","title":"Connecting AI Agents to Your Systems with MCP","description":"mcp","date":"2024-12-10T00:00:00.000Z","tags":[],"readingTime":3.315,"hasTruncateMarker":true,"authors":[{"name":"Angie Jones","title":"Head of Developer Relations","url":"https://angiejones.tech","page":{"permalink":"/goose/blog/authors/angie"},"socials":{"linkedin":"https://www.linkedin.com/in/angiejones/","github":"https://github.com/angiejones","x":"https://x.com/techgirl1908","bluesky":"https://bsky.app/profile/angiejones.tech"},"imageURL":"https://avatars.githubusercontent.com/u/15972783?v=4","key":"angie"}],"frontMatter":{"draft":false,"title":"Connecting AI Agents to Your Systems with MCP","date":"2024-12-10T00:00:00.000Z","authors":["angie"]},"unlisted":false,"prevItem":{"title":"Resolving CI Issues with Goose: A Practical Walkthrough","permalink":"/goose/blog/2024/12/11/resolving-ci-issues-with-goose-a-practical-walkthrough"},"nextItem":{"title":"Previewing Goose v1.0 Beta","permalink":"/goose/blog/2024/12/06/previewing-goose-v10-beta"}}')}}]); \ No newline at end of file diff --git a/assets/js/4d128961.d294de93.js b/assets/js/4d128961.d294de93.js new file mode 100644 index 00000000..8c652332 --- /dev/null +++ b/assets/js/4d128961.d294de93.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2544,2958,2964,3434,5339,5815,5821,7720,8196,8202],{31342:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"mcp/pieces-mcp","title":"Pieces for Developers Extension","description":"Add Pieces for Developers MCP Server as a Goose Extension","source":"@site/docs/mcp/pieces-mcp.md","sourceDirName":"mcp","slug":"/mcp/pieces-mcp","permalink":"/goose/docs/mcp/pieces-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Pieces for Developers Extension","description":"Add Pieces for Developers MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"PDF Reader Extension","permalink":"/goose/docs/mcp/pdf-mcp"},"next":{"title":"Playwright Extension","permalink":"/goose/docs/mcp/playwright-mcp"}}');var i=t(74848),s=t(28453),r=t(65537),a=t(79329),l=t(25887);const c={title:"Pieces for Developers Extension",description:"Add Pieces for Developers MCP Server as a Goose Extension"},d=void 0,u={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Add Pieces MCP Server",id:"add-pieces-mcp-server",level:3},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function p(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.A,{videoUrl:"https://www.youtube.com/embed/V8zp9m9__t4"}),"\n",(0,i.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,i.jsx)(n.a,{href:"https://docs.pieces.app/products/mcp/get-started?utm_source=goose&utm_medium=collab&utm_campaign=mcp",children:"Pieces for Developers MCP Server"})," as a Goose extension to enable interaction with your Pieces Long-Term Memory."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Download ",(0,i.jsx)(n.a,{href:"https://pieces.app/",children:"PiecesOS"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Enable ",(0,i.jsx)(n.a,{href:"https://docs.pieces.app/products/quick-guides/ltm-context",children:"Long-Term Memory Context"})," in PiecesOS"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Locate your MCP Server URL"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"In PiecesOS, navigate to Settings > Model Context Protocol (MCP)"}),"\n",(0,i.jsx)(n.li,{children:"Copy the server URL"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"The default server URL is shown below. PiecesOS may use a different port if 39300 is already in use on your system:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"http://localhost:39300/model_context_protocol/2024-11-05/sse\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"add-pieces-mcp-server",children:"Add Pieces MCP Server"}),"\n",(0,i.jsxs)(r.A,{groupId:"interface",children:[(0,i.jsx)(a.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"goose://extension?url=http%3A%2F%2Flocalhost%3A39300%2Fmodel_context_protocol%2F2024-11-05%2Fsse&id=pieces&name=Pieces%20for%20Developers&description=Provides%20access%20to%20your%20Pieces%20Long-Term%20Memory.%20You%20need%20to%20have%20Pieces%20installed%20to%20use%20this.",children:"Launch the installer"})}),"\n",(0,i.jsxs)(n.li,{children:["Press ",(0,i.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n"]})}),(0,i.jsx)(a.A,{value:"cli",label:"Goose CLI",children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Run the ",(0,i.jsx)(n.code,{children:"configure"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Choose to add a ",(0,i.jsx)(n.code,{children:"Remote Extension"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n \u2502 \u25cb Command-line Extension (Run a local command or script)\n // highlight-start \n \u2502 \u25cf Remote Extension (SSE)\n // highlight-end\n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Give your extension a name"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (SSE)\n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 Pieces\n // highlight-end\n \u2514 \n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Enter the SSE endpoint URI."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"Use the server URL you copied from PiecesOS settings earlier."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (SSE)\n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Pieces\n \u2502\n // highlight-start\n \u25c6 What is the SSE endpoint URI?\n \u2502 http://localhost:39300/model_context_protocol/2024-11-05/sse\n // highlight-end\n \u2514 \n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (SSE)\n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Pieces\n \u2502\n \u25c7 What is the SSE endpoint URI?\n \u2502 http://localhost:39300/model_context_protocol/2024-11-05/sse\n \u2502\n // highlight-start\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n // highlight-end\n \u2514 \n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Add a description if you want, otherwise to leave the description blank select No."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (SSE)\n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Pieces\n \u2502\n \u25c7 What is the SSE endpoint URI?\n \u2502 http://localhost:39300/model_context_protocol/2024-11-05/sse\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n // highlight-start\n \u25c6 Would you like to add a description?\n \u2502 \u25cb Yes / \u25cf No \n // highlight-end\n \u2502\n \u2514 \n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"No environment variables are needed, so select No."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (SSE)\n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Pieces\n \u2502\n \u25c7 What is the SSE endpoint URI?\n \u2502 http://localhost:39300/model_context_protocol/2024-11-05/sse\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No \n \u2502\n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 \u25cb Yes / \u25cf No \n // highlight-end\n \u2514 \n"})}),"\n"]}),"\n"]})})]}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsx)(n.p,{children:"Let's use the Pieces for Developers MCP server to generate a status update for a standup meeting based on your activities on the previous day."}),"\n",(0,i.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"I need a status update for what I was using yesterday. Create a report with 5 bullet points based off the most important activities, and give each one a brief description.\n"})}),"\n",(0,i.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Here's a report summarizing your key activities from yesterday, based on the most important interactions and applications you were using:\n\n1. Code Development with Goose:\n\n Activity: You worked on integrating SSE MCP servers into the Goose CLI, making enhancements to handle extensions via schema URLs.\n Description: This task involved modifying code and testing new integrations to support advanced functionalities. It also included interactions with the Goose community on Discord for feedback and troubleshooting.\n\n2. Documentation Updates:\n\n Activity: You updated and managed documentation related to the Goose project and MCP integrations.\n Description: This involved preparing documentation for new features, including usage guidelines and technical details, aiding in the improvement of user experience and technical instructions.\n\n3. Community Interaction on Discord:\n\n Activity: Engaged with the Block Open Source Community to discuss project developments and potential collaborations.\n Description: You actively participated in community discussions, exchanging insights on project enhancements, and exploring collaborative opportunities with other developers and contributors.\n\n4. Managing and Testing Extensions:\n\n Activity: You focused on testing and managing various extensions through the Goose platform.\n Description: This included configuring and validating different extensions, ensuring their compatibility and functionality, and incorporating feedback from testing.\n\n5. Content and Integration Planning:\n\n Activity: Planned integration workflows for MCP and documented their use cases.\n Description: You worked on strategies for implementing MCP integrations effectively, involving planning sessions to optimize future project deployments and align them with user requirements and project objectives.\n \nThese activities demonstrate a productive day with a focus on development, collaboration, and content management within your technical community.\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["For more examples of prompts you can use with the Pieces for Developers MCP Server, see the ",(0,i.jsx)(n.a,{href:"https://docs.pieces.app/products/mcp/prompting?utm_source=goose&utm_medium=collab&utm_campaign=mcp",children:"Pieces MCP prompting guide"}),"."]})})]})}function m(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>M});var o=t(96540),i=t(74848);function s(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=o.Children.toArray(e),t=n.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),s=n.filter((e=>e!==t)),r=t?.props.children;return{mdxAdmonitionTitle:r,rest:s.length>0?(0,i.jsx)(i.Fragment,{children:s}):null}}(e.children),s=e.title??n;return{...e,...s&&{title:s},children:t}}var r=t(34164),a=t(50539),l=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function p(e){let{type:n,className:t,children:o}=e;return(0,i.jsx)("div",{className:(0,r.A)(l.G.common.admonition,l.G.common.admonitionType(n),c,t),children:o})}function m(e){let{icon:n,title:t}=e;return(0,i.jsxs)("div",{className:d,children:[(0,i.jsx)("span",{className:u,children:n}),t]})}function x(e){let{children:n}=e;return n?(0,i.jsx)("div",{className:h,children:n}):null}function f(e){const{type:n,icon:t,title:o,children:s,className:r}=e;return(0,i.jsxs)(p,{type:n,className:r,children:[o||t?(0,i.jsx)(m,{title:o,icon:t}):null,(0,i.jsx)(x,{children:s})]})}function g(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const v={icon:(0,i.jsx)(g,{}),title:(0,i.jsx)(a.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function j(e){return(0,i.jsx)(f,{...v,...e,className:(0,r.A)("alert alert--secondary",e.className),children:e.children})}function y(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const b={icon:(0,i.jsx)(y,{}),title:(0,i.jsx)(a.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,i.jsx)(f,{...b,...e,className:(0,r.A)("alert alert--success",e.className),children:e.children})}function P(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const A={icon:(0,i.jsx)(P,{}),title:(0,i.jsx)(a.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function E(e){return(0,i.jsx)(f,{...A,...e,className:(0,r.A)("alert alert--info",e.className),children:e.children})}function S(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const C={icon:(0,i.jsx)(S,{}),title:(0,i.jsx)(a.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function k(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const N={icon:(0,i.jsx)(k,{}),title:(0,i.jsx)(a.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const T={icon:(0,i.jsx)(S,{}),title:(0,i.jsx)(a.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const I={...{note:j,tip:w,info:E,warning:function(e){return(0,i.jsx)(f,{...C,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(f,{...N,...e,className:(0,r.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(j,{title:"secondary",...e}),important:e=>(0,i.jsx)(E,{title:"important",...e}),success:e=>(0,i.jsx)(w,{title:"success",...e}),caution:function(e){return(0,i.jsx)(f,{...T,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})}}};function M(e){const n=s(e),t=(o=n.type,I[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),I.info));var o;return(0,i.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(34164);const i={tabItem:"tabItem_Ymn6"};var s=t(74848);function r(e){let{children:n,hidden:t,className:r}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(i.tabItem,r),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),i=t(34164),s=t(65627),r=t(56347),a=t(50372),l=t(30604),c=t(11861),d=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:i}}=e;return{value:n,label:t,attributes:o,default:i}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const i=(0,r.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(i.location.search);n.set(s,e),i.replace({...i.location,search:n.toString()})}),[s,i])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,s=h(e),[r,l]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:s}))),[c,u]=m({queryString:t,groupId:i}),[x,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,s]=(0,d.Dv)(t);return[i,(0,o.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:i}),g=(()=>{const e=c??x;return p({value:e,tabValues:s})?e:null})();(0,a.A)((()=>{g&&l(g)}),[g]);return{selectedValue:r,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,s]),tabValues:s}}var f=t(9136);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(74848);function j(e){let{className:n,block:t,selectedValue:o,selectValue:r,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,t=l.indexOf(n),i=a[t].value;i!==o&&(c(n),r(i))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:a.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{l.push(e)},onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function y(e){let{lazy:n,children:t,selectedValue:s}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,o.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function b(e){const n=x(e);return(0,v.jsxs)("div",{className:(0,i.A)("tabs-container",g.tabList),children:[(0,v.jsx)(j,{...n,...e}),(0,v.jsx)(y,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,v.jsx)(b,{...e,children:u(e.children)},String(n))}},25887:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var o=t(52362),i=t(74848);const s=e=>{let{videoUrl:n}=e;return(0,i.jsxs)("div",{children:[(0,i.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Watch the demo"}),(0,i.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,i.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,i.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var o=t(96540);const i={},s=o.createContext(i);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d308a5e.ade0535c.js b/assets/js/4d308a5e.ade0535c.js new file mode 100644 index 00000000..ce71fd02 --- /dev/null +++ b/assets/js/4d308a5e.ade0535c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[417],{49832:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>g,frontMatter:()=>h,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"mcp/github-mcp","title":"GitHub Extension","description":"Add GitHub MCP Server as a Goose Extension","source":"@site/docs/mcp/github-mcp.md","sourceDirName":"mcp","slug":"/mcp/github-mcp","permalink":"/goose/docs/mcp/github-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"GitHub Extension","description":"Add GitHub MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Filesystem Extension","permalink":"/goose/docs/mcp/filesystem-mcp"},"next":{"title":"Google Drive Extension","permalink":"/goose/docs/mcp/google-drive-mcp"}}');var i=o(74848),s=o(28453),l=o(65537),d=o(79329),a=o(25887);o(28799);const h={title:"GitHub Extension",description:"Add GitHub MCP Server as a Goose Extension"},r=void 0,c={},u=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.A,{videoUrl:"https://www.youtube.com/embed/TbmQDv3SQOE"}),"\n",(0,i.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,i.jsx)(n.a,{href:"https://github.com/github/github-mcp-server",children:"GitHub MCP Server"})," as a Goose extension to enable file operations, repository management, search functionality, and more."]}),"\n",(0,i.jsxs)(n.admonition,{title:"TLDR",type:"tip",children:[(0,i.jsxs)(l.A,{groupId:"interface",children:[(0,i.jsx)(d.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"Add custom extension"})," in Settings \u2192 Extensions to add a ",(0,i.jsx)(n.code,{children:"Streamable HTTP"})," extension type with:"]})}),(0,i.jsx)(d.A,{value:"cli",label:"Goose CLI",children:(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"goose configure"})," to add a ",(0,i.jsx)(n.code,{children:"Remote Extension (Streaming HTTP)"})," extension type with:"]})})]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Endpoint URL"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"https://api.githubcopilot.com/mcp/\n"})}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Custom Request Header"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Authorization: Bearer \n"})})]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["These steps configure the Remote MCP Server. For other deployment options, see the ",(0,i.jsx)(n.a,{href:"https://github.com/github/github-mcp-server",children:"official GitHub MCP Server documentation"}),"."]}),"\n",(0,i.jsxs)(l.A,{groupId:"interface",children:[(0,i.jsx)(d.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Obtain a ",(0,i.jsx)(n.a,{href:"https://github.com/settings/personal-access-tokens",children:"GitHub Personal Access Token"})]}),"\n",(0,i.jsxs)(n.li,{children:["Click the gear icon ",(0,i.jsx)(n.code,{children:"\u2699\ufe0f"})," in the top right corner"]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.code,{children:"Advanced settings"})]}),"\n",(0,i.jsxs)(n.li,{children:["Under ",(0,i.jsx)(n.code,{children:"Extensions"}),", click ",(0,i.jsx)(n.code,{children:"Add custom extension"})]}),"\n",(0,i.jsxs)(n.li,{children:["On the ",(0,i.jsx)(n.code,{children:"Add custom extension"})," modal, enter the following:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Extension Name"}),": GitHub"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Type"}),": Streamable HTTP"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Endpoint"}),": ",(0,i.jsx)(n.code,{children:"https://api.githubcopilot.com/mcp/"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Request Headers"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Header name"}),": ",(0,i.jsx)(n.code,{children:"Authorization"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Value"}),": ",(0,i.jsx)(n.code,{children:"Bearer "})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.code,{children:"+ Add"})," to save the header"]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.code,{children:"Add Extension"})," to save the extension"]}),"\n"]})}),(0,i.jsxs)(d.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Run the ",(0,i.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Choose to add a ",(0,i.jsx)(n.code,{children:"Remote Extension (Streaming HTTP)"})]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n \u2502 \u25cb Command-line Extension (Run a local command or script)\n \u2502 \u25cb Remote Extension (SSE) \n // highlight-start \n \u2502 \u25cf Remote Extension (Streaming HTTP) \n // highlight-end \n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 github\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Enter the Streaming HTTP endpoint URI"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 github\n \u2502\n // highlight-start\n \u25c6 What is the Streaming HTTP endpoint URI?\n \u2502 https://api.githubcopilot.com/mcp/\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:"Set the timeout"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 github\n \u2502\n \u25c7 What is the Streaming HTTP endpoint URI?\n \u2502 https://api.githubcopilot.com/mcp/\n \u2502\n // highlight-start\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsx)(n.li,{children:"Choose whether to add a description"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 github\n \u2502\n \u25c7 What is the Streaming HTTP endpoint URI?\n \u2502 https://api.githubcopilot.com/mcp/\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n // highlight-start\n \u25c6 Would you like to add a description?\n \u2502 No\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"7",children:["\n",(0,i.jsx)(n.li,{children:"Add a custom header for authentication"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 github\n \u2502\n \u25c7 What is the Streaming HTTP endpoint URI?\n \u2502 https://api.githubcopilot.com/mcp/\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502\n // highlight-start\n \u25c6 Would you like to add custom headers?\n \u2502 Yes\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"8",children:["\n",(0,i.jsx)(n.li,{children:"Enter the Authorization header"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 github\n \u2502\n \u25c7 What is the Streaming HTTP endpoint URI?\n \u2502 https://api.githubcopilot.com/mcp/\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502\n \u25c7 Would you like to add custom headers?\n \u2502 Yes\n \u2502\n // highlight-start\n \u25c6 Header name:\n \u2502 Authorization\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"9",children:["\n",(0,i.jsxs)(n.li,{children:["Enter your ",(0,i.jsx)(n.a,{href:"https://github.com/settings/personal-access-tokens",children:"GitHub Personal Access Token"})]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 github\n \u2502\n \u25c7 What is the Streaming HTTP endpoint URI?\n \u2502 https://api.githubcopilot.com/mcp/\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502\n \u25c7 Would you like to add custom headers?\n \u2502 Yes\n \u2502\n \u25c7 Header name:\n \u2502 Authorization\n \u2502\n // highlight-start\n \u25c6 Header value:\n \u2502 Bearer ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"10",children:["\n",(0,i.jsx)(n.li,{children:"Choose not to add another header"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Remote Extension (Streaming HTTP) \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 github\n \u2502\n \u25c7 What is the Streaming HTTP endpoint URI?\n \u2502 https://api.githubcopilot.com/mcp/\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 100\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502\n \u25c7 Would you like to add custom headers?\n \u2502 Yes\n \u2502\n \u25c7 Header name:\n \u2502 Authorization\n \u2502\n \u25c7 Header value:\n \u2502 Bearer ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n \u2502\n // highlight-start\n \u25c6 Add another header?\n \u2502 No \n \u2502\n // highlight-end\n \u2514 Added github extension\n"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsxs)(n.p,{children:["When creating my ",(0,i.jsx)(n.a,{href:"https://github.com/settings/personal-access-tokens",children:"GitHub Personal Access Token"}),", I gave it the following access:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Repository: ",(0,i.jsx)(n.a,{href:"https://github.com/angiejones/goose-demo",children:"goose-demo"})]}),"\n",(0,i.jsx)(n.li,{children:"Read access to metadata"}),"\n",(0,i.jsx)(n.li,{children:"Read and Write access to code, commit status, issues, and pull requests"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'create a new branch called hello-world in my angiejones/goose-demo repository. Update the README.md file to say "this was written by goose" and commit it. Open a pull request with your changes.\n'})}),"\n",(0,i.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'I\'ll help you create a new branch, update the README, and open a pull request. Let me break this down into steps:\n\n1. First, let\'s create the new branch called "hello-world" in your repository\n2. Then update the README.md file\n3. Finally, create a pull request\n\nLet me execute these steps:\n\n1. Creating the new branch:\n\n\u2500\u2500\u2500 create_branch | github \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nbranch: hello-world\nowner: angiejones\nrepo: goose-demo\n\n2. Now, updating the README.md file in the new branch:\n\n\u2500\u2500\u2500 create_or_update_file | github \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nbranch: hello-world\ncontent: this was written by goose\nmessage: Update README.md with Goose message\nowner: angiejones\npath: README.md\nrepo: goose-demo\n\n\n\n3. Finally, creating the pull request:\n\n\u2500\u2500\u2500 create_pull_request | github \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nbase: main\nbody: ...\nhead: hello-world\nowner: angiejones\nrepo: goose-demo\ntitle: Update README.md\n\n\n\nGreat! I\'ve completed all the requested tasks:\n1. Created a new branch called "hello-world"\n2. Updated the README.md file with the text "this was written by goose"\n3. Created a pull request to merge these changes into the main branch\n\nYou can view the pull request at: https://github.com/angiejones/goose-demo/pull/1\n\nThe pull request is now ready for your review. Would you like me to do anything else with it?\n'})})]})}function g(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}},28799:(e,n,o)=>{o.d(n,{A:()=>s});o(96540);var t=o(58069),i=o(74848);function s(e){let{name:n,command:o,timeout:s=300,envVars:l=[],infoNote:d}=e;const a=l.length>0,h=a?`Add environment variable${l.length>1?"s":""} for ${n}`:"Choose No when asked to add environment variables";return(0,i.jsxs)("div",{children:[(0,i.jsx)("ol",{children:(0,i.jsxs)("li",{children:["Run the ",(0,i.jsx)("code",{children:"configure"})," command:"]})}),(0,i.jsx)(t.A,{language:"sh",children:"goose configure"}),(0,i.jsx)("ol",{start:2,children:(0,i.jsxs)("li",{children:["Choose to add a ",(0,i.jsx)("code",{children:"Command-line Extension"}),"."]})}),(0,i.jsx)(t.A,{language:"sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c6 What type of extension would you like to add?\n\u2502 \u25cb Built-in Extension \n// highlight-start \n\u2502 \u25cf Command-line Extension (Run a local command or script)\n// highlight-end \n\u2502 \u25cb Remote Extension \n\u2514"}),(0,i.jsx)("ol",{start:3,children:(0,i.jsx)("li",{children:"Give your extension a name."})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n// highlight-start\n\u25c6 What would you like to call this extension?\n\u2502 ${n}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:4,children:(0,i.jsx)("li",{children:"Enter the command to run when this extension is used."})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n// highlight-start\n\u25c6 What command should be run?\n\u2502 ${o}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:5,children:(0,i.jsxs)("li",{children:["Enter the number of seconds Goose should wait for actions to complete before timing out. Default is ",(0,i.jsx)("code",{children:"300"})," seconds."]})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:6,children:(0,i.jsxs)("li",{children:["Choose to add a description. If you select ",(0,i.jsx)("code",{children:"Yes"}),", you\u2019ll be prompted to enter a description for the extension."]})}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n// highlight-start\n\u25c6 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2514`}),(0,i.jsx)("ol",{start:7,children:(0,i.jsx)("li",{children:h})}),!a&&(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n\u25c7 Would you like to add a description?\n\u2502 No\n\u2502\n// highlight-start\n\u25c6 Would you like to add environment variables?\n\u2502 No\n// highlight-end\n\u2514 Added ${n} extension`}),a&&(0,i.jsxs)(i.Fragment,{children:[d&&(0,i.jsx)("div",{className:"alert alert--info",children:d}),(0,i.jsx)(t.A,{language:"sh",children:`\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension)\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 ${n}\n\u2502\n\u25c7 What command should be run?\n\u2502 ${o}\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 ${s}\n\u2502\n\u25c7 Would you like to add a description?\n\u2502 No\n\u2502\n// highlight-start\n\u25c6 Would you like to add environment variables?\n\u2502 Yes\n${l.map(((e,n)=>{let{key:o,value:t}=e;return`\u2502\n\u25c7 Environment variable name:\n\u2502 ${o}\n\u2502\n\u25c7 Environment variable value:\n\u2502 ${t}\n\u2502\n\u25c7 Add another environment variable?\n\u2502 ${n===l.length-1?"No":"Yes"}`})).join("\n")}\n// highlight-end\n\u2514 Added ${n} extension`})]})]})}},25887:(e,n,o)=>{o.d(n,{A:()=>s});o(96540);var t=o(52362),i=o(74848);const s=e=>{let{videoUrl:n}=e;return(0,i.jsxs)("div",{children:[(0,i.jsx)(t.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Watch the demo"}),(0,i.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,i.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,i.jsx)("hr",{})]})}}}]); \ No newline at end of file diff --git a/assets/js/4de4cafa.47e49edf.js b/assets/js/4de4cafa.47e49edf.js new file mode 100644 index 00000000..5d18974c --- /dev/null +++ b/assets/js/4de4cafa.47e49edf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2319],{71666:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Architecture Overview","description":"Extend Goose functionalities with extensions and custom configurations","slug":"/category/architecture-overview","permalink":"/goose/docs/category/architecture-overview","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"YouTube Transcript Extension","permalink":"/goose/docs/mcp/youtube-transcript-mcp"},"next":{"title":"Goose Architecture","permalink":"/goose/docs/goose-architecture/"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/506700af.fa7b5f9f.js b/assets/js/506700af.fa7b5f9f.js new file mode 100644 index 00000000..b526eca9 --- /dev/null +++ b/assets/js/506700af.fa7b5f9f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1636],{93257:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>g,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var a=t(42061),n=t(74848),s=t(28453);const i={title:"Let A Team of AI Agents Do It For You",description:"Community Spotlight on Cliff Hall's GooseTeam MCP server.",authors:["tania"]},r=void 0,c={authorsImageUrls:[void 0]},l=[{value:"The Original Protocol",id:"the-original-protocol",level:2},{value:"GooseTeam MCP Server",id:"gooseteam-mcp-server",level:2},{value:"A New Way to Goose",id:"a-new-way-to-goose",level:2},{value:"Get Your Contribution Featured",id:"get-your-contribution-featured",level:2}];function m(e){const o={a:"a",h2:"h2",img:"img",p:"p",strong:"strong",...(0,s.R)(),...e.components},{Head:a}=o;return a||function(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"blog banner",src:t(36518).A+"",width:"1206",height:"633"})}),"\n",(0,n.jsxs)(o.p,{children:["During our ",(0,n.jsx)(o.a,{href:"https://youtu.be/9tq-QUnE29U",children:"previous livestream"}),", Aaron Goldsmith, Infrastructure Operations Engineer at Cash App, showed a team of Goose AI agents collaborating in real time to create a website. Our community loved it so much, Cliff Hall was inspired to iterate on that idea and create a GooseTeam MCP server."]}),"\n",(0,n.jsx)(o.h2,{id:"the-original-protocol",children:"The Original Protocol"}),"\n",(0,n.jsxs)(o.p,{children:["Aaron Goldsmith made an AI agent team consisting of multiple Goose instances a reality with his lightweight ",(0,n.jsx)(o.a,{href:"https://gist.github.com/AaronGoldsmith/114c439ae67e4f4c47cc33e829c82fac",children:"Agent Communication Protocol"}),". With it, each Goose agent enters the chat, gets assigned a role (e.g. Project Coordinator, Researcher, Web Developer), and works on its part of a given task. The protocol specifies instructions guiding how the agents should talk and behave, allowing multiple Goose agents to collaborate. It also specifies that communication between the agents should be done via a Python-based websocket server with text/markdown ."]}),"\n",(0,n.jsx)(o.h2,{id:"gooseteam-mcp-server",children:"GooseTeam MCP Server"}),"\n",(0,n.jsxs)(o.p,{children:["Introducing ",(0,n.jsx)(o.a,{href:"https://github.com/cliffhall/GooseTeam",children:"GooseTeam"}),", created by Software Architect and community member, Cliff Hall. GooseTeam takes Aaron's protocol and iterates on it into an MCP server and collaboration protocol for Goose Agents. With features like task management, message storage, and agent waiting, you can have an entire team of Goose agents work together on a task or project for you."]}),"\n",(0,n.jsx)(o.p,{children:"A Goose agent with the Project Coordinator role will assign roles to other agents, your connected agents will send messages that can retrieved at any time, and your team of agents will connect to the same MCP server to collaborate together."}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Goose Agents",src:t(1762).A+"",width:"3768",height:"758"})}),"\n",(0,n.jsx)(o.h2,{id:"a-new-way-to-goose",children:"A New Way to Goose"}),"\n",(0,n.jsx)(o.p,{children:"Working with a team of AI agents on a task is a game changer. Instead of getting confused as to how to improve your prompt engineering on your own or work across sessions manually, tools like Cliff's GooseTeam or Aaron's Agent Communication Protocol help us make sure AI agents like Goose are doing the work for us as efficiently as possible. The possibilities feel endless!"}),"\n",(0,n.jsx)(o.h2,{id:"get-your-contribution-featured",children:"Get Your Contribution Featured"}),"\n",(0,n.jsxs)(o.p,{children:["Hopefully this contribution inspired you as much as it inspired our community. If you have a Goose contribution or project you'd like to share with our community, join our ",(0,n.jsx)(o.a,{href:"https://discord.gg/block-opensource",children:"Discord"})," and share your work in the ",(0,n.jsx)(o.strong,{children:"#share-your-work"})," channel. You may just be featured on our livestream or get a cool prize. \ud83d\udc40 You can also star Goose on GitHub or follow us on social media so you never miss an update from us. Until next time!"]}),"\n",(0,n.jsxs)(a,{children:[(0,n.jsx)("meta",{property:"og:title",content:"Let A Team of AI Agents Do It For You"}),(0,n.jsx)("meta",{property:"og:type",content:"article"}),(0,n.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/02/17/gooseteam-mcp"}),(0,n.jsx)("meta",{property:"og:description",content:"Community Spotlight on Cliff Hall's GooseTeam MCP server."}),(0,n.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/gooseteam-mcp-082fa2890c313519c2a1637ca979c219.png"}),(0,n.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,n.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,n.jsx)("meta",{name:"twitter:title",content:"Let A Team of AI Agents Do It For You"}),(0,n.jsx)("meta",{name:"twitter:description",content:"Community Spotlight on Cliff Hall's GooseTeam MCP server."}),(0,n.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/gooseteam-mcp-082fa2890c313519c2a1637ca979c219.png"})]})]})}function g(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},1762:(e,o,t)=>{t.d(o,{A:()=>a});const a=t.p+"assets/images/gooseteam-agents-61bd50464e81d67f3f51ce2e3a2be223.png"},36518:(e,o,t)=>{t.d(o,{A:()=>a});const a=t.p+"assets/images/gooseteam-mcp-082fa2890c313519c2a1637ca979c219.png"},28453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>r});var a=t(96540);const n={},s=a.createContext(n);function i(e){const o=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),a.createElement(s.Provider,{value:o},e.children)}},42061:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/02/21/gooseteam-mcp","source":"@site/blog/2025-02-21-gooseteam-mcp/index.md","title":"Let A Team of AI Agents Do It For You","description":"Community Spotlight on Cliff Hall\'s GooseTeam MCP server.","date":"2025-02-21T00:00:00.000Z","tags":[],"readingTime":2.345,"hasTruncateMarker":true,"authors":[{"name":"Tania Chakraborty","title":"Senior Technical Community Manager","url":"https://taniachakraborty.com","page":{"permalink":"/goose/blog/authors/tania"},"socials":{"linkedin":"https://www.linkedin.com/in/taniachakraborty/","x":"https://x.com/taniashiba","github":"https://github.com/taniashiba","bluesky":"https://bsky.app/profile/taniachakraborty.com"},"imageURL":"https://avatars.githubusercontent.com/u/126204004?v=4","key":"tania"}],"frontMatter":{"title":"Let A Team of AI Agents Do It For You","description":"Community Spotlight on Cliff Hall\'s GooseTeam MCP server.","authors":["tania"]},"unlisted":false,"prevItem":{"title":"6 Essential Tips for Working with Goose","permalink":"/goose/blog/2025/03/06/goose-tips"},"nextItem":{"title":"Agentic AI and the MCP Ecosystem","permalink":"/goose/blog/2025/02/17/agentic-ai-mcp"}}')}}]); \ No newline at end of file diff --git a/assets/js/52a181bd.c581176f.js b/assets/js/52a181bd.c581176f.js new file mode 100644 index 00000000..9d432c78 --- /dev/null +++ b/assets/js/52a181bd.c581176f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[115],{16707:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>c});var n=o(11335),s=o(74848),a=o(28453);const i={title:"How I Manage Localhost Port Conflicts With an AI Agent",description:"Learn how I use Goose, an open source AI agent and MCP client, to manage conflicting ports without breaking my flow.",authors:["rizel"]},r="How I Manage Localhost Port Conflicts With an AI Agent",l={authorsImageUrls:[void 0]},c=[{value:"Localhost Ports Hoarding",id:"localhost-ports-hoarding",level:2}];function g(e){const t={blockquote:"blockquote",h2:"h2",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"blog cover",src:o(75085).A+"",width:"2240",height:"1260"})}),"\n",(0,s.jsx)(t.h2,{id:"localhost-ports-hoarding",children:"Localhost Ports Hoarding"}),"\n",(0,s.jsx)(t.p,{children:"I'm perpetually drowning in open tabs. Yes, I do need Bluesky, ChatGPT, Claude, Goose, Cursor, Discord, Slack, Netflix, and Google Docs all open at the same time. I've learned that tab management isn't my only vice."}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:'"Hi, my name is Rizel, and I\'m a localhost ports hoarder. \ud83d\udc4b\ud83c\udfff"'}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(g,{...e})}):g(e)}},75085:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/hoarders-753809f09399a9e4f734006a8d74218d.png"},28453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var n=o(96540);const s={},a=n.createContext(s);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(a.Provider,{value:t},e.children)}},11335:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/05/22/manage-local-host-conflicts-with-goose","source":"@site/blog/2025-05-22-manage-local-host-conflicts-with-goose/index.md","title":"How I Manage Localhost Port Conflicts With an AI Agent","description":"Learn how I use Goose, an open source AI agent and MCP client, to manage conflicting ports without breaking my flow.","date":"2025-05-22T00:00:00.000Z","tags":[],"readingTime":2.565,"hasTruncateMarker":true,"authors":[{"name":"Rizel Scarlett","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/rizel"},"socials":{"x":"https://x.com/blackgirlbytes","github":"https://github.com/blackgirlbytes","bluesky":"https://bsky.app/profile/blackgirlbytes.bsky.social","linkedin":"https://www.linkedin.com/in/rizel-bobb-semple/"},"imageURL":"https://avatars.githubusercontent.com/u/22990146?v=4","key":"rizel"}],"frontMatter":{"title":"How I Manage Localhost Port Conflicts With an AI Agent","description":"Learn how I use Goose, an open source AI agent and MCP client, to manage conflicting ports without breaking my flow.","authors":["rizel"]},"unlisted":false,"prevItem":{"title":"3 Prompts to Test for Agent Readiness","permalink":"/goose/blog/2025/05/22/llm-agent-readiness"},"nextItem":{"title":"Goose Gets a Driver\'s License!","permalink":"/goose/blog/2025/05/20/goose-gets-a-drivers-license"}}')}}]); \ No newline at end of file diff --git a/assets/js/52eb7a09.02464583.js b/assets/js/52eb7a09.02464583.js new file mode 100644 index 00000000..a9caf305 --- /dev/null +++ b/assets/js/52eb7a09.02464583.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6002],{70188:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>n,metadata:()=>r,toc:()=>p});const r=JSON.parse('{"id":"guides/recipes/index","title":"Recipes","description":"Reusable and shareable AI workflows","source":"@site/docs/guides/recipes/index.md","sourceDirName":"guides/recipes","slug":"/guides/recipes/","permalink":"/goose/docs/guides/recipes/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Recipes","hide_title":true,"description":"Reusable and shareable AI workflows"},"sidebar":"tutorialSidebar","previous":{"title":"Managing Sessions","permalink":"/goose/docs/guides/managing-goose-sessions"},"next":{"title":"Shareable Recipes","permalink":"/goose/docs/guides/recipes/session-recipes"}}');var t=i(74848),c=i(28453),o=i(37474),a=i(7144);const n={title:"Recipes",hide_title:!0,description:"Reusable and shareable AI workflows"},l=void 0,d={},p=[];function u(e){const s={p:"p",...(0,c.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("h1",{className:a.A.pageTitle,children:"Recipes"}),"\n",(0,t.jsx)("p",{className:a.A.pageDescription,children:(0,t.jsx)(s.p,{children:"Recipes are reusable workflows that package extensions, prompts, and settings together. Share proven workflows with your team and reproduce successful results consistently."})}),"\n",(0,t.jsx)("div",{className:"video-container margin-bottom--lg",children:(0,t.jsx)("iframe",{width:"100%",height:"400",src:"https://www.youtube.com/embed/8rTliYrQ6Iw",title:"Create Reusable AI Agents with Recipes",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})}),"\n",(0,t.jsxs)("div",{className:a.A.categorySection,children:[(0,t.jsx)("h2",{className:a.A.categoryTitle,children:"\ud83d\udcda Documentation & Guides"}),(0,t.jsxs)("div",{className:a.A.cardGrid,children:[(0,t.jsx)(o.A,{title:"Shareable Recipes",description:"Share a Goose session setup (including tools, goals, and instructions) as a reusable recipe that others can launch with a single click.",link:"/docs/guides/recipes/session-recipes"}),(0,t.jsx)(o.A,{title:"Recipe Reference Guide",description:"Complete technical reference for creating and customizing recipes in Goose via the CLI.",link:"/docs/guides/recipes/recipe-reference"}),(0,t.jsx)(o.A,{title:"Goose Recipes Tutorial",description:"Learn how to create and use Goose recipes with prompts, parameters, MCP servers, and more.",link:"/docs/tutorials/recipes-tutorial"}),(0,t.jsx)(o.A,{title:"Sub-Recipes",description:"Learn how a recipe can use sub-recipes to do specific tasks.",link:"/docs/guides/recipes/sub-recipes"}),(0,t.jsx)(o.A,{title:"Saving Recipes",description:"Learn how to save, organize, and find your Goose recipes for easy access and reuse.",link:"/docs/guides/recipes/storing-recipes"})]})]}),"\n",(0,t.jsxs)("div",{className:a.A.categorySection,children:[(0,t.jsx)("h2",{className:a.A.categoryTitle,children:"\ud83d\udee0\ufe0f Tools & Generators"}),(0,t.jsxs)("div",{className:a.A.cardGrid,children:[(0,t.jsx)(o.A,{title:"Recipe Generator",description:"Interactive tool that creates a shareable Goose recipe URL that others can use to launch a session with your predefined settings.",link:"/recipe-generator"}),(0,t.jsx)(o.A,{title:"Recipe Cookbook",description:"Browse our collection of ready-to-use recipes. Find and adapt recipes for common development scenarios.",link:"/recipes"})]})]}),"\n",(0,t.jsxs)("div",{className:a.A.categorySection,children:[(0,t.jsx)("h2",{className:a.A.categoryTitle,children:"\ud83d\udcdd Featured Blog Posts"}),(0,t.jsxs)("div",{className:a.A.cardGrid,children:[(0,t.jsx)(o.A,{title:"Championship Driven Development",description:"Recipes to accelerate your developer team's workflow.",link:"/blog/2025/05/09/developers-ai-playbook-for-team-efficiency"}),(0,t.jsx)(o.A,{title:"A Recipe for Success",description:"The value of scaling agentic workflows with recipes.",link:"/blog/2025/05/06/recipe-for-success"})]})]})]})}function h(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},37474:(e,s,i)=>{i.d(s,{A:()=>o});i(96540);var r=i(56289),t=i(7144),c=i(74848);function o(e){let{title:s,description:i,link:o,icon:a}=e;const n=o.startsWith("/"),l=n?r.A:"a",d=n?{to:o}:{href:o};return(0,c.jsx)(l,{...d,className:t.A.card,children:(0,c.jsxs)("div",{className:t.A.cardContent,children:[a&&(0,c.jsx)("div",{className:t.A.iconWrapper,children:(0,c.jsx)("img",{src:a,alt:"",className:t.A.icon})}),(0,c.jsx)("h3",{className:t.A.cardTitle,children:s}),(0,c.jsx)("p",{className:t.A.cardDescription,children:i})]})})}},7144:(e,s,i)=>{i.d(s,{A:()=>r});const r={categorySection:"categorySection_OPv7",categoryTitle:"categoryTitle_lrPf",cardGrid:"cardGrid_EPen",singleCardGrid:"singleCardGrid_c1rY",pageTitle:"pageTitle_DJXn",pageDescription:"pageDescription_HHKJ",card:"card_tSoT",cardTitle:"cardTitle_Vgx8",cardDescription:"cardDescription_N3HQ"}},28453:(e,s,i)=>{i.d(s,{R:()=>o,x:()=>a});var r=i(96540);const t={},c=r.createContext(t);function o(e){const s=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(c.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5339.367a2044.js b/assets/js/5339.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/5339.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/536f842f.f89e9b99.js b/assets/js/536f842f.f89e9b99.js new file mode 100644 index 00000000..12201c55 --- /dev/null +++ b/assets/js/536f842f.f89e9b99.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[7779],{30319:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});var n=o(62399),s=o(74848),i=o(28453);const a={title:"Automating Phone Calls with Goose",description:"Practical tips to help you use Goose more effectively and efficiently.",authors:["angie"]},r=void 0,l={authorsImageUrls:[void 0]},c=[];function p(e){const t={a:"a",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{style:{display:"none"},children:(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"blog cover",src:o(92523).A+"",width:"1920",height:"1080"})})}),"\n",(0,s.jsxs)(t.p,{children:["In the latest episode of ",(0,s.jsx)(t.a,{href:"https://www.youtube.com/playlist?list=PLyMFt_U2IX4uMW9kpE1FENQUyIgLuUnWD",children:"Wild Goose Case"}),", hosts ",(0,s.jsx)(t.a,{href:"https://www.linkedin.com/in/ebonylouis/",children:"Ebony Louis"})," and ",(0,s.jsx)(t.a,{href:"https://www.linkedin.com/in/acekyd/",children:"Ace Abati"})," explored a fascinating new way to extend Goose\u2019s automation capabilities by integrating with ",(0,s.jsx)(t.a,{href:"https://voyp.app/",children:"VOYP"}),", an AI-powered system that makes phone calls. Their guest, ",(0,s.jsx)(t.a,{href:"https://www.linkedin.com/in/paulotaylor/",children:"Paulo Taylor"}),", a technology veteran with over 35 years of experience, walked through how developers can use Goose to trigger and manage phone-based interactions through VOYP."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},92523:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/goose-voyp-215f3391cfbe2132542a2be63db84999.png"},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>r});var n=o(96540);const s={},i=n.createContext(s);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}},62399:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/10/goose-calls-vyop","source":"@site/blog/2025-03-10-goose-calls-vyop/index.md","title":"Automating Phone Calls with Goose","description":"Practical tips to help you use Goose more effectively and efficiently.","date":"2025-03-10T00:00:00.000Z","tags":[],"readingTime":2.325,"hasTruncateMarker":true,"authors":[{"name":"Angie Jones","title":"Head of Developer Relations","url":"https://angiejones.tech","page":{"permalink":"/goose/blog/authors/angie"},"socials":{"linkedin":"https://www.linkedin.com/in/angiejones/","github":"https://github.com/angiejones","x":"https://x.com/techgirl1908","bluesky":"https://bsky.app/profile/angiejones.tech"},"imageURL":"https://avatars.githubusercontent.com/u/15972783?v=4","key":"angie"}],"frontMatter":{"title":"Automating Phone Calls with Goose","description":"Practical tips to help you use Goose more effectively and efficiently.","authors":["angie"]},"unlisted":false,"prevItem":{"title":"Turn Figma Designs Into Code With Goose","permalink":"/goose/blog/2025/03/12/goose-figma-mcp"},"nextItem":{"title":"6 Essential Tips for Working with Goose","permalink":"/goose/blog/2025/03/06/goose-tips"}}')}}]); \ No newline at end of file diff --git a/assets/js/5442b933.5f13291a.js b/assets/js/5442b933.5f13291a.js new file mode 100644 index 00000000..735d8d37 --- /dev/null +++ b/assets/js/5442b933.5f13291a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9719],{2114:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>g,frontMatter:()=>a,metadata:()=>n,toc:()=>l});var n=o(98286),i=o(74848),s=o(28453);const a={draft:!1,title:"Resolving CI Issues with Goose: A Practical Walkthrough",description:"Leverage Goose to simplify your CI debugging process, fetch detailed information about failed CI runs & annotations directly from GitHub, and even apply fixes directly.",date:new Date("2024-12-11T00:00:00.000Z"),authors:["dalton"]},r=void 0,c={authorsImageUrls:[void 0]},l=[];function u(e){const t={code:"code",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"CI",src:o(34954).A+"",width:"1280",height:"720"})}),"\n",(0,i.jsxs)(t.p,{children:["Running into Continuous Integration (CI) failures in pull requests can be quite frustrating but they happen very often. In this post, we leverage the GitHub CLI (",(0,i.jsx)(t.code,{children:"gh"}),") using Goose to simplify your CI debugging process, fetch detailed information about failed CI runs and annotations directly from GitHub, and even apply fixes directly."]})]})}function g(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},34954:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/goose-github-ci-30930008ab57b0aebae15a03c73a12b5.png"},28453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>r});var n=o(96540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}},98286:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2024/12/11/resolving-ci-issues-with-goose-a-practical-walkthrough","source":"@site/blog/2024-12-11-resolving-ci-issues-with-goose-a-practical-walkthrough/index.md","title":"Resolving CI Issues with Goose: A Practical Walkthrough","description":"Leverage Goose to simplify your CI debugging process, fetch detailed information about failed CI runs & annotations directly from GitHub, and even apply fixes directly.","date":"2024-12-11T00:00:00.000Z","tags":[],"readingTime":3.985,"hasTruncateMarker":true,"authors":[{"name":"Dalton Turner","title":"Software Engineer","page":{"permalink":"/goose/blog/authors/dalton"},"socials":{"github":"https://github.com/dalton-turner"},"imageURL":"https://avatars.githubusercontent.com/u/78099245?v=4","key":"dalton"}],"frontMatter":{"draft":false,"title":"Resolving CI Issues with Goose: A Practical Walkthrough","description":"Leverage Goose to simplify your CI debugging process, fetch detailed information about failed CI runs & annotations directly from GitHub, and even apply fixes directly.","date":"2024-12-11T00:00:00.000Z","authors":["dalton"]},"unlisted":false,"prevItem":{"title":"Introducing codename goose","permalink":"/goose/blog/2025/01/28/introducing-codename-goose"},"nextItem":{"title":"Connecting AI Agents to Your Systems with MCP","permalink":"/goose/blog/2024/12/10/connecting-ai-agents-to-your-systems-with-mcp"}}')}}]); \ No newline at end of file diff --git a/assets/js/54f44165.a7971367.js b/assets/js/54f44165.a7971367.js new file mode 100644 index 00000000..565adbd6 --- /dev/null +++ b/assets/js/54f44165.a7971367.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[7924],{54575:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>g,contentTitle:()=>p,default:()=>m,frontMatter:()=>u,metadata:()=>n,toc:()=>x});const n=JSON.parse('{"id":"getting-started/installation","title":"Install Goose","description":"Choose to install Goose on CLI and/or Desktop:","source":"@site/docs/getting-started/installation.md","sourceDirName":"getting-started","slug":"/getting-started/installation","permalink":"/goose/docs/getting-started/installation","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/goose/docs/category/getting-started"},"next":{"title":"Configure LLM Provider","permalink":"/goose/docs/getting-started/providers"}}');var i=o(74848),l=o(28453),t=o(65537),r=o(79329),a=o(18127),d=o(29480),c=o(94742),h=o(15455);const u={sidebar_position:1},p="Install Goose",g={},x=[{value:"Set LLM Provider",id:"set-llm-provider",level:2},{value:"Update Provider",id:"update-provider",level:2},{value:"Running Goose",id:"running-goose",level:2},{value:"Shared Configuration Settings",id:"shared-configuration-settings",level:2},{value:"Additional Resources",id:"additional-resources",level:2}];function j(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components},{Details:n}=s;return n||function(e,s){throw new Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"install-goose",children:"Install Goose"})}),"\n",(0,i.jsxs)(t.A,{children:[(0,i.jsxs)(r.A,{value:"mac",label:"macOS",default:!0,children:[(0,i.jsx)(s.p,{children:"Choose to install Goose on CLI and/or Desktop:"}),(0,i.jsxs)(t.A,{groupId:"interface",children:[(0,i.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,i.jsxs)(s.p,{children:["Install Goose directly from the browser or with ",(0,i.jsx)(s.a,{href:"https://brew.sh/",children:"Homebrew"}),"."]}),(0,i.jsx)("h3",{style:{marginTop:"1rem"},children:"Option 1: Install via Download"}),(0,i.jsx)(d.A,{}),(0,i.jsxs)("div",{style:{marginTop:"1rem"},children:[(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Unzip the downloaded zip file."}),"\n",(0,i.jsx)(s.li,{children:"Run the executable file to launch the Goose Desktop application."}),"\n"]}),(0,i.jsx)(s.admonition,{title:"Updating Goose",type:"tip",children:(0,i.jsx)(s.p,{children:"It's best to keep Goose updated by periodically running the installation steps again."})})]}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)("h3",{children:"Option 2: Install via Homebrew"}),"\nHomebrew downloads the ",(0,i.jsx)(s.a,{href:"https://github.com/Homebrew/homebrew-cask/blob/master/Casks/b/block-goose.rb",children:"same app"})," but can take care of updates too."]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:" brew install --cask block-goose\n"})}),(0,i.jsx)(s.hr,{}),(0,i.jsx)("div",{style:{marginTop:"1rem"},children:(0,i.jsxs)(s.admonition,{title:"Permissions",type:"note",children:[(0,i.jsx)(s.p,{children:"If you're on an Apple Mac M3 and the Goose Desktop app shows no window on launch, check and update the following:"}),(0,i.jsxs)(s.p,{children:["Ensure the ",(0,i.jsx)(s.code,{children:"~/.config"})," directory has read and write access."]}),(0,i.jsxs)(s.p,{children:["Goose needs this access to create the log directory and file. Once permissions are granted, the app should load correctly. For steps on how to do this, refer to the ",(0,i.jsx)(s.a,{href:"/goose/docs/troubleshooting#macos-permission-issues",children:"Troubleshooting Guide"})]})]})})]}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsxs)(s.p,{children:["Install Goose directly from the browser or with ",(0,i.jsx)(s.a,{href:"https://brew.sh/",children:"Homebrew"}),"."]}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)("h3",{style:{marginTop:"1rem"},children:"Option 1: Install via Download script"}),"\nRun the following command to install the latest version of Goose on macOS:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash\n"})}),(0,i.jsx)(s.p,{children:"This script will fetch the latest version of Goose and set it up on your system."}),(0,i.jsxs)(s.p,{children:["If you'd like to install without interactive configuration, disable ",(0,i.jsx)(s.code,{children:"CONFIGURE"}),":"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash\n"})}),(0,i.jsxs)(s.admonition,{title:"Updating Goose",type:"tip",children:[(0,i.jsx)(s.p,{children:"It's best to keep Goose updated. To update Goose, run:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"goose update\n"})})]}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)("h3",{children:"Option 2: Install via Homebrew"}),"\nHomebrew downloads the ",(0,i.jsx)(s.a,{href:"https://github.com/Homebrew/homebrew-core/blob/master/Formula/b/block-goose-cli.rb",children:"a precompiled CLI tool"})," and can take care of updates."]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"brew install block-goose-cli\n"})})]})]})]}),(0,i.jsxs)(r.A,{value:"linux",label:"Linux",default:!0,children:[(0,i.jsx)(s.p,{children:"Choose to install Goose on CLI and/or Desktop:"}),(0,i.jsxs)(t.A,{groupId:"interface",children:[(0,i.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,i.jsx)(s.p,{children:"Install Goose Desktop directly from the browser."}),(0,i.jsx)("h3",{style:{marginTop:"1rem"},children:"Install via Download"}),(0,i.jsx)(h.A,{}),(0,i.jsxs)("div",{style:{marginTop:"1rem"},children:[(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"For Debian/Ubuntu-based distributions:"})}),(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Download the DEB file"}),"\n",(0,i.jsx)(s.li,{children:"Navigate to the directory where it is saved in a terminal"}),"\n",(0,i.jsxs)(s.li,{children:["Run ",(0,i.jsx)(s.code,{children:"sudo dpkg -i (filename).deb"})]}),"\n",(0,i.jsx)(s.li,{children:"Launch Goose from the app menu"}),"\n"]}),(0,i.jsx)(s.admonition,{title:"Updating Goose",type:"tip",children:(0,i.jsx)(s.p,{children:"It's best to keep Goose updated by periodically running the installation steps again."})})]})]}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(s.p,{children:"Run the following command to install the Goose CLI on Linux:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash\n"})}),(0,i.jsx)(s.p,{children:"This script will fetch the latest version of Goose and set it up on your system."}),(0,i.jsxs)(s.p,{children:["If you'd like to install without interactive configuration, disable ",(0,i.jsx)(s.code,{children:"CONFIGURE"}),":"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash\n"})}),(0,i.jsxs)(s.admonition,{title:"Updating Goose",type:"tip",children:[(0,i.jsx)(s.p,{children:"It's best to keep Goose updated. To update Goose, run:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"goose update\n"})})]})]})]})]}),(0,i.jsxs)(r.A,{value:"windows",label:"Windows",children:[(0,i.jsx)(s.p,{children:"Choose to install Goose on CLI and/or Desktop:"}),(0,i.jsxs)(t.A,{groupId:"interface",children:[(0,i.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,i.jsx)(s.p,{children:"Install Goose Desktop directly from the browser."}),(0,i.jsx)("h3",{style:{marginTop:"1rem"},children:"Install via Download"}),(0,i.jsx)(c.A,{}),(0,i.jsxs)("div",{style:{marginTop:"1rem"},children:[(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Unzip the downloaded zip file."}),"\n",(0,i.jsx)(s.li,{children:"Run the executable file to launch the Goose Desktop application."}),"\n"]}),(0,i.jsx)(s.admonition,{title:"Updating Goose",type:"tip",children:(0,i.jsx)(s.p,{children:"It's best to keep Goose updated by periodically running the installation steps again."})})]})]}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsxs)(s.p,{children:["Run the following command in ",(0,i.jsx)(s.strong,{children:"Git Bash"}),", ",(0,i.jsx)(s.strong,{children:"MSYS2"}),", or ",(0,i.jsx)(s.strong,{children:"PowerShell"})," to install the Goose CLI natively on Windows:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash\n"})}),(0,i.jsx)(s.p,{children:"This script will fetch the latest version of Goose and set it up on your system."}),(0,i.jsxs)(s.p,{children:["If you'd like to install without interactive configuration, disable ",(0,i.jsx)(s.code,{children:"CONFIGURE"}),":"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash\n"})}),(0,i.jsxs)(s.admonition,{title:"Prerequisites",type:"note",children:[(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Git Bash"})," (recommended): Comes with ",(0,i.jsx)(s.a,{href:"https://git-scm.com/download/win",children:"Git for Windows"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"MSYS2"}),": Available from ",(0,i.jsx)(s.a,{href:"https://www.msys2.org/",children:"msys2.org"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"PowerShell"}),": Available on Windows 10/11 by default"]}),"\n"]}),(0,i.jsxs)(s.p,{children:["The script requires ",(0,i.jsx)(s.code,{children:"curl"})," and ",(0,i.jsx)(s.code,{children:"unzip"})," to be available in your environment."]})]}),(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"Install via Windows Subsystem for Linux (WSL)"}),(0,i.jsx)(s.p,{children:"We recommend running the Goose CLI natively on Windows, but you can use WSL if you prefer a Linux-like environment."}),(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Open ",(0,i.jsx)(s.a,{href:"https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows",children:"PowerShell"})," as Administrator and install WSL and the default Ubuntu distribution:"]}),"\n"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"wsl --install\n"})}),(0,i.jsxs)(s.ol,{start:"2",children:["\n",(0,i.jsx)(s.li,{children:"If prompted, restart your computer to complete the WSL installation. Once restarted, or if WSL is already installed, launch your Ubuntu shell by running:"}),"\n"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"wsl -d Ubuntu\n"})}),(0,i.jsxs)(s.ol,{start:"3",children:["\n",(0,i.jsx)(s.li,{children:"Run the Goose installation script:"}),"\n"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | bash\n"})}),(0,i.jsxs)(s.admonition,{type:"tip",children:[(0,i.jsxs)(s.p,{children:["If you encounter any issues on download, you might need to install ",(0,i.jsx)(s.code,{children:"bzip2"})," to extract the downloaded file:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"sudo apt update && sudo apt install bzip2 -y\n"})})]}),(0,i.jsxs)(s.p,{children:["If you'd like to install without interactive configuration, disable ",(0,i.jsx)(s.code,{children:"CONFIGURE"}),":"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash\n"})})]})]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"set-llm-provider",children:"Set LLM Provider"}),"\n",(0,i.jsxs)(s.p,{children:["Goose works with a set of ",(0,i.jsx)(s.a,{href:"/docs/getting-started/providers",children:"supported LLM providers"}),", and you'll need an API key to get started. When you use Goose for the first time, you'll be prompted to select a provider and enter your API key."]}),"\n",(0,i.jsxs)(t.A,{groupId:"interface",children:[(0,i.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,i.jsx)(s.p,{children:"Upon installing, the Provider screen will appear. Here is where you can choose your LLM Provider."}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Set Up a Provider UI",src:o(56034).A+"",width:"752",height:"802"})}),(0,i.jsxs)(s.p,{children:["Once selecting your provider, you'll be prompted to enter an API key if applicable. Do so, and click ",(0,i.jsx)(s.code,{children:"Submit"}),"."]})]}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(s.p,{children:"Upon installing, Goose will automatically enter its configuration screen. Here is where you can set up your LLM provider."}),(0,i.jsx)(s.admonition,{title:"Windows Users",type:"tip",children:(0,i.jsx)(s.p,{children:"When using the native Windows CLI, choose to not store to keyring when prompted during initial configuration."})}),(0,i.jsx)(s.p,{children:"Example:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Configure Providers\n\u2502\n\u25c7 Which model provider should we use?\n\u2502 OpenAI\n\u2502\n\u25c7 Provider openai requires OPENAI_API_KEY, please enter a value\n\u2502\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n\u2502\n\u25c7 Enter a model from that provider:\n\u2502 gpt-4o\n\u2502\n\u25c7 Welcome aboard! You're all set to start using this agent\u2014let's achieve great things together!\n\u2502\n\u2514 Configuration saved successfully\n"})}),(0,i.jsxs)(s.admonition,{title:"Windows Users",type:"info",children:[(0,i.jsx)(s.p,{children:"On initial run, you may encounter errors about keyrings when setting your API Keys. Set the needed environment variables manually, e.g.:"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"For Native Windows CLI (Git Bash/MSYS2):"})}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"export OPENAI_API_KEY={your_api_key}\n"})}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"For WSL:"})}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"export OPENAI_API_KEY={your_api_key}\n"})}),(0,i.jsxs)(s.p,{children:["Run ",(0,i.jsx)(s.code,{children:"goose configure"})," again and proceed through the prompts. When you reach the step for entering the API key, Goose will detect that the key is already set as an environment variable and display a message like:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"\u25cf OPENAI_API_KEY is set via environment variable\n"})}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"To make the changes persist across sessions:"})}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"For Native Windows CLI (Git Bash):"}),"\nAdd the goose path and export commands to your ",(0,i.jsx)(s.code,{children:"~/.bashrc"})," or ",(0,i.jsx)(s.code,{children:"~/.bash_profile"})," file:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"echo 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.bashrc\necho 'export OPENAI_API_KEY=your_api_key' >> ~/.bashrc\nsource ~/.bashrc\n"})}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"For WSL:"})}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"echo 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.bashrc\necho 'export OPENAI_API_KEY=your_api_key' >> ~/.bashrc\nsource ~/.bashrc\n"})})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"update-provider",children:"Update Provider"}),"\n",(0,i.jsxs)(t.A,{groupId:"interface",children:[(0,i.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"To update your LLM provider and API key:"})}),(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Click on the three dots in the top-right corner."}),"\n",(0,i.jsxs)(s.li,{children:["Select ",(0,i.jsx)(s.code,{children:"Provider Settings"})," from the menu."]}),"\n",(0,i.jsx)(s.li,{children:"Choose a provider from the list."}),"\n",(0,i.jsxs)(s.li,{children:["Click Edit, enter your API key, and click ",(0,i.jsx)(s.code,{children:"Set as Active"}),"."]}),"\n"]})]}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"To update your LLM provider and API key:"})}),(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Run the following command:"}),"\n"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"goose configure\n"})}),(0,i.jsxs)(s.ol,{start:"2",children:["\n",(0,i.jsxs)(s.li,{children:["Select ",(0,i.jsx)(s.code,{children:"Configure Providers"})," from the menu."]}),"\n",(0,i.jsx)(s.li,{children:"Follow the prompts to choose your LLM provider and enter or update your API key."}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Example:"})}),(0,i.jsx)(s.p,{children:"To select an option during configuration, use the up and down arrows to highlight your choice then press Enter."}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Configure Providers\n\u2502\n\u25c7 Which model provider should we use?\n\u2502 Google Gemini\n\u2502\n\u25c7 Provider Google Gemini requires GOOGLE_API_KEY, please enter a value\n\u2502\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n\u2502\n\u25c7 Enter a model from that provider:\n\u2502 gemini-2.0-flash-exp\n\u2502\n\u25c7 Hello there! You're all set to use me, so please ask away!\n\u2502\n\u2514 Configuration saved successfully\n"})})]})]}),"\n",(0,i.jsx)(a.A,{}),"\n",(0,i.jsx)(s.h2,{id:"running-goose",children:"Running Goose"}),"\n",(0,i.jsxs)(t.A,{groupId:"interface",children:[(0,i.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,i.jsx)(s.p,{children:"Starting a session in the Goose Desktop is straightforward. After choosing your provider, you'll see the session interface ready for use."}),(0,i.jsx)(s.p,{children:"Type your questions, tasks, or instructions directly into the input field, and Goose will get to work immediately."})]}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(s.p,{children:"From your terminal, navigate to the directory you'd like to start from and run:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"goose session\n"})})]})]}),"\n",(0,i.jsx)(s.h2,{id:"shared-configuration-settings",children:"Shared Configuration Settings"}),"\n",(0,i.jsxs)(s.p,{children:["The Goose CLI and Desktop UI share all core configurations, including LLM provider settings, model selection, and extension configurations. When you install or configure extensions in either interface, the settings are stored in a central location at ",(0,i.jsx)(s.code,{children:"~/.config/goose/config.yaml"}),", making them available to both the Desktop application and CLI. This makes it convenient to switch between interfaces while maintaining consistent settings."]}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsx)(s.p,{children:"While core configurations are shared between interfaces, extensions have flexibility in how they store authentication credentials. Some extensions may use the shared config file while others implement their own storage methods."})}),"\n",(0,i.jsxs)(t.A,{groupId:"interface",children:[(0,i.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,i.jsx)(s.p,{children:"Navigate to shared configurations through:"}),(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Click ",(0,i.jsx)(s.code,{children:"..."})," in the upper right corner"]}),"\n",(0,i.jsxs)(s.li,{children:["Click ",(0,i.jsx)(s.code,{children:"Advanced Settings"})]}),"\n"]})]}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(s.p,{children:"Use the following command to manage shared configurations:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"goose configure\n"})})]})]}),"\n",(0,i.jsx)(s.h2,{id:"additional-resources",children:"Additional Resources"}),"\n",(0,i.jsxs)(s.p,{children:["You can also configure Extensions to extend Goose's functionality, including adding new ones or toggling them on and off. For detailed instructions, visit the ",(0,i.jsx)(s.a,{href:"/docs/getting-started/using-extensions",children:"Using Extensions Guide"}),"."]})]})}function m(e={}){const{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(j,{...e})}):j(e)}},15455:(e,s,o)=>{o.d(s,{A:()=>t});var n=o(56289),i=o(96960),l=o(74848);const t=()=>(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{children:"To download Goose Desktop for Linux, choose the buttons below:"}),(0,l.jsxs)("div",{className:"pill-button",style:{display:"flex",gap:"0.5rem",flexWrap:"wrap"},children:[(0,l.jsxs)(n.A,{className:"button button--primary button--lg",to:"https://github.com/block/goose/releases/download/stable/goose_1.0.29_amd64.deb",children:[(0,l.jsx)(i.i,{})," DEB Package (Ubuntu/Debian)"]}),(0,l.jsxs)(n.A,{className:"button button--primary button--lg",to:"https://github.com/block/goose/releases/download/stable/Goose-1.0.29-1.x86_64.rpm",children:[(0,l.jsx)(i.i,{})," RPM Package (RHEL/Fedora)"]})]})]})},29480:(e,s,o)=>{o.d(s,{A:()=>t});var n=o(56289),i=o(96960),l=o(74848);const t=()=>(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{children:"To download Goose Desktop for macOS, click one of the buttons below:"}),(0,l.jsxs)("div",{className:"pill-button",children:[(0,l.jsxs)(n.A,{className:"button button--primary button--lg",to:"https://github.com/block/goose/releases/download/stable/Goose.zip",children:[(0,l.jsx)(i.i,{})," macOS Silicon"]}),(0,l.jsxs)(n.A,{className:"button button--primary button--lg",to:"https://github.com/block/goose/releases/download/stable/Goose_intel_mac.zip",children:[(0,l.jsx)(i.i,{})," macOS Intel"]})]})]})},18127:(e,s,o)=>{o.d(s,{A:()=>l});o(96540);var n=o(52362),i=o(74848);const l=()=>(0,i.jsxs)(n.A,{type:"info",title:"Billing",children:[(0,i.jsx)("a",{href:"https://aistudio.google.com/app/apikey",target:"_blank",rel:"noopener noreferrer",children:"Google Gemini"})," ","offers a free tier you can get started with. Otherwise, you'll need to ensure that you have credits available in your LLM Provider account to successfully make requests.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Some providers also have rate limits on API usage, which can affect your experience. Check out our"," ",(0,i.jsx)("a",{href:"/goose/docs/guides/handling-llm-rate-limits-with-goose",target:"_blank",children:"Handling Rate Limits"})," ","guide to learn how to efficiently manage these limits while using Goose."]})},94742:(e,s,o)=>{o.d(s,{A:()=>t});var n=o(56289),i=o(96960),l=o(74848);const t=()=>(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{children:"To download Goose Desktop for Windows, click the button below:"}),(0,l.jsx)("div",{className:"pill-button",children:(0,l.jsxs)(n.A,{className:"button button--primary button--lg",to:"https://github.com/block/goose/releases/download/stable/Goose-win32-x64.zip",children:[(0,l.jsx)(i.i,{})," Windows"]})})]})},96960:(e,s,o)=>{o.d(s,{i:()=>i});var n=o(74848);const i=e=>{let{className:s=""}=e;return(0,n.jsx)("svg",{width:"1.5rem",height:"1.5rem",fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-hidden":"true",className:s,children:(0,n.jsx)("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M15.76 12.15a1 1 0 0 0-1.52-1.3L13 12.296V3a1 1 0 1 0-2 0v9.297l-1.24-1.448a1 1 0 0 0-1.52 1.302l3 3.5a1 1 0 0 0 1.52 0l3-3.5ZM5 16a1 1 0 1 0-2 0v4a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1v-4a1 1 0 1 0-2 0v3H5v-3Z",fill:"currentColor"})})}},56034:(e,s,o)=>{o.d(s,{A:()=>n});const n=o.p+"assets/images/set-up-provider-ui-a6ba5f66d16937ee91dbad22c101c232.png"}}]); \ No newline at end of file diff --git a/assets/js/55040903.6db89418.js b/assets/js/55040903.6db89418.js new file mode 100644 index 00000000..31f44eca --- /dev/null +++ b/assets/js/55040903.6db89418.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202,9616],{33793:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>p,frontMatter:()=>c,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"mcp/selenium-mcp","title":"Selenium Extension","description":"Add Selenium MCP Server as a Goose Extension","source":"@site/docs/mcp/selenium-mcp.md","sourceDirName":"mcp","slug":"/mcp/selenium-mcp","permalink":"/goose/docs/mcp/selenium-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Selenium Extension","description":"Add Selenium MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Repomix Extension","permalink":"/goose/docs/mcp/repomix-mcp"},"next":{"title":"Speech Extension","permalink":"/goose/docs/mcp/speech-mcp"}}');var i=t(74848),s=t(28453),l=t(65537),r=t(79329),a=t(25887);const c={title:"Selenium Extension",description:"Add Selenium MCP Server as a Goose Extension"},d=void 0,u={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function m(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.A,{videoUrl:"https://www.youtube.com/embed/PLqPOEeGPLc"}),"\n",(0,i.jsxs)(n.p,{children:["This tutorial covers how to add the ",(0,i.jsx)(n.a,{href:"https://github.com/angiejones/mcp-selenium",children:"Selenium MCP Server"})," as a Goose extension to automate browser interactions such as navigating web pages and completing forms."]}),"\n",(0,i.jsx)(n.admonition,{title:"TLDR",type:"tip",children:(0,i.jsxs)(l.A,{groupId:"interface",children:[(0,i.jsx)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=%40angiejones%2Fmcp-selenium&id=selenium-mcp&name=Selenium%20MCP&description=automates%20browser%20interactions",children:"Launch the installer"})})}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Command"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"npx -y @angiejones/mcp-selenium\n"})})]})]})}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Note that you'll need ",(0,i.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," installed on your system to run this command, as it uses ",(0,i.jsx)(n.code,{children:"npx"}),"."]})}),"\n",(0,i.jsxs)(l.A,{groupId:"interface",children:[(0,i.jsx)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=-y&arg=%40angiejones%2Fmcp-selenium&id=selenium-mcp&name=Selenium%20MCP&description=automates%20browser%20interactions",children:"Launch the installer"})}),"\n",(0,i.jsxs)(n.li,{children:["Press ",(0,i.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.code,{children:"Save Configuration"})]}),"\n",(0,i.jsxs)(n.li,{children:["Scroll to the top and click ",(0,i.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,i.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Run the ",(0,i.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Choose to add a ",(0,i.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 Selenium\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Selenium\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 npx -y @angiejones/mcp-selenium\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Selenium\n\u2502\n\u25c7 What command should be run?\n\u2502 npx -y @angiejones/mcp-selenium\n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 300\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Selenium\n\u2502\n\u25c7 What command should be run?\n\u2502 npx -y @angiejones/mcp-selenium\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n// highlight-start\n\u25c7 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2502\n\u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"7",children:["\n",(0,i.jsx)(n.li,{children:"Choose No when asked to add environment variables"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 Selenium\n \u2502\n \u25c7 What command should be run?\n \u2502 npx -y @angiejones/mcp-selenium\n \u2502 \n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502 \n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 No \n \u2502\n // highlight-end\n \u2514 Added Selenium extension\n"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsx)(n.p,{children:"Let's use Goose to build a test automation project from scratch! We'll use the Selenium MCP to automate filling out a web form, then have Goose generate a Selenium project with the code so that we can run these tests again when needed."}),"\n",(0,i.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Use selenium to go to the heroku formy site and fill out the form page with generic data. then can you turn what you've done into an automation script for me? I would like it in Java. Also use the Page Object Model pattern."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,i.jsx)("iframe",{class:"aspect-ratio",src:"https://www.youtube.com/embed/mRV0N8hcgYA?start=28&end=152",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:!0})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>P});var o=t(96540),i=t(74848);function s(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=o.Children.toArray(e),t=n.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),s=n.filter((e=>e!==t)),l=t?.props.children;return{mdxAdmonitionTitle:l,rest:s.length>0?(0,i.jsx)(i.Fragment,{children:s}):null}}(e.children),s=e.title??n;return{...e,...s&&{title:s},children:t}}var l=t(34164),r=t(50539),a=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:o}=e;return(0,i.jsx)("div",{className:(0,l.A)(a.G.common.admonition,a.G.common.admonitionType(n),c,t),children:o})}function p(e){let{icon:n,title:t}=e;return(0,i.jsxs)("div",{className:d,children:[(0,i.jsx)("span",{className:u,children:n}),t]})}function x(e){let{children:n}=e;return n?(0,i.jsx)("div",{className:h,children:n}):null}function f(e){const{type:n,icon:t,title:o,children:s,className:l}=e;return(0,i.jsxs)(m,{type:n,className:l,children:[o||t?(0,i.jsx)(p,{title:o,icon:t}):null,(0,i.jsx)(x,{children:s})]})}function g(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,i.jsx)(g,{}),title:(0,i.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function v(e){return(0,i.jsx)(f,{...j,...e,className:(0,l.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,i.jsx)(b,{}),title:(0,i.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,i.jsx)(f,{...y,...e,className:(0,l.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const C={icon:(0,i.jsx)(A,{}),title:(0,i.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function N(e){return(0,i.jsx)(f,{...C,...e,className:(0,l.A)("alert alert--info",e.className),children:e.children})}function k(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const E={icon:(0,i.jsx)(k,{}),title:(0,i.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function S(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const T={icon:(0,i.jsx)(S,{}),title:(0,i.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const I={icon:(0,i.jsx)(k,{}),title:(0,i.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const W={...{note:v,tip:w,info:N,warning:function(e){return(0,i.jsx)(f,{...E,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(f,{...T,...e,className:(0,l.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(v,{title:"secondary",...e}),important:e=>(0,i.jsx)(N,{title:"important",...e}),success:e=>(0,i.jsx)(w,{title:"success",...e}),caution:function(e){return(0,i.jsx)(f,{...I,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})}}};function P(e){const n=s(e),t=(o=n.type,W[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),W.info));var o;return(0,i.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>l});t(96540);var o=t(34164);const i={tabItem:"tabItem_Ymn6"};var s=t(74848);function l(e){let{children:n,hidden:t,className:l}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(i.tabItem,l),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),i=t(34164),s=t(65627),l=t(56347),r=t(50372),a=t(30604),c=t(11861),d=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:i}}=e;return{value:n,label:t,attributes:o,default:i}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const i=(0,l.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,a.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(i.location.search);n.set(s,e),i.replace({...i.location,search:n.toString()})}),[s,i])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,s=h(e),[l,a]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:s}))),[c,u]=p({queryString:t,groupId:i}),[x,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,s]=(0,d.Dv)(t);return[i,(0,o.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:i}),g=(()=>{const e=c??x;return m({value:e,tabValues:s})?e:null})();(0,r.A)((()=>{g&&a(g)}),[g]);return{selectedValue:l,selectValue:(0,o.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),f(e)}),[u,f,s]),tabValues:s}}var f=t(9136);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(74848);function v(e){let{className:n,block:t,selectedValue:o,selectValue:l,tabValues:r}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),i=r[t].value;i!==o&&(c(n),l(i))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:r.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{a.push(e)},onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:s}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===s));return e?(0,o.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function y(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,i.A)("tabs-container",g.tabList),children:[(0,j.jsx)(v,{...n,...e}),(0,j.jsx)(b,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,j.jsx)(y,{...e,children:u(e.children)},String(n))}},25887:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var o=t(52362),i=t(74848);const s=e=>{let{videoUrl:n}=e;return(0,i.jsxs)("div",{children:[(0,i.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Watch the demo"}),(0,i.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,i.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,i.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>r});var o=t(96540);const i={},s=o.createContext(i);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/56a3ea8f.5141bd12.js b/assets/js/56a3ea8f.5141bd12.js new file mode 100644 index 00000000..1da1500c --- /dev/null +++ b/assets/js/56a3ea8f.5141bd12.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[7006],{14686:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var i=t(10691),a=t(74848),s=t(28453);const o={title:"MCP Is Rewriting the Rules of API Integration",description:"A developer's guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations.",authors:["ian"]},r=void 0,l={authorsImageUrls:[void 0]},d=[{value:"Introduction: The Intelligent Evolution of Your APIs",id:"introduction-the-intelligent-evolution-of-your-apis",level:2},{value:"From Static Endpoints to Intelligent Interactions",id:"from-static-endpoints-to-intelligent-interactions",level:2},{value:"Current Landscape: The Limitations of Traditional APIs",id:"current-landscape-the-limitations-of-traditional-apis",level:3},{value:"Development Impact: Boosting Productivity, Enhancing User Experiences",id:"development-impact-boosting-productivity-enhancing-user-experiences",level:3},{value:"Business Impact: Driving Efficiency and Cost Savings",id:"business-impact-driving-efficiency-and-cost-savings",level:3},{value:"Integrating AI and MCP: Navigating the Landscape",id:"integrating-ai-and-mcp-navigating-the-landscape",level:2},{value:"Phased Approach: A Practical Integration Strategy",id:"phased-approach-a-practical-integration-strategy",level:3},{value:"Measuring Success: Quantifying the Impact",id:"measuring-success-quantifying-the-impact",level:2},{value:"Build Your Case Study and Share Your Learnings",id:"build-your-case-study-and-share-your-learnings",level:3},{value:"Where do we go from here?",id:"where-do-we-go-from-here",level:2},{value:"TL;DR Common Questions",id:"tldr-common-questions",level:2}];function c(e){const n={a:"a",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Head:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"blog cover",src:t(31579).A+"",width:"1920",height:"1080"})}),"\n",(0,a.jsx)(n.p,{children:"As developers, we're always looking for ways to build more efficient, scalable, and intelligent applications. For years, RESTful APIs have been our go-to for connecting services. Here are some ways you can integrate AI agents and MCP into your existing API infrastructure to make it smarter, more efficient, and easier to maintain."}),"\n",(0,a.jsx)(n.h2,{id:"introduction-the-intelligent-evolution-of-your-apis",children:"Introduction: The Intelligent Evolution of Your APIs"}),"\n",(0,a.jsx)(n.p,{children:"In March 2023, OpenAI announced an easier integration to ChatGPT by using properly-formatted OpenAPI specification files with meticulously-written and detailed instructions in the same file. This announcement gained a lot of attention in developer communities. The business impact was having developers and documentation writers working on one gigantic spec file together, to provide ChatGPT the necessary context to understand which API to use, and how."}),"\n",(0,a.jsxs)(n.p,{children:["Skip ahead just a short while, and ",(0,a.jsx)(n.a,{href:"https://news.microsoft.com/source/features/ai/ai-agents-what-they-are-and-how-theyll-change-the-way-we-work/",children:"AI agents"})," combined with the ",(0,a.jsx)(n.a,{href:"https://modelcontextprotocol.io/introduction",children:"Model Context Protocol (MCP)"})," are splitting this workload where MCP could contain the context and awareness, and your API team can focus on the API itself. These aren't just incremental improvements, either; the combination of Agentic AI and MCP represent a fundamental shift in how we connect and interact with data and services."]}),"\n",(0,a.jsxs)(n.p,{children:["The shift to ",(0,a.jsx)(n.a,{href:"/blog/2025/02/17/agentic-ai-mcp/",children:"using AI Agents and MCP"})," has the potential to be as big a change as the introduction of REST APIs was back in 2005. Imagine a world where integrations are more dynamic, context-aware, and require less manual coding. This isn't a distant future -- it's already happening. This is an opportunity for us to boost productivity, enhance app intelligence, and ultimately deliver better experiences to our users, clients, and customers."]}),"\n",(0,a.jsx)(n.p,{children:"Let's use an example: imagine your team wants AI to handle dynamic pricing adjustments in your e-commerce workflow at Square. If you could gain a faster response time to market changes or inventory, you could reduce the need to build dozens or hundreds of dynamic pricing rules into your code. Your productivity as a developer goes up, and you have less code to maintain. You could write those rules in a more spoken-language way, and the AI agent can handle the rest through MCP and your APIs."}),"\n",(0,a.jsx)(n.h2,{id:"from-static-endpoints-to-intelligent-interactions",children:"From Static Endpoints to Intelligent Interactions"}),"\n",(0,a.jsx)(n.h3,{id:"current-landscape-the-limitations-of-traditional-apis",children:"Current Landscape: The Limitations of Traditional APIs"}),"\n",(0,a.jsx)(n.p,{children:"Many of our current systems rely heavily on traditional APIs, like RESTful APIs, which are designed with static endpoints that respond to specific requests with specific results. While these APIs have served us well (and certainly aren't going away any time soon), they come with limitations:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The static nature of RESTful APIs makes them more rigid, less adaptable to business changes, and require hard rules around versioning to provide compatibility."}),"\n",(0,a.jsx)(n.li,{children:"They often require significant manual effort to define endpoints, handle data transformations, and manage complex workflows. This can lead to slower development cycles and increased maintenance overhead."}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"The AI opportunity lies in leveraging intelligent agents, combined with MCP, to create more adaptive integrations."})," These agents can understand context, discover relevant services, and negotiate interactions in a more dynamic way than static API calls. The static APIs are still being used, but the AI agents can navigate those more easily than changing your code calling the APIs and parsing and validating responses, and handling errors."]}),"\n",(0,a.jsx)(n.h3,{id:"development-impact-boosting-productivity-enhancing-user-experiences",children:"Development Impact: Boosting Productivity, Enhancing User Experiences"}),"\n",(0,a.jsx)(n.p,{children:"This dual integration of AI agents and MCP can have a significant positive impact on your development processes and the applications you build:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Developer Productivity:"})," By automating many integration tasks and reducing the need for extensive manual coding, AI agents free up our time to focus on core application logic and innovation. (And testing. And security. And documentation. And...)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Customer Satisfaction:"})," Intelligent integrations can lead to more personalized and responsive user experiences. Agents can facilitate real-time data analysis and context-aware interactions, making our applications smarter and more user-friendly."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Scalability:"})," As your application grows, the complexity of managing multiple APIs can become overwhelming. ",(0,a.jsx)(n.a,{href:"/blog/2025/02/21/gooseteam-mcp/",children:"Using multiple AI agents"})," can help manage this complexity by dynamically adapting to changes in the underlying services and workflows."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"business-impact-driving-efficiency-and-cost-savings",children:"Business Impact: Driving Efficiency and Cost Savings"}),"\n",(0,a.jsx)(n.p,{children:"From the business side, the integration of AI agents and MCP can lead to significant cost savings and efficiency gains. Here are some key areas where you can expect to see improvements:"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Example ROI Calculation (Per Developer):"})}),"\n",(0,a.jsx)(n.p,{children:"Traditional API Development:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Average time to add feature: 2 weeks"}),"\n",(0,a.jsx)(n.li,{children:"Developer cost: $150/hour"}),"\n",(0,a.jsx)(n.li,{children:"Assuming 40 hours/week: 2 weeks * 40 hours/week * $150/hour = $12,000"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"AI-Agent Enabled:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Average time to add feature: 2 days"}),"\n",(0,a.jsx)(n.li,{children:"Developer cost: $150/hour"}),"\n",(0,a.jsx)(n.li,{children:"Assuming 8 hours/day: 2 days * 8 hours/day * $150/hour = $2,400"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Annual savings for 50 features: ( $12,000 - $2,400 ) * 50 = ",(0,a.jsx)(n.strong,{children:"$480,000 per developer"})]}),"\n",(0,a.jsx)(n.p,{children:"This illustrates the potential for significant time and cost savings per developer by adopting AI agents."}),"\n",(0,a.jsx)(n.h2,{id:"integrating-ai-and-mcp-navigating-the-landscape",children:"Integrating AI and MCP: Navigating the Landscape"}),"\n",(0,a.jsx)(n.p,{children:"Integrating AI agents, especially through a platform like MCP, requires careful consideration."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Risk Management: MCP, while promising, is a newer technology. Your team needs to thoroughly evaluate ",(0,a.jsx)(n.a,{href:"/blog/2025/03/26/mcp-security/",children:"potential security concerns"})," and understand the maturity of the platform before deep integration into critical systems."]}),"\n",(0,a.jsx)(n.li,{children:"Planning for Continuity and Versioning: As with any evolving technology, you will need strategies for ensuring the continuity of integrations and managing versioning of both the AI agents and MCP itself."}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"phased-approach-a-practical-integration-strategy",children:"Phased Approach: A Practical Integration Strategy"}),"\n",(0,a.jsx)(n.p,{children:"A step-by-step approach can help mitigate risks, and learn effectively through feedback, as you integrate AI agents via MCP:"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Phase 1: Assessment (Initial Exploration)"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Look through your existing API usage, and identify integration possibilities"}),"\n",(0,a.jsx)(n.li,{children:"Consider the ROI: start with small ideas and grow your integration efforts over time"}),"\n",(0,a.jsx)(n.li,{children:"Build initial business/tech plans for adopting AI agents and MCP"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Phase 2: A/B Testing and Pilot Projects"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Select a low-risk, high-value service for initial AI agent integration via MCP"}),"\n",(0,a.jsx)(n.li,{children:"Implement the integration, then do thorough A/B testing and comparisons against the traditional API approach"}),"\n",(0,a.jsx)(n.li,{children:"Measure the results, gather benchmark/performance data, and talk to the team about what you find"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Phase 3: Scale and Optimization"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Take it a step at a time: based on the results, take on bigger and more complex integration ideas"}),"\n",(0,a.jsx)(n.li,{children:"Continue to optimize your integration process over time"}),"\n",(0,a.jsx)(n.li,{children:"Use feedback from your dev teams and end-users to refine your process"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"measuring-success-quantifying-the-impact",children:"Measuring Success: Quantifying the Impact"}),"\n",(0,a.jsx)(n.p,{children:"For the business readers: to understand the benefits of integrating AI agents via MCP, here are some key performance indicators (KPIs) you can track:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Development Velocity"}),"\n",(0,a.jsx)(n.li,{children:"Error Rates"}),"\n",(0,a.jsx)(n.li,{children:"Customer Satisfaction"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"build-your-case-study-and-share-your-learnings",children:"Build Your Case Study and Share Your Learnings"}),"\n",(0,a.jsx)(n.p,{children:"Documenting your team's journey and sharing your experiences is valuable for both your team and the wider developer community. Here are a few things you should share to help demonstrate the impact of your projects:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Before and After Metrics"}),": what kind of improvements did you see in development time, error rates after integrating AI agents and MCP?"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Team Feedback"}),": there's going to be a learning curve here, similar to what we all experienced when integrating APIs; gather feedback about how the integration workflows are going and what could be improved"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Customer/End User Impact"}),": highlight any positive changes in user engagement, satisfaction, or other user/customer metrics"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Lessons Learned"}),": perhaps the most important; what worked well, what didn't, how are you changing the process for the next phase of integration?"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"where-do-we-go-from-here",children:"Where do we go from here?"}),"\n",(0,a.jsx)(n.p,{children:"Understanding your existing integrations, and identifying potential areas for improvement with AI agents and MCP is your starting point. There is a lot to learn about integrating AI agents, and MCP is still a new technology."}),"\n",(0,a.jsx)(n.p,{children:"Finding those opportunities where AI can help, and outlining a plan to gradually adopt AI and MCP into your projects is the best way to start."}),"\n",(0,a.jsx)(n.p,{children:"Keep in mind, this integration landscape is still evolving. Stay open to new ideas, and adapt your approach as the technology matures. Building smarter applications is a journey, and there will be forks in the road."}),"\n",(0,a.jsx)(n.p,{children:"Additional Reading:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:"What are AI Agents"}),"\n"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://news.microsoft.com/source/features/ai/ai-agents-what-they-are-and-how-theyll-change-the-way-we-work/",children:"AI agents \u2014 what they are, and how they\u2019ll change the way we work"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://www.aitrends.com/ai-agents/what-are-ai-agents-and-why-do-they-matter/",children:"What are AI Agents and Why do They Matter?"})}),"\n"]}),"\n",(0,a.jsxs)(n.ol,{start:"2",children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://modelcontextprotocol.io/introduction",children:"An Introduction to MCP"})}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"/blog/2024/12/10/connecting-ai-agents-to-your-systems-with-mcp/",children:"Connecting AI Agents to Your Systems with MCP"})}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://www.mckinsey.com/featured-insights/artificial-intelligence/global-ai-survey-ai-proves-its-worth-but-few-scale-impact",children:"Global AI Survey: AI proves its worth, but few scale impact"})}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://www.thoughtworks.com/en-us/insights/blog/generative-ai/generative-ai-legacy-modernization-insurance-erik-doernenburg",children:"Bringing generative AI to bear on legacy modernization in insurance"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"tldr-common-questions",children:"TL;DR Common Questions"}),"\n",(0,a.jsxs)(n.p,{children:["Q: ",(0,a.jsx)(n.strong,{children:"How will MCP help with APIs?"}),(0,a.jsx)("br",{}),"\r\nA: Start with ",(0,a.jsx)(n.a,{href:"/blog/2025/02/17/agentic-ai-mcp/#mcp-ecosystem",children:"this post by Angie Jones"}),'. MCP provides context about your API, to give AI Agents more context and awareness of the capabilities of your API endpoints and responses. This can help the Agent understand the intent of the request, and dynamically invoke (or "call") to underlying API endpoint, handle data transformation, and return a response. No more manually writing the code, response validators, error handlers, and so on!']}),"\n",(0,a.jsxs)(n.p,{children:["Q: ",(0,a.jsx)(n.strong,{children:"What are some initial steps I can take as a developer to explore AI agents and MCP?"}),(0,a.jsx)("br",{}),"\r\nA: Start by researching the fundamental concepts, and use other existing MCP servers. We recommend starting with ",(0,a.jsx)(n.a,{href:"/",children:"Goose"})," to integrate an existing MCP server. We have a growing ",(0,a.jsx)(n.a,{href:"/docs/category/mcp-servers",children:"listof tutorials"})," to help you find some technologies like GitHub, PostgreSQL, Google Maps, and more. Once you feel comfortable with using MCP, you can start building your own MCP server for your own APIs."]}),"\n",(0,a.jsxs)(n.p,{children:["Q: ",(0,a.jsx)(n.strong,{children:"What about AI and MCP security?"}),(0,a.jsx)("br",{}),"\r\nA: AI agents can enhance security through better context awareness in interactions, but MCP is still relatively new, and requires ",(0,a.jsx)(n.a,{href:"/blog/2025/03/26/mcp-security/",children:"careful security evaluations"}),". Your business and dev teams should thoroughly investigate MCP's capabilities to ensure you're building appropriate access control, and managing data privacy."]}),"\n",(0,a.jsxs)(n.p,{children:["Q: ",(0,a.jsx)(n.strong,{children:"How long would a full migration typically take?"}),(0,a.jsx)("br",{}),"\r\nA: It's too dynamic to give one solid answer. Integration and migrations can vary a lot, depending on the scope of your existing API usage and existing integrations. Start small, build some pilot projects to try it out, and these might only take a few days or weeks."]}),"\n",(0,a.jsxs)(n.p,{children:["Q: ",(0,a.jsx)(n.strong,{children:"What are some potential problems devs might encounter on this AI/MCP journey?"}),(0,a.jsx)("br",{}),"\r\nA: There's a learning curve associated with any technology. This can be compounded when you consider that MCP is still relatively new and evolving. The greater community needs strategies around testing and debugging MCP, as well as considering security and data privacy. This means that what you learn today will need to be re-evaluated even a few short months from now."]}),"\n",(0,a.jsxs)(n.p,{children:["Q: ",(0,a.jsx)(n.strong,{children:"How mature and production-ready is MCP for enterprise-level AI integration?"}),(0,a.jsx)("br",{}),"\r\nA: Your approach on this may vary depending on whether you're building your own MCP server, or whether you're using third-party MCP servers in your integration. Developers should evaluate all of the benefits of MCP and consider the work being done around security and data privacy. Focus on a small pilot project or non-critical system initially to assess its suitability for your specific needs. Stay updated on ",(0,a.jsx)(n.a,{href:"https://modelcontextprotocol.io/development/roadmap",children:"MCP's development roadmap"})," and community feedback."]}),"\n",(0,a.jsxs)(i,{children:[(0,a.jsx)("meta",{property:"og:title",content:"MCP Is Rewriting the Rules of API Integration"}),(0,a.jsx)("meta",{property:"og:type",content:"article"}),(0,a.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration"}),(0,a.jsx)("meta",{property:"og:description",content:"A developer's guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations."}),(0,a.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png"}),(0,a.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,a.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,a.jsx)("meta",{name:"twitter:title",content:"MCP Is Rewriting the Rules of API Integration"}),(0,a.jsx)("meta",{name:"twitter:description",content:"A developer's guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations."}),(0,a.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png"})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},31579:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/cover-1e2153c66f3f0c92da7bbaafd240a9b4.png"},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(96540);const a={},s=i.createContext(a);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(s.Provider,{value:n},e.children)}},10691:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/22/mcp-is-rewriting-the-rules-of-api-integration","source":"@site/blog/2025-04-22-mcp-is-rewriting-the-rules-of-api-integration/index.md","title":"MCP Is Rewriting the Rules of API Integration","description":"A developer\'s guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations.","date":"2025-04-22T00:00:00.000Z","tags":[],"readingTime":9.69,"hasTruncateMarker":true,"authors":[{"name":"W Ian Douglas","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/ian"},"socials":{"linkedin":"https://www.linkedin.com/in/iandouglas736/","github":"https://github.com/iandouglas","bluesky":"https://bsky.app/profile/iandouglas736.com","x":"https://x.com/iandouglas736"},"imageURL":"https://avatars.githubusercontent.com/u/168030?v=4","key":"ian"}],"frontMatter":{"title":"MCP Is Rewriting the Rules of API Integration","description":"A developer\'s guide to modernizing API infrastructure with AI agents and Model Context Protocol. Learn about the benefits, integration strategies, and how to address security considerations.","authors":["ian"]},"unlisted":false,"prevItem":{"title":"How One Contribution Can Spark Many Wins","permalink":"/goose/blog/2025/04/22/community-bestcodes"},"nextItem":{"title":"MCP in the Enterprise: Real World Adoption at Block","permalink":"/goose/blog/2025/04/21/mcp-in-enterprise"}}')}}]); \ No newline at end of file diff --git a/assets/js/577.367a2044.js b/assets/js/577.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/577.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5815.367a2044.js b/assets/js/5815.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/5815.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5821.367a2044.js b/assets/js/5821.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/5821.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/583.367a2044.js b/assets/js/583.367a2044.js new file mode 100644 index 00000000..ede06870 --- /dev/null +++ b/assets/js/583.367a2044.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202],{52362:(e,n,t)=>{t.d(n,{A:()=>q});var r=t(96540),a=t(74848);function i(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=r.Children.toArray(e),t=n.find((e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),i=n.filter((e=>e!==t)),o=t?.props.children;return{mdxAdmonitionTitle:o,rest:i.length>0?(0,a.jsx)(a.Fragment,{children:i}):null}}(e.children),i=e.title??n;return{...e,...i&&{title:i},children:t}}var o=t(34164),l=t(50539),s=t(204);const c="admonition_xJq3",u="admonitionHeading_Gvgb",d="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:r}=e;return(0,a.jsx)("div",{className:(0,o.A)(s.G.common.admonition,s.G.common.admonitionType(n),c,t),children:r})}function f(e){let{icon:n,title:t}=e;return(0,a.jsxs)("div",{className:u,children:[(0,a.jsx)("span",{className:d,children:n}),t]})}function p(e){let{children:n}=e;return n?(0,a.jsx)("div",{className:h,children:n}):null}function v(e){const{type:n,icon:t,title:r,children:i,className:o}=e;return(0,a.jsxs)(m,{type:n,className:o,children:[r||t?(0,a.jsx)(f,{title:r,icon:t}):null,(0,a.jsx)(p,{children:i})]})}function b(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,a.jsx)(b,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(v,{...x,...e,className:(0,o.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,a.jsx)(j,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,a.jsx)(v,{...y,...e,className:(0,o.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function T(e){return(0,a.jsx)(v,{...N,...e,className:(0,o.A)("alert alert--info",e.className),children:e.children})}function V(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const I={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const k={icon:(0,a.jsx)(C,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const z={icon:(0,a.jsx)(V,{}),title:(0,a.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:g,tip:w,info:T,warning:function(e){return(0,a.jsx)(v,{...I,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(v,{...k,...e,className:(0,o.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(T,{title:"important",...e}),success:e=>(0,a.jsx)(w,{title:"success",...e}),caution:function(e){return(0,a.jsx)(v,{...z,...e,className:(0,o.A)("alert alert--warning",e.className),children:e.children})}}};function q(e){const n=i(e),t=(r=n.type,E[r]||(console.warn(`No admonition component found for admonition type "${r}". Using Info as fallback.`),E.info));var r;return(0,a.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var r=t(34164);const a={tabItem:"tabItem_Ymn6"};var i=t(74848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,o),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(96540),a=t(34164),i=t(65627),o=t(56347),l=t(50372),s=t(30604),c=t(11861),u=t(78749);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const a=(0,o.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(i),(0,r.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(a.location.search);n.set(i,e),a.replace({...a.location,search:n.toString()})}),[i,a])]}function p(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[c,d]=f({queryString:t,groupId:a}),[p,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,u.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),b=(()=>{const e=c??p;return m({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{b&&s(b)}),[b]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),v(e)}),[d,v,i]),tabValues:i}}var v=t(9136);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function g(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),a=l[t].value;a!==r&&(c(n),o(a))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>{s.push(e)},onKeyDown:d,onClick:u,...i,className:(0,a.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(96540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/584a0f31.1129494b.js b/assets/js/584a0f31.1129494b.js new file mode 100644 index 00000000..0a2a78c0 --- /dev/null +++ b/assets/js/584a0f31.1129494b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3231],{61380:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>l});var n=o(89961),a=o(74848),s=o(28453);const i={title:"MCP Explained for Non-Developers",description:"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks.",authors:["tania"]},r=void 0,c={authorsImageUrls:[void 0]},l=[];function p(e){const t={img:"img",p:"p",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"blog cover",src:o(29180).A+"",width:"1206",height:"633"})}),"\n",(0,a.jsx)(t.p,{children:"MCP this, MCP that, what exactly is it, and can you use them if you're not a developer? \ud83e\udd14"})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},29180:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/mcp_nondevs-5ce7f39de923cab01de6e14e5dc06744.png"},28453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>r});var n=o(96540);const a={},s=n.createContext(a);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(s.Provider,{value:t},e.children)}},89961:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/01/mcp-nondevs","source":"@site/blog/2025-04-01-mcp-nondevs/index.md","title":"MCP Explained for Non-Developers","description":"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks.","date":"2025-04-01T00:00:00.000Z","tags":[],"readingTime":5.19,"hasTruncateMarker":true,"authors":[{"name":"Tania Chakraborty","title":"Senior Technical Community Manager","url":"https://taniachakraborty.com","page":{"permalink":"/goose/blog/authors/tania"},"socials":{"linkedin":"https://www.linkedin.com/in/taniachakraborty/","x":"https://x.com/taniashiba","github":"https://github.com/taniashiba","bluesky":"https://bsky.app/profile/taniachakraborty.com"},"imageURL":"https://avatars.githubusercontent.com/u/126204004?v=4","key":"tania"}],"frontMatter":{"title":"MCP Explained for Non-Developers","description":"Learn what Model Context Protocol (MCP) is and how anyone can use it to save time on tasks.","authors":["tania"]},"unlisted":false,"prevItem":{"title":"Top 5 MCP Servers I Use as a Developer with Goose","permalink":"/goose/blog/2025/04/01/top-5-mcp-servers"},"nextItem":{"title":"Community-Inspired Benchmarking: The Goose Vibe Check","permalink":"/goose/blog/2025/03/31/goose-benchmark"}}')}}]); \ No newline at end of file diff --git a/assets/js/592280f5.41783220.js b/assets/js/592280f5.41783220.js new file mode 100644 index 00000000..245f0843 --- /dev/null +++ b/assets/js/592280f5.41783220.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6786],{81422:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"guides/allowlist","title":"Goose Extension Allowlist","description":"Goose is an extensible framework that, by default, allows you to install any MCP server. However, you may want stricter controls on which MCP servers can be installed as extensions (e.g. in a corporate setting).","source":"@site/docs/guides/allowlist.md","sourceDirName":"guides","slug":"/guides/allowlist","permalink":"/goose/docs/guides/allowlist","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":19,"frontMatter":{"sidebar_position":19,"title":"Goose Extension Allowlist","sidebar_label":"Extension Allowlist"},"sidebar":"tutorialSidebar","previous":{"title":"Creating Plans","permalink":"/goose/docs/guides/creating-plans"},"next":{"title":"Environment Variables","permalink":"/goose/docs/guides/environment-variables"}}');var i=t(74848),l=t(28453);const o={sidebar_position:19,title:"Goose Extension Allowlist",sidebar_label:"Extension Allowlist"},a=void 0,r={},c=[{value:"How It Works",id:"how-it-works",level:2},{value:"Configuration",id:"configuration",level:2},{value:"1. Create and Deploy Allowlist",id:"1-create-and-deploy-allowlist",level:3},{value:"Example",id:"example",level:4},{value:"2. Set Environment Variable",id:"2-set-environment-variable",level:3},{value:"Best Practices",id:"best-practices",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Goose is an extensible framework that, by default, allows you to install any MCP server. However, you may want stricter controls on which MCP servers can be installed as extensions (e.g. in a corporate setting)."}),"\n",(0,i.jsxs)(n.p,{children:["This guide explains how you can create an ",(0,i.jsx)(n.strong,{children:"allowlist"})," of safe extensions that work with Goose Desktop and CLI. An allowlist lets administrators control which MCP servers can be installed as Goose extensions. When enabled, Goose will only install extensions that are on the list, and will block installation of any others."]}),"\n",(0,i.jsx)(n.h2,{id:"how-it-works",children:"How It Works"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"The allowlist is a YAML file that contains a list of allowed extension commands."}),"\n",(0,i.jsxs)(n.li,{children:["Goose fetches the allowlist from a URL specified by the ",(0,i.jsx)(n.code,{children:"GOOSE_ALLOWLIST"})," environment variable."]}),"\n",(0,i.jsx)(n.li,{children:"The allowlist is fetched when first needed and is cached. It is refetched on every restart of Goose."}),"\n",(0,i.jsx)(n.li,{children:"When a user attempts to install an extension, Goose checks the MCP server's installation command against the allowlist."}),"\n",(0,i.jsx)(n.li,{children:"If the command is not in the allowlist, the extension installation is rejected."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n.h3,{id:"1-create-and-deploy-allowlist",children:"1. Create and Deploy Allowlist"}),"\n",(0,i.jsx)(n.p,{children:"The allowlist must be a YAML file with the following structure:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"extensions:\n - id: extension-id-1\n command: command-name-1\n - id: extension-id-2\n command: command-name-2\n # ... more extensions\n"})}),"\n",(0,i.jsx)(n.h4,{id:"example",children:"Example"}),"\n",(0,i.jsx)(n.p,{children:"In this example, only the Slack, GitHub, and Jira extensions can be installed:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"extensions:\n - id: slack\n command: uvx mcp_slack\n - id: github\n command: uvx mcp_github\n - id: jira\n command: uvx mcp_jira\n"})}),"\n",(0,i.jsx)(n.p,{children:"After creating the allowlist, you must deploy it to a URL."}),"\n",(0,i.jsx)(n.h3,{id:"2-set-environment-variable",children:"2. Set Environment Variable"}),"\n",(0,i.jsxs)(n.p,{children:["Create an environment variable called ",(0,i.jsx)(n.code,{children:"GOOSE_ALLOWLIST"})," and set the value to the URL of your YAML file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"export GOOSE_ALLOWLIST=https://example.com/goose-allowlist.yaml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You can also add this export to your shell configuration file (On a Mac, it's your ",(0,i.jsx)(n.code,{children:"~/.bashrc"})," or ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," file)."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"If this environment variable is not set, no allowlist restrictions are applied. With no restrictions, all extensions can be installed."})}),"\n",(0,i.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,i.jsx)(n.p,{children:"To effectively use the allowlist with exact matching:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Specify commands"}),": Define the exact command string that you want to allow."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Include full paths"}),": If you want to allow a command only from a specific path, include the full path in the allowlist."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Audit regularly"}),": Review your allowlist frequently to ensure it only contains the commands you intend to allow."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Use HTTPS"}),": Use an HTTPS URL for your allowlist to prevent man-in-the-middle attacks."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Restrict edit access"}),": Ensure that only authorized users can edit the allowlist."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Validate entries"}),": Carefully review the allowlist to ensure only trusted commands are included."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Monitor installations"}),": Watch for rejected commands during extension installation, which might indicate attempted abuse."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsx)(n.p,{children:"If extensions are being rejected unexpectedly:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Check if the ",(0,i.jsx)(n.code,{children:"GOOSE_ALLOWLIST"})," environment variable is set correctly."]}),"\n",(0,i.jsx)(n.li,{children:"Verify that the allowlist file is accessible from the server."}),"\n",(0,i.jsx)(n.li,{children:"Ensure the allowlist file is properly formatted YAML."}),"\n",(0,i.jsxs)(n.li,{children:["Check ",(0,i.jsx)(n.a,{href:"/docs/guides/logs",children:"server logs"})," for any errors related to fetching or parsing the allowlist."]}),"\n",(0,i.jsx)(n.li,{children:"Verify that the command in the extension installations exactly matches what's in the allowlist."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(96540);const i={},l=s.createContext(i);function o(e){const n=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5bac4ade.1f23af53.js b/assets/js/5bac4ade.1f23af53.js new file mode 100644 index 00000000..dd965872 --- /dev/null +++ b/assets/js/5bac4ade.1f23af53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8498],{70563:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"goose-architecture/extensions-design","title":"Extensions Design","description":"This document describes the design and implementation of the Extensions framework in Goose, which enables AI agents to interact with different extensions through a unified tool-based interface.","source":"@site/docs/goose-architecture/extensions-design.md","sourceDirName":"goose-architecture","slug":"/goose-architecture/extensions-design","permalink":"/goose/docs/goose-architecture/extensions-design","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Goose Architecture","permalink":"/goose/docs/goose-architecture/"},"next":{"title":"Error Handling","permalink":"/goose/docs/goose-architecture/error-handling"}}');var i=t(74848),o=t(28453);const r={sidebar_position:2},l="Extensions Design",a={},c=[{value:"Core Concepts",id:"core-concepts",level:2},{value:"Extension",id:"extension",level:3},{value:"Tools",id:"tools",level:3},{value:"Architecture",id:"architecture",level:2},{value:"Component Overview",id:"component-overview",level:3},{value:"Error Handling",id:"error-handling",level:3},{value:"Best Practices",id:"best-practices",level:2},{value:"Tool Design",id:"tool-design",level:3},{value:"Extension Implementation",id:"extension-implementation",level:3},{value:"Example Implementation",id:"example-implementation",level:3},{value:"Testing",id:"testing",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"extensions-design",children:"Extensions Design"})}),"\n",(0,i.jsxs)(n.p,{children:["This document describes the design and implementation of the ",(0,i.jsx)(n.a,{href:"/docs/getting-started/using-extensions",children:"Extensions framework"})," in Goose, which enables AI agents to interact with different extensions through a unified tool-based interface."]}),"\n",(0,i.jsx)(n.h2,{id:"core-concepts",children:"Core Concepts"}),"\n",(0,i.jsx)(n.h3,{id:"extension",children:"Extension"}),"\n",(0,i.jsxs)(n.p,{children:["An Extension represents any component that can be operated by an AI agent. Extensions expose their capabilities through Tools and maintain their own state. The core interface is defined by the ",(0,i.jsx)(n.code,{children:"Extension"})," trait:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"#[async_trait]\npub trait Extension: Send + Sync {\n fn name(&self) -> &str;\n fn description(&self) -> &str;\n fn instructions(&self) -> &str;\n fn tools(&self) -> &[Tool];\n async fn status(&self) -> AnyhowResult>;\n async fn call_tool(&self, tool_name: &str, parameters: HashMap) -> ToolResult;\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"tools",children:"Tools"}),"\n",(0,i.jsx)(n.p,{children:"Tools are the primary way Extensions expose functionality to agents. Each tool has:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A name"}),"\n",(0,i.jsx)(n.li,{children:"A description"}),"\n",(0,i.jsx)(n.li,{children:"A set of parameters"}),"\n",(0,i.jsx)(n.li,{children:"An implementation that executes the tool's functionality"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["A tool must take a Value and return an ",(0,i.jsx)(n.code,{children:"AgentResult"})," (it must also be async). This\nis what makes it compatible with the tool calling framework from the agent."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"async fn echo(&self, params: Value) -> AgentResult\n"})}),"\n",(0,i.jsx)(n.h2,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(n.h3,{id:"component-overview",children:"Component Overview"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Extension Trait"}),": The core interface that all extensions must implement"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Error Handling"}),": Specialized error types for tool execution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Proc Macros"}),": Simplify tool definition and registration [",(0,i.jsx)(n.em,{children:"not yet implemented"}),"]"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"error-handling",children:"Error Handling"}),"\n",(0,i.jsx)(n.p,{children:"The system uses two main error types:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ToolError"}),": Specific errors related to tool execution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"anyhow::Error"}),": General purpose errors for extension status and other operations"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This split allows precise error handling for tool execution while maintaining flexibility for general extension operations."}),"\n",(0,i.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,i.jsx)(n.h3,{id:"tool-design",children:"Tool Design"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Clear Names"}),': Use clear, action-oriented names for tools (e.g., "create_user" not "user")']}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Descriptive Parameters"}),": Each parameter should have a clear description"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Error Handling"}),': Return specific errors when possible, the errors become "prompts"']}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"State Management"}),": Be explicit about state modifications"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"extension-implementation",children:"Extension Implementation"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"State Encapsulation"}),": Keep extension state private and controlled"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Error Propagation"}),": Use ",(0,i.jsx)(n.code,{children:"?"})," operator with ",(0,i.jsx)(n.code,{children:"ToolError"})," for tool execution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Status Clarity"}),": Provide clear, structured status information"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Documentation"}),": Document all tools and their effects"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"example-implementation",children:"Example Implementation"}),"\n",(0,i.jsx)(n.p,{children:"Here's a complete example of a simple extension:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'use goose_macros::tool;\n\nstruct FileSystem {\n registry: ToolRegistry,\n root_path: PathBuf,\n}\n\nimpl FileSystem {\n #[tool(\n name = "read_file",\n description = "Read contents of a file"\n )]\n async fn read_file(&self, path: String) -> ToolResult {\n let full_path = self.root_path.join(path);\n let content = tokio::fs::read_to_string(full_path)\n .await\n .map_err(|e| ToolError::ExecutionError(e.to_string()))?;\n \n Ok(json!({ "content": content }))\n }\n}\n\n#[async_trait]\nimpl Extension for FileSystem {\n // ... implement trait methods ...\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"testing",children:"Testing"}),"\n",(0,i.jsx)(n.p,{children:"Extensions should be tested at multiple levels:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Unit tests for individual tools"}),"\n",(0,i.jsx)(n.li,{children:"Integration tests for extension behavior"}),"\n",(0,i.jsx)(n.li,{children:"Property tests for tool invariants"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Example test:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:'#[tokio::test]\nasync fn test_echo_tool() {\n let extension = TestExtension::new();\n let result = extension.call_tool(\n "echo",\n hashmap!{ "message" => json!("hello") }\n ).await;\n \n assert_eq!(result.unwrap(), json!({ "response": "hello" }));\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>l});var s=t(96540);const i={},o=s.createContext(i);function r(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5c59d9c5.09446cf9.js b/assets/js/5c59d9c5.09446cf9.js new file mode 100644 index 00000000..f4f5793a --- /dev/null +++ b/assets/js/5c59d9c5.09446cf9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3644],{74364:e=>{e.exports=JSON.parse('{"author":{"name":"Adewale Abati","title":"Staff Developer Advocate","url":"https://adewaleabati.com","page":{"permalink":"/goose/blog/authors/adewale"},"socials":{"x":"https://x.com/ace_kyd","github":"https://github.com/acekyd"},"imageURL":"https://avatars.githubusercontent.com/u/4003538?v=4","key":"adewale","count":4},"listMetadata":{"permalink":"/goose/blog/authors/adewale","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.ad4c57b6.js b/assets/js/5e95c892.ad4c57b6.js new file mode 100644 index 00000000..59106295 --- /dev/null +++ b/assets/js/5e95c892.ad4c57b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[9647],{18122:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(96540);var u=r(34164),a=r(81082),c=r(204),o=r(22831),n=r(43938),t=r(74848);function l(e){return(0,t.jsx)(a.e3,{className:(0,u.A)(c.G.wrapper.docsPages),children:(0,t.jsx)(n.A,{children:(0,o.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/6001602e.ca9f8f4e.js b/assets/js/6001602e.ca9f8f4e.js new file mode 100644 index 00000000..f39eda3c --- /dev/null +++ b/assets/js/6001602e.ca9f8f4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202,8705],{44786:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>d,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"mcp/memory-mcp","title":"Memory Extension","description":"Use Memory MCP Server as a Goose Extension","source":"@site/docs/mcp/memory-mcp.md","sourceDirName":"mcp","slug":"/mcp/memory-mcp","permalink":"/goose/docs/mcp/memory-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Memory Extension","description":"Use Memory MCP Server as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"mbot Extension","permalink":"/goose/docs/mcp/mbot-mcp"},"next":{"title":"Netlify Extension","permalink":"/goose/docs/mcp/netlify-mcp"}}');var r=t(74848),s=t(28453),i=t(65537),l=t(79329),a=t(25887);const d={title:"Memory Extension",description:"Use Memory MCP Server as a Goose Extension"},c=void 0,u={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Why Use Memory?",id:"why-use-memory",level:2},{value:"Trigger Words and When to Use Them",id:"trigger-words-and-when-to-use-them",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Step 1: Teach Goose Your API Standards",id:"step-1-teach-goose-your-api-standards",level:3},{value:"Goose Prompt #1",id:"goose-prompt-1",level:4},{value:"Goose Output",id:"goose-output",level:4},{value:"Step 2: Use Stored Knowledge to Create a New API Endpoint",id:"step-2-use-stored-knowledge-to-create-a-new-api-endpoint",level:3},{value:"Goose Prompt # 2",id:"goose-prompt--2",level:4},{value:"Goose Output",id:"goose-output-1",level:4}];function m(e){const n={admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.A,{videoUrl:"https://youtube.com/embed/BZ0yrSLXQwk"}),"\n",(0,r.jsx)(n.p,{children:"The Memory extension turns Goose into a knowledgeable assistant by allowing you to teach it personalized key information (e.g. commands, code snippets, preferences and configurations) that it can recall and apply later. Whether it\u2019s project-specific (local) or universal (global) knowledge, Goose learns and remembers what matters most to you."}),"\n",(0,r.jsx)(n.p,{children:"This tutorial covers enabling and using the Memory MCP Server, which is a built-in Goose extension."}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Ensure extension is enabled:"}),"\n"]}),"\n",(0,r.jsxs)(i.A,{groupId:"interface",children:[(0,r.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.code,{children:"..."})," in the upper right corner"]}),"\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.code,{children:"Advanced Settings"})]}),"\n",(0,r.jsxs)(n.li,{children:["Under ",(0,r.jsx)(n.code,{children:"Extensions"}),", toggle ",(0,r.jsx)(n.code,{children:"Memory"})," to on."]}),"\n",(0,r.jsxs)(n.li,{children:["Scroll to the top and click ",(0,r.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,r.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Run the ",(0,r.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["Choose to add a ",(0,r.jsx)(n.code,{children:"Built-in Extension"})]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c6 What type of extension would you like to add?\n// highlight-start \n\u2502 \u25cf Built-in Extension (Use an extension that comes with Goose)\n// highlight-end \n\u2502 \u25cb Command-line Extension \n\u2502 \u25cb Remote Extension (SSE) \n\u2502 \u25cb Remote Extension (Streaming HTTP) \n\u2514 \n"})}),(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsxs)(n.li,{children:["Arrow down to the ",(0,r.jsx)(n.code,{children:"Memory"})," extension and press Enter"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Built-in Extension \n\u2502\n\u25c6 Which built-in extension would you like to enable?\n\u2502 \u25cb Developer Tools \n\u2502 \u25cb Computer Controller \n// highlight-start\n\u2502 \u25cf Memory \n// highlight-end\n| \u25cb JetBrains\n\u2514 \n"})}),(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Built-in Extension \n\u2502\n\u25c7 Which built-in extension would you like to enable?\n\u2502 Memory \n\u2502\n// highlight-start\n\u25c6 Please set the timeout for this tool (in secs):\n\u2502 300\n// highlight-end\n\u2514 Enabled Memory extension\n"})}),(0,r.jsxs)(n.ol,{start:"5",children:["\n",(0,r.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension (Connect to a new extension) \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Built-in Extension \n\u2502\n\u25c7 Which built-in extension would you like to enable?\n\u2502 Memory \n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n// highlight-start\n\u25c6 Would you like to add a description?\n\u2502 No\n// highlight-end\n\u2514 Enabled Memory extension\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"why-use-memory",children:"Why Use Memory?"}),"\n",(0,r.jsx)(n.p,{children:"With the Memory extension, you\u2019re not just storing static notes, you\u2019re teaching Goose how to assist you better. Imagine telling Goose:"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.em,{children:"learn everything about MCP servers and save it to memory."})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Later, you can ask:"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.em,{children:"utilizing our MCP server knowledge help me build an MCP server."})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Goose will recall everything you\u2019ve saved as long as you instruct it to remember. This makes it easier to have consistent results when working with Goose."}),"\n",(0,r.jsx)(n.h2,{id:"trigger-words-and-when-to-use-them",children:"Trigger Words and When to Use Them"}),"\n",(0,r.jsx)(n.p,{children:"Goose also recognizes certain trigger words that signal when to store, retrieve, or remove memory."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:(0,r.jsx)(n.strong,{children:"Trigger Words"})}),(0,r.jsx)(n.th,{children:(0,r.jsx)(n.strong,{children:"When to Use"})})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"remember"}),(0,r.jsx)(n.td,{children:"Store useful info for later use"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"forget"}),(0,r.jsx)(n.td,{children:"Remove a stored memory"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"General memory-related actions"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"save"}),(0,r.jsx)(n.td,{children:"Save a command, config, or preference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"remove memory"}),(0,r.jsx)(n.td,{children:"Delete specific stored data"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"clear memory"}),(0,r.jsx)(n.td,{children:"Wipe all stored memories"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"search memory"}),(0,r.jsx)(n.td,{children:"Find previously stored data"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"find memory"}),(0,r.jsx)(n.td,{children:"Locate specific saved information"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,r.jsx)(n.p,{children:"In this example, I\u2019ll show you how to make Goose a knowledgeable development assistant by teaching it about your project\u2019s API standards. With the Memory extension, Goose can store structured information and recall it when needed, helping you stay consistent in your work."}),"\n",(0,r.jsx)(n.p,{children:"This means you no longer have to repeat yourself. Goose will remember your project\u2019s requirements and automatically apply them to new tasks."}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsx)(n.mdxAdmonitionTitle,{}),(0,r.jsx)(n.p,{children:"If you frequently work with API standards or other structured knowledge, Goose may automatically suggest saving them to memory for you when it detects a pattern in your workflow."})]}),"\n",(0,r.jsxs)(i.A,{groupId:"interface",children:[(0,r.jsx)(l.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Open a new session in Goose Desktop"}),"\n"]})}),(0,r.jsxs)(l.A,{value:"cli",label:"Goose CLI",children:[(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Open a terminal and start a new Goose session:"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"goose session\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"step-1-teach-goose-your-api-standards",children:"Step 1: Teach Goose Your API Standards"}),"\n",(0,r.jsx)(n.h4,{id:"goose-prompt-1",children:"Goose Prompt #1"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Goose, learn our API development standards:\n\n- All endpoints must use TypeScript interfaces\n- Error responses follow RFC 7807 Problem Details spec\n- Rate limiting headers are required\n- Authentication uses JWT in Authorization header\n- All endpoints need OpenAPI documentation\n\nRemember this so you can help me follow these practices.\n"})}),"\n",(0,r.jsx)(n.h4,{id:"goose-output",children:"Goose Output"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"I've learned your API standards. I'll help enforce these requirements when working on API endpoints.\n\nStoring in:\n - Category: development_standards\n - Tags: #api #typescript #security #documentation\n - Scope: global (these are general standards)\n\nI can now help with:\n - API endpoint implementation\n - Error handling patterns\n - Authentication flows\n - Documentation requirements\n"})}),"\n",(0,r.jsx)(n.h3,{id:"step-2-use-stored-knowledge-to-create-a-new-api-endpoint",children:"Step 2: Use Stored Knowledge to Create a New API Endpoint"}),"\n",(0,r.jsx)(n.h4,{id:"goose-prompt--2",children:"Goose Prompt # 2"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Help me create a new endpoint for user preferences\n"})}),"\n",(0,r.jsx)(n.h4,{id:"goose-output-1",children:"Goose Output"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"I see you need a new endpoint. Based on our API development standards that I have stored in memory, I'll ensure it meets all our requirements.\n\n[.. Checking stored API standards ...]\n\nI've included all our required elements:\n\n\u2705 TypeScript interfaces\n\u2705 RFC 7807 error response format\n\u2705 Rate limiting\n\u2705 JWT auth header\n\u2705 OpenAPI documentation\n\nHere's your compliant endpoint:\n\ninterface UserPreferences {\n userId: string;\n theme: 'light' | 'dark';\n notifications: boolean;\n timezone: string;\n}\n\ninterface ErrorResponse { \n type: string;\n title: string;\n status: number;\n detail: string;\n instance: string;\n}\n\n@Route('/api/users/:userId/preferences')\nclass UserPreferencesController {\n @Get()\n @RateLimit(100) // Adding required rate limiting\n @OpenAPI({ ... }) // Including mandatory OpenAPI docs\n async getUserPreferences(\n @Header('Authorization') token: string, // JWT auth as per our standard\n @Param('userId') userId: string\n ): Promise {\n // Implementation following our error handling pattern\n }\n}\n\nWould you like me to implement the full endpoint logic?\n"})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(m,{...e})}):m(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>M});var o=t(96540),r=t(74848);function s(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=o.Children.toArray(e),t=n.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),s=n.filter((e=>e!==t)),i=t?.props.children;return{mdxAdmonitionTitle:i,rest:s.length>0?(0,r.jsx)(r.Fragment,{children:s}):null}}(e.children),s=e.title??n;return{...e,...s&&{title:s},children:t}}var i=t(34164),l=t(50539),a=t(204);const d="admonition_xJq3",c="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:o}=e;return(0,r.jsx)("div",{className:(0,i.A)(a.G.common.admonition,a.G.common.admonitionType(n),d,t),children:o})}function p(e){let{icon:n,title:t}=e;return(0,r.jsxs)("div",{className:c,children:[(0,r.jsx)("span",{className:u,children:n}),t]})}function x(e){let{children:n}=e;return n?(0,r.jsx)("div",{className:h,children:n}):null}function g(e){const{type:n,icon:t,title:o,children:s,className:i}=e;return(0,r.jsxs)(m,{type:n,className:i,children:[o||t?(0,r.jsx)(p,{title:o,icon:t}):null,(0,r.jsx)(x,{children:s})]})}function f(e){return(0,r.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,r.jsx)(f,{}),title:(0,r.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function y(e){return(0,r.jsx)(g,{...j,...e,className:(0,i.A)("alert alert--secondary",e.className),children:e.children})}function v(e){return(0,r.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const b={icon:(0,r.jsx)(v,{}),title:(0,r.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,r.jsx)(g,{...b,...e,className:(0,i.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,r.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const k={icon:(0,r.jsx)(A,{}),title:(0,r.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function I(e){return(0,r.jsx)(g,{...k,...e,className:(0,i.A)("alert alert--info",e.className),children:e.children})}function E(e){return(0,r.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const C={icon:(0,r.jsx)(E,{}),title:(0,r.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function T(e){return(0,r.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const N={icon:(0,r.jsx)(T,{}),title:(0,r.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const P={icon:(0,r.jsx)(E,{}),title:(0,r.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const S={...{note:y,tip:w,info:I,warning:function(e){return(0,r.jsx)(g,{...C,...e,className:(0,i.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,r.jsx)(g,{...N,...e,className:(0,i.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,r.jsx)(y,{title:"secondary",...e}),important:e=>(0,r.jsx)(I,{title:"important",...e}),success:e=>(0,r.jsx)(w,{title:"success",...e}),caution:function(e){return(0,r.jsx)(g,{...P,...e,className:(0,i.A)("alert alert--warning",e.className),children:e.children})}}};function M(e){const n=s(e),t=(o=n.type,S[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),S.info));var o;return(0,r.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>i});t(96540);var o=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function i(e){let{children:n,hidden:t,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,i),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),r=t(34164),s=t(65627),i=t(56347),l=t(50372),a=t(30604),d=t(11861),c=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:r}}=e;return{value:n,label:t,attributes:o,default:r}}))}(t);return function(e){const n=(0,d.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const r=(0,i.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,a.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=h(e),[i,a]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:s}))),[d,u]=p({queryString:t,groupId:r}),[x,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,c.Dv)(t);return[r,(0,o.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:r}),f=(()=>{const e=d??x;return m({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{f&&a(f)}),[f]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=t(9136);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(74848);function y(e){let{className:n,block:t,selectedValue:o,selectValue:i,tabValues:l}=e;const a=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),c=e=>{const n=e.currentTarget,t=a.indexOf(n),r=l[t].value;r!==o&&(d(n),i(r))},u=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{a.push(e)},onKeyDown:u,onClick:c,...s,className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function v(e){let{lazy:n,children:t,selectedValue:s}=e;const i=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=i.find((e=>e.props.value===s));return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:i.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function b(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,r.A)("tabs-container",f.tabList),children:[(0,j.jsx)(y,{...n,...e}),(0,j.jsx)(v,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,j.jsx)(b,{...e,children:u(e.children)},String(n))}},25887:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var o=t(52362),r=t(74848);const s=e=>{let{videoUrl:n}=e;return(0,r.jsxs)("div",{children:[(0,r.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,r.jsxs)("details",{children:[(0,r.jsx)("summary",{children:"Watch the demo"}),(0,r.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,r.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,r.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(96540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/60e3f0a6.cd700bc9.js b/assets/js/60e3f0a6.cd700bc9.js new file mode 100644 index 00000000..095ebeb7 --- /dev/null +++ b/assets/js/60e3f0a6.cd700bc9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[3802],{95049:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"guides/recipes/storing-recipes","title":"Saving Recipes","description":"This guide covers storing, organizing, and finding Goose recipes when you need to access them again later.","source":"@site/docs/guides/recipes/storing-recipes.md","sourceDirName":"guides/recipes","slug":"/guides/recipes/storing-recipes","permalink":"/goose/docs/guides/recipes/storing-recipes","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Saving Recipes","sidebar_position":4,"sidebar_label":"Saving Recipes"},"sidebar":"tutorialSidebar","previous":{"title":"Sub-Recipes","permalink":"/goose/docs/guides/recipes/sub-recipes"},"next":{"title":"Managing Projects","permalink":"/goose/docs/guides/managing-projects"}}');var s=i(74848),t=i(28453),o=i(65537),c=i(79329);const l={title:"Saving Recipes",sidebar_position:4,sidebar_label:"Saving Recipes"},a=void 0,d={},u=[{value:"Understanding Recipe Storage",id:"understanding-recipe-storage",level:2},{value:"Recipe Storage Locations",id:"recipe-storage-locations",level:3},{value:"Storing Recipes",id:"storing-recipes",level:2},{value:"Finding Your Recipes",id:"finding-your-recipes",level:2},{value:"Using Saved Recipes",id:"using-saved-recipes",level:2}];function h(e){const r={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.p,{children:"This guide covers storing, organizing, and finding Goose recipes when you need to access them again later."}),"\n",(0,s.jsx)(r.admonition,{title:"Desktop UI vs CLI",type:"info",children:(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Goose Desktop"})," has a visual Recipe Library for browsing and managing saved recipes"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Goose CLI"})," stores recipes as files that you find using file paths or environment variables"]}),"\n"]})}),"\n",(0,s.jsx)(r.h2,{id:"understanding-recipe-storage",children:"Understanding Recipe Storage"}),"\n",(0,s.jsx)(r.p,{children:"Before saving recipes, it's important to understand where they can be stored and how this affects their availability."}),"\n",(0,s.jsx)(r.h3,{id:"recipe-storage-locations",children:"Recipe Storage Locations"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Location"}),(0,s.jsx)(r.th,{children:"Availability"}),(0,s.jsx)(r.th,{children:"Best For"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Global"})}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"~/.config/goose/recipes/"})}),(0,s.jsx)(r.td,{children:"All projects and sessions"}),(0,s.jsx)(r.td,{children:"Personal workflows, general-purpose recipes"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.strong,{children:"Local"})}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"YOUR_WORKING_DIRECTORY/.goose/recipes/"})}),(0,s.jsx)(r.td,{children:"Only when working in that project"}),(0,s.jsx)(r.td,{children:"Project-specific workflows, team recipes"})]})]})]}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.strong,{children:"Choose Global Storage When:"})}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"You want the recipe available across all projects"}),"\n",(0,s.jsx)(r.li,{children:"It's a personal workflow or general-purpose recipe"}),"\n",(0,s.jsx)(r.li,{children:"You're the primary user of the recipe"}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.strong,{children:"Choose Local Storage When:"})}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"The recipe is specific to a particular project"}),"\n",(0,s.jsx)(r.li,{children:"You're working with a team and want to share the recipe"}),"\n",(0,s.jsx)(r.li,{children:"The recipe depends on project-specific files or configurations"}),"\n"]}),"\n",(0,s.jsx)(r.h2,{id:"storing-recipes",children:"Storing Recipes"}),"\n",(0,s.jsxs)(o.A,{groupId:"interface",children:[(0,s.jsxs)(c.A,{value:"desktop",label:"Goose Desktop",default:!0,children:[(0,s.jsx)(r.p,{children:(0,s.jsx)(r.strong,{children:"Save New Recipe:"})}),(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["To create a recipe from your chat session, see: ",(0,s.jsx)(r.a,{href:"/docs/guides/recipes/session-recipes#create-recipe",children:"Create Recipe"})]}),"\n",(0,s.jsxs)(r.li,{children:["Once in the Recipe Editor, click ",(0,s.jsx)(r.strong,{children:"Save Recipe"})," to save it to your Recipe Library"]}),"\n"]}),(0,s.jsx)(r.p,{children:(0,s.jsx)(r.strong,{children:"Save Modified Recipe:"})}),(0,s.jsx)(r.p,{children:"If you're already using a recipe and want to save a modified version:"}),(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsx)(r.li,{children:"Click the gear icon \u2699\ufe0f in the top right corner"}),"\n",(0,s.jsxs)(r.li,{children:["Click ",(0,s.jsx)(r.strong,{children:"Save recipe"})]}),"\n",(0,s.jsx)(r.li,{children:"Enter a name for the recipe"}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.a,{href:"#recipe-storage-locations",children:"Choose to save globally or locally"})," to your current project"]}),"\n",(0,s.jsxs)(r.li,{children:["Click ",(0,s.jsx)(r.strong,{children:"Save Recipe"})]}),"\n"]})]}),(0,s.jsxs)(c.A,{value:"cli",label:"Goose CLI",children:[(0,s.jsxs)(r.p,{children:["When you ",(0,s.jsx)(r.a,{href:"/docs/guides/recipes/recipe-reference",children:"create a recipe"}),", it gets saved to:"]}),(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["Your working directory by default: ",(0,s.jsx)(r.code,{children:"./recipe.yaml"})]}),"\n",(0,s.jsxs)(r.li,{children:["Any path you specify: ",(0,s.jsx)(r.code,{children:"/recipe /path/to/my-recipe.yaml"})]}),"\n",(0,s.jsxs)(r.li,{children:["Local project recipes: ",(0,s.jsx)(r.code,{children:"/recipe .goose/recipes/my-recipe.yaml"})]}),"\n"]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"finding-your-recipes",children:"Finding Your Recipes"}),"\n",(0,s.jsxs)(o.A,{groupId:"interface",children:[(0,s.jsxs)(c.A,{value:"desktop",label:"Goose Desktop",default:!0,children:[(0,s.jsx)(r.p,{children:(0,s.jsx)(r.strong,{children:"Access Recipe Library:"})}),(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsx)(r.li,{children:"Click the gear icon \u2699\ufe0f in the top right corner"}),"\n",(0,s.jsxs)(r.li,{children:["Click ",(0,s.jsx)(r.strong,{children:"Recipe Library"})]}),"\n",(0,s.jsx)(r.li,{children:"Browse your saved recipes in a list view"}),"\n",(0,s.jsx)(r.li,{children:"Each recipe shows its title, description, and whether it's global or local"}),"\n"]})]}),(0,s.jsxs)(c.A,{value:"cli",label:"Goose CLI",children:[(0,s.jsx)(r.p,{children:"To find and configure your saved recipes:"}),(0,s.jsx)(r.p,{children:(0,s.jsx)(r.strong,{children:"Browse recipe directories:"})}),(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:'# List recipes in default global location\nls ~/.config/goose/recipes/\n\n# List recipes in current project\nls .goose/recipes/\n\n# Search for all recipe files\nfind . -name "*.md" -path "*/recipes/*"\n'})}),(0,s.jsx)(r.admonition,{type:"tip",children:(0,s.jsxs)(r.p,{children:["Set up ",(0,s.jsx)(r.a,{href:"/docs/guides/recipes/session-recipes#configure-recipe-location",children:"custom recipe paths"})," to organize recipes in specific directories or access recipes from a shared GitHub repository."]})})]})]}),"\n",(0,s.jsx)(r.h2,{id:"using-saved-recipes",children:"Using Saved Recipes"}),"\n",(0,s.jsxs)(o.A,{groupId:"interface",children:[(0,s.jsx)(c.A,{value:"desktop",label:"Goose Desktop",default:!0,children:(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsx)(r.li,{children:"Click the gear icon \u2699\ufe0f in the top right corner"}),"\n",(0,s.jsxs)(r.li,{children:["Click ",(0,s.jsx)(r.strong,{children:"Recipe Library"})]}),"\n",(0,s.jsx)(r.li,{children:"Find your recipe in the Recipe Library"}),"\n",(0,s.jsxs)(r.li,{children:["Choose one of the following:","\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["Click ",(0,s.jsx)(r.strong,{children:"Use Recipe"})," to run it immediately"]}),"\n",(0,s.jsxs)(r.li,{children:["Click ",(0,s.jsx)(r.strong,{children:"Preview"})," to see details first, then click ",(0,s.jsx)(r.strong,{children:"Load Recipe"})," to run it"]}),"\n"]}),"\n"]}),"\n"]})}),(0,s.jsx)(c.A,{value:"cli",label:"Goose CLI",children:(0,s.jsxs)(r.p,{children:["Once you've located your recipe file, ",(0,s.jsx)(r.a,{href:"/docs/guides/recipes/session-recipes#run-a-recipe",children:"run the recipe"}),"."]})})]})]})}function p(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},79329:(e,r,i)=>{i.d(r,{A:()=>o});i(96540);var n=i(34164);const s={tabItem:"tabItem_Ymn6"};var t=i(74848);function o(e){let{children:r,hidden:i,className:o}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,o),hidden:i,children:r})}},65537:(e,r,i)=>{i.d(r,{A:()=>w});var n=i(96540),s=i(34164),t=i(65627),o=i(56347),c=i(50372),l=i(30604),a=i(11861),d=i(78749);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:r}=e;return!!r&&"object"==typeof r&&"value"in r}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:r,children:i}=e;return(0,n.useMemo)((()=>{const e=r??function(e){return u(e).map((e=>{let{props:{value:r,label:i,attributes:n,default:s}}=e;return{value:r,label:i,attributes:n,default:s}}))}(i);return function(e){const r=(0,a.XI)(e,((e,r)=>e.value===r.value));if(r.length>0)throw new Error(`Docusaurus error: Duplicate values "${r.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[r,i])}function p(e){let{value:r,tabValues:i}=e;return i.some((e=>e.value===r))}function g(e){let{queryString:r=!1,groupId:i}=e;const s=(0,o.W6)(),t=function(e){let{queryString:r=!1,groupId:i}=e;if("string"==typeof r)return r;if(!1===r)return null;if(!0===r&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:r,groupId:i});return[(0,l.aZ)(t),(0,n.useCallback)((e=>{if(!t)return;const r=new URLSearchParams(s.location.search);r.set(t,e),s.replace({...s.location,search:r.toString()})}),[t,s])]}function j(e){const{defaultValue:r,queryString:i=!1,groupId:s}=e,t=h(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:r,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(r){if(!p({value:r,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${r}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return r}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:r,tabValues:t}))),[a,u]=g({queryString:i,groupId:s}),[j,x]=function(e){let{groupId:r}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(r),[s,t]=(0,d.Dv)(i);return[s,(0,n.useCallback)((e=>{i&&t.set(e)}),[i,t])]}({groupId:s}),f=(()=>{const e=a??j;return p({value:e,tabValues:t})?e:null})();(0,c.A)((()=>{f&&l(f)}),[f]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),x(e)}),[u,x,t]),tabValues:t}}var x=i(9136);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=i(74848);function v(e){let{className:r,block:i,selectedValue:n,selectValue:o,tabValues:c}=e;const l=[],{blockElementScrollPositionUntilNextRender:a}=(0,t.a_)(),d=e=>{const r=e.currentTarget,i=l.indexOf(r),s=c[i].value;s!==n&&(a(r),o(s))},u=e=>{let r=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;r=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;r=l[i]??l[l.length-1];break}}r?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},r),children:c.map((e=>{let{value:r,label:i,attributes:t}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===r?0:-1,"aria-selected":n===r,ref:e=>{l.push(e)},onKeyDown:u,onClick:d,...t,className:(0,s.A)("tabs__item",f.tabItem,t?.className,{"tabs__item--active":n===r}),children:i??r},r)}))})}function m(e){let{lazy:r,children:i,selectedValue:t}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(r){const e=o.find((e=>e.props.value===t));return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,r)=>(0,n.cloneElement)(e,{key:r,hidden:e.props.value!==t})))})}function y(e){const r=j(e);return(0,b.jsxs)("div",{className:(0,s.A)("tabs-container",f.tabList),children:[(0,b.jsx)(v,{...r,...e}),(0,b.jsx)(m,{...r,...e})]})}function w(e){const r=(0,x.A)();return(0,b.jsx)(y,{...e,children:u(e.children)},String(r))}},28453:(e,r,i)=>{i.d(r,{R:()=>o,x:()=>c});var n=i(96540);const s={},t=n.createContext(s);function o(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/62062511.1857d98f.js b/assets/js/62062511.1857d98f.js new file mode 100644 index 00000000..f98d758d --- /dev/null +++ b/assets/js/62062511.1857d98f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8148],{56118:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"guides/running-tasks","title":"Running Tasks","description":"When working with the Goose CLI, you can pass files and instructions to the goose run command to execute tasks and workflows. This could be a simple one-liner command or a complex set of instructions stored in a file.","source":"@site/docs/guides/running-tasks.md","sourceDirName":"guides","slug":"/guides/running-tasks","permalink":"/goose/docs/guides/running-tasks","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":13,"frontMatter":{"sidebar_position":13,"title":"Running Tasks","sidebar_label":"Run Tasks"},"sidebar":"tutorialSidebar","previous":{"title":"File Management","permalink":"/goose/docs/guides/file-management"},"next":{"title":"Using Gooseignore","permalink":"/goose/docs/guides/using-gooseignore"}}');var o=s(74848),t=s(28453);const a={sidebar_position:13,title:"Running Tasks",sidebar_label:"Run Tasks"},r=void 0,l={},c=[{value:"Basic Usage",id:"basic-usage",level:2},{value:"Text in the command",id:"text-in-the-command",level:3},{value:"Using an instruction file",id:"using-an-instruction-file",level:3},{value:"With stdin",id:"with-stdin",level:3},{value:"Simple echo pipe",id:"simple-echo-pipe",level:4},{value:"Multi-line instructions",id:"multi-line-instructions",level:4},{value:"Key Features",id:"key-features",level:2},{value:"Interactive Mode",id:"interactive-mode",level:3},{value:"Session Management",id:"session-management",level:3},{value:"Working with Extensions",id:"working-with-extensions",level:3},{value:"Debug Mode",id:"debug-mode",level:3},{value:"Common Use Cases",id:"common-use-cases",level:2},{value:"Running Script Files",id:"running-script-files",level:3},{value:"Quick Commands",id:"quick-commands",level:3},{value:"Development Workflows",id:"development-workflows",level:3},{value:"Combining Options",id:"combining-options",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["When working with the Goose CLI, you can pass files and instructions to the ",(0,o.jsx)(n.code,{children:"goose run"})," command to execute tasks and workflows. This could be a simple one-liner command or a complex set of instructions stored in a file."]}),"\n",(0,o.jsx)(n.h2,{id:"basic-usage",children:"Basic Usage"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"goose run"})," command starts a new session, begins executing using any arguments provided and exits the session automatically once the task is complete."]}),"\n",(0,o.jsxs)(n.p,{children:["There are multiple ways to run tasks with Goose; check out the ",(0,o.jsx)(n.a,{href:"/goose/docs/guides/goose-cli-commands#run-options",children:"list of options"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"text-in-the-command",children:"Text in the command"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'goose run -t "your instructions here"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Using the ",(0,o.jsx)(n.code,{children:"-t"})," flag, one is able to pass a text instruction directly to the command. This is great for quick, one-off commands where you do not need an interactive session with Goose. The instructions will be executed, and the session will end. An example usage could be using in a CI/CD pipeline or running alongside other scripts."]}),"\n",(0,o.jsx)(n.h3,{id:"using-an-instruction-file",children:"Using an instruction file"}),"\n",(0,o.jsxs)(n.p,{children:["If you have a complex set of instructions or a workflow that you want to automate, you can store them in a file and pass it to the ",(0,o.jsx)(n.code,{children:"goose run"})," command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"goose run -i instructions.md\n"})}),"\n",(0,o.jsx)(n.p,{children:"Here's an example of an instruction file that runs a security audit on project dependencies:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-md",children:"# Dependency Security Audit\n\n1. Analyze project dependencies:\n - Check package.json and requirements.txt files\n - List all dependencies with versions\n - Identify outdated packages\n\n2. Security check:\n - Run npm audit (for JavaScript packages)\n - Check for known vulnerabilities in Python packages\n - Identify dependencies with critical security issues\n\n3. Create an upgrade plan:\n - List packages requiring immediate updates\n - Note breaking changes in latest versions\n - Estimate impact of required updates\n\nSave findings in 'security_audit.md' with severity levels highlighted.\n"})}),"\n",(0,o.jsx)(n.h3,{id:"with-stdin",children:"With stdin"}),"\n",(0,o.jsxs)(n.p,{children:["You can also pass instructions to Goose using standard input via ",(0,o.jsx)(n.code,{children:"-i -"}),". This is useful when you want to pipe commands from another tool or script into Goose."]}),"\n",(0,o.jsx)(n.h4,{id:"simple-echo-pipe",children:"Simple echo pipe"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'echo "What is 2+2?" | goose run -i -\n'})}),"\n",(0,o.jsx)(n.h4,{id:"multi-line-instructions",children:"Multi-line instructions"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cat << EOF | goose run -i -\nPlease help me with these tasks:\n1. Calculate 15% of 85\n2. Convert 32\xb0C to Fahrenheit\nEOF\n"})}),"\n",(0,o.jsx)(n.h2,{id:"key-features",children:"Key Features"}),"\n",(0,o.jsx)(n.h3,{id:"interactive-mode",children:"Interactive Mode"}),"\n",(0,o.jsxs)(n.p,{children:["If you don't want Goose to exit at the end of the task, you can pass the ",(0,o.jsx)(n.code,{children:"-s"})," or ",(0,o.jsx)(n.code,{children:"--interactive"})," flag to start an interactive session after processing your initial commands:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"goose run -i instructions.txt -s\n"})}),"\n",(0,o.jsx)(n.p,{children:"This is useful when you want to continue working with Goose after your initial commands are processed."}),"\n",(0,o.jsx)(n.h3,{id:"session-management",children:"Session Management"}),"\n",(0,o.jsx)(n.p,{children:"You can name and manage your sessions:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'# Start a new named session\ngoose run -n my-project -t "initial instructions"\n\n# Resume a previous session\ngoose run -n my-project -r\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can also run commands without creating or storing a session file by using the ",(0,o.jsx)(n.code,{children:"--no-session"})," flag. This is useful for automated scripts, or one-off tasks where you don't need to maintain the conversation history or state. This flag routes the session output to a temporary null path (",(0,o.jsx)(n.code,{children:"/dev/null"})," on Unix or ",(0,o.jsx)(n.code,{children:"NUL"})," on Windows), and discards it when complete."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'# Run a command without creating a session file\ngoose run --no-session -t "your command here"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"working-with-extensions",children:"Working with Extensions"}),"\n",(0,o.jsxs)(n.p,{children:["If you want to ensure specific extensions are available when running your task, you can indicate this with arguments. This can be done using the ",(0,o.jsx)(n.code,{children:"--with-extension"}),", ",(0,o.jsx)(n.code,{children:"--with-remote-extension"}),", ",(0,o.jsx)(n.code,{children:"--with-streamable-http-extension"}),", or ",(0,o.jsx)(n.code,{children:"--with-builtin"})," flags:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Using built-in extensions e.g developer and computercontroller extensions"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'goose run --with-builtin "developer,computercontroller" -t "your instructions"\n'})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Using custom extensions"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'goose run --with-extension "ENV1=value1 custom-extension-args" -t "your instructions"\n'})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Using remote SSE extensions"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'goose run --with-remote-extension "url" -t "your instructions"\n'})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Using streamable HTTP extensions"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'goose run --with-streamable-http-extension "https://example.com/streamable" -t "your instructions"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"debug-mode",children:"Debug Mode"}),"\n",(0,o.jsxs)(n.p,{children:["When troubleshooting or developing complex workflows, you can enable debug mode to get more detailed information about tool execution. The ",(0,o.jsx)(n.code,{children:"--debug"})," flag provides:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Complete tool responses"}),"\n",(0,o.jsx)(n.li,{children:"Detailed parameter values"}),"\n",(0,o.jsx)(n.li,{children:"Full file paths"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Debug mode can be useful when:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Developing new automation scripts"}),"\n",(0,o.jsx)(n.li,{children:"Troubleshooting extension behavior"}),"\n",(0,o.jsx)(n.li,{children:"Verifying tool parameters and responses"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'# Run a task with debug output enabled\ngoose run --debug -t "your instructions"\n\n# Debug a recipe execution\ngoose run --debug --recipe recipe.yaml\n'})}),"\n",(0,o.jsx)(n.h2,{id:"common-use-cases",children:"Common Use Cases"}),"\n",(0,o.jsx)(n.h3,{id:"running-script-files",children:"Running Script Files"}),"\n",(0,o.jsxs)(n.p,{children:["Create an instruction file (e.g., ",(0,o.jsx)(n.code,{children:"build-script.txt"}),"):"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-text",children:"Check the current branch\nRun the test suite\nBuild the documentation\n"})}),"\n",(0,o.jsx)(n.p,{children:"Then run it:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"goose run -i build-script.txt\n"})}),"\n",(0,o.jsx)(n.h3,{id:"quick-commands",children:"Quick Commands"}),"\n",(0,o.jsx)(n.p,{children:"For one-off commands, use the text option:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'goose run -t "Create a CHANGELOG.md entry comparing current git branch with main"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"development-workflows",children:"Development Workflows"}),"\n",(0,o.jsx)(n.p,{children:"Start a session with specific extensions:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'goose run --with-builtin "developer,git" -n dev-session -s\n'})}),"\n",(0,o.jsx)(n.h3,{id:"combining-options",children:"Combining Options"}),"\n",(0,o.jsx)(n.p,{children:"You can combine multiple options to create powerful workflows:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'# Complex example combining multiple options\ngoose run \\\n --with-builtin "developer,git" \\\n --with-extension "API_KEY=xyz123 custom-tool" \\\n -n project-setup \\\n -t "Initialize project" \n'})}),"\n",(0,o.jsx)(n.p,{children:"This command:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Loads the developer and git built-in extensions"}),"\n",(0,o.jsx)(n.li,{children:"Adds a custom extension with an API key"}),"\n",(0,o.jsx)(n.li,{children:'Names the session "project-setup"'}),"\n",(0,o.jsx)(n.li,{children:'Starts with "Initialize project" instruction'}),"\n",(0,o.jsx)(n.li,{children:"Exits automatically after processing the command."}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>r});var i=s(96540);const o={},t=i.createContext(o);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/621db11d.75a0c7e1.js b/assets/js/621db11d.75a0c7e1.js new file mode 100644 index 00000000..0940ea7b --- /dev/null +++ b/assets/js/621db11d.75a0c7e1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1831],{30217:(t,e,s)=>{s.r(e),s.d(e,{default:()=>m});s(96540);var o=s(34164),r=s(81082),a=s(204),n=s(11926),u=s(60569),l=s(37220),i=s(9303),h=s(95921);const c={authorListItem:"authorListItem_n3yI"};var g=s(74848);function p(t){let{author:e}=t;return(0,g.jsx)("li",{className:c.authorListItem,children:(0,g.jsx)(h.A,{as:"h2",author:e,count:e.count})})}function d(t){let{authors:e}=t;return(0,g.jsx)("section",{className:(0,o.A)("margin-vert--lg",c.authorsListSection),children:(0,g.jsx)("ul",{children:e.map((t=>(0,g.jsx)(p,{author:t},t.key)))})})}function m(t){let{authors:e,sidebar:s}=t;const h=(0,n.uz)();return(0,g.jsxs)(r.e3,{className:(0,o.A)(a.G.wrapper.blogPages,a.G.page.blogAuthorsListPage),children:[(0,g.jsx)(r.be,{title:h}),(0,g.jsx)(l.A,{tag:"blog_authors_list"}),(0,g.jsxs)(u.A,{sidebar:s,children:[(0,g.jsx)(i.A,{as:"h1",children:h}),(0,g.jsx)(d,{authors:e})]})]})}},11926:(t,e,s)=>{s.d(e,{Y4:()=>h,np:()=>i,uz:()=>l,wI:()=>u});s(96540);var o=s(50539),r=s(81430),a=s(74848);function n(){const{selectMessage:t}=(0,r.W)();return e=>t(e,(0,o.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:e}))}function u(t){const e=n();return(0,o.T)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:e(t.count),authorName:t.name||t.key})}const l=()=>(0,o.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function i(){return(0,a.jsx)(o.A,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}function h(){return(0,a.jsx)(o.A,{id:"theme.blog.author.noPosts",description:"The text for authors with 0 blog post",children:"This author has not written any posts yet."})}}}]); \ No newline at end of file diff --git a/assets/js/62e30df9.5e061250.js b/assets/js/62e30df9.5e061250.js new file mode 100644 index 00000000..52e44af7 --- /dev/null +++ b/assets/js/62e30df9.5e061250.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[2660],{82692:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var i=n(5666),o=n(74848),s=n(28453);const a={title:"A Recipe for Success: Cooking Up Repeatable Agentic Workflows",description:"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook.",authors:["rizel"]},r="A Recipe for Success: Cooking Up Repeatable Agentic Workflows",l={authorsImageUrls:[void 0]},c=[{value:"The Remy-Linguini Dynamic",id:"the-remy-linguini-dynamic",level:2},{value:"Traditional AI Agents",id:"traditional-ai-agents",level:2},{value:"Linguini's Evolution",id:"linguinis-evolution",level:2},{value:"Built Different",id:"built-different",level:2},{value:"Goose as an Orchestrator",id:"goose-as-an-orchestrator",level:2},{value:"Scaling Agentic Workflows with Recipes",id:"scaling-agentic-workflows-with-recipes",level:2},{value:"Reusable Agentic Workflows",id:"reusable-agentic-workflows",level:2},{value:"Onboarding a New Teammate",id:"onboarding-a-new-teammate",level:3},{value:"Hosting a Workshop",id:"hosting-a-workshop",level:3},{value:"Accelerating Your Team",id:"accelerating-your-team",level:3}];function h(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Details:i,Head:a}=t;return i||g("Details",!0),a||g("Head",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"blog cover",src:n(44007).A+"",width:"2240",height:"1260"})}),"\n",(0,o.jsxs)(t.p,{children:["Ratatouille isn't just a heartwarming (and slightly unhygienic) film about a rat chef. It's also analogous to a popular tech trend: AI agents and the ",(0,o.jsx)(t.a,{href:"https://modelcontextprotocol.io/",children:"Model Context Protocol (MCP)"}),"."]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"the-remy-linguini-dynamic",children:"The Remy-Linguini Dynamic"}),"\n",(0,o.jsx)(t.p,{children:"If you haven't seen the movie, here's the gist: Remy is an incredible chef with all the know-how, but he's a rat, so no kitchen access. Linguini is a kitchen worker with full access but little cooking skill. Together, they form a symbiotic relationship: Remy hides under Linguini's hat and guides him on what tools to use and when."}),"\n",(0,o.jsx)(t.p,{children:"If a customer orders fries, Linguini might freeze, but Remy scopes out the kitchen, sees what's available, and gives step-by-step instructions:"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.em,{children:'"Grab a knife and a cutting board. Now slice the potato."'})}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Then, Linguini executes the plan."}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"traditional-ai-agents",children:"Traditional AI Agents"}),"\n",(0,o.jsx)(t.p,{children:"Agentic systems work similarly. You have three core components:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"A Large Language Model (LLM)"}),"\n",(0,o.jsx)(t.li,{children:"An Agent"}),"\n",(0,o.jsx)(t.li,{children:"Tools"}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"The LLM is like Remy; it is full of knowledge and reasoning, but has no hands-on access. The agent is like Linguini; it can take action, but needs guidance."}),"\n",(0,o.jsx)(t.p,{children:'If a user says, "Write some unit tests," the LLM analyzes the code and replies,'}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.em,{children:'"Looks like JavaScript. Use Jest, create a test file, and import the module."'})}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["The agent follows the plan and uses tools like ",(0,o.jsx)(t.code,{children:"file.write()"})," to get it done."]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"linguinis-evolution",children:"Linguini's Evolution"}),"\n",(0,o.jsx)(t.p,{children:"But Linguini's story doesn't stop there. Even with Remy's guidance, he's still clumsy, unsure how to confidently move through the kitchen. His boss, Chef Skinner, notices something's off. To help him improve, Linguini is paired with Colette, a seasoned cook who shows him how the kitchen works:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Where tools live"}),"\n",(0,o.jsx)(t.li,{children:"How stations are organized"}),"\n",(0,o.jsx)(t.li,{children:"How to move efficiently through space"}),"\n",(0,o.jsx)(t.li,{children:"When to pivot if something's missing"}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"With Colette's guidance, Linguini understands the kitchen as a system. When a customer orders spaghetti, Remy quickly forms a plan:"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.em,{children:'"Boil the pasta, saut\xe9 the garlic and tomatoes, plate it with basil."'})}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Instead of mindlessly following orders, Linguini is equipped to orchestrate the entire operation by:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Heading to the pasta station to get water boiling"}),"\n",(0,o.jsx)(t.li,{children:"Checking the saut\xe9 station for clean pans and fresh garlic"}),"\n",(0,o.jsx)(t.li,{children:"Grabbing the right tools: colander, ladle, saut\xe9 pan"}),"\n",(0,o.jsx)(t.li,{children:"Finding spare pans or changing flow when needed"}),"\n",(0,o.jsx)(t.li,{children:"Managing ingredients and backup supplies"}),"\n",(0,o.jsx)(t.li,{children:"Coordinating timing so everything finishes in sync"}),"\n",(0,o.jsx)(t.li,{children:"Plating and delivering dishes confidently"}),"\n"]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"built-different",children:"Built Different"}),"\n",(0,o.jsx)(t.p,{children:"That's how it works with AI agents that follow the Model Context Protocol(MCP). MCP shifts the agent from passive executor to active orchestrator, making it less reliant on an LLM and more aware of the context in which it's operating."}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.a,{href:"/",children:"Goose"})," is a local, open source AI agent that follows the structure of MCP."]}),"\n",(0,o.jsx)(t.p,{children:"MCP provides a standardized way for agents to interact with external data and services. It has three core components:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"MCP Host"})," \u2013 the core agent that receives a plan and coordinates the task"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"MCP Client"})," \u2013 a local connector used by the host to talk to external services"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"MCP Servers"})," \u2013 a package of tools, data, or prompts in a structured format. In the Goose ecosystem, we refer to MCP servers as extensions."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"This architecture allows Goose to discover tools dynamically, understand how to use them, and orchestrate complex workflows across multiple systems."}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"goose-as-an-orchestrator",children:"Goose as an Orchestrator"}),"\n",(0,o.jsx)(t.p,{children:'When a user prompts Goose to "Gather all discussions about the authentication bug from last week," Goose orchestrates the operation. It coordinates tools, manages execution, and adapts on the fly by:'}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Identifying the right MCP servers: Slack, GitHub, PostgreSQL"}),"\n",(0,o.jsx)(t.li,{children:"Understanding when a tool isn't working as expected"}),"\n",(0,o.jsx)(t.li,{children:"Considering alternative approaches when needed"}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"When something breaks, Goose doesn't panic; it pivots. For example, Goose might determine:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"\"Slack search isn't returning last week's messages. Let me try a different date range.\""}),"\n",(0,o.jsx)(t.li,{children:'"If we still can\'t access those, the PR comments might have the key points."'}),"\n"]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"scaling-agentic-workflows-with-recipes",children:"Scaling Agentic Workflows with Recipes"}),"\n",(0,o.jsx)(t.p,{children:"It's been 18 years since the movie came out, and I'd like to imagine that Linguini has surpassed his cooking era and stepped into his mentor era. Instead of training every new cook inefficiently, he's documenting his favorite dishes to make his knowledge shareable and scalable."}),"\n",(0,o.jsxs)(t.p,{children:["Similarly, Goose is a forward-looking AI agent with a solution for scaling knowledge through ",(0,o.jsx)(t.a,{href:"/docs/guides/recipes/session-recipes",children:"recipes"}),". Recipes are complete orchestrations you can rerun, remix, or share, passing on knowledge to anyone who needs it."]}),"\n",(0,o.jsx)(t.p,{children:"Sharing a prompt doesn't always recreate the experience; AI is non-deterministic, and people may not have the same extensions or context configured. Recipes solve this by packaging your entire Goose workflow: the extensions, the setup, the goal, and example activities."}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"Let's try it:"}),"\nThe link below is a recipe that lets you choose your favorite platform (GitHub, Bluesky, or Dev.to) and builds a custom, story-driven 404 portfolio page using your public content."]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.a,{href:"goose://recipe?config=eyJ2ZXJzaW9uIjoiMS4wLjAiLCJ0aXRsZSI6IjQwNFBvcnRmb2xpbyIsImRlc2NyaXB0aW9uIjoiQ3JlYXRlIHBlcnNvbmFsaXplZCwgY3JlYXRpdmUgNDA0IHBhZ2VzIHVzaW5nIHB1YmxpYyBwcm9maWxlIGRhdGEiLCJpbnN0cnVjdGlvbnMiOiJDcmVhdGUgYW4gZW5nYWdpbmcgNDA0IGVycm9yIHBhZ2UgdGhhdCB0ZWxscyBhIGNyZWF0aXZlIHN0b3J5IHVzaW5nIGEgdXNlcidzIHJlY2VudCBwdWJsaWMgY29udGVudCBmcm9tICoqb25lKiogb2YgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6ICoqR2l0SHViKiosICoqRGV2LnRvKiosIG9yICoqQmx1ZXNreSoqLiBZb3UgZG8gbm90IG5lZWQgdG8gdXNlIGFsbCB0aHJlZeKAlGp1c3QgdGhlIG9uZSBzZWxlY3RlZCBieSB0aGUgdXNlci5cblxuVGhlIHBhZ2Ugc2hvdWxkIGJlIGZ1bGx5IGJ1aWx0IHdpdGggKipIVE1MLCBDU1MsIGFuZCBKYXZhU2NyaXB0KiosIGZlYXR1cmluZzpcblxuKiBSZXNwb25zaXZlIGRlc2lnblxuKiBQZXJzb25hbCBicmFuZGluZyBlbGVtZW50cyAoZS5nLiwgbmFtZSwgaGFuZGxlLCBhdmF0YXIpXG4qIE5hcnJhdGl2ZS1kcml2ZW4gbGF5b3V0IHRoYXQgdHVybnMgdGhlIGVycm9yIGludG8gYW4gb3Bwb3J0dW5pdHkgZm9yIGRpc2NvdmVyeVxuXG5Vc2UgcGxhdGZvcm0tc3BlY2lmaWMgbWV0aG9kcyB0byBmZXRjaCByZWNlbnQgdXNlciBjb250ZW50OlxuXG4qIEZvciAqKkRldi50byoqLCB1c2UgdGhlIFtwdWJsaWMgRGV2LnRvIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmZvcmVtLmNvbS9hcGkpIHRvIHJldHJpZXZlIHJlY2VudCBhcnRpY2xlcywgcmVhY3Rpb25zLCBhbmQgcHJvZmlsZSBpbmZvcm1hdGlvbi5cbiogRm9yICoqR2l0SHViKiosIHVzZSB0aGUgR2l0SHViIFJFU1Qgb3IgR3JhcGhRTCBBUEkgdG8gYWNjZXNzIHJlY2VudCByZXBvcywgY29tbWl0cywgYW5kIGNvbnRyaWJ1dGlvbnMuXG4qIEZvciAqKkJsdWVza3kqKiwgdXNlIHB1YmxpYyBmZWVkIGVuZHBvaW50cyBmcm9tIHRoZSBBcHBWaWV3IEFQSSAoZS5nLiwgYGFwcC5ic2t5LmZlZWQuZ2V0QXV0aG9yRmVlZGApIHRvIHB1bGwgcG9zdHMsIHJlcGxpZXMsIG9yIGxpa2VzLlxuXG5JbmNvcnBvcmF0ZSB0aGUgZmV0Y2hlZCBkYXRhIGludG8gYSBjb21wZWxsaW5nIG5hcnJhdGl2ZSAoZS5nLiwg4oCcTG9va3MgbGlrZSB0aGlzIHBhZ2UgaXMgbWlzc2luZywgYnV0IFxcW3VzZXJuYW1lXSBoYXMgYmVlbiBidXN5IeKAnSksIGFuZCBkaXNwbGF5IGl0IHVzaW5nIGVuZ2FnaW5nIHZpc3VhbHMgbGlrZSBjYXJkcywgdGltZWxpbmVzLCBvciBtZWRpYSBlbWJlZHMuXG5cbldyYXAgdGhlIHVzZXLigJlzIGFjdGl2aXR5IGludG8gYSBzdG9yeSDigJQgZm9yIGV4YW1wbGU6XG5cbuKAnFRoaXMgcGFnZSBtYXkgYmUgbG9zdCwgYnV0IEB1c2VybmFtZSBpcyBidWlsZGluZyBzb21ldGhpbmcgYW1hemluZy4gVGhlaXIgbGF0ZXN0IG9wZW4gc291cmNlIGpvdXJuZXkgaW52b2x2ZXMgYSBuZXcgcmVwbyB0aGF04oCZcyBnYWluaW5nIHN0YXJzIGZhc3TigKbigJ1cbuKAnFlvdSB3b27igJl0IGZpbmQgd2hhdCB5b3XigJlyZSBsb29raW5nIGZvciBoZXJlLCBidXQgeW91IHdpbGwgZmluZCBAdXNlcm5hbWXigJlzIGhvdCB0YWtlIG9uIGFzeW5jL2F3YWl0IGluIHRoZWlyIGxhdGVzdCBEZXYudG8gcG9zdC7igJ1cblxuVGhlIHJlc3VsdCBzaG91bGQgYmUgYSBzbWFsbCBuYXJyYXRpdmUtZHJpdmVuIG1pY3Jvc2l0ZSB0aGF0IGR5bmFtaWNhbGx5IGNlbGVicmF0ZXMgdGhlIHVzZXIncyBwcmVzZW5jZSBvbmxpbmXigJRldmVuIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGlzIG1pc3NpbmcuXG5cbkFzayB0aGUgdXNlcjpcblxuMS4gV2hpY2ggcGxhdGZvcm0gdG8gdXNlOiBHaXRIdWIsIERldi50bywgb3IgQmx1ZXNreVxuMi4gVGhlaXIgdXNlcm5hbWUgb24gdGhhdCBwbGF0Zm9ybVxuXG5UaGVuIGdlbmVyYXRlIHRoZSBjb21wbGV0ZSBjb2RlIGluIGEgZm9sZGVyIGNhbGxlZCA0MDQtc3RvcnkuXG4iLCJleHRlbnNpb25zIjpbXSwiYWN0aXZpdGllcyI6WyJCdWlsZCBlcnJvciBwYWdlIGZyb20gR2l0SHViIHJlcG9zIiwiR2VuZXJhdGUgZXJyb3IgcGFnZSBmcm9tIGRldi50byBibG9nIHBvc3RzIiwiQ3JlYXRlIGEgNDA0IHBhZ2UgZmVhdHVyaW5nIEJsdWVza3kgYmlvIl0sImF1dGhvciI6eyJjb250YWN0Ijoicml6ZWwifX0=",children:"Create a 404-style portfolio page with Goose"})}),"\n"]}),"\n",(0,o.jsx)(t.admonition,{type:"note",children:(0,o.jsxs)(t.p,{children:["The link above opens in the Goose Desktop app. If you don't have it installed yet, grab it ",(0,o.jsx)(t.a,{href:"/docs/getting-started/installation",children:"here"}),"."]})}),"\n",(0,o.jsxs)(i,{children:[(0,o.jsx)("summary",{children:"View recipe ingredients"}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'version: 1.0.0\ntitle: "404Portfolio"\ndescription: "Create personalized, creative 404 pages using public profile data"\n\ninstructions: |\n Create an engaging 404 error page that tells a creative story using a user\'s recent public content from **one** of the following platforms: **GitHub**, **Dev.to**, or **Bluesky**. You do not need to use all three\u2014just the one selected by the user.\n\n The page should be fully built with **HTML, CSS, and JavaScript**, featuring:\n\n * Responsive design\n * Personal branding elements (e.g., name, handle, avatar)\n * Narrative-driven layout that turns the error into an opportunity for discovery\n\n Use platform-specific methods to fetch recent user content:\n\n * For **Dev.to**, use the [public Dev.to API](https://developers.forem.com/api) to retrieve recent articles, reactions, and profile information.\n * For **GitHub**, use the GitHub REST or GraphQL API to access recent repos, commits, and contributions.\n * For **Bluesky**, use public feed endpoints from the AppView API (e.g., `app.bsky.feed.getAuthorFeed`) to pull posts, replies, or likes.\n\n Incorporate the fetched data into a compelling narrative (e.g., \u201cLooks like this page is missing, but \\[username] has been busy!\u201d), and display it using engaging visuals like cards, timelines, or media embeds.\n\n Wrap the user\u2019s activity into a story \u2014 for example:\n\n \u201cThis page may be lost, but @username is building something amazing. Their latest open source journey involves a new repo that\u2019s gaining stars fast\u2026\u201d\n \u201cYou won\u2019t find what you\u2019re looking for here, but you will find @username\u2019s hot take on async/await in their latest Dev.to post.\u201d\n\n The result should be a small narrative-driven microsite that dynamically celebrates the user\'s presence online\u2014even when the destination is missing.\n\n Ask the user:\n\n 1. Which platform to use: GitHub, Dev.to, or Bluesky\n 2. Their username on that platform\n\n Then generate the complete code in a folder called 404-story.\n\n\nactivities:\n - "Build error page from GitHub repos"\n - "Generate error page from dev.to blog posts"\n - "Create a 404 page featuring Bluesky bio"\n\nextensions:\n - type: builtin\n name: developer\n - type: builtin\n name: computercontroller\n'})})]}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.h2,{id:"reusable-agentic-workflows",children:"Reusable Agentic Workflows"}),"\n",(0,o.jsx)(t.p,{children:"Here are a few different scenarios where recipes come in handy:"}),"\n",(0,o.jsx)(t.h3,{id:"onboarding-a-new-teammate",children:"Onboarding a New Teammate"}),"\n",(0,o.jsxs)(t.p,{children:["Typically, when a developer joins a team, they spend hours setting up their environment, figuring out which platforms to use, and decoding the unspoken rules of how things get done.",(0,o.jsx)(t.br,{}),"\n","Instead, hand them a recipe. With preloaded context and the right tools, it can automate local setup, surface relevant docs, and walk them through your team's workflows, without a single screen share."]}),"\n",(0,o.jsx)(t.h3,{id:"hosting-a-workshop",children:"Hosting a Workshop"}),"\n",(0,o.jsxs)(t.p,{children:["Workshops are always a gamble: different machines, setups, and distractions.",(0,o.jsx)(t.br,{}),"\n","Skip the chaos. Drop a Recipe link and let every attendee spin up the same environment, same tools, same goals, and same examples. You get more time to teach and spend less time troubleshooting."]}),"\n",(0,o.jsx)(t.h3,{id:"accelerating-your-team",children:"Accelerating Your Team"}),"\n",(0,o.jsx)(t.p,{children:"Your team is full of problem solvers. One teammate built a slick internal dashboard. Another nailed support ticket triage. Someone else automated changelog generation. Then there's the question: how do we make it easy for the entire team to use? Recipes turn your team's creations into reusable workflows that anyone can pick up. Build a shared library of Goose-powered processes and multiply your team's impact."}),"\n",(0,o.jsxs)(t.p,{children:["Grab ",(0,o.jsx)(t.a,{href:"/docs/getting-started/installation",children:"Goose"})," and start cooking up some ",(0,o.jsx)(t.a,{href:"/docs/guides/recipes/session-recipes",children:"recipes"})," of your own. Your future self (and team) will thank you!"]}),"\n",(0,o.jsxs)(a,{children:[(0,o.jsx)("meta",{property:"og:title",content:"A Recipe for Success: Cooking Up Repeatable Agentic Workflows"}),(0,o.jsx)("meta",{property:"og:type",content:"article"}),(0,o.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/05/06/recipe-for-success"}),(0,o.jsx)("meta",{property:"og:description",content:"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook."}),(0,o.jsx)("meta",{property:"og:image",content:"https://block.github.io/goose/assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png"}),(0,o.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,o.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,o.jsx)("meta",{name:"twitter:title",content:"A Recipe for Success: Cooking Up Repeatable Agentic Workflows"}),(0,o.jsx)("meta",{name:"twitter:description",content:"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook."}),(0,o.jsx)("meta",{name:"twitter:image",content:"https://block.github.io/goose/assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png"})]})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}function g(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},44007:(e,t,n)=>{n.d(t,{A:()=>i});const i=n.p+"assets/images/cookingwithgoose-9114cf03cec76df4792fc58361ebe20b.png"},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>r});var i=n(96540);const o={},s=i.createContext(o);function a(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(s.Provider,{value:t},e.children)}},5666:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/05/06/recipe-for-success","source":"@site/blog/2025-05-06-recipe-for-success/index.md","title":"A Recipe for Success: Cooking Up Repeatable Agentic Workflows","description":"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook.","date":"2025-05-06T00:00:00.000Z","tags":[],"readingTime":7.555,"hasTruncateMarker":true,"authors":[{"name":"Rizel Scarlett","title":"Staff Developer Advocate","page":{"permalink":"/goose/blog/authors/rizel"},"socials":{"x":"https://x.com/blackgirlbytes","github":"https://github.com/blackgirlbytes","bluesky":"https://bsky.app/profile/blackgirlbytes.bsky.social","linkedin":"https://www.linkedin.com/in/rizel-bobb-semple/"},"imageURL":"https://avatars.githubusercontent.com/u/22990146?v=4","key":"rizel"}],"frontMatter":{"title":"A Recipe for Success: Cooking Up Repeatable Agentic Workflows","description":"A fresh look at AI agents, orchestration, and repeatability told through the metaphor of a rat who can cook.","authors":["rizel"]},"unlisted":false,"prevItem":{"title":"Championship Driven Development: Your Team\'s AI Playbook for Peak Performance","permalink":"/goose/blog/2025/05/09/developers-ai-playbook-for-team-efficiency"},"nextItem":{"title":"4 Things You Need to Know Before Using Goose","permalink":"/goose/blog/2025/04/23/things-need-to-know"}}')}}]); \ No newline at end of file diff --git a/assets/js/630ff3ed.9f0c891d.js b/assets/js/630ff3ed.9f0c891d.js new file mode 100644 index 00000000..633813ab --- /dev/null +++ b/assets/js/630ff3ed.9f0c891d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[378],{92776:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"getting-started/using-extensions","title":"Using Extensions","description":"Extensions are add-ons that provide a way to extend the functionality of Goose by connecting with applications and tools you already use in your workflow. These extensions can be used to add new features, access data and resources, or integrate with other systems.","source":"@site/docs/getting-started/using-extensions.md","sourceDirName":"getting-started","slug":"/getting-started/using-extensions","permalink":"/goose/docs/getting-started/using-extensions","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Using Extensions"},"sidebar":"tutorialSidebar","previous":{"title":"Configure LLM Provider","permalink":"/goose/docs/getting-started/providers"},"next":{"title":"Guides","permalink":"/goose/docs/category/guides"}}');var t=s(74848),i=s(28453),l=s(65537),r=s(79329);const a={sidebar_position:3,title:"Using Extensions"},d=void 0,c={},h=[{value:"Built-in Extensions",id:"built-in-extensions",level:2},{value:"Toggling Built-in Extensions",id:"toggling-built-in-extensions",level:4},{value:"Discovering Extensions",id:"discovering-extensions",level:2},{value:"Adding Extensions",id:"adding-extensions",level:2},{value:"MCP Servers",id:"mcp-servers",level:3},{value:"Example of adding the Knowledge Graph Memory MCP Server:",id:"example-of-adding-the-knowledge-graph-memory-mcp-server",level:4},{value:"Example of adding the Knowledge Graph Memory MCP Server:",id:"example-of-adding-the-knowledge-graph-memory-mcp-server-1",level:4},{value:"Deeplinks",id:"deeplinks",level:3},{value:"Config Entry",id:"config-entry",level:3},{value:"Enabling/Disabling Extensions",id:"enablingdisabling-extensions",level:2},{value:"Automatically Enabled Extensions",id:"automatically-enabled-extensions",level:2},{value:"Automatic Detection",id:"automatic-detection",level:3},{value:"Goose Prompt",id:"goose-prompt",level:4},{value:"Goose Output",id:"goose-output",level:4},{value:"Goose Prompt",id:"goose-prompt-1",level:4},{value:"Goose Output",id:"goose-output-1",level:4},{value:"Direct Request",id:"direct-request",level:3},{value:"Goose Prompt",id:"goose-prompt-2",level:4},{value:"Goose Output",id:"goose-output-2",level:4},{value:"Goose Prompt",id:"goose-prompt-3",level:4},{value:"Goose Output",id:"goose-output-3",level:4},{value:"Removing Extensions",id:"removing-extensions",level:2},{value:"Starting Session with Extensions",id:"starting-session-with-extensions",level:2},{value:"Built-in Extensions",id:"built-in-extensions-1",level:3},{value:"External Extensions",id:"external-extensions",level:3},{value:"Environment Variables",id:"environment-variables",level:4},{value:"Remote Extensions over SSE",id:"remote-extensions-over-sse",level:3},{value:"Remote Extensions over Streaming HTTP",id:"remote-extensions-over-streaming-http",level:3},{value:"Developing Extensions",id:"developing-extensions",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Extensions are add-ons that provide a way to extend the functionality of Goose by connecting with applications and tools you already use in your workflow. These extensions can be used to add new features, access data and resources, or integrate with other systems."}),"\n",(0,t.jsxs)(n.p,{children:["Extensions are based on the ",(0,t.jsx)(n.a,{href:"https://github.com/modelcontextprotocol",children:"Model Context Protocol (MCP)"}),", so you can connect\nGoose to a wide ecosystem of capabilities."]}),"\n",(0,t.jsx)(n.admonition,{title:"Tutorials",type:"tip",children:(0,t.jsxs)(n.p,{children:["Check out the ",(0,t.jsx)(n.a,{href:"/docs/category/mcp-servers",children:"step-by-step tutorials"})," for adding and using several Goose Extensions"]})}),"\n",(0,t.jsx)(n.h2,{id:"built-in-extensions",children:"Built-in Extensions"}),"\n",(0,t.jsxs)(n.p,{children:["Out of the box, Goose is installed with a few extensions but with only the ",(0,t.jsx)(n.code,{children:"Developer"})," extension enabled by default."]}),"\n",(0,t.jsx)(n.p,{children:"Here are the built-in extensions:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Developer"}),": provides a set of general development tools that are useful for software development."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Computer Controller"}),": provides general computer control tools for webscraping, file caching, and automations."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Memory"}),": teaches goose to remember your preferences as you use it"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"JetBrains"}),": provides an integration for working with JetBrains IDEs."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"toggling-built-in-extensions",children:"Toggling Built-in Extensions"}),"\n",(0,t.jsxs)(l.A,{groupId:"interface",children:[(0,t.jsx)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.code,{children:"..."})," in the top right corner of the Goose Desktop."]}),"\n",(0,t.jsxs)(n.li,{children:["Select ",(0,t.jsx)(n.code,{children:"Advanced Settings"})," from the menu."]}),"\n",(0,t.jsxs)(n.li,{children:["Under ",(0,t.jsx)(n.code,{children:"Extensions"}),", you can toggle the built-in extensions on or off."]}),"\n"]})}),(0,t.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,t.jsx)(n.p,{children:"If you know the exact name of the extension you'd like to add, run:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"goose mcp {name}\n"})}),(0,t.jsx)(n.p,{children:"To navigate through available extensions:"}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Run the following command:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Select ",(0,t.jsx)(n.code,{children:"Add Extension"})," from the menu."]}),"\n",(0,t.jsxs)(n.li,{children:["Choose the type of extension you'd like to add:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Built-In Extension"}),": Use an extension that comes pre-installed with Goose."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Command-Line Extension"}),": Add a local command or script to run as an extension."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Remote Extension (SSE)"}),": Connect to a remote system via SSE (Server-Sent Events)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Remote Extension (Streaming HTTP)"}),": Connect to a remote system via Streaming HTTP"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"Follow the prompts based on the type of extension you selected."}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Example: Adding Built-in Extension"})}),(0,t.jsx)(n.p,{children:"To select an option during configuration, hover over it and press Enter."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Built-in Extension \n\u2502\n\u25c6 Which built-in extension would you like to enable?\n\u2502 \u25cb Developer Tools \n\u2502 \u25cb Computer Controller (controls for webscraping, file caching, and automations)\n\u2502 \u25cb Google Drive \n\u2502 \u25cb Memory \n\u2502 \u25cf JetBrains \n\u2502 \n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502 \n\u2514 Enabled jetbrains extension \n"})})]})]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"All of Goose's built-in extensions are MCP servers in their own right. If you'd like\nto use the MCP servers included with Goose with any other agent, you are free to do so."})}),"\n",(0,t.jsx)(n.h2,{id:"discovering-extensions",children:"Discovering Extensions"}),"\n",(0,t.jsxs)(n.p,{children:["Goose provides a ",(0,t.jsx)(n.a,{href:"https://block.github.io/goose/v1/extensions",children:"central directory"})," of extensions that you can install and use."]}),"\n",(0,t.jsxs)(n.p,{children:["You can also add any other ",(0,t.jsx)(n.a,{href:"#mcp-servers",children:"MCP Server"})," as a Goose extension, even if it's not listed in our directory."]}),"\n",(0,t.jsx)(n.h2,{id:"adding-extensions",children:"Adding Extensions"}),"\n",(0,t.jsxs)(n.p,{children:["Extensions can be installed directly via the ",(0,t.jsx)(n.a,{href:"https://block.github.io/goose/v1/extensions",children:"extensions directory"}),", CLI, or UI."]}),"\n",(0,t.jsx)(n.h3,{id:"mcp-servers",children:"MCP Servers"}),"\n",(0,t.jsx)(n.p,{children:"You can install any MCP server as a Goose extension."}),"\n",(0,t.jsx)(n.admonition,{title:"MCP Server Directory",type:"tip",children:(0,t.jsxs)(n.p,{children:["See available servers in the ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://www.pulsemcp.com/servers",children:"MCP Server Directory"})}),"."]})}),"\n",(0,t.jsxs)(l.A,{groupId:"interface",children:[(0,t.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.code,{children:"..."})," in the top right corner of the Goose Desktop."]}),"\n",(0,t.jsxs)(n.li,{children:["Select ",(0,t.jsx)(n.code,{children:"Advanced Settings"})," from the menu."]}),"\n",(0,t.jsxs)(n.li,{children:["Under ",(0,t.jsx)(n.code,{children:"Extensions"}),", click ",(0,t.jsx)(n.code,{children:"Add custom extension"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["On the ",(0,t.jsx)(n.code,{children:"Add custom extension"})," modal, enter the necessary details","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["If adding an environment variable, click ",(0,t.jsx)(n.code,{children:"Add"})," button to the right of the variable"]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsx)(n.code,{children:"Timeout"})," field lets you set how long Goose should wait for a tool call from this extension to complete"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.code,{children:"Add"})," button"]}),"\n"]}),(0,t.jsxs)(n.h4,{id:"example-of-adding-the-knowledge-graph-memory-mcp-server",children:["Example of adding the ",(0,t.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/servers/tree/main/src/memory",children:"Knowledge Graph Memory MCP Server"}),":"]}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Type"}),": ",(0,t.jsx)(n.code,{children:"Standard IO"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"ID"}),": ",(0,t.jsx)(n.code,{children:"kgm-mcp"})," (",(0,t.jsx)(n.em,{children:"set this to whatever you want"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Name"}),": ",(0,t.jsx)(n.code,{children:"Knowledge Graph Memory"})," (",(0,t.jsx)(n.em,{children:"set this to whatever you want"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Description"}),": ",(0,t.jsx)(n.code,{children:"maps and stores complex relationships between concepts"})," (",(0,t.jsx)(n.em,{children:"set this to whatever you want"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Command"}),": ",(0,t.jsx)(n.code,{children:"npx -y @modelcontextprotocol/server-memory"})]}),"\n"]})]}),(0,t.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Run the following command:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Select ",(0,t.jsx)(n.code,{children:"Add Extension"})," from the menu."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Choose the type of extension you'd like to add:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Built-In Extension"}),": Use an extension that comes pre-installed with Goose."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Command-Line Extension"}),": Add a local command or script to run as an extension."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Remote Extension (SSE)"}),": Connect to a remote system via SSE (Server-Sent Events)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"Remote Extension (Streaming HTTP)"}),": Connect to a remote system via Streaming HTTP"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Follow the prompts based on the type of extension you selected."}),"\n"]}),"\n"]}),(0,t.jsxs)(n.h4,{id:"example-of-adding-the-knowledge-graph-memory-mcp-server-1",children:["Example of adding the ",(0,t.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/servers/tree/main/src/memory",children:"Knowledge Graph Memory MCP Server"}),":"]}),(0,t.jsxs)(l.A,{groupId:"extensions",children:[(0,t.jsx)(r.A,{value:"node",label:"Node",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension \n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension \n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Knowledge Graph Memory\n\u2502\n\u25c7 What command should be run?\n\u2502 npx -y @modelcontextprotocol/server-memory\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n\u25c6 Would you like to add environment variables?\n\u2502 No \n\u2502\n\u2514 Added Knowledge Graph Memory extension\n"})})}),(0,t.jsx)(r.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension\n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Wikipedia Reader\n\u2502\n\u25c7 What command should be run?\n\u2502 uvx mcp-wiki\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n\u25c6 Would you like to add environment variables?\n\u2502 No\n\u2502\n\u2514 Added Wikipedia Reader extension\n"})})}),(0,t.jsxs)(r.A,{value:"java",label:"Java",children:[(0,t.jsx)(n.p,{children:"Note: Java and Kotlin extensions are only support on Linux and macOS"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\u250c goose-configure\n\u2502\n\u25c7 What would you like to configure?\n\u2502 Add Extension\n\u2502\n\u25c7 What type of extension would you like to add?\n\u2502 Command-line Extension\n\u2502\n\u25c7 What would you like to call this extension?\n\u2502 Spring Data Explorer\n\u2502\n\u25c7 What command should be run?\n\u2502 jbang -Dspring.profiles.active=dev org.example:spring-data-mcp:1.0.0\n\u2502\n\u25c7 Please set the timeout for this tool (in secs):\n\u2502 300\n\u2502\n\u25c6 Would you like to add environment variables?\n\u2502 Yes\n\u2502\n\u25c7 Environment variable name:\n\u2502 SPRING_DATASOURCE_URL\n\u2502\n\u25c7 Environment variable value:\n\u2502 jdbc:postgresql://localhost:5432/mydb\n\u2502\n\u25c7 Add another environment variable?\n\u2502 No\n\u2502\n\u2514 Added Spring Data Explorer extension\n"})})]})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"deeplinks",children:"Deeplinks"}),"\n",(0,t.jsx)(n.p,{children:"Extensions can be installed using Goose's deep link protocol. The URL format varies based on the extension type:"}),"\n",(0,t.jsxs)(l.A,{groupId:"interface",children:[(0,t.jsxs)(r.A,{value:"stdio",label:"StandardIO",default:!0,children:[(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"goose://extension?cmd=&arg=&id=&name=&description=\n"})}),(0,t.jsx)(n.p,{children:"Required parameters:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"cmd"}),": The base command to run, one of ",(0,t.jsx)(n.code,{children:"jbang"}),", ",(0,t.jsx)(n.code,{children:"npx"}),", ",(0,t.jsx)(n.code,{children:"uvx"}),", ",(0,t.jsx)(n.code,{children:"goosed"}),", or ",(0,t.jsx)(n.code,{children:"docker"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"arg"}),": (cmd only) Command arguments (can be repeated for multiple arguments: ",(0,t.jsx)(n.code,{children:"&arg=...&arg=..."}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"timeout"}),": Maximum time (in seconds) to wait for extension responses"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"id"}),": Unique identifier for the extension"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"name"}),": Display name for the extension"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"description"}),": Brief description of the extension's functionality"]}),"\n"]}),(0,t.jsxs)(n.p,{children:["A command like ",(0,t.jsx)(n.code,{children:"npx -y @modelcontextprotocol/server-github"})," would be represented as:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"goose://extension?cmd=npx&arg=-y&arg=%40modelcontextprotocol/server-github&timeout=&id=&name=&description=\n"})}),(0,t.jsxs)(n.p,{children:["Note that each parameter to the ",(0,t.jsx)(n.code,{children:"npx"})," command is passed as a separate ",(0,t.jsx)(n.code,{children:"arg"})," parameter in the deeplink."]})]}),(0,t.jsxs)(r.A,{value:"sse",label:"Server-Sent Events",children:[(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"goose://extension?url=&id=&name=&description=\n"})}),(0,t.jsx)(n.p,{children:"Parameters:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"url"}),": The URL of the remote SSE server"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"timeout"}),": Maximum time (in seconds) to wait for extension responses"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"id"}),": Unique identifier for the extension"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"name"}),": Display name for the extension"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"description"}),": Brief description of the extension's functionality"]}),"\n"]}),(0,t.jsxs)(n.p,{children:["For example, a deeplink for a URL like ",(0,t.jsx)(n.code,{children:"http://localhost:8080/sse"})," would look like this when URL-encoded:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"goose://extension?url=http%3A%2F%2Flocalhost%3A8080%2Fsse&timeout=&id=&name=&description=>\n"})})]}),(0,t.jsxs)(r.A,{value:"streamable_http",label:"Streaming HTTP",children:[(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"goose://extension?url=&type=streamable_http&id=&name=&description=\n"})}),(0,t.jsx)(n.p,{children:"Parameters:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"url"}),": The URL of the remote Streaming HTTP server"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"type"}),": Must be set to ",(0,t.jsx)(n.code,{children:"streamable_http"})," to specify the protocol type"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"timeout"}),": Maximum time (in seconds) to wait for extension responses"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"id"}),": Unique identifier for the extension"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"name"}),": Display name for the extension"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"description"}),": Brief description of the extension's functionality"]}),"\n"]}),(0,t.jsxs)(n.p,{children:["For example, a deeplink for a URL like ",(0,t.jsx)(n.code,{children:"https://example.com/streamable"})," would look like this when URL-encoded:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"goose://extension?url=https%3A%2F%2Fexample.com%2Fstreamable&type=streamable_http&timeout=&id=&name=&description=\n"})})]})]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["All parameters in the deeplink must be URL-encoded. For example, spaces should be replaced with ",(0,t.jsx)(n.code,{children:"%20"}),", and ",(0,t.jsx)(n.code,{children:"@"})," should be replaced with ",(0,t.jsx)(n.code,{children:"%40"}),"."]})}),"\n",(0,t.jsx)(n.h3,{id:"config-entry",children:"Config Entry"}),"\n",(0,t.jsxs)(n.p,{children:["For advanced users, you can also directly edit the config file (",(0,t.jsx)(n.code,{children:"~/.config/goose/config.yaml"}),") to add, remove, or update an extension:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'extensions:\n github:\n name: GitHub\n cmd: npx\n args: [-y @modelcontextprotocol/server-github]\n enabled: true\n envs: { "GITHUB_PERSONAL_ACCESS_TOKEN": "" }\n type: stdio\n timeout: 300\n'})}),"\n",(0,t.jsx)(n.h2,{id:"enablingdisabling-extensions",children:"Enabling/Disabling Extensions"}),"\n",(0,t.jsx)(n.p,{children:"You can enable or disable installed extensions based on your workflow needs."}),"\n",(0,t.jsxs)(l.A,{groupId:"interface",children:[(0,t.jsx)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Click the three dots in the top-right corner of the application."}),"\n",(0,t.jsxs)(n.li,{children:["Select ",(0,t.jsx)(n.code,{children:"Advanced Settings"})," from the menu, scroll down to the ",(0,t.jsx)(n.code,{children:"Extensions"})," section."]}),"\n",(0,t.jsx)(n.li,{children:"Use the toggle switch next to each extension to enable or disable it."}),"\n"]})}),(0,t.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Run the following command to open up Goose's configurations:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Select ",(0,t.jsx)(n.code,{children:"Toggle Extensions"})," from the menu."]}),"\n",(0,t.jsx)(n.li,{children:"A list of already installed extensions will populate."}),"\n",(0,t.jsxs)(n.li,{children:["Press the ",(0,t.jsx)(n.code,{children:"space bar"})," to toggle the extension. Solid means enabled."]}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Example:"})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Toggle Extensions \n\u2502\n\u25c6 enable extensions: (use "space" to toggle and "enter" to submit)\n\u2502 \u25fc developer \n\u2502 \u25fb fetch \n\u2514 \n'})})]})]}),"\n",(0,t.jsx)(n.h2,{id:"automatically-enabled-extensions",children:"Automatically Enabled Extensions"}),"\n",(0,t.jsx)(n.p,{children:"The Smart Extension Recommendation system in Goose automatically identifies and suggests relevant extensions based on your tasks and needs. This section explains how to use this feature effectively and understand its capabilities and limitations."}),"\n",(0,t.jsx)(n.p,{children:"When you request a task, Goose checks its enabled extensions and their tools to determine if it can fulfill the request. If not, it suggests or enables additional extensions as needed. You can also request specific extensions by name."}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsxs)(n.p,{children:["Any extensions enabled dynamically are only enabled for the current session. To keep extensions enabled between sessions, see ",(0,t.jsx)(n.a,{href:"#enablingdisabling-extensions",children:"Enabling/Disabling Extensions"}),"."]})}),"\n",(0,t.jsx)(n.h3,{id:"automatic-detection",children:"Automatic Detection"}),"\n",(0,t.jsx)(n.p,{children:"Goose automatically detects when an extension is needed based on your task requirements. Here's an example of how Goose identifies and enables a needed extension during a conversation:"}),"\n",(0,t.jsxs)(l.A,{groupId:"interface",children:[(0,t.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,t.jsx)(n.h4,{id:"goose-prompt",children:"Goose Prompt"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-plaintext",children:"Find all orders with pending status from our production database\n"})}),(0,t.jsx)(n.h4,{id:"goose-output",children:"Goose Output"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-plaintext",children:"I'll help you search for available extensions that might help us interact with PostgreSQL databases.\n\n\ud83d\udd0d Search Available Extensions\n\u2514\u2500 Output \u25bc\n\n I see there's a PostgreSQL extension available. Let me enable it so we can query your database.\n\n\ud83d\udd27 Manage Extensions\n\u2514\u2500 action enable\n extension_name postgresql\n\nThe extension 'postgresql' has been installed successfully\n\nGreat! Now I can help you query the database...\n"})})]}),(0,t.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,t.jsx)(n.h4,{id:"goose-prompt-1",children:"Goose Prompt"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-plaintext",children:"Find all orders with pending status from our production database\n"})}),(0,t.jsx)(n.h4,{id:"goose-output-1",children:"Goose Output"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:'I apologize, but I notice that I don\'t currently have access to your database. Let me search if there are any database-related extensions available.\n\u2500\u2500\u2500 search_available_extensions | platform \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nI see that there is a "postgresql" extension available. Let me enable it so I can help you query your database.\n\u2500\u2500\u2500 enable_extension | platform \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nextension_name: postgresql\n\n\n\u25a0 Goose would like to enable the following extension, do you approve?\n// highlight-start\n| \u25cf Yes, for this session \n// highlight-end\n| \u25cb No\n'})})]})]}),"\n",(0,t.jsx)(n.h3,{id:"direct-request",children:"Direct Request"}),"\n",(0,t.jsx)(n.p,{children:"Goose responds to explicit requests for extensions, allowing users to manually enable specific tools they need. Here's an example of how Goose handles a direct request to enable an extension:"}),"\n",(0,t.jsxs)(l.A,{groupId:"interface",children:[(0,t.jsxs)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:[(0,t.jsx)(n.h4,{id:"goose-prompt-2",children:"Goose Prompt"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-plaintext",children:"Use PostgreSQL extension\n"})}),(0,t.jsx)(n.h4,{id:"goose-output-2",children:"Goose Output"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-plaintext",children:"I'll help enable the PostgreSQL extension for you.\n\n\ud83d\udd27 Manage Extensions\n\u2514\u2500 action enable\n extension_name postgresql\n\nThe extension 'postgresql' has been installed successfully\n\nThe PostgreSQL extension is now ready to use. What would you like to do with it?\n"})})]}),(0,t.jsxs)(r.A,{value:"cli",label:"Goose CLI",children:[(0,t.jsx)(n.h4,{id:"goose-prompt-3",children:"Goose Prompt"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"Use the PostgreSQL extension\n"})}),(0,t.jsx)(n.h4,{id:"goose-output-3",children:"Goose Output"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"I'll help enable the PostgreSQL extension for you.\n\u2500\u2500\u2500 enable_extension | platform \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nextension_name: postgresql\n\n\n\u25a0 Goose would like to enable the following extension, do you approve?\n// highlight-start\n| \u25cf Yes, for this session \n// highlight-end\n| \u25cb No\n"})})]})]}),"\n",(0,t.jsx)(n.h2,{id:"removing-extensions",children:"Removing Extensions"}),"\n",(0,t.jsx)(n.p,{children:"You can remove installed extensions."}),"\n",(0,t.jsxs)(l.A,{groupId:"interface",children:[(0,t.jsx)(r.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.code,{children:"..."})," in the top right corner of the Goose Desktop."]}),"\n",(0,t.jsxs)(n.li,{children:["Select ",(0,t.jsx)(n.code,{children:"Advanced Settings"})," from the menu."]}),"\n",(0,t.jsxs)(n.li,{children:["Under ",(0,t.jsx)(n.code,{children:"Extensions"}),", find the extension you'd like to remove and click on the settings icon beside it."]}),"\n",(0,t.jsxs)(n.li,{children:["In the dialog that appears, click ",(0,t.jsx)(n.code,{children:"Remove Extension"}),"."]}),"\n"]})}),(0,t.jsxs)(r.A,{value:"cli",label:"Config file",children:[(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["To remove an extension, you must ",(0,t.jsx)(n.a,{href:"#enablingdisabling-extensions",children:"disable"})," it first."]})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Run the following command to open up Goose's configurations:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Select ",(0,t.jsx)(n.code,{children:"Remove"})," from the menu. Disabled extensions will be listed."]}),"\n",(0,t.jsx)(n.li,{children:"Arrow down to the extension you want to remove."}),"\n",(0,t.jsxs)(n.li,{children:["Press the ",(0,t.jsx)(n.code,{children:"space bar"})," to select the extension. Solid means selected."]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'\u250c goose-configure \n\u2502\n\u25c7 What would you like to configure?\n\u2502 Remove Extension \n\u2502\n\u25c6 Select extensions to remove (note: you can only remove disabled extensions - use "space" to toggle and "enter" to submit)\n\u2502 \u25fc fetch \n\u2514 \n'})}),(0,t.jsxs)(n.ol,{start:"5",children:["\n",(0,t.jsx)(n.li,{children:"Press Enter to save"}),"\n"]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"starting-session-with-extensions",children:"Starting Session with Extensions"}),"\n",(0,t.jsx)(n.p,{children:"You can start a tailored Goose session with specific extensions directly from the CLI."}),"\n",(0,t.jsx)(n.admonition,{title:"Notes",type:"info",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The extension will not be installed. It will only be enabled for the current session."}),"\n",(0,t.jsx)(n.li,{children:"There's no need to do this if you already have the extensions enabled."}),"\n"]})}),"\n",(0,t.jsx)(n.h3,{id:"built-in-extensions-1",children:"Built-in Extensions"}),"\n",(0,t.jsx)(n.p,{children:"To enable a built-in extension while starting a session, run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-builtin "{extension_id}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"For example, to enable the Developer and Computer Controller extensions and start a session, you'd run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-builtin "developer,computercontroller"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Or alternatively:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"goose session --with-builtin developer --with-builtin computercontroller\n"})}),"\n",(0,t.jsx)(n.h3,{id:"external-extensions",children:"External Extensions"}),"\n",(0,t.jsx)(n.p,{children:"To enable an extension while starting a session, run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-extension "{extension command}" --with-extension "{another extension command}"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["For example, to start a session with the ",(0,t.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/servers/tree/main/src/fetch",children:"Fetch extension"}),", you'd run:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-extension "uvx mcp-server-fetch"\n'})}),"\n",(0,t.jsx)(n.h4,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,t.jsx)(n.p,{children:"Some extensions require environment variables. You can include these in your command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-extension "VAR=value command arg1 arg2"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["For example, to start a session with the ",(0,t.jsx)(n.a,{href:"https://github.com/modelcontextprotocol/servers/tree/main/src/github",children:"GitHub extension"}),", you'd run:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-extension "GITHUB_PERSONAL_ACCESS_TOKEN= npx -y @modelcontextprotocol/server-github"\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Note that you'll need ",(0,t.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," installed on your system to run this command, as it uses ",(0,t.jsx)(n.code,{children:"npx"}),"."]})}),"\n",(0,t.jsx)(n.h3,{id:"remote-extensions-over-sse",children:"Remote Extensions over SSE"}),"\n",(0,t.jsx)(n.p,{children:"To enable a remote extension over SSE while starting a session, run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-remote-extension "{extension URL}" --with-remote-extension "{another extension URL}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"For example, to start a session with a remote extension over SSE running on localhost on port 8080, you'd run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-remote-extension "http://localhost:8080/sse"\n'})}),"\n",(0,t.jsx)(n.h3,{id:"remote-extensions-over-streaming-http",children:"Remote Extensions over Streaming HTTP"}),"\n",(0,t.jsx)(n.p,{children:"To enable a remote extension over Streaming HTTP while starting a session, run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-streamable-http-extension "{extension URL}" --with-streamable-http-extension "{another extension URL}"\n'})}),"\n",(0,t.jsx)(n.p,{children:"For example, to start a session with a Streaming HTTP extension, you'd run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'goose session --with-streamable-http-extension "https://example.com/streamable"\n'})}),"\n",(0,t.jsx)(n.h2,{id:"developing-extensions",children:"Developing Extensions"}),"\n",(0,t.jsxs)(n.p,{children:["Goose extensions are implemented with MCP, a standard protocol that allows AI models and agents to securely connect with local or remote resources. Learn how to build your own ",(0,t.jsx)(n.a,{href:"https://modelcontextprotocol.io/quickstart/server",children:"extension as an MCP server"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},79329:(e,n,s)=>{s.d(n,{A:()=>l});s(96540);var o=s(34164);const t={tabItem:"tabItem_Ymn6"};var i=s(74848);function l(e){let{children:n,hidden:s,className:l}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,o.A)(t.tabItem,l),hidden:s,children:n})}},65537:(e,n,s)=>{s.d(n,{A:()=>w});var o=s(96540),t=s(34164),i=s(65627),l=s(56347),r=s(50372),a=s(30604),d=s(11861),c=s(78749);function h(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:n,children:s}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:s,attributes:o,default:t}}=e;return{value:n,label:s,attributes:o,default:t}}))}(s);return function(e){const n=(0,d.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,s])}function u(e){let{value:n,tabValues:s}=e;return s.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:s}=e;const t=(0,l.W6)(),i=function(e){let{queryString:n=!1,groupId:s}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:n,groupId:s});return[(0,a.aZ)(i),(0,o.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(t.location.search);n.set(i,e),t.replace({...t.location,search:n.toString()})}),[i,t])]}function m(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,i=x(e),[l,a]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!u({value:n,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=s.find((e=>e.default))??s[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:i}))),[d,h]=p({queryString:s,groupId:t}),[m,g]=function(e){let{groupId:n}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(n),[t,i]=(0,c.Dv)(s);return[t,(0,o.useCallback)((e=>{s&&i.set(e)}),[s,i])]}({groupId:t}),j=(()=>{const e=d??m;return u({value:e,tabValues:i})?e:null})();(0,r.A)((()=>{j&&a(j)}),[j]);return{selectedValue:l,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);a(e),h(e),g(e)}),[h,g,i]),tabValues:i}}var g=s(9136);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=s(74848);function f(e){let{className:n,block:s,selectedValue:o,selectValue:l,tabValues:r}=e;const a=[],{blockElementScrollPositionUntilNextRender:d}=(0,i.a_)(),c=e=>{const n=e.currentTarget,s=a.indexOf(n),t=r[s].value;t!==o&&(d(n),l(t))},h=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=a.indexOf(e.currentTarget)+1;n=a[s]??a[0];break}case"ArrowLeft":{const s=a.indexOf(e.currentTarget)-1;n=a[s]??a[a.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},n),children:r.map((e=>{let{value:n,label:s,attributes:i}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{a.push(e)},onKeyDown:h,onClick:c,...i,className:(0,t.A)("tabs__item",j.tabItem,i?.className,{"tabs__item--active":o===n}),children:s??n},n)}))})}function b(e){let{lazy:n,children:s,selectedValue:i}=e;const l=(Array.isArray(s)?s:[s]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===i));return e?(0,o.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,t.A)("tabs-container",j.tabList),children:[(0,v.jsx)(f,{...n,...e}),(0,v.jsx)(b,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,v.jsx)(y,{...e,children:h(e.children)},String(n))}},28453:(e,n,s)=>{s.d(n,{R:()=>l,x:()=>r});var o=s(96540);const t={},i=o.createContext(t);function l(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/63c31eff.9f01ded4.js b/assets/js/63c31eff.9f01ded4.js new file mode 100644 index 00000000..cbf1541e --- /dev/null +++ b/assets/js/63c31eff.9f01ded4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1238],{5831:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>h,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>n,toc:()=>c});var n=o(94578),r=o(74848),s=o(28453);const i={title:"Top 5 MCP Servers I Use as a Developer with Goose",description:"These 5 MCP servers help me automate my workflow and make me a better developer.",date:new Date("2025-04-02T00:00:00.000Z"),authors:["adewale"]},a=void 0,h={authorsImageUrls:[void 0]},c=[{value:"GitHub MCP Server: Everything GitHub",id:"github-mcp-server-everything-github",level:2},{value:"Knowledge Graph Memory: Context on Steroids",id:"knowledge-graph-memory-context-on-steroids",level:2},{value:"Fetch Extension: The Web in our Hands",id:"fetch-extension-the-web-in-our-hands",level:2},{value:"Memory Extension: My Habits and Preferences",id:"memory-extension-my-habits-and-preferences",level:2},{value:"VS Code Extension: Your Favorite Editor, Connected",id:"vs-code-extension-your-favorite-editor-connected",level:2},{value:"The Power of Integration",id:"the-power-of-integration",level:2}];function l(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components},{Head:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"blog cover",src:o(73308).A+"",width:"2240",height:"1260"})}),"\n",(0,r.jsx)(t.p,{children:"As a developer, finding the right tools that seamlessly work together can feel like discovering a superpower. And when you have a working process, it can sometimes be difficult to try out new tools."}),"\n",(0,r.jsx)(t.p,{children:"With the introduction of MCPs, AI agents like Goose are able to plug in to my existing tools, and the only thing that changes with my workflow is that much welcomed automation that comes with it. I still do the same things I do, but backed by AI, I can now do them faster and with more confidence."}),"\n",(0,r.jsx)(t.p,{children:"Today, I'm excited to share not just my favorite MCP servers, but the ones I actually use almost everyday with real applications that you can probably relate to as well."}),"\n",(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsx)(t.p,{children:"You can ask Goose what you can do with an extension to get a list of all the features and example use cases you can try out."})}),"\n",(0,r.jsx)(t.h2,{id:"github-mcp-server-everything-github",children:"GitHub MCP Server: Everything GitHub"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.a,{href:"/docs/mcp/github-mcp",children:"GitHub MCP Server"})," comes with quite a lot of functionality. It can help you create issues, pull requests, repositories, and branches. My most frequent use case for the GitHub MCP is reviewing and understanding pull requests."]}),"\n",(0,r.jsx)(t.p,{children:"For cases when it's a large pull request, or I don't understand what is going on, I can pass the PR to Goose, giving it the right context to make me understand and then act on the pull request. I'm even able to create a documentation update or changelog update from the file changes in the PR. This is definitely one of my favorite things."}),"\n",(0,r.jsx)(t.p,{children:"E.g"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"Hey Goose, this pull request https://github.com/block/goose/pull/1949, has a lot of changes. Can you summarize into a changelog for me?\n"})}),"\n",(0,r.jsx)(t.h2,{id:"knowledge-graph-memory-context-on-steroids",children:"Knowledge Graph Memory: Context on Steroids"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.a,{href:"/docs/mcp/knowledge-graph-mcp",children:"Knowledge Graph Memory"})," extension is like giving Goose a photographic memory of your project or data. Like the name implies, it creates a graph of any information fed into it, connecting the dots between different pieces of information or as I like to use it for - documentation."]}),"\n",(0,r.jsx)(t.p,{children:"If I'm working on a specific project or library and I don't want any hallucinations, I am able to feed Goose with the right context and it will be able to answer questions about the project or library with the right context."}),"\n",(0,r.jsx)(t.p,{children:"This could be documentation of the project I'm currently working on, or even documentation of a library I'm using."}),"\n",(0,r.jsx)(t.p,{children:"E.g"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"I'm currently in a project called Goose, read through the documentation in `documentation/docs/` folder and store key information in the knowledge graph. Use it for reference anytime I ask you about Goose.\n"})}),"\n",(0,r.jsx)(t.h2,{id:"fetch-extension-the-web-in-our-hands",children:"Fetch Extension: The Web in our Hands"}),"\n",(0,r.jsxs)(t.p,{children:["I had a slightly hard time deciding between the ",(0,r.jsx)(t.a,{href:"/docs/mcp/tavily-mcp",children:"Tavily Web Search Extension"})," and The ",(0,r.jsx)(t.a,{href:"/docs/mcp/fetch-mcp",children:"Fetch Extension"})," because while I do use them both to access the web, the Fetch extension works more like default for me. With the example above using the Knowledge graph, I'm able to get information from the internet to give Goose additional context to work with."]}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsx)(t.p,{children:"The Tavily Web Search Extension has deep research capabilities and is great for finding specific information, while the Fetch Extension is more about general web access and data retrieval."})}),"\n",(0,r.jsx)(t.h2,{id:"memory-extension-my-habits-and-preferences",children:"Memory Extension: My Habits and Preferences"}),"\n",(0,r.jsxs)(t.p,{children:["I use the ",(0,r.jsx)(t.a,{href:"/docs/mcp/memory-mcp",children:"Memory Extension"})," to remind Goose about my general preferences as I work - to default to JavaScript or Node when trying out new prototypes, if I prefer one naming convention or the other - maybe even how I like my coffee ",":D","."]}),"\n",(0,r.jsx)(t.p,{children:"This works differently from the Knowledge Graph extension even though they both store information locally. When combined with the Knowledge Graph, it can also help maintain a clear trail of technical decisions and their rationale. For example I got stuck on a code migration and asked Goose to remember where we stopped, what we've tried so far, and what we want to do next for when I start a new session."}),"\n",(0,r.jsx)(t.h2,{id:"vs-code-extension-your-favorite-editor-connected",children:"VS Code Extension: Your Favorite Editor, Connected"}),"\n",(0,r.jsxs)(t.p,{children:["One of the biggest points in conversations with people especially around vibe coding, is finding ways to track what changes are being made. While version control is always recommended, sometimes I want to be able to stop or change direction before going too far. The ",(0,r.jsx)(t.a,{href:"/docs/mcp/vscode-mcp",children:"VS Code Extension"})," alongside other features, allows me to preview the diff of my code changes before I commit them."]}),"\n",(0,r.jsx)(t.p,{children:"I can choose to accept or refuse these changes, or tell Goose to try something else before any actual changes are made."}),"\n",(0,r.jsx)(t.h2,{id:"the-power-of-integration",children:"The Power of Integration"}),"\n",(0,r.jsx)(t.p,{children:"As mentioned at the beginning of this post, the best thing about these MCP servers is how they plug into my existing workflow. I am able to:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Start a new session on Goose which opens the current folder as a project in VS Code."}),"\n",(0,r.jsx)(t.li,{children:"Start work on any changes and get any context I need from either the Knowledge Graph or from the internet using the Fetch extension."}),"\n",(0,r.jsx)(t.li,{children:"Any attempts at making changes takes my preferences from the Memory extension into account."}),"\n",(0,r.jsx)(t.li,{children:"I can then review these changes right in VS Code and either accept or reject them."}),"\n",(0,r.jsx)(t.li,{children:"And complete the task by asking Goose to create a pull request for me."}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This is a simplified example of how I use these extensions together - I may not use all of them in every session, but having them available sure makes my workflow much smoother."}),"\n",(0,r.jsxs)(t.p,{children:["What are your favorite MCP servers? How do you use them together? Share your experiences with us on ",(0,r.jsx)(t.a,{href:"https://discord.gg/block-opensource",children:"Discord server"}),"!"]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("meta",{property:"og:title",content:"Top 5 MCP Servers I Use as a Developer with Goose Extensions"}),(0,r.jsx)("meta",{property:"og:type",content:"article"}),(0,r.jsx)("meta",{property:"og:url",content:"https://block.github.io/goose/blog/2025/04/01/top-5-mcp-servers"}),(0,r.jsx)("meta",{property:"og:description",content:"These 5 MCP servers help me automate my workflow and make me a better developer."}),(0,r.jsx)("meta",{property:"og:image",content:"http://block.github.io/goose/assets/images/mcp-servers-cover-6994acb4dec5a3b33d10ea61f7609e4b.png"}),(0,r.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,r.jsx)("meta",{property:"twitter:domain",content:"block.github.io/goose"}),(0,r.jsx)("meta",{name:"twitter:title",content:"Top 5 MCP Servers I Use as a Developer with Goose Extensions"}),(0,r.jsx)("meta",{name:"twitter:description",content:"These 5 MCP servers help me automate my workflow and make me a better developer."}),(0,r.jsx)("meta",{name:"twitter:image",content:"http://block.github.io/goose/assets/images/mcp-servers-cover-6994acb4dec5a3b33d10ea61f7609e4b.png"})]})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},73308:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/mcp-servers-cover-99742334f4c2581d18eb092cd0c737f9.png"},28453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>a});var n=o(96540);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}},94578:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/01/top-5-mcp-servers","source":"@site/blog/2025-04-01-top-5-mcp-servers/index.md","title":"Top 5 MCP Servers I Use as a Developer with Goose","description":"These 5 MCP servers help me automate my workflow and make me a better developer.","date":"2025-04-02T00:00:00.000Z","tags":[],"readingTime":5.105,"hasTruncateMarker":true,"authors":[{"name":"Adewale Abati","title":"Staff Developer Advocate","url":"https://adewaleabati.com","page":{"permalink":"/goose/blog/authors/adewale"},"socials":{"x":"https://x.com/ace_kyd","github":"https://github.com/acekyd"},"imageURL":"https://avatars.githubusercontent.com/u/4003538?v=4","key":"adewale"}],"frontMatter":{"title":"Top 5 MCP Servers I Use as a Developer with Goose","description":"These 5 MCP servers help me automate my workflow and make me a better developer.","date":"2025-04-02T00:00:00.000Z","authors":["adewale"]},"unlisted":false,"prevItem":{"title":"How to Vibe Code Responsibly (with Goose)","permalink":"/goose/blog/2025/04/08/vibe-code-responsibly"},"nextItem":{"title":"MCP Explained for Non-Developers","permalink":"/goose/blog/2025/04/01/mcp-nondevs"}}')}}]); \ No newline at end of file diff --git a/assets/js/64085bbc.7ac65b5e.js b/assets/js/64085bbc.7ac65b5e.js new file mode 100644 index 00000000..b10a355b --- /dev/null +++ b/assets/js/64085bbc.7ac65b5e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[1153],{41403:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var o=n(12012),i=n(74848),r=n(28453);const s={title:"Securing the Model Context Protocol",description:"Building secure and capable AI integrations with Model Context Protocol (MCP) at Block.",authors:["alex"]},a=void 0,l={authorsImageUrls:[void 0]},c=[];function g(e){const t={blockquote:"blockquote",em:"em",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"blog cover",src:n(76146).A+"",width:"1200",height:"630"})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.em,{children:[(0,i.jsx)(t.strong,{children:"Authors:"})," Alex Rosenzweig, Arihant Virulkar, Andrea Leoszko, Wes Ring, Mike Shema, F G, Alex Klyubin, Michael Rand, Zhen Lian, Angie Jones, Douwe Osinga, Mic Neale, Bradley Axen, Gelareh Taban"]})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:'At Block, we\u2019ve been working hard to augment the capabilities of AI tooling by building "MCP Servers" which are designed to help make our Artificial Intelligence (AI) Agent codename goose more capable of interacting with the systems and tools we care about.'}),"\n",(0,i.jsx)(t.p,{children:"Block\u2019s Information Security (InfoSec) team has been heavily involved in this work and we wanted to capture our learnings in the space to help others. We expect there to be growing adoption and use cases for this including applying the technology in the security domain."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(g,{...e})}):g(e)}},76146:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/securing-mcp-5e475e91c0e621afa33e30b3d89ef065.png"},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(96540);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}},12012:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/03/31/securing-mcp","source":"@site/blog/2025-03-31-securing-mcp/index.md","title":"Securing the Model Context Protocol","description":"Building secure and capable AI integrations with Model Context Protocol (MCP) at Block.","date":"2025-03-31T00:00:00.000Z","tags":[],"readingTime":9.875,"hasTruncateMarker":true,"authors":[{"name":"Alex Rosenzweig","title":"Staff Security Engineer","page":{"permalink":"/goose/blog/authors/alex"},"socials":{"linkedin":"https://www.linkedin.com/in/alex-rosenzweig/","github":"https://github.com/shellz-n-stuff"},"imageURL":"https://media.licdn.com/dms/image/v2/C5103AQGrOYDDHn8z6g/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1520985744775?e=1749081600&v=beta&t=krNAyF8rFRnInDfEZcO2TlLOHXWKMzt-fJdkgHVfFNs","key":"alex"}],"frontMatter":{"title":"Securing the Model Context Protocol","description":"Building secure and capable AI integrations with Model Context Protocol (MCP) at Block.","authors":["alex"]},"unlisted":false,"prevItem":{"title":"Community-Inspired Benchmarking: The Goose Vibe Check","permalink":"/goose/blog/2025/03/31/goose-benchmark"},"nextItem":{"title":"Vibe Coding with Goose and the Speech MCP","permalink":"/goose/blog/2025/03/28/vibe-coding-with-goose"}}')}}]); \ No newline at end of file diff --git a/assets/js/64b9a0ba.14c6065b.js b/assets/js/64b9a0ba.14c6065b.js new file mode 100644 index 00000000..136d23b1 --- /dev/null +++ b/assets/js/64b9a0ba.14c6065b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5018],{9685:a=>{a.exports=JSON.parse('{"author":{"name":"Tania Chakraborty","title":"Senior Technical Community Manager","url":"https://taniachakraborty.com","page":{"permalink":"/goose/blog/authors/tania"},"socials":{"linkedin":"https://www.linkedin.com/in/taniachakraborty/","x":"https://x.com/taniashiba","github":"https://github.com/taniashiba","bluesky":"https://bsky.app/profile/taniachakraborty.com"},"imageURL":"https://avatars.githubusercontent.com/u/126204004?v=4","key":"tania","count":8},"listMetadata":{"permalink":"/goose/blog/authors/tania","page":1,"postsPerPage":10,"totalPages":1,"totalCount":8,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/64cec281.15e83062.js b/assets/js/64cec281.15e83062.js new file mode 100644 index 00000000..066b9493 --- /dev/null +++ b/assets/js/64cec281.15e83062.js @@ -0,0 +1,2 @@ +/*! For license information please see 64cec281.15e83062.js.LICENSE.txt */ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[107],{92267:(e,s,n)=>{n.d(s,{E:()=>a});n(96540);var t=n(74848);const a=e=>{let{children:s,className:n="",variant:a="default"}=e;return(0,t.jsx)("span",{className:`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${{default:"bg-purple-100 text-purple-800",secondary:"bg-gray-100 text-gray-800"}[a]} ${n}`,children:s})}},46792:(e,s,n)=>{n.d(s,{$:()=>a});n(96540);var t=n(74848);const a=e=>{let{children:s,className:n="",variant:a="default",size:r="default",...i}=e;return(0,t.jsx)("button",{className:`flex rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-accent dark:focus:ring-offset-gray-900 ${{default:"bg-black dark:bg-white text-white dark:text-black hover:bg-accent/90 dark:hover:bg-accent/80",ghost:"bg-transparent hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-gray-300",link:"bg-transparent text-accent hover:underline hover:text-textProminent dark:text-accent/90"}[a]} ${{default:"px-6 py-3",icon:"p-2"}[r]} ${n}`,...i,children:s})}},20825:(e,s,n)=>{n.r(s),n.d(s,{default:()=>j});var t=n(43938),a=n(16445),r=n(7360),i=n(54472),l=n(1224),c=n(58368),o=n(46792),d=n(92267),m=n(41547),x=n(56347),h=n(96540),u=n(78809),p=n(56289),v=n(74848);function f(e){let{server:s}=e;return(0,v.jsx)(t.A,{children:(0,v.jsx)("div",{className:"min-h-screen flex items-start justify-center py-16",children:(0,v.jsx)("div",{className:"container max-w-5xl mx-auto px-4",children:(0,v.jsxs)("div",{className:"flex gap-8",children:[(0,v.jsx)("div",{children:(0,v.jsx)(p.A,{to:"/extensions",className:"no-underline",children:(0,v.jsxs)(o.$,{className:"flex items-center gap-2 hover:cursor-pointer",children:[(0,v.jsx)(a.A,{className:"h-4 w-4"}),"Back"]})})}),(0,v.jsx)("div",{className:"server-card flex-1",children:(0,v.jsxs)("div",{className:"card p-8",children:[(0,v.jsx)("div",{className:"card-header mb-6",children:(0,v.jsxs)("div",{className:"flex items-center gap-4",children:[(0,v.jsx)("h1",{className:"font-medium text-5xl text-textProminent m-0",children:s.name}),s.is_builtin&&(0,v.jsx)(d.E,{variant:"secondary",className:"text-sm",children:"Built-in"})]})}),(0,v.jsxs)("div",{className:"card-content space-y-6",children:[(0,v.jsx)("div",{children:(0,v.jsx)("p",{className:"text-xl text-textSubtle m-0",children:s.description})}),s.installation_notes&&(0,v.jsx)("div",{children:(0,v.jsx)("p",{className:"text-md text-textSubtle m-0",children:s.installation_notes})}),(0,v.jsx)("div",{className:"space-y-2",children:s.is_builtin?(0,v.jsxs)("div",{className:"flex items-center gap-2",children:[(0,v.jsx)(r.A,{className:"h-4 w-4 text-textSubtle shrink-0"}),(0,v.jsx)("span",{className:"text-sm text-textSubtle",children:"Can be enabled in the goose settings page"})]}):(0,v.jsxs)(v.Fragment,{children:[(0,v.jsxs)("div",{className:"flex items-center gap-2 text-textStandard",children:[(0,v.jsx)(i.A,{className:"h-4 w-4"}),(0,v.jsx)("h4",{className:"font-medium m-0",children:"Command"})]}),(0,v.jsx)("div",{className:"command-content",children:(0,v.jsx)("code",{className:"text-sm block",children:`goose session --with-extension "${s.command}"`})})]})}),s.environmentVariables&&(0,v.jsxs)("div",{className:"space-y-4",children:[(0,v.jsx)("h2",{className:"text-lg font-medium text-textStandard m-0",children:"Environment Variables"}),s.environmentVariables.length>0?(0,v.jsx)("div",{children:s.environmentVariables.map((e=>(0,v.jsxs)("div",{className:"border-b border-borderSubtle py-4 first:pt-0 last:border-0",children:[(0,v.jsx)("div",{className:"text-sm text-textStandard font-medium",children:e.name}),(0,v.jsx)("div",{className:"text-textSubtle text-sm mt-1",children:e.description}),e.required&&(0,v.jsx)(d.E,{variant:"secondary",className:"mt-2",children:"Required"})]},e.name)))}):(0,v.jsxs)("div",{className:"text-textSubtle text-sm flex items-center gap-2",children:[(0,v.jsx)(r.A,{className:"h-4 w-4"}),"No environment variables needed"]})]}),(0,v.jsxs)("div",{className:"card-footer",children:[(0,v.jsxs)("a",{href:s.link,target:"_blank",rel:"noopener noreferrer",className:"card-stats",children:[(0,v.jsx)(l.A,{className:"h-4 w-4"}),(0,v.jsxs)("span",{children:[s.githubStars," on Github"]})]}),s.is_builtin?(0,v.jsx)("div",{className:"built-in-badge",title:"This extension is built into goose and can be enabled in the settings page",children:"Built-in"}):(0,v.jsxs)("a",{href:(0,m.H)(s),target:"_blank",rel:"noopener noreferrer",className:"install-button",children:[(0,v.jsx)("span",{children:"Install"}),(0,v.jsx)(c.A,{className:"h-4 w-4"})]})]})]})]})})]})})})})}function j(){const e=(0,x.zy)(),[s,n]=(0,h.useState)(null),[r,i]=(0,h.useState)(!0),[l,c]=(0,h.useState)(null);return(0,h.useEffect)((()=>{(async()=>{try{i(!0),c(null);const s=await(0,u.V)(),t=new URLSearchParams(e.search).get("id");if(!t)return void c("No extension ID provided");const a=s.find((e=>e.id===t));a?n(a):c("Extension not found")}catch(s){c("Failed to load extension details"),console.error(s)}finally{i(!1)}})()}),[e]),r?(0,v.jsx)(t.A,{children:(0,v.jsx)("div",{className:"min-h-screen flex items-start justify-center py-16",children:(0,v.jsx)("div",{className:"container max-w-5xl mx-auto px-4",children:(0,v.jsxs)("div",{className:"flex gap-8",children:[(0,v.jsx)("div",{children:(0,v.jsx)(p.A,{to:"/extensions",className:"no-underline",children:(0,v.jsxs)(o.$,{className:"flex items-center gap-2 hover:text-textProminent hover:cursor-pointer",children:[(0,v.jsx)(a.A,{className:"h-4 w-4"}),"Back"]})})}),(0,v.jsx)("div",{className:"server-card flex-1",children:(0,v.jsx)("div",{className:"card p-8",children:(0,v.jsxs)("div",{className:"animate-pulse",children:[(0,v.jsx)("div",{className:"h-12 w-48 bg-bgSubtle rounded-lg mb-4"}),(0,v.jsx)("div",{className:"h-6 w-full bg-bgSubtle rounded-lg mb-2"}),(0,v.jsx)("div",{className:"h-6 w-2/3 bg-bgSubtle rounded-lg"})]})})})]})})})}):l||!s?(0,v.jsx)(t.A,{children:(0,v.jsx)("div",{className:"min-h-screen flex items-start justify-center py-16",children:(0,v.jsx)("div",{className:"container max-w-5xl mx-auto px-4",children:(0,v.jsxs)("div",{className:"flex gap-8",children:[(0,v.jsx)("div",{children:(0,v.jsx)(p.A,{to:"/extensions",className:"no-underline",children:(0,v.jsxs)(o.$,{variant:"ghost",className:"flex items-center gap-2 hover:text-textProminent hover:cursor-pointer",children:[(0,v.jsx)(a.A,{className:"h-4 w-4"}),"Back"]})})}),(0,v.jsx)("div",{className:"server-card flex-1",children:(0,v.jsx)("div",{className:"card p-8",children:(0,v.jsx)("div",{className:"text-red-500",children:l||"Extension not found"})})})]})})})}):(0,v.jsx)(f,{server:s})}},41547:(e,s,n)=>{function t(e){if(e.is_builtin){return`goose://extension?${["cmd=goosed","arg=mcp",`arg=${encodeURIComponent(e.id)}`,`description=${encodeURIComponent(e.id)}`].join("&")}`}if(e.url){return`goose://extension?${[`url=${encodeURIComponent(e.url)}`,`id=${encodeURIComponent(e.id)}`,`name=${encodeURIComponent(e.name)}`,`description=${encodeURIComponent(e.description)}`,...e.environmentVariables.filter((e=>e.required)).map((e=>`env=${encodeURIComponent(`${e.name}=${e.description}`)}`))].join("&")}`}const s=e.command.split(" "),n=s[0],t=s.slice(1);return`goose://extension?${[`cmd=${encodeURIComponent(n)}`,...t.map((e=>`arg=${encodeURIComponent(e)}`)),`id=${encodeURIComponent(e.id)}`,`name=${encodeURIComponent(e.name)}`,`description=${encodeURIComponent(e.description)}`,...e.environmentVariables.filter((e=>e.required)).map((e=>`env=${encodeURIComponent(`${e.name}=${e.description}`)}`))].join("&")}`}n.d(s,{H:()=>t})},78809:(e,s,n)=>{n.d(s,{V:()=>a,d:()=>r});const t="/goose/servers.json";async function a(){try{const e=await fetch(t);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const s=await e.json();return console.log("Fetched MCP servers data:",s),s}catch(e){throw console.error("Error fetching MCP servers:",e),e}}async function r(e){const s=await a(),n=e.toLowerCase();return s.filter((e=>{const s=e.name.toLowerCase(),t=e.description.toLowerCase();return s.includes(n)||t.includes(n)}))}},75395:(e,s,n)=>{n.d(s,{A:()=>l});var t=n(96540);const a=(...e)=>e.filter(((e,s,n)=>Boolean(e)&&""!==e.trim()&&n.indexOf(e)===s)).join(" ").trim();var r={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const i=(0,t.forwardRef)((({color:e="currentColor",size:s=24,strokeWidth:n=2,absoluteStrokeWidth:i,className:l="",children:c,iconNode:o,...d},m)=>(0,t.createElement)("svg",{ref:m,...r,width:s,height:s,stroke:e,strokeWidth:i?24*Number(n)/Number(s):n,className:a("lucide",l),...d},[...o.map((([e,s])=>(0,t.createElement)(e,s))),...Array.isArray(c)?c:[c]]))),l=(e,s)=>{const n=(0,t.forwardRef)((({className:n,...r},l)=>{return(0,t.createElement)(i,{ref:l,iconNode:s,className:a(`lucide-${c=e,c.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,n),...r});var c}));return n.displayName=`${e}`,n}},16445:(e,s,n)=>{n.d(s,{A:()=>t});const t=(0,n(75395).A)("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]])},58368:(e,s,n)=>{n.d(s,{A:()=>t});const t=(0,n(75395).A)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]])},7360:(e,s,n)=>{n.d(s,{A:()=>t});const t=(0,n(75395).A)("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]])},1224:(e,s,n)=>{n.d(s,{A:()=>t});const t=(0,n(75395).A)("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]])},54472:(e,s,n)=>{n.d(s,{A:()=>t});const t=(0,n(75395).A)("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]])}}]); \ No newline at end of file diff --git a/assets/js/64cec281.15e83062.js.LICENSE.txt b/assets/js/64cec281.15e83062.js.LICENSE.txt new file mode 100644 index 00000000..f02ba941 --- /dev/null +++ b/assets/js/64cec281.15e83062.js.LICENSE.txt @@ -0,0 +1,6 @@ +/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/6623314b.699bb74d.js b/assets/js/6623314b.699bb74d.js new file mode 100644 index 00000000..b5fab35f --- /dev/null +++ b/assets/js/6623314b.699bb74d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[101,577,583,1053,2482,2958,2964,3434,5339,5815,5821,7720,8196,8202,9004],{53472:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>p,frontMatter:()=>c,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"mcp/mbot-mcp","title":"mbot Extension","description":"Control a MakeBlock mbot2 rover through MQTT and MCP as a Goose Extension","source":"@site/docs/mcp/mbot-mcp.md","sourceDirName":"mcp","slug":"/mcp/mbot-mcp","permalink":"/goose/docs/mcp/mbot-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"mbot Extension","description":"Control a MakeBlock mbot2 rover through MQTT and MCP as a Goose Extension"},"sidebar":"tutorialSidebar","previous":{"title":"Knowledge Graph Memory Extension","permalink":"/goose/docs/mcp/knowledge-graph-mcp"},"next":{"title":"Memory Extension","permalink":"/goose/docs/mcp/memory-mcp"}}');var i=t(74848),r=t(28453),a=t(65537),s=t(79329),l=t(25887);const c={title:"mbot Extension",description:"Control a MakeBlock mbot2 rover through MQTT and MCP as a Goose Extension"},d=void 0,u={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Interaction",id:"goose-interaction",level:4}];function m(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.A,{videoUrl:"https://www.youtube.com/embed/QKg2Q6YCzdw"}),"\n",(0,i.jsxs)(n.p,{children:["This tutorial will get you started with ",(0,i.jsx)(n.a,{href:"https://github.com/deemkeen/mbotmcp",children:"deemkeen's MQTT MCP server"})," for the ",(0,i.jsx)(n.a,{href:"https://www.makeblock.com/products/buy-mbot2",children:"MakeBlock mbot2 rover"}),", and outline some code changes we made along the way."]}),"\n",(0,i.jsxs)(n.admonition,{title:"TLDR",type:"tip",children:[(0,i.jsxs)(a.A,{groupId:"interface",children:[(0,i.jsx)(s.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=/path/to/java&arg=-jar&arg=/path/to/mbotmcp-0.0.1-SNAPSHOT.jar&name=mbot2&description=mbot2&env=MQTT_SERVER_URI%3Dtcp://1.2.3.4:1883&env=MQTT_USERNAME%3Dyour_username&env=MQTT_PASSWORD%3Dyour_password",children:"Launch the installer"})})}),(0,i.jsxs)(s.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Command"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"/path/to/java -jar /path/to/mbotmcp-0.0.1-SNAPSHOT.jar\n"})})]})]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Environment Variable"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MQTT_SERVER_URI: tcp://1.2.3.4:1883\nMQTT_PASSWORD: \nMQTT_USERNAME: \n"})})]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(a.A,{groupId:"interface",children:[(0,i.jsx)(s.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"goose://extension?cmd=/path/to/java&arg=-jar&arg=/path/to/mbotmcp-0.0.1-SNAPSHOT.jar&name=mbot2&description=mbot2&env=MQTT_SERVER_URI%3Dtcp://1.2.3.4:1883&env=MQTT_USERNAME%3Dyour_username&env=MQTT_PASSWORD%3Dyour_password",children:"Launch the installer"})}),"\n",(0,i.jsxs)(n.li,{children:["Press ",(0,i.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n",(0,i.jsx)(n.li,{children:"Get your MQTT server URI, and your username/password if your MQTT uses authentication"}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.code,{children:"Save Configuration"})]}),"\n",(0,i.jsxs)(n.li,{children:["Scroll to the top and click ",(0,i.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,i.jsxs)(s.A,{value:"cli",label:"Goose CLI",children:[(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Run the ",(0,i.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Choose to add a ",(0,i.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 mbot2\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 mbot2\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 /path/to/java -jar /path/to/mbotmcp-0.0.1-SNAPSHOT.jar\n // highlight-end\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Enter the number of seconds Goose should wait for actions to complete before timing out. Default is 300s"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 mbot2\n \u2502\n \u25c7 What command should be run?\n \u2502 /path/to/java -jar /path/to/mbotmcp-0.0.1-SNAPSHOT.jar\n \u2502\n // highlight-start\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n // highlight-end\n \u2502\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:'Choose to add a description. If you select "Yes" here, you will be prompted to enter a description for the extension.'}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 mbot2\n \u2502\n \u25c7 What command should be run?\n \u2502 /path/to/java -jar /path/to/mbotmcp-0.0.1-SNAPSHOT.jar\n \u2502\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n // highlight-start\n \u25c7 Would you like to add a description?\n \u2502 No\n // highlight-end\n \u2502\n \u2514 \n"})}),(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsx)(n.li,{children:"Add environment variables for MQTT"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 mbot2\n \u2502\n \u25c7 What command should be run?\n \u2502 /path/to/java -jar /path/to/mbotmcp-0.0.1-SNAPSHOT.jar\n \u2502\n \u25c7 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n \u25c7 Would you like to add a description?\n \u2502 No\n \u2502\n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 Yes \n \u2502\n \u25c7 Environment variable name:\n \u2502 MQTT_SERVER_URI\n \u2502\n \u25c7 Environment variable value:\n \u2502 tcp://1.2.3.4:1883\n \u2502\n \u25c7 Add another environment variable?\n \u2502 Yes\n \u2502\n \u25c7 Environment variable name:\n \u2502 MQTT_USERNAME\n \u2502\n \u25c7 Environment variable value:\n \u2502 username\n \u2502\n \u25c7 Add another environment variable?\n \u2502 Yes\n \u2502\n \u25c7 Environment variable name:\n \u2502 MQTT_PASSWORD\n \u2502\n \u25c7 Environment variable value:\n \u2502 password\n // highlight-end\n \u2502\n \u2514 Added mbot2 extension\n"})}),(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.mdxAdmonitionTitle,{}),(0,i.jsx)(n.p,{children:"MQTT_USERNAME and MQTT_PASSWORD are required to exist, but can be empty strings if your MQTT server does not require authentication."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,i.jsx)(n.p,{children:"The available commands allow you to drive the mbot2 rover around, including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:'"turn left" or "turn right""'}),"\n",(0,i.jsx)(n.li,{children:'drive "forward" or "backward"'}),"\n",(0,i.jsx)(n.li,{children:'"explore" randomly'}),"\n",(0,i.jsx)(n.li,{children:'"stop" exploring'}),"\n",(0,i.jsx)(n.li,{children:'"beep"'}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The default distance to travel is 70cm (about 27 inches), and the turn angles are set to 90 degrees. You can change these values in the ",(0,i.jsx)(n.a,{href:"https://github.com/deemkeen/mbotmcp/blob/main/assets/mbot-mqtt.py",children:"Python code on the mbot2"}),". The mbot2 has a lot of other capabilities with the proximity sensors, lights, and color detection sensor on the bottom of the unit that you can add to the Python code, and will need to update ",(0,i.jsx)(n.a,{href:"https://github.com/deemkeen/mbotmcp/blob/main/src/main/java/de/emkeen/mbotmcp/service/BotService.java",children:"the Java code"})," to include those commands via MCP."]}),"\n",(0,i.jsx)(n.h4,{id:"goose-interaction",children:"Goose Interaction"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"( O)> Let my mbot2 explore the area\n\n Okay, let's get the mbot2 rover moving. I will send it on a mission to explore the area.\n\n > Mbotexplore\n\n( O)> stop the rover, turn left and move forward\n\n Alright, I will stop the rover, turn to the left, and then move it forward.\n\n > Mbotstop\n\n > Mbotleft\n\n > Mbotforward\n\n( O)> let's move backward and beep so I know when it's finished\n\n Sure, I will move the rover backward and beep when it's done.\n\n > Mbotbackward\n\n > Mbotbeep\n\n Okay, the mbot2 has moved and beeped. What else would you like to do with the rover?\n\n"})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}},52362:(e,n,t)=>{t.d(n,{A:()=>I});var o=t(96540),i=t(74848);function r(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=o.Children.toArray(e),t=n.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),r=n.filter((e=>e!==t)),a=t?.props.children;return{mdxAdmonitionTitle:a,rest:r.length>0?(0,i.jsx)(i.Fragment,{children:r}):null}}(e.children),r=e.title??n;return{...e,...r&&{title:r},children:t}}var a=t(34164),s=t(50539),l=t(204);const c="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:o}=e;return(0,i.jsx)("div",{className:(0,a.A)(l.G.common.admonition,l.G.common.admonitionType(n),c,t),children:o})}function p(e){let{icon:n,title:t}=e;return(0,i.jsxs)("div",{className:d,children:[(0,i.jsx)("span",{className:u,children:n}),t]})}function x(e){let{children:n}=e;return n?(0,i.jsx)("div",{className:h,children:n}):null}function f(e){const{type:n,icon:t,title:o,children:r,className:a}=e;return(0,i.jsxs)(m,{type:n,className:a,children:[o||t?(0,i.jsx)(p,{title:o,icon:t}):null,(0,i.jsx)(x,{children:r})]})}function g(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const b={icon:(0,i.jsx)(g,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function v(e){return(0,i.jsx)(f,{...b,...e,className:(0,a.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,i.jsx)(j,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(e){return(0,i.jsx)(f,{...y,...e,className:(0,a.A)("alert alert--success",e.className),children:e.children})}function T(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const A={icon:(0,i.jsx)(T,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function k(e){return(0,i.jsx)(f,{...A,...e,className:(0,a.A)("alert alert--info",e.className),children:e.children})}function E(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const M={icon:(0,i.jsx)(E,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function N(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const S={icon:(0,i.jsx)(N,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const C={icon:(0,i.jsx)(E,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const R={...{note:v,tip:w,info:k,warning:function(e){return(0,i.jsx)(f,{...M,...e,className:(0,a.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(f,{...S,...e,className:(0,a.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(v,{title:"secondary",...e}),important:e=>(0,i.jsx)(k,{title:"important",...e}),success:e=>(0,i.jsx)(w,{title:"success",...e}),caution:function(e){return(0,i.jsx)(f,{...C,...e,className:(0,a.A)("alert alert--warning",e.className),children:e.children})}}};function I(e){const n=r(e),t=(o=n.type,R[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),R.info));var o;return(0,i.jsx)(t,{...n})}},79329:(e,n,t)=>{t.d(n,{A:()=>a});t(96540);var o=t(34164);const i={tabItem:"tabItem_Ymn6"};var r=t(74848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,o.A)(i.tabItem,a),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),i=t(34164),r=t(65627),a=t(56347),s=t(50372),l=t(30604),c=t(11861),d=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:i}}=e;return{value:n,label:t,attributes:o,default:i}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const i=(0,a.W6)(),r=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(r),(0,o.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(i.location.search);n.set(r,e),i.replace({...i.location,search:n.toString()})}),[r,i])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,r=h(e),[a,l]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:r}))),[c,u]=p({queryString:t,groupId:i}),[x,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,r]=(0,d.Dv)(t);return[i,(0,o.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:i}),g=(()=>{const e=c??x;return m({value:e,tabValues:r})?e:null})();(0,s.A)((()=>{g&&l(g)}),[g]);return{selectedValue:a,selectValue:(0,o.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,r]),tabValues:r}}var f=t(9136);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(74848);function v(e){let{className:n,block:t,selectedValue:o,selectValue:a,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const n=e.currentTarget,t=l.indexOf(n),i=s[t].value;i!==o&&(c(n),a(i))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{l.push(e)},onKeyDown:u,onClick:d,...r,className:(0,i.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:r}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function y(e){const n=x(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",g.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(j,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,b.jsx)(y,{...e,children:u(e.children)},String(n))}},25887:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(52362),i=t(74848);const r=e=>{let{videoUrl:n}=e;return(0,i.jsxs)("div",{children:[(0,i.jsx)(o.A,{type:"info",icon:"\ud83c\udfa5",title:"Plug & Play",className:"alert--video",children:(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Watch the demo"}),(0,i.jsx)("div",{style:{textAlign:"center",margin:"20px 0"},children:(0,i.jsx)("iframe",{width:"100%",height:"540",src:n,title:"YouTube Short",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0})})]})}),(0,i.jsx)("hr",{})]})}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>s});var o=t(96540);const i={},r=o.createContext(i);function a(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/66453e5c.e486a9fe.js b/assets/js/66453e5c.e486a9fe.js new file mode 100644 index 00000000..39546243 --- /dev/null +++ b/assets/js/66453e5c.e486a9fe.js @@ -0,0 +1,2 @@ +/*! For license information please see 66453e5c.e486a9fe.js.LICENSE.txt */ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[5006],{89861:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var s=n(7360),i=n(54472),r=n(75395);const o=(0,r.A)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);var a=n(1224),c=n(58368),l=n(56289),d=n(96540),h=n(86297),m=n(51657),p=n(41547),u=n(74848);function x(e){let{server:t}=e;const[n,r]=(0,d.useState)(!1);return(0,u.jsx)("div",{className:"extension-title h-full",children:(0,u.jsxs)("div",{className:"server-card interactive w-full h-full",children:[(0,u.jsx)("div",{className:"card-glow"}),(0,u.jsxs)("div",{className:"card",children:[(0,u.jsx)("div",{className:"card-header",children:(0,u.jsxs)("div",{className:"card-header-content",children:[(0,u.jsx)("svg",{className:"extension-icon",width:"13",height:"12",viewBox:"0 0 13 12",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,u.jsxs)("g",{id:"Response Icons",children:[(0,u.jsx)("path",{id:"Vector",d:"M6.29521 0.0644531C3.24885 0.0644531 3.43906 1.37819 3.43906 1.37819L3.44245 2.73927H6.34953V3.1479H2.2878C2.2878 3.1479 0.33844 2.92804 0.33844 5.98471C0.33844 9.04147 2.03989 8.93307 2.03989 8.93307H3.05531V7.51461C3.05531 7.51461 3.00057 5.82262 4.7296 5.82262H7.6129C7.6129 5.82262 9.23283 5.84864 9.23283 4.26571V1.64842C9.23283 1.64842 9.47886 0.0644531 6.29521 0.0644531ZM4.69225 0.979748C4.76094 0.979686 4.82898 0.993097 4.89245 1.01921C4.95593 1.04533 5.01361 1.08363 5.06219 1.13194C5.11076 1.18024 5.14928 1.2376 5.17554 1.30073C5.2018 1.36385 5.21529 1.43151 5.21523 1.49982C5.21529 1.56814 5.2018 1.63579 5.17554 1.69892C5.14928 1.76205 5.11076 1.8194 5.06219 1.86771C5.01361 1.91601 4.95593 1.95432 4.89245 1.98044C4.82898 2.00655 4.76094 2.01996 4.69225 2.0199C4.62355 2.01996 4.55551 2.00655 4.49204 1.98044C4.42856 1.95432 4.37088 1.91601 4.3223 1.86771C4.27373 1.8194 4.23521 1.76205 4.20895 1.69892C4.18269 1.63579 4.1692 1.56814 4.16926 1.49982C4.1692 1.43151 4.18269 1.36385 4.20895 1.30073C4.23521 1.2376 4.27373 1.18024 4.3223 1.13194C4.37088 1.08363 4.42856 1.04533 4.49204 1.01921C4.55551 0.993097 4.62355 0.979686 4.69225 0.979748Z",fill:"currentColor"}),(0,u.jsx)("path",{id:"Vector_2",d:"M6.38171 11.9358C9.42806 11.9358 9.23786 10.622 9.23786 10.622L9.23447 9.26098H6.32735V8.85235H10.3891C10.3891 8.85235 12.3384 9.07221 12.3384 6.01544C12.3384 2.95872 10.637 3.06713 10.637 3.06713H9.62156V4.48554C9.62156 4.48554 9.6763 6.17754 7.94727 6.17754H5.06397C5.06397 6.17754 3.44404 6.15151 3.44404 7.73449V10.3518C3.44404 10.3518 3.19806 11.9358 6.38166 11.9358H6.38171ZM7.98467 11.0206C7.91598 11.0206 7.84794 11.0072 7.78447 10.9811C7.72099 10.955 7.66331 10.9167 7.61473 10.8684C7.56616 10.8201 7.52764 10.7627 7.50138 10.6996C7.47512 10.6364 7.46163 10.5688 7.46169 10.5005C7.46163 10.4322 7.47511 10.3645 7.50136 10.3014C7.52762 10.2382 7.56614 10.1809 7.61472 10.1326C7.66329 10.0842 7.72097 10.0459 7.78445 10.0198C7.84794 9.9937 7.91597 9.98029 7.98467 9.98035C8.05337 9.98029 8.1214 9.9937 8.18488 10.0198C8.24836 10.0459 8.30604 10.0842 8.35462 10.1325C8.40319 10.1808 8.44171 10.2382 8.46797 10.3013C8.49423 10.3645 8.50772 10.4321 8.50766 10.5004C8.50772 10.5687 8.49423 10.6364 8.46797 10.6995C8.44171 10.7627 8.40319 10.82 8.35462 10.8683C8.30604 10.9166 8.24836 10.9549 8.18488 10.981C8.1214 11.0072 8.05337 11.0206 7.98467 11.0205V11.0206Z",fill:"currentColor"})]})}),(0,u.jsx)(l.A,{to:`/extensions/detail?id=${t.id}`,className:"home-page-server-name",children:t.name})]})}),(0,u.jsxs)("div",{className:"card-content",children:[(0,u.jsxs)("div",{children:[(0,u.jsx)("div",{children:(0,u.jsx)("p",{className:"card-description",children:t.description})}),(0,u.jsxs)("div",{className:"py-4",children:[t.is_builtin&&(0,u.jsxs)("div",{className:"flex items-center gap-2",children:[(0,u.jsx)(s.A,{style:{width:"12px",height:"12px"},className:"text-textSubtle shrink-0"}),(0,u.jsx)("span",{style:{fontSize:"12px"},className:"text-textSubtle leading-normal",children:"Can be enabled in the goose settings page"})]}),!t.is_builtin&&void 0!==t.command&&void 0===t.url&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("button",{onClick:()=>r(!n),className:"command-toggle",children:[(0,u.jsx)(i.A,{className:"h-4 w-4"}),(0,u.jsx)("h4",{className:"mx-2",children:"Command"}),(0,u.jsx)(o,{className:"ml-auto transition-transform "+(n?"rotate-90":"")})]}),(0,u.jsx)(h.N,{children:n&&(0,u.jsx)(m.P.div,{className:"command-content",initial:{opacity:0,translateY:-20},animate:{opacity:1,translateY:0},exit:{opacity:0,translateY:-20,transition:{duration:.1}},children:(0,u.jsx)("code",{children:`goose session --with-extension "${t.command}"`})})})]}),!t.is_builtin&&void 0===t.command&&void 0!==t.url&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("button",{onClick:()=>r(!n),className:"command-toggle",children:[(0,u.jsx)(i.A,{className:"h-4 w-4"}),(0,u.jsx)("h4",{className:"mx-2",children:"Command"}),(0,u.jsx)(o,{className:"ml-auto transition-transform "+(n?"rotate-90":"")})]}),(0,u.jsx)(h.N,{children:n&&(0,u.jsx)(m.P.div,{className:"command-content",initial:{opacity:0,translateY:-20},animate:{opacity:1,translateY:0},exit:{opacity:0,translateY:-20,transition:{duration:.1}},children:(0,u.jsx)("code",{children:`goose session --with-remote-extension "${t.url}"`})})})]})]})]}),(0,u.jsxs)("div",{className:"card-footer",children:[void 0!==t.githubStars&&(0,u.jsxs)(l.A,{to:t.link,className:"card-stats",onClick:e=>e.stopPropagation(),children:[(0,u.jsx)(a.A,{className:"h-4 w-4"}),(0,u.jsxs)("span",{children:[t.githubStars," on Github"]})]}),(0,u.jsx)("div",{className:"card-action",children:t.is_builtin?(0,u.jsx)("div",{className:"built-in-badge",title:"This extension is built into goose and can be enabled in the settings page",children:"Built-in"}):(0,u.jsxs)("a",{href:(0,p.H)(t),target:"_blank",rel:"noopener noreferrer",className:"install-button",children:[(0,u.jsx)("span",{children:"Install"}),(0,u.jsx)(c.A,{className:"h-4 w-4"})]})})]})]})]})]})})}var f=n(78809),g=n(43938);const C=(0,r.A)("WandSparkles",[["path",{d:"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",key:"ul74o6"}],["path",{d:"m14 7 3 3",key:"1r5n42"}],["path",{d:"M5 6v4",key:"ilb8ba"}],["path",{d:"M19 14v4",key:"blhpug"}],["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M7 8H3",key:"zfb6yr"}],["path",{d:"M21 16h-4",key:"1cnmox"}],["path",{d:"M11 3H9",key:"1obp7u"}]]);function v(){const[e,t]=(0,d.useState)([]),[n,s]=(0,d.useState)(""),[i,r]=(0,d.useState)(!0),[o,a]=(0,d.useState)(null);return(0,d.useEffect)((()=>{const e=setTimeout((async()=>{try{r(!0),a(null);const e=n.trim(),s=e?await(0,f.d)(e):await(0,f.V)();console.log("Loaded servers:",s),t(s)}catch(e){const t=e instanceof Error?e.message:"Unknown error";a(`Failed to load servers: ${t}`),console.error("Error loading servers:",e)}finally{r(!1)}}),300);return()=>clearTimeout(e)}),[n]),(0,u.jsx)(g.A,{children:(0,u.jsxs)("div",{className:"container mx-auto px-4 p-24",children:[(0,u.jsxs)("div",{className:"pb-16",children:[(0,u.jsx)("h1",{className:"text-[64px] font-medium text-textProminent",children:"Browse Extensions"}),(0,u.jsx)("p",{className:"text-textProminent",children:"Your central directory for discovering and installing extensions."})]}),(0,u.jsxs)("div",{className:"flex justify-between items-center mb-8",children:[(0,u.jsx)("div",{className:"search-container flex-1",children:(0,u.jsx)("input",{className:"bg-bgApp font-light text-textProminent placeholder-textPlaceholder w-full px-3 py-3 text-[40px] leading-[52px] border-b border-borderSubtle focus:outline-none focus:ring-purple-500 focus:border-borderProminent caret-[#FF4F00] pl-0",placeholder:"Search for extensions",value:n,onChange:e=>s(e.target.value)})}),(0,u.jsx)(l.A,{to:"/recipe-generator",className:"no-underline ml-4",children:(0,u.jsxs)("div",{className:"flex items-center gap-2 bg-bgAppInverse text-textProminentInverse px-4 py-3 rounded-lg hover:bg-opacity-90 transition-all",children:[(0,u.jsx)(C,{className:"h-5 w-5"}),(0,u.jsx)("span",{children:"Recipe Generator"})]})})]}),o&&(0,u.jsx)("div",{className:"p-4 bg-red-50 text-red-600 rounded-md",children:o}),(0,u.jsxs)("section",{className:"",children:[(0,u.jsx)("div",{className:""+(n?"pb-2":"pb-8"),children:(0,u.jsx)("p",{className:"text-gray-600",children:n?`${e.length} result${e.length>1?"s":""} for "${n}"`:""})}),i?(0,u.jsx)("div",{className:"py-8 text-xl text-gray-600",children:"Loading servers..."}):0===e.length?(0,u.jsx)("div",{className:"text-center py-8 text-gray-500",children:n?"No servers found matching your search.":"No servers available."}):(0,u.jsx)("div",{className:"cards-grid",children:e.sort(((e,t)=>e.is_builtin&&!t.is_builtin?-1:!e.is_builtin&&t.is_builtin?1:0)).map((e=>(0,u.jsx)(m.P.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.6},children:(0,u.jsx)(x,{server:e},e.id)},e.id)))})]})]})})}},41547:(e,t,n)=>{function s(e){if(e.is_builtin){return`goose://extension?${["cmd=goosed","arg=mcp",`arg=${encodeURIComponent(e.id)}`,`description=${encodeURIComponent(e.id)}`].join("&")}`}if(e.url){return`goose://extension?${[`url=${encodeURIComponent(e.url)}`,`id=${encodeURIComponent(e.id)}`,`name=${encodeURIComponent(e.name)}`,`description=${encodeURIComponent(e.description)}`,...e.environmentVariables.filter((e=>e.required)).map((e=>`env=${encodeURIComponent(`${e.name}=${e.description}`)}`))].join("&")}`}const t=e.command.split(" "),n=t[0],s=t.slice(1);return`goose://extension?${[`cmd=${encodeURIComponent(n)}`,...s.map((e=>`arg=${encodeURIComponent(e)}`)),`id=${encodeURIComponent(e.id)}`,`name=${encodeURIComponent(e.name)}`,`description=${encodeURIComponent(e.description)}`,...e.environmentVariables.filter((e=>e.required)).map((e=>`env=${encodeURIComponent(`${e.name}=${e.description}`)}`))].join("&")}`}n.d(t,{H:()=>s})},78809:(e,t,n)=>{n.d(t,{V:()=>i,d:()=>r});const s="/goose/servers.json";async function i(){try{const e=await fetch(s);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const t=await e.json();return console.log("Fetched MCP servers data:",t),t}catch(e){throw console.error("Error fetching MCP servers:",e),e}}async function r(e){const t=await i(),n=e.toLowerCase();return t.filter((e=>{const t=e.name.toLowerCase(),s=e.description.toLowerCase();return t.includes(n)||s.includes(n)}))}},86297:(e,t,n)=>{n.d(t,{N:()=>g});var s=n(74848),i=n(96540),r=n(29473),o=n(28601),a=n(86719),c=n(35446);class l extends i.Component{getSnapshotBeforeUpdate(e){const t=this.props.childRef.current;if(t&&e.isPresent&&!this.props.isPresent){const e=this.props.sizeRef.current;e.height=t.offsetHeight||0,e.width=t.offsetWidth||0,e.top=t.offsetTop,e.left=t.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function d({children:e,isPresent:t}){const n=(0,i.useId)(),r=(0,i.useRef)(null),o=(0,i.useRef)({width:0,height:0,top:0,left:0}),{nonce:a}=(0,i.useContext)(c.Q);return(0,i.useInsertionEffect)((()=>{const{width:e,height:s,top:i,left:c}=o.current;if(t||!r.current||!e||!s)return;r.current.dataset.motionPopId=n;const l=document.createElement("style");return a&&(l.nonce=a),document.head.appendChild(l),l.sheet&&l.sheet.insertRule(`\n [data-motion-pop-id="${n}"] {\n position: absolute !important;\n width: ${e}px !important;\n height: ${s}px !important;\n top: ${i}px !important;\n left: ${c}px !important;\n }\n `),()=>{document.head.removeChild(l)}}),[t]),(0,s.jsx)(l,{isPresent:t,childRef:r,sizeRef:o,children:i.cloneElement(e,{ref:r})})}const h=({children:e,initial:t,isPresent:n,onExitComplete:r,custom:c,presenceAffectsLayout:l,mode:h})=>{const p=(0,o.M)(m),u=(0,i.useId)(),x=(0,i.useCallback)((e=>{p.set(e,!0);for(const t of p.values())if(!t)return;r&&r()}),[p,r]),f=(0,i.useMemo)((()=>({id:u,initial:t,isPresent:n,custom:c,onExitComplete:x,register:e=>(p.set(e,!1),()=>p.delete(e))})),l?[Math.random(),x]:[n,x]);return(0,i.useMemo)((()=>{p.forEach(((e,t)=>p.set(t,!1)))}),[n]),i.useEffect((()=>{!n&&!p.size&&r&&r()}),[n]),"popLayout"===h&&(e=(0,s.jsx)(d,{isPresent:n,children:e})),(0,s.jsx)(a.t.Provider,{value:f,children:e})};function m(){return new Map}var p=n(89120);const u=e=>e.key||"";function x(e){const t=[];return i.Children.forEach(e,(e=>{(0,i.isValidElement)(e)&&t.push(e)})),t}var f=n(25128);const g=({children:e,custom:t,initial:n=!0,onExitComplete:a,presenceAffectsLayout:c=!0,mode:l="sync",propagate:d=!1})=>{const[m,g]=(0,p.xQ)(d),C=(0,i.useMemo)((()=>x(e)),[e]),v=d&&!m?[]:C.map(u),j=(0,i.useRef)(!0),y=(0,i.useRef)(C),b=(0,o.M)((()=>new Map)),[N,w]=(0,i.useState)(C),[k,$]=(0,i.useState)(C);(0,f.E)((()=>{j.current=!1,y.current=C;for(let e=0;e{const i=u(e),r=!(d&&!m)&&(C===k||v.includes(i));return(0,s.jsx)(h,{isPresent:r,initial:!(j.current&&!n)&&void 0,custom:r?void 0:t,presenceAffectsLayout:c,mode:l,onExitComplete:r?void 0:()=>{if(!b.has(i))return;b.set(i,!0);let e=!0;b.forEach((t=>{t||(e=!1)})),e&&(null==A||A(),$(y.current),d&&(null==g||g()),a&&a())},children:e},i)}))})}},58368:(e,t,n)=>{n.d(t,{A:()=>s});const s=(0,n(75395).A)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]])},7360:(e,t,n)=>{n.d(t,{A:()=>s});const s=(0,n(75395).A)("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]])},1224:(e,t,n)=>{n.d(t,{A:()=>s});const s=(0,n(75395).A)("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]])},54472:(e,t,n)=>{n.d(t,{A:()=>s});const s=(0,n(75395).A)("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]])}}]); \ No newline at end of file diff --git a/assets/js/66453e5c.e486a9fe.js.LICENSE.txt b/assets/js/66453e5c.e486a9fe.js.LICENSE.txt new file mode 100644 index 00000000..f02ba941 --- /dev/null +++ b/assets/js/66453e5c.e486a9fe.js.LICENSE.txt @@ -0,0 +1,6 @@ +/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/67195f32.ea3d553e.js b/assets/js/67195f32.ea3d553e.js new file mode 100644 index 00000000..43fc9b6c --- /dev/null +++ b/assets/js/67195f32.ea3d553e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8354],{59637:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"mcp/browserbase-mcp","title":"Browserbase Extension","description":"Add Browserbase MCP Server as a Goose Extension for Web Automation","source":"@site/docs/mcp/browserbase-mcp.md","sourceDirName":"mcp","slug":"/mcp/browserbase-mcp","permalink":"/goose/docs/mcp/browserbase-mcp","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Browserbase Extension","description":"Add Browserbase MCP Server as a Goose Extension for Web Automation"},"sidebar":"tutorialSidebar","previous":{"title":"Brave Search Extension","permalink":"/goose/docs/mcp/brave-mcp"},"next":{"title":"Cloudinary Asset Management Extension","permalink":"/goose/docs/mcp/cloudinary-asset-management-mcp"}}');var r=t(74848),s=t(28453),a=t(65537),i=t(79329);const l={title:"Browserbase Extension",description:"Add Browserbase MCP Server as a Goose Extension for Web Automation"},c=void 0,d={},u=[{value:"Configuration",id:"configuration",level:2},{value:"Example Usage",id:"example-usage",level:2},{value:"Goose Prompt",id:"goose-prompt",level:3},{value:"Goose Output",id:"goose-output",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"This tutorial covers how to add the Browserbase MCP Server as a Goose extension for browser automation, enabling programmatic control over navigation, page interactions, and content capture."}),"\n",(0,r.jsxs)(n.admonition,{title:"TLDR",type:"tip",children:[(0,r.jsxs)(a.A,{groupId:"interface",children:[(0,r.jsx)(i.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=@browserbasehq/mcp&id=browserbase&name=Browserbase&description=Automate%20web%20browsing%20and%20data%20extraction&env=BROWSERBASE_PROJECT_ID%3DBrowserbase%20Project%20ID&env=BROWSERBASE_API_KEY%3DBrowserbase%20API%20Key",children:"Launch the installer"})})}),(0,r.jsxs)(i.A,{value:"cli",label:"Goose CLI",children:[(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Command"})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"npx @browserbasehq/mcp\n"})})]})]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Environment Variables"})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"BROWSERBASE_PROJECT_ID: \nBROWSERBASE_API_KEY: \n"})})]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(a.A,{groupId:"interface",children:[(0,r.jsx)(i.A,{value:"ui",label:"Goose Desktop",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"goose://extension?cmd=npx&arg=@browserbasehq/mcp&id=browserbase&name=Browserbase&description=Automate%20web%20browsing%20and%20data%20extraction&env=BROWSERBASE_PROJECT_ID%3DBrowserbase%20Project%20ID&env=BROWSERBASE_API_KEY%3DBrowserbase%20API%20Key",children:"Launch the installer"})}),"\n",(0,r.jsxs)(n.li,{children:["Press ",(0,r.jsx)(n.code,{children:"Yes"})," to confirm the installation"]}),"\n",(0,r.jsxs)(n.li,{children:["Obtain your ",(0,r.jsx)(n.a,{href:"https://browserbase.io/dashboard",children:"Browserbase Project ID and Browserbase API Key"})," and paste them in"]}),"\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.code,{children:"Save Configuration"})]}),"\n",(0,r.jsxs)(n.li,{children:["Scroll to the top and click ",(0,r.jsx)(n.code,{children:"Exit"})," from the upper left corner"]}),"\n"]})}),(0,r.jsxs)(i.A,{value:"cli",label:"Goose CLI",children:[(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Run the ",(0,r.jsx)(n.code,{children:"configure"})," command:"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"goose configure\n"})}),(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["Choose to add a ",(0,r.jsx)(n.code,{children:"Command-line Extension"})]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c6 What type of extension would you like to add?\n \u2502 \u25cb Built-in Extension \n // highlight-start \n \u2502 \u25cf Command-line Extension (Run a local command or script)\n // highlight-end \n \u2502 \u25cb Remote Extension (SSE) \n \u2502 \u25cb Remote Extension (Streaming HTTP) \n \u2514 \n"})}),(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsx)(n.li,{children:"Give your extension a name"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n // highlight-start\n \u25c6 What would you like to call this extension?\n \u2502 browserbase\n // highlight-end\n \u2514 \n"})}),(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsx)(n.li,{children:"Enter the command"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 browserbase\n \u2502\n // highlight-start\n \u25c6 What command should be run?\n \u2502 npx @browserbasehq/mcp\n // highlight-end\n \u2514 \n"})}),(0,r.jsxs)(n.ol,{start:"5",children:["\n",(0,r.jsx)(n.li,{children:"Enter the timeout (default 300s)"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 browserbase\n \u2502\n \u25c7 What command should be run?\n \u2502 npx @browserbasehq/mcp\n \u2502\n // highlight-start\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n // highlight-end\n \u2514 \n"})}),(0,r.jsxs)(n.ol,{start:"6",children:["\n",(0,r.jsx)(n.li,{children:"Add a description (optional)"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n \u25c7 What would you like to configure?\n \u2502 Add Extension (Connect to a new extension) \n \u2502\n \u25c7 What type of extension would you like to add?\n \u2502 Command-line Extension \n \u2502\n \u25c7 What would you like to call this extension?\n \u2502 browserbase\n \u2502\n \u25c7 What command should be run?\n \u2502 npx @browserbasehq/mcp\n \u2502\n \u25c6 Please set the timeout for this tool (in secs):\n \u2502 300\n \u2502\n // highlight-start\n \u25c7 Would you like to add a description?\n \u2502 No\n // highlight-end\n \u2514 \n"})}),(0,r.jsxs)(n.ol,{start:"7",children:["\n",(0,r.jsx)(n.li,{children:"Add environment variables"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:" \u250c goose-configure \n \u2502\n // highlight-start\n \u25c6 Would you like to add environment variables?\n \u2502 Yes\n \u2502\n \u25c7 Environment variable name:\n \u2502 BROWSERBASE_PROJECT_ID\n \u2502\n \u25c7 Environment variable value:\n \u2502 \u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n \u2502\n \u25c7 Add another environment variable?\n \u2502 Yes\n \u2502\n \u25c7 Environment variable name:\n \u2502 BROWSERBASE_API_KEY\n \u2502\n \u25c7 Environment variable value:\n \u2502 \u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\u25aa\n \u2502\n \u25c7 Add another environment variable?\n \u2502 No\n // highlight-end\n \u2514 Added browserbase extension\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,r.jsx)(n.p,{children:"Let's use the Browserbase extension to gather information about trending MCP-related repositories on GitHub."}),"\n",(0,r.jsx)(n.admonition,{title:"LLM",type:"info",children:(0,r.jsx)(n.p,{children:"Claude 3.5 Sonnet was used for this task."})}),"\n",(0,r.jsx)(n.h3,{id:"goose-prompt",children:"Goose Prompt"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'1. Go to https://github.com/trending\n\n2. Search for "MCP server" or scroll through and find repos with "MCP" or "Model Context Protocol" in the title or description\n\n3. For the top 3 relevant repositories:\n \u2022 Click into the repo\n \u2022 Take a screenshot of the repo page\n \u2022 Extract:\n - Repo name\n - Description\n - Stars today\n - First paragraph of README \n \u2022 Navigate back\n\n- Close all tabs\n\n- Output a Markdown report showing:\n \u2022 Repo name (link)\n \u2022 Screenshot\n \u2022 Description + Stars\n \u2022 README excerpt\n'})}),"\n",(0,r.jsx)(n.h3,{id:"goose-output",children:"Goose Output"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"# MCP Repositories Report\n\n## 1. [FastMCP](https://github.com/jlowin/fastmcp)\n\n![FastMCP Repository Screenshot]\n\n**Description**: The fast, Pythonic way to build MCP servers and clients. \n**Stars Today**: 10.2k stars\n\n**README Excerpt**: The Model Context Protocol (MCP) is a new, standardized way to provide context and tools to your LLMs, and FastMCP makes building MCP servers and clients simple and intuitive. Create tools, expose resources, define prompts, and connect components with clean, Pythonic code.\n\n## 2. [GitHub MCP Server](https://github.com/github/github-mcp-server)\n\n![GitHub MCP Server Screenshot]\n\n**Description**: GitHub's official MCP Server that provides seamless integration with GitHub APIs, enabling advanced automation and interaction capabilities for developers and tools. \n**Stars Today**: 13.9k stars\n\n**README Excerpt**: The GitHub MCP Server is a Model Context Protocol (MCP) server that provides seamless integration with GitHub APIs, enabling advanced automation and interaction capabilities for developers and tools.\n\n## 3. [Playwright MCP](https://github.com/microsoft/playwright-mcp)\n\n![Playwright MCP Screenshot]\n\n**Description**: A Model Context Protocol (MCP) server that provides browser automation capabilities using Playwright. \n**Stars Today**: 10.2k stars\n\n**README Excerpt**: A Model Context Protocol (MCP) server that provides browser automation capabilities using Playwright. This server enables LLMs to interact with web pages through structured accessibility snapshots, bypassing the need for screenshots or visually-tuned models.\n"})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},79329:(e,n,t)=>{t.d(n,{A:()=>a});t(96540);var o=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,a),hidden:t,children:n})}},65537:(e,n,t)=>{t.d(n,{A:()=>E});var o=t(96540),r=t(34164),s=t(65627),a=t(56347),i=t(50372),l=t(30604),c=t(11861),d=t(78749);function u(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:r}}=e;return{value:n,label:t,attributes:o,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,a.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=h(e),[a,l]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:s}))),[c,u]=m({queryString:t,groupId:r}),[b,x]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,d.Dv)(t);return[r,(0,o.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:r}),g=(()=>{const e=c??b;return p({value:e,tabValues:s})?e:null})();(0,i.A)((()=>{g&&l(g)}),[g]);return{selectedValue:a,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),x(e)}),[u,x,s]),tabValues:s}}var x=t(9136);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=t(74848);function v(e){let{className:n,block:t,selectedValue:o,selectValue:a,tabValues:i}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,t=l.indexOf(n),r=i[t].value;r!==o&&(c(n),a(r))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:i.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>{l.push(e)},onKeyDown:u,onClick:d,...s,className:(0,r.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function w(e){let{lazy:n,children:t,selectedValue:s}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===s));return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function j(e){const n=b(e);return(0,f.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,f.jsx)(v,{...n,...e}),(0,f.jsx)(w,{...n,...e})]})}function E(e){const n=(0,x.A)();return(0,f.jsx)(j,{...e,children:u(e.children)},String(n))}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var o=t(96540);const r={},s=o.createContext(r);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6acc8ddf.73acf4d1.js b/assets/js/6acc8ddf.73acf4d1.js new file mode 100644 index 00000000..84640d91 --- /dev/null +++ b/assets/js/6acc8ddf.73acf4d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[8332],{30839:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>d,contentTitle:()=>c,default:()=>l,frontMatter:()=>i,metadata:()=>t,toc:()=>r});var t=o(6727),a=o(74848),n=o(28453);o(16198),o(83349),o(7626),o(59975),o(79032),o(85349),o(22683),o(21374),o(41096),o(68709),o(92946),o(17533),o(93022),o(97921);const i={title:"Codename Goose Goes to New York",description:"Goose lands in NYC for its second community meetup",authors:["ebony"]},c="Codename Goose Goes to New York \ud83d\uddfd",d={authorsImageUrls:[void 0]},r=[];function g(e){const s={em:"em",img:"img",p:"p",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.p,{children:(0,a.jsx)(s.img,{alt:"blog cover",src:o(94184).A+"",width:"2240",height:"1260"})}),"\n",(0,a.jsx)(s.p,{children:"We brought Goose to New York City and it was one for the books."}),"\n",(0,a.jsxs)(s.p,{children:["Over 100 people registered, plus 87 on the waitlist, and we had a packed room full of folks who were curious, thoughtful, and ready to dive in. Some were developers already exploring Goose and MCP, others were totally new to the world of AI agents. That\u2019s the beauty of Goose, it\u2019s for developers ",(0,a.jsx)(s.em,{children:"and"})," non-developers."]}),"\n",(0,a.jsx)(s.p,{children:"The energy was there from the moment the event began - music, pizza, and authentic networking. We had lightning talks, a Goose-themed game, hands-on hacking, and yeah\u2026 a few Ebbs IPAs might\u2019ve ended up in people\u2019s backpacks by the end of the night."})]})}function l(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(g,{...e})}):g(e)}},16198:(e,s,o)=>{o.d(s,{A:()=>c});var t=o(96540),a=o(46874),n=o(58943),i=o(74848);const c=e=>{let{images:s,id:o,width:c="100%",names:d=[]}=e;const[r,g]=t.useState(0),l=()=>Array.isArray(d)&&d.length>r&&d[r]?d[r]:"";return(0,i.jsxs)("div",{className:"carousel-container",children:[l()&&(0,i.jsx)("h3",{className:"carousel-header",children:l()}),(0,i.jsx)(a.RC,{spaceBetween:10,slidesPerView:1,navigation:!0,pagination:{clickable:!0},modules:[n.Vx,n.dK],className:`swiper-container-${o}`,style:{width:c},onSlideChange:e=>g(e.activeIndex),children:s.map(((e,s)=>(0,i.jsx)(a.qr,{children:(0,i.jsx)("img",{src:e,alt:`Slide ${s+1}`,className:"carousel-image"})},s)))})]})}},85349:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/focus-4927104eb487e6b1f9480d8149e26c36.jpg"},22683:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/focus2-4ca4bc40c7a86ec46ec566d4d1fd2001.jpg"},21374:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/focus3-8ba8fb623d148fa5583c41c0a7a721a4.jpg"},68709:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/focus4-8232c187021a690519cfa1e8f1c18014.jpg"},41096:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/focus5-afe81c949e09dc788989d1c20c3a74fe.jpg"},93022:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/fun-340fa01a11fd04982ae7e2e612bded03.jpg"},97921:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/fun1-b0d7060f8629eec662b2c9f5a22dd7d0.jpg"},92946:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/speaker-bd71c5b83c6e0cd202ea8aa8af867b58.jpg"},17533:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/speaker1-45d20237329fb76d724e73b6ee1f7a89.jpg"},59975:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/swag-8eaec6e42aea06511f6334c6e9e21ec1.jpg"},7626:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/swag1-7e7ee0095446a64f5dbcffe6b5b69460.jpg"},83349:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/swag2-6ed2a0029c159d14013e366f6f945268.jpg"},79032:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/swag3-50d943bd7ee6e68c65ad0bed5e339f9a.jpg"},94184:(e,s,o)=>{o.d(s,{A:()=>t});const t=o.p+"assets/images/cover-6c131d275bcdb4d8651a140d62e2975f.png"},6727:e=>{e.exports=JSON.parse('{"permalink":"/goose/blog/2025/04/17/goose-goes-to-NY","source":"@site/blog/2025-04-17-goose-goes-to-NY/index.mdx","title":"Codename Goose Goes to New York","description":"Goose lands in NYC for its second community meetup","date":"2025-04-17T00:00:00.000Z","tags":[],"readingTime":4.35,"hasTruncateMarker":true,"authors":[{"name":"Ebony Louis","title":"Developer Advocate","page":{"permalink":"/goose/blog/authors/ebony"},"socials":{"linkedin":"https://www.linkedin.com/in/ebonylouis/","x":"https://x.com/ebonyjlouis","github":"https://github.com/ebonylouis"},"imageURL":"https://avatars.githubusercontent.com/u/55366651?v=4","key":"ebony"}],"frontMatter":{"title":"Codename Goose Goes to New York","description":"Goose lands in NYC for its second community meetup","authors":["ebony"]},"unlisted":false,"prevItem":{"title":"11 Practical Ways I Use AI Agents Without Losing My Authenticity","permalink":"/goose/blog/2025/04/21/practical-use-cases-of-ai"},"nextItem":{"title":"How ATrueLight4 Helped Goose Navigate Windows","permalink":"/goose/blog/2025/04/14/community-atruelight4"}}')}}]); \ No newline at end of file diff --git a/assets/js/6b2bbf82.2183ae7f.js b/assets/js/6b2bbf82.2183ae7f.js new file mode 100644 index 00000000..e9e5ae7e --- /dev/null +++ b/assets/js/6b2bbf82.2183ae7f.js @@ -0,0 +1 @@ +(self.webpackChunkgoose=self.webpackChunkgoose||[]).push([[6405],{92267:(e,n,t)=>{"use strict";t.d(n,{E:()=>a});t(96540);var i=t(74848);const a=e=>{let{children:n,className:t="",variant:a="default"}=e;return(0,i.jsx)("span",{className:`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${{default:"bg-purple-100 text-purple-800",secondary:"bg-gray-100 text-gray-800"}[a]} ${t}`,children:n})}},46792:(e,n,t)=>{"use strict";t.d(n,{$:()=>a});t(96540);var i=t(74848);const a=e=>{let{children:n,className:t="",variant:a="default",size:r="default",...s}=e;return(0,i.jsx)("button",{className:`flex rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-accent dark:focus:ring-offset-gray-900 ${{default:"bg-black dark:bg-white text-white dark:text-black hover:bg-accent/90 dark:hover:bg-accent/80",ghost:"bg-transparent hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-gray-300",link:"bg-transparent text-accent hover:underline hover:text-textProminent dark:text-accent/90"}[a]} ${{default:"px-6 py-3",icon:"p-2"}[r]} ${t}`,...s,children:n})}},44119:(e,n,t)=>{"use strict";t.r(n),t.d(n,{default:()=>A});var i=t(43938),a=t(58368),r=t(54472),s=t(16445),o=t(52362),l=t(58069),c=t(46792),d=t(92267),m=t(56347),u=t(96540),p=t(56289),g=t(86297),h=t(51657),v=t(18907),f=t(54655),y=t(41547),b=t(74848);function x(e){return{id:e.command,name:e.name,command:e.command,url:e.url,description:e.name,is_builtin:e.is_builtin,link:e.link||"",installation_notes:e.installation_notes||"",endorsed:!1,environmentVariables:e.environmentVariables||[],githubStars:0}}function _(e){let{extensions:n}=e;const[t,i]=(0,u.useState)(null),a=null!==t;return(0,b.jsx)("div",{className:"flex gap-3 "+(a?"flex-col":"flex-wrap"),children:n.map((e=>(0,b.jsx)(S,{extension:e,isExpanded:t===e.name,onToggle:n=>{i(n?e.name:null)}},e.name)))})}function S(e){let{extension:n,isExpanded:t,onToggle:i}=e;return(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsxs)("div",{className:`\n inline-flex items-center h-9 px-4 rounded-full \n bg-background-subtle border border-borderSubtle\n transition-all duration-150 ease-in-out\n hover:bg-background-standard hover:border-borderStandard\n group ${n.is_builtin?"cursor-help":"cursor-pointer"}\n ${t?"bg-background-standard border-borderStandard":""}\n `,onClick:()=>{n.is_builtin||i(!t)},title:n.is_builtin?"Built-in extension - can be enabled in settings":"Click to see installation options",children:[(0,b.jsx)("span",{className:"text-sm text-textStandard group-hover:text-textProminent",children:n.name}),n.is_builtin?(0,b.jsx)("div",{className:"inline-flex items-center ml-2",children:(0,b.jsx)("span",{className:"text-sm text-textSubtle",children:"Built-in"})}):(0,b.jsx)("span",{className:"ml-2 text-textSubtle",children:(0,b.jsx)(a.A,{className:"h-4 w-4"})})]}),(0,b.jsx)(g.N,{children:!n.is_builtin&&t&&(0,b.jsx)(h.P.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.2},className:"overflow-hidden",children:(0,b.jsxs)("div",{className:"mt-2 bg-background-subtle rounded-md p-3 border border-borderSubtle space-y-3",children:[(0,b.jsxs)("a",{href:(0,y.H)(x(n)),target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-textStandard hover:text-textProminent",onClick:e=>e.stopPropagation(),children:[(0,b.jsx)(a.A,{className:"h-4 w-4"}),(0,b.jsx)("span",{className:"mx-2",children:"Install via Desktop"})]}),(0,b.jsx)("div",{className:"border-t border-borderSubtle"}),(0,b.jsxs)("button",{className:"command-toggle w-full flex items-center",children:[(0,b.jsx)(r.A,{className:"h-4 w-4"}),(0,b.jsx)("h4",{className:"mx-2",children:"Command"})]}),(0,b.jsx)("div",{children:n.url?(0,b.jsxs)(l.A,{language:"bash",children:['goose session --with-remote-extension "',n.url,'"']}):(0,b.jsxs)(l.A,{language:"bash",children:['goose session --with-extension "',n.command,'"']})}),n.installation_notes&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"border-t border-borderSubtle"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-medium mb-2",children:"Installation Notes"}),(0,b.jsx)("div",{className:"text-sm text-textSubtle",children:(0,b.jsx)(f.oz,{children:n.installation_notes})})]})]}),n.environmentVariables&&n.environmentVariables.length>0&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"border-t border-borderSubtle"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-medium mb-2",children:"Environment Variables"}),n.environmentVariables.map((e=>(0,b.jsxs)("div",{className:"mb-2 last:mb-0",children:[(0,b.jsx)("code",{className:"text-sm",children:e.name}),(0,b.jsxs)("div",{className:"text-sm text-textSubtle mt-1",children:[e.description,e.required&&(0,b.jsx)(d.E,{variant:"secondary",className:"ml-2 text-xs",children:"Required"})]})]},e.name)))]})]})]})})})]})}function E(e){let{prompt:n}=e;return(0,b.jsx)(i.A,{children:(0,b.jsx)("div",{className:"min-h-screen flex items-start justify-center py-16",children:(0,b.jsx)("div",{className:"container max-w-5xl mx-auto px-4",children:(0,b.jsxs)("div",{className:"flex gap-8",children:[(0,b.jsx)("div",{children:(0,b.jsx)(p.A,{to:"/prompt-library",className:"no-underline",children:(0,b.jsxs)(c.$,{className:"flex items-center gap-2 hover:cursor-pointer",children:[(0,b.jsx)(s.A,{className:"h-4 w-4"}),"Back"]})})}),(0,b.jsx)("div",{className:"prompt-card flex-1",children:(0,b.jsxs)("div",{className:"card p-8",children:[(0,b.jsx)("div",{className:"card-header mb-6",children:(0,b.jsx)("h1",{className:"font-medium text-5xl text-textProminent m-0",children:n.title})}),(0,b.jsxs)("div",{className:"card-content space-y-8",children:[(0,b.jsx)("div",{children:(0,b.jsx)("p",{className:"text-xl text-textSubtle m-0",children:n.description})}),(0,b.jsx)(o.A,{type:"info",children:"Results may vary depending on the model and context."}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-2xl font-medium mb-4",children:"Example Prompt"}),(0,b.jsx)(l.A,{language:"markdown",children:n.example_prompt})]}),n.example_result&&(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-2xl font-medium mb-4",children:"Example Result"}),(0,b.jsx)(l.A,{language:"markdown",children:n.example_result})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-2xl font-medium mb-4",children:"Recommended Extensions"}),(0,b.jsx)(_,{extensions:n.extensions})]})]})]})})]})})})})}function A(){const e=(0,m.zy)(),[n,t]=(0,u.useState)(null),[a,r]=(0,u.useState)(!0),[o,l]=(0,u.useState)(null);return(0,u.useEffect)((()=>{(async()=>{try{r(!0),l(null);const n=new URLSearchParams(e.search).get("id");if(!n)return void l("No prompt ID provided");const i=await(0,v.F)(n);i?t(i):l("Prompt not found")}catch(n){l("Failed to load prompt details"),console.error(n)}finally{r(!1)}})()}),[e]),a?(0,b.jsx)(i.A,{children:(0,b.jsx)("div",{className:"min-h-screen flex items-start justify-center py-16",children:(0,b.jsx)("div",{className:"container max-w-5xl mx-auto px-4",children:(0,b.jsxs)("div",{className:"flex gap-8",children:[(0,b.jsx)("div",{children:(0,b.jsx)(p.A,{to:"/prompt-library",className:"no-underline",children:(0,b.jsxs)(c.$,{className:"flex items-center gap-2 hover:text-textProminent hover:cursor-pointer",children:[(0,b.jsx)(s.A,{className:"h-4 w-4"}),"Back"]})})}),(0,b.jsx)("div",{className:"prompt-card flex-1",children:(0,b.jsx)("div",{className:"card p-8",children:(0,b.jsxs)("div",{className:"animate-pulse",children:[(0,b.jsx)("div",{className:"h-12 w-48 bg-bgSubtle rounded-lg mb-4"}),(0,b.jsx)("div",{className:"h-6 w-full bg-bgSubtle rounded-lg mb-2"}),(0,b.jsx)("div",{className:"h-6 w-2/3 bg-bgSubtle rounded-lg"})]})})})]})})})}):o||!n?(0,b.jsx)(i.A,{children:(0,b.jsx)("div",{className:"min-h-screen flex items-start justify-center py-16",children:(0,b.jsx)("div",{className:"container max-w-5xl mx-auto px-4",children:(0,b.jsxs)("div",{className:"flex gap-8",children:[(0,b.jsx)("div",{children:(0,b.jsx)(p.A,{to:"/prompt-library",className:"no-underline",children:(0,b.jsxs)(c.$,{variant:"ghost",className:"flex items-center gap-2 hover:text-textProminent hover:cursor-pointer",children:[(0,b.jsx)(s.A,{className:"h-4 w-4"}),"Back"]})})}),(0,b.jsx)("div",{className:"prompt-card flex-1",children:(0,b.jsx)("div",{className:"card p-8",children:(0,b.jsx)("div",{className:"text-red-500",children:o||"Prompt not found"})})})]})})})}):(0,b.jsx)(E,{prompt:n})}},41547:(e,n,t)=>{"use strict";function i(e){if(e.is_builtin){return`goose://extension?${["cmd=goosed","arg=mcp",`arg=${encodeURIComponent(e.id)}`,`description=${encodeURIComponent(e.id)}`].join("&")}`}if(e.url){return`goose://extension?${[`url=${encodeURIComponent(e.url)}`,`id=${encodeURIComponent(e.id)}`,`name=${encodeURIComponent(e.name)}`,`description=${encodeURIComponent(e.description)}`,...e.environmentVariables.filter((e=>e.required)).map((e=>`env=${encodeURIComponent(`${e.name}=${e.description}`)}`))].join("&")}`}const n=e.command.split(" "),t=n[0],i=n.slice(1);return`goose://extension?${[`cmd=${encodeURIComponent(t)}`,...i.map((e=>`arg=${encodeURIComponent(e)}`)),`id=${encodeURIComponent(e.id)}`,`name=${encodeURIComponent(e.name)}`,`description=${encodeURIComponent(e.description)}`,...e.environmentVariables.filter((e=>e.required)).map((e=>`env=${encodeURIComponent(`${e.name}=${e.description}`)}`))].join("&")}`}t.d(n,{H:()=>i})},18907:(e,n,t)=>{"use strict";t.d(n,{F:()=>s,I:()=>r});const i=t(98403),a=i.keys().map((e=>{const n=i(e);return n.default||n}));async function r(e){const n=e.toLowerCase().split(" ").filter(Boolean);return n.length?a.filter((e=>{const t=[e.title,e.description,e.example_prompt,...e.extensions.map((e=>e.name))].join(" ").toLowerCase();return n.every((e=>t.includes(e)))})):a}async function s(e){return a.find((n=>n.id===e))||null}},98403:(e,n,t)=>{var i={"./accessibility-audit.json":79644,"./ai-content-detection.json":80518,"./api-endpoints-analysis.json":53478,"./asana-task-management.json":96586,"./content-calendar-generator.json":8820,"./data-model-design.json":93971,"./delivery-tracking-automation.json":4064,"./figma-to-code.json":45466,"./form-review-automation.json":26021,"./generate-storybook-entry.json":59353,"./generate-toc.json":79318,"./github-branch-pr.json":42353,"./hands-free-coding.json":59234,"./image-resize.json":47562,"./incident-analysis.json":50029,"./java-kotlin-test-migration.json":16598,"./jetbrains-java-upgrade.json":60386,"./js-express-setup.json":65420,"./make-phone-call.json":89476,"./marketing-budget-review.json":33791,"./multi-project-security-audit.json":91122,"./name-column-split.json":41179,"./performance-review-prep.json":95361,"./pieces-stand-up-status-report.json":21400,"./product-region-availability.json":57844,"./query-optimization.json":43596,"./regulatory-comparison.json":48766,"./retail-market-monitor.json":86867,"./roll-plan-analyzer.json":19948,"./sales-performance-analysis.json":64926,"./security-patterns.json":58156,"./social-post-adaptation.json":5308,"./system-control-research.json":88623,"./youtube-to-blog.json":36658};function a(e){var n=r(e);return t(n)}function r(e){if(!t.o(i,e)){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return i[e]}a.keys=function(){return Object.keys(i)},a.resolve=r,e.exports=a,a.id=98403},79644:e=>{"use strict";e.exports=JSON.parse('{"id":"accessibility-audit","title":"Website Accessibility Audit","description":"Conduct a comprehensive accessibility audit of a website, including keyboard navigation, color contrast, and ARIA compliance","category":"technical","job":"design","example_prompt":"Can you check if my website is accessible? Please conduct a full accessibility audit, focusing on the following:\\n\\n1. Keyboard Navigation: Test all interactive elements (links, buttons, dropdowns, etc.) to ensure they are accessible without a mouse.\\n\\n2. Color Contrast Analysis: Verify that all text and UI elements meet WCAG contrast ratio standards.\\n\\n3. Screen Reader Compatibility: Test whether a screen reader can properly interpret content and navigation.\\n\\n4. ARIA & Semantic HTML Validation: Identify any missing or misused ARIA attributes and ensure proper semantic structure.\\n\\n5. Error Identification & Screenshots: Provide a comprehensive report with identified issues, along with screenshots if necessary.\\n\\n6. Fixes & Code Recommendations: Suggest HTML, CSS, or JavaScript changes to resolve any compliance issues.\\n\\nHere is the website to test: [URL]. I want to ensure that our documentation meets accessibility standards. Please generate a detailed report with steps to fix any issues found.","example_result":"I\'ve completed the accessibility audit of your website. Here are the findings:\\n\\n1. Keyboard Navigation:\\n- All interactive elements are keyboard accessible\\n- Focus indicators are visible\\n- Tab order is logical\\n\\n2. Color Contrast:\\n- Main text meets WCAG AA standards (ratio 4.5:1)\\n- Warning: Header text #FF8C00 on white background fails contrast requirements\\n\\n3. Screen Reader Compatibility:\\n- All images have appropriate alt text\\n- Headings are properly structured (H1 \u2192 H2 \u2192 H3)\\n- Form fields have associated labels\\n\\n4. ARIA & Semantic HTML:\\n- Navigation uses