From 088b905f2c56bef1a59ad5c1b4f3187647e7b31c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 00:04:40 +0000 Subject: [PATCH] deploy: cf6adc7cec6b1c46dddffab78de87e4534e312c2 --- 404.html | 6 +- ...tyles.310882a3.css => styles.9a79427d.css} | 2 +- assets/js/0058b4c6.b64d5a7a.js | 1 - assets/js/0058b4c6.be041ba5.js | 1 + assets/js/03cca2c9.6cb8b05c.js | 1 + assets/js/150c26e9.832adbbb.js | 1 + assets/js/150c26e9.dfc9c07e.js | 1 - assets/js/1e599e21.061f6caa.js | 1 + assets/js/2a162317.e1b94b47.js | 1 - assets/js/2a162317.e3b8f6cf.js | 1 + assets/js/4bc002f8.8f763503.js | 1 + assets/js/9e75eaed.6c0d8ee7.js | 1 + assets/js/9e75eaed.966b9594.js | 1 - assets/js/bead5408.ab58d23c.js | 1 + assets/js/bead5408.d5194e8b.js | 1 - assets/js/c69aaf89.7f98a7e0.js | 1 - assets/js/c69aaf89.b49fb459.js | 1 + assets/js/ddb4e1f1.82873e64.js | 1 - assets/js/ddb4e1f1.f93c2875.js | 1 + assets/js/fb7e2344.21ec2458.js | 1 - assets/js/fb7e2344.d1fce15a.js | 1 + assets/js/main.bb74e6f2.js | 2 + ...CENSE.txt => main.bb74e6f2.js.LICENSE.txt} | 0 assets/js/main.f89b5513.js | 2 - assets/js/runtime~main.387a63bb.js | 1 + assets/js/runtime~main.9550676a.js | 1 - blog/archive/index.html | 6 +- blog/authors/coltmcnealy/index.html | 6 +- blog/authors/index.html | 6 +- blog/authors/lh-council/index.html | 6 +- blog/authors/mitchellh/index.html | 6 +- blog/basics-of-workflow/index.html | 6 +- blog/challenge-of-microservices/index.html | 6 +- blog/index.html | 6 +- blog/littlehorse-0.10-release/index.html | 6 +- blog/littlehorse-0.11-release/index.html | 6 +- blog/littlehorse-0.2.0-release/index.html | 6 +- blog/littlehorse-0.5.0-release/index.html | 6 +- blog/littlehorse-0.7-release/index.html | 6 +- blog/littlehorse-0.8-release/index.html | 6 +- blog/littlehorse-0.9-release/index.html | 6 +- blog/microservices-and-workflow/index.html | 6 +- blog/promise-of-microservices/index.html | 6 +- blog/saga-pattern/index.html | 6 +- blog/tags/analysis/index.html | 6 +- blog/tags/index.html | 6 +- blog/tags/integration-patterns/index.html | 6 +- blog/tags/littlehorse/index.html | 6 +- .../tags/microservice-and-workflow/index.html | 6 +- blog/tags/release/index.html | 6 +- blog/transactional-outbox/index.html | 6 +- docs/api/index.html | 57 +++++++++++++---- docs/architecture-and-guarantees/index.html | 6 +- docs/concepts/advanced/index.html | 6 +- .../advanced/wfspec-versioning/index.html | 6 +- docs/concepts/external-events/index.html | 6 +- docs/concepts/index.html | 6 +- .../principals-and-tenants/index.html | 6 +- docs/concepts/tasks/index.html | 6 +- docs/concepts/user-tasks/index.html | 6 +- docs/concepts/workflow-events/index.html | 6 +- docs/concepts/workflows/index.html | 6 +- .../client-configuration/index.html | 6 +- .../advanced/await-workflow-events/index.html | 63 +++++++++++++++++++ docs/developer-guide/grpc/advanced/index.html | 30 +++++++++ docs/developer-guide/grpc/basics/index.html | 8 +-- docs/developer-guide/grpc/index.html | 10 +-- .../grpc/managing-metadata/index.html | 14 +++-- .../grpc/posting-external-events/index.html | 8 +-- .../grpc/running-workflows/index.html | 8 +-- .../grpc/user-tasks/index.html | 10 +-- docs/developer-guide/index.html | 6 +- docs/developer-guide/install/index.html | 6 +- docs/developer-guide/lhctl/index.html | 6 +- .../task-worker-development/index.html | 6 +- .../wfspec-development/advanced/index.html | 8 +-- .../advanced/throwing-events/index.html | 41 ++++++++++++ .../advanced/wait-for-condition/index.html | 10 +-- .../wfspec-development/basics/index.html | 6 +- .../child-threads/index.html | 6 +- .../conditionals/index.html | 6 +- .../exception-handling/index.html | 6 +- .../external-events/index.html | 6 +- .../wfspec-development/index.html | 6 +- .../wfspec-development/interrupts/index.html | 6 +- .../mutating-variables/index.html | 6 +- .../wfspec-development/user-tasks/index.html | 6 +- docs/faq/index.html | 6 +- .../client-configuration/index.html | 6 +- .../dashboard-configuration/index.html | 6 +- .../docker-compose/basic/index.html | 6 +- .../docker-compose/confluent-cloud/index.html | 6 +- docs/operations/docker-compose/index.html | 6 +- .../docker-compose/three-servers/index.html | 6 +- docs/operations/index.html | 8 +-- docs/operations/overview/index.html | 6 +- .../server-configuration/index.html | 6 +- docs/overview/index.html | 8 +-- index.html | 6 +- markdown-page/index.html | 6 +- search/index.html | 6 +- sitemap.xml | 2 +- 102 files changed, 429 insertions(+), 255 deletions(-) rename assets/css/{styles.310882a3.css => styles.9a79427d.css} (95%) delete mode 100644 assets/js/0058b4c6.b64d5a7a.js create mode 100644 assets/js/0058b4c6.be041ba5.js create mode 100644 assets/js/03cca2c9.6cb8b05c.js create mode 100644 assets/js/150c26e9.832adbbb.js delete mode 100644 assets/js/150c26e9.dfc9c07e.js create mode 100644 assets/js/1e599e21.061f6caa.js delete mode 100644 assets/js/2a162317.e1b94b47.js create mode 100644 assets/js/2a162317.e3b8f6cf.js create mode 100644 assets/js/4bc002f8.8f763503.js create mode 100644 assets/js/9e75eaed.6c0d8ee7.js delete mode 100644 assets/js/9e75eaed.966b9594.js create mode 100644 assets/js/bead5408.ab58d23c.js delete mode 100644 assets/js/bead5408.d5194e8b.js delete mode 100644 assets/js/c69aaf89.7f98a7e0.js create mode 100644 assets/js/c69aaf89.b49fb459.js delete mode 100644 assets/js/ddb4e1f1.82873e64.js create mode 100644 assets/js/ddb4e1f1.f93c2875.js delete mode 100644 assets/js/fb7e2344.21ec2458.js create mode 100644 assets/js/fb7e2344.d1fce15a.js create mode 100644 assets/js/main.bb74e6f2.js rename assets/js/{main.f89b5513.js.LICENSE.txt => main.bb74e6f2.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.f89b5513.js create mode 100644 assets/js/runtime~main.387a63bb.js delete mode 100644 assets/js/runtime~main.9550676a.js create mode 100644 docs/developer-guide/grpc/advanced/await-workflow-events/index.html create mode 100644 docs/developer-guide/grpc/advanced/index.html create mode 100644 docs/developer-guide/wfspec-development/advanced/throwing-events/index.html diff --git a/404.html b/404.html index 0404d3019..cc0dca594 100644 --- a/404.html +++ b/404.html @@ -17,9 +17,9 @@ - - - + + + diff --git a/assets/css/styles.310882a3.css b/assets/css/styles.9a79427d.css similarity index 95% rename from assets/css/styles.310882a3.css rename to assets/css/styles.9a79427d.css index fabf8f44f..1baa7a9b1 100644 --- a/assets/css/styles.310882a3.css +++ b/assets/css/styles.9a79427d.css @@ -22,6 +22,6 @@ --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);color:var(--ifm-alert-foreground-color);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;text-transform:uppercase}.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{color:var(--ifm-alert-foreground-color);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)}.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);display:inline-block;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);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);--ifm-badge-border-color:var(--ifm-badge-background-color);color:var(--ifm-color-black)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger);--ifm-badge-border-color:var(--ifm-badge-background-color)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item{display:inline-block}.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);color:var(--ifm-font-color-base);display:inline-block;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;transition-timing-function:var(--ifm-transition-timing-default)}.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;display:inline-block;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;transition-timing-function:var(--ifm-transition-timing-default);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button:hover{text-decoration:none}.button--outline{--ifm-button-background-color:#0000;--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--outline.button--active,.button--outline:active,.button--outline:hover{--ifm-button-color:var(--ifm-font-color-base-inverse)}.button--link{--ifm-button-background-color:#0000;--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)}.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}: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);display:flex;flex-direction:column;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image: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{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;list-style:none;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)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.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:"";display:inline-block;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{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)}.footer__item{margin-top:0}.footer__items{margin-bottom:0}[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{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{list-style:none;margin:0;padding-left:0}.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){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{border-radius:.25rem;display:flex;flex-wrap:wrap;position:relative;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.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;border-radius:.25rem;display:flex;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.menu__caret:hover,.menu__link:hover{background:var(--ifm-menu-color-background-hover)}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25;padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none;transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50% /2rem 2rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;margin-left:auto;min-width:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50% /2rem 2rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem}.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)}.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;color:var(--ifm-navbar-link-color);display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__logo img{height:100%}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{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)}.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link{color:var(--ifm-navbar-link-color);font-weight:var(--ifm-font-weight-semibold)}.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-navbar-link-hover-color:var(--ifm-color-primary);--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);bottom:0;box-shadow:var(--ifm-global-shadow-md);left:0;opacity:0;overflow-x:hidden;position:fixed;top:0;transform:translate3d(-100%,0,0);transition-duration:var(--ifm-transition-fast);transition-property:opacity,visibility,transform;transition-timing-function:ease-in-out;visibility:hidden;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{transform:translateZ(0)}.navbar-sidebar__backdrop{background-color:#0009;bottom:0;left:0;opacity:0;position:fixed;right:0;top:0;transition-duration:var(--ifm-transition-fast);transition-property:opacity,visibility;transition-timing-function:ease-in-out;visibility:hidden}.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));transform:translateZ(0);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}.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{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}.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{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;font-weight:var(--ifm-font-weight-bold);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;font-weight:var(--ifm-font-weight-bold);margin-bottom:0;overflow-x:auto;padding-left:0}.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-500:var(--ifm-color-gray-500);--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}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__item{display:none}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}}@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}}@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{.footer,.menu,.navbar,.pagination-nav,.table-of-contents{display:none}.tabs{page-break-inside:avoid}}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary)}#nprogress{pointer-events:none}#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}:root{--ifm-code-font-size:95%;--ifm-navbar-link-color:var(--ifm-color-primary);--ifm-link-color:var(--ifm-color-primary-lighter);--docsearch-muted-color:var(--ifm-font-color-base)!important;--docusaurus-highlighted-code-line-bg:#0000001a;--white-filter:invert(100%) sepia(100%) saturate(0%) hue-rotate(336deg) brightness(110%) contrast(101%);--brown-filter:invert(24%) sepia(12%) saturate(1484%) hue-rotate(334deg) brightness(100%) contrast(87%);--black-filter:brightness(0%)}[data-theme=light]{--ifm-color-primary:#5c4033;--ifm-color-primary-dark:#72452d;--ifm-color-primary-darker:#6c412a;--ifm-color-primary-darkest:#593623;--ifm-color-primary-light:#8c5537;--ifm-color-primary-lighter:#925939;--ifm-color-primary-lightest:#a56441;code{border-color:#0000001a}.navbar__logo img{filter:var(--brown-filter)}.feature-img{filter:var(--black-filter)}}[data-theme=dark]{--ifm-color-primary:#d6d6d6;--ifm-color-primary-dark:#c1c1c1;--ifm-color-primary-darker:#b6b6b6;--ifm-color-primary-darkest:#969696;--ifm-color-primary-light:#ebebeb;--ifm-color-primary-lighter:#f6f6f6;--ifm-color-primary-lightest:#fff;--ifm-background-color:#000;--docsearch-highlight-color:#7b7bc4!important;code{border-color:#ffffff1a}.hero{color:#fff;--ifm-hero-background-color:#5c4033!important}.feature-img,.navbar__logo img{filter:var(--white-filter)}}.hero{background-image:url(/assets/images/logo-opaque-551b888fde924e3c5b727ac91243a3cd.png);background-position:50%;background-repeat:no-repeat;background-size:50rem;padding:10rem 0!important}code{border:.15rem solid}.markdown a{font-weight:600;text-decoration:underline}.main-wrapper img{border-radius:1rem;outline:var(--ifm-font-color-base) .2rem solid;outline-offset:-1px}.header-slack-link:before{background-color:var(--ifm-navbar-link-color);content:"";display:flex;height:24px;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M126.12 315.1A47.06 47.06 0 1 1 79.06 268h47.06ZM149.84 315.1a47.06 47.06 0 0 1 94.12 0v117.84a47.06 47.06 0 1 1-94.12 0ZM196.9 126.12A47.06 47.06 0 1 1 244 79.06v47.06ZM196.9 149.84a47.06 47.06 0 0 1 0 94.12H79.06a47.06 47.06 0 0 1 0-94.12ZM385.88 196.9a47.06 47.06 0 1 1 47.06 47.1h-47.06ZM362.16 196.9a47.06 47.06 0 0 1-94.12 0V79.06a47.06 47.06 0 1 1 94.12 0ZM315.1 385.88a47.06 47.06 0 1 1-47.1 47.06v-47.06ZM315.1 362.16a47.06 47.06 0 0 1 0-94.12h117.84a47.06 47.06 0 1 1 0 94.12Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M126.12 315.1A47.06 47.06 0 1 1 79.06 268h47.06ZM149.84 315.1a47.06 47.06 0 0 1 94.12 0v117.84a47.06 47.06 0 1 1-94.12 0ZM196.9 126.12A47.06 47.06 0 1 1 244 79.06v47.06ZM196.9 149.84a47.06 47.06 0 0 1 0 94.12H79.06a47.06 47.06 0 0 1 0-94.12ZM385.88 196.9a47.06 47.06 0 1 1 47.06 47.1h-47.06ZM362.16 196.9a47.06 47.06 0 0 1-94.12 0V79.06a47.06 47.06 0 1 1 94.12 0ZM315.1 385.88a47.06 47.06 0 1 1-47.1 47.06v-47.06ZM315.1 362.16a47.06 47.06 0 0 1 0-94.12h117.84a47.06 47.06 0 1 1 0 94.12Z'/%3E%3C/svg%3E");transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default);width:24px}.header-slack-link:hover:before{background-color:var(--ifm-navbar-link-hover-color)}.header-github-link:before{background-color:var(--ifm-navbar-link-color);content:"";display:flex;height:24px;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default);width:24px}.header-github-link:hover:before{background-color:var(--ifm-navbar-link-hover-color)}.video{aspect-ratio:1.777;height:auto;width:80%}.video-container{display:flex;justify-content:center}.navbar__link svg{display:none}.tabList__CuJ{margin-bottom:var(--ifm-leading)}.tabItem_LNqP{margin-top:0!important}.tabItem_Ymn6>:last-child{margin-bottom: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%}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible} + );--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);color:var(--ifm-alert-foreground-color);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;text-transform:uppercase}.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{color:var(--ifm-alert-foreground-color);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)}.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);display:inline-block;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);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);--ifm-badge-border-color:var(--ifm-badge-background-color);color:var(--ifm-color-black)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning);--ifm-badge-border-color:var(--ifm-badge-background-color)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger);--ifm-badge-border-color:var(--ifm-badge-background-color)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item{display:inline-block}.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);color:var(--ifm-font-color-base);display:inline-block;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;transition-timing-function:var(--ifm-transition-timing-default)}.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;display:inline-block;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;transition-timing-function:var(--ifm-transition-timing-default);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button:hover{text-decoration:none}.button--outline{--ifm-button-background-color:#0000;--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--outline.button--active,.button--outline:active,.button--outline:hover{--ifm-button-color:var(--ifm-font-color-base-inverse)}.button--link{--ifm-button-background-color:#0000;--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)}.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}: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);display:flex;flex-direction:column;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image: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{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;list-style:none;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)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.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:"";display:inline-block;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{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)}.footer__item{margin-top:0}.footer__items{margin-bottom:0}[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{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{list-style:none;margin:0;padding-left:0}.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){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{border-radius:.25rem;display:flex;flex-wrap:wrap;position:relative;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.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;border-radius:.25rem;display:flex;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.menu__caret:hover,.menu__link:hover{background:var(--ifm-menu-color-background-hover)}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25;padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none;transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50% /2rem 2rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;margin-left:auto;min-width:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50% /2rem 2rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem}.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)}.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;color:var(--ifm-navbar-link-color);display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__logo img{height:100%}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{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)}.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link{color:var(--ifm-navbar-link-color);font-weight:var(--ifm-font-weight-semibold)}.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-navbar-link-hover-color:var(--ifm-color-primary);--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);bottom:0;box-shadow:var(--ifm-global-shadow-md);left:0;opacity:0;overflow-x:hidden;position:fixed;top:0;transform:translate3d(-100%,0,0);transition-duration:var(--ifm-transition-fast);transition-property:opacity,visibility,transform;transition-timing-function:ease-in-out;visibility:hidden;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{transform:translateZ(0)}.navbar-sidebar__backdrop{background-color:#0009;bottom:0;left:0;opacity:0;position:fixed;right:0;top:0;transition-duration:var(--ifm-transition-fast);transition-property:opacity,visibility;transition-timing-function:ease-in-out;visibility:hidden}.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));transform:translateZ(0);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}.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{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}.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{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;font-weight:var(--ifm-font-weight-bold);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;font-weight:var(--ifm-font-weight-bold);margin-bottom:0;overflow-x:auto;padding-left:0}.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-500:var(--ifm-color-gray-500);--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}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__item{display:none}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}}@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}}@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{.footer,.menu,.navbar,.pagination-nav,.table-of-contents{display:none}.tabs{page-break-inside:avoid}}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary)}#nprogress{pointer-events:none}#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}:root{--ifm-code-font-size:95%;--ifm-navbar-link-color:var(--ifm-color-primary);--ifm-link-color:var(--ifm-color-primary-lighter);--docsearch-muted-color:var(--ifm-font-color-base)!important;--docusaurus-highlighted-code-line-bg:#0000001a;--white-filter:invert(100%) sepia(100%) saturate(0%) hue-rotate(336deg) brightness(110%) contrast(101%);--brown-filter:invert(24%) sepia(12%) saturate(1484%) hue-rotate(334deg) brightness(100%) contrast(87%);--black-filter:brightness(0%);--docusaurus-highlighted-code-line-bg:#e6e6e6}[data-theme=light]{--ifm-color-primary:#5c4033;--ifm-color-primary-dark:#72452d;--ifm-color-primary-darker:#6c412a;--ifm-color-primary-darkest:#593623;--ifm-color-primary-light:#8c5537;--ifm-color-primary-lighter:#925939;--ifm-color-primary-lightest:#a56441;code{border-color:#0000001a}.navbar__logo img{filter:var(--brown-filter)}.feature-img{filter:var(--black-filter)}}[data-theme=dark]{--ifm-color-primary:#d6d6d6;--ifm-color-primary-dark:#c1c1c1;--ifm-color-primary-darker:#b6b6b6;--ifm-color-primary-darkest:#969696;--ifm-color-primary-light:#ebebeb;--ifm-color-primary-lighter:#f6f6f6;--ifm-color-primary-lightest:#fff;--docsearch-highlight-color:#7b7bc4!important;--docusaurus-highlighted-code-line-bg:#494949;code{border-color:#ffffff1a}.hero{color:#fff;--ifm-hero-background-color:#5c4033!important}.feature-img,.navbar__logo img{filter:var(--white-filter)}}.hero{background-image:url(/assets/images/logo-opaque-551b888fde924e3c5b727ac91243a3cd.png);background-position:50%;background-repeat:no-repeat;background-size:50rem;padding:10rem 0!important}code{border:.15rem solid}.markdown a{font-weight:600;text-decoration:underline}.main-wrapper img{border-radius:1rem;outline:var(--ifm-font-color-base) .2rem solid;outline-offset:-1px}.header-slack-link:before{background-color:var(--ifm-navbar-link-color);content:"";display:flex;height:24px;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M126.12 315.1A47.06 47.06 0 1 1 79.06 268h47.06ZM149.84 315.1a47.06 47.06 0 0 1 94.12 0v117.84a47.06 47.06 0 1 1-94.12 0ZM196.9 126.12A47.06 47.06 0 1 1 244 79.06v47.06ZM196.9 149.84a47.06 47.06 0 0 1 0 94.12H79.06a47.06 47.06 0 0 1 0-94.12ZM385.88 196.9a47.06 47.06 0 1 1 47.06 47.1h-47.06ZM362.16 196.9a47.06 47.06 0 0 1-94.12 0V79.06a47.06 47.06 0 1 1 94.12 0ZM315.1 385.88a47.06 47.06 0 1 1-47.1 47.06v-47.06ZM315.1 362.16a47.06 47.06 0 0 1 0-94.12h117.84a47.06 47.06 0 1 1 0 94.12Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M126.12 315.1A47.06 47.06 0 1 1 79.06 268h47.06ZM149.84 315.1a47.06 47.06 0 0 1 94.12 0v117.84a47.06 47.06 0 1 1-94.12 0ZM196.9 126.12A47.06 47.06 0 1 1 244 79.06v47.06ZM196.9 149.84a47.06 47.06 0 0 1 0 94.12H79.06a47.06 47.06 0 0 1 0-94.12ZM385.88 196.9a47.06 47.06 0 1 1 47.06 47.1h-47.06ZM362.16 196.9a47.06 47.06 0 0 1-94.12 0V79.06a47.06 47.06 0 1 1 94.12 0ZM315.1 385.88a47.06 47.06 0 1 1-47.1 47.06v-47.06ZM315.1 362.16a47.06 47.06 0 0 1 0-94.12h117.84a47.06 47.06 0 1 1 0 94.12Z'/%3E%3C/svg%3E");transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default);width:24px}.header-slack-link:hover:before{background-color:var(--ifm-navbar-link-hover-color)}.header-slack-link{padding-right:16px}.header-github-link:before{background-color:var(--ifm-navbar-link-color);content:"";display:flex;height:24px;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default);width:24px}.header-github-link:hover:before{background-color:var(--ifm-navbar-link-hover-color)}.video{aspect-ratio:1.777;height:auto;width:80%}.video-container{display:flex;justify-content:center}.navbar__link svg{display:none}.tabList__CuJ{margin-bottom:var(--ifm-leading)}.tabItem_LNqP{margin-top:0!important}.tabItem_Ymn6>:last-child{margin-bottom: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%}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible} /*! @docsearch/css 3.6.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.302);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}:root{--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base)}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.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}.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;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}:root{--docusaurus-announcement-bar-height:auto}.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)}html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.announcementBarContent_xLdY{flex:1 1 auto}@media print{.announcementBar_mb4j{display:none}}@media (min-width:997px){:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{-webkit-tap-highlight-color:transparent;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)}[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR{display:none}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}.themedComponent_mlkZ{display:none}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}:root{--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}@media (min-width:997px){.collapseSidebarButton_PEFL{background-color:var(--docusaurus-collapse-button-bg);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)}[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.menuExternalLink_NmtK{align-items:center}@media (min-width:997px){.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}}@media (min-width:997px){@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}}.sidebarLogo_isFc{display:none}@media (min-width:997px){.expandButton_TmdG{align-items:center;background-color:var(--docusaurus-collapse-button-bg);display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.expandButtonIcon_i1dp{transform:rotate(0)}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}}:root{--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.docSidebarContainer_YfHR{display:none}@media (min-width:997px){.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{display:flex;width:100%}@media (min-width:997px){.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}}.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarSearchContainer_Bca1:empty{display:none}@media (max-width:996px){.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media (min-width:997px){.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}@media (max-width:996px){.colorModeToggle_DEke{display:none}}.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)}.footerLogoLink_BH7S:hover{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:none}#__docusaurus-base-url-issue-banner-container{display:none}.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:"#"}.hash-link:focus,:hover>.hash-link{opacity:1}body,html{height:100%}.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%}.sidebar_re4s{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLink_mo7H:hover{text-decoration:none}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}@media (max-width:996px){.sidebar_re4s{display:none}}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:none}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}@media only screen and (max-width:996px){.searchQueryColumn_RTkw{max-width:60%!important}.searchVersionColumn_ypXd{max-width:40%!important}.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA{max-width:40%!important;padding-left:0!important}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}.loadingSpinner_XVxU{animation:loading-spin_vzvp 1s linear infinite;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes loading-spin_vzvp{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}.title_f1Hy{font-size:3rem}@media (max-width:576px){.title_f1Hy{font-size:2rem}}.container_mt6G{font-size:.9rem}[data-theme=dark] .githubSvg_Uu4N{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N{fill:var(--dark)}[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .xSvg_y3PF{fill:var(--dark)}:root{--docusaurus-blog-social-icon-size:1rem}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;overflow:hidden;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical}.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size);line-height:0}.authorSocialLink_owbf{margin-right:.4rem;width:var(--docusaurus-blog-social-icon-size)}.authorSocialIcon_XYv3{height:var(--docusaurus-blog-social-icon-size);width:var(--docusaurus-blog-social-icon-size)}.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;overflow:hidden;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical}.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}.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}.features_t9lD{align-items:center;display:flex;padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{background:var(--prism-background-color);border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);color:var(--prism-color);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}.codeBlockStandalone_MEMb{padding: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}@media print{.codeBlockLines_e6Vv{white-space:pre-wrap}}.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;background:var(--prism-background-color);border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);color:var(--prism-color);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:line-count;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(line-count);opacity:.4}.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.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}:root{--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.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}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.tags_jXut{display:inline}.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;list-style:none;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(0deg);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before{transform:rotate(90deg)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child{margin-bottom:0}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}@media (min-width:997px){.lastUpdated_JAkA{text-align:right}}.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{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}.tocCollapsibleContent_vkbj a{display:block}.tocCollapsibleExpanded_sAul{transform:none}@media (min-width:997px){.tocMobile_ITEo{display:none}}@media print{.tocMobile_ITEo{display:none}}.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)}.containsTaskList_mC6p{list-style:none}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}@media (max-width:996px){.tableOfContents_bqdL{display:none}.docItemContainer_F8PC{padding:0 .3rem}}.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);text-transform:uppercase}.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)}.admonitionContent_BuS1>:last-child{margin-bottom:0}.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}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*{margin-top:0}@media (min-width:997px){.docItemCol_VOVn{max-width:75%!important}}.mdxPageWrapper_j9I6{justify-content:center} \ No newline at end of file diff --git a/assets/js/0058b4c6.b64d5a7a.js b/assets/js/0058b4c6.b64d5a7a.js deleted file mode 100644 index e2653699c..000000000 --- a/assets/js/0058b4c6.b64d5a7a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[849],{6164: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":"Overview","href":"/docs/overview","docId":"overview","unlisted":false},{"type":"link","label":"Architecture and Guarantees","href":"/docs/architecture-and-guarantees","docId":"architecture-and-guarantees","unlisted":false},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Workflows","href":"/docs/concepts/workflows","docId":"concepts/workflows","unlisted":false},{"type":"link","label":"Tasks","href":"/docs/concepts/tasks","docId":"concepts/tasks","unlisted":false},{"type":"link","label":"External Events and Interrupts","href":"/docs/concepts/external-events","docId":"concepts/external-events","unlisted":false},{"type":"link","label":"User Tasks","href":"/docs/concepts/user-tasks","docId":"concepts/user-tasks","unlisted":false},{"type":"link","label":"Workflow Events","href":"/docs/concepts/workflow-events","docId":"concepts/workflow-events","unlisted":false},{"type":"link","label":"Authz, Principals, and Tenants","href":"/docs/concepts/principals-and-tenants","docId":"concepts/principals-and-tenants","unlisted":false},{"type":"category","label":"Advanced Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"WfSpec Versioning","href":"/docs/concepts/advanced/wfspec-versioning","docId":"concepts/advanced/wfspec-versioning","unlisted":false}],"href":"/docs/concepts/advanced/"}],"href":"/docs/concepts/"},{"type":"category","label":"Developer Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Quickstart Installation","href":"/docs/developer-guide/install","docId":"developer-guide/install","unlisted":false},{"type":"link","label":"Configuring the Clients","href":"/docs/developer-guide/client-configuration","docId":"developer-guide/client-configuration","unlisted":false},{"type":"link","label":"LittleHorse CLI","href":"/docs/developer-guide/lhctl","docId":"developer-guide/lhctl","unlisted":false},{"type":"link","label":"Developing Task Workers","href":"/docs/developer-guide/task-worker-development","docId":"developer-guide/task-worker-development","unlisted":false},{"type":"category","label":"WfSpec Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basics","href":"/docs/developer-guide/wfspec-development/basics","docId":"developer-guide/wfspec-development/basics","unlisted":false},{"type":"link","label":"Conditionals and Loops","href":"/docs/developer-guide/wfspec-development/conditionals","docId":"developer-guide/wfspec-development/conditionals","unlisted":false},{"type":"link","label":"Mutating Variables","href":"/docs/developer-guide/wfspec-development/mutating-variables","docId":"developer-guide/wfspec-development/mutating-variables","unlisted":false},{"type":"link","label":"External Events","href":"/docs/developer-guide/wfspec-development/external-events","docId":"developer-guide/wfspec-development/external-events","unlisted":false},{"type":"link","label":"Interrupts","href":"/docs/developer-guide/wfspec-development/interrupts","docId":"developer-guide/wfspec-development/interrupts","unlisted":false},{"type":"link","label":"Exception Handling","href":"/docs/developer-guide/wfspec-development/exception-handling","docId":"developer-guide/wfspec-development/exception-handling","unlisted":false},{"type":"link","label":"Child Threads","href":"/docs/developer-guide/wfspec-development/child-threads","docId":"developer-guide/wfspec-development/child-threads","unlisted":false},{"type":"link","label":"User Tasks","href":"/docs/developer-guide/wfspec-development/user-tasks","docId":"developer-guide/wfspec-development/user-tasks","unlisted":false},{"type":"category","label":"Advanced Features","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Waiting for Conditions","href":"/docs/developer-guide/wfspec-development/advanced/wait-for-condition","docId":"developer-guide/wfspec-development/advanced/wait-for-condition","unlisted":false}],"href":"/docs/developer-guide/wfspec-development/advanced/"}],"href":"/docs/developer-guide/wfspec-development/"},{"type":"category","label":"Using the LittleHorse API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Background","href":"/docs/developer-guide/grpc/basics","docId":"developer-guide/grpc/basics","unlisted":false},{"type":"link","label":"Managing Metadata","href":"/docs/developer-guide/grpc/managing-metadata","docId":"developer-guide/grpc/managing-metadata","unlisted":false},{"type":"link","label":"Running a Workflow","href":"/docs/developer-guide/grpc/running-workflows","docId":"developer-guide/grpc/running-workflows","unlisted":false},{"type":"link","label":"Posting ExternalEvents","href":"/docs/developer-guide/grpc/posting-external-events","docId":"developer-guide/grpc/posting-external-events","unlisted":false},{"type":"link","label":"Handling User Tasks","href":"/docs/developer-guide/grpc/user-tasks","docId":"developer-guide/grpc/user-tasks","unlisted":false}],"href":"/docs/developer-guide/grpc/"}],"href":"/docs/developer-guide/"},{"type":"category","label":"Operations","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Operations Overview","href":"/docs/operations/overview","docId":"operations/overview","unlisted":false},{"type":"link","label":"Server Configurations","href":"/docs/operations/server-configuration","docId":"operations/server-configuration","unlisted":false},{"type":"link","label":"Dashboard Configurations","href":"/docs/operations/dashboard-configuration","docId":"operations/dashboard-configuration","unlisted":false},{"type":"link","label":"Workers/Clients Configurations","href":"/docs/operations/client-configuration","docId":"operations/client-configuration","unlisted":false},{"type":"category","label":"Docker Compose Examples","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basic Deployment","href":"/docs/operations/docker-compose/basic","docId":"operations/docker-compose/basic","unlisted":false},{"type":"link","label":"Using Confluent Cloud","href":"/docs/operations/docker-compose/confluent-cloud","docId":"operations/docker-compose/confluent-cloud","unlisted":false},{"type":"link","label":"Three LittleHorse Orchestrators","href":"/docs/operations/docker-compose/three-servers","docId":"operations/docker-compose/three-servers","unlisted":false}],"href":"/docs/operations/docker-compose/"}],"href":"/docs/operations/"},{"type":"link","label":"Tips, Pointers, and FAQ","href":"/docs/faq","docId":"faq","unlisted":false},{"type":"link","label":"LittleHorse API Reference","href":"/docs/api","docId":"api","unlisted":false}]},"docs":{"api":{"id":"api","title":"LittleHorse API Reference","description":"The LittleHorse Server exposes a GRPC API to its clients. For most general usage of LittleHorse, you will not need to","sidebar":"tutorialSidebar"},"architecture-and-guarantees":{"id":"architecture-and-guarantees","title":"Architecture and Guarantees","description":"LittleHorse is a horizontally scalable, high-performance system with enterprise-grade security integrations to help you build systems that support even the most mission-critical workloads.","sidebar":"tutorialSidebar"},"concepts/advanced/advanced":{"id":"concepts/advanced/advanced","title":"Advanced Concepts","description":"LittleHorse is an intuitive system that generally works as you might expect it to. However, there are some advanced use-cases for which a deeper understanding of the system would be helpful.","sidebar":"tutorialSidebar"},"concepts/advanced/wfspec-versioning":{"id":"concepts/advanced/wfspec-versioning","title":"WfSpec Versioning","description":"A WfSpec is a versioned resource. Each WfSpec is uniquely identified by its name (a String), its majorVersion (an auto-incremented number, managed by LittleHorse), and its revision (another auto-incremented number).","sidebar":"tutorialSidebar"},"concepts/concepts":{"id":"concepts/concepts","title":"Concepts","description":"The LittleHorse Server is, at its core, a Workflow Engine. What makes LittleHorse unique is that it is built with developers in mind. The way users define workflow specifications in LittleHorse (a WfSpec) was designed from the ground up to be developer-friendly and have concepts that are analogous to the primitives used in day-to-day programming languages.","sidebar":"tutorialSidebar"},"concepts/external-events":{"id":"concepts/external-events","title":"External Events and Interrupts","description":"This section is not a Developer Guide; if you want to learn how to create an ExternalEventDef, post an ExternalEvent, wait for an ExternalEvent in a Workflow, or register an Interrupt Handler, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"concepts/principals-and-tenants":{"id":"concepts/principals-and-tenants","title":"Authz, Principals, and Tenants","description":"In order to provide a secure platform for use at large enterprises, LittleHorse supports multi-tenancy natively. This is accomplished through two API Objects:","sidebar":"tutorialSidebar"},"concepts/tasks":{"id":"concepts/tasks","title":"Tasks","description":"This section is not a Developer Guide; if you want to learn how to write a Task Worker, how to register a TaskDef, or how to call a Task inside a Workflow, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"concepts/user-tasks":{"id":"concepts/user-tasks","title":"User Tasks","description":"This section is not a Developer Guide; if you want to learn how to Create a UserTaskDef, how to add a User Task Node to a Workflow, or how to handle User Tasks with GRPC, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"concepts/workflow-events":{"id":"concepts/workflow-events","title":"Workflow Events","description":"While External Events enable workflows to respond to events from the outside world, some applications may need to respond to events thrown from within workflows. Workflow Events enable LittleHorse Clients to wait for a specific event to occur within a workflow.","sidebar":"tutorialSidebar"},"concepts/workflows":{"id":"concepts/workflows","title":"Workflows","description":"This section is not a Developer Guide; if you want to learn how to define a workflow or how to run a workflow, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"developer-guide/client-configuration":{"id":"developer-guide/client-configuration","title":"Configuring the Clients","description":"In every LittleHorse SDK, there is an LHConfig class or struct that handles the configuration required for allowing your clients and Task Workers to talk to LittleHorse Server.","sidebar":"tutorialSidebar"},"developer-guide/developer-guide":{"id":"developer-guide/developer-guide","title":"Developer Guide","description":"The LittleHorse Developer Guide tells you everything you need to know about LittleHorse from the Jedi Youngling level (installing clients, running the server) to the Jedi Master level (advanced WfSpec development, advanced security, etc).","sidebar":"tutorialSidebar"},"developer-guide/grpc/basics":{"id":"developer-guide/grpc/basics","title":"Background","description":"The public LittleHorse API is a GRPC service exposed by the LH Server. We have complete auto-generated documentation for our GRPC Service and Protocol Buffers on our docs site. For the highly curious readers, you can find the actual protocol buffer code that underpins our system in our source code repository.","sidebar":"tutorialSidebar"},"developer-guide/grpc/grpc":{"id":"developer-guide/grpc/grpc","title":"Using the LittleHorse API","description":"The public API exposed by the LittleHorse Server is a GRPC server, defined here. We chose GRPC for multiple reasons, including:","sidebar":"tutorialSidebar"},"developer-guide/grpc/managing-metadata":{"id":"developer-guide/grpc/managing-metadata","title":"Managing Metadata","description":"Before you can run a WfRun, you need to create your WfSpec\'s! This guide shows you how to do that.","sidebar":"tutorialSidebar"},"developer-guide/grpc/posting-external-events":{"id":"developer-guide/grpc/posting-external-events","title":"Posting ExternalEvents","description":"You can post an ExternalEvent using the PutExternalEvent rpc call.","sidebar":"tutorialSidebar"},"developer-guide/grpc/running-workflows":{"id":"developer-guide/grpc/running-workflows","title":"Running a Workflow","description":"You can run a WfSpec, thus creating a WfRun, in two ways:","sidebar":"tutorialSidebar"},"developer-guide/grpc/user-tasks":{"id":"developer-guide/grpc/user-tasks","title":"Handling User Tasks","description":"User Tasks enable a ThreadRun to block until a human user provides some input into the workflow. Additionally, User Tasks have several useful hooks such as automatic reassignment, reminders, and auditing capabilities.","sidebar":"tutorialSidebar"},"developer-guide/install":{"id":"developer-guide/install","title":"Quickstart Installation","description":"The minimum to get started with LittleHorse is to install the lhctl CLI, run the server in docker, and use your choice of the Java, GoLang, or Python client libraries.","sidebar":"tutorialSidebar"},"developer-guide/lhctl":{"id":"developer-guide/lhctl","title":"LittleHorse CLI","description":"lhctl is the LittleHorse CLI. It allows you to manage metadata in your system, observe and analyze your WfRuns, and also perform rudimentary actions such as running a WfRun.","sidebar":"tutorialSidebar"},"developer-guide/task-worker-development":{"id":"developer-guide/task-worker-development","title":"Developing Task Workers","description":"Each LittleHorse SDK provides an LHTaskWorker object or struct which lets you turn an arbitrary function or method into a LittleHorse Task.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/advanced/advanced":{"id":"developer-guide/wfspec-development/advanced/advanced","title":"Advanced Features","description":"If you\'ve made it here, congratulations! You are no longer a Padawan.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/advanced/wait-for-condition":{"id":"developer-guide/wfspec-development/advanced/wait-for-condition","title":"Waiting for Conditions","description":"\x3c!-- We really need docusaurus versioning. This feature isn\'t released yet...if someone finds it","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/basics":{"id":"developer-guide/wfspec-development/basics","title":"Basics","description":"To develop a WfSpec in LittleHorse, you can use the Workflow struct or object in our SDK\'s. Generally, the Workflow entity constructor requires two arguments:","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/child-threads":{"id":"developer-guide/wfspec-development/child-threads","title":"Child Threads","description":"You can use WorkflowThread#spawnThread() and WorkflowThread#waitForThreads() to launch and wait for Child ThreadRuns, respectively. This is useful if you want to execute multiple pieces of business logic in parallel.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/conditionals":{"id":"developer-guide/wfspec-development/conditionals","title":"Conditionals and Loops","description":"In a LittleHorse WfSpec, the Edge structure tells the workflow scheduler what Node to advance to next. The Edge has a conditions field, which allows you to specify different control flow paths based on variables in your WfRun. This is analogous to if/else in programming.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/exception-handling":{"id":"developer-guide/wfspec-development/exception-handling","title":"Exception Handling","description":"In LittleHorse, a Failure is analogous to an Exception in Programming.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/external-events":{"id":"developer-guide/wfspec-development/external-events","title":"External Events","description":"Before you can use an ExternalEventDef in a WfSpec, you need to create the ExternalEventDef metadata object in LittleHorse. You can do that following our metadata management docs.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/interrupts":{"id":"developer-guide/wfspec-development/interrupts","title":"Interrupts","description":"As per the Concepts Docs, you can set up a ThreadSpec such that when an ExternalEvent of a certain type comes in, the ThreadRun is interrupted and an Interrupt Handler ThreadRun is spawned.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/mutating-variables":{"id":"developer-guide/wfspec-development/mutating-variables","title":"Mutating Variables","description":"Recall from the Concepts Documentation that every Node can have zero or more VariableMutations on it. A VariableMutation changes the value of a ThreadRun\'s Variables.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/user-tasks":{"id":"developer-guide/wfspec-development/user-tasks","title":"User Tasks","description":"User Tasks allow you to manage tasks involving humans alongside standard computer tasks in your LittleHorse Workflow.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/wfspec-development":{"id":"developer-guide/wfspec-development/wfspec-development","title":"WfSpec Development","description":"This section shows you how to build WfSpecs using our SDK\'s in Python, Java, and GoLang, starting from Youngling all the way up to the LittleHorse Master level.","sidebar":"tutorialSidebar"},"faq":{"id":"faq","title":"Tips, Pointers, and FAQ","description":"We do our best to make our documentation easy to navigate; however, LittleHorse has a lot of features and it may not always be easy to find what you are looking for.","sidebar":"tutorialSidebar"},"operations/client-configuration":{"id":"operations/client-configuration","title":"Workers/Clients Configurations","description":"Client","sidebar":"tutorialSidebar"},"operations/dashboard-configuration":{"id":"operations/dashboard-configuration","title":"Dashboard Configurations","description":"These configurations apply only to the ghcr.io/littlehorse-enterprises/littlehorse/lh-dashboard docker image, and not when running the LH Dashboard compiled from source. We have an open ticket in our OSS repo to homologate the configurations and also improve the startup time of the lh-dashboard docker image.","sidebar":"tutorialSidebar"},"operations/docker-compose/basic":{"id":"operations/docker-compose/basic","title":"Basic Deployment","description":"This example shows how to run LittleHorse with a single Server and the dashboard, without authentication, using Docker Compose, accessible on localhost:2023.","sidebar":"tutorialSidebar"},"operations/docker-compose/confluent-cloud":{"id":"operations/docker-compose/confluent-cloud","title":"Using Confluent Cloud","description":"LittleHorse requires Apache Kafka as its only hard dependency. Kafka is the source-of-truth for the state of a LittleHorse Cluster as all data is stored in Kafka Streams state stores (therefore, the durability of the Changelog Topics determines the durability of the LittleHorse Cluster\'s data).","sidebar":"tutorialSidebar"},"operations/docker-compose/docker-compose":{"id":"operations/docker-compose/docker-compose","title":"Docker Compose Examples","description":"This tab contains a series of examples to get LittleHorse working in Docker Compose. We recognize that not many people use Docker Compose in production, however we see value in docker compose examples because they serve as clear documentation of how to configure LittleHorse.","sidebar":"tutorialSidebar"},"operations/docker-compose/three-servers":{"id":"operations/docker-compose/three-servers","title":"Three LittleHorse Orchestrators","description":"LittleHorse is a horizontally scalable system. As such, you can configure multiple LittleHorse Orchestrator servers to act as a cluster. This provides the following benefits:","sidebar":"tutorialSidebar"},"operations/operations":{"id":"operations/operations","title":"Operations","description":"LittleHorse OSS, which can be found on our GitHub, contains all of the LittleHorse functionality. It is an enterprise-ready workflow engine that can scale to the largest workloads while meeting the most strict security requirements when deployed on premise.","sidebar":"tutorialSidebar"},"operations/overview":{"id":"operations/overview","title":"Operations Overview","description":"A minimal LittleHorse cluster has the following components:","sidebar":"tutorialSidebar"},"operations/server-configuration":{"id":"operations/server-configuration","title":"Server Configurations","description":"This page contains all of the configurations that are accepted by the LittleHorse Server. We recommend that you set these configurations as environment variables for the ghcr.io/littlehorse-enterprises/littlehorse/lh-server image.","sidebar":"tutorialSidebar"},"overview":{"id":"overview","title":"LittleHorse Overview","description":"The LittleHorse Orchestrator is a high-performance platform for building workflow-driven applications for a variety of use-cases, including:","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/0058b4c6.be041ba5.js b/assets/js/0058b4c6.be041ba5.js new file mode 100644 index 000000000..87f92f950 --- /dev/null +++ b/assets/js/0058b4c6.be041ba5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[849],{6164: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":"Overview","href":"/docs/overview","docId":"overview","unlisted":false},{"type":"link","label":"Architecture and Guarantees","href":"/docs/architecture-and-guarantees","docId":"architecture-and-guarantees","unlisted":false},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Workflows","href":"/docs/concepts/workflows","docId":"concepts/workflows","unlisted":false},{"type":"link","label":"Tasks","href":"/docs/concepts/tasks","docId":"concepts/tasks","unlisted":false},{"type":"link","label":"External Events and Interrupts","href":"/docs/concepts/external-events","docId":"concepts/external-events","unlisted":false},{"type":"link","label":"User Tasks","href":"/docs/concepts/user-tasks","docId":"concepts/user-tasks","unlisted":false},{"type":"link","label":"Workflow Events","href":"/docs/concepts/workflow-events","docId":"concepts/workflow-events","unlisted":false},{"type":"link","label":"Authz, Principals, and Tenants","href":"/docs/concepts/principals-and-tenants","docId":"concepts/principals-and-tenants","unlisted":false},{"type":"category","label":"Advanced Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"WfSpec Versioning","href":"/docs/concepts/advanced/wfspec-versioning","docId":"concepts/advanced/wfspec-versioning","unlisted":false}],"href":"/docs/concepts/advanced/"}],"href":"/docs/concepts/"},{"type":"category","label":"Developer Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Quickstart Installation","href":"/docs/developer-guide/install","docId":"developer-guide/install","unlisted":false},{"type":"link","label":"Configuring the Clients","href":"/docs/developer-guide/client-configuration","docId":"developer-guide/client-configuration","unlisted":false},{"type":"link","label":"LittleHorse CLI","href":"/docs/developer-guide/lhctl","docId":"developer-guide/lhctl","unlisted":false},{"type":"link","label":"Developing Task Workers","href":"/docs/developer-guide/task-worker-development","docId":"developer-guide/task-worker-development","unlisted":false},{"type":"category","label":"WfSpec Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basics","href":"/docs/developer-guide/wfspec-development/basics","docId":"developer-guide/wfspec-development/basics","unlisted":false},{"type":"link","label":"Conditionals and Loops","href":"/docs/developer-guide/wfspec-development/conditionals","docId":"developer-guide/wfspec-development/conditionals","unlisted":false},{"type":"link","label":"Mutating Variables","href":"/docs/developer-guide/wfspec-development/mutating-variables","docId":"developer-guide/wfspec-development/mutating-variables","unlisted":false},{"type":"link","label":"External Events","href":"/docs/developer-guide/wfspec-development/external-events","docId":"developer-guide/wfspec-development/external-events","unlisted":false},{"type":"link","label":"Interrupts","href":"/docs/developer-guide/wfspec-development/interrupts","docId":"developer-guide/wfspec-development/interrupts","unlisted":false},{"type":"link","label":"Exception Handling","href":"/docs/developer-guide/wfspec-development/exception-handling","docId":"developer-guide/wfspec-development/exception-handling","unlisted":false},{"type":"link","label":"Child Threads","href":"/docs/developer-guide/wfspec-development/child-threads","docId":"developer-guide/wfspec-development/child-threads","unlisted":false},{"type":"link","label":"User Tasks","href":"/docs/developer-guide/wfspec-development/user-tasks","docId":"developer-guide/wfspec-development/user-tasks","unlisted":false},{"type":"category","label":"Advanced Features","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Waiting for Conditions","href":"/docs/developer-guide/wfspec-development/advanced/wait-for-condition","docId":"developer-guide/wfspec-development/advanced/wait-for-condition","unlisted":false},{"type":"link","label":"Throwing Workflow Events","href":"/docs/developer-guide/wfspec-development/advanced/throwing-events","docId":"developer-guide/wfspec-development/advanced/throwing-events","unlisted":false}],"href":"/docs/developer-guide/wfspec-development/advanced/"}],"href":"/docs/developer-guide/wfspec-development/"},{"type":"category","label":"Using the LittleHorse API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Background","href":"/docs/developer-guide/grpc/basics","docId":"developer-guide/grpc/basics","unlisted":false},{"type":"link","label":"Managing Metadata","href":"/docs/developer-guide/grpc/managing-metadata","docId":"developer-guide/grpc/managing-metadata","unlisted":false},{"type":"link","label":"Running a Workflow","href":"/docs/developer-guide/grpc/running-workflows","docId":"developer-guide/grpc/running-workflows","unlisted":false},{"type":"link","label":"Posting ExternalEvents","href":"/docs/developer-guide/grpc/posting-external-events","docId":"developer-guide/grpc/posting-external-events","unlisted":false},{"type":"link","label":"Handling User Tasks","href":"/docs/developer-guide/grpc/user-tasks","docId":"developer-guide/grpc/user-tasks","unlisted":false},{"type":"category","label":"Advanced","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Await Workflow Events","href":"/docs/developer-guide/grpc/advanced/await-workflow-events","docId":"developer-guide/grpc/advanced/await-workflow-events","unlisted":false}],"href":"/docs/developer-guide/grpc/advanced/"}],"href":"/docs/developer-guide/grpc/"}],"href":"/docs/developer-guide/"},{"type":"category","label":"Operations","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Operations Overview","href":"/docs/operations/overview","docId":"operations/overview","unlisted":false},{"type":"link","label":"Server Configurations","href":"/docs/operations/server-configuration","docId":"operations/server-configuration","unlisted":false},{"type":"link","label":"Dashboard Configurations","href":"/docs/operations/dashboard-configuration","docId":"operations/dashboard-configuration","unlisted":false},{"type":"link","label":"Workers/Clients Configurations","href":"/docs/operations/client-configuration","docId":"operations/client-configuration","unlisted":false},{"type":"category","label":"Docker Compose Examples","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basic Deployment","href":"/docs/operations/docker-compose/basic","docId":"operations/docker-compose/basic","unlisted":false},{"type":"link","label":"Using Confluent Cloud","href":"/docs/operations/docker-compose/confluent-cloud","docId":"operations/docker-compose/confluent-cloud","unlisted":false},{"type":"link","label":"Three LittleHorse Orchestrators","href":"/docs/operations/docker-compose/three-servers","docId":"operations/docker-compose/three-servers","unlisted":false}],"href":"/docs/operations/docker-compose/"}],"href":"/docs/operations/"},{"type":"link","label":"Tips, Pointers, and FAQ","href":"/docs/faq","docId":"faq","unlisted":false},{"type":"link","label":"LittleHorse API Reference","href":"/docs/api","docId":"api","unlisted":false}]},"docs":{"api":{"id":"api","title":"LittleHorse API Reference","description":"The LittleHorse Server exposes a GRPC API to its clients. For most general usage of LittleHorse, you will not need to","sidebar":"tutorialSidebar"},"architecture-and-guarantees":{"id":"architecture-and-guarantees","title":"Architecture and Guarantees","description":"LittleHorse is a horizontally scalable, high-performance system with enterprise-grade security integrations to help you build systems that support even the most mission-critical workloads.","sidebar":"tutorialSidebar"},"concepts/advanced/advanced":{"id":"concepts/advanced/advanced","title":"Advanced Concepts","description":"LittleHorse is an intuitive system that generally works as you might expect it to. However, there are some advanced use-cases for which a deeper understanding of the system would be helpful.","sidebar":"tutorialSidebar"},"concepts/advanced/wfspec-versioning":{"id":"concepts/advanced/wfspec-versioning","title":"WfSpec Versioning","description":"A WfSpec is a versioned resource. Each WfSpec is uniquely identified by its name (a String), its majorVersion (an auto-incremented number, managed by LittleHorse), and its revision (another auto-incremented number).","sidebar":"tutorialSidebar"},"concepts/concepts":{"id":"concepts/concepts","title":"Concepts","description":"The LittleHorse Server is, at its core, a Workflow Engine. What makes LittleHorse unique is that it is built with developers in mind. The way users define workflow specifications in LittleHorse (a WfSpec) was designed from the ground up to be developer-friendly and have concepts that are analogous to the primitives used in day-to-day programming languages.","sidebar":"tutorialSidebar"},"concepts/external-events":{"id":"concepts/external-events","title":"External Events and Interrupts","description":"This section is not a Developer Guide; if you want to learn how to create an ExternalEventDef, post an ExternalEvent, wait for an ExternalEvent in a Workflow, or register an Interrupt Handler, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"concepts/principals-and-tenants":{"id":"concepts/principals-and-tenants","title":"Authz, Principals, and Tenants","description":"In order to provide a secure platform for use at large enterprises, LittleHorse supports multi-tenancy natively. This is accomplished through two API Objects:","sidebar":"tutorialSidebar"},"concepts/tasks":{"id":"concepts/tasks","title":"Tasks","description":"This section is not a Developer Guide; if you want to learn how to write a Task Worker, how to register a TaskDef, or how to call a Task inside a Workflow, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"concepts/user-tasks":{"id":"concepts/user-tasks","title":"User Tasks","description":"This section is not a Developer Guide; if you want to learn how to Create a UserTaskDef, how to add a User Task Node to a Workflow, or how to handle User Tasks with GRPC, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"concepts/workflow-events":{"id":"concepts/workflow-events","title":"Workflow Events","description":"While External Events enable workflows to respond to events from the outside world, some applications may need to respond to events thrown from within workflows. Workflow Events enable LittleHorse Clients to wait for a specific event to occur within a workflow.","sidebar":"tutorialSidebar"},"concepts/workflows":{"id":"concepts/workflows","title":"Workflows","description":"This section is not a Developer Guide; if you want to learn how to define a workflow or how to run a workflow, please check the appropriate docs in our developer guide.","sidebar":"tutorialSidebar"},"developer-guide/client-configuration":{"id":"developer-guide/client-configuration","title":"Configuring the Clients","description":"In every LittleHorse SDK, there is an LHConfig class or struct that handles the configuration required for allowing your clients and Task Workers to talk to LittleHorse Server.","sidebar":"tutorialSidebar"},"developer-guide/developer-guide":{"id":"developer-guide/developer-guide","title":"Developer Guide","description":"The LittleHorse Developer Guide tells you everything you need to know about LittleHorse from the Jedi Youngling level (installing clients, running the server) to the Jedi Master level (advanced WfSpec development, advanced security, etc).","sidebar":"tutorialSidebar"},"developer-guide/grpc/advanced/advanced":{"id":"developer-guide/grpc/advanced/advanced","title":"Advanced","description":"If you\'ve made it here, congratulations!","sidebar":"tutorialSidebar"},"developer-guide/grpc/advanced/await-workflow-events":{"id":"developer-guide/grpc/advanced/await-workflow-events","title":"Await Workflow Events","description":"You can await a WorkflowEvent using the AwaitWorkflowEvent RPC call.","sidebar":"tutorialSidebar"},"developer-guide/grpc/basics":{"id":"developer-guide/grpc/basics","title":"Background","description":"The public LittleHorse API is a GRPC service exposed by the LH Server. We have complete auto-generated documentation for our GRPC Service and Protocol Buffers on our docs site. For the highly curious readers, you can find the actual protocol buffer code that underpins our system in our source code repository.","sidebar":"tutorialSidebar"},"developer-guide/grpc/grpc":{"id":"developer-guide/grpc/grpc","title":"Using the LittleHorse API","description":"The public API exposed by the LittleHorse Server is a GRPC server, defined here. We chose GRPC for multiple reasons, including:","sidebar":"tutorialSidebar"},"developer-guide/grpc/managing-metadata":{"id":"developer-guide/grpc/managing-metadata","title":"Managing Metadata","description":"Before you can run a WfRun, you need to create your WfSpec\'s! This guide shows you how to do that.","sidebar":"tutorialSidebar"},"developer-guide/grpc/posting-external-events":{"id":"developer-guide/grpc/posting-external-events","title":"Posting ExternalEvents","description":"You can post an ExternalEvent using the PutExternalEvent rpc call.","sidebar":"tutorialSidebar"},"developer-guide/grpc/running-workflows":{"id":"developer-guide/grpc/running-workflows","title":"Running a Workflow","description":"You can run a WfSpec, thus creating a WfRun, in two ways:","sidebar":"tutorialSidebar"},"developer-guide/grpc/user-tasks":{"id":"developer-guide/grpc/user-tasks","title":"Handling User Tasks","description":"User Tasks enable a ThreadRun to block until a human user provides some input into the workflow. Additionally, User Tasks have several useful hooks such as automatic reassignment, reminders, and auditing capabilities.","sidebar":"tutorialSidebar"},"developer-guide/install":{"id":"developer-guide/install","title":"Quickstart Installation","description":"The minimum to get started with LittleHorse is to install the lhctl CLI, run the server in docker, and use your choice of the Java, GoLang, or Python client libraries.","sidebar":"tutorialSidebar"},"developer-guide/lhctl":{"id":"developer-guide/lhctl","title":"LittleHorse CLI","description":"lhctl is the LittleHorse CLI. It allows you to manage metadata in your system, observe and analyze your WfRuns, and also perform rudimentary actions such as running a WfRun.","sidebar":"tutorialSidebar"},"developer-guide/task-worker-development":{"id":"developer-guide/task-worker-development","title":"Developing Task Workers","description":"Each LittleHorse SDK provides an LHTaskWorker object or struct which lets you turn an arbitrary function or method into a LittleHorse Task.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/advanced/advanced":{"id":"developer-guide/wfspec-development/advanced/advanced","title":"Advanced Features","description":"If you\'ve made it here, congratulations! You are no longer a Padawan.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/advanced/throwing-events":{"id":"developer-guide/wfspec-development/advanced/throwing-events","title":"Throwing Workflow Events","description":"Before you can add a THROW_EVENT Node to a WfSpec, you need to create a WorkflowEventDef metadata object in LittleHorse representing the event you want to throw. You can do that following our metadata management docs.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/advanced/wait-for-condition":{"id":"developer-guide/wfspec-development/advanced/wait-for-condition","title":"Waiting for Conditions","description":"\x3c!-- We really need docusaurus versioning. This feature isn\'t released yet...if someone finds it","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/basics":{"id":"developer-guide/wfspec-development/basics","title":"Basics","description":"To develop a WfSpec in LittleHorse, you can use the Workflow struct or object in our SDK\'s. Generally, the Workflow entity constructor requires two arguments:","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/child-threads":{"id":"developer-guide/wfspec-development/child-threads","title":"Child Threads","description":"You can use WorkflowThread#spawnThread() and WorkflowThread#waitForThreads() to launch and wait for Child ThreadRuns, respectively. This is useful if you want to execute multiple pieces of business logic in parallel.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/conditionals":{"id":"developer-guide/wfspec-development/conditionals","title":"Conditionals and Loops","description":"In a LittleHorse WfSpec, the Edge structure tells the workflow scheduler what Node to advance to next. The Edge has a conditions field, which allows you to specify different control flow paths based on variables in your WfRun. This is analogous to if/else in programming.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/exception-handling":{"id":"developer-guide/wfspec-development/exception-handling","title":"Exception Handling","description":"In LittleHorse, a Failure is analogous to an Exception in Programming.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/external-events":{"id":"developer-guide/wfspec-development/external-events","title":"External Events","description":"Before you can use an ExternalEventDef in a WfSpec, you need to create the ExternalEventDef metadata object in LittleHorse. You can do that following our metadata management docs.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/interrupts":{"id":"developer-guide/wfspec-development/interrupts","title":"Interrupts","description":"As per the Concepts Docs, you can set up a ThreadSpec such that when an ExternalEvent of a certain type comes in, the ThreadRun is interrupted and an Interrupt Handler ThreadRun is spawned.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/mutating-variables":{"id":"developer-guide/wfspec-development/mutating-variables","title":"Mutating Variables","description":"Recall from the Concepts Documentation that every Node can have zero or more VariableMutations on it. A VariableMutation changes the value of a ThreadRun\'s Variables.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/user-tasks":{"id":"developer-guide/wfspec-development/user-tasks","title":"User Tasks","description":"User Tasks allow you to manage tasks involving humans alongside standard computer tasks in your LittleHorse Workflow.","sidebar":"tutorialSidebar"},"developer-guide/wfspec-development/wfspec-development":{"id":"developer-guide/wfspec-development/wfspec-development","title":"WfSpec Development","description":"This section shows you how to build WfSpecs using our SDK\'s in Python, Java, and GoLang, starting from Youngling all the way up to the LittleHorse Master level.","sidebar":"tutorialSidebar"},"faq":{"id":"faq","title":"Tips, Pointers, and FAQ","description":"We do our best to make our documentation easy to navigate; however, LittleHorse has a lot of features and it may not always be easy to find what you are looking for.","sidebar":"tutorialSidebar"},"operations/client-configuration":{"id":"operations/client-configuration","title":"Workers/Clients Configurations","description":"Client","sidebar":"tutorialSidebar"},"operations/dashboard-configuration":{"id":"operations/dashboard-configuration","title":"Dashboard Configurations","description":"These configurations apply only to the ghcr.io/littlehorse-enterprises/littlehorse/lh-dashboard docker image, and not when running the LH Dashboard compiled from source. We have an open ticket in our OSS repo to homologate the configurations and also improve the startup time of the lh-dashboard docker image.","sidebar":"tutorialSidebar"},"operations/docker-compose/basic":{"id":"operations/docker-compose/basic","title":"Basic Deployment","description":"This example shows how to run LittleHorse with a single Server and the dashboard, without authentication, using Docker Compose, accessible on localhost:2023.","sidebar":"tutorialSidebar"},"operations/docker-compose/confluent-cloud":{"id":"operations/docker-compose/confluent-cloud","title":"Using Confluent Cloud","description":"LittleHorse requires Apache Kafka as its only hard dependency. Kafka is the source-of-truth for the state of a LittleHorse Cluster as all data is stored in Kafka Streams state stores (therefore, the durability of the Changelog Topics determines the durability of the LittleHorse Cluster\'s data).","sidebar":"tutorialSidebar"},"operations/docker-compose/docker-compose":{"id":"operations/docker-compose/docker-compose","title":"Docker Compose Examples","description":"This tab contains a series of examples to get LittleHorse working in Docker Compose. We recognize that not many people use Docker Compose in production, however we see value in docker compose examples because they serve as clear documentation of how to configure LittleHorse.","sidebar":"tutorialSidebar"},"operations/docker-compose/three-servers":{"id":"operations/docker-compose/three-servers","title":"Three LittleHorse Orchestrators","description":"LittleHorse is a horizontally scalable system. As such, you can configure multiple LittleHorse Orchestrator servers to act as a cluster. This provides the following benefits:","sidebar":"tutorialSidebar"},"operations/operations":{"id":"operations/operations","title":"Operations","description":"LittleHorse OSS, which can be found on our GitHub, contains all of the LittleHorse functionality. It is an enterprise-ready workflow engine that can scale to the largest workloads while meeting the most strict security requirements when deployed on premise.","sidebar":"tutorialSidebar"},"operations/overview":{"id":"operations/overview","title":"Operations Overview","description":"A minimal LittleHorse cluster has the following components:","sidebar":"tutorialSidebar"},"operations/server-configuration":{"id":"operations/server-configuration","title":"Server Configurations","description":"This page contains all of the configurations that are accepted by the LittleHorse Server. We recommend that you set these configurations as environment variables for the ghcr.io/littlehorse-enterprises/littlehorse/lh-server image.","sidebar":"tutorialSidebar"},"overview":{"id":"overview","title":"LittleHorse Overview","description":"The LittleHorse Orchestrator is a high-performance platform for building workflow-driven applications for a variety of use-cases, including:","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/03cca2c9.6cb8b05c.js b/assets/js/03cca2c9.6cb8b05c.js new file mode 100644 index 000000000..9aaf5397d --- /dev/null +++ b/assets/js/03cca2c9.6cb8b05c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[8087],{2889:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var o=t(4848),r=t(8453),l=t(1470),i=t(9365);const a={},s="Await Workflow Events",d={id:"developer-guide/grpc/advanced/await-workflow-events",title:"Await Workflow Events",description:"You can await a WorkflowEvent using the AwaitWorkflowEvent RPC call.",source:"@site/docs/05-developer-guide/09-grpc/40-advanced/00-await-workflow-events.md",sourceDirName:"05-developer-guide/09-grpc/40-advanced",slug:"/developer-guide/grpc/advanced/await-workflow-events",permalink:"/docs/developer-guide/grpc/advanced/await-workflow-events",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:0,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Advanced",permalink:"/docs/developer-guide/grpc/advanced/"},next:{title:"Operations",permalink:"/docs/operations/"}},c={},u=[{value:"AwaitWorkflowEventRequest",id:"awaitworkfloweventrequest",level:2},{value:"Required Parameters",id:"required-parameters",level:3},{value:"Examples",id:"examples",level:2},{value:"Awaiting a WorkflowEvent",id:"awaiting-a-workflowevent",level:3},{value:"Awaiting Events from Multiple WorkflowEventDefs",id:"awaiting-events-from-multiple-workfloweventdefs",level:3},{value:"Using Deadlines",id:"using-deadlines",level:3},{value:"Ignoring WorkflowEvents",id:"ignoring-workflowevents",level:3}];function f(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"await-workflow-events",children:"Await Workflow Events"})}),"\n",(0,o.jsxs)(n.p,{children:["You can await a ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})," using the ",(0,o.jsx)(n.code,{children:"AwaitWorkflowEvent"})," RPC call."]}),"\n",(0,o.jsx)(n.h2,{id:"awaitworkfloweventrequest",children:(0,o.jsx)(n.code,{children:"AwaitWorkflowEventRequest"})}),"\n",(0,o.jsxs)(n.p,{children:["You need to create an ",(0,o.jsx)(n.code,{children:"AwaitWorkflowEventRequest"})," to do so. The protobuf definition is:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-protobuf",children:"message AwaitWorkflowEventRequest {\n WfRunId wf_run_id = 1;\n repeated WorkflowEventDefId event_def_ids = 2;\n repeated WorkflowEventId workflow_events_to_ignore = 3;\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"required-parameters",children:"Required Parameters"}),"\n",(0,o.jsx)(n.p,{children:"The three required values are:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"wfRunId"})," is the ID of the ",(0,o.jsx)(n.code,{children:"WfRun"})," that the ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})," is thrown from."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"eventDefIds"})," is a repeated field including the IDs of the ",(0,o.jsx)(n.code,{children:"WorkflowEventDef"}),"s you want to await thrown ",(0,o.jsx)(n.code,{children:"WorkflowEvent"}),"s for. The request will return the first matching ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})," thrown. If this field is empty, the request will return the first ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})," thrown by the ",(0,o.jsx)(n.code,{children:"WfRun"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"workflowEventsToIgnore"})," is a repeated field of IDs of ",(0,o.jsx)(n.code,{children:"WorkflowEvents"})," that you want to ignore. This gives the client the ability to ignore ",(0,o.jsx)(n.code,{children:"WorkflowEvent"}),"s that have already been awaited. See ",(0,o.jsx)(n.a,{href:"#ignoring-workflowevents",children:"Ignoring WorkflowEvents"})," for an example."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n","\n",(0,o.jsxs)(n.h3,{id:"awaiting-a-workflowevent",children:["Awaiting a ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})]}),"\n",(0,o.jsxs)(l.A,{children:[(0,o.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'WorkflowEvent event = client.awaitWorkflowEvent(AwaitWorkflowEventRequest.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("your-workflow-run-id"))\n .addEventDefIds(WorkflowEventDefId.newBuilder().setName("my-workflow-event-def"))\n .build());\n'})})}),(0,o.jsx)(i.A,{value:"python",label:"Python",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'async def main() -> None:\n config = get_config()\n client = config.stub()\n\n await_workflow_event_request = AwaitWorkflowEventRequest(\n wf_run_id=WfRunId(id="your-wf-run-id"),\n event_def_ids=[WorkflowEventDefId(name="my-workflow-event-def")],\n workflow_events_to_ignore=None)\n\n client.AwaitWorkflowEvent(await_workflow_event_request)\n'})})}),(0,o.jsx)(i.A,{value:"go",label:"Go",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nevent, err := (*client).AwaitWorkflowEvent(context.Background(),\n &lhproto.AwaitWorkflowEventRequest{\n WfRunId: &lhproto.WfRunId{\n Id: "your-workflow-run-id",\n },\n EventDefIds: []*lhproto.WorkflowEventDefId {\n &lhproto.WorkflowEventDefId{\n Name: "my-workflow-event-def",\n },\n }\n },\n)\n'})})})]}),"\n",(0,o.jsx)("hr",{}),"\n",(0,o.jsxs)(n.h3,{id:"awaiting-events-from-multiple-workfloweventdefs",children:["Awaiting Events from Multiple ",(0,o.jsx)(n.code,{children:"WorkflowEventDef"}),"s"]}),"\n",(0,o.jsxs)(n.p,{children:["In the event your workflow throws multiple types of ",(0,o.jsx)(n.code,{children:"WorkflowEvent"}),"s, you can specify multiple ",(0,o.jsx)(n.code,{children:"WorkflowEventDef"}),"s in your request. The request will return the first matching ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})," thrown by your workflow."]}),"\n",(0,o.jsxs)(l.A,{children:[(0,o.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'WorkflowEvent event = client.awaitWorkflowEvent(AwaitWorkflowEventRequest.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("your-workflow-run-id"))\n // highlight-start\n .addEventDefIds(WorkflowEventDefId.newBuilder().setName("my-workflow-event-def"))\n .addEventDefIds(WorkflowEventDefId.newBuilder().setName("another-workflow-event-def"))\n // highlight-end\n .build());\n'})})}),(0,o.jsx)(i.A,{value:"python",label:"Python",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'async def main() -> None:\n config = get_config()\n client = config.stub()\n\n await_workflow_event_request = AwaitWorkflowEventRequest(\n wf_run_id=WfRunId(id="your-wf-run-id"),\n # highlight-start\n event_def_ids=[WorkflowEventDefId(name="my-workflow-event-def"),\n WorkflowEventDefId(name="another-workflow-event-def")],\n # highlight-end\n workflow_events_to_ignore=None)\n\n event: WorkflowEvent = client.AwaitWorkflowEvent(await_workflow_event_request)\n'})})}),(0,o.jsx)(i.A,{value:"go",label:"Go",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nevent, err := (*client).AwaitWorkflowEvent(context.Background(),\n &lhproto.AwaitWorkflowEventRequest{\n WfRunId: &lhproto.WfRunId{\n Id: "your-workflow-run-id",\n },\n EventDefIds: []*lhproto.WorkflowEventDefId {\n // highlight-start\n &lhproto.WorkflowEventDefId{\n Name: "my-workflow-event-def",\n },\n &lhproto.WorkflowEventDefId{\n Name: "another-workflow-event-def",\n },\n // highlight-end\n }\n },\n)\n'})})})]}),"\n",(0,o.jsx)("hr",{}),"\n",(0,o.jsx)(n.h3,{id:"using-deadlines",children:"Using Deadlines"}),"\n",(0,o.jsxs)(n.p,{children:["Upon the execution of a ",(0,o.jsx)(n.code,{children:"THROW_EVENT"})," node, LittleHorse will always ensure that your ",(0,o.jsx)(n.code,{children:"WorkflowEvent"}),"s are thrown and returned to any clients awaiting them. However, you may still find it useful to set a ",(0,o.jsx)(n.a,{href:"https://grpc.io/docs/guides/deadlines/",children:"gRPC deadline"})," on your ",(0,o.jsx)(n.code,{children:"AwaitWorkflowEvent"})," request in case a ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})," is not thrown within a specified period of time."]}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["You can configure a gRPC deadline for any LittleHorse Client request, not just ",(0,o.jsx)(n.code,{children:"AwaitWorkflowEvent"}),"! If the request does not complete within the specified time, it will be automatically canceled and return gRPC Status Code 1 ",(0,o.jsx)(n.code,{children:"CANCELLED"}),"."]})}),"\n",(0,o.jsxs)(l.A,{children:[(0,o.jsxs)(i.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["To use deadlines with our Java SDK, you can call the ",(0,o.jsx)(n.code,{children:"LittleHorseBlockingStub#withDeadlineAfter()"})," method before your gRPC request method call."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'Properties props = getConfigProps();\nLHConfig config = new LHConfig(props);\nLittleHorseBlockingStub client = config.getBlockingStub();\n\n// highlight-next-line\nWorkflowEvent event = client.withDeadlineAfter(1000, TimeUnit.MILLISECONDS)\n .awaitWorkflowEvent(AwaitWorkflowEventRequest.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("your-workflow-run-id"))\n .build());\n'})}),(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Parameters"})}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"LittleHorseBlockingStub#withDeadlineAfter()"})," method takes two parameters:"]}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"long duration"}),": the duration to await the request"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"TimeUnit unit"}),": the unit of time for the duration value"]}),"\n"]})]}),(0,o.jsxs)(i.A,{value:"python",label:"Python",default:!0,children:[(0,o.jsxs)(n.p,{children:["To use deadlines with our Python SDK, you can use the ",(0,o.jsx)(n.code,{children:"timeout"})," parameter in any gRPC request method call."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'async def main() -> None:\n config = get_config()\n client = config.stub()\n\n await_workflow_event_request = AwaitWorkflowEventRequest(\n wf_run_id=WfRunId(id="your-wf-run-id"),\n event_def_ids=[WorkflowEventDefId(name="my-workflow-event-def")],\n workflow_events_to_ignore=None)\n\n # highlight-next-line\n event: WorkflowEvent = client.AwaitWorkflowEvent(await_workflow_event_request, timeout=1)\n'})}),(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Parameters"})}),(0,o.jsxs)(n.p,{children:["Every ",(0,o.jsx)(n.code,{children:"LittleHorseStub"})," request method features an ",(0,o.jsx)(n.code,{children:"int timeout"})," parameter which represents the amount of time in ",(0,o.jsx)(n.code,{children:"seconds"})," that the client will wait before cancelling your request."]})]}),(0,o.jsxs)(i.A,{value:"go",label:"Go",default:!0,children:[(0,o.jsxs)(n.p,{children:["To use deadlines in our Go SDK, you can use the ",(0,o.jsx)(n.code,{children:"context"})," library's ",(0,o.jsx)(n.code,{children:"withTimeout()"})," method to wrap your context with a fixed deadline."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\n// highlight-start\ncontextWithTimeout, cancel := context.WithTimeout(context.Background(), time.Millisecond*1000)\ndefer cancel() // Ensure that cancel is called to release resources\n// highlight-end\n\nevent, err := (*client).AwaitWorkflowEvent(contextWithTimeout,\n &lhproto.AwaitWorkflowEventRequest{\n WfRunId: &lhproto.WfRunId{\n Id: "your-workflow-run-id",\n },\n EventDefIds: []*lhproto.WorkflowEventDefId {\n &lhproto.WorkflowEventDefId{\n Name: "my-workflow-event-def",\n },\n }\n },\n)\n'})}),(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Parameters"})}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"Context.WithTimeout()"})," method takes two parameters:"]}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"parent Context"}),": the context of your request, usually ",(0,o.jsx)(n.code,{children:"context.Background()"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"timeout time.Duration"}),": the unit and duration of time for your deadline"]}),"\n"]}),(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://pkg.go.dev/context#WithTimeout",children:"Context.WithTimeout() Documentation"})})]})]}),"\n",(0,o.jsx)("hr",{}),"\n",(0,o.jsxs)(n.h3,{id:"ignoring-workflowevents",children:["Ignoring ",(0,o.jsx)(n.code,{children:"WorkflowEvent"}),"s"]}),"\n",(0,o.jsxs)(n.p,{children:["Since a single ",(0,o.jsx)(n.code,{children:"WfRun"})," may throw multiple ",(0,o.jsx)(n.code,{children:"WorkflowEvent"}),"s with the same ",(0,o.jsx)(n.code,{children:"WorkflowEventDefId"}),', clients have the ability to "ignore" ',(0,o.jsx)(n.code,{children:"WorkflowEvent"}),"s that have already been awaited. Any ",(0,o.jsx)(n.code,{children:"WorkflowEvent"})," specified within the ",(0,o.jsx)(n.code,{children:"workflowEventsToIgnore"})," field will be ignored."]}),"\n",(0,o.jsxs)(l.A,{children:[(0,o.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'// The first WorkflowEvent awaited by the client\nWorkflowEvent event1 = client.awaitWorkflowEvent(AwaitWorkflowEventRequest.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("your-workflow-run-id"))\n .addEventDefIds(WorkflowEventDefId.newBuilder().setName("my-workflow-event-def"))\n .build());\n\n// The second WorkflowEvent awaited by the client\nWorkflowEvent event2 = client.awaitWorkflowEvent(AwaitWorkflowEventRequest.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("your-workflow-run-id"))\n .addEventDefIds(WorkflowEventDefId.newBuilder().setName("my-workflow-event-def"))\n // Ignore any WorkflowEvents matching the first one received\n // highlight-next-line\n .addWorkflowEventsToIgnore(event1.getId())\n .build());\n'})})}),(0,o.jsx)(i.A,{value:"python",label:"Python",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'async def main() -> None:\n config = get_config()\n client = config.stub()\n\n await_workflow_event_request = AwaitWorkflowEventRequest(\n wf_run_id=WfRunId(id="your-wf-run-id"),\n event_def_ids=[WorkflowEventDefId(name="my-workflow-event-def")],\n workflow_events_to_ignore=None)\n event1: WorkflowEvent = client.AwaitWorkflowEvent(await_workflow_event_request)\n\n await_workflow_event_request_2 = AwaitWorkflowEventRequest(\n wf_run_id=WfRunId(id="your-wf-run-id"),\n event_def_ids=[WorkflowEventDefId(name="my-workflow-event-def")],\n # Ignore any WorkflowEvents matching the first one received\n # highlight-next-line\n workflow_events_to_ignore=[event1.id])\n \n event2: WorkflowEvent = client.AwaitWorkflowEvent(await_workflow_event_request_2)\n'})})}),(0,o.jsx)(i.A,{value:"go",label:"Go",default:!0,children:(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nevent1, err := (*client).AwaitWorkflowEvent(context.Background(),\n &lhproto.AwaitWorkflowEventRequest{\n WfRunId: &lhproto.WfRunId{\n Id: "your-workflow-run-id",\n },\n EventDefIds: []*lhproto.WorkflowEventDefId{\n &lhproto.WorkflowEventDefId{\n Name: "my-workflow-event-def",\n },\n },\n },\n)\n\nevent2, err := (*client).AwaitWorkflowEvent(context.Background(),\n &lhproto.AwaitWorkflowEventRequest{\n WfRunId: &lhproto.WfRunId{\n Id: "your-workflow-run-id",\n },\n EventDefIds: []*lhproto.WorkflowEventDefId{\n &lhproto.WorkflowEventDefId{\n Name: "my-workflow-event-def",\n },\n },\n // highlight-start\n WorkflowEventsToIgnore: []*lhproto.WorkflowEventId{\n event1.Id,\n },\n // highlight-end\n },\n)\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(f,{...e})}):f(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>i});t(6540);var o=t(8215);const r={tabItem:"tabItem_Ymn6"};var l=t(4848);function i(e){let{children:n,hidden:t,className:i}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,i),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>E});var o=t(6540),r=t(8215),l=t(3104),i=t(6347),a=t(205),s=t(7485),d=t(1682),c=t(679);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 f(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 h(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function w(e){let{queryString:n=!1,groupId:t}=e;const r=(0,i.W6)(),l=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)(l),(0,o.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function v(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=f(e),[i,s]=(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(!h({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:l}))),[d,u]=w({queryString:t,groupId:r}),[v,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,c.Dv)(t);return[r,(0,o.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),k=(()=>{const e=d??v;return h({value:e,tabValues:l})?e:null})();(0,a.A)((()=>{k&&s(k)}),[k]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!h({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),g(e)}),[u,g,l]),tabValues:l}}var g=t(2303);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var p=t(4848);function x(e){let{className:n,block:t,selectedValue:o,selectValue:i,tabValues:a}=e;const s=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.a_)(),c=e=>{const n=e.currentTarget,t=s.indexOf(n),r=a[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=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,p.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:a.map((e=>{let{value:n,label:t,attributes:l}=e;return(0,p.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>s.push(e),onKeyDown:u,onClick:c,...l,className:(0,r.A)("tabs__item",k.tabItem,l?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function m(e){let{lazy:n,children:t,selectedValue:l}=e;const i=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=i.find((e=>e.props.value===l));return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,p.jsx)("div",{className:"margin-top--md",children:i.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==l})))})}function j(e){const n=v(e);return(0,p.jsxs)("div",{className:(0,r.A)("tabs-container",k.tabList),children:[(0,p.jsx)(x,{...n,...e}),(0,p.jsx)(m,{...n,...e})]})}function E(e){const n=(0,g.A)();return(0,p.jsx)(j,{...e,children:u(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(6540);const r={},l=o.createContext(r);function i(e){const n=o.useContext(l);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(r):e.components||r:i(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/150c26e9.832adbbb.js b/assets/js/150c26e9.832adbbb.js new file mode 100644 index 000000000..169cd816e --- /dev/null +++ b/assets/js/150c26e9.832adbbb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[4792],{4591:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>f});var o=t(4848),r=t(8453),s=t(1470),l=t(9365);const i={},a="Managing Metadata",c={id:"developer-guide/grpc/managing-metadata",title:"Managing Metadata",description:"Before you can run a WfRun, you need to create your WfSpec's! This guide shows you how to do that.",source:"@site/docs/05-developer-guide/09-grpc/05-managing-metadata.md",sourceDirName:"05-developer-guide/09-grpc",slug:"/developer-guide/grpc/managing-metadata",permalink:"/docs/developer-guide/grpc/managing-metadata",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Background",permalink:"/docs/developer-guide/grpc/basics"},next:{title:"Running a Workflow",permalink:"/docs/developer-guide/grpc/running-workflows"}},d={},f=[{value:"TaskDef",id:"taskdef",level:2},{value:"WfSpec",id:"wfspec",level:2},{value:"ExternalEventDef",id:"externaleventdef",level:2},{value:"UserTaskDef",id:"usertaskdef",level:2},{value:"WorkflowEventDef",id:"workfloweventdef",level:2}];function u(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"managing-metadata",children:"Managing Metadata"})}),"\n",(0,o.jsxs)(n.p,{children:["Before you can run a ",(0,o.jsx)(n.code,{children:"WfRun"}),", you need to create your ",(0,o.jsx)(n.code,{children:"WfSpec"}),"'s! This guide shows you how to do that."]}),"\n",(0,o.jsxs)(n.p,{children:["You can manage Metadata Objects (",(0,o.jsx)(n.code,{children:"WfSpec"}),", ",(0,o.jsx)(n.code,{children:"TaskDef"}),", ",(0,o.jsx)(n.code,{children:"ExternalEventDef"}),", and ",(0,o.jsx)(n.code,{children:"UserTaskDef"}),") either using ",(0,o.jsx)(n.code,{children:"lhctl"})," or with a grpc client. This section details how to manage them using the SDK's and grpc clients."]}),"\n",(0,o.jsxs)(n.p,{children:["Please note that, in LittleHorse, all metadata requests are idempotent. Additionally, if you make a metadata request to ",(0,o.jsx)(n.code,{children:"Put"})," an object with the exact same specifications of the object that already exists, the API will return the ",(0,o.jsx)(n.code,{children:"OK"})," grpc status. This is useful so that you can safely use CI/CD pipelines to manage metadata, or use a script that runs upon application startup to manage metadata, without having to catch ",(0,o.jsx)(n.code,{children:"ALREADY_EXISTS"})," errors."]}),"\n",(0,o.jsx)(n.h2,{id:"taskdef",children:(0,o.jsx)(n.code,{children:"TaskDef"})}),"\n",(0,o.jsxs)(n.p,{children:["In general, the easiest way to register a ",(0,o.jsx)(n.code,{children:"TaskDef"})," in LittleHorse is through a ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," object or struct."]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(l.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsx)(n.p,{children:"Let's say I have a properly-annotated Task Worker class:"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'class Greeter {\n @LHTaskMethod("greet")\n public String greeting(String name) {\n return "Hello there, " + name;\n }\n}\n'})}),(0,o.jsxs)(n.p,{children:["You can use the ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," to create the ",(0,o.jsx)(n.code,{children:"TaskDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'LHConfig config = ...;\nLHTaskWorker worker = new LHTaskWorker(new Greeter(), "greeting", config);\nworker.registerTaskDef();\n'})}),(0,o.jsxs)(n.p,{children:["You can get a ",(0,o.jsx)(n.code,{children:"TaskDef"})," or delete it using the grpc client:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'LittleHorseBlockingStub client = ...;\n\n// Get a TaskDef\nTaskDefId taskId = TaskDefId.newBuilder().setName("my-task").build();\nTaskDef myTask = client.getTaskDef(taskId);\n\n// Delete the task\nclient.deleteTaskDef(DeleteTaskDefRequest.newBuilder().setId(taskId).build());\n'})})]}),(0,o.jsxs)(l.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["You can use the ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," struct to automatically register a ",(0,o.jsx)(n.code,{children:"TaskDef"})," from your Task Function. First, create your ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," as follows (assuming that ",(0,o.jsx)(n.code,{children:"myTaskFunc"})," is a function pointer to your Task Function):"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\ntw, _ := taskworker.NewTaskWorker(config, myTaskFunc, "my-task")\n\n_, err := tw.RegisterTaskDef()\n'})}),(0,o.jsxs)(n.p,{children:["The above automatically generates a ",(0,o.jsx)(n.code,{children:"TaskDef"})," from the function signature using GoLang reflection, and registers it with the API."]}),(0,o.jsxs)(n.p,{children:["You can get and delete ",(0,o.jsx)(n.code,{children:"TaskDef"}),"'s as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'client, _ := config.GetGrpcClient()\ntaskDefId := &lhproto.TaskDefId{Name: "my-task"}\n\ntaskDef, err := (*client).GetTaskDef(context.Background(), taskDefId)\n\n// delete the TaskDef\n_, err = (*client).DeleteTaskDef(context.Background(), &lhproto.DeleteTaskDefRequest{\n Id: taskDefId,\n})\n'})})]}),(0,o.jsxs)(l.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["In the Python SDK, a function must be ",(0,o.jsx)(n.code,{children:"async"})," in order to be used as a Task Function. No annotations are required."]}),(0,o.jsxs)(n.p,{children:["The easiest way to register a ",(0,o.jsx)(n.code,{children:"TaskDef"})," to your LittleHorse Cluster is using the ",(0,o.jsx)(n.code,{children:"littlehorse.create_task_def()"})," utility function. The following example defines a Task Function and creates a ",(0,o.jsx)(n.code,{children:"TaskDef"})," in the LittleHorse Cluster."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'import asyncio\nfrom littlehorse import create_task_def\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model.service_pb2 import *\nfrom google.protobuf.json_format import MessageToJson\n\n\n# This is the Task Function. It must be `async`.\nasync def greet(name: str) -> None:\n print(f"Hello there, {name}!")\n\n\nasync def main():\n config = LHConfig()\n\n # Let\'s use the string "greet-task" as the TaskDef\'s name\n create_task_def(greet, "greet-task", config)\n\n\nif __name__ == \'__main__\':\n asyncio.run(main())\n'})}),(0,o.jsxs)(n.p,{children:["You can delete a ",(0,o.jsx)(n.code,{children:"TaskDef"})," in python using the ",(0,o.jsx)(n.code,{children:"LittleHorseStub"})," and the ",(0,o.jsx)(n.a,{href:"/docs/api#deletetaskdef",children:(0,o.jsx)(n.code,{children:"rpc DeleteTaskDef"})}),". An example is shown below:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:"from littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == '__main__':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n # Formulate the request\n delete_td_request = DeleteTaskDefRequest(id=TaskDefId(name=\"greet-task\"))\n\n # Delete the TaskDef\n client.DeleteTaskDef(delete_td_request)\n"})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"wfspec",children:(0,o.jsx)(n.code,{children:"WfSpec"})}),"\n",(0,o.jsxs)(n.p,{children:["In LittleHorse, the easiest way to deploy a ",(0,o.jsx)(n.code,{children:"WfSpec"})," is using the ",(0,o.jsx)(n.code,{children:"Workflow"})," class or struct provided by our Java, Go, and Python SDK's. The ",(0,o.jsx)(n.code,{children:"Workflow"})," class takes in a ",(0,o.jsx)(n.code,{children:"WorkflowThread"})," function reference that defines your ",(0,o.jsx)(n.code,{children:"WfSpec"})," logic (this is covered in the ",(0,o.jsx)(n.a,{href:"/docs/developer-guide/wfspec-development/",children:"Developing Workflows Documentation"}),"), and has a ",(0,o.jsx)(n.code,{children:"compile()"})," method which returns a ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Like other metadata requests, the ",(0,o.jsx)(n.code,{children:"rpc PutWfSpec"})," is idempotent. However, as described in our ",(0,o.jsxs)(n.a,{href:"/docs/concepts/advanced/wfspec-versioning",children:[(0,o.jsx)(n.code,{children:"WfSpec"})," Versioning docs"]}),", ",(0,o.jsx)(n.code,{children:"WfSpec"})," objects have compound versioning that enforces certain compatibility rules between versions. In the ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"}),", you have the option to set the ",(0,o.jsx)(n.code,{children:"allowed_updates"})," field of the ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"}),". There are three values:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"ALL_UPDATES"}),": both breaking changes and minor revisions are accepted."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"MINOR_REVISION_UPDATES"}),": breaking changes are rejected, but minor revisions are accepted."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"NO_UPDATES"}),": the request will fail if the specified new ",(0,o.jsx)(n.code,{children:"WfSpec"})," differs from the latest version."]}),"\n"]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(l.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["You can execute the ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"})," with a specific ",(0,o.jsx)(n.code,{children:"AllowedUpdateType"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.wfsdk.Workflow;\nimport io.littlehorse.sdk.wfsdk.WorkflowThread;\nimport io.littlehorse.sdk.common.proto.AllowedUpdateType;\nimport io.littlehorse.sdk.common.proto.PutWfSpecRequest;\nimport io.littlehorse.sdk.common.proto.WfSpec;\n\npublic class Main {\n\n private static void wfFunc(WorkflowThread wf) {\n // The `greet` TaskDef must already exist\n wf.execute("greet", "some-name");\n }\n\n public static void main(String[] args) throws IOException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n Workflow workflow = Workflow.newWorkflow("my-wfspec", Main::wfFunc);\n\n // Only allow updates that do not change the API of the WfSpec\n workflow.withUpdateType(AllowedUpdateType.MINOR_REVISION_UPDATES);\n\n PutWfSpecRequest request = workflow.compileWorkflow();\n WfSpec result = client.putWfSpec(request);\n\n System.out.println(LHLibUtil.protoToJson(result));\n }\n}\n'})}),(0,o.jsxs)(n.p,{children:["You can get or delete a ",(0,o.jsx)(n.code,{children:"WfSpec"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.DeleteWfSpecRequest;\nimport io.littlehorse.sdk.common.proto.WfSpec;\nimport io.littlehorse.sdk.common.proto.WfSpecId;\n\npublic class Main {\n\n public static void main(String[] args) throws IOException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n WfSpecId wfSpecId = WfSpecId.newBuilder()\n .setName("my-wfspec")\n .setMajorVersion(0) // Set to whichever major version you want\n .setRevision(0) // Set to whichever revision you want\n .build();\n\n WfSpec wfSpec = client.getWfSpec(wfSpecId);\n System.out.println(LHLibUtil.protoToJson(wfSpec));\n\n // Delete the WfSpec\n DeleteWfSpecRequest req = DeleteWfSpecRequest.newBuilder().setId(wfSpecId).build();\n client.deleteWfSpec(req);\n }\n}\n'})})]}),(0,o.jsxs)(l.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["Assuming that you have a function ",(0,o.jsx)(n.code,{children:"basic.MyWorkflow"})," which is a valid Workflow Function in Go, you can create a ",(0,o.jsx)(n.code,{children:"WfSpec"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nwf := littlehorse.NewWorkflow(basic.MyWorkflow, "my-workflow").WithUpdateType(lhproto.AllowedUpdateType_MINOR_REVISION_UPDATES)\nputWf, _ := wf.Compile()\n\nresp, err := (*client).PutWfSpec(context.Background(), putWf)\n'})}),(0,o.jsxs)(n.p,{children:["You can get and delete ",(0,o.jsx)(n.code,{children:"WfSpec"}),"s as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'wfSpecId := &lhproto.WfSpecId{\n Name: "my-wf",\n MajorVersion: 2,\n Revision: 1,\n}\n\nwfSpec, err := (*client).GetWfSpec(context.Background(), wfSpecId)\n\n// Get the latest wfSpec. Setting majorVersion is optional for this request\nmajorVersion := int32(2)\n\nsomeWf, err := (*client).GetLatestWfSpec(\n context.Background(),\n &lhproto.GetLatestWfSpecRequest{\n Name: "some-wf",\n MajorVersion: &majorVersion,\n },\n)\n\n// delete the WfSpec\n_, err = (*client).DeleteWfSpec(context.Background(), &lhproto.DeleteWfSpecRequest{\n Id: wfSpecId,\n})\n'})})]}),(0,o.jsxs)(l.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["Assuming you have a workflow, you can use the ",(0,o.jsx)(n.code,{children:"littlehorse.create_workflow_spec()"})," utility function."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom littlehorse.workflow import Workflow, WorkflowThread\nfrom google.protobuf.json_format import MessageToJson\n\n# The workflow logic. This function must have type annotations in\n# order to conform to the `ThreadInitializer` interface.\ndef my_workflow_func(wf: WorkflowThread) -> None:\n # the `greet` TaskDef must already exist\n wf.execute("greet", "some-name")\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n workflow: Workflow = Workflow("my-wfspec", my_workflow_func)\n # Set the allowed update type\n workflow.with_update_type(AllowedUpdateType.MINOR_REVISION_UPDATES)\n\n # Create the WfSpec\n request: PutWfSpecRequest = workflow.compile()\n wf_spec: WfSpec = client.PutWfSpec(request)\n\n print(MessageToJson(wf_spec))\n'})}),(0,o.jsxs)(n.p,{children:["You can get or delete a WfSpec using a ",(0,o.jsx)(n.code,{children:"stub"}),":"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom littlehorse.workflow import Workflow, WorkflowThread\nfrom google.protobuf.json_format import MessageToJson\n\n# The workflow logic. This function must have type annotations in\n# order to conform to the `ThreadInitializer` interface.\ndef my_workflow_func(wf: WorkflowThread) -> None:\n # the `greet` TaskDef must already exist\n wf.execute("greet", "some-name")\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n wf_spec_id: WfSpecId = WfSpecId(\n name="my-wfspec",\n major_version=0, # replace with your preferred major version\n revision=0, # replaced with your desired revision\n )\n wf_spec: WfSpec = client.GetWfSpec(wf_spec_id)\n\n print(MessageToJson(wf_spec))\n\n # Delete a WfSpec\n client.DeleteWfSpec(DeleteWfSpecRequest(id=wf_spec_id))\n'})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"externaleventdef",children:(0,o.jsx)(n.code,{children:"ExternalEventDef"})}),"\n",(0,o.jsxs)(n.p,{children:["As of now, the only field required to create an ",(0,o.jsx)(n.code,{children:"ExternalEventDef"})," is the ",(0,o.jsx)(n.code,{children:"name"})," of the ",(0,o.jsx)(n.code,{children:"ExternalEventDef"}),"."]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(l.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["You can create, get, and delete an ",(0,o.jsx)(n.code,{children:"ExternalEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.DeleteExternalEventDefRequest;\nimport io.littlehorse.sdk.common.proto.ExternalEventDef;\nimport io.littlehorse.sdk.common.proto.ExternalEventDefId;\nimport io.littlehorse.sdk.common.proto.PutExternalEventDefRequest;\n\npublic class Main {\n\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n PutExternalEventDefRequest request = PutExternalEventDefRequest.newBuilder()\n .setName("my-external-event-def")\n .build();\n\n client.putExternalEventDef(request);\n\n // Metadata requests in LittleHorse take 50-100 ms to propagate to the global\n // store.\n Thread.sleep(100);\n\n // Retrieve the ExternalEventDef\n ExternalEventDefId id = ExternalEventDefId.newBuilder()\n .setName("my-external-event-def")\n .build();\n ExternalEventDef eventDef = client.getExternalEventDef(id);\n System.out.println(LHLibUtil.protoToJson(eventDef));\n\n // Delete the ExternalEventDef\n DeleteExternalEventDefRequest deleteRequest = DeleteExternalEventDefRequest.newBuilder()\n .setId(id)\n .build();\n client.deleteExternalEventDef(deleteRequest);\n }\n}\n'})})]}),(0,o.jsxs)(l.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["In Go, you can create a ",(0,o.jsx)(n.code,{children:"ExternalEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nresp, err := (*client).PutExternalEventDef(context.Background(),\n &lhproto.PutExternalEventDefRequest{\n Name: "my-external-event-def",\n },\n)\n'})}),(0,o.jsxs)(n.p,{children:["You can get and delete ",(0,o.jsx)(n.code,{children:"ExternalEventDef"}),"s as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'externalEventDefId := &lhproto.ExternalEventDefId{\n Name: "some-event",\n}\need, err := (*client).GetExternalEventDef(context.Background(), externalEventDefId)\n\n// delete the ExternalEventDef\n_, err = (*client).DeleteExternalEventDef(context.Background(), &lhproto.DeleteExternalEventDefRequest{\n Id: externalEventDefId,\n})\n'})})]}),(0,o.jsxs)(l.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["In Python, you can use the ",(0,o.jsx)(n.code,{children:"littlehorse.create_external_event_def"})," utility to more easily create an ",(0,o.jsx)(n.code,{children:"ExternalEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse import create_external_event_def\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom google.protobuf.json_format import MessageToJson\n\nfrom time import sleep\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n create_external_event_def(name="my-external-event-def", config=config)\n\n # In LittleHorse, metadata updates take 50-100ms to propagate to the global\n # store.\n sleep(0.2)\n\n # Fetch the ExternalEventDef\n external_event_def_id = ExternalEventDefId(name="my-external-event-def")\n event_def: ExternalEventDef = client.GetExternalEventDef(external_event_def_id)\n print(MessageToJson(event_def))\n\n # Delete the ExternalEventDef\n client.DeleteExternalEventDef(DeleteExternalEventDefRequest(id=external_event_def_id))\n'})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"usertaskdef",children:(0,o.jsx)(n.code,{children:"UserTaskDef"})}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," specifies the data that needs to be filled out in a form for a human to complete a ",(0,o.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Note that a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," is a versioned object (unlike a ",(0,o.jsx)(n.code,{children:"WfSpec"}),", however, there is only a ",(0,o.jsx)(n.code,{children:"version"})," number and no ",(0,o.jsx)(n.code,{children:"revision"}),"). As such, getting and deleting ",(0,o.jsx)(n.code,{children:"UserTaskDef"}),"s follows a similar pattern: we provide a ",(0,o.jsx)(n.code,{children:"GetLatestUserTaskDef"})," rpc call which allows you to get the latest ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," with a given name."]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(l.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["The easiest way to create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," in Java is using the ",(0,o.jsx)(n.code,{children:"UserTaskSchema"})," class. Note that it infers the schema of the ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," from our ",(0,o.jsx)(n.code,{children:"MyForm"})," class using the ",(0,o.jsx)(n.code,{children:"UserTaskField"})," annotation."]}),(0,o.jsxs)(n.p,{children:["The below example shows you how to create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"}),", get it, and delete it."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.usertask.UserTaskSchema;\nimport io.littlehorse.sdk.usertask.annotations.UserTaskField;\nimport io.littlehorse.sdk.common.proto.DeleteUserTaskDefRequest;\nimport io.littlehorse.sdk.common.proto.PutUserTaskDefRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskDef;\nimport io.littlehorse.sdk.common.proto.UserTaskDefId;\n\n// This Java class defines our form for the UserTaskDef\nclass SomeForm {\n @UserTaskField(\n displayName = "Approved?",\n description = "Reply \'true\' if this is an acceptable request."\n )\n public boolean isApproved;\n\n @UserTaskField(\n displayName = "Explanation",\n description = "Explain your answer",\n required = false\n )\n public String explanation;\n}\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n String userTaskDefName = "my-user-task-def";\n\n // Compile the above Java class into a UserTaskDef\n UserTaskSchema userTask = new UserTaskSchema(new SomeForm(), userTaskDefName);\n PutUserTaskDefRequest putRequest = userTask.compile();\n\n // Register the UserTaskDef into LittleHorse\n client.putUserTaskDef(putRequest);\n\n // Get the UserTaskDef. Note that metadata creation takes 50-100ms to propagate\n // through the LittleHorse cluster.\n Thread.sleep(200);\n\n UserTaskDefId id = UserTaskDefId.newBuilder()\n .setName(userTaskDefName)\n .setVersion(0)\n .build();\n UserTaskDef result = client.getUserTaskDef(id);\n System.out.println(LHLibUtil.protoToJson(result));\n\n // Delete the UserTaskDef\n DeleteUserTaskDefRequest deleteRequest = DeleteUserTaskDefRequest.newBuilder()\n .setId(id)\n .build();\n\n client.deleteUserTaskDef(deleteRequest);\n }\n}\n'})})]}),(0,o.jsxs)(l.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["To create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," in Go, you can create the ",(0,o.jsx)(n.code,{children:"PutUserTaskDefRequest"})," object."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\ndescription := "this is a cool usertaskdef!"\nresult, err := (*client).PutUserTaskDef(context.Background(),\n &lhproto.PutUserTaskDefRequest{\n Name: "my-user-task",\n\t\tFields: []*lhproto.UserTaskField{\n\t\t\t&lhproto.UserTaskField{\n\t\t\t\tName: "my-first-int-field",\n\t\t\t\tType: lhproto.VariableType_INT,\n\t\t\t},\n\t\t\t&lhproto.UserTaskField{\n\t\t\t\tName: "my-second-str-field",\n\t\t\t\tType: lhproto.VariableType_STR,\n\t\t\t},\n\t\t},\n\t\tDescription: &description,\n },\n)\n'})})]}),(0,o.jsxs)(l.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["In python, you can create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," using ",(0,o.jsx)(n.a,{href:"/docs/api#putusertaskdef",children:(0,o.jsx)(n.code,{children:"rpc PutUserTaskDef"})}),"."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse import create_external_event_def\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom google.protobuf.json_format import MessageToJson\n\nfrom time import sleep\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n # Manually construct the PutUserTaskDefRequest, specifying the fields we want\n # the UserTaskRun\'s to have.\n put_user_task_def_req = PutUserTaskDefRequest(\n name="my-user-task-def",\n fields=[\n UserTaskField(\n name="isApproved",\n description="Is the request Approved?",\n display_name="Approved?",\n required=True,\n ),\n UserTaskField(\n name="explanation",\n description="Explanation or comments for decision.",\n required=False,\n display_name="Comments",\n )\n ]\n )\n\n # Create the UserTaskDef\n client.PutUserTaskDef(put_user_task_def_req)\n\n # Wait for metadata to propagate\n sleep(0.5)\n\n # Get the UserTaskDef\n user_task_def_id = UserTaskDefId(name="my-user-task-def", version=0)\n user_task_def = client.GetUserTaskDef(user_task_def_id)\n print(MessageToJson(user_task_def))\n\n # Delete the UserTaskDef\n client.DeleteUserTaskDef(DeleteUserTaskDefRequest(id=user_task_def_id))\n'})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"workfloweventdef",children:(0,o.jsx)(n.code,{children:"WorkflowEventDef"})}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(l.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["You can create, get, and delete a ",(0,o.jsx)(n.code,{children:"WorkflowEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.DeleteWorkflowEventDefRequest;\nimport io.littlehorse.sdk.common.proto.PutWorkflowEventDefRequest;\nimport io.littlehorse.sdk.common.proto.VariableType;\nimport io.littlehorse.sdk.common.proto.WorkflowEventDef;\nimport io.littlehorse.sdk.common.proto.WorkflowEventDefId;\n\npublic class Main {\n\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n PutWorkflowEventDefRequest request = PutWorkflowEventDefRequest.newBuilder()\n .setName("my-workflow-event-def")\n .setType(VariableType.STR)\n .build();\n \n\n client.putWorkflowEventDef(request);\n\n // Metadata requests in LittleHorse take 50-100 ms to propagate to the global\n // store.\n Thread.sleep(100);\n\n // Retrieve the WorkflowEventDef\n WorkflowEventDefId id = WorkflowEventDefId.newBuilder()\n .setName("my-workflow-event-def")\n .build();\n WorkflowEventDef eventDef = client.getWorkflowEventDef(id);\n System.out.println(LHLibUtil.protoToJson(eventDef));\n\n // Delete the WorkflowEventDef\n DeleteWorkflowEventDefRequest deleteRequest = DeleteWorkflowEventDefRequest.newBuilder()\n .setId(id)\n .build();\n client.deleteWorkflowEventDef(deleteRequest);\n }\n}\n'})})]}),(0,o.jsxs)(l.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["In Go, you can create a ",(0,o.jsx)(n.code,{children:"WorkflowEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nresp, err := (*client).PutWorkflowEventDef(context.Background(),\n &lhproto.PutWorkflowEventDef{\n Name: "my-workflow-event-def",\n },\n)\n'})}),(0,o.jsxs)(n.p,{children:["You can get and delete ",(0,o.jsx)(n.code,{children:"WorkflowEventDef"}),"s as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'workflowEventDefId := &lhproto.WorkflowEventDefId{\n Name: "my-workflow-event-def",\n}\need, err := (*client).GetWorkflowEventDef(context.Background(), workflowEventDefId)\n\n// delete the WorkflowEventDef\n_, err = (*client).DeleteWorkflowEventDef(context.Background(), &lhproto.DeleteWorkflowEventDefRequest{\n Id: workflowEventId,\n})\n'})})]}),(0,o.jsxs)(l.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["In Python, you can use the ",(0,o.jsx)(n.code,{children:"littlehorse.create_workflow_event_def"})," utility to more easily create a ",(0,o.jsx)(n.code,{children:"WorkflowEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse import create_workflow_event_def\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom google.protobuf.json_format import MessageToJson\n\nfrom time import sleep\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n create_workflow_event_def(name="my-workflow-event-def", config=config)\n\n # In LittleHorse, metadata updates take 50-100ms to propagate to the global\n # store.\n sleep(0.2)\n\n # Fetch the WorkflowEventDef\n workflow_event_def_id = WorkflowEventDefId(name="my-workflow-event-def")\n event_def: WorkflowEventDef = client.GetWorkflowEventDef(workflow_event_def_id)\n print(MessageToJson(event_def))\n\n # Delete the WorkflowEventDef\n client.DeleteWorkflowEventDef(DeleteWorkflowEventDefRequest(id=workflow_event_def_id))\n'})})]})]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var o=t(8215);const r={tabItem:"tabItem_Ymn6"};var s=t(4848);function l(e){let{children:n,hidden:t,className:l}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,l),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>D});var o=t(6540),r=t(8215),s=t(3104),l=t(6347),i=t(205),a=t(7485),c=t(1682),d=t(679);function f(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 u(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return f(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 h(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,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(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=u(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(!h({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,f]=p({queryString:t,groupId:r}),[m,g]=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}),k=(()=>{const e=c??m;return h({value:e,tabValues:s})?e:null})();(0,i.A)((()=>{k&&a(k)}),[k]);return{selectedValue:l,selectValue:(0,o.useCallback)((e=>{if(!h({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),f(e),g(e)}),[f,g,s]),tabValues:s}}var g=t(2303);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(4848);function w(e){let{className:n,block:t,selectedValue:o,selectValue:l,tabValues:i}=e;const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),r=i[t].value;r!==o&&(c(n),l(r))},f=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,x.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,x.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>a.push(e),onKeyDown:f,onClick:d,...s,className:(0,r.A)("tabs__item",k.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function v(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,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function j(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",k.tabList),children:[(0,x.jsx)(w,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function D(e){const n=(0,g.A)();return(0,x.jsx)(j,{...e,children:f(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function l(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:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/150c26e9.dfc9c07e.js b/assets/js/150c26e9.dfc9c07e.js deleted file mode 100644 index 452534b34..000000000 --- a/assets/js/150c26e9.dfc9c07e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[4792],{4591:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=t(4848),r=t(8453),s=t(1470),a=t(9365);const i={},l="Managing Metadata",c={id:"developer-guide/grpc/managing-metadata",title:"Managing Metadata",description:"Before you can run a WfRun, you need to create your WfSpec's! This guide shows you how to do that.",source:"@site/docs/05-developer-guide/09-grpc/05-managing-metadata.md",sourceDirName:"05-developer-guide/09-grpc",slug:"/developer-guide/grpc/managing-metadata",permalink:"/docs/developer-guide/grpc/managing-metadata",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Background",permalink:"/docs/developer-guide/grpc/basics"},next:{title:"Running a Workflow",permalink:"/docs/developer-guide/grpc/running-workflows"}},d={},u=[{value:"TaskDef",id:"taskdef",level:2},{value:"WfSpec",id:"wfspec",level:2},{value:"ExternalEventDef",id:"externaleventdef",level:2},{value:"UserTaskDef",id:"usertaskdef",level:2}];function f(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"managing-metadata",children:"Managing Metadata"})}),"\n",(0,o.jsxs)(n.p,{children:["Before you can run a ",(0,o.jsx)(n.code,{children:"WfRun"}),", you need to create your ",(0,o.jsx)(n.code,{children:"WfSpec"}),"'s! This guide shows you how to do that."]}),"\n",(0,o.jsxs)(n.p,{children:["You can manage Metadata Objects (",(0,o.jsx)(n.code,{children:"WfSpec"}),", ",(0,o.jsx)(n.code,{children:"TaskDef"}),", ",(0,o.jsx)(n.code,{children:"ExternalEventDef"}),", and ",(0,o.jsx)(n.code,{children:"UserTaskDef"}),") either using ",(0,o.jsx)(n.code,{children:"lhctl"})," or with a grpc client. This section details how to manage them using the SDK's and grpc clients."]}),"\n",(0,o.jsxs)(n.p,{children:["Please note that, in LittleHorse, all metadata requests are idempotent. Additionally, if you make a metadata request to ",(0,o.jsx)(n.code,{children:"Put"})," an object with the exact same specifications of the object that already exists, the API will return the ",(0,o.jsx)(n.code,{children:"OK"})," grpc status. This is useful so that you can safely use CI/CD pipelines to manage metadata, or use a script that runs upon application startup to manage metadata, without having to catch ",(0,o.jsx)(n.code,{children:"ALREADY_EXISTS"})," errors."]}),"\n",(0,o.jsx)(n.h2,{id:"taskdef",children:(0,o.jsx)(n.code,{children:"TaskDef"})}),"\n",(0,o.jsxs)(n.p,{children:["In general, the easiest way to register a ",(0,o.jsx)(n.code,{children:"TaskDef"})," in LittleHorse is through a ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," object or struct."]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(a.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsx)(n.p,{children:"Let's say I have a properly-annotated Task Worker class:"}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'class Greeter {\n @LHTaskMethod("greet")\n public String greeting(String name) {\n return "Hello there, " + name;\n }\n}\n'})}),(0,o.jsxs)(n.p,{children:["You can use the ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," to create the ",(0,o.jsx)(n.code,{children:"TaskDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'LHConfig config = ...;\nLHTaskWorker worker = new LHTaskWorker(new Greeter(), "greeting", config);\nworker.registerTaskDef();\n'})}),(0,o.jsxs)(n.p,{children:["You can get a ",(0,o.jsx)(n.code,{children:"TaskDef"})," or delete it using the grpc client:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'LittleHorseBlockingStub client = ...;\n\n// Get a TaskDef\nTaskDefId taskId = TaskDefId.newBuilder().setName("my-task").build();\nTaskDef myTask = client.getTaskDef(taskId);\n\n// Delete the task\nclient.deleteTaskDef(DeleteTaskDefRequest.newBuilder().setId(taskId).build());\n'})})]}),(0,o.jsxs)(a.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["You can use the ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," struct to automatically register a ",(0,o.jsx)(n.code,{children:"TaskDef"})," from your Task Function. First, create your ",(0,o.jsx)(n.code,{children:"LHTaskWorker"})," as follows (assuming that ",(0,o.jsx)(n.code,{children:"myTaskFunc"})," is a function pointer to your Task Function):"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\ntw, _ := taskworker.NewTaskWorker(config, myTaskFunc, "my-task")\n\n_, err := tw.RegisterTaskDef()\n'})}),(0,o.jsxs)(n.p,{children:["The above automatically generates a ",(0,o.jsx)(n.code,{children:"TaskDef"})," from the function signature using GoLang reflection, and registers it with the API."]}),(0,o.jsxs)(n.p,{children:["You can get and delete ",(0,o.jsx)(n.code,{children:"TaskDef"}),"'s as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'client, _ := config.GetGrpcClient()\ntaskDefId := &lhproto.TaskDefId{Name: "my-task"}\n\ntaskDef, err := (*client).GetTaskDef(context.Background(), taskDefId)\n\n// delete the TaskDef\n_, err = (*client).DeleteTaskDef(context.Background(), &lhproto.DeleteTaskDefRequest{\n Id: taskDefId,\n})\n'})})]}),(0,o.jsxs)(a.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["In the Python SDK, a function must be ",(0,o.jsx)(n.code,{children:"async"})," in order to be used as a Task Function. No annotations are required."]}),(0,o.jsxs)(n.p,{children:["The easiest way to register a ",(0,o.jsx)(n.code,{children:"TaskDef"})," to your LittleHorse Cluster is using the ",(0,o.jsx)(n.code,{children:"littlehorse.create_task_def()"})," utility function. The following example defines a Task Function and creates a ",(0,o.jsx)(n.code,{children:"TaskDef"})," in the LittleHorse Cluster."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'import asyncio\nfrom littlehorse import create_task_def\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model.service_pb2 import *\nfrom google.protobuf.json_format import MessageToJson\n\n\n# This is the Task Function. It must be `async`.\nasync def greet(name: str) -> None:\n print(f"Hello there, {name}!")\n\n\nasync def main():\n config = LHConfig()\n\n # Let\'s use the string "greet-task" as the TaskDef\'s name\n create_task_def(greet, "greet-task", config)\n\n\nif __name__ == \'__main__\':\n asyncio.run(main())\n'})}),(0,o.jsxs)(n.p,{children:["You can delete a ",(0,o.jsx)(n.code,{children:"TaskDef"})," in python using the ",(0,o.jsx)(n.code,{children:"LittleHorseStub"})," and the ",(0,o.jsx)(n.a,{href:"/docs/api#deletetaskdef",children:(0,o.jsx)(n.code,{children:"rpc DeleteTaskDef"})}),". An example is shown below:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:"from littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == '__main__':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n # Formulate the request\n delete_td_request = DeleteTaskDefRequest(id=TaskDefId(name=\"greet-task\"))\n\n # Delete the TaskDef\n client.DeleteTaskDef(delete_td_request)\n"})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"wfspec",children:(0,o.jsx)(n.code,{children:"WfSpec"})}),"\n",(0,o.jsxs)(n.p,{children:["In LittleHorse, the easiest way to deploy a ",(0,o.jsx)(n.code,{children:"WfSpec"})," is using the ",(0,o.jsx)(n.code,{children:"Workflow"})," class or struct provided by our Java, Go, and Python SDK's. The ",(0,o.jsx)(n.code,{children:"Workflow"})," class takes in a ",(0,o.jsx)(n.code,{children:"WorkflowThread"})," function reference that defines your ",(0,o.jsx)(n.code,{children:"WfSpec"})," logic (this is covered in the ",(0,o.jsx)(n.a,{href:"/docs/developer-guide/wfspec-development/",children:"Developing Workflows Documentation"}),"), and has a ",(0,o.jsx)(n.code,{children:"compile()"})," method which returns a ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Like other metadata requests, the ",(0,o.jsx)(n.code,{children:"rpc PutWfSpec"})," is idempotent. However, as described in our ",(0,o.jsxs)(n.a,{href:"/docs/concepts/advanced/wfspec-versioning",children:[(0,o.jsx)(n.code,{children:"WfSpec"})," Versioning docs"]}),", ",(0,o.jsx)(n.code,{children:"WfSpec"})," objects have compound versioning that enforces certain compatibility rules between versions. In the ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"}),", you have the option to set the ",(0,o.jsx)(n.code,{children:"allowed_updates"})," field of the ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"}),". There are three values:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"ALL_UPDATES"}),": both breaking changes and minor revisions are accepted."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"MINOR_REVISION_UPDATES"}),": breaking changes are rejected, but minor revisions are accepted."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"NO_UPDATES"}),": the request will fail if the specified new ",(0,o.jsx)(n.code,{children:"WfSpec"})," differs from the latest version."]}),"\n"]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(a.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["You can execute the ",(0,o.jsx)(n.code,{children:"PutWfSpecRequest"})," with a specific ",(0,o.jsx)(n.code,{children:"AllowedUpdateType"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.wfsdk.Workflow;\nimport io.littlehorse.sdk.wfsdk.WorkflowThread;\nimport io.littlehorse.sdk.common.proto.AllowedUpdateType;\nimport io.littlehorse.sdk.common.proto.PutWfSpecRequest;\nimport io.littlehorse.sdk.common.proto.WfSpec;\n\npublic class Main {\n\n private static void wfFunc(WorkflowThread wf) {\n // The `greet` TaskDef must already exist\n wf.execute("greet", "some-name");\n }\n\n public static void main(String[] args) throws IOException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n Workflow workflow = Workflow.newWorkflow("my-wfspec", Main::wfFunc);\n\n // Only allow updates that do not change the API of the WfSpec\n workflow.withUpdateType(AllowedUpdateType.MINOR_REVISION_UPDATES);\n\n PutWfSpecRequest request = workflow.compileWorkflow();\n WfSpec result = client.putWfSpec(request);\n\n System.out.println(LHLibUtil.protoToJson(result));\n }\n}\n'})}),(0,o.jsxs)(n.p,{children:["You can get or delete a ",(0,o.jsx)(n.code,{children:"WfSpec"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.DeleteWfSpecRequest;\nimport io.littlehorse.sdk.common.proto.WfSpec;\nimport io.littlehorse.sdk.common.proto.WfSpecId;\n\npublic class Main {\n\n public static void main(String[] args) throws IOException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n WfSpecId wfSpecId = WfSpecId.newBuilder()\n .setName("my-wfspec")\n .setMajorVersion(0) // Set to whichever major version you want\n .setRevision(0) // Set to whichever revision you want\n .build();\n\n WfSpec wfSpec = client.getWfSpec(wfSpecId);\n System.out.println(LHLibUtil.protoToJson(wfSpec));\n\n // Delete the WfSpec\n DeleteWfSpecRequest req = DeleteWfSpecRequest.newBuilder().setId(wfSpecId).build();\n client.deleteWfSpec(req);\n }\n}\n'})})]}),(0,o.jsxs)(a.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["Assuming that you have a function ",(0,o.jsx)(n.code,{children:"basic.MyWorkflow"})," which is a valid Workflow Function in Go, you can create a ",(0,o.jsx)(n.code,{children:"WfSpec"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nwf := littlehorse.NewWorkflow(basic.MyWorkflow, "my-workflow").WithUpdateType(lhproto.AllowedUpdateType_MINOR_REVISION_UPDATES)\nputWf, _ := wf.Compile()\n\nresp, err := (*client).PutWfSpec(context.Background(), putWf)\n'})}),(0,o.jsxs)(n.p,{children:["You can get and delete ",(0,o.jsx)(n.code,{children:"WfSpec"}),"s as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'wfSpecId := &lhproto.WfSpecId{\n Name: "my-wf",\n MajorVersion: 2,\n Revision: 1,\n}\n\nwfSpec, err := (*client).GetWfSpec(context.Background(), wfSpecId)\n\n// Get the latest wfSpec. Setting majorVersion is optional for this request\nmajorVersion := int32(2)\n\nsomeWf, err := (*client).GetLatestWfSpec(\n context.Background(),\n &lhproto.GetLatestWfSpecRequest{\n Name: "some-wf",\n MajorVersion: &majorVersion,\n },\n)\n\n// delete the WfSpec\n_, err = (*client).DeleteWfSpec(context.Background(), &lhproto.DeleteWfSpecRequest{\n Id: wfSpecId,\n})\n'})})]}),(0,o.jsxs)(a.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["Assuming you have a workflow, you can use the ",(0,o.jsx)(n.code,{children:"littlehorse.create_workflow_spec()"})," utility function."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom littlehorse.workflow import Workflow, WorkflowThread\nfrom google.protobuf.json_format import MessageToJson\n\n# The workflow logic. This function must have type annotations in\n# order to conform to the `ThreadInitializer` interface.\ndef my_workflow_func(wf: WorkflowThread) -> None:\n # the `greet` TaskDef must already exist\n wf.execute("greet", "some-name")\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n workflow: Workflow = Workflow("my-wfspec", my_workflow_func)\n # Set the allowed update type\n workflow.with_update_type(AllowedUpdateType.MINOR_REVISION_UPDATES)\n\n # Create the WfSpec\n request: PutWfSpecRequest = workflow.compile()\n wf_spec: WfSpec = client.PutWfSpec(request)\n\n print(MessageToJson(wf_spec))\n'})}),(0,o.jsxs)(n.p,{children:["You can get or delete a WfSpec using a ",(0,o.jsx)(n.code,{children:"stub"}),":"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom littlehorse.workflow import Workflow, WorkflowThread\nfrom google.protobuf.json_format import MessageToJson\n\n# The workflow logic. This function must have type annotations in\n# order to conform to the `ThreadInitializer` interface.\ndef my_workflow_func(wf: WorkflowThread) -> None:\n # the `greet` TaskDef must already exist\n wf.execute("greet", "some-name")\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n wf_spec_id: WfSpecId = WfSpecId(\n name="my-wfspec",\n major_version=0, # replace with your preferred major version\n revision=0, # replaced with your desired revision\n )\n wf_spec: WfSpec = client.GetWfSpec(wf_spec_id)\n\n print(MessageToJson(wf_spec))\n\n # Delete a WfSpec\n client.DeleteWfSpec(DeleteWfSpecRequest(id=wf_spec_id))\n'})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"externaleventdef",children:(0,o.jsx)(n.code,{children:"ExternalEventDef"})}),"\n",(0,o.jsxs)(n.p,{children:["As of now, the only field required to create an ",(0,o.jsx)(n.code,{children:"ExternalEventDef"})," is the ",(0,o.jsx)(n.code,{children:"name"})," of the ",(0,o.jsx)(n.code,{children:"ExternalEventDef"}),"."]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(a.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["You can create, get, and delete an ",(0,o.jsx)(n.code,{children:"ExternalEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.DeleteExternalEventDefRequest;\nimport io.littlehorse.sdk.common.proto.ExternalEventDef;\nimport io.littlehorse.sdk.common.proto.ExternalEventDefId;\nimport io.littlehorse.sdk.common.proto.PutExternalEventDefRequest;\n\npublic class Main {\n\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n PutExternalEventDefRequest request = PutExternalEventDefRequest.newBuilder()\n .setName("my-external-event-def")\n .build();\n\n client.putExternalEventDef(request);\n\n // Metadata requests in LittleHorse take 50-100 ms to propagate to the global\n // store.\n Thread.sleep(100);\n\n // Retrieve the ExternalEventDef\n ExternalEventDefId id = ExternalEventDefId.newBuilder()\n .setName("my-external-event-def")\n .build();\n ExternalEventDef eventDef = client.getExternalEventDef(id);\n System.out.println(LHLibUtil.protoToJson(eventDef));\n\n // Delete the ExternalEventDef\n DeleteExternalEventDefRequest deleteRequest = DeleteExternalEventDefRequest.newBuilder()\n .setId(id)\n .build();\n client.deleteExternalEventDef(deleteRequest);\n }\n}\n'})})]}),(0,o.jsxs)(a.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["Assuming that you have a function ",(0,o.jsx)(n.code,{children:"basic.MyWorkflow"})," which is a valid Workflow Function in Go, you can create a ",(0,o.jsx)(n.code,{children:"WfSpec"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\nresp, err := (*client).PutExternalEventDef(context.Background(),\n &lhproto.PutExternalEventDefRequest{\n Name: "some-event",\n },\n)\n'})}),(0,o.jsxs)(n.p,{children:["You can get and delete ",(0,o.jsx)(n.code,{children:"ExternalEventDef"}),"s as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'externalEventDefId := &lhproto.ExternalEventDefId{\n Name: "some-event",\n}\need, err := (*client).GetExternalEventDef(context.Background(), externalEventDefId)\n\n// delete the ExternalEventDef\n_, err = (*client).DeleteExternalEventDef(context.Background(), &lhproto.DeleteExternalEventDefRequest{\n Id: externalEventDefId,\n})\n'})})]}),(0,o.jsxs)(a.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["In python, you can use the ",(0,o.jsx)(n.code,{children:"littlehorse.create_external_event_def"})," utility to more easily create an ",(0,o.jsx)(n.code,{children:"ExternalEventDef"})," as follows:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse import create_external_event_def\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom google.protobuf.json_format import MessageToJson\n\nfrom time import sleep\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n create_external_event_def(name="my-external-event-def", config=config)\n\n # In LittleHorse, metadata updates take 50-100ms to propagate to the global\n # store.\n sleep(0.2)\n\n # Fetch the ExternalEventDef\n external_event_def_id = ExternalEventDefId(name="my-external-event-def")\n event_def: ExternalEventDef = client.GetExternalEventDef(external_event_def_id)\n print(MessageToJson(event_def))\n\n # Delete the ExternalEventDef\n client.DeleteExternalEventDef(DeleteExternalEventDefRequest(id=external_event_def_id))\n'})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"usertaskdef",children:(0,o.jsx)(n.code,{children:"UserTaskDef"})}),"\n",(0,o.jsxs)(n.p,{children:["A ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," specifies the data that needs to be filled out in a form for a human to complete a ",(0,o.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Note that a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," is a versioned object (unlike a ",(0,o.jsx)(n.code,{children:"WfSpec"}),", however, there is only a ",(0,o.jsx)(n.code,{children:"version"})," number and no ",(0,o.jsx)(n.code,{children:"revision"}),"). As such, getting and deleting ",(0,o.jsx)(n.code,{children:"UserTaskDef"}),"s follows a similar pattern: we provide a ",(0,o.jsx)(n.code,{children:"GetLatestUserTaskDef"})," rpc call which allows you to get the latest ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," with a given name."]}),"\n",(0,o.jsxs)(s.A,{children:[(0,o.jsxs)(a.A,{value:"java",label:"Java",default:!0,children:[(0,o.jsxs)(n.p,{children:["The easiest way to create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," in Java is using the ",(0,o.jsx)(n.code,{children:"UserTaskSchema"})," class. Note that it infers the schema of the ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," from our ",(0,o.jsx)(n.code,{children:"MyForm"})," class using the ",(0,o.jsx)(n.code,{children:"UserTaskField"})," annotation."]}),(0,o.jsxs)(n.p,{children:["The below example shows you how to create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"}),", get it, and delete it."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.usertask.UserTaskSchema;\nimport io.littlehorse.sdk.usertask.annotations.UserTaskField;\nimport io.littlehorse.sdk.common.proto.DeleteUserTaskDefRequest;\nimport io.littlehorse.sdk.common.proto.PutUserTaskDefRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskDef;\nimport io.littlehorse.sdk.common.proto.UserTaskDefId;\n\n// This Java class defines our form for the UserTaskDef\nclass SomeForm {\n @UserTaskField(\n displayName = "Approved?",\n description = "Reply \'true\' if this is an acceptable request."\n )\n public boolean isApproved;\n\n @UserTaskField(\n displayName = "Explanation",\n description = "Explain your answer",\n required = false\n )\n public String explanation;\n}\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n String userTaskDefName = "my-user-task-def";\n\n // Compile the above Java class into a UserTaskDef\n UserTaskSchema userTask = new UserTaskSchema(new SomeForm(), userTaskDefName);\n PutUserTaskDefRequest putRequest = userTask.compile();\n\n // Register the UserTaskDef into LittleHorse\n client.putUserTaskDef(putRequest);\n\n // Get the UserTaskDef. Note that metadata creation takes 50-100ms to propagate\n // through the LittleHorse cluster.\n Thread.sleep(200);\n\n UserTaskDefId id = UserTaskDefId.newBuilder()\n .setName(userTaskDefName)\n .setVersion(0)\n .build();\n UserTaskDef result = client.getUserTaskDef(id);\n System.out.println(LHLibUtil.protoToJson(result));\n\n // Delete the UserTaskDef\n DeleteUserTaskDefRequest deleteRequest = DeleteUserTaskDefRequest.newBuilder()\n .setId(id)\n .build();\n\n client.deleteUserTaskDef(deleteRequest);\n }\n}\n'})})]}),(0,o.jsxs)(a.A,{value:"go",label:"Go",children:[(0,o.jsxs)(n.p,{children:["To create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," in Go, you can create the ",(0,o.jsx)(n.code,{children:"PutUserTaskDefRequest"})," object."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-go",children:'config := littlehorse.NewConfigFromEnv()\nclient, err := config.GetGrpcClient()\n\ndescription := "this is a cool usertaskdef!"\nresult, err := (*client).PutUserTaskDef(context.Background(),\n &lhproto.PutUserTaskDefRequest{\n Name: "my-user-task",\n\t\tFields: []*lhproto.UserTaskField{\n\t\t\t&lhproto.UserTaskField{\n\t\t\t\tName: "my-first-int-field",\n\t\t\t\tType: lhproto.VariableType_INT,\n\t\t\t},\n\t\t\t&lhproto.UserTaskField{\n\t\t\t\tName: "my-second-str-field",\n\t\t\t\tType: lhproto.VariableType_STR,\n\t\t\t},\n\t\t},\n\t\tDescription: &description,\n },\n)\n'})})]}),(0,o.jsxs)(a.A,{value:"python",label:"Python",children:[(0,o.jsxs)(n.p,{children:["In python, you can create a ",(0,o.jsx)(n.code,{children:"UserTaskDef"})," using ",(0,o.jsx)(n.a,{href:"/docs/api#putusertaskdef",children:(0,o.jsx)(n.code,{children:"rpc PutUserTaskDef"})}),"."]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-python",children:'from littlehorse import create_external_event_def\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom google.protobuf.json_format import MessageToJson\n\nfrom time import sleep\n\n\nif __name__ == \'__main__\':\n # Get the grpc client\n config = LHConfig()\n client = config.stub()\n\n # Manually construct the PutUserTaskDefRequest, specifying the fields we want\n # the UserTaskRun\'s to have.\n put_user_task_def_req = PutUserTaskDefRequest(\n name="my-user-task-def",\n fields=[\n UserTaskField(\n name="isApproved",\n description="Is the request Approved?",\n display_name="Approved?",\n required=True,\n ),\n UserTaskField(\n name="explanation",\n description="Explanation or comments for decision.",\n required=False,\n display_name="Comments",\n )\n ]\n )\n\n # Create the UserTaskDef\n client.PutUserTaskDef(put_user_task_def_req)\n\n # Wait for metadata to propagate\n sleep(0.5)\n\n # Get the UserTaskDef\n user_task_def_id = UserTaskDefId(name="my-user-task-def", version=0)\n user_task_def = client.GetUserTaskDef(user_task_def_id)\n print(MessageToJson(user_task_def))\n\n # Delete the UserTaskDef\n client.DeleteUserTaskDef(DeleteUserTaskDefRequest(id=user_task_def_id))\n'})})]})]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(f,{...e})}):f(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var o=t(8215);const r={tabItem:"tabItem_Ymn6"};var s=t(4848);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})}},1470:(e,n,t)=>{t.d(n,{A:()=>T});var o=t(6540),r=t(8215),s=t(3104),a=t(6347),i=t(205),l=t(7485),c=t(1682),d=t(679);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 f(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 h(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,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 m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=f(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(!h({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:r}),[m,g]=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}),k=(()=>{const e=c??m;return h({value:e,tabValues:s})?e:null})();(0,i.A)((()=>{k&&l(k)}),[k]);return{selectedValue:a,selectValue:(0,o.useCallback)((e=>{if(!h({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=t(2303);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(4848);function j(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,x.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,x.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",k.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function v(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,x.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function w(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",k.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function T(e){const n=(0,g.A)();return(0,x.jsx)(w,{...e,children:u(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var o=t(6540);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/1e599e21.061f6caa.js b/assets/js/1e599e21.061f6caa.js new file mode 100644 index 000000000..cc51dcd81 --- /dev/null +++ b/assets/js/1e599e21.061f6caa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[4198],{8289:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>i});var r=t(4848),d=t(8453);const a={},o="Advanced",c={id:"developer-guide/grpc/advanced/advanced",title:"Advanced",description:"If you've made it here, congratulations!",source:"@site/docs/05-developer-guide/09-grpc/40-advanced/40-advanced.md",sourceDirName:"05-developer-guide/09-grpc/40-advanced",slug:"/developer-guide/grpc/advanced/",permalink:"/docs/developer-guide/grpc/advanced/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:40,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Handling User Tasks",permalink:"/docs/developer-guide/grpc/user-tasks"},next:{title:"Await Workflow Events",permalink:"/docs/developer-guide/grpc/advanced/await-workflow-events"}},s={},i=[];function u(e){const n={h1:"h1",header:"header",p:"p",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"advanced",children:"Advanced"})}),"\n",(0,r.jsx)(n.p,{children:"If you've made it here, congratulations!"})]})}function l(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const d={},a=r.createContext(d);function o(e){const n=r.useContext(a);return r.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(d):e.components||d:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a162317.e1b94b47.js b/assets/js/2a162317.e1b94b47.js deleted file mode 100644 index c7325076b..000000000 --- a/assets/js/2a162317.e1b94b47.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[7828],{4620:(e,s,d)=>{d.r(s),d.d(s,{assets:()=>l,contentTitle:()=>i,default:()=>x,frontMatter:()=>t,metadata:()=>h,toc:()=>c});var r=d(4848),n=d(8453);const t={},i="LittleHorse API Reference",h={id:"api",title:"LittleHorse API Reference",description:"The LittleHorse Server exposes a GRPC API to its clients. For most general usage of LittleHorse, you will not need to",source:"@site/docs/08-api.md",sourceDirName:".",slug:"/api",permalink:"/docs/api",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Tips, Pointers, and FAQ",permalink:"/docs/faq"}},l={},c=[{value:"LittleHorse GRPC API",id:"littlehorse-grpc-api",level:2},{value:"RPC PutTaskDef",id:"puttaskdef",level:3},{value:"RPC GetTaskDef",id:"gettaskdef",level:3},{value:"RPC GetTaskWorkerGroup",id:"gettaskworkergroup",level:3},{value:"RPC PutExternalEventDef",id:"putexternaleventdef",level:3},{value:"RPC GetExternalEventDef",id:"getexternaleventdef",level:3},{value:"RPC PutWorkflowEventDef",id:"putworkfloweventdef",level:3},{value:"RPC PutWfSpec",id:"putwfspec",level:3},{value:"RPC GetWfSpec",id:"getwfspec",level:3},{value:"RPC GetLatestWfSpec",id:"getlatestwfspec",level:3},{value:"RPC MigrateWfSpec",id:"migratewfspec",level:3},{value:"RPC PutUserTaskDef",id:"putusertaskdef",level:3},{value:"RPC GetUserTaskDef",id:"getusertaskdef",level:3},{value:"RPC GetLatestUserTaskDef",id:"getlatestusertaskdef",level:3},{value:"RPC RunWf",id:"runwf",level:3},{value:"RPC ScheduleWf",id:"schedulewf",level:3},{value:"RPC SearchScheduledWfRun",id:"searchscheduledwfrun",level:3},{value:"RPC GetScheduledWfRun",id:"getscheduledwfrun",level:3},{value:"RPC GetWfRun",id:"getwfrun",level:3},{value:"RPC GetUserTaskRun",id:"getusertaskrun",level:3},{value:"RPC AssignUserTaskRun",id:"assignusertaskrun",level:3},{value:"RPC CompleteUserTaskRun",id:"completeusertaskrun",level:3},{value:"RPC CancelUserTaskRun",id:"cancelusertaskrun",level:3},{value:"RPC SaveUserTaskRunProgress",id:"saveusertaskrunprogress",level:3},{value:"RPC ListUserTaskRuns",id:"listusertaskruns",level:3},{value:"RPC GetNodeRun",id:"getnoderun",level:3},{value:"RPC ListNodeRuns",id:"listnoderuns",level:3},{value:"RPC GetTaskRun",id:"gettaskrun",level:3},{value:"RPC ListTaskRuns",id:"listtaskruns",level:3},{value:"RPC GetVariable",id:"getvariable",level:3},{value:"RPC ListVariables",id:"listvariables",level:3},{value:"RPC PutExternalEvent",id:"putexternalevent",level:3},{value:"RPC GetExternalEvent",id:"getexternalevent",level:3},{value:"RPC AwaitWorkflowEvent",id:"awaitworkflowevent",level:3},{value:"RPC GetWorkflowEvent",id:"getworkflowevent",level:3},{value:"RPC ListExternalEvents",id:"listexternalevents",level:3},{value:"RPC SearchWfRun",id:"searchwfrun",level:3},{value:"RPC SearchNodeRun",id:"searchnoderun",level:3},{value:"RPC SearchTaskRun",id:"searchtaskrun",level:3},{value:"RPC SearchUserTaskRun",id:"searchusertaskrun",level:3},{value:"RPC SearchVariable",id:"searchvariable",level:3},{value:"RPC SearchExternalEvent",id:"searchexternalevent",level:3},{value:"RPC SearchTaskDef",id:"searchtaskdef",level:3},{value:"RPC SearchUserTaskDef",id:"searchusertaskdef",level:3},{value:"RPC SearchWfSpec",id:"searchwfspec",level:3},{value:"RPC SearchExternalEventDef",id:"searchexternaleventdef",level:3},{value:"RPC SearchTenant",id:"searchtenant",level:3},{value:"RPC SearchPrincipal",id:"searchprincipal",level:3},{value:"RPC RegisterTaskWorker",id:"registertaskworker",level:3},{value:"RPC PollTask",id:"polltask",level:3},{value:"RPC ReportTask",id:"reporttask",level:3},{value:"RPC StopWfRun",id:"stopwfrun",level:3},{value:"RPC ResumeWfRun",id:"resumewfrun",level:3},{value:"RPC RescueThreadRun",id:"rescuethreadrun",level:3},{value:"RPC DeleteWfRun",id:"deletewfrun",level:3},{value:"RPC DeleteTaskDef",id:"deletetaskdef",level:3},{value:"RPC DeleteWfSpec",id:"deletewfspec",level:3},{value:"RPC DeleteUserTaskDef",id:"deleteusertaskdef",level:3},{value:"RPC DeleteExternalEventDef",id:"deleteexternaleventdef",level:3},{value:"RPC DeletePrincipal",id:"deleteprincipal",level:3},{value:"RPC DeleteScheduledWfRun",id:"deletescheduledwfrun",level:3},{value:"RPC GetTaskDefMetricsWindow",id:"gettaskdefmetricswindow",level:3},{value:"RPC GetWfSpecMetricsWindow",id:"getwfspecmetricswindow",level:3},{value:"RPC ListTaskDefMetrics",id:"listtaskdefmetrics",level:3},{value:"RPC ListWfSpecMetrics",id:"listwfspecmetrics",level:3},{value:"RPC PutTenant",id:"puttenant",level:3},{value:"RPC GetTenant",id:"gettenant",level:3},{value:"RPC PutPrincipal",id:"putprincipal",level:3},{value:"RPC Whoami",id:"whoami",level:3},{value:"RPC GetServerVersion",id:"getserverversion",level:3},{value:"LittleHorse Protobuf Schemas",id:"littlehorse-protobuf-schemas",level:2},{value:"Message DeletePrincipalRequest",id:"deleteprincipalrequest",level:3},{value:"Message Principal",id:"principal",level:3},{value:"Message Principal.PerTenantAclsEntry",id:"principalpertenantaclsentry",level:3},{value:"Message PutPrincipalRequest",id:"putprincipalrequest",level:3},{value:"Message PutPrincipalRequest.PerTenantAclsEntry",id:"putprincipalrequestpertenantaclsentry",level:3},{value:"Message PutTenantRequest",id:"puttenantrequest",level:3},{value:"Message ServerACL",id:"serveracl",level:3},{value:"Message ServerACLs",id:"serveracls",level:3},{value:"Message Tenant",id:"tenant",level:3},{value:"Message ExponentialBackoffRetryPolicy",id:"exponentialbackoffretrypolicy",level:3},{value:"Message TaskNode",id:"tasknode",level:3},{value:"Message UTActionTrigger",id:"utactiontrigger",level:3},{value:"Message UTActionTrigger.UTACancel",id:"utactiontriggerutacancel",level:3},{value:"Message UTActionTrigger.UTAReassign",id:"utactiontriggerutareassign",level:3},{value:"Message UTActionTrigger.UTATask",id:"utactiontriggerutatask",level:3},{value:"Message VariableAssignment",id:"variableassignment",level:3},{value:"Message VariableAssignment.FormatString",id:"variableassignmentformatstring",level:3},{value:"Message VariableDef",id:"variabledef",level:3},{value:"Message VariableMutation",id:"variablemutation",level:3},{value:"Message VariableMutation.NodeOutputSource",id:"variablemutationnodeoutputsource",level:3},{value:"Message ExternalEvent",id:"externalevent",level:3},{value:"Message ExternalEventDef",id:"externaleventdef",level:3},{value:"Message ExternalEventRetentionPolicy",id:"externaleventretentionpolicy",level:3},{value:"Message EntrypointRun",id:"entrypointrun",level:3},{value:"Message ExitRun",id:"exitrun",level:3},{value:"Message ExternalEventNodeRun",id:"externaleventnoderun",level:3},{value:"Message Failure",id:"failure",level:3},{value:"Message NodeRun",id:"noderun",level:3},{value:"Message SleepNodeRun",id:"sleepnoderun",level:3},{value:"Message StartMultipleThreadsRun",id:"startmultiplethreadsrun",level:3},{value:"Message StartThreadRun",id:"startthreadrun",level:3},{value:"Message TaskNodeRun",id:"tasknoderun",level:3},{value:"Message ThrowEventNodeRun",id:"throweventnoderun",level:3},{value:"Message UserTaskNodeRun",id:"usertasknoderun",level:3},{value:"Message WaitForConditionRun",id:"waitforconditionrun",level:3},{value:"Message WaitForThreadsRun",id:"waitforthreadsrun",level:3},{value:"Message WaitForThreadsRun.WaitForThread",id:"waitforthreadsrunwaitforthread",level:3},{value:"Message ExternalEventDefId",id:"externaleventdefid",level:3},{value:"Message ExternalEventId",id:"externaleventid",level:3},{value:"Message NodeRunId",id:"noderunid",level:3},{value:"Message PrincipalId",id:"principalid",level:3},{value:"Message ScheduledWfRunId",id:"scheduledwfrunid",level:3},{value:"Message TaskDefId",id:"taskdefid",level:3},{value:"Message TaskDefMetricsId",id:"taskdefmetricsid",level:3},{value:"Message TaskRunId",id:"taskrunid",level:3},{value:"Message TaskWorkerGroupId",id:"taskworkergroupid",level:3},{value:"Message TenantId",id:"tenantid",level:3},{value:"Message UserTaskDefId",id:"usertaskdefid",level:3},{value:"Message UserTaskRunId",id:"usertaskrunid",level:3},{value:"Message VariableId",id:"variableid",level:3},{value:"Message WfRunId",id:"wfrunid",level:3},{value:"Message WfSpecId",id:"wfspecid",level:3},{value:"Message WfSpecMetricsId",id:"wfspecmetricsid",level:3},{value:"Message WorkflowEventDefId",id:"workfloweventdefid",level:3},{value:"Message WorkflowEventId",id:"workfloweventid",level:3},{value:"Message ScheduledWfRun",id:"scheduledwfrun",level:3},{value:"Message ScheduledWfRun.VariablesEntry",id:"scheduledwfrunvariablesentry",level:3},{value:"Message AwaitWorkflowEventRequest",id:"awaitworkfloweventrequest",level:3},{value:"Message DeleteExternalEventDefRequest",id:"deleteexternaleventdefrequest",level:3},{value:"Message DeleteExternalEventRequest",id:"deleteexternaleventrequest",level:3},{value:"Message DeleteScheduledWfRunRequest",id:"deletescheduledwfrunrequest",level:3},{value:"Message DeleteTaskDefRequest",id:"deletetaskdefrequest",level:3},{value:"Message DeleteUserTaskDefRequest",id:"deleteusertaskdefrequest",level:3},{value:"Message DeleteWfRunRequest",id:"deletewfrunrequest",level:3},{value:"Message DeleteWfSpecRequest",id:"deletewfspecrequest",level:3},{value:"Message ExternalEventDefIdList",id:"externaleventdefidlist",level:3},{value:"Message ExternalEventIdList",id:"externaleventidlist",level:3},{value:"Message ExternalEventList",id:"externaleventlist",level:3},{value:"Message GetLatestUserTaskDefRequest",id:"getlatestusertaskdefrequest",level:3},{value:"Message GetLatestWfSpecRequest",id:"getlatestwfspecrequest",level:3},{value:"Message LHHostInfo",id:"lhhostinfo",level:3},{value:"Message ListExternalEventsRequest",id:"listexternaleventsrequest",level:3},{value:"Message ListNodeRunsRequest",id:"listnoderunsrequest",level:3},{value:"Message ListTaskMetricsRequest",id:"listtaskmetricsrequest",level:3},{value:"Message ListTaskMetricsResponse",id:"listtaskmetricsresponse",level:3},{value:"Message ListTaskRunsRequest",id:"listtaskrunsrequest",level:3},{value:"Message ListUserTaskRunRequest",id:"listusertaskrunrequest",level:3},{value:"Message ListVariablesRequest",id:"listvariablesrequest",level:3},{value:"Message ListWfMetricsRequest",id:"listwfmetricsrequest",level:3},{value:"Message ListWfMetricsResponse",id:"listwfmetricsresponse",level:3},{value:"Message MigrateWfSpecRequest",id:"migratewfspecrequest",level:3},{value:"Message NodeRunIdList",id:"noderunidlist",level:3},{value:"Message NodeRunList",id:"noderunlist",level:3},{value:"Message PollTaskRequest",id:"polltaskrequest",level:3},{value:"Message PollTaskResponse",id:"polltaskresponse",level:3},{value:"Message PrincipalIdList",id:"principalidlist",level:3},{value:"Message PutExternalEventDefRequest",id:"putexternaleventdefrequest",level:3},{value:"Message PutExternalEventRequest",id:"putexternaleventrequest",level:3},{value:"Message PutTaskDefRequest",id:"puttaskdefrequest",level:3},{value:"Message PutUserTaskDefRequest",id:"putusertaskdefrequest",level:3},{value:"Message PutWfSpecRequest",id:"putwfspecrequest",level:3},{value:"Message PutWfSpecRequest.ThreadSpecsEntry",id:"putwfspecrequestthreadspecsentry",level:3},{value:"Message PutWorkflowEventDefRequest",id:"putworkfloweventdefrequest",level:3},{value:"Message RegisterTaskWorkerRequest",id:"registertaskworkerrequest",level:3},{value:"Message RegisterTaskWorkerResponse",id:"registertaskworkerresponse",level:3},{value:"Message ReportTaskRun",id:"reporttaskrun",level:3},{value:"Message RescueThreadRunRequest",id:"rescuethreadrunrequest",level:3},{value:"Message ResumeWfRunRequest",id:"resumewfrunrequest",level:3},{value:"Message RunWfRequest",id:"runwfrequest",level:3},{value:"Message RunWfRequest.VariablesEntry",id:"runwfrequestvariablesentry",level:3},{value:"Message ScheduleWfRequest",id:"schedulewfrequest",level:3},{value:"Message ScheduleWfRequest.VariablesEntry",id:"schedulewfrequestvariablesentry",level:3},{value:"Message ScheduledTask",id:"scheduledtask",level:3},{value:"Message ScheduledWfRunIdList",id:"scheduledwfrunidlist",level:3},{value:"Message SearchExternalEventDefRequest",id:"searchexternaleventdefrequest",level:3},{value:"Message SearchExternalEventRequest",id:"searchexternaleventrequest",level:3},{value:"Message SearchNodeRunRequest",id:"searchnoderunrequest",level:3},{value:"Message SearchPrincipalRequest",id:"searchprincipalrequest",level:3},{value:"Message SearchScheduledWfRunRequest",id:"searchscheduledwfrunrequest",level:3},{value:"Message SearchTaskDefRequest",id:"searchtaskdefrequest",level:3},{value:"Message SearchTaskRunRequest",id:"searchtaskrunrequest",level:3},{value:"Message SearchTenantRequest",id:"searchtenantrequest",level:3},{value:"Message SearchUserTaskDefRequest",id:"searchusertaskdefrequest",level:3},{value:"Message SearchUserTaskRunRequest",id:"searchusertaskrunrequest",level:3},{value:"Message SearchVariableRequest",id:"searchvariablerequest",level:3},{value:"Message SearchWfRunRequest",id:"searchwfrunrequest",level:3},{value:"Message SearchWfSpecRequest",id:"searchwfspecrequest",level:3},{value:"Message ServerVersionResponse",id:"serverversionresponse",level:3},{value:"Message StopWfRunRequest",id:"stopwfrunrequest",level:3},{value:"Message TaskDefIdList",id:"taskdefidlist",level:3},{value:"Message TaskDefMetrics",id:"taskdefmetrics",level:3},{value:"Message TaskDefMetricsQueryRequest",id:"taskdefmetricsqueryrequest",level:3},{value:"Message TaskRunIdList",id:"taskrunidlist",level:3},{value:"Message TaskRunList",id:"taskrunlist",level:3},{value:"Message TaskWorkerGroup",id:"taskworkergroup",level:3},{value:"Message TaskWorkerGroup.TaskWorkersEntry",id:"taskworkergrouptaskworkersentry",level:3},{value:"Message TaskWorkerHeartBeatRequest",id:"taskworkerheartbeatrequest",level:3},{value:"Message TaskWorkerMetadata",id:"taskworkermetadata",level:3},{value:"Message TenantIdList",id:"tenantidlist",level:3},{value:"Message UserTaskDefIdList",id:"usertaskdefidlist",level:3},{value:"Message UserTaskRunIdList",id:"usertaskrunidlist",level:3},{value:"Message UserTaskRunList",id:"usertaskrunlist",level:3},{value:"Message VariableIdList",id:"variableidlist",level:3},{value:"Message VariableList",id:"variablelist",level:3},{value:"Message VariableMatch",id:"variablematch",level:3},{value:"Message WfRunIdList",id:"wfrunidlist",level:3},{value:"Message WfSpecIdList",id:"wfspecidlist",level:3},{value:"Message WfSpecMetrics",id:"wfspecmetrics",level:3},{value:"Message WfSpecMetricsQueryRequest",id:"wfspecmetricsqueryrequest",level:3},{value:"Message TaskDef",id:"taskdef",level:3},{value:"Message TaskDefOutputSchema",id:"taskdefoutputschema",level:3},{value:"Message LHTaskError",id:"lhtaskerror",level:3},{value:"Message LHTaskException",id:"lhtaskexception",level:3},{value:"Message TaskAttempt",id:"taskattempt",level:3},{value:"Message TaskNodeReference",id:"tasknodereference",level:3},{value:"Message TaskRun",id:"taskrun",level:3},{value:"Message TaskRunSource",id:"taskrunsource",level:3},{value:"Message VarNameAndVal",id:"varnameandval",level:3},{value:"Message AssignUserTaskRunRequest",id:"assignusertaskrunrequest",level:3},{value:"Message CancelUserTaskRunRequest",id:"cancelusertaskrunrequest",level:3},{value:"Message CompleteUserTaskRunRequest",id:"completeusertaskrunrequest",level:3},{value:"Message CompleteUserTaskRunRequest.ResultsEntry",id:"completeusertaskrunrequestresultsentry",level:3},{value:"Message SaveUserTaskRunProgressRequest",id:"saveusertaskrunprogressrequest",level:3},{value:"Message SaveUserTaskRunProgressRequest.ResultsEntry",id:"saveusertaskrunprogressrequestresultsentry",level:3},{value:"Message UserTaskDef",id:"usertaskdef",level:3},{value:"Message UserTaskEvent",id:"usertaskevent",level:3},{value:"Message UserTaskEvent.UTEAssigned",id:"usertaskeventuteassigned",level:3},{value:"Message UserTaskEvent.UTECancelled",id:"usertaskeventutecancelled",level:3},{value:"Message UserTaskEvent.UTESaved",id:"usertaskeventutesaved",level:3},{value:"Message UserTaskEvent.UTESaved.ResultsEntry",id:"usertaskeventutesavedresultsentry",level:3},{value:"Message UserTaskEvent.UTETaskExecuted",id:"usertaskeventutetaskexecuted",level:3},{value:"Message UserTaskField",id:"usertaskfield",level:3},{value:"Message UserTaskRun",id:"usertaskrun",level:3},{value:"Message UserTaskRun.ResultsEntry",id:"usertaskrunresultsentry",level:3},{value:"Message UserTaskTriggerReference",id:"usertasktriggerreference",level:3},{value:"Message Variable",id:"variable",level:3},{value:"Message VariableValue",id:"variablevalue",level:3},{value:"Message FailureBeingHandled",id:"failurebeinghandled",level:3},{value:"Message HandlingFailureHaltReason",id:"handlingfailurehaltreason",level:3},{value:"Message Interrupted",id:"interrupted",level:3},{value:"Message ManualHalt",id:"manualhalt",level:3},{value:"Message ParentHalted",id:"parenthalted",level:3},{value:"Message PendingFailureHandler",id:"pendingfailurehandler",level:3},{value:"Message PendingFailureHandlerHaltReason",id:"pendingfailurehandlerhaltreason",level:3},{value:"Message PendingInterrupt",id:"pendinginterrupt",level:3},{value:"Message PendingInterruptHaltReason",id:"pendinginterrupthaltreason",level:3},{value:"Message ThreadHaltReason",id:"threadhaltreason",level:3},{value:"Message ThreadRun",id:"threadrun",level:3},{value:"Message WfRun",id:"wfrun",level:3},{value:"Message Edge",id:"edge",level:3},{value:"Message EdgeCondition",id:"edgecondition",level:3},{value:"Message EntrypointNode",id:"entrypointnode",level:3},{value:"Message ExitNode",id:"exitnode",level:3},{value:"Message ExternalEventNode",id:"externaleventnode",level:3},{value:"Message FailureDef",id:"failuredef",level:3},{value:"Message FailureHandlerDef",id:"failurehandlerdef",level:3},{value:"Message InterruptDef",id:"interruptdef",level:3},{value:"Message JsonIndex",id:"jsonindex",level:3},{value:"Message Node",id:"node",level:3},{value:"Message NodeMigration",id:"nodemigration",level:3},{value:"Message NopNode",id:"nopnode",level:3},{value:"Message SleepNode",id:"sleepnode",level:3},{value:"Message StartMultipleThreadsNode",id:"startmultiplethreadsnode",level:3},{value:"Message StartMultipleThreadsNode.VariablesEntry",id:"startmultiplethreadsnodevariablesentry",level:3},{value:"Message StartThreadNode",id:"startthreadnode",level:3},{value:"Message StartThreadNode.VariablesEntry",id:"startthreadnodevariablesentry",level:3},{value:"Message ThreadRetentionPolicy",id:"threadretentionpolicy",level:3},{value:"Message ThreadSpec",id:"threadspec",level:3},{value:"Message ThreadSpec.NodesEntry",id:"threadspecnodesentry",level:3},{value:"Message ThreadSpecMigration",id:"threadspecmigration",level:3},{value:"Message ThreadSpecMigration.NodeMigrationsEntry",id:"threadspecmigrationnodemigrationsentry",level:3},{value:"Message ThreadVarDef",id:"threadvardef",level:3},{value:"Message ThrowEventNode",id:"throweventnode",level:3},{value:"Message UserTaskNode",id:"usertasknode",level:3},{value:"Message WaitForConditionNode",id:"waitforconditionnode",level:3},{value:"Message WaitForThreadsNode",id:"waitforthreadsnode",level:3},{value:"Message WaitForThreadsNode.ThreadToWaitFor",id:"waitforthreadsnodethreadtowaitfor",level:3},{value:"Message WaitForThreadsNode.ThreadsToWaitFor",id:"waitforthreadsnodethreadstowaitfor",level:3},{value:"Message WfSpec",id:"wfspec",level:3},{value:"Message WfSpec.ParentWfSpecReference",id:"wfspecparentwfspecreference",level:3},{value:"Message WfSpec.ThreadSpecsEntry",id:"wfspecthreadspecsentry",level:3},{value:"Message WfSpecVersionMigration",id:"wfspecversionmigration",level:3},{value:"Message WfSpecVersionMigration.ThreadSpecMigrationsEntry",id:"wfspecversionmigrationthreadspecmigrationsentry",level:3},{value:"Message WorkflowRetentionPolicy",id:"workflowretentionpolicy",level:3},{value:"Message WorkflowEvent",id:"workflowevent",level:3},{value:"Message WorkflowEventDef",id:"workfloweventdef",level:3},{value:"LittleHorse Enums",id:"littlehorse-enums",level:2},{value:"Enum ACLAction",id:"aclaction",level:3},{value:"Enum ACLResource",id:"aclresource",level:3},{value:"Enum LHErrorType",id:"lherrortype",level:3},{value:"Enum LHStatus",id:"lhstatus",level:3},{value:"Enum MetadataStatus",id:"metadatastatus",level:3},{value:"Enum MetricsWindowLength",id:"metricswindowlength",level:3},{value:"Enum TaskStatus",id:"taskstatus",level:3},{value:"Enum VariableType",id:"variabletype",level:3},{value:"Enum Comparator",id:"comparator",level:3},{value:"Enum UTActionTrigger.UTHook",id:"utactiontriggeruthook",level:3},{value:"Enum VariableMutationType",id:"variablemutationtype",level:3},{value:"Enum WaitForThreadsRun.WaitingThreadStatus",id:"waitforthreadsrunwaitingthreadstatus",level:3},{value:"Enum AllowedUpdateType",id:"allowedupdatetype",level:3},{value:"Enum SearchNodeRunRequest.NodeType",id:"searchnoderunrequestnodetype",level:3},{value:"Enum SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy",id:"saveusertaskrunprogressrequestsaveusertaskrunassignmentpolicy",level:3},{value:"Enum UserTaskRunStatus",id:"usertaskrunstatus",level:3},{value:"Enum ThreadType",id:"threadtype",level:3},{value:"Enum FailureHandlerDef.LHFailureType",id:"failurehandlerdeflhfailuretype",level:3},{value:"Enum WfRunVariableAccessLevel",id:"wfrunvariableaccesslevel",level:3}];function a(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"littlehorse-api-reference",children:"LittleHorse API Reference"})}),"\n",(0,r.jsxs)(s.p,{children:["The LittleHorse Server exposes a GRPC API to its clients. For most general usage of LittleHorse, you ",(0,r.jsx)(s.em,{children:"will not"})," need to\nread the raw protobuf schema. Common LittleHorse client actions fall into three general categories:"]}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Developing a Task Worker, which is handled by our ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/task-worker-development",children:"Task Worker SDK's"}),"."]}),"\n",(0,r.jsxs)(s.li,{children:["Developing a WfSpec, which is handled by our ",(0,r.jsxs)(s.a,{href:"/docs/developer-guide/wfspec-development",children:[(0,r.jsx)(s.code,{children:"WfSpec"})," SDK's"]}),"."]}),"\n",(0,r.jsxs)(s.li,{children:["Running and interacting with ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s, which is documented in our ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/grpc",children:'"Using the API"'})," docs."]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["However, the highly curious reader might want to see the actual GRPC and Protobuf specification. The docs on this page\nare autogenerated from our actual ",(0,r.jsx)(s.a,{href:"https://github.com/littlehorse-enterprises/littlehorse/tree/master/schemas",children:"protobuf files"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"The documentation of what the specific protobuf fields mean is potentially useful for advanced Jedi Master use-cases."}),"\n",(0,r.jsx)(s.p,{children:"Happy Reading!"}),"\n",(0,r.jsx)(s.h2,{id:"littlehorse-grpc-api",children:"LittleHorse GRPC API"}),"\n",(0,r.jsxs)(s.p,{children:["The LittleHorse GRPC API is the backbone of the clients that you get in all of our SDK's. Every ",(0,r.jsx)(s.code,{children:"LHConfig"})," object\ngives you a GRPC stub to access the API. Most common operations are already documented with code examples in different\nlanguages ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/grpc",children:"here"}),", but we put this here for the true Jedi Masters."]}),"\n",(0,r.jsxs)(s.h3,{id:"puttaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#puttaskdefrequest",children:"PutTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdef",children:"TaskDef"})}),(0,r.jsx)(s.td,{children:"Creates a TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdef",children:"TaskDef"})}),(0,r.jsx)(s.td,{children:"Gets a TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskworkergroup",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskWorkerGroup"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkergroup",children:"TaskWorkerGroup"})}),(0,r.jsx)(s.td,{children:"Gets the registered task worker group associated with a specific TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putexternaleventdefrequest",children:"PutExternalEventDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdef",children:"ExternalEventDef"})}),(0,r.jsx)(s.td,{children:"Creates an ExternalEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdef",children:"ExternalEventDef"})}),(0,r.jsx)(s.td,{children:"Gets an ExternalEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putworkfloweventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutWorkflowEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putworkfloweventdefrequest",children:"PutWorkflowEventDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdef",children:"WorkflowEventDef"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Creates a WorkflowEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"PutWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putwfspecrequest",children:"PutWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsx)(s.td,{children:"Creates a WfSpec."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsx)(s.td,{children:"Gets a WfSpec."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"GetLatestWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#getlatestwfspecrequest",children:"GetLatestWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsx)(s.td,{children:"Returns the latest WfSpec with a specified name (and optionally a specified Major Version)."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"migratewfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"MigrateWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#migratewfspecrequest",children:"MigrateWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsxs)(s.td,{children:["EXPERIMENTAL: Migrates all WfRun's from one version of a WfSpec onto a newer version of the same WfSpec. This is useful for long-running WfRun's (eg. a 60-day marketing campaign) where you must update WfRun's that are in the RUNNING state rather than allowing them to run to completion.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"As of 0.7.2, this feature is only partially implemented."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putusertaskdefrequest",children:"PutUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdef",children:"UserTaskDef"})}),(0,r.jsx)(s.td,{children:"Creates a UserTaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdef",children:"UserTaskDef"})}),(0,r.jsxs)(s.td,{children:["Gets a specific UserTaskDef.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"This RPC is highly useful for applications built around User Tasks. For example, a UI that dynamically displays form fields based on the User Task might first receive a UserTaskRun, then use that UserTaskRun to look up the UserTaskDef. The frontend would inspect the UserTaskDef and display a form field on the browser page for each field in the UserTaskDef."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetLatestUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#getlatestusertaskdefrequest",children:"GetLatestUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdef",children:"UserTaskDef"})}),(0,r.jsx)(s.td,{children:"Returns the most recent UserTaskDef with a specific name."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"runwf",children:["RPC ",(0,r.jsx)(s.code,{children:"RunWf"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#runwfrequest",children:"RunWfRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrun",children:"WfRun"})}),(0,r.jsx)(s.td,{children:"Runs a WfSpec to create a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"schedulewf",children:["RPC ",(0,r.jsx)(s.code,{children:"ScheduleWf"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#schedulewfrequest",children:"ScheduleWfRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrun",children:"ScheduledWfRun"})}),(0,r.jsx)(s.td,{children:"Schedule repeated WfRun based on a cron expression"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchscheduledwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchscheduledwfrunrequest",children:"SearchScheduledWfRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunidlist",children:"ScheduledWfRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for existing schedules"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getscheduledwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrun",children:"ScheduledWfRun"})}),(0,r.jsx)(s.td,{children:"Find a specific ScheduledWfRun"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrun",children:"WfRun"})}),(0,r.jsx)(s.td,{children:"Gets a WfRun. Although useful for development and debugging, this RPC is not often used by applications."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrun",children:"UserTaskRun"})}),(0,r.jsx)(s.td,{children:"Loads a specific UserTaskRun. It includes information about to whom the UserTask is currently assigned, history of assignments and reassignments, and any context for that UserTaskRun which is specific to the WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"assignusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"AssignUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#assignusertaskrunrequest",children:"AssignUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Change the ownership of a UserTaskRun to a new userId, userGroup, or both. The action will be reflected in your next call to SearchUserTaskRun. This RPC is useful for applications that are using User Tasks to build an internal task-list and wish to administer the tasks."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"completeusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"CompleteUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#completeusertaskrunrequest",children:"CompleteUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsxs)(s.td,{children:["Completes a UserTaskRun. Includes the results of the UserTaskRun, the UserTaskRun Id, and the userId of the user who completes the UserTaskRun. Results in the UserTask NodeRun being completed, and unblocks the associated ThreadRun in the WfRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"This RPC is highly useful for applications built around a WfSpec that uses USER_TASK nodes."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"cancelusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"CancelUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#cancelusertaskrunrequest",children:"CancelUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Cancels a UserTaskRun. This will result in an EXCEPTION being propagated to the WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"saveusertaskrunprogress",children:["RPC ",(0,r.jsx)(s.code,{children:"SaveUserTaskRunProgress"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#saveusertaskrunprogressrequest",children:"SaveUserTaskRunProgressRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrun",children:"UserTaskRun"})}),(0,r.jsxs)(s.td,{children:["Saves the results of a UserTaskRun and logs who saved the content.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsxs)("li",{children:[" Throws FAILED_PRECONDITION if the UserTaskRun is in the ",(0,r.jsx)(s.code,{children:"DONE"})," or ",(0,r.jsx)(s.code,{children:"CANCELLED"})," state."]})," ",(0,r.jsxs)("li",{children:[" If ",(0,r.jsx)(s.code,{children:"policy"})," is set to ",(0,r.jsx)(s.code,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),", returns ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the ",(0,r.jsx)(s.code,{children:"user_id"})," field of the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," does not match the ",(0,r.jsx)(s.code,{children:"user_id"})," of the request."]})]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listusertaskruns",children:["RPC ",(0,r.jsx)(s.code,{children:"ListUserTaskRuns"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listusertaskrunrequest",children:"ListUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunlist",children:"UserTaskRunList"})}),(0,r.jsx)(s.td,{children:"Lists all UserTaskRun's for a specific WfRun. Can be useful when using a WfRun to model an entity."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getnoderun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetNodeRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderun",children:"NodeRun"})}),(0,r.jsx)(s.td,{children:"Gets a specific NodeRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listnoderuns",children:["RPC ",(0,r.jsx)(s.code,{children:"ListNodeRuns"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listnoderunsrequest",children:"ListNodeRunsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunlist",children:"NodeRunList"})}),(0,r.jsx)(s.td,{children:"Lists all NodeRun's for a specific WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrun",children:"TaskRun"})}),(0,r.jsx)(s.td,{children:"Gets a specific TaskRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskruns",children:["RPC ",(0,r.jsx)(s.code,{children:"ListTaskRuns"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listtaskrunsrequest",children:"ListTaskRunsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunlist",children:"TaskRunList"})}),(0,r.jsx)(s.td,{children:"Lists all TaskRun's for a specific WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getvariable",children:["RPC ",(0,r.jsx)(s.code,{children:"GetVariable"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableid",children:"VariableId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variable",children:"Variable"})}),(0,r.jsx)(s.td,{children:"Get the value of a specific Variable. When using a WfRun to model an entity, this RPC is useful for retrieving information. It is equivalent to looking up the value of a column for a specific row in a SQL table."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listvariables",children:["RPC ",(0,r.jsx)(s.code,{children:"ListVariables"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listvariablesrequest",children:"ListVariablesRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablelist",children:"VariableList"})}),(0,r.jsx)(s.td,{children:"List all Variables from a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternalevent",children:["RPC ",(0,r.jsx)(s.code,{children:"PutExternalEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putexternaleventrequest",children:"PutExternalEventRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externalevent",children:"ExternalEvent"})}),(0,r.jsx)(s.td,{children:"Post an ExternalEvent. This RPC is highly useful for"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getexternalevent",children:["RPC ",(0,r.jsx)(s.code,{children:"GetExternalEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externalevent",children:"ExternalEvent"})}),(0,r.jsx)(s.td,{children:"Get a specific ExternalEvent."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"awaitworkflowevent",children:["RPC ",(0,r.jsx)(s.code,{children:"AwaitWorkflowEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#awaitworkfloweventrequest",children:"AwaitWorkflowEventRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowevent",children:"WorkflowEvent"})}),(0,r.jsxs)(s.td,{children:["Waits for a WorkflowEvent to be thrown by a given WfRun. Returns immediately if a matching WorkflowEvent has already been thrown; throws a DEADLINE_EXCEEDED error if the WorkflowEvent is not thrown before the deadline specified by the client.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"To specify the deadline, the client should use GRPC deadlines."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getworkflowevent",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWorkflowEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowevent",children:"WorkflowEvent"})}),(0,r.jsx)(s.td,{children:"Get a specific WorkflowEvent."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listexternalevents",children:["RPC ",(0,r.jsx)(s.code,{children:"ListExternalEvents"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listexternaleventsrequest",children:"ListExternalEventsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventlist",children:"ExternalEventList"})}),(0,r.jsx)(s.td,{children:"List ExternalEvent's for a specific WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchwfrunrequest",children:"SearchWfRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunidlist",children:"WfRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for WfRun's. This RPC is highly useful for applications that store data in LittleHorse and need to find a specific WfRun based on certain indexed fields."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchnoderun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchNodeRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchnoderunrequest",children:"SearchNodeRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunidlist",children:"NodeRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for NodeRun's. This RPC is useful for monitoring and finding bugs in your workflows or Task Workers."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchtaskrunrequest",children:"SearchTaskRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunidlist",children:"TaskRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for TaskRun's. This RPC is useful for finding bugs in your Task Workers."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchusertaskrunrequest",children:"SearchUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunidlist",children:"UserTaskRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's. This RPC is highly useful for applications that connect human end-users to LittleHorse: it enables you to find all tasks assigned to a specific person or group of people."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchvariable",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchVariable"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchvariablerequest",children:"SearchVariableRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableidlist",children:"VariableIdList"})}),(0,r.jsx)(s.td,{children:"Search for Variable's. This RPC is highly useful for applications that store data in LittleHorse and need to find a specific WfRun based on certain indexed fields."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternalevent",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchExternalEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchexternaleventrequest",children:"SearchExternalEventRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventidlist",children:"ExternalEventIdList"})}),(0,r.jsx)(s.td,{children:"Search for ExternalEvent's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchtaskdefrequest",children:"SearchTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefidlist",children:"TaskDefIdList"})}),(0,r.jsx)(s.td,{children:"Search for TaskDef's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchusertaskdefrequest",children:"SearchUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefidlist",children:"UserTaskDefIdList"})}),(0,r.jsx)(s.td,{children:"Search for UserTaskDef's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchwfspecrequest",children:"SearchWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecidlist",children:"WfSpecIdList"})}),(0,r.jsx)(s.td,{children:"Search for WfSpec's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchexternaleventdefrequest",children:"SearchExternalEventDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefidlist",children:"ExternalEventDefIdList"})}),(0,r.jsx)(s.td,{children:"Search for ExternalEventDef's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtenant",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchTenant"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchtenantrequest",children:"SearchTenantRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantidlist",children:"TenantIdList"})}),(0,r.jsx)(s.td,{children:"Search for all available TenantIds for current Principal"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchprincipal",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchPrincipal"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchprincipalrequest",children:"SearchPrincipalRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalidlist",children:"PrincipalIdList"})}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"registertaskworker",children:["RPC ",(0,r.jsx)(s.code,{children:"RegisterTaskWorker"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#registertaskworkerrequest",children:"RegisterTaskWorkerRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#registertaskworkerresponse",children:"RegisterTaskWorkerResponse"})}),(0,r.jsx)(s.td,{children:"Used by the Task Worker to: 1. Tell the LH Server that the Task Worker has joined the Task Worker Group. 2. Receive the assignemnt of LH Server's to poll from. Generally, you won't use this request manually."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"polltask",children:["RPC ",(0,r.jsx)(s.code,{children:"PollTask"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#polltaskrequest",children:"PollTaskRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#polltaskresponse",children:"PollTaskResponse"})}),(0,r.jsx)(s.td,{children:"Used by Task Workers to listen for TaskRuns on the Task Queue. Generally, you won't use this RPC manually."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"reporttask",children:["RPC ",(0,r.jsx)(s.code,{children:"ReportTask"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#reporttaskrun",children:"ReportTaskRun"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Used by Task Workers to report the result of a TaskRun. Generally, you won't use this rpc manually."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"stopwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"StopWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#stopwfrunrequest",children:"StopWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Move a WfRun or a specific ThreadRun in that WfRun to the HALTED state."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"resumewfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"ResumeWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#resumewfrunrequest",children:"ResumeWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Resumes a WfRun or a specific ThreadRun of a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"rescuethreadrun",children:["RPC ",(0,r.jsx)(s.code,{children:"RescueThreadRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#rescuethreadrunrequest",children:"RescueThreadRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrun",children:"WfRun"})}),(0,r.jsxs)(s.td,{children:["Rescues a failed ThreadRun (in the ERROR state only) by restarting it from the point of failure. Useful if a bug in Task Worker implementation caused a WfRun to fail and you did not have a FailureHandler for that NodeRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"The specified ",(0,r.jsx)(s.code,{children:"ThreadRun"})," must be in a state where it's latest ",(0,r.jsx)(s.code,{children:"NodeRun"})," is: ",(0,r.jsx)("br",{})," - In the ",(0,r.jsx)(s.code,{children:"ERROR"})," state.",(0,r.jsx)("br",{})," - Has no ",(0,r.jsx)(s.code,{children:"FailureHandler"})," ",(0,r.jsx)(s.code,{children:"ThreadRun"}),"s ",(0,r.jsx)("br",{})," - The parent ",(0,r.jsx)(s.code,{children:"ThreadRun"}),", or any parent of the parent, has not handled the ",(0,r.jsx)(s.code,{children:"Failure"})," yet.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If that is not true, then the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," cannot be rescued and the request will return ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"}),"."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletewfrunrequest",children:"DeleteWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a WfRun. The WfRun cannot be in the RUNNING state."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletetaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletetaskdefrequest",children:"DeleteTaskDefRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletewfspecrequest",children:"DeleteWfSpecRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a WfSpec."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deleteusertaskdefrequest",children:"DeleteUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a UserTaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deleteexternaleventdefrequest",children:"DeleteExternalEventDefRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes an ExternalEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteprincipal",children:["RPC ",(0,r.jsx)(s.code,{children:"DeletePrincipal"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deleteprincipalrequest",children:"DeletePrincipalRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsxs)(s.td,{children:["Deletes a ",(0,r.jsx)(s.code,{children:"Principal"}),". Fails with ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the specified ",(0,r.jsx)(s.code,{children:"Principal"})," is the last remaining ",(0,r.jsx)(s.code,{children:"Principal"})," with admin permissions. Admin permissions are defined as having the ",(0,r.jsx)(s.code,{children:"global_acls"})," of ",(0,r.jsx)(s.code,{children:"ALL_ACTIONS"})," over the ",(0,r.jsx)(s.code,{children:"ACL_ALL_RESOURCES"})," scope."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletescheduledwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletescheduledwfrunrequest",children:"DeleteScheduledWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a scheduled run and prevents any further associated WfRun from being executed."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskdefmetricswindow",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskDefMetricsWindow"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefmetricsqueryrequest",children:"TaskDefMetricsQueryRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefmetrics",children:"TaskDefMetrics"})}),(0,r.jsx)(s.td,{children:"Returns TaskDef Metrics for a specific TaskDef and a specific time window."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getwfspecmetricswindow",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWfSpecMetricsWindow"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecmetricsqueryrequest",children:"WfSpecMetricsQueryRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecmetrics",children:"WfSpecMetrics"})}),(0,r.jsx)(s.td,{children:"Returns WfSpec Metrics for a specific WfSpec and a specific time window."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskdefmetrics",children:["RPC ",(0,r.jsx)(s.code,{children:"ListTaskDefMetrics"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listtaskmetricsrequest",children:"ListTaskMetricsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listtaskmetricsresponse",children:"ListTaskMetricsResponse"})}),(0,r.jsx)(s.td,{children:"Returns a list of TaskDef Metrics Windows."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listwfspecmetrics",children:["RPC ",(0,r.jsx)(s.code,{children:"ListWfSpecMetrics"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listwfmetricsrequest",children:"ListWfMetricsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listwfmetricsresponse",children:"ListWfMetricsResponse"})}),(0,r.jsx)(s.td,{children:"Returns a list of WfSpec Metrics Windows."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"puttenant",children:["RPC ",(0,r.jsx)(s.code,{children:"PutTenant"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#puttenantrequest",children:"PutTenantRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenant",children:"Tenant"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Creates another Tenant in the LH Server."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettenant",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTenant"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantid",children:"TenantId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenant",children:"Tenant"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Gets a Tenant from the LH Server."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putprincipal",children:["RPC ",(0,r.jsx)(s.code,{children:"PutPrincipal"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putprincipalrequest",children:"PutPrincipalRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principal",children:"Principal"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Creates an Principal."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"whoami",children:["RPC ",(0,r.jsx)(s.code,{children:"Whoami"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principal",children:"Principal"})}),(0,r.jsx)(s.td,{children:"Returns the Principal of the caller."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getserverversion",children:["RPC ",(0,r.jsx)(s.code,{children:"GetServerVersion"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serverversionresponse",children:"ServerVersionResponse"})}),(0,r.jsx)(s.td,{children:"Gets the version of the LH Server."})]})})]}),"\n",(0,r.jsx)(s.h2,{id:"littlehorse-protobuf-schemas",children:"LittleHorse Protobuf Schemas"}),"\n",(0,r.jsx)(s.p,{children:"This section contains the exact schemas for every object in our public API."}),"\n",(0,r.jsxs)(s.h3,{id:"deleteprincipalrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeletePrincipalRequest"})]}),"\n",(0,r.jsxs)(s.p,{children:["Deletes a ",(0,r.jsx)(s.code,{children:"Principal"}),". Fails with ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the specified ",(0,r.jsx)(s.code,{children:"Principal"})," is the last\nadmin ",(0,r.jsx)(s.code,{children:"Principal"}),"."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalid",children:"PrincipalId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ",(0,r.jsx)(s.code,{children:"Principal"})," to delete."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"principal",children:["Message ",(0,r.jsx)(s.code,{children:"Principal"})]}),"\n",(0,r.jsx)(s.p,{children:"A Principal represents the identity of a client of LittleHorse, whether human or\nmachine. The ACL's on the Principal control what actions the client is allowed\nto take."}),"\n",(0,r.jsx)(s.p,{children:"A Principal is not scoped to a Tenant; rather, a Principal is scoped to the Cluster\nand may have access to one or more Tenants."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalid",children:"PrincipalId"})}),(0,r.jsxs)(s.td,{children:["The ID of the Principal. In OAuth for human users, this is the user_id. In OAuth for machine clients, this is the Client ID.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"mTLS for Principal identification is not yet implemented."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which the Principal was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"per_tenant_acls"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalpertenantaclsentry",children:"Principal.PerTenantAclsEntry"})}),(0,r.jsxs)(s.td,{children:["Maps a Tenant ID to a list of ACL's that the Principal has permission to execute ",(0,r.jsx)(s.em,{children:"within that Tenant"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"global_acls"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsxs)(s.td,{children:["Sets permissions that this Principal has ",(0,r.jsx)(s.em,{children:"for any Tenant"})," in the LH Cluster."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"principalpertenantaclsentry",children:["Message ",(0,r.jsx)(s.code,{children:"Principal.PerTenantAclsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putprincipalrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutPrincipalRequest"})]}),"\n",(0,r.jsxs)(s.p,{children:["Creates or updates a Principal. If this request would remove admin privileges from the\nlast admin principal (i.e. ",(0,r.jsx)(s.code,{children:"ALL_ACTIONS"})," over ",(0,r.jsx)(s.code,{children:"ACL_ALL_RESOURCES"})," in the ",(0,r.jsx)(s.code,{children:"global_acls"}),"),\nthen the RPC throws ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"}),"."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID of the Principal that we are creating."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"per_tenant_acls"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putprincipalrequestpertenantaclsentry",children:"PutPrincipalRequest.PerTenantAclsEntry"})}),(0,r.jsx)(s.td,{children:"The per-tenant ACL's for the Principal"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"global_acls"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsx)(s.td,{children:"The ACL's for the principal in all tenants"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"overwrite"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsxs)(s.td,{children:["If this is set to false and a ",(0,r.jsx)(s.code,{children:"Principal"})," with the same ",(0,r.jsx)(s.code,{children:"id"})," already exists ",(0,r.jsx)(s.em,{children:"and"})," has different ACL's configured, then the RPC throws ",(0,r.jsx)(s.code,{children:"ALREADY_EXISTS"}),".",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If this is set to ",(0,r.jsx)(s.code,{children:"true"}),", then the RPC will override hte"]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putprincipalrequestpertenantaclsentry",children:["Message ",(0,r.jsx)(s.code,{children:"PutPrincipalRequest.PerTenantAclsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"puttenantrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutTenantRequest"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"serveracl",children:["Message ",(0,r.jsx)(s.code,{children:"ServerACL"})]}),"\n",(0,r.jsxs)(s.p,{children:["Represents a specific set of permissions over a specific set of objects\nin a Tenant. This is a ",(0,r.jsx)(s.em,{children:"positive"})," permission."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"resources"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#aclresource",children:"ACLResource"})}),(0,r.jsx)(s.td,{children:"The resource types over which permission is granted."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"allowed_actions"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#aclaction",children:"ACLAction"})}),(0,r.jsx)(s.td,{children:"The actions that are permitted."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"resource_filter"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["If set, then only the resources with this exact name are allowed. For example, the ",(0,r.jsx)(s.code,{children:"READ"})," and ",(0,r.jsx)(s.code,{children:"RUN"})," ",(0,r.jsx)(s.code,{children:"allowed_actions"})," over ",(0,r.jsx)(s.code,{children:"ACL_TASK"})," with ",(0,r.jsx)(s.code,{children:"name"})," == ",(0,r.jsx)(s.code,{children:"my-task"})," allows a Task Worker to only execute the ",(0,r.jsx)(s.code,{children:"my-task"})," TaskDef.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If ",(0,r.jsx)(s.code,{children:"name"})," and ",(0,r.jsx)(s.code,{children:"prefix"})," are unset, then the ACL applies to all resources of the specified types."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"resource_filter"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["If set, then only the resources whose names match this prefix are allowed.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If ",(0,r.jsx)(s.code,{children:"name"})," and ",(0,r.jsx)(s.code,{children:"prefix"})," are unset, then the ACL applies to all resources of the specified types."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"serveracls",children:["Message ",(0,r.jsx)(s.code,{children:"ServerACLs"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ACL's for LittleHorse"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"acls"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracl",children:"ServerACL"})}),(0,r.jsx)(s.td,{children:"The associated ACL's"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"tenant",children:["Message ",(0,r.jsx)(s.code,{children:"Tenant"})]}),"\n",(0,r.jsx)(s.p,{children:"A Tenant is a logically isolated environment within LittleHorse. All workflows and\nassociated data (WfSpec, WfRun, TaskDef, TaskRun, NodeRun, etc) are scoped to within\na Tenant."}),"\n",(0,r.jsx)(s.p,{children:"Future versions will include quotas on a per-Tenant basis."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantid",children:"TenantId"})}),(0,r.jsx)(s.td,{children:"The ID of the Tenant."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which the Tenant was created."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"exponentialbackoffretrypolicy",children:["Message ",(0,r.jsx)(s.code,{children:"ExponentialBackoffRetryPolicy"})]}),"\n",(0,r.jsxs)(s.p,{children:["Defines an Exponential backoff policy for TaskRun retries. The delay for a retry\nattempt ",(0,r.jsx)(s.code,{children:"N"})," is defined as:"]}),"\n",(0,r.jsx)(s.p,{children:"min(base_interval_ms * (multiplier ^(N-1)), max_delay_ms)"}),"\n",(0,r.jsx)(s.p,{children:"Note that timers in LittleHorse have a resolution of about 500-1000 milliseconds,\nso timing is not exact."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"base_interval_ms"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Base delay in ms for the first retry. Note that in LittleHorse, timers have a resolution of 500-1000 milliseconds. Must be greater than zero."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"max_delay_ms"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Maximum delay in milliseconds between retries."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"multiplier"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"float"}),(0,r.jsx)(s.td,{children:"The multiplier to use in calculating the retry backoff policy. We recommend starting with 2.0. Must be at least 1.0."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tasknode",children:["Message ",(0,r.jsx)(s.code,{children:"TaskNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines a TaskRun execution. Used in a Node and also in the UserTask Trigger Actions."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_to_execute"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"dynamic_task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_to_execute"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timeout_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"How long until LittleHorse determines that the Task Worker had a technical ERROR if the worker does not yet reply to the Server. This is determined on a per-Attempt basis."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retries"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Configures the amount of retries allowed on this TaskNode.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Retryable errors include: - TASK_TIMEOUT: the TaskRun was started but the scheduler didn't hear back from the Task Worker in time. - TASK_FAILED: the Task Worker reported an unexpected ",(0,r.jsx)(s.em,{children:"technical"})," ERROR when executing the Task Function.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Other result codes are not retryable (including TASK_OUTPUT_SERIALIZING_ERROR, TASK_INPUT_VAR_SUB_ERROR, and TASK_EXCEPTION)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exponential_backoff"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exponentialbackoffretrypolicy",children:"ExponentialBackoffRetryPolicy"})}),(0,r.jsx)(s.td,{children:"If this field is set, then retries will use Exponential Backoff."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Input variables into the TaskDef."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontrigger",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger"})]}),"\n",(0,r.jsx)(s.p,{children:"A UTActionTrigger triggers an action upon certain lifecycle hooks\nin a User Task. Actions include:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"re-assign the User Task Run"}),"\n",(0,r.jsx)(s.li,{children:"cancel the User Task Run"}),"\n",(0,r.jsx)(s.li,{children:"execute a Reminder Task"}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Hooks include:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Upon creation of the UserTaskRun"}),"\n",(0,r.jsx)(s.li,{children:"Upon rescheduling the UserTaskRun"}),"\n"]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"action"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggerutatask",children:"UTActionTrigger.UTATask"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cancel"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"action"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggerutacancel",children:"UTActionTrigger.UTACancel"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"reassign"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"action"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggerutareassign",children:"UTActionTrigger.UTAReassign"})}),(0,r.jsx)(s.td,{children:"later on, might enable scheduling entire ThreadRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"delay_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"The Action is triggered some time after the Hook matures. The delay is controlled by this field."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"hook"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggeruthook",children:"UTActionTrigger.UTHook"})}),(0,r.jsx)(s.td,{children:"The hook on which this UserTaskAction is scheduled."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontriggerutacancel",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger.UTACancel"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskAction that causes a UserTaskRun to be CANCELLED when it fires."}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontriggerutareassign",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger.UTAReassign"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskAction that causes a UserTaskRun to be reassigned when it fires."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"A variable assignment that resolves to a STR representing the new user_id. If not set, the user_id of the UserTaskRun will be un-set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"A variable assignment that resolves to a STR representing the new user_group. If not set, the user_group of the UserTaskRun will be un-set."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontriggerutatask",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger.UTATask"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskAction that causes a TaskRun to be scheduled when it fires."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknode",children:"TaskNode"})}),(0,r.jsx)(s.td,{children:"The specification of the Task to schedule."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"mutations"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutation",children:"VariableMutation"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Any variables in the ThreadRun which we should mutate."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableassignment",children:["Message ",(0,r.jsx)(s.code,{children:"VariableAssignment"})]}),"\n",(0,r.jsx)(s.p,{children:"A VariableAssignment is used within a WfSpec to determine how a value should be\nassigned in the context of a specific WfRun. For example, in a TASK node, you\nuse a VariableAssignment for each input parameter to determine how the value\nis set."}),"\n",(0,r.jsx)(s.p,{children:"Note that the VariableAssignment is normally handled by the SDK; you shouldn't\nhave to worry about this in daily LittleHorse usage."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_path"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["If you provide a ",(0,r.jsx)(s.code,{children:"variable_name"})," and the specified variable is JSON_OBJ or JSON_ARR type, then you may also provide a json_path which makes the VariableAssignment resolve to the specified field."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"source"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Assign the value from a variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"literal_value"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Assign a literal value"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"format_string"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignmentformatstring",children:"VariableAssignment.FormatString"})}),(0,r.jsx)(s.td,{children:"Assign a format string"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableassignmentformatstring",children:["Message ",(0,r.jsx)(s.code,{children:"VariableAssignment.FormatString"})]}),"\n",(0,r.jsx)(s.p,{children:"A FormatString formats a template String with values from the WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"format"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:['A VariableAssignment which must resolve to a String that has format args. A valid string is "This is a format string with three args: ',0,", ",1,", ",2,'"']})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"args"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"VariableAssignments which fill out the args."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variabledef",children:["Message ",(0,r.jsx)(s.code,{children:"VariableDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Declares a Variable."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"The Type of the variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"default_value"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Optional default value if the variable isn't set; for example, in a ThreadRun if you start a ThreadRun or WfRun without passing a variable in, then this is used."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked_value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"If true, the variable value will show as a masked string."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablemutation",children:["Message ",(0,r.jsx)(s.code,{children:"VariableMutation"})]}),"\n",(0,r.jsx)(s.p,{children:"A VariableMutation defines a modification made to one of a ThreadRun's variables.\nThe LHS determines the variable that is modified; the operation determines how\nit is modified, and the RHS is the input to the operation."}),"\n",(0,r.jsx)(s.p,{children:"Day-to-day users of LittleHorse generally don't interact with this structure unless\nthey are writing their own WfSpec SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"lhs_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable to mutate"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"lhs_json_path"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"For JSON_ARR and JSON_OBJ variables, this allows you to optionally mutate a specific sub-field of the variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"operation"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutationtype",children:"VariableMutationType"})}),(0,r.jsx)(s.td,{children:"Defines the operation that we are executing."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"source_variable"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"rhs_value"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Set the source_variable as the RHS to use another variable from the workflow to as the RHS/"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"literal_value"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"rhs_value"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Use a literal value as the RHS."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_output"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"rhs_value"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutationnodeoutputsource",children:"VariableMutation.NodeOutputSource"})}),(0,r.jsx)(s.td,{children:"Use the output of the current node as the RHS."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablemutationnodeoutputsource",children:["Message ",(0,r.jsx)(s.code,{children:"VariableMutation.NodeOutputSource"})]}),"\n",(0,r.jsx)(s.p,{children:"Specifies to use the output of a NodeRun as the RHS."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"jsonpath"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Use this specific field from a JSON output"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externalevent",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEvent"})]}),"\n",(0,r.jsx)(s.p,{children:"An ExternalEvent represents A Thing That Happened outside the context of a WfRun.\nGenerally, an ExternalEvent is used to represent a document getting signed, an incident\nbeing resolved, an order being fulfilled, etc."}),"\n",(0,r.jsx)(s.p,{children:"ExternalEvent's are created via the 'rpc PutExternalEvent'"}),"\n",(0,r.jsxs)(s.p,{children:["For more context on ExternalEvents, check our documentation here:\n",(0,r.jsx)(s.a,{href:"https://littlehorse.dev/docs/concepts/external-events",children:"https://littlehorse.dev/docs/concepts/external-events"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ExternalEvent. This contains WfRunId, ExternalEventDefId, and a unique guid which can be used for idempotency of the ",(0,r.jsx)(s.code,{children:"PutExternalEvent"})," rpc call."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ExternalEvent was registered with LittleHorse."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The payload of this ExternalEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If the ExternalEvent was claimed by a specific ThreadRun (via Interrupt or EXTERNAL_EVENT Node), this is set to the number of the relevant ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If the ExternalEvent was claimed by a specific ThreadRun (via EXTERNAL_EVENT Node; note that in the case of an Interrupt the node_run_position will never be set), this is set to the number of the relevant NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"claimed"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the ExternalEvent has been claimed by a WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventdef",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventDef"})]}),"\n",(0,r.jsx)(s.p,{children:"The ExternalEventDef defines the blueprint for an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The id of the ExternalEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the ExternalEventDef was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventretentionpolicy",children:"ExternalEventRetentionPolicy"})}),(0,r.jsxs)(s.td,{children:["The retention policy for ExternalEvent's of this ExternalEventDef. This applies to the ExternalEvent ",(0,r.jsx)(s.strong,{children:"only before"})," it is matched with a WfRun."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventretentionpolicy",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventRetentionPolicy"})]}),"\n",(0,r.jsx)(s.p,{children:"Policy to determine how long an ExternalEvent is retained after creation if it\nis not yet claimed by a WfRun. Note that once a WfRun has been matched with the\nExternalEvent, the ExternalEvent is deleted if/when that WfRun is deleted.\nIf not set, then ExternalEvent's are not deleted if they are not matched with\na WfRun."}),"\n",(0,r.jsxs)(s.p,{children:["A future version of LittleHorse will allow changing the retention_policy, which\nwill trigger a cleanup of old ",(0,r.jsx)(s.code,{children:"ExternalEvent"}),"s."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"seconds_after_put"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"ext_evt_gc_policy"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Delete such an ExternalEvent X seconds after it has been registered if it has not yet been claimed by a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"entrypointrun",children:["Message ",(0,r.jsx)(s.code,{children:"EntrypointRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for an ENTRYPOINT NodeRun. Currently Empty."}),"\n",(0,r.jsxs)(s.h3,{id:"exitrun",children:["Message ",(0,r.jsx)(s.code,{children:"ExitRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for an EXIT NodeRun. Currently Empty, will contain info\nabout ThreadRun Outputs once those are added in the future."}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventnoderun",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for an EXTERNAL_EVENT NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventDefId that we are waiting for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"event_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the ExternalEvent arrived. Unset if still waiting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventId of the ExternalEvent. Unset if still waiting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timed_out"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether we had a timeout while waiting for the ExternalEvent to come."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failure",children:["Message ",(0,r.jsx)(s.code,{children:"Failure"})]}),"\n",(0,r.jsx)(s.p,{children:"Denotes a failure that happened during execution of a NodeRun or the outgoing\nedges."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["The name of the failure. LittleHorse has certain built-in failures, all named in UPPER_UNDERSCORE_CASE. Such failures correspond with the ",(0,r.jsx)(s.code,{children:"LHStatus.ERROR"}),".",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Any Failure named in ",(0,r.jsx)(s.code,{children:"kebab-case"})," is a user-defined business ",(0,r.jsx)(s.code,{children:"EXCEPTION"}),", treated as an ",(0,r.jsx)(s.code,{children:"LHStatus.EXCEPTION"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The human-readable message associated with this Failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsxs)(s.td,{children:["A user-defined Failure can have a value; for example, in Java an Exception is an Object with arbitrary properties and behaviors.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Future versions of LH will allow FailureHandler threads to accept that value as an input variable."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"was_properly_handled"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"A boolean denoting whether a Failure Handler ThreadRun properly handled the Failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handler_threadrun_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If there is a defined failure handler for the NodeRun, then this field is set to the id of the failure handler thread run."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderun",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A NodeRun is a running instance of a Node in a ThreadRun. Note that a NodeRun\nis a Getable object, meaning it can be retried from the LittleHorse grpc API."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the NodeRun. Note that the NodeRunId contains the WfRunId, the ThreadRun's number, and the position of the NodeRun within that ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsxs)(s.td,{children:["The ID of the WfSpec that this NodeRun is from. This is not ",(0,r.jsx)(s.em,{children:"always"})," the same as the ThreadRun it belongs to because of the upcoming WfSpec Version Migration feature."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handler_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"A list of all ThreadRun's that ran to handle a failure thrown by this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The status of this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"arrival_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ThreadRun arrived at this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the NodeRun was terminated (failed or completed)."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to which this NodeRun belongs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the Node in the ThreadSpec that this NodeRun belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error_message"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A human-readable error message intended to help developers diagnose WfSpec problems."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failures"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failure",children:"Failure"})}),(0,r.jsx)(s.td,{children:"A list of Failures thrown by this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknoderun",children:"TaskNodeRun"})}),(0,r.jsx)(s.td,{children:"Denotes a TASK node, which runs a TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventnoderun",children:"ExternalEventNodeRun"})}),(0,r.jsx)(s.td,{children:"An EXTERNAL_EVENT node blocks until an ExternalEvent arrives."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#entrypointrun",children:"EntrypointRun"})}),(0,r.jsx)(s.td,{children:"An ENTRYPOINT node is the first thing that runs in a ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exit"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exitrun",children:"ExitRun"})}),(0,r.jsx)(s.td,{children:"An EXIT node completes a ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_thread"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startthreadrun",children:"StartThreadRun"})}),(0,r.jsx)(s.td,{children:"A START_THREAD node starts a child ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsrun",children:"WaitForThreadsRun"})}),(0,r.jsx)(s.td,{children:"A WAIT_THREADS node waits for one or more child ThreadRun's to complete."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"sleep"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#sleepnoderun",children:"SleepNodeRun"})}),(0,r.jsx)(s.td,{children:"A SLEEP node makes the ThreadRun block for a certain amount of time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertasknoderun",children:"UserTaskNodeRun"})}),(0,r.jsx)(s.td,{children:"A USER_TASK node waits until a human executes some work and reports the result."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_multiple_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startmultiplethreadsrun",children:"StartMultipleThreadsRun"})}),(0,r.jsx)(s.td,{children:"A START_MULTIPLE_THREADS node iterates over a JSON_ARR variable and spawns a child ThreadRun for each element in the list."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"throw_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#throweventnoderun",children:"ThrowEventNodeRun"})}),(0,r.jsx)(s.td,{children:"A THROW_EVENT node throws a WorkflowEvent of a specified WorkflowEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_for_condition"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforconditionrun",children:"WaitForConditionRun"})}),(0,r.jsx)(s.td,{children:"A WAIT_FOR_CONDITION node blocks the ThreadRun until the specified condition evaluates to True."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"sleepnoderun",children:["Message ",(0,r.jsx)(s.code,{children:"SleepNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a SLEEP NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"maturation_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["The time at which the NodeRun is ",(0,r.jsx)(s.em,{children:"SCHEDULED TO"}),' wake up. In rare cases, if the LH Server is back-pressuring clients due to extreme load, the timer event which marks the sleep node as "matured" may come in slightly late.']})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"matured"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the SleepNodeRun has been matured."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startmultiplethreadsrun",children:["Message ",(0,r.jsx)(s.code,{children:"StartMultipleThreadsRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a START_MULTIPLE_THREADS NodeRun."}),"\n",(0,r.jsx)(s.p,{children:"Note: the output of this NodeRun, which can be used to mutate Variables,\nis a JSON_ARR variable containing the ID's of all the child threadRuns."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The thread_spec_name of the child thread_runs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"child_thread_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The list of all created child ThreadRun's"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startthreadrun",children:["Message ",(0,r.jsx)(s.code,{children:"StartThreadRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a START_THREAD NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"child_thread_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Contains the thread_run_number of the created Child ThreadRun, if it has been created already."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The thread_spec_name of the child thread_run."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tasknoderun",children:["Message ",(0,r.jsx)(s.code,{children:"TaskNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a TASK NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskRun. Note that if the ThreadRun was halted when it arrived at this TASK Node, then the task_run_id will be unset."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"throweventnoderun",children:["Message ",(0,r.jsx)(s.code,{children:"ThrowEventNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a THROW_EVENT NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"workflow_event_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ",(0,r.jsx)(s.code,{children:"WorkflowEvent"})," that was thrown by this ",(0,r.jsx)(s.code,{children:"ThrowEventNodeRun"}),"."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertasknoderun",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a USER_TASK NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskRun. Note that if the ThreadRun was halted when it arrived at this USER_TASK node, then the user_task_run_id will be unset."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforconditionrun",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForConditionRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a WAIT_FOR_CONDITION NodeRun"}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsrun",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a WAIT_FOR_THREADS NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"threads"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsrunwaitforthread",children:"WaitForThreadsRun.WaitForThread"})}),(0,r.jsx)(s.td,{children:"The threads that are being waited for."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsrunwaitforthread",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsRun.WaitForThread"})]}),"\n",(0,r.jsx)(s.p,{children:"A 'WaitForThread' structure defines a thread that is being waited for."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which the ThreadRun ended (successfully or not). Not set if the ThreadRun is still RUNNING, HALTED, or HALTING."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The current status of the ThreadRun being waited for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The number of the ThreadRun being waited for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"waiting_status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsrunwaitingthreadstatus",children:"WaitForThreadsRun.WaitingThreadStatus"})}),(0,r.jsx)(s.td,{children:'The "waiting status" of this specific thread: whether it\'s still running, already done, handling a failure, or completely failed.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handler_thread_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If there is a failure on the ThreadRun, and we have a failure handler defined for it, then we will start a failure handler for this threadrun. This field is the id of that threadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventdefid",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for ExternalEventDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"ExternalEventDef's are uniquedly identified by their name."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventid",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for the ExternalEvent. Note that every ExternalEvent is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventDef for this ExternalEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"guid"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A unique guid allowing for distinguishing this ExternalEvent from other events of the same ExternalEventDef and WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderunid",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"ID of the WfRun for this NodeRun. Note that every NodeRun is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"ThreadRun of this NodeRun. Note that each NodeRun belongs to a ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Position of this NodeRun within its ThreadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"principalid",children:["Message ",(0,r.jsx)(s.code,{children:"PrincipalId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a Principal."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The id of this principal. In OAuth, this is the OAuth Client ID (for machine principals) or the OAuth User Id (for human principals)."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrunid",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a ScheduledWfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"TaskDef's are uniquely identified by their name."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefmetricsid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefMetricsId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a specific window of TaskDef metrics."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The timestamp at which this metrics window starts."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The length of this window."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The TaskDefId that this metrics window reports on."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a TaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for this TaskRun. Note that every TaskRun is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_guid"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Unique identifier for this TaskRun. Unique among the WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkergroupid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerGroupId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a TaskWorkerGroup."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"TaskWorkerGroups are uniquely identified by their TaskDefId."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"tenantid",children:["Message ",(0,r.jsx)(s.code,{children:"TenantId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a Tenant."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The Tenant ID."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskdefid",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a UserTaskDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of a UserTaskDef"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Note that UserTaskDef's use simple versioning."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunid",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a UserTaskRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for this UserTaskRun. Note that every UserTaskRun is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_guid"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Unique identifier for this UserTaskRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableid",children:["Message ",(0,r.jsx)(s.code,{children:"VariableId"})]}),"\n",(0,r.jsx)(s.p,{children:"Id for a Variable."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for the variable. Note that every Variable is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Each Variable is owned by a specific ThreadRun inside the WfRun it belongs to. This is that ThreadRun's number."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfrunid",children:["Message ",(0,r.jsx)(s.code,{children:"WfRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a WfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID for this WfRun instance."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"A WfRun may have a parent WfRun. If so, this field is set to the parent's ID."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecid",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecId"})]}),"\n",(0,r.jsx)(s.p,{children:"The ID of a WfSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Name of the WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Major Version of a WfSpec.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Note that WfSpec's are versioned. Creating a new WfSpec with the same name and no breaking changes to the public Variables API results in a new WfSpec being created with the same MajorVersion and a new revision. Creating a WfSpec with a breaking change to the public Variables API results in a new WfSpec being created with the same name, an incremented major_version, and revision = 0."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Revision of a WfSpec.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Note that WfSpec's are versioned. Creating a new WfSpec with the same name and no breaking changes to the public Variables API results in a new WfSpec being created with the same MajorVersion and a new revision. Creating a WfSpec with a breaking change to the public Variables API results in a new WfSpec being created with the same name, an incremented major_version, and revision = 0."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecmetricsid",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecMetricsId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a specific window of WfSpec metrics."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The timestamp at which this metrics window starts."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The length of this window."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The WfSpecId that this metrics window reports on."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventdefid",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a WorkflowEventDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WorkflowEventDef"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventid",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventId"})]}),"\n",(0,r.jsx)(s.p,{children:"An ID for a WorkflowEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The Id of the WfRun that threw the event."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"workflow_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the WorkflowEventDef that this WorkflowEvent is a member of."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"A sequence number that makes the WorkflowEventId unique among all WorkflowEvent's of the same type thrown by the WfRun. This field starts at zero and is incremented every time a WorkflowEvent of the same type is thrown by the same WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrun",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.code,{children:"ScheduledWfRun"})," is an object in the LittleHorse API that triggers a ",(0,r.jsx)(s.code,{children:"WfRun"})," to be started\non a cron schedule."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsx)(s.td,{children:"Unique id for this ScheduledWfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"WfSpec used to run a workflow on a schedule."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunvariablesentry",children:"ScheduledWfRun.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"A map from Variable Name to Values for those variables. The provided variables are passed as input to the Entrypoint ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Parent WfRunId associated with all the generated WfRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cron_expression"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"UNIX expression used to specify the schedule for executing WfRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Creation time for this ScheduledWfRun"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrunvariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRun.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"awaitworkfloweventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"AwaitWorkflowEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Request to await until a WorkflowEvent of a certain WorkflowEventDef on a certain WfRun\nis thrown. Relies upon native GRPC deadlines to configure timeouts."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun which must throw the WorkflowEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"event_def_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The IDs of the WorkflowEventDef that must be thrown. The request will return the first matching WorkflowEvent is thrown. If event_def_ids is empty, then the request will return the first WorkflowEvent thrown by the WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"workflow_events_to_ignore"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsx)(s.td,{children:"Since a single WfRun may throw multiple WorkflowEvent's with the same WorkflowEventDefId, it is necessary to provide a client the ability to \"ignore\" WorkflowEvent's that have already been 'awaited'. Any WorkflowEvent specified by this field is ignored by the rpc."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteexternaleventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteExternalEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes an ExternalEventDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteexternaleventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteExternalEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEvent to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletescheduledwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteScheduledWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Delete an existing ScheduledWfRun, returns INVALID_ARGUMENT if object does not exist"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsxs)(s.td,{children:["Id of the ",(0,r.jsx)(s.code,{children:"ScheduledWfRun"})," to be deleted"]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletetaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskDef to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a UserTaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskDef to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a WfSpec"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec to delete"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventdefidlist",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventDefIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ExternalEventDef Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventidlist",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ExternalEvent Id's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventlist",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of ExternalEvents."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externalevent",children:"ExternalEvent"})}),(0,r.jsx)(s.td,{children:"A list of ExternalEvent objects."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"GetLatestUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Returns the UserTaskDef with a given name and the highest version number."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the UserTaskDef to search for."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestwfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"GetLatestWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Get the latest WfSpec with a given name and optionally majorVersion"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to get. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally get only WfSpec's that have the same major version. This can be useful if you want to guarantee that there have been no breaking changes to the API of the WfSpec, for example, to ensure that there have been no changes to searchable variables or required input variables."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"lhhostinfo",children:["Message ",(0,r.jsx)(s.code,{children:"LHHostInfo"})]}),"\n",(0,r.jsx)(s.p,{children:"Information about a specific LH Server to contact."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"host"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The host on the server"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"port"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The port for the specified listener."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listexternaleventsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListExternalEventsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List all ExternalEvents for a specific WfRunId. Note that List Requests return actual\nExternalEvent objects, not ExternalEventId's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRunId for whom we list ExternalEvent's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listnoderunsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListNodeRunsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List all NodeRun's for a given WfRun. Note that List requests return actual NodeRun Objects,\nnot NodeRunId's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for whom we list NodeRun's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify the thread run number to filter NodeRun's by."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskmetricsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListTaskMetricsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve TaskDef Metrics over a period of time."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"TaskDef id for whichwe retrieve metrics."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"last_window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["This parameter is a timestamp that is used to determine the ",(0,r.jsx)(s.em,{children:"last"})," window returned. The server will then return ",(0,r.jsx)(s.code,{children:"num_windows"})," worth of data from before this timestamp."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_length"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"Window size"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"num_windows"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Number of windows to retrieve."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskmetricsresponse",children:["Message ",(0,r.jsx)(s.code,{children:"ListTaskMetricsResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of TaskDef Metrics WIndows"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefmetrics",children:"TaskDefMetrics"})}),(0,r.jsx)(s.td,{children:"List of TaskDef Metrics Windows"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskrunsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListTaskRunsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List TaskRun's for a specific WfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for which to list TaskRun's"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List UserTaskRun's for a specific WfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for which to list UserTaskRuns"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listvariablesrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListVariablesRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List all Variables for a specific WfRun. Note that List requests return actual Variable Objects,\nnot VariableId's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for whom we will list Variables."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listwfmetricsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListWfMetricsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve WfSpec Metrics over a period of time."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"WfSpecId of metrics to get."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"last_window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["This parameter is a timestamp that is used to determine the ",(0,r.jsx)(s.em,{children:"last"})," window returned. The server will then return ",(0,r.jsx)(s.code,{children:"num_windows"})," worth of data from before this timestamp."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_length"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The window size"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"num_windows"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Number of windows to retrieve"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listwfmetricsresponse",children:["Message ",(0,r.jsx)(s.code,{children:"ListWfMetricsResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of WfSpec Metrics Windows"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecmetrics",children:"WfSpecMetrics"})}),(0,r.jsx)(s.td,{children:"List of WfSpec Metrics Windows"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"migratewfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"MigrateWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: migrate live WfRun's from one version of a WfSpec to another."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_wf_spec"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"migration"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecversionmigration",children:"WfSpecVersionMigration"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of NodeRun Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderunlist",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRunList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of NodeRun Objects."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderun",children:"NodeRun"})}),(0,r.jsx)(s.td,{children:"A list of NodeRun Objects."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"polltaskrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PollTaskRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Request sent by the Task Worker SDK to tell the Server that the Task Worker is ready\nto execute a TaskRun. Generally used only by the Task Worker SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"Is the TaskDefId that the Task Worker wants to execute."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"client_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the ID of the Task Worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optionally specifies the version of the Task Worker, so that it can be recorded for debugging purposes on the TaskRun itself."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"polltaskresponse",children:["Message ",(0,r.jsx)(s.code,{children:"PollTaskResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"Response from the server for PollTaskRequest."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"result"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledtask",children:"ScheduledTask"})}),(0,r.jsx)(s.td,{children:"If possible, a ScheduledTask is returned."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"principalidlist",children:["Message ",(0,r.jsx)(s.code,{children:"PrincipalIdList"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalid",children:"PrincipalId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternaleventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutExternalEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Field to create an ExternalEventDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the resulting ExternalEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventretentionpolicy",children:"ExternalEventRetentionPolicy"})}),(0,r.jsxs)(s.td,{children:["Policy to determine how long an ExternalEvent is retained after creation if it is not yet claimed by a WfRun. Note that once a WfRun has been matched with the ExternalEvent, the ExternalEvent is deleted if/when that WfRun is deleted. If not set, then ExternalEvent's are not deleted if they are not matched with a WfRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"A future version of LittleHorse will allow changing the retention_policy, which will trigger a cleanup of old ",(0,r.jsx)(s.code,{children:"ExternalEvent"}),"s."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternaleventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutExternalEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Request used to create an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun that this Event is sent to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef that this event implements."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"guid"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Note that an ExternalEventDefId is a three-part ID: 1. WfRunId 2. ExternalEventDef Name 3. A guid The guid from part 3) can be optionally provided to the PutExternalEventRequest in order to make it idempotent. It is a best practice to do so."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The content of this event."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify that this ExternalEvent may only be claimed by a specific ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify that this ExternalEvent may only be claimed by a specific NodeRun. In order for this to be set, you must also set thread_run_number."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"puttaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Creates a TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the TaskDef to create."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"input_vars"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"Variables required to execute the TaskDef. Normally, these are automatically generated by the Task Worker SDK."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"output_schema"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefoutputschema",children:"TaskDefOutputSchema"})}),(0,r.jsx)(s.td,{children:"Schema that validates the TaskDef's output"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Creates a UserTaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the UserTaskDef to create."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fields"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskfield",children:"UserTaskField"})}),(0,r.jsx)(s.td,{children:"The fields that should be presented to the user on the screen in order to fill out the User Task. Note that these fields also define a data contract for the result of the UserTaskDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"description"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optional metadata field to store user-defined data. Does not impact workflow execution. Fine to store up to a few KB of text here."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putwfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Creates a WfSpec. Generally, this request is generated by the Workflow object in\nour various SDK's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the resulting WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_specs"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putwfspecrequestthreadspecsentry",children:"PutWfSpecRequest.ThreadSpecsEntry"})}),(0,r.jsx)(s.td,{children:"Map from name the ThreadSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint_thread_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to be used as the workflow entrypoint."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowretentionpolicy",children:"WorkflowRetentionPolicy"})}),(0,r.jsx)(s.td,{children:"Optional policy to determine how long a WfRun is retained in the data store after it is completed or terminated."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_spec"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecparentwfspecreference",children:"WfSpec.ParentWfSpecReference"})}),(0,r.jsxs)(s.td,{children:["Parent WfSpec Reference. If this is set, then all WfRun's for this WfSpec ",(0,r.jsx)(s.em,{children:"MUST"})," be Child WfRun's of the specified WfSpec."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"allowed_updates"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#allowedupdatetype",children:"AllowedUpdateType"})}),(0,r.jsx)(s.td,{children:"Configures the behavior of this individual request. Can be used to prevent breaking changes to the WfSpec, prevent any changes to the WfSpec, or allow all changes to the WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putwfspecrequestthreadspecsentry",children:["Message ",(0,r.jsx)(s.code,{children:"PutWfSpecRequest.ThreadSpecsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspec",children:"ThreadSpec"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putworkfloweventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutWorkflowEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: Creates a WorkflowEventDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"registertaskworkerrequest",children:["Message ",(0,r.jsx)(s.code,{children:"RegisterTaskWorkerRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Message used by Task Worker to register itself to the server and ask for assignments of\nservers to poll."}),"\n",(0,r.jsx)(s.p,{children:"Used by the Task Worker SDK; generally, you shouldn't have to touch this manually."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the ID of the Task Worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The TaskDef the worker wants to poll for."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"registertaskworkerresponse",children:["Message ",(0,r.jsx)(s.code,{children:"RegisterTaskWorkerResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"Response containing list of Servers that the Task Worker should connect to and start polling from.\nOnly used internally by the Task Worker SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"your_hosts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhhostinfo",children:"LHHostInfo"})}),(0,r.jsx)(s.td,{children:"The list of LH Server hosts that the Task Worker should start polling."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"is_cluster_healthy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the LH Cluster is healthy."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"reporttaskrun",children:["Message ",(0,r.jsx)(s.code,{children:"ReportTaskRun"})]}),"\n",(0,r.jsx)(s.p,{children:"Request used by the Task Worker SDK to report the result of a TaskRun execution."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"ID of the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the TaskRun was executed"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"Status of the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"log_output"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Optional information for logging or exceptions"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"attempt_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Attempt number of the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"output"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Successfully completed task"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskerror",children:"LHTaskError"})}),(0,r.jsx)(s.td,{children:"Technical error"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exception"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskexception",children:"LHTaskException"})}),(0,r.jsx)(s.td,{children:"Business exception"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"rescuethreadrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"RescueThreadRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"The request used to rescue a failed ThreadRun at a specific NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsxs)(s.td,{children:["The id of the ",(0,r.jsx)(s.code,{children:"WfRun"})," which we are going to rescue."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the failed ",(0,r.jsx)(s.code,{children:"ThreadRun"})," that we will rescue. The specified ",(0,r.jsx)(s.code,{children:"ThreadRun"})," must be in a state where it's latest ",(0,r.jsx)(s.code,{children:"NodeRun"})," is: ",(0,r.jsx)("br",{})," - In the ",(0,r.jsx)(s.code,{children:"ERROR"})," state.",(0,r.jsx)("br",{})," - Has no ",(0,r.jsx)(s.code,{children:"FailureHandler"})," ",(0,r.jsx)(s.code,{children:"ThreadRun"}),"s ",(0,r.jsx)("br",{})," - The parent ",(0,r.jsx)(s.code,{children:"ThreadRun"}),", or any parent of the parent, has not handled the ",(0,r.jsx)(s.code,{children:"Failure"})," yet.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If that is not true, then the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," cannot be rescued and the request will return ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"skip_current_node"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsxs)(s.td,{children:["If set to ",(0,r.jsx)(s.code,{children:"true"}),", then the ThreadRun will skip past the ",(0,r.jsx)(s.code,{children:"Node"})," of the current failed ",(0,r.jsx)(s.code,{children:"NodeRun"})," and advance according to the outgoing edges. If set to ",(0,r.jsx)(s.code,{children:"false"}),", then the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," will schedule another ",(0,r.jsx)(s.code,{children:"NodeRun"})," for the current ",(0,r.jsx)(s.code,{children:"Node"})]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"resumewfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ResumeWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Resume a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Is the WfRunId"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the ThreadRun to resume. Note that resuming the entrypoint ThreadRun (which always has number ",(0,r.jsx)(s.code,{children:"0"}),") causes the whole WfRun to resume. If you do not manually set the thread_run_number field, it defaults to zero, so resuming the entire WfRun is the default behavior."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"runwfrequest",children:["Message ",(0,r.jsx)(s.code,{children:"RunWfRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Create a Workflow Run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to run."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:'Optionally specify the major version of the WfSpec to run. This guarantees that the "signature" of the WfSpec (i.e. the required input variables, and searchable variables) will not change for this app.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify the specific revision of the WfSpec to run. It is not recommended to use this in practice, as the WfSpec logic should be de-coupled from the applications that run WfRun's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#runwfrequestvariablesentry",children:"RunWfRequest.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"A map from Variable Name to Values for those variables. The provided variables are passed as input to the Entrypoint ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"You can optionally specify the ID of this WfRun. This is a recommended best practice as it also makes your request idempotent and allows you to easily find the WfRun at a later time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"runwfrequestvariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"RunWfRequest.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"schedulewfrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduleWfRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Schedule WfRuns based on a specific cron UNIX expression"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specific ID"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to run."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:'Optionally specify the major version of the WfSpec to run. This guarantees that the "signature" of the WfSpec (i.e. the required input variables, and searchable variables) will not change for this app.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify the specific revision of the WfSpec to run. It is not recommended to use this in practice, as the WfSpec logic should be de-coupled from the applications that run WfRun's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#schedulewfrequestvariablesentry",children:"ScheduleWfRequest.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"A map from Variable Name to Values for those variables. The provided variables are passed as input to the Entrypoint ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Parent WfRunId associated with all the generated WfRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cron_expression"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"UNIX expression used to specify the schedule for executing WfRuns"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"schedulewfrequestvariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduleWfRequest.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledtask",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledTask"})]}),"\n",(0,r.jsx)(s.p,{children:"Message sent by server to Task Worker SDK specifying a specific TaskRun to be executed.\nThis is used and handled internally by the Task Worker SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"Id of the TaskRun to execute."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"ID of the TaskDef to which the TaskRun belongs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"attempt_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Attempt number of the TaskRun, zero indexed. attempt_number of ",(0,r.jsx)(s.code,{children:"0"})," means this is the first attempt; ",(0,r.jsx)(s.code,{children:"1"})," means this is the first retry, etc."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#varnameandval",children:"VarNameAndVal"})}),(0,r.jsx)(s.td,{children:"Input variables for this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"source"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunsource",children:"TaskRunSource"})}),(0,r.jsx)(s.td,{children:"Source of the TaskRun. Currently, there are two options: 1. A TASK node 2. A reminder task scheduled by a trigger on a User Task."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ScheduledWfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsx)(s.td,{children:"A list of ScheduledWfRun Objects"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternaleventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchExternalEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for ExternalEventDefs based on certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optionally search only for ExternalEventDef's whose name starts with this prefix."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternaleventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchExternalEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for ExternalEvents based on certain criteria."}),"\n",(0,r.jsx)(s.p,{children:"Required field ExternalEventDefId specifies which ExternalEventDef\nto search for ExternalEvents under."}),"\n",(0,r.jsx)(s.p,{children:"At this time, it is not possible to make a search for all ExternalEvents."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only ExternalEvents created after this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only ExternalEvents created before this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsxs)(s.td,{children:["Search for ExternalEvents by their ExternalEventDefId",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"* Note: If ExternalEventDefId is not provided or does not exist, gRPC status code 'INVALID_ARGUMENT' will be returned."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"is_claimed"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Optionally search for only ExternalEvents that are claimed or not."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchnoderunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchNodeRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for NodeRun's by certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Only return NodeRun's created after this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Only return NodeRun's created before this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchnoderunrequestnodetype",children:"SearchNodeRunRequest.NodeType"})}),(0,r.jsx)(s.td,{children:"Specifies the type of NodeRun to search for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"Specifies the status of NodeRun to search for."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchprincipalrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchPrincipalRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for Principals based on certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only Principals's created after this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only Principals's created before this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"isAdmin"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"principal_criteria"})]}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"List only Principals that are admins"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"tenantId"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"principal_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"List Principals associated with this Tenant ID"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchscheduledwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchScheduledWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search filters for ScheduledWfRun's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to filter"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The major version of the WfSpec to filter"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The revision number of the WfSpec to filter"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for TaskDef's based on certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optionally specify to only return TaskDef's with a specific prefix."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Searches for TaskRuns by various criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specifies the TaskDef of TaskRun's to return. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"Specifies to only return TaskRun's matching this status."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to only return TaskRun's that were scheduled after this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to only return TaskRun's that were scheduled before this time."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtenantrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchTenantRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for all available TenantIds for current Principal"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for UserTaskDef's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"user_task_def_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return all UserTaskDef's with a specific prefix."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"user_task_def_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return all UserTaskDef's with a specific name."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for UserTaskRun's matching certain criteria. The attributes are additive,\nyou may specify any combination of fields in this request. Only UserTaskRun's\nmatching all criteria will be returned."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunstatus",children:"UserTaskRunStatus"})}),(0,r.jsx)(s.td,{children:"Status of UserTaskRun's to return."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_name"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"UserTaskDef name to search for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's assigned to this user id."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's assigned to this user group."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's that were created after this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's that were created before this time."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchvariablerequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchVariableRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for Variables by their value. This request is also highly useful to search for\nWfRun's based on the value of Variable's that are not in the Entrypoint ThreadRun,\nand also when you are using LittleHorse as a data store and need to perform a search."}),"\n",(0,r.jsxs)(s.p,{children:["You may only search for a Variable that has an index specified on it. This may be done\nvia th ",(0,r.jsx)(s.code,{children:".searchable()"})," method on our SDK's."]}),"\n",(0,r.jsx)(s.p,{children:"Note that we do not yet support searching JSON_OBJ or JSON_ARR fields, but you may\nstill mark those fields as searchable. We will soon add the ability to query those\nfields via the indices."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Specifies the value that the variable must be. Exact match is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies major version of the WfSpec for the associated WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies the revision of the WfSpec for the associated WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specifies the name of the variable to search for. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specifies the name of the WfSpec for the associated WfRun's. This is required."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"A request used to retrieve a list of WfRunId's by certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The WfSpec whose WfRun's we are searching for. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's from this WfSpec Major Version."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's from this WfSpec Revision. Can only be set if wf_spec_major_version is also set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's matching this status."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's that started after this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's that started before this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_filters"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablematch",children:"VariableMatch"})}),(0,r.jsx)(s.td,{children:"Allows filtering WfRun's based on the value of the Variables. This ONLY works for the Variables in the entrypiont threadrun (that is, variables where the threadRunNumber == 0)."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for WfSpec's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_spec_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return WfSpec's with a specific name."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_spec_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return WfSpec's with a specific prefix."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_spec_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return all WfSpec's that make use of a given TaskDef."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"serverversionresponse",children:["Message ",(0,r.jsx)(s.code,{children:"ServerVersionResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"The version of the LH Server according to Semantic Versioning"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Server Major Version"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"minor_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Server Minor Version"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"patch_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Server Patch Version"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pre_release_identifier"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Prerelease Identifier. If this is set, then the server is NOT a production release but rather a release candidate or experimental pre-release."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"stopwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"StopWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Message to HALT a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Is the WfRunId"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the ThreadRun to halt. Note that halting the entrypoint ThreadRun (which always has number ",(0,r.jsx)(s.code,{children:"0"}),") causes the whole WfRun to halt. If you do not manually set the thread_run_number field, it defaults to zero, so stopping the entire WfRun is the default behavior."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefidlist",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of TaskDef Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefmetrics",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefMetrics"})]}),"\n",(0,r.jsx)(s.p,{children:"Metrics for a TaskDef in a certain time period."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"TaskDef that the metrics apply to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the window started."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"Length of the window."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schedule_to_start_max"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Longest time that a TaskRun was in the TASK_SCHEDULED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schedule_to_start_avg"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Average time that a TaskRun was in the TASK_SCHEDULED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_max"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Longest time between a TaskRun being started and completed"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_avg"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Average time between a TaskRun being started and completed"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_completed"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that reached the TASK_SUCCESS state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_errored"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that reached the TASK_ERROR state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_started"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that transitioned to the TASK_RUNNING state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_scheduled"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that were scheduled"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefmetricsqueryrequest",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefMetricsQueryRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve a specific TaskDef Metrics Window."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["Return the window ",(0,r.jsx)(s.em,{children:"containing"})," this timestamp. The window start is not guaranteed to align perfectly with the request."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The window size"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_name"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the specific TaskDef for which we are calculating metrics."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of TaskRun ID's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunlist",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of TaskRun's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrun",children:"TaskRun"})}),(0,r.jsx)(s.td,{children:"A list of TaskRun Objects"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkergroup",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerGroup"})]}),"\n",(0,r.jsx)(s.p,{children:"Describes all workers registered for a specific TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkergroupid",children:"TaskWorkerGroupId"})}),(0,r.jsx)(s.td,{children:"Identifier for the group."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Timestamp indicating when the worker group was initially registered."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_workers"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkergrouptaskworkersentry",children:"TaskWorkerGroup.TaskWorkersEntry"})}),(0,r.jsx)(s.td,{children:"Metadata grouped by ClientId string."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkergrouptaskworkersentry",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerGroup.TaskWorkersEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkermetadata",children:"TaskWorkerMetadata"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkerheartbeatrequest",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerHeartBeatRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Message used by Task Worker to register itself to the server and ask for assignments of\nservers to poll."}),"\n",(0,r.jsx)(s.p,{children:"Used by the Task Worker SDK; generally, you shouldn't have to touch this manually."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"client_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"listener_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkermetadata",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerMetadata"})]}),"\n",(0,r.jsx)(s.p,{children:"Describes a specific task worker"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"User-defined identifier for the worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_heartbeat"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Timestamp indicating the last heartbeat sent by the worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"hosts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhhostinfo",children:"LHHostInfo"})}),(0,r.jsx)(s.td,{children:"The host(s) where the worker is polling tasks"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tenantidlist",children:["Message ",(0,r.jsx)(s.code,{children:"TenantIdList"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantid",children:"TenantId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskdefidlist",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskDefIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of UserTaskDef Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of UserTaskRun Id's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunlist",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRunList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of UserTaskRuns"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrun",children:"UserTaskRun"})}),(0,r.jsx)(s.td,{children:"A list of UserTaskRun Objects"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableidlist",children:["Message ",(0,r.jsx)(s.code,{children:"VariableIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"This is a list of Variable ID's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableid",children:"VariableId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablelist",children:["Message ",(0,r.jsx)(s.code,{children:"VariableList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of Variables."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variable",children:"Variable"})}),(0,r.jsx)(s.td,{children:"A list of Variable objects."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablematch",children:["Message ",(0,r.jsx)(s.code,{children:"VariableMatch"})]}),"\n",(0,r.jsx)(s.p,{children:"Used by a SearchWfRunRequest to filter WfRun's and only return those whose Variable's\nmatch a certain filter."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable to inspect."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The value that the Variable must have in order to satisfy this VariableMatch"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"WfRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of WfRun Id's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecidlist",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of WfSpec Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecmetrics",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecMetrics"})]}),"\n",(0,r.jsx)(s.p,{children:"Metrics for a WfSpec in a specific time window"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The WfSpecId that these metrics analyze"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the window started"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The length of the window"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_started"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of WfRun's created for this WfSpec"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_completed"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of WfRun's that reached the COMPLETED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_errored"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of WfRun's that reached the ERROR state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_max"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Longest time between a WfRun being started and reaching the COMPLETED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_avg"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Average time that a WfRun took to reach the COMPLETED state"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecmetricsqueryrequest",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecMetricsQueryRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve a specific WfSpec Metrics Window."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"WfSpecId of metrics to get."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["Return the window ",(0,r.jsx)(s.em,{children:"containing"})," this timestamp. The window start is not guaranteed to align perfectly with the request."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_length"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The window size"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdef",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDef"})]}),"\n",(0,r.jsx)(s.p,{children:"A TaskDef defines a blueprint for a TaskRun that can be dispatched to Task Workers."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of this TaskDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"input_vars"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"The input variables required to execute this TaskDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which this TaskDef was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schema_output"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefoutputschema",children:"TaskDefOutputSchema"})}),(0,r.jsx)(s.td,{children:"Schema that validates the TaskDef's output"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefoutputschema",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefOutputSchema"})]}),"\n",(0,r.jsx)(s.p,{children:"Schema that validates the TaskDef's output"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value_def"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"The definition for the output content"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"lhtaskerror",children:["Message ",(0,r.jsx)(s.code,{children:"LHTaskError"})]}),"\n",(0,r.jsx)(s.p,{children:"Message denoting a TaskRun failed for technical reasons."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lherrortype",children:"LHErrorType"})}),(0,r.jsx)(s.td,{children:"The technical error code."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human readable message for debugging."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"lhtaskexception",children:["Message ",(0,r.jsx)(s.code,{children:"LHTaskException"})]}),"\n",(0,r.jsx)(s.p,{children:"Message denoting a TaskRun's execution signaled that something went wrong in the\nbusiness process, throwing a littlehorse 'EXCEPTION'."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:'The user-defined Failure name, for example, "credit-card-declined"'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human readadble description of the failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskattempt",children:["Message ",(0,r.jsx)(s.code,{children:"TaskAttempt"})]}),"\n",(0,r.jsx)(s.p,{children:"A single time that a TaskRun was scheduled for execution on a Task Queue."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"log_output"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsxs)(s.td,{children:["Optional information provided by the Task Worker SDK for debugging. Usually, if set it contains a stacktrace or it contains information logged via ",(0,r.jsx)(s.code,{children:"WorkerContext#log()"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schedule_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the TaskAttempt was scheduled on the Task Queue. Not set for a TaskAttempt that is in the TASK_PENDING status; for example, when waiting between retries with exponential backoff."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the TaskAttempt was pulled off the queue and sent to a TaskWorker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the TaskAttempt was finished (either completed, reported as failed, or timed out)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: the ID of the Task Worker who executed this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The version of the Task Worker that executed the TaskAttempt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"The status of this TaskAttempt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"output"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Denotes the Task Function executed properly and returned an output."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskerror",children:"LHTaskError"})}),(0,r.jsx)(s.td,{children:"An unexpected technical error was encountered. May or may not be retriable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exception"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskexception",children:"LHTaskException"})}),(0,r.jsx)(s.td,{children:"The Task Function encountered a business problem and threw a technical exception."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked_value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Indicates whether the result of the attempt field has been masked"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tasknodereference",children:["Message ",(0,r.jsx)(s.code,{children:"TaskNodeReference"})]}),"\n",(0,r.jsx)(s.p,{children:"Reference to a NodeRun of type TASK which caused a TaskRun to be scheduled."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the NodeRun which caused this TASK to be scheduled."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrun",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A TaskRun resents a single instance of a TaskDef being executed."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskRun. Note that the TaskRunId contains the WfRunId."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskDef being executed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"attempts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskattempt",children:"TaskAttempt"})}),(0,r.jsx)(s.td,{children:"All attempts scheduled for this TaskRun. A TaskAttempt represents an occurrence of the TaskRun being put on a Task Queue to be executed by the Task Workers."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"input_variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#varnameandval",children:"VarNameAndVal"})}),(0,r.jsx)(s.td,{children:"The input variables to pass into this TaskRun. Note that this is a list and not a map, because ordering matters. Depending on the language implementation, not every LittleHorse Task Worker SDK has the ability to determine the names of the variables from the method signature, so we provide both names and ordering."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"source"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunsource",children:"TaskRunSource"})}),(0,r.jsx)(s.td,{children:"The source (in the WfRun) that caused this TaskRun to be created. Currently, this can be either a TASK node, or a User Task Action Task Trigger in a USER_TASK node (such as a task used to send reminders)."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"scheduled_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the TaskRun was scheduled."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"The status of the TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timeout_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The timeout before LH considers a TaskAttempt to be timed out."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_attempts"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The maximum number of attempts that may be scheduled for this TaskRun. NOTE: setting total_attempts to 1 means that there are no retries."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exponential_backoff"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exponentialbackoffretrypolicy",children:"ExponentialBackoffRetryPolicy"})}),(0,r.jsx)(s.td,{children:"Optional backoff policy ."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunsource",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunSource"})]}),"\n",(0,r.jsx)(s.p,{children:"The source of a TaskRun; i.e. why it was scheduled."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_node"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_run_source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknodereference",children:"TaskNodeReference"})}),(0,r.jsx)(s.td,{children:"Reference to a NodeRun of type TASK which scheduled this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_trigger"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_run_source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertasktriggerreference",children:"UserTaskTriggerReference"})}),(0,r.jsx)(s.td,{children:"Reference to the specific UserTaskRun trigger action which scheduled this TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec that is being executed. Always set in ScheduledTask.source so that the WorkerContext can know this information."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"varnameandval",children:["Message ",(0,r.jsx)(s.code,{children:"VarNameAndVal"})]}),"\n",(0,r.jsx)(s.p,{children:"A key-value pair of variable name and value."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The variable name."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The value of the variable for this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsxs)(s.td,{children:["Indicates whether the content of the ",(0,r.jsx)(s.code,{children:"value"})," field has been masked"]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"assignusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"AssignUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Re-Assigns a UserTaskRun to a specific userId or userGroup."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The UserTaskRun to assign to a new user_id or user_group."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"override_claim"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"If override_claim is set to false and the UserTaskRun is already assigned to a user_id, then the request throws a FAILED_PRECONDITION error. If set to true, then the old claim is overriden and the UserTaskRun is assigned to the new user."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The new user_group to which the UserTaskRun is assigned. If not set, then the user_group of the UserTaskRun is actively unset by this request. At least one of the user_group and user_id must be set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The new user_id to which the UserTaskRun is assigned. If not set, then the user_id of the UserTaskRun is actively unset by this request. At least one of the user_group and user_id must be set."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"cancelusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"CancelUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Cancels a UserTaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The id of the UserTaskRun to cancel."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"completeusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"CompleteUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Completes a UserTaskRun with provided values."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The id of UserTaskRun to complete."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#completeusertaskrunrequestresultsentry",children:"CompleteUserTaskRunRequest.ResultsEntry"})}),(0,r.jsx)(s.td,{children:"A map from UserTaskField.name to a VariableValue containing the results of the user filling out the form."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID of the user who executed the task."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"completeusertaskrunrequestresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"CompleteUserTaskRunRequest.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"saveusertaskrunprogressrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SaveUserTaskRunProgressRequest"})]}),"\n",(0,r.jsxs)(s.p,{children:["Saves the results of a UserTaskRun and logs who saved the content.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)("li",{children:[" Throws FAILED_PRECONDITION if the UserTaskRun is in the ",(0,r.jsx)(s.code,{children:"DONE"})," or ",(0,r.jsx)(s.code,{children:"CANCELLED"})," state."]}),"\n",(0,r.jsxs)("li",{children:[" If ",(0,r.jsx)(s.code,{children:"policy"})," is set to ",(0,r.jsx)(s.code,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),", returns ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the\n",(0,r.jsx)(s.code,{children:"user_id"})," field of the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," does not match the ",(0,r.jsx)(s.code,{children:"user_id"})," of the request."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The id of UserTaskRun to save."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#saveusertaskrunprogressrequestresultsentry",children:"SaveUserTaskRunProgressRequest.ResultsEntry"})}),(0,r.jsx)(s.td,{children:"A map from UserTaskField.name to a VariableValue containing the results of the user filling out the form."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID of the user who saved the task."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"policy"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#saveusertaskrunprogressrequestsaveusertaskrunassignmentpolicy",children:"SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy"})}),(0,r.jsxs)(s.td,{children:["Configures how to handle ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," ownership when saving it."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"saveusertaskrunprogressrequestresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"SaveUserTaskRunProgressRequest.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskdef",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskDef"})]}),"\n",(0,r.jsx)(s.p,{children:"UserTaskDef is the metadata blueprint for UserTaskRuns."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["The name of the ",(0,r.jsx)(s.code,{children:"UserTaskDef"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The version of the ",(0,r.jsx)(s.code,{children:"UserTaskDef"}),". Only simple versioning is supported."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"description"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Metadata field that does not impact WfRun execution. Useful for providing context on the UserTaskRun, for example when displaying it on a general-purpose task manager application."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fields"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskfield",children:"UserTaskField"})}),(0,r.jsx)(s.td,{children:"These are the fields comprise the User Task. A User Task Manager application, or any application used to complete a UserTaskRun, should inspect these fields and display form entries for each one."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the UserTaskRun was created."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskevent",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent"})]}),"\n",(0,r.jsxs)(s.p,{children:["This is an event stored in the audit log of a ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," purely for observability\npurposes."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"the time the event occurred."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_executed"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutetaskexecuted",children:"UserTaskEvent.UTETaskExecuted"})}),(0,r.jsx)(s.td,{children:"Denotes that a TaskRun was scheduled via a trigger."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"assigned"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventuteassigned",children:"UserTaskEvent.UTEAssigned"})}),(0,r.jsx)(s.td,{children:"Denotes that the UserTaskRun was assigned."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cancelled"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutecancelled",children:"UserTaskEvent.UTECancelled"})}),(0,r.jsx)(s.td,{children:"Denotes that the UserTaskRun was cancelled."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"saved"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutesaved",children:"UserTaskEvent.UTESaved"})}),(0,r.jsxs)(s.td,{children:["Denotes that the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," was saved."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventuteassigned",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTEAssigned"})]}),"\n",(0,r.jsx)(s.p,{children:"Message denoting that the UserTaskRun was assigned."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_id before the ownership change, if set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_group before the ownership change, if set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_id after the ownership change, if set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_group after the ownership change, if set."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutecancelled",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTECancelled"})]}),"\n",(0,r.jsxs)(s.p,{children:["Empty message used to denote that the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," was cancelled."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutesaved",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTESaved"})]}),"\n",(0,r.jsxs)(s.p,{children:["Message to denote that the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," was saved."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_id of the user who saved the UserTaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutesavedresultsentry",children:"UserTaskEvent.UTESaved.ResultsEntry"})}),(0,r.jsx)(s.td,{children:"The results that were saved."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutesavedresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTESaved.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutetaskexecuted",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTETaskExecuted"})]}),"\n",(0,r.jsxs)(s.p,{children:["Message to denote that a ",(0,r.jsx)(s.code,{children:"TaskRun"})," was scheduled by a trigger for this UserTaskRun."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsxs)(s.td,{children:["The ",(0,r.jsx)(s.code,{children:"TaskRunId"})," of the scheduled ",(0,r.jsx)(s.code,{children:"TaskRun"})]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskfield",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskField"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskField is a specific field of data to be entered into a UserTaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the field. When a UserTaskRun is completed, the NodeOutput is a single-level JSON_OBJ. Each key is the name of the field. Must be unique."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"The type of the output. Must be a primitive type (STR, BOOL, INT, DOUBLE)."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"description"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optional description which can be displayed by the User Task UI application. Does not affect WfRun execution."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"display_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name to be displayed by the User Task UI application. Does not affect WfRun execution."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"required"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether this field is required for UserTaskRun completion."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrun",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRun"})]}),"\n",(0,r.jsxs)(s.p,{children:["A UserTaskRun is a running instance of a UserTaskDef. It is created when a\nThreadRun arrives at a Node of type ",(0,r.jsx)(s.code,{children:"USER_TASK"}),"."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskDef that this UserTaskRun comes from."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Denotes the UserTaskRun as belonging to a specific User Group.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"The ",(0,r.jsx)(s.code,{children:"user_group"})," does not refer to a group that is stored in LittleHorse; rather, it is the responsibility of the application to keep track of user/group identity and ensure that the user_group does indeed exist.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Either ",(0,r.jsx)(s.code,{children:"user_id"})," or ",(0,r.jsx)(s.code,{children:"user_group"})," or both are set at any time."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Denotes the UserTaskRun as assigned to a specific User ID. If this is set, then the UserTaskRun is either in the ASSIGNED, DONE, or CANCELLED status.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"The ",(0,r.jsx)(s.code,{children:"user_id"})," does not refer to a User that is stored in LittleHorse; rather, it is the responsibility of the application to keep track of user identity and ensure that the user_id does indeed exist.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Either ",(0,r.jsx)(s.code,{children:"user_id"})," or ",(0,r.jsx)(s.code,{children:"user_group"})," or both are set at any time."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunresultsentry",children:"UserTaskRun.ResultsEntry"})}),(0,r.jsxs)(s.td,{children:["The results of the UserTaskRun. Empty if the UserTaskRun has not yet been completed. Each key in this map is the ",(0,r.jsx)(s.code,{children:"name"})," of a corresponding ",(0,r.jsx)(s.code,{children:"UserTaskField"})," on the UserTaskDef."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunstatus",children:"UserTaskRunStatus"})}),(0,r.jsx)(s.td,{children:"Status of the UserTaskRun. Can be UNASSIGNED, ASSIGNED, DONE, or CANCELLED."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"events"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskevent",children:"UserTaskEvent"})}),(0,r.jsx)(s.td,{children:"A list of events that have happened. Used for auditing information."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"notes"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Notes about this UserTaskRun that are ",(0,r.jsx)(s.strong,{children:"specific to the WfRun"}),". These notes are set by the WfSpec based on variables inside the specific ",(0,r.jsx)(s.code,{children:"WfRun"})," and are intended to be displayed on the User Task Manager application. They do not affect WfRun execution."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"scheduled_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the UserTaskRun was created/scheduled."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The NodeRun with which the UserTaskRun is associated."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"epoch"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Current observed epoch of the UserTaskRun, related to the number of times it has been updated or re-assigned. Used internally to implement automated reassignment and reminder tasks."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRun.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertasktriggerreference",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskTriggerReference"})]}),"\n",(0,r.jsx)(s.p,{children:'All TaskRun\'s have a "trigger reference" which refers to the WfRun Element that\ncaused the TaskRun to be scheduled. For example, a TaskRun on a regular TASK_NODE\nhas a TaskNodeReference.'}),"\n",(0,r.jsx)(s.p,{children:'The UserTaskTriggerReference serves as the "Trigger Reference" for a TaskRun that\nwas scheduled by a lifecycle hook on a UserTaskRun (eg. a reminder task).'}),"\n",(0,r.jsx)(s.p,{children:"The UserTaskTriggerReference is most useful in the WorkerContext of the Task Worker\nSDK, which allows the Task Method to determine where the TaskRun comes from."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"Is the NodeRun that the UserTaskRun belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_event_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Is the index in the ",(0,r.jsx)(s.code,{children:"events"})," field of the UserTaskRun that the TaskRun corresponds to."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the user_id that the UserTaskRun is assigned to. Unset if UserTaskRun is not asigned to a specific user_id."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the user_id that the UserTaskRun is assigned to. Unset if UserTaskRun is not asigned to a specific user_id."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variable",children:["Message ",(0,r.jsx)(s.code,{children:"Variable"})]}),"\n",(0,r.jsx)(s.p,{children:"A Variable is an instance of a variable assigned to a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableid",children:"VariableId"})}),(0,r.jsx)(s.td,{children:"ID of this Variable. Note that the VariableId contains the relevant WfRunId inside it, the threadRunNumber, and the name of the Variabe."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The value of this Variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the Variable was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec that this Variable belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Marks a variable to show masked values"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablevalue",children:["Message ",(0,r.jsx)(s.code,{children:"VariableValue"})]}),"\n",(0,r.jsx)(s.p,{children:"VariableValue is a structure containing a value in LittleHorse. It can be\nused to pass input variables into a WfRun/ThreadRun/TaskRun/etc, as output\nfrom a TaskRun, as the value of a WfRun's Variable, etc."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_obj"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A String representing a serialized json object."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_arr"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A String representing a serialized json list."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"double"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"double"}),(0,r.jsx)(s.td,{children:"A 64-bit floating point number."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bool"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"A boolean."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"str"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A string."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"int"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsxs)(s.td,{children:["The ",(0,r.jsx)(s.code,{children:"INT"})," variable type is stored as a 64-bit integer. The ",(0,r.jsx)(s.code,{children:"INT"})," can be cast to a ",(0,r.jsx)(s.code,{children:"DOUBLE"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bytes"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"An arbitrary String of bytes."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failurebeinghandled",children:["Message ",(0,r.jsx)(s.code,{children:"FailureBeingHandled"})]}),"\n",(0,r.jsx)(s.p,{children:"Points to the Failure that is currently being handled in the ThreadRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The thread run number."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The position of the NodeRun causing the failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The number of the failure."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"handlingfailurehaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"HandlingFailureHaltReason"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted while a Failure Handler is being run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the Failure Handler ThreadRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"interrupted",children:["Message ",(0,r.jsx)(s.code,{children:"Interrupted"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted because it is waiting for the\ninterrupt handler threadRun to run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupt_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the Interrupt Handler ThreadRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"manualhalt",children:["Message ",(0,r.jsx)(s.code,{children:"ManualHalt"})]}),"\n",(0,r.jsxs)(s.p,{children:["A Halt Reason denoting that a ThreadRun was halted manually, via the ",(0,r.jsx)(s.code,{children:"rpc StopWfRun"})," request."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"meaning_of_life"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Nothing to store."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"parenthalted",children:["Message ",(0,r.jsx)(s.code,{children:"ParentHalted"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted because its parent is also HALTED."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the halted parent."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendingfailurehandler",children:["Message ",(0,r.jsx)(s.code,{children:"PendingFailureHandler"})]}),"\n",(0,r.jsx)(s.p,{children:"Represents a Failure Handler that is pending to be run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failed_thread_run"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ThreadRun that failed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to run to handle the failure."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendingfailurehandlerhaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"PendingFailureHandlerHaltReason"})]}),"\n",(0,r.jsxs)(s.p,{children:["A Halt Reason denoting that a ThreadRun is halted while a Failure Handler is ",(0,r.jsx)(s.em,{children:"enqueued"})," to be\nrun."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The position of the NodeRun which threw the failure."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendinginterrupt",children:["Message ",(0,r.jsx)(s.code,{children:"PendingInterrupt"})]}),"\n",(0,r.jsx)(s.p,{children:"Represents an ExternalEvent that has a registered Interrupt Handler for it\nand which is pending to be sent to the relevant ThreadRun's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEvent triggering the Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to run to handle the Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupted_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the ThreadRun to interrupt. Must wait for this ThreadRun to be HALTED before running the Interrupt Handler."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendinginterrupthaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"PendingInterruptHaltReason"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted while waiting for an Interrupt handler\nto be run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventId that caused the Interrupt."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadhaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadHaltReason"})]}),"\n",(0,r.jsxs)(s.p,{children:["Denotes a reason why a ThreadRun is halted. See ",(0,r.jsx)(s.code,{children:"ThreadRun.halt_reasons"})," for context."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_halted"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#parenthalted",children:"ParentHalted"})}),(0,r.jsx)(s.td,{children:"Parent threadRun halted."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupted"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#interrupted",children:"Interrupted"})}),(0,r.jsx)(s.td,{children:"Handling an Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_interrupt"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendinginterrupthaltreason",children:"PendingInterruptHaltReason"})}),(0,r.jsx)(s.td,{children:"Waiting to handle Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_failure"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendingfailurehandlerhaltreason",children:"PendingFailureHandlerHaltReason"})}),(0,r.jsx)(s.td,{children:"Waiting to handle a failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handling_failure"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#handlingfailurehaltreason",children:"HandlingFailureHaltReason"})}),(0,r.jsx)(s.td,{children:"Handling a failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"manual_halt"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#manualhalt",children:"ManualHalt"})}),(0,r.jsx)(s.td,{children:"Manually stopped the WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadrun",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A ThreadRun is a running thread of execution within a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The current WfSpecId of this ThreadRun. This must be set explicitly because during a WfSpec Version Migration, it is possible for different ThreadSpec's to have different WfSpec versions."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the ThreadRun. This is an auto-incremented integer corresponding to the chronological ordering of when the ThreadRun's were created. If you have not configured any retention policy for the ThreadRun's (i.e. never clean them up), then this also corresponds to the position of the ThreadRun in the WfRun's ",(0,r.jsx)(s.code,{children:"thread_runs"})," list."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The status of the ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec being run."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ThreadRun was started."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ThreadRun was completed or failed. Unset if still active."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error_message"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human-readable error message detailing what went wrong in the case of a failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"child_thread_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"List of thread_run_number's for all child thread_runs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_thread_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Set for every ThreadRun except the ENTRYPOINT. This is the id of the parent thread."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"halt_reasons"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadhaltreason",children:"ThreadHaltReason"})}),(0,r.jsx)(s.td,{children:'If the ThreadRun is HALTED, this contains a list of every reason for which the ThreadRun is HALTED. Once every reason is "resolved" (and thus removed from the list), then the ThreadRun will return to the RUNNING state.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupt_trigger_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"If this ThreadRun is of type INTERRUPT_HANDLER, this field is set to the ID of the ExternalEvent that caused the Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_being_handled"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurebeinghandled",children:"FailureBeingHandled"})}),(0,r.jsx)(s.td,{children:"If this ThreadRun is of type FAILURE_HANDLER, this field is set to the exact Failure that is being handled by this ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"current_node_position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["This is the current ",(0,r.jsx)(s.code,{children:"position"})," of the current NodeRun being run. This is an auto-incremented field that gets incremented every time we run a new NodeRun."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handled_failed_children"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["List of every child ThreadRun which both a) failed, and b) was properly handled by a Failure Handler.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),'This is important because at the EXIT node, if a Child ThreadRun was discovered to have failed, then this ThreadRun (the parent) also fails with the same failure as the child. If, however, a Failure Handler had previously "handled" the Child Failure, that ThreadRun\'s number is appended to this list, and then the EXIT node ignores that ThreadRun.']})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadtype",children:"ThreadType"})}),(0,r.jsx)(s.td,{children:"The Type of this ThreadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfrun",children:["Message ",(0,r.jsx)(s.code,{children:"WfRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A WfRun is a running instance of a WfSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec that this WfRun belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_wf_spec_versions"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"When a WfRun is migrated from an old verison of a WfSpec to a newer one, we add the old WfSpecId to this list for historical auditing and debugging purposes."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The status of this WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"greatest_threadrun_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The ID number of the greatest ThreadRUn in this WfRun. The total number of ThreadRuns is given by greatest_thread_run_number + 1.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Introduced now since with ThreadRun-level retention, we can't rely upon thread_runs.size() to determine the number of ThreadRuns, as a ThreadRun is removed from the thread_runs list once its retention period expires."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the WfRun was started."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the WfRun failed or completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_runs"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadrun",children:"ThreadRun"})}),(0,r.jsx)(s.td,{children:"A list of all active ThreadRun's and terminated ThreadRun's whose retention periods have not yet expired."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_interrupts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendinginterrupt",children:"PendingInterrupt"})}),(0,r.jsx)(s.td,{children:"A list of Interrupt events that will fire once their appropriate ThreadRun's finish halting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_failures"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendingfailurehandler",children:"PendingFailureHandler"})}),(0,r.jsx)(s.td,{children:"A list of pending failure handlers which will fire once their appropriate ThreadRun's finish halting."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"edge",children:["Message ",(0,r.jsx)(s.code,{children:"Edge"})]}),"\n",(0,r.jsx)(s.p,{children:"The Edge is the line in the workflow that connects one Node to another."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"sink_node_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the Node that the Edge points to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"condition"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#edgecondition",children:"EdgeCondition"})}),(0,r.jsxs)(s.td,{children:["The Condition on which this Edge will be traversed. When choosing an Edge to travel after the completion of a NodeRun, the Edges are evaluated in order. The first one to either have no condition or have a condition which evaluates to ",(0,r.jsx)(s.code,{children:"true"})," is taken."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_mutations"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutation",children:"VariableMutation"})}),(0,r.jsx)(s.td,{children:"Ordered list of Variable Mutations to execute when traversing this Edge."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"edgecondition",children:["Message ",(0,r.jsx)(s.code,{children:"EdgeCondition"})]}),"\n",(0,r.jsx)(s.p,{children:"This is a boolean expression used to evaluate whether an Edge is valid."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"comparator"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#comparator",children:"Comparator"})}),(0,r.jsx)(s.td,{children:"The Operator used to evaluate the left versus the right."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"left"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"The left side of the boolean expression."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"right"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"The right side of the Boolean Expression."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"entrypointnode",children:["Message ",(0,r.jsx)(s.code,{children:"EntrypointNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines the beginning of the ThreadRun execution."}),"\n",(0,r.jsx)(s.p,{children:"Output is NULL"}),"\n",(0,r.jsxs)(s.h3,{id:"exitnode",children:["Message ",(0,r.jsx)(s.code,{children:"ExitNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines the end of the ThreadRun execution."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_def"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failuredef",children:"FailureDef"})}),(0,r.jsxs)(s.td,{children:["If set, this ExitNode throws the specified Failure upon arrival. Note that Failures are propagated up to the parent ThreadRun (or cause the entire WfRun to fail if sent by the entrypoint ThreadRun).",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If this is not set, then a ThreadRun arriving at this Exit Node will be COMPLETED."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventnode",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventNode"})]}),"\n",(0,r.jsx)(s.p,{children:"An ExternalEventNode causes the WfRun to stop and wait for an ExternalEvent\nto arrive before continuing onwards."}),"\n",(0,r.jsx)(s.p,{children:"The output is just the content of the ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef that we are waiting for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timeout_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Determines the maximum amount of time that the NodeRun will wait for the ExternalEvent to arrive."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failuredef",children:["Message ",(0,r.jsx)(s.code,{children:"FailureDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines a Failure that can be thrown."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The code for the failure. If in UPPER_CASE, it must be one of the LHErrorType enums, and represents an ERROR. If it is in kebab-case, then it is a user-defined EXCEPTION."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human-readable message denoting why the Failure occurred."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"If specified, the thrown Failure will have this content."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failurehandlerdef",children:["Message ",(0,r.jsx)(s.code,{children:"FailureHandlerDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Specifies a Failure Handler which can run in case of a certain Failure to allow\nthe ThreadRun to run compensatory logic and gracefully continue rather than\nfailing immediately."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to run as a"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"specific_failure"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"failure_to_catch"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Specifies that this FailureHandlerDef will be triggered for a Failure with this exact name.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If this and ",(0,r.jsx)(s.code,{children:"specific_failure"})," are both unset, then any failure is caught."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"any_failure_of_type"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"failure_to_catch"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurehandlerdeflhfailuretype",children:"FailureHandlerDef.LHFailureType"})}),(0,r.jsx)(s.td,{children:"Specifies that this FailureHandlerDef will be triggered for any failure matching this type (ERROR or EXCEPTION)."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"interruptdef",children:["Message ",(0,r.jsx)(s.code,{children:"InterruptDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines an Interrupt for a ThreadSpec. An Interrupt means that when an ExternalEvent\nof a certain type is registered to the WfRun, then the affected ThreadRun is HALTED\nand a handler ThreadRun is run as an interrupt handler. The interrupted ThreadRun\nis resumed once the interrupt handler completes."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef which triggers an Interrupt for this ThreadSpec. Note that as of 0.9.0, you cannot use an ExternalEventDefId for both an InterruptDef and an ExternalEventNode in the same WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec that we run as the interrupt handler."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"jsonindex",children:["Message ",(0,r.jsx)(s.code,{children:"JsonIndex"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines an index to make a JSON_OBJ or JSON_ARR variable searchable over a specific\nJSON Path."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"field_path"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Denotes the path in JSONPath format (according to the Java Jayway library) that has a field we should index."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"field_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"Is the type of the field we are indexing."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"node",children:["Message ",(0,r.jsx)(s.code,{children:"Node"})]}),"\n",(0,r.jsx)(s.p,{children:"A Node is a step in a ThreadRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"outgoing_edges"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#edge",children:"Edge"})}),(0,r.jsx)(s.td,{children:"Defines the flow of execution and determines where the ThreadRun goes next."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handlers"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurehandlerdef",children:"FailureHandlerDef"})}),(0,r.jsx)(s.td,{children:"Specifies handlers for failures (EXCEPTION or ERROR or both) which might be thrown by the NodeRun. If a Failure is thrown by the Node execution, then the first matching Failure Handler (if present) is run. If there is a matching Failure Handler and it runs to completion, then the ThreadRun advances from the Node; else, it fails."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#entrypointnode",children:"EntrypointNode"})}),(0,r.jsx)(s.td,{children:"Creates an EntrypointRun. Every ThreadRun has one Entrypoint node."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exit"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exitnode",children:"ExitNode"})}),(0,r.jsx)(s.td,{children:"Creates an `ExitRun``. Every ThreadSpec has at least one Exit Node."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknode",children:"TaskNode"})}),(0,r.jsx)(s.td,{children:"Creates a TaskNodeRUn"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventnode",children:"ExternalEventNode"})}),(0,r.jsx)(s.td,{children:"Creates an ExternalEventNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_thread"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startthreadnode",children:"StartThreadNode"})}),(0,r.jsx)(s.td,{children:"Creates a StartThreadNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_for_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsnode",children:"WaitForThreadsNode"})}),(0,r.jsx)(s.td,{children:"Creates a WaitForThreadsNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"nop"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#nopnode",children:"NopNode"})}),(0,r.jsx)(s.td,{children:"Creates a NopNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"sleep"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#sleepnode",children:"SleepNode"})}),(0,r.jsx)(s.td,{children:"Creates a SleepNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertasknode",children:"UserTaskNode"})}),(0,r.jsx)(s.td,{children:"Creates a UserTaskNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_multiple_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startmultiplethreadsnode",children:"StartMultipleThreadsNode"})}),(0,r.jsx)(s.td,{children:"Creates a StartMultipleThreadsNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"throw_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#throweventnode",children:"ThrowEventNode"})}),(0,r.jsx)(s.td,{children:"Creates a ThrowEventNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_for_condition"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforconditionnode",children:"WaitForConditionNode"})}),(0,r.jsx)(s.td,{children:"Creates a WaitForConditionRun"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"nodemigration",children:["Message ",(0,r.jsx)(s.code,{children:"NodeMigration"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: Specification for migrating a WfRun from a Node in one WfSpec\nto a Node in another WfSpec version."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_node_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the Node on the new WfSpec to move to."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"nopnode",children:["Message ",(0,r.jsx)(s.code,{children:"NopNode"})]}),"\n",(0,r.jsx)(s.p,{children:"NOP node has no operations and is used for conditional branching."}),"\n",(0,r.jsxs)(s.h3,{id:"sleepnode",children:["Message ",(0,r.jsx)(s.code,{children:"SleepNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Sleep Node causes the WfRun to wait a specified time and then resume."}),"\n",(0,r.jsx)(s.p,{children:"There is no output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"raw_seconds"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"sleep_length"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Sleeps the specified number of seconds."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timestamp"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"sleep_length"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Sleeps until the ",(0,r.jsx)(s.code,{children:"long"})," timestamp (epoch millis) specified here."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"iso_date"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"sleep_length"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Sleeps until the ISO-formatted date specified here."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startmultiplethreadsnode",children:["Message ",(0,r.jsx)(s.code,{children:"StartMultipleThreadsNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Iterates over a JSON_ARR and starts a Child ThreadRun for each element in the\nlist."}),"\n",(0,r.jsx)(s.p,{children:"Returns a JSON_ARR containing the thread_run_number of each spawned child."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to spawn."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startmultiplethreadsnodevariablesentry",children:"StartMultipleThreadsNode.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"Variables which are passed into the child ThreadRuns. These assignments are the same for all spawned threads."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"iterable"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Assignment that resolves to a JSON_ARR. For each element in the list, a child ThreadRun is started. The reserved ",(0,r.jsx)(s.code,{children:"INPUT"})," variable for each Child is set to the corresponding item in the list."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startmultiplethreadsnodevariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"StartMultipleThreadsNode.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startthreadnode",children:["Message ",(0,r.jsx)(s.code,{children:"StartThreadNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Starts a Child ThreadRun with a specific ThreadSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to spawn."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startthreadnodevariablesentry",children:"StartThreadNode.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"The input variables to pass into the Child ThreadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startthreadnodevariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"StartThreadNode.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadretentionpolicy",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadRetentionPolicy"})]}),"\n",(0,r.jsx)(s.p,{children:"ThreadRetentionPolicy specifies how long to keep record of a ThreadRun and its associated\nNodeRun's and TaskRun's and Variables after the ThreadRun has been completed."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"seconds_after_thread_termination"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"thread_gc_policy"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Delete associated ThreadRun's X seconds after they terminate, regardless of status."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspec",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpec"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines a blueprint for a ThreadRun, which is a thread of execution inside a\nWfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"nodes"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspecnodesentry",children:"ThreadSpec.NodesEntry"})}),(0,r.jsx)(s.td,{children:"The Nodes inside this ThreadSpec. Maps from name to Node."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_defs"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadvardef",children:"ThreadVarDef"})}),(0,r.jsx)(s.td,{children:"Defines Variables that are local to ThreadRun's of this ThreadSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupt_defs"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#interruptdef",children:"InterruptDef"})}),(0,r.jsx)(s.td,{children:"Defines all interrupts for this ThreadSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadretentionpolicy",children:"ThreadRetentionPolicy"})}),(0,r.jsx)(s.td,{children:"Optional retention policy to clean up ThreadRun's of this ThreadSpec after they have been completed. This is important for long-lived WfRun's that could have hundreds of ThreadRun's, because a ThreadRun has a record inside the WfRun itself."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspecnodesentry",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpec.NodesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#node",children:"Node"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspecmigration",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpecMigration"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: Specification for how to migrate a ThreadRun of a specific ThreadSpec\nfrom one WfSpec to another WfSpec version."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec in the new WfSpec that this ThreadSpec should migrate to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_migrations"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspecmigrationnodemigrationsentry",children:"ThreadSpecMigration.NodeMigrationsEntry"})}),(0,r.jsx)(s.td,{children:"Map from name of the nodes on the current ThreadSpec to the migration to perform on it to move it to a new WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspecmigrationnodemigrationsentry",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpecMigration.NodeMigrationsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#nodemigration",children:"NodeMigration"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadvardef",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadVarDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Denotes a variable declaration at the ThreadSpec level."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_def"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"Is the actual VariableDefinition containing name and type."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"required"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the variable is required as input to the threadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"searchable"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether this variable has an index configured."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_indexes"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#jsonindex",children:"JsonIndex"})}),(0,r.jsx)(s.td,{children:"Valid for JSON_OBJ and JSON_ARR variables only. List of JSON fields to index."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"access_level"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunvariableaccesslevel",children:"WfRunVariableAccessLevel"})}),(0,r.jsx)(s.td,{children:"The Access Level of this variable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"throweventnode",children:["Message ",(0,r.jsx)(s.code,{children:"ThrowEventNode"})]}),"\n",(0,r.jsx)(s.p,{children:"A SubNode that throws a WorkflowEvent of a specific type. There is no output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The WorkflowEventDefId of the WorkflowEvent that is thrown"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"A VariableAssignment defining the content of the WorkflowEvent that is thrown"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertasknode",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskNode"})]}),"\n",(0,r.jsx)(s.p,{children:"The UserTaskNode creates a UserTaskRun, which is used to get input from a human\nuser into the workflow."}),"\n",(0,r.jsx)(s.p,{children:"The output is a JSON_OBJ variable with one key/value pair for each UserTaskField."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Denotes the name of the ",(0,r.jsx)(s.code,{children:"UserTaskDef"})," that should create the ",(0,r.jsx)(s.code,{children:"UserTaskRun"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Denotes the user_group to which the UserTaskRun is assigned upon creation."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Denotes the user_id to which the UserTaskRun is assigned upon creation."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"actions"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontrigger",children:"UTActionTrigger"})}),(0,r.jsx)(s.td,{children:'Specifies a list of actions that happen on various time-based triggers. Actions include reassigning the UserTaskRun, cancelling the UserTaskRun, or executing a "reminder" TaskRun.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If set, then the UserTaskRun will always have this specific version of the UserTaskDef. Otherwise, the UserTaskRun will have the latest version."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"notes"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Specifies the value to be displayed on the ",(0,r.jsx)(s.code,{children:"notes"})," field of the UserTaskRun."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"on_cancellation_exception_name"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Specifies the name of the exception thrown when the User Task is canceled. If not set, then the cancellation or timeout of a User Task Run throws an ERROR rather than an EXCEPTION."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforconditionnode",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForConditionNode"})]}),"\n",(0,r.jsx)(s.p,{children:"A SubNode that blocks until a condition is satisfied in the WfRun.\nThere is no output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"condition"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#edgecondition",children:"EdgeCondition"})}),(0,r.jsx)(s.td,{children:"The condition that this node will block for."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsnode",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsNode"})]}),"\n",(0,r.jsxs)(s.p,{children:["Specifies that a ThreadRun will wait for certain specified Child ThreadRun's to\ncomplete or fail before the WfRun continues. If one of the Child ThreadRun's\nthrows a Failure that is not caught by the ",(0,r.jsx)(s.code,{children:"per_thread_failure_handlers"}),",\nthen the Child ThreadRun's Failure is thrown by the WaitForThreadsRun."]}),"\n",(0,r.jsx)(s.p,{children:"No output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"threads_to_wait_for"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsnodethreadstowaitfor",children:"WaitForThreadsNode.ThreadsToWaitFor"})}),(0,r.jsx)(s.td,{children:"Specifies that the WaitForThreadsRun will wait for the threads specified here."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_list"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"threads_to_wait_for"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Specifies that the WaitForThreadsRun will wait for a list of ThreadRun's contained in the JSON_ARR value specified here. Each element in the list must be an INT representing the ",(0,r.jsx)(s.code,{children:"number"})," of a ThreadRun that we're waiting for."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"per_thread_failure_handlers"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurehandlerdef",children:"FailureHandlerDef"})}),(0,r.jsxs)(s.td,{children:["If any of the child ThreadRun's that we are waiting for throw a Failure, we will evaluate it against these FailureHandlerDef's and run the first matching FailureHandler (if any). The FailureHandler will be a child of the child, which means that it has access to all of the variables in the scope of the failed Child ThreadRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"This is different from Node-level Failure Handlers, which would be ",(0,r.jsx)(s.em,{children:"siblings"})," of the ThreadRuns that we're waiting for, and would run only when the overall nodeRun has failed."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsnodethreadtowaitfor",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsNode.ThreadToWaitFor"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Causes the WaitForThreadsNodeRun to wait for the ThreadRun whose number matches the value specified here. Must resolve to an INT."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsnodethreadstowaitfor",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsNode.ThreadsToWaitFor"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"threads"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsnodethreadtowaitfor",children:"WaitForThreadsNode.ThreadToWaitFor"})}),(0,r.jsx)(s.td,{children:"Wait for one or more ThreadRun's"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspec",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpec"})]}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.code,{children:"WfSpec"})," defines the logic for a workflow in LittleHorse. It is a metadata object\nand is a blueprint for a ",(0,r.jsx)(s.code,{children:"WfRun"})," execution."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ",(0,r.jsx)(s.code,{children:"WfSpec"}),". Note that this ID is versioned with both a major version and a minor revision. Creating new WfSpec's with the same name and different specifications results in a completely new ",(0,r.jsx)(s.code,{children:"WfSpec"})," object whose ",(0,r.jsx)(s.code,{children:"id.name"})," is the same but with different version."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["The timestamp at which the ",(0,r.jsx)(s.code,{children:"WfSpec"})," was created."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"frozen_variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadvardef",children:"ThreadVarDef"})}),(0,r.jsx)(s.td,{children:"Variables whose types cannot be changed without causing a Breaking Change between the versions."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metadatastatus",children:"MetadataStatus"})}),(0,r.jsxs)(s.td,{children:["The Status of the ",(0,r.jsx)(s.code,{children:"WfSpec"}),". Currently, only ",(0,r.jsx)(s.code,{children:"ACTIVE"})," exists. This field will be used in the future when de-commissioning a WfSpec gracefully."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_specs"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecthreadspecsentry",children:"WfSpec.ThreadSpecsEntry"})}),(0,r.jsxs)(s.td,{children:["The various ThreadSpec's in this ",(0,r.jsx)(s.code,{children:"WfSpec"}),". Each ",(0,r.jsx)(s.code,{children:"ThreadSpec"})," defines a blueprint for a parallel thread of execution (a ",(0,r.jsx)(s.code,{children:"ThreadRun"}),"). They are referred to by their names."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint_thread_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["The name of the ",(0,r.jsx)(s.code,{children:"ENTRYPOINT"})," ThreadSpec. The Entrypoint is the ",(0,r.jsx)(s.code,{children:"ThreadSpec"})," for the Entrypoint ThreadRun, which is the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," that is created upon starting the ",(0,r.jsx)(s.code,{children:"WfRun"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowretentionpolicy",children:"WorkflowRetentionPolicy"})}),(0,r.jsxs)(s.td,{children:["Optional policy that configures cleaning up old ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s after they are completed or failed. Recommended for production settings to avoid running out of disk space; unless you are using a ",(0,r.jsx)(s.code,{children:"WfRun"})," as a data record, in which case the application should clean up ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s as appropriate."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"migration"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecversionmigration",children:"WfSpecVersionMigration"})}),(0,r.jsxs)(s.td,{children:["EXPERIMENTAL: ongoing migration from one version of a ",(0,r.jsx)(s.code,{children:"WfSpec"})," to another."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_spec"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecparentwfspecreference",children:"WfSpec.ParentWfSpecReference"})}),(0,r.jsx)(s.td,{children:"Reference to the parent WfSpec. If this is set, all WfRun's for this WfSpec must be the child of a WfRun belonging to the referenced WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecparentwfspecreference",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpec.ParentWfSpecReference"})]}),"\n",(0,r.jsxs)(s.p,{children:["Reference to another WfSpec. If a WfSpec has a ParentWfSpecReference, then all\nWfRun's for that WfSpec ",(0,r.jsx)(s.em,{children:"MUST"})," be the child of a WfRun of the provided WfSpec; meaning\nthat the RunWf RPC must provide a ",(0,r.jsx)(s.code,{children:"parent_wf_run_id"})," that belongs to the specified\nWfSpec."]}),"\n",(0,r.jsx)(s.p,{children:"Currently, only reference by names is supported."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Name of the Parent WfSpec"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"FOR NOW: no validation of variables on parent. In the future we will pass wf_spec_major_version, but we should probably examine the rules for evolution in the future."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecthreadspecsentry",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpec.ThreadSpecsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspec",children:"ThreadSpec"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecversionmigration",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecVersionMigration"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: Specification for how to migrate an in-flight WfRun from one WfSpec\nto another WfSpec version."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The major version of the WfSpec that we are migrating to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_revision"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The revision of the WfSpec that we are migrating to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_migrations"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecversionmigrationthreadspecmigrationsentry",children:"WfSpecVersionMigration.ThreadSpecMigrationsEntry"})}),(0,r.jsx)(s.td,{children:"Map from ThreadSpec name to a specifier determining how to migrate ThreadRun's to the new version of the WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecversionmigrationthreadspecmigrationsentry",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecVersionMigration.ThreadSpecMigrationsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspecmigration",children:"ThreadSpecMigration"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workflowretentionpolicy",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowRetentionPolicy"})]}),"\n",(0,r.jsx)(s.p,{children:"A WorkflowRetentionPolicy configures how long a WfRun is retained in the data store before\nbeing deleted after it is completed or failed."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"seconds_after_wf_termination"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_gc_policy"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Delete all WfRun's X seconds after they terminate, regardless of status."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"workflowevent",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEvent"})]}),"\n",(0,r.jsxs)(s.p,{children:['A WorkflowEvent represents a "Thing That Happened" ',(0,r.jsx)(s.em,{children:"INSIDE"})," a WfRun. It is DIFFERENT from\nan ExternalEvent, because an ExternalEvent represents something that happened OUTSIDE the WfRun,\nand is used to send information to the WfRun."]}),"\n",(0,r.jsx)(s.p,{children:"In contrast, a WorkflowEvent is thrown by the WfRun and is used to send information to the outside\nworld."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsx)(s.td,{children:"The ID of the WorkflowEvent. Contains WfRunId and WorkflowEventDefId."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The content of the WorkflowEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the WorkflowEvent was created."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventdef",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"littlehorse-enums",children:"LittleHorse Enums"}),"\n",(0,r.jsx)(s.p,{children:"This section contains the enums defined by the LittleHorse API."}),"\n",(0,r.jsx)(s.h3,{id:"aclaction",children:"Enum ACLAction"}),"\n",(0,r.jsx)(s.p,{children:"Describes an Action that can be taken over a specific set of resources."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"READ"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Allows all RPC's that start with ",(0,r.jsx)(s.code,{children:"Get"}),", ",(0,r.jsx)(s.code,{children:"List"}),", and ",(0,r.jsx)(s.code,{children:"Search"})," in relation to the metadata (eg. ",(0,r.jsx)(s.code,{children:"TaskDef"})," for ",(0,r.jsx)(s.code,{children:"ACL_TASK"}),") or run data (eg. ",(0,r.jsx)(s.code,{children:"TaskRun"})," for ",(0,r.jsx)(s.code,{children:"ACL_TASK"}),")"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"RUN"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Allows RPC's that are needed for mutating the ",(0,r.jsx)(s.em,{children:"runs"})," of the resource. For example, ",(0,r.jsx)(s.code,{children:"RUN"})," over ",(0,r.jsx)(s.code,{children:"ACL_TASK"})," allows the ",(0,r.jsx)(s.code,{children:"ReportTask"})," and ",(0,r.jsx)(s.code,{children:"PollTask"})," RPC's, and ",(0,r.jsx)(s.code,{children:"RUN"})," over ",(0,r.jsx)(s.code,{children:"ACL_WORKFLOW"})," allows the ",(0,r.jsx)(s.code,{children:"RunWf"}),", ",(0,r.jsx)(s.code,{children:"DeleteWfRun"}),", ",(0,r.jsx)(s.code,{children:"StopWfRun"}),", and ",(0,r.jsx)(s.code,{children:"ResumeWfRun"})," RPC's."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WRITE_METADATA"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["Allows mutating metadata. For example, ",(0,r.jsx)(s.code,{children:"WRITE_METADATA"})," over ",(0,r.jsx)(s.code,{children:"ACL_WORKFLOW"})," allows mutating ",(0,r.jsx)(s.code,{children:"WfSpec"}),"s, and ",(0,r.jsx)(s.code,{children:"WRITE_METADATA"})," over ",(0,r.jsx)(s.code,{children:"ACL_TASK"})," allows mutating ",(0,r.jsx)(s.code,{children:"TaskDef"}),"s."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ALL_ACTIONS"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Allows all actions related to a resource."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"aclresource",children:"Enum ACLResource"}),"\n",(0,r.jsx)(s.p,{children:"Defines a resource type for ACL's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_WORKFLOW"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"WfSpec"})," and ",(0,r.jsx)(s.code,{children:"WfRun"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_TASK"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"TaskDef"})," and ",(0,r.jsx)(s.code,{children:"TaskRun"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_EXTERNAL_EVENT"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"ExternalEventDef"})," and ",(0,r.jsx)(s.code,{children:"ExternalEvent"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_USER_TASK"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"UserTaskDef"})," and ",(0,r.jsx)(s.code,{children:"UserTaskRun"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_PRINCIPAL"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsxs)(s.td,{children:["Refers to the ",(0,r.jsx)(s.code,{children:"Principal"})," resource. Currently, the ",(0,r.jsx)(s.code,{children:"ACL_PRINCIPAL"})," permission is only valid in the ",(0,r.jsx)(s.code,{children:"global_acls"})," field of the ",(0,r.jsx)(s.code,{children:"Principal"}),". A ",(0,r.jsx)(s.code,{children:"Principal"})," who only has access to a specific Tenant cannot create othe Principals because a Principal is scoped to the Cluster, and not to a Tenant."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_TENANT"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsxs)(s.td,{children:["Refers to the ",(0,r.jsx)(s.code,{children:"Tenant"})," resource. The ",(0,r.jsx)(s.code,{children:"ACL_TENANT"})," permission is only valid in the ",(0,r.jsx)(s.code,{children:"global_acls"})," field of the ",(0,r.jsx)(s.code,{children:"Principal"}),". This is because the ",(0,r.jsx)(s.code,{children:"Tenant"})," resource is cluster-scoped."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_ALL_RESOURCES"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsxs)(s.td,{children:["Refers to all resources. In the ",(0,r.jsx)(s.code,{children:"global_acls"})," field, this includes ",(0,r.jsx)(s.code,{children:"Principal"})," and ",(0,r.jsx)(s.code,{children:"Tenant"})," resources. In the ",(0,r.jsx)(s.code,{children:"per_tenant_acls"})," field, this does not include ",(0,r.jsx)(s.code,{children:"Principal"})," and ",(0,r.jsx)(s.code,{children:"Tenant"})," since those are cluster-scoped resources."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_TASK_WORKER_GROUP"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsxs)(s.td,{children:["Refers to the ",(0,r.jsx)(s.code,{children:"TaskWorkerGroup"})," associated with a TaskDef"]})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"lherrortype",children:"Enum LHErrorType"}),"\n",(0,r.jsx)(s.p,{children:"This enum is all of the types of technical failure that can occur in a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"CHILD_FAILURE"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"A child ThreadRun failed with a technical ERROR."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"VAR_SUB_ERROR"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Failed substituting input variables into a NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"VAR_MUTATION_ERROR"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Failed mutating variables after a NodeRun successfully completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"USER_TASK_CANCELLED"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"A UserTaskRun was cancelled (EVOLVING: this will become a Business EXCEPTION)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TIMEOUT"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"A NodeRun failed due to a timeout."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_FAILURE"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"A TaskRun failed due to an unexpected error."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"VAR_ERROR"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"Wrapper for VAR_SUB_ERROR and VAR_MUTATION_ERROR"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_ERROR"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsx)(s.td,{children:"Wrapper for TASK_FALIURE and TIMEOUT"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"INTERNAL_ERROR"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"An unexpected LittleHorse Internal error occurred. This is not expected to happen."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"lhstatus",children:"Enum LHStatus"}),"\n",(0,r.jsx)(s.p,{children:"Status used for WfRun, ThreadRun, and NodeRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"STARTING"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"The entity is starting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"RUNNING"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"The entity is running."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"COMPLETED"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"The entity is completed. This is a terminal state."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"HALTING"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsxs)(s.td,{children:["The entity will move to ",(0,r.jsx)(s.code,{children:"HALTED"})," as soon as all preconditions for halting are satisfied."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"HALTED"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"The entity is halted, either by user intervention or by the workflow scheduler."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ERROR"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"The entity has failed due to a technical failure, such as a type conversion error, a task timeout due to network failure, or a task worker crash."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXCEPTION"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"The entity has failed due to a business exception defined by the user."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"metadatastatus",children:"Enum MetadataStatus"}),"\n",(0,r.jsx)(s.p,{children:"Status of a Metadata Object, such as WfSpec or TaskDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACTIVE"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"ACTIVE means the object can be used."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ARCHIVED"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"An ARCHIVED WfSpec can no longer be used to create new WfRun's, but existing WfRun's will be allowed to run to completion."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TERMINATING"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"A TERMINATING WfSpec is actively deleting all running WfRun's, and will self-destruct once all of its child WfRun's are terminated."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"metricswindowlength",children:"Enum MetricsWindowLength"}),"\n",(0,r.jsx)(s.p,{children:"Metrics"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"MINUTES_5"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"HOURS_2"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"DAYS_1"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"taskstatus",children:"Enum TaskStatus"}),"\n",(0,r.jsx)(s.p,{children:"Status of a TaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_SCHEDULED"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Scheduled in the Task Queue but not yet picked up by a Task Worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_RUNNING"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Picked up by a Task Worker, but not yet reported or timed out."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_SUCCESS"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Successfully completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_FAILED"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Task Worker reported a technical failure while attempting to execute the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_TIMEOUT"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Task Worker did not report a result in time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_OUTPUT_SERIALIZING_ERROR"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"Task Worker reported that it was unable to serialize the output of the TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_INPUT_VAR_SUB_ERROR"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"Task Worker was unable to deserialize the input variables into appropriate language-specific objects to pass into the Task Function"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_EXCEPTION"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"Task Function business logic determined that there was a business exception."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_PENDING"}),(0,r.jsx)(s.td,{children:"9"}),(0,r.jsx)(s.td,{children:'Refers to a TaskAttempt that is not yet scheduled. This happens when using retries with an ExponentialBackoffRetryPolicy: the TaskAttempt isn\'t supposed to be scheduled until it "matures", but it does already exist.'})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"variabletype",children:"Enum VariableType"}),"\n",(0,r.jsx)(s.p,{children:"Type of a Varaible in LittleHorse. Corresponds to the possible value type's of a\nVariableValue."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"JSON_OBJ"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["An object represented as a json string. ",(0,r.jsx)("br",{})]})]})})]}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"JSON_OBJ"})," variable allows you to store complex objects in the JSON format. When using the Java and GoLang SDK's, the ",(0,r.jsx)(s.code,{children:"JSON_OBJ"})," variable type is often used transparently to the user. For example, the Java Task Worker SDK can inspect your method signature and automatically deserialize an input variable into a POJO. |\n| JSON_ARR | 1 | The ",(0,r.jsx)(s.code,{children:"JSON_ARR"})," variable allows you to store collections of objects as a JSON array. The behavior is similar to the ",(0,r.jsx)(s.code,{children:"JSON_OBJ"})," variable type. |\n| DOUBLE | 2 | The ",(0,r.jsx)(s.code,{children:"DOUBLE"})," variable type is a 64-bit floating point number. It can be cast to an ",(0,r.jsx)(s.code,{children:"INT"}),". |\n| BOOL | 3 | Boolean denotes a simple boolean switch. |\n| STR | 4 | The ",(0,r.jsx)(s.code,{children:"STR"})," variable type is stored as a String. ",(0,r.jsx)(s.code,{children:"INT"}),", ",(0,r.jsx)(s.code,{children:"DOUBLE"}),", and ",(0,r.jsx)(s.code,{children:"BOOL"})," variables can be cast to a ",(0,r.jsx)(s.code,{children:"STR"}),". |\n| INT | 5 | The ",(0,r.jsx)(s.code,{children:"INT"})," variable type is stored as a 64-bit integer. The ",(0,r.jsx)(s.code,{children:"INT"})," can be cast to a ",(0,r.jsx)(s.code,{children:"DOUBLE"}),". |\n| BYTES | 6 | The ",(0,r.jsx)(s.code,{children:"BYTES"})," variable type allows you to store an arbitrary byte string. |"]}),"\n",(0,r.jsx)(s.h3,{id:"comparator",children:"Enum Comparator"}),"\n",(0,r.jsx)(s.p,{children:"Operator for comparing two values to create a boolean expression."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LESS_THAN"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:"<"}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"GREATER_THAN"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:">"}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LESS_THAN_EQ"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:"<="}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"GREATER_THAN_EQ"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:">="}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EQUALS"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"This is valid for any variable type, and is similar to .equals() in Java."})]})]})]}),"\n",(0,r.jsxs)(s.p,{children:["One note: if the RHS is a different type from the LHS, then LittleHorse will try to cast the RHS to the same type as the LHS. If the cast fails, then the ThreadRun fails with a VAR_SUB_ERROR. |\n| NOT_EQUALS | 5 | This is the inverse of ",(0,r.jsx)(s.code,{children:"EQUALS"})," |\n| IN | 6 | Only valid if the RHS is a JSON_OBJ or JSON_ARR. Valid for any type on the LHS."]}),"\n",(0,r.jsxs)(s.p,{children:["For the JSON_OBJ type, this returns true if the LHS is equal to a ",(0,r.jsx)(s.em,{children:"KEY"})," in the RHS. For the JSON_ARR type, it returns true if one of the elements of the RHS is equal to the LHS. |\n| NOT_IN | 7 | The inverse of IN. |"]}),"\n",(0,r.jsx)(s.h3,{id:"utactiontriggeruthook",children:"Enum UTActionTrigger.UTHook"}),"\n",(0,r.jsx)(s.p,{children:"Enumerates the different lifecycle hooks that can cause the timer to start running."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ON_ARRIVAL"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["The hook should be scheduled ",(0,r.jsx)(s.code,{children:"delay_seconds"})," after the UserTaskRun is created. This hook only causes the action to be scheduled once."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ON_TASK_ASSIGNED"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["The hook should be scheduled ",(0,r.jsx)(s.code,{children:"delay_seconds"}),' after the ownership of the UserTaskRun changes. This hook causes the Action to be scheduled one or more times. The first time is scheduled when the UserTaskRun is created, since we treat the change from "UserTaskRun is nonexistent" to "UserTaskRun is owned by a userId or userGroup" as a change in ownership.']})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"variablemutationtype",children:"Enum VariableMutationType"}),"\n",(0,r.jsx)(s.p,{children:"Enumerates the available operations to mutate a variable in a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ASSIGN"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Set the variable specified by the LHS to the value of the RHS."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ADD"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Add the RHS to the LHS."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXTEND"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Append the RHS to the LHS (valid if the LHS is a STR or JSON_ARR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"SUBTRACT"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Subtract the RHS from the LHS (both must be INT or DOUBLE)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"MULTIPLY"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Multiply the LHS by the RHS (both must be INT or DOUBLE)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"DIVIDE"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"Divide the LHS by the RHS (both must be INT or DOUBLE)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"REMOVE_IF_PRESENT"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"Remove any occurrences of RHS from LHS (LHS must be JSON_ARR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"REMOVE_INDEX"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsx)(s.td,{children:"Remove item at index RHS from LHS (LHS must be JSON_ARR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"REMOVE_KEY"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"Remove the key specified by RHS from the LHS (LHS must be JSON_OBJ)"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"waitforthreadsrunwaitingthreadstatus",children:"Enum WaitForThreadsRun.WaitingThreadStatus"}),"\n",(0,r.jsx)(s.p,{children:"The status of a single ThreadRun that we are waiting for."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_IN_PROGRESS"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"The ThreadRun is in progress (i.e. not COMPLETED nor EXCEPTION nor ERROR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_HANDLING_FAILURE"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"The ThreadRun failed with some failure, and the FailureHandler is running for that Failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_COMPLETED_OR_FAILURE_HANDLED"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:'We can mark this ThreadRun as "already waited for", meaning that either: 1. It completed successfully, OR 2. It failed, and the Failure Handler successfully completed'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_UNSUCCESSFUL"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"The ThreadRun did not complete successfully, and there wasn't a successful run of a Failure Handler for the Failure that was thrown."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"allowedupdatetype",children:"Enum AllowedUpdateType"}),"\n",(0,r.jsx)(s.p,{children:"This enum controls the behavior of a PutWfSpecRequest when a WfSpec with the same\nname previously exists."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ALL_UPDATES"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Allows any update: both minor (revsion) changes and breaking (majorVersion) changes are accepted"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"MINOR_REVISION_UPDATES"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Allows only backwards-compatible changes that do not change the required input variables or the searchable variables in the WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"NO_UPDATES"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Rejects any changes to the WfSpec."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"searchnoderunrequestnodetype",children:"Enum SearchNodeRunRequest.NodeType"}),"\n",(0,r.jsx)(s.p,{children:"This enum denotes the type of a NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"TASK node schedules a TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXTERNAL_EVENT"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"EXTERNAL_EVENT blocks the ThreadRun until a specified ExternalEvent arrives"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ENTRYPOINT"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"ENTRYPOINT kicks off a ThreadRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXIT"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"EXIT completes a ThreadRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"START_THREAD"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"START_THREAD creates a Child ThreadRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WAIT_THREADS"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"WAIT_THREADS waits for one or more child ThreadRuns to complete"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"SLEEP"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"SLEEP makes the ThreadRun sleep for a specified time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"USER_TASK"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsx)(s.td,{children:"USER_TASK creates a UserTaskRun and blocks until the UserTaskRun is completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"START_MULTIPLE_THREADS"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"START_MULTIPLE_THREADS iterates over a list and starts a Child Thread for each item"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"saveusertaskrunprogressrequestsaveusertaskrunassignmentpolicy",children:"Enum SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy"}),"\n",(0,r.jsxs)(s.p,{children:["Configures how to handle ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," ownership when saving it."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"If the UserTaskRun is already assigned to a user_id, then the request throws a FAILED_PRECONDITION error."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"IGNORE_CLAIM"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["If the UserTaskRun is already assigned to a user_id, then the request will leave the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," assigned to the current user but still update the ",(0,r.jsx)(s.code,{children:"results"})," and log in the ",(0,r.jsx)(s.code,{children:"events"})," who updated the results."]})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"usertaskrunstatus",children:"Enum UserTaskRunStatus"}),"\n",(0,r.jsx)(s.p,{children:"The status that a UserTaskRun can be in."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"UNASSIGNED"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Not assigned to a specific user yet."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ASSIGNED"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Assigned to a specific user, but not completed or cancelled yet."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"DONE"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Done."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"CANCELLED"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Cancelled."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"threadtype",children:"Enum ThreadType"}),"\n",(0,r.jsx)(s.p,{children:"The type of a ThreadRUn."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ENTRYPOINT"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"The ENTRYPOINT ThreadRun. Exactly one per WfRun. Always has number == 0."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"CHILD"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"A ThreadRun explicitly created by another ThreadRun via a START_THREAD or START_MULTIPLE_THREADS NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"INTERRUPT"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"A ThreadRun that was created to handle an Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAILURE_HANDLER"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"A ThreadRun that was created to handle a Failure."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"failurehandlerdeflhfailuretype",children:"Enum FailureHandlerDef.LHFailureType"}),"\n",(0,r.jsx)(s.p,{children:"Specifies a type of Failure"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAILURE_TYPE_ERROR"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["FAILURE_TYPE_ERROR specifies any technical ",(0,r.jsx)(s.code,{children:"ERROR"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAILURE_TYPE_EXCEPTION"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Specifies a user-defined, business-related ",(0,r.jsx)(s.code,{children:"EXCEPTION"}),"."]})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"wfrunvariableaccesslevel",children:"Enum WfRunVariableAccessLevel"}),"\n",(0,r.jsx)(s.p,{children:"Determines the Access Level for a Variable in a ThreadSpec/WfSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"PUBLIC_VAR"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["A ",(0,r.jsx)(s.code,{children:"PUBLIC_VAR"})," can be accessed (read + mutated) by child ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"PRIVATE_VAR"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["A ",(0,r.jsx)(s.code,{children:"PRIVATE_VAR"})," cannot be accessed by a child ",(0,r.jsx)(s.code,{children:"WfRun"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"INHERITED_VAR"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["An ",(0,r.jsx)(s.code,{children:"INHERITED_VAR"})," is inherited from the parent ",(0,r.jsx)(s.code,{children:"WfRun"}),". Only valid in a ",(0,r.jsx)(s.code,{children:"WfSpec"})," that has a parent. Also can only be declared in the Entrypoint Thread."]})]})]})]})]})}function x(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,s,d)=>{d.d(s,{R:()=>i,x:()=>h});var r=d(6540);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function h(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a162317.e3b8f6cf.js b/assets/js/2a162317.e3b8f6cf.js new file mode 100644 index 000000000..d1d3a7b90 --- /dev/null +++ b/assets/js/2a162317.e3b8f6cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[7828],{4620:(e,s,d)=>{d.r(s),d.d(s,{assets:()=>l,contentTitle:()=>i,default:()=>x,frontMatter:()=>t,metadata:()=>h,toc:()=>c});var r=d(4848),n=d(8453);const t={},i="LittleHorse API Reference",h={id:"api",title:"LittleHorse API Reference",description:"The LittleHorse Server exposes a GRPC API to its clients. For most general usage of LittleHorse, you will not need to",source:"@site/docs/08-api.md",sourceDirName:".",slug:"/api",permalink:"/docs/api",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Tips, Pointers, and FAQ",permalink:"/docs/faq"}},l={},c=[{value:"LittleHorse GRPC API",id:"littlehorse-grpc-api",level:2},{value:"RPC PutTaskDef",id:"puttaskdef",level:3},{value:"RPC GetTaskDef",id:"gettaskdef",level:3},{value:"RPC GetTaskWorkerGroup",id:"gettaskworkergroup",level:3},{value:"RPC PutExternalEventDef",id:"putexternaleventdef",level:3},{value:"RPC GetExternalEventDef",id:"getexternaleventdef",level:3},{value:"RPC PutWorkflowEventDef",id:"putworkfloweventdef",level:3},{value:"RPC PutWfSpec",id:"putwfspec",level:3},{value:"RPC GetWfSpec",id:"getwfspec",level:3},{value:"RPC GetLatestWfSpec",id:"getlatestwfspec",level:3},{value:"RPC MigrateWfSpec",id:"migratewfspec",level:3},{value:"RPC PutUserTaskDef",id:"putusertaskdef",level:3},{value:"RPC GetUserTaskDef",id:"getusertaskdef",level:3},{value:"RPC GetLatestUserTaskDef",id:"getlatestusertaskdef",level:3},{value:"RPC RunWf",id:"runwf",level:3},{value:"RPC ScheduleWf",id:"schedulewf",level:3},{value:"RPC SearchScheduledWfRun",id:"searchscheduledwfrun",level:3},{value:"RPC GetScheduledWfRun",id:"getscheduledwfrun",level:3},{value:"RPC GetWfRun",id:"getwfrun",level:3},{value:"RPC GetUserTaskRun",id:"getusertaskrun",level:3},{value:"RPC AssignUserTaskRun",id:"assignusertaskrun",level:3},{value:"RPC CompleteUserTaskRun",id:"completeusertaskrun",level:3},{value:"RPC CancelUserTaskRun",id:"cancelusertaskrun",level:3},{value:"RPC SaveUserTaskRunProgress",id:"saveusertaskrunprogress",level:3},{value:"RPC ListUserTaskRuns",id:"listusertaskruns",level:3},{value:"RPC GetNodeRun",id:"getnoderun",level:3},{value:"RPC ListNodeRuns",id:"listnoderuns",level:3},{value:"RPC GetTaskRun",id:"gettaskrun",level:3},{value:"RPC ListTaskRuns",id:"listtaskruns",level:3},{value:"RPC GetVariable",id:"getvariable",level:3},{value:"RPC ListVariables",id:"listvariables",level:3},{value:"RPC PutExternalEvent",id:"putexternalevent",level:3},{value:"RPC GetExternalEvent",id:"getexternalevent",level:3},{value:"RPC AwaitWorkflowEvent",id:"awaitworkflowevent",level:3},{value:"RPC GetWorkflowEventDef",id:"getworkfloweventdef",level:3},{value:"RPC GetWorkflowEvent",id:"getworkflowevent",level:3},{value:"RPC ListExternalEvents",id:"listexternalevents",level:3},{value:"RPC ListWorkflowEvents",id:"listworkflowevents",level:3},{value:"RPC SearchWfRun",id:"searchwfrun",level:3},{value:"RPC SearchNodeRun",id:"searchnoderun",level:3},{value:"RPC SearchTaskRun",id:"searchtaskrun",level:3},{value:"RPC SearchUserTaskRun",id:"searchusertaskrun",level:3},{value:"RPC SearchVariable",id:"searchvariable",level:3},{value:"RPC SearchExternalEvent",id:"searchexternalevent",level:3},{value:"RPC SearchWorkflowEvent",id:"searchworkflowevent",level:3},{value:"RPC SearchTaskDef",id:"searchtaskdef",level:3},{value:"RPC SearchUserTaskDef",id:"searchusertaskdef",level:3},{value:"RPC SearchWfSpec",id:"searchwfspec",level:3},{value:"RPC SearchExternalEventDef",id:"searchexternaleventdef",level:3},{value:"RPC SearchWorkflowEventDef",id:"searchworkfloweventdef",level:3},{value:"RPC SearchTenant",id:"searchtenant",level:3},{value:"RPC SearchPrincipal",id:"searchprincipal",level:3},{value:"RPC RegisterTaskWorker",id:"registertaskworker",level:3},{value:"RPC PollTask",id:"polltask",level:3},{value:"RPC ReportTask",id:"reporttask",level:3},{value:"RPC StopWfRun",id:"stopwfrun",level:3},{value:"RPC ResumeWfRun",id:"resumewfrun",level:3},{value:"RPC RescueThreadRun",id:"rescuethreadrun",level:3},{value:"RPC DeleteWfRun",id:"deletewfrun",level:3},{value:"RPC DeleteTaskDef",id:"deletetaskdef",level:3},{value:"RPC DeleteWfSpec",id:"deletewfspec",level:3},{value:"RPC DeleteUserTaskDef",id:"deleteusertaskdef",level:3},{value:"RPC DeleteExternalEventDef",id:"deleteexternaleventdef",level:3},{value:"RPC DeleteWorkflowEventDef",id:"deleteworkfloweventdef",level:3},{value:"RPC DeletePrincipal",id:"deleteprincipal",level:3},{value:"RPC DeleteScheduledWfRun",id:"deletescheduledwfrun",level:3},{value:"RPC GetTaskDefMetricsWindow",id:"gettaskdefmetricswindow",level:3},{value:"RPC GetWfSpecMetricsWindow",id:"getwfspecmetricswindow",level:3},{value:"RPC ListTaskDefMetrics",id:"listtaskdefmetrics",level:3},{value:"RPC ListWfSpecMetrics",id:"listwfspecmetrics",level:3},{value:"RPC PutTenant",id:"puttenant",level:3},{value:"RPC GetTenant",id:"gettenant",level:3},{value:"RPC PutPrincipal",id:"putprincipal",level:3},{value:"RPC Whoami",id:"whoami",level:3},{value:"RPC GetServerVersion",id:"getserverversion",level:3},{value:"LittleHorse Protobuf Schemas",id:"littlehorse-protobuf-schemas",level:2},{value:"Message DeletePrincipalRequest",id:"deleteprincipalrequest",level:3},{value:"Message Principal",id:"principal",level:3},{value:"Message Principal.PerTenantAclsEntry",id:"principalpertenantaclsentry",level:3},{value:"Message PutPrincipalRequest",id:"putprincipalrequest",level:3},{value:"Message PutPrincipalRequest.PerTenantAclsEntry",id:"putprincipalrequestpertenantaclsentry",level:3},{value:"Message PutTenantRequest",id:"puttenantrequest",level:3},{value:"Message ServerACL",id:"serveracl",level:3},{value:"Message ServerACLs",id:"serveracls",level:3},{value:"Message Tenant",id:"tenant",level:3},{value:"Message ExponentialBackoffRetryPolicy",id:"exponentialbackoffretrypolicy",level:3},{value:"Message TaskNode",id:"tasknode",level:3},{value:"Message UTActionTrigger",id:"utactiontrigger",level:3},{value:"Message UTActionTrigger.UTACancel",id:"utactiontriggerutacancel",level:3},{value:"Message UTActionTrigger.UTAReassign",id:"utactiontriggerutareassign",level:3},{value:"Message UTActionTrigger.UTATask",id:"utactiontriggerutatask",level:3},{value:"Message VariableAssignment",id:"variableassignment",level:3},{value:"Message VariableAssignment.FormatString",id:"variableassignmentformatstring",level:3},{value:"Message VariableDef",id:"variabledef",level:3},{value:"Message VariableMutation",id:"variablemutation",level:3},{value:"Message VariableMutation.NodeOutputSource",id:"variablemutationnodeoutputsource",level:3},{value:"Message ExternalEvent",id:"externalevent",level:3},{value:"Message ExternalEventDef",id:"externaleventdef",level:3},{value:"Message ExternalEventRetentionPolicy",id:"externaleventretentionpolicy",level:3},{value:"Message EntrypointRun",id:"entrypointrun",level:3},{value:"Message ExitRun",id:"exitrun",level:3},{value:"Message ExternalEventNodeRun",id:"externaleventnoderun",level:3},{value:"Message Failure",id:"failure",level:3},{value:"Message NodeRun",id:"noderun",level:3},{value:"Message SleepNodeRun",id:"sleepnoderun",level:3},{value:"Message StartMultipleThreadsRun",id:"startmultiplethreadsrun",level:3},{value:"Message StartThreadRun",id:"startthreadrun",level:3},{value:"Message TaskNodeRun",id:"tasknoderun",level:3},{value:"Message ThrowEventNodeRun",id:"throweventnoderun",level:3},{value:"Message UserTaskNodeRun",id:"usertasknoderun",level:3},{value:"Message WaitForConditionRun",id:"waitforconditionrun",level:3},{value:"Message WaitForThreadsRun",id:"waitforthreadsrun",level:3},{value:"Message WaitForThreadsRun.WaitForThread",id:"waitforthreadsrunwaitforthread",level:3},{value:"Message ExternalEventDefId",id:"externaleventdefid",level:3},{value:"Message ExternalEventId",id:"externaleventid",level:3},{value:"Message NodeRunId",id:"noderunid",level:3},{value:"Message PrincipalId",id:"principalid",level:3},{value:"Message ScheduledWfRunId",id:"scheduledwfrunid",level:3},{value:"Message TaskDefId",id:"taskdefid",level:3},{value:"Message TaskDefMetricsId",id:"taskdefmetricsid",level:3},{value:"Message TaskRunId",id:"taskrunid",level:3},{value:"Message TaskWorkerGroupId",id:"taskworkergroupid",level:3},{value:"Message TenantId",id:"tenantid",level:3},{value:"Message UserTaskDefId",id:"usertaskdefid",level:3},{value:"Message UserTaskRunId",id:"usertaskrunid",level:3},{value:"Message VariableId",id:"variableid",level:3},{value:"Message WfRunId",id:"wfrunid",level:3},{value:"Message WfSpecId",id:"wfspecid",level:3},{value:"Message WfSpecMetricsId",id:"wfspecmetricsid",level:3},{value:"Message WorkflowEventDefId",id:"workfloweventdefid",level:3},{value:"Message WorkflowEventId",id:"workfloweventid",level:3},{value:"Message ScheduledWfRun",id:"scheduledwfrun",level:3},{value:"Message ScheduledWfRun.VariablesEntry",id:"scheduledwfrunvariablesentry",level:3},{value:"Message AwaitWorkflowEventRequest",id:"awaitworkfloweventrequest",level:3},{value:"Message DeleteExternalEventDefRequest",id:"deleteexternaleventdefrequest",level:3},{value:"Message DeleteExternalEventRequest",id:"deleteexternaleventrequest",level:3},{value:"Message DeleteScheduledWfRunRequest",id:"deletescheduledwfrunrequest",level:3},{value:"Message DeleteTaskDefRequest",id:"deletetaskdefrequest",level:3},{value:"Message DeleteUserTaskDefRequest",id:"deleteusertaskdefrequest",level:3},{value:"Message DeleteWfRunRequest",id:"deletewfrunrequest",level:3},{value:"Message DeleteWfSpecRequest",id:"deletewfspecrequest",level:3},{value:"Message DeleteWorkflowEventDefRequest",id:"deleteworkfloweventdefrequest",level:3},{value:"Message ExternalEventDefIdList",id:"externaleventdefidlist",level:3},{value:"Message ExternalEventIdList",id:"externaleventidlist",level:3},{value:"Message ExternalEventList",id:"externaleventlist",level:3},{value:"Message GetLatestUserTaskDefRequest",id:"getlatestusertaskdefrequest",level:3},{value:"Message GetLatestWfSpecRequest",id:"getlatestwfspecrequest",level:3},{value:"Message LHHostInfo",id:"lhhostinfo",level:3},{value:"Message ListExternalEventsRequest",id:"listexternaleventsrequest",level:3},{value:"Message ListNodeRunsRequest",id:"listnoderunsrequest",level:3},{value:"Message ListTaskMetricsRequest",id:"listtaskmetricsrequest",level:3},{value:"Message ListTaskMetricsResponse",id:"listtaskmetricsresponse",level:3},{value:"Message ListTaskRunsRequest",id:"listtaskrunsrequest",level:3},{value:"Message ListUserTaskRunRequest",id:"listusertaskrunrequest",level:3},{value:"Message ListVariablesRequest",id:"listvariablesrequest",level:3},{value:"Message ListWfMetricsRequest",id:"listwfmetricsrequest",level:3},{value:"Message ListWfMetricsResponse",id:"listwfmetricsresponse",level:3},{value:"Message ListWorkflowEventsRequest",id:"listworkfloweventsrequest",level:3},{value:"Message MigrateWfSpecRequest",id:"migratewfspecrequest",level:3},{value:"Message NodeRunIdList",id:"noderunidlist",level:3},{value:"Message NodeRunList",id:"noderunlist",level:3},{value:"Message PollTaskRequest",id:"polltaskrequest",level:3},{value:"Message PollTaskResponse",id:"polltaskresponse",level:3},{value:"Message PrincipalIdList",id:"principalidlist",level:3},{value:"Message PutExternalEventDefRequest",id:"putexternaleventdefrequest",level:3},{value:"Message PutExternalEventRequest",id:"putexternaleventrequest",level:3},{value:"Message PutTaskDefRequest",id:"puttaskdefrequest",level:3},{value:"Message PutUserTaskDefRequest",id:"putusertaskdefrequest",level:3},{value:"Message PutWfSpecRequest",id:"putwfspecrequest",level:3},{value:"Message PutWfSpecRequest.ThreadSpecsEntry",id:"putwfspecrequestthreadspecsentry",level:3},{value:"Message PutWorkflowEventDefRequest",id:"putworkfloweventdefrequest",level:3},{value:"Message RegisterTaskWorkerRequest",id:"registertaskworkerrequest",level:3},{value:"Message RegisterTaskWorkerResponse",id:"registertaskworkerresponse",level:3},{value:"Message ReportTaskRun",id:"reporttaskrun",level:3},{value:"Message RescueThreadRunRequest",id:"rescuethreadrunrequest",level:3},{value:"Message ResumeWfRunRequest",id:"resumewfrunrequest",level:3},{value:"Message RunWfRequest",id:"runwfrequest",level:3},{value:"Message RunWfRequest.VariablesEntry",id:"runwfrequestvariablesentry",level:3},{value:"Message ScheduleWfRequest",id:"schedulewfrequest",level:3},{value:"Message ScheduleWfRequest.VariablesEntry",id:"schedulewfrequestvariablesentry",level:3},{value:"Message ScheduledTask",id:"scheduledtask",level:3},{value:"Message ScheduledWfRunIdList",id:"scheduledwfrunidlist",level:3},{value:"Message SearchExternalEventDefRequest",id:"searchexternaleventdefrequest",level:3},{value:"Message SearchExternalEventRequest",id:"searchexternaleventrequest",level:3},{value:"Message SearchNodeRunRequest",id:"searchnoderunrequest",level:3},{value:"Message SearchPrincipalRequest",id:"searchprincipalrequest",level:3},{value:"Message SearchScheduledWfRunRequest",id:"searchscheduledwfrunrequest",level:3},{value:"Message SearchTaskDefRequest",id:"searchtaskdefrequest",level:3},{value:"Message SearchTaskRunRequest",id:"searchtaskrunrequest",level:3},{value:"Message SearchTenantRequest",id:"searchtenantrequest",level:3},{value:"Message SearchUserTaskDefRequest",id:"searchusertaskdefrequest",level:3},{value:"Message SearchUserTaskRunRequest",id:"searchusertaskrunrequest",level:3},{value:"Message SearchVariableRequest",id:"searchvariablerequest",level:3},{value:"Message SearchWfRunRequest",id:"searchwfrunrequest",level:3},{value:"Message SearchWfSpecRequest",id:"searchwfspecrequest",level:3},{value:"Message SearchWorkflowEventDefRequest",id:"searchworkfloweventdefrequest",level:3},{value:"Message SearchWorkflowEventRequest",id:"searchworkfloweventrequest",level:3},{value:"Message ServerVersionResponse",id:"serverversionresponse",level:3},{value:"Message StopWfRunRequest",id:"stopwfrunrequest",level:3},{value:"Message TaskDefIdList",id:"taskdefidlist",level:3},{value:"Message TaskDefMetrics",id:"taskdefmetrics",level:3},{value:"Message TaskDefMetricsQueryRequest",id:"taskdefmetricsqueryrequest",level:3},{value:"Message TaskRunIdList",id:"taskrunidlist",level:3},{value:"Message TaskRunList",id:"taskrunlist",level:3},{value:"Message TaskWorkerGroup",id:"taskworkergroup",level:3},{value:"Message TaskWorkerGroup.TaskWorkersEntry",id:"taskworkergrouptaskworkersentry",level:3},{value:"Message TaskWorkerHeartBeatRequest",id:"taskworkerheartbeatrequest",level:3},{value:"Message TaskWorkerMetadata",id:"taskworkermetadata",level:3},{value:"Message TenantIdList",id:"tenantidlist",level:3},{value:"Message UserTaskDefIdList",id:"usertaskdefidlist",level:3},{value:"Message UserTaskRunIdList",id:"usertaskrunidlist",level:3},{value:"Message UserTaskRunList",id:"usertaskrunlist",level:3},{value:"Message VariableIdList",id:"variableidlist",level:3},{value:"Message VariableList",id:"variablelist",level:3},{value:"Message VariableMatch",id:"variablematch",level:3},{value:"Message WfRunIdList",id:"wfrunidlist",level:3},{value:"Message WfSpecIdList",id:"wfspecidlist",level:3},{value:"Message WfSpecMetrics",id:"wfspecmetrics",level:3},{value:"Message WfSpecMetricsQueryRequest",id:"wfspecmetricsqueryrequest",level:3},{value:"Message WorkflowEventDefIdList",id:"workfloweventdefidlist",level:3},{value:"Message WorkflowEventIdList",id:"workfloweventidlist",level:3},{value:"Message WorkflowEventList",id:"workfloweventlist",level:3},{value:"Message TaskDef",id:"taskdef",level:3},{value:"Message TaskDefOutputSchema",id:"taskdefoutputschema",level:3},{value:"Message LHTaskError",id:"lhtaskerror",level:3},{value:"Message LHTaskException",id:"lhtaskexception",level:3},{value:"Message TaskAttempt",id:"taskattempt",level:3},{value:"Message TaskNodeReference",id:"tasknodereference",level:3},{value:"Message TaskRun",id:"taskrun",level:3},{value:"Message TaskRunSource",id:"taskrunsource",level:3},{value:"Message VarNameAndVal",id:"varnameandval",level:3},{value:"Message AssignUserTaskRunRequest",id:"assignusertaskrunrequest",level:3},{value:"Message CancelUserTaskRunRequest",id:"cancelusertaskrunrequest",level:3},{value:"Message CompleteUserTaskRunRequest",id:"completeusertaskrunrequest",level:3},{value:"Message CompleteUserTaskRunRequest.ResultsEntry",id:"completeusertaskrunrequestresultsentry",level:3},{value:"Message SaveUserTaskRunProgressRequest",id:"saveusertaskrunprogressrequest",level:3},{value:"Message SaveUserTaskRunProgressRequest.ResultsEntry",id:"saveusertaskrunprogressrequestresultsentry",level:3},{value:"Message UserTaskDef",id:"usertaskdef",level:3},{value:"Message UserTaskEvent",id:"usertaskevent",level:3},{value:"Message UserTaskEvent.UTEAssigned",id:"usertaskeventuteassigned",level:3},{value:"Message UserTaskEvent.UTECancelled",id:"usertaskeventutecancelled",level:3},{value:"Message UserTaskEvent.UTESaved",id:"usertaskeventutesaved",level:3},{value:"Message UserTaskEvent.UTESaved.ResultsEntry",id:"usertaskeventutesavedresultsentry",level:3},{value:"Message UserTaskEvent.UTETaskExecuted",id:"usertaskeventutetaskexecuted",level:3},{value:"Message UserTaskField",id:"usertaskfield",level:3},{value:"Message UserTaskRun",id:"usertaskrun",level:3},{value:"Message UserTaskRun.ResultsEntry",id:"usertaskrunresultsentry",level:3},{value:"Message UserTaskTriggerReference",id:"usertasktriggerreference",level:3},{value:"Message Variable",id:"variable",level:3},{value:"Message VariableValue",id:"variablevalue",level:3},{value:"Message FailureBeingHandled",id:"failurebeinghandled",level:3},{value:"Message HandlingFailureHaltReason",id:"handlingfailurehaltreason",level:3},{value:"Message Interrupted",id:"interrupted",level:3},{value:"Message ManualHalt",id:"manualhalt",level:3},{value:"Message ParentHalted",id:"parenthalted",level:3},{value:"Message PendingFailureHandler",id:"pendingfailurehandler",level:3},{value:"Message PendingFailureHandlerHaltReason",id:"pendingfailurehandlerhaltreason",level:3},{value:"Message PendingInterrupt",id:"pendinginterrupt",level:3},{value:"Message PendingInterruptHaltReason",id:"pendinginterrupthaltreason",level:3},{value:"Message ThreadHaltReason",id:"threadhaltreason",level:3},{value:"Message ThreadRun",id:"threadrun",level:3},{value:"Message WfRun",id:"wfrun",level:3},{value:"Message Edge",id:"edge",level:3},{value:"Message EdgeCondition",id:"edgecondition",level:3},{value:"Message EntrypointNode",id:"entrypointnode",level:3},{value:"Message ExitNode",id:"exitnode",level:3},{value:"Message ExternalEventNode",id:"externaleventnode",level:3},{value:"Message FailureDef",id:"failuredef",level:3},{value:"Message FailureHandlerDef",id:"failurehandlerdef",level:3},{value:"Message InterruptDef",id:"interruptdef",level:3},{value:"Message JsonIndex",id:"jsonindex",level:3},{value:"Message Node",id:"node",level:3},{value:"Message NodeMigration",id:"nodemigration",level:3},{value:"Message NopNode",id:"nopnode",level:3},{value:"Message SleepNode",id:"sleepnode",level:3},{value:"Message StartMultipleThreadsNode",id:"startmultiplethreadsnode",level:3},{value:"Message StartMultipleThreadsNode.VariablesEntry",id:"startmultiplethreadsnodevariablesentry",level:3},{value:"Message StartThreadNode",id:"startthreadnode",level:3},{value:"Message StartThreadNode.VariablesEntry",id:"startthreadnodevariablesentry",level:3},{value:"Message ThreadRetentionPolicy",id:"threadretentionpolicy",level:3},{value:"Message ThreadSpec",id:"threadspec",level:3},{value:"Message ThreadSpec.NodesEntry",id:"threadspecnodesentry",level:3},{value:"Message ThreadSpecMigration",id:"threadspecmigration",level:3},{value:"Message ThreadSpecMigration.NodeMigrationsEntry",id:"threadspecmigrationnodemigrationsentry",level:3},{value:"Message ThreadVarDef",id:"threadvardef",level:3},{value:"Message ThrowEventNode",id:"throweventnode",level:3},{value:"Message UserTaskNode",id:"usertasknode",level:3},{value:"Message WaitForConditionNode",id:"waitforconditionnode",level:3},{value:"Message WaitForThreadsNode",id:"waitforthreadsnode",level:3},{value:"Message WaitForThreadsNode.ThreadToWaitFor",id:"waitforthreadsnodethreadtowaitfor",level:3},{value:"Message WaitForThreadsNode.ThreadsToWaitFor",id:"waitforthreadsnodethreadstowaitfor",level:3},{value:"Message WfSpec",id:"wfspec",level:3},{value:"Message WfSpec.ParentWfSpecReference",id:"wfspecparentwfspecreference",level:3},{value:"Message WfSpec.ThreadSpecsEntry",id:"wfspecthreadspecsentry",level:3},{value:"Message WfSpecVersionMigration",id:"wfspecversionmigration",level:3},{value:"Message WfSpecVersionMigration.ThreadSpecMigrationsEntry",id:"wfspecversionmigrationthreadspecmigrationsentry",level:3},{value:"Message WorkflowRetentionPolicy",id:"workflowretentionpolicy",level:3},{value:"Message WorkflowEvent",id:"workflowevent",level:3},{value:"Message WorkflowEventDef",id:"workfloweventdef",level:3},{value:"LittleHorse Enums",id:"littlehorse-enums",level:2},{value:"Enum ACLAction",id:"aclaction",level:3},{value:"Enum ACLResource",id:"aclresource",level:3},{value:"Enum LHErrorType",id:"lherrortype",level:3},{value:"Enum LHStatus",id:"lhstatus",level:3},{value:"Enum MetadataStatus",id:"metadatastatus",level:3},{value:"Enum MetricsWindowLength",id:"metricswindowlength",level:3},{value:"Enum TaskStatus",id:"taskstatus",level:3},{value:"Enum VariableType",id:"variabletype",level:3},{value:"Enum Comparator",id:"comparator",level:3},{value:"Enum UTActionTrigger.UTHook",id:"utactiontriggeruthook",level:3},{value:"Enum VariableMutationType",id:"variablemutationtype",level:3},{value:"Enum WaitForThreadsRun.WaitingThreadStatus",id:"waitforthreadsrunwaitingthreadstatus",level:3},{value:"Enum AllowedUpdateType",id:"allowedupdatetype",level:3},{value:"Enum SearchNodeRunRequest.NodeType",id:"searchnoderunrequestnodetype",level:3},{value:"Enum SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy",id:"saveusertaskrunprogressrequestsaveusertaskrunassignmentpolicy",level:3},{value:"Enum UserTaskRunStatus",id:"usertaskrunstatus",level:3},{value:"Enum ThreadType",id:"threadtype",level:3},{value:"Enum FailureHandlerDef.LHFailureType",id:"failurehandlerdeflhfailuretype",level:3},{value:"Enum WfRunVariableAccessLevel",id:"wfrunvariableaccesslevel",level:3}];function a(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"littlehorse-api-reference",children:"LittleHorse API Reference"})}),"\n",(0,r.jsxs)(s.p,{children:["The LittleHorse Server exposes a GRPC API to its clients. For most general usage of LittleHorse, you ",(0,r.jsx)(s.em,{children:"will not"})," need to\nread the raw protobuf schema. Common LittleHorse client actions fall into three general categories:"]}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Developing a Task Worker, which is handled by our ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/task-worker-development",children:"Task Worker SDK's"}),"."]}),"\n",(0,r.jsxs)(s.li,{children:["Developing a WfSpec, which is handled by our ",(0,r.jsxs)(s.a,{href:"/docs/developer-guide/wfspec-development",children:[(0,r.jsx)(s.code,{children:"WfSpec"})," SDK's"]}),"."]}),"\n",(0,r.jsxs)(s.li,{children:["Running and interacting with ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s, which is documented in our ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/grpc",children:'"Using the API"'})," docs."]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["However, the highly curious reader might want to see the actual GRPC and Protobuf specification. The docs on this page\nare autogenerated from our actual ",(0,r.jsx)(s.a,{href:"https://github.com/littlehorse-enterprises/littlehorse/tree/master/schemas",children:"protobuf files"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"The documentation of what the specific protobuf fields mean is potentially useful for advanced Jedi Master use-cases."}),"\n",(0,r.jsx)(s.p,{children:"Happy Reading!"}),"\n",(0,r.jsx)(s.h2,{id:"littlehorse-grpc-api",children:"LittleHorse GRPC API"}),"\n",(0,r.jsxs)(s.p,{children:["The LittleHorse GRPC API is the backbone of the clients that you get in all of our SDK's. Every ",(0,r.jsx)(s.code,{children:"LHConfig"})," object\ngives you a GRPC stub to access the API. Most common operations are already documented with code examples in different\nlanguages ",(0,r.jsx)(s.a,{href:"/docs/developer-guide/grpc",children:"here"}),", but we put this here for the true Jedi Masters."]}),"\n",(0,r.jsxs)(s.h3,{id:"puttaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#puttaskdefrequest",children:"PutTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdef",children:"TaskDef"})}),(0,r.jsx)(s.td,{children:"Creates a TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdef",children:"TaskDef"})}),(0,r.jsx)(s.td,{children:"Gets a TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskworkergroup",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskWorkerGroup"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkergroup",children:"TaskWorkerGroup"})}),(0,r.jsx)(s.td,{children:"Gets the registered task worker group associated with a specific TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putexternaleventdefrequest",children:"PutExternalEventDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdef",children:"ExternalEventDef"})}),(0,r.jsx)(s.td,{children:"Creates an ExternalEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdef",children:"ExternalEventDef"})}),(0,r.jsx)(s.td,{children:"Gets an ExternalEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putworkfloweventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutWorkflowEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putworkfloweventdefrequest",children:"PutWorkflowEventDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdef",children:"WorkflowEventDef"})}),(0,r.jsx)(s.td,{children:"Creates a WorkflowEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"PutWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putwfspecrequest",children:"PutWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsx)(s.td,{children:"Creates a WfSpec."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsx)(s.td,{children:"Gets a WfSpec."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"GetLatestWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#getlatestwfspecrequest",children:"GetLatestWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsx)(s.td,{children:"Returns the latest WfSpec with a specified name (and optionally a specified Major Version)."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"migratewfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"MigrateWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#migratewfspecrequest",children:"MigrateWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspec",children:"WfSpec"})}),(0,r.jsxs)(s.td,{children:["EXPERIMENTAL: Migrates all WfRun's from one version of a WfSpec onto a newer version of the same WfSpec. This is useful for long-running WfRun's (eg. a 60-day marketing campaign) where you must update WfRun's that are in the RUNNING state rather than allowing them to run to completion.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"As of 0.7.2, this feature is only partially implemented."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"PutUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putusertaskdefrequest",children:"PutUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdef",children:"UserTaskDef"})}),(0,r.jsx)(s.td,{children:"Creates a UserTaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdef",children:"UserTaskDef"})}),(0,r.jsxs)(s.td,{children:["Gets a specific UserTaskDef.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"This RPC is highly useful for applications built around User Tasks. For example, a UI that dynamically displays form fields based on the User Task might first receive a UserTaskRun, then use that UserTaskRun to look up the UserTaskDef. The frontend would inspect the UserTaskDef and display a form field on the browser page for each field in the UserTaskDef."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetLatestUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#getlatestusertaskdefrequest",children:"GetLatestUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdef",children:"UserTaskDef"})}),(0,r.jsx)(s.td,{children:"Returns the most recent UserTaskDef with a specific name."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"runwf",children:["RPC ",(0,r.jsx)(s.code,{children:"RunWf"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#runwfrequest",children:"RunWfRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrun",children:"WfRun"})}),(0,r.jsx)(s.td,{children:"Runs a WfSpec to create a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"schedulewf",children:["RPC ",(0,r.jsx)(s.code,{children:"ScheduleWf"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#schedulewfrequest",children:"ScheduleWfRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrun",children:"ScheduledWfRun"})}),(0,r.jsx)(s.td,{children:"Schedule repeated WfRun based on a cron expression"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchscheduledwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchscheduledwfrunrequest",children:"SearchScheduledWfRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunidlist",children:"ScheduledWfRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for existing schedules"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getscheduledwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrun",children:"ScheduledWfRun"})}),(0,r.jsx)(s.td,{children:"Find a specific ScheduledWfRun"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrun",children:"WfRun"})}),(0,r.jsx)(s.td,{children:"Gets a WfRun. Although useful for development and debugging, this RPC is not often used by applications."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrun",children:"UserTaskRun"})}),(0,r.jsx)(s.td,{children:"Loads a specific UserTaskRun. It includes information about to whom the UserTask is currently assigned, history of assignments and reassignments, and any context for that UserTaskRun which is specific to the WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"assignusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"AssignUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#assignusertaskrunrequest",children:"AssignUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Change the ownership of a UserTaskRun to a new userId, userGroup, or both. The action will be reflected in your next call to SearchUserTaskRun. This RPC is useful for applications that are using User Tasks to build an internal task-list and wish to administer the tasks."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"completeusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"CompleteUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#completeusertaskrunrequest",children:"CompleteUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsxs)(s.td,{children:["Completes a UserTaskRun. Includes the results of the UserTaskRun, the UserTaskRun Id, and the userId of the user who completes the UserTaskRun. Results in the UserTask NodeRun being completed, and unblocks the associated ThreadRun in the WfRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"This RPC is highly useful for applications built around a WfSpec that uses USER_TASK nodes."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"cancelusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"CancelUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#cancelusertaskrunrequest",children:"CancelUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Cancels a UserTaskRun. This will result in an EXCEPTION being propagated to the WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"saveusertaskrunprogress",children:["RPC ",(0,r.jsx)(s.code,{children:"SaveUserTaskRunProgress"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#saveusertaskrunprogressrequest",children:"SaveUserTaskRunProgressRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrun",children:"UserTaskRun"})}),(0,r.jsxs)(s.td,{children:["Saves the results of a UserTaskRun and logs who saved the content.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),(0,r.jsxs)("li",{children:[" Throws FAILED_PRECONDITION if the UserTaskRun is in the ",(0,r.jsx)(s.code,{children:"DONE"})," or ",(0,r.jsx)(s.code,{children:"CANCELLED"})," state."]})," ",(0,r.jsxs)("li",{children:[" If ",(0,r.jsx)(s.code,{children:"policy"})," is set to ",(0,r.jsx)(s.code,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),", returns ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the ",(0,r.jsx)(s.code,{children:"user_id"})," field of the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," does not match the ",(0,r.jsx)(s.code,{children:"user_id"})," of the request."]})]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listusertaskruns",children:["RPC ",(0,r.jsx)(s.code,{children:"ListUserTaskRuns"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listusertaskrunrequest",children:"ListUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunlist",children:"UserTaskRunList"})}),(0,r.jsx)(s.td,{children:"Lists all UserTaskRun's for a specific WfRun. Can be useful when using a WfRun to model an entity."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getnoderun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetNodeRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderun",children:"NodeRun"})}),(0,r.jsx)(s.td,{children:"Gets a specific NodeRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listnoderuns",children:["RPC ",(0,r.jsx)(s.code,{children:"ListNodeRuns"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listnoderunsrequest",children:"ListNodeRunsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunlist",children:"NodeRunList"})}),(0,r.jsx)(s.td,{children:"Lists all NodeRun's for a specific WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrun",children:"TaskRun"})}),(0,r.jsx)(s.td,{children:"Gets a specific TaskRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskruns",children:["RPC ",(0,r.jsx)(s.code,{children:"ListTaskRuns"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listtaskrunsrequest",children:"ListTaskRunsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunlist",children:"TaskRunList"})}),(0,r.jsx)(s.td,{children:"Lists all TaskRun's for a specific WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getvariable",children:["RPC ",(0,r.jsx)(s.code,{children:"GetVariable"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableid",children:"VariableId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variable",children:"Variable"})}),(0,r.jsx)(s.td,{children:"Get the value of a specific Variable. When using a WfRun to model an entity, this RPC is useful for retrieving information. It is equivalent to looking up the value of a column for a specific row in a SQL table."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listvariables",children:["RPC ",(0,r.jsx)(s.code,{children:"ListVariables"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listvariablesrequest",children:"ListVariablesRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablelist",children:"VariableList"})}),(0,r.jsx)(s.td,{children:"List all Variables from a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternalevent",children:["RPC ",(0,r.jsx)(s.code,{children:"PutExternalEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putexternaleventrequest",children:"PutExternalEventRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externalevent",children:"ExternalEvent"})}),(0,r.jsx)(s.td,{children:"Post an ExternalEvent. This RPC is highly useful for"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getexternalevent",children:["RPC ",(0,r.jsx)(s.code,{children:"GetExternalEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externalevent",children:"ExternalEvent"})}),(0,r.jsx)(s.td,{children:"Get a specific ExternalEvent."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"awaitworkflowevent",children:["RPC ",(0,r.jsx)(s.code,{children:"AwaitWorkflowEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#awaitworkfloweventrequest",children:"AwaitWorkflowEventRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowevent",children:"WorkflowEvent"})}),(0,r.jsxs)(s.td,{children:["Waits for a WorkflowEvent to be thrown by a given WfRun. Returns immediately if a matching WorkflowEvent has already been thrown; throws a DEADLINE_EXCEEDED error if the WorkflowEvent is not thrown before the deadline specified by the client.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"To specify the deadline, the client should use GRPC deadlines."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getworkfloweventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWorkflowEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdef",children:"WorkflowEventDef"})}),(0,r.jsx)(s.td,{children:"Get a specific WorkflowEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getworkflowevent",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWorkflowEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowevent",children:"WorkflowEvent"})}),(0,r.jsx)(s.td,{children:"Get a specific WorkflowEvent."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listexternalevents",children:["RPC ",(0,r.jsx)(s.code,{children:"ListExternalEvents"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listexternaleventsrequest",children:"ListExternalEventsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventlist",children:"ExternalEventList"})}),(0,r.jsx)(s.td,{children:"List ExternalEvent's for a specific WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listworkflowevents",children:["RPC ",(0,r.jsx)(s.code,{children:"ListWorkflowEvents"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listworkfloweventsrequest",children:"ListWorkflowEventsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventlist",children:"WorkflowEventList"})}),(0,r.jsx)(s.td,{children:"List WorkflowEvent's for a specific WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchwfrunrequest",children:"SearchWfRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunidlist",children:"WfRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for WfRun's. This RPC is highly useful for applications that store data in LittleHorse and need to find a specific WfRun based on certain indexed fields."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchnoderun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchNodeRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchnoderunrequest",children:"SearchNodeRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunidlist",children:"NodeRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for NodeRun's. This RPC is useful for monitoring and finding bugs in your workflows or Task Workers."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchtaskrunrequest",children:"SearchTaskRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunidlist",children:"TaskRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for TaskRun's. This RPC is useful for finding bugs in your Task Workers."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskrun",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchUserTaskRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchusertaskrunrequest",children:"SearchUserTaskRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunidlist",children:"UserTaskRunIdList"})}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's. This RPC is highly useful for applications that connect human end-users to LittleHorse: it enables you to find all tasks assigned to a specific person or group of people."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchvariable",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchVariable"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchvariablerequest",children:"SearchVariableRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableidlist",children:"VariableIdList"})}),(0,r.jsx)(s.td,{children:"Search for Variable's. This RPC is highly useful for applications that store data in LittleHorse and need to find a specific WfRun based on certain indexed fields."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternalevent",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchExternalEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchexternaleventrequest",children:"SearchExternalEventRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventidlist",children:"ExternalEventIdList"})}),(0,r.jsx)(s.td,{children:"Search for ExternalEvent's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchworkflowevent",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchWorkflowEvent"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchworkfloweventrequest",children:"SearchWorkflowEventRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventidlist",children:"WorkflowEventIdList"})}),(0,r.jsx)(s.td,{children:"Search for WorkflowEvents's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchtaskdefrequest",children:"SearchTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefidlist",children:"TaskDefIdList"})}),(0,r.jsx)(s.td,{children:"Search for TaskDef's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchusertaskdefrequest",children:"SearchUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefidlist",children:"UserTaskDefIdList"})}),(0,r.jsx)(s.td,{children:"Search for UserTaskDef's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchwfspecrequest",children:"SearchWfSpecRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecidlist",children:"WfSpecIdList"})}),(0,r.jsx)(s.td,{children:"Search for WfSpec's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchexternaleventdefrequest",children:"SearchExternalEventDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefidlist",children:"ExternalEventDefIdList"})}),(0,r.jsx)(s.td,{children:"Search for ExternalEventDef's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchworkfloweventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchWorkflowEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchworkfloweventdefrequest",children:"SearchWorkflowEventDefRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefidlist",children:"WorkflowEventDefIdList"})}),(0,r.jsx)(s.td,{children:"Search for WorkflowEventDef's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtenant",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchTenant"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchtenantrequest",children:"SearchTenantRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantidlist",children:"TenantIdList"})}),(0,r.jsx)(s.td,{children:"Search for all available TenantIds for current Principal"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchprincipal",children:["RPC ",(0,r.jsx)(s.code,{children:"SearchPrincipal"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchprincipalrequest",children:"SearchPrincipalRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalidlist",children:"PrincipalIdList"})}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"registertaskworker",children:["RPC ",(0,r.jsx)(s.code,{children:"RegisterTaskWorker"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#registertaskworkerrequest",children:"RegisterTaskWorkerRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#registertaskworkerresponse",children:"RegisterTaskWorkerResponse"})}),(0,r.jsx)(s.td,{children:"Used by the Task Worker to: 1. Tell the LH Server that the Task Worker has joined the Task Worker Group. 2. Receive the assignemnt of LH Server's to poll from. Generally, you won't use this request manually."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"polltask",children:["RPC ",(0,r.jsx)(s.code,{children:"PollTask"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#polltaskrequest",children:"PollTaskRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#polltaskresponse",children:"PollTaskResponse"})}),(0,r.jsx)(s.td,{children:"Used by Task Workers to listen for TaskRuns on the Task Queue. Generally, you won't use this RPC manually."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"reporttask",children:["RPC ",(0,r.jsx)(s.code,{children:"ReportTask"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#reporttaskrun",children:"ReportTaskRun"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Used by Task Workers to report the result of a TaskRun. Generally, you won't use this rpc manually."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"stopwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"StopWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#stopwfrunrequest",children:"StopWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Move a WfRun or a specific ThreadRun in that WfRun to the HALTED state."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"resumewfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"ResumeWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#resumewfrunrequest",children:"ResumeWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Resumes a WfRun or a specific ThreadRun of a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"rescuethreadrun",children:["RPC ",(0,r.jsx)(s.code,{children:"RescueThreadRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#rescuethreadrunrequest",children:"RescueThreadRunRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrun",children:"WfRun"})}),(0,r.jsxs)(s.td,{children:["Rescues a failed ThreadRun (in the ERROR state only) by restarting it from the point of failure. Useful if a bug in Task Worker implementation caused a WfRun to fail and you did not have a FailureHandler for that NodeRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"The specified ",(0,r.jsx)(s.code,{children:"ThreadRun"})," must be in a state where it's latest ",(0,r.jsx)(s.code,{children:"NodeRun"})," is: ",(0,r.jsx)("br",{})," - In the ",(0,r.jsx)(s.code,{children:"ERROR"})," state.",(0,r.jsx)("br",{})," - Has no ",(0,r.jsx)(s.code,{children:"FailureHandler"})," ",(0,r.jsx)(s.code,{children:"ThreadRun"}),"s ",(0,r.jsx)("br",{})," - The parent ",(0,r.jsx)(s.code,{children:"ThreadRun"}),", or any parent of the parent, has not handled the ",(0,r.jsx)(s.code,{children:"Failure"})," yet.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If that is not true, then the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," cannot be rescued and the request will return ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"}),"."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletewfrunrequest",children:"DeleteWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a WfRun. The WfRun cannot be in the RUNNING state."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletetaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletetaskdefrequest",children:"DeleteTaskDefRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a TaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfspec",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteWfSpec"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletewfspecrequest",children:"DeleteWfSpecRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a WfSpec."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteusertaskdef",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteUserTaskDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deleteusertaskdefrequest",children:"DeleteUserTaskDefRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a UserTaskDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteexternaleventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteExternalEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deleteexternaleventdefrequest",children:"DeleteExternalEventDefRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes an ExternalEventDef."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteworkfloweventdef",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteWorkflowEventDef"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deleteworkfloweventdefrequest",children:"DeleteWorkflowEventDefRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteprincipal",children:["RPC ",(0,r.jsx)(s.code,{children:"DeletePrincipal"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deleteprincipalrequest",children:"DeletePrincipalRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsxs)(s.td,{children:["Deletes a ",(0,r.jsx)(s.code,{children:"Principal"}),". Fails with ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the specified ",(0,r.jsx)(s.code,{children:"Principal"})," is the last remaining ",(0,r.jsx)(s.code,{children:"Principal"})," with admin permissions. Admin permissions are defined as having the ",(0,r.jsx)(s.code,{children:"global_acls"})," of ",(0,r.jsx)(s.code,{children:"ALL_ACTIONS"})," over the ",(0,r.jsx)(s.code,{children:"ACL_ALL_RESOURCES"})," scope."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletescheduledwfrun",children:["RPC ",(0,r.jsx)(s.code,{children:"DeleteScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#deletescheduledwfrunrequest",children:"DeleteScheduledWfRunRequest"})}),(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:"Deletes a scheduled run and prevents any further associated WfRun from being executed."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettaskdefmetricswindow",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTaskDefMetricsWindow"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefmetricsqueryrequest",children:"TaskDefMetricsQueryRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefmetrics",children:"TaskDefMetrics"})}),(0,r.jsx)(s.td,{children:"Returns TaskDef Metrics for a specific TaskDef and a specific time window."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getwfspecmetricswindow",children:["RPC ",(0,r.jsx)(s.code,{children:"GetWfSpecMetricsWindow"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecmetricsqueryrequest",children:"WfSpecMetricsQueryRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecmetrics",children:"WfSpecMetrics"})}),(0,r.jsx)(s.td,{children:"Returns WfSpec Metrics for a specific WfSpec and a specific time window."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskdefmetrics",children:["RPC ",(0,r.jsx)(s.code,{children:"ListTaskDefMetrics"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listtaskmetricsrequest",children:"ListTaskMetricsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listtaskmetricsresponse",children:"ListTaskMetricsResponse"})}),(0,r.jsx)(s.td,{children:"Returns a list of TaskDef Metrics Windows."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listwfspecmetrics",children:["RPC ",(0,r.jsx)(s.code,{children:"ListWfSpecMetrics"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listwfmetricsrequest",children:"ListWfMetricsRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#listwfmetricsresponse",children:"ListWfMetricsResponse"})}),(0,r.jsx)(s.td,{children:"Returns a list of WfSpec Metrics Windows."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"puttenant",children:["RPC ",(0,r.jsx)(s.code,{children:"PutTenant"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#puttenantrequest",children:"PutTenantRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenant",children:"Tenant"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Creates another Tenant in the LH Server."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"gettenant",children:["RPC ",(0,r.jsx)(s.code,{children:"GetTenant"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantid",children:"TenantId"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenant",children:"Tenant"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Gets a Tenant from the LH Server."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"putprincipal",children:["RPC ",(0,r.jsx)(s.code,{children:"PutPrincipal"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putprincipalrequest",children:"PutPrincipalRequest"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principal",children:"Principal"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Creates an Principal."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"whoami",children:["RPC ",(0,r.jsx)(s.code,{children:"Whoami"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principal",children:"Principal"})}),(0,r.jsx)(s.td,{children:"Returns the Principal of the caller."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getserverversion",children:["RPC ",(0,r.jsx)(s.code,{children:"GetServerVersion"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Request Type"}),(0,r.jsx)(s.th,{children:"Response Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:".google.protobuf.Empty"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serverversionresponse",children:"ServerVersionResponse"})}),(0,r.jsx)(s.td,{children:"Gets the version of the LH Server."})]})})]}),"\n",(0,r.jsx)(s.h2,{id:"littlehorse-protobuf-schemas",children:"LittleHorse Protobuf Schemas"}),"\n",(0,r.jsx)(s.p,{children:"This section contains the exact schemas for every object in our public API."}),"\n",(0,r.jsxs)(s.h3,{id:"deleteprincipalrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeletePrincipalRequest"})]}),"\n",(0,r.jsxs)(s.p,{children:["Deletes a ",(0,r.jsx)(s.code,{children:"Principal"}),". Fails with ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the specified ",(0,r.jsx)(s.code,{children:"Principal"})," is the last\nadmin ",(0,r.jsx)(s.code,{children:"Principal"}),"."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalid",children:"PrincipalId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ",(0,r.jsx)(s.code,{children:"Principal"})," to delete."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"principal",children:["Message ",(0,r.jsx)(s.code,{children:"Principal"})]}),"\n",(0,r.jsx)(s.p,{children:"A Principal represents the identity of a client of LittleHorse, whether human or\nmachine. The ACL's on the Principal control what actions the client is allowed\nto take."}),"\n",(0,r.jsx)(s.p,{children:"A Principal is not scoped to a Tenant; rather, a Principal is scoped to the Cluster\nand may have access to one or more Tenants."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalid",children:"PrincipalId"})}),(0,r.jsxs)(s.td,{children:["The ID of the Principal. In OAuth for human users, this is the user_id. In OAuth for machine clients, this is the Client ID.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"mTLS for Principal identification is not yet implemented."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which the Principal was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"per_tenant_acls"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalpertenantaclsentry",children:"Principal.PerTenantAclsEntry"})}),(0,r.jsxs)(s.td,{children:["Maps a Tenant ID to a list of ACL's that the Principal has permission to execute ",(0,r.jsx)(s.em,{children:"within that Tenant"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"global_acls"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsxs)(s.td,{children:["Sets permissions that this Principal has ",(0,r.jsx)(s.em,{children:"for any Tenant"})," in the LH Cluster."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"principalpertenantaclsentry",children:["Message ",(0,r.jsx)(s.code,{children:"Principal.PerTenantAclsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putprincipalrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutPrincipalRequest"})]}),"\n",(0,r.jsxs)(s.p,{children:["Creates or updates a Principal. If this request would remove admin privileges from the\nlast admin principal (i.e. ",(0,r.jsx)(s.code,{children:"ALL_ACTIONS"})," over ",(0,r.jsx)(s.code,{children:"ACL_ALL_RESOURCES"})," in the ",(0,r.jsx)(s.code,{children:"global_acls"}),"),\nthen the RPC throws ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"}),"."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID of the Principal that we are creating."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"per_tenant_acls"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putprincipalrequestpertenantaclsentry",children:"PutPrincipalRequest.PerTenantAclsEntry"})}),(0,r.jsx)(s.td,{children:"The per-tenant ACL's for the Principal"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"global_acls"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsx)(s.td,{children:"The ACL's for the principal in all tenants"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"overwrite"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsxs)(s.td,{children:["If this is set to false and a ",(0,r.jsx)(s.code,{children:"Principal"})," with the same ",(0,r.jsx)(s.code,{children:"id"})," already exists ",(0,r.jsx)(s.em,{children:"and"})," has different ACL's configured, then the RPC throws ",(0,r.jsx)(s.code,{children:"ALREADY_EXISTS"}),".",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If this is set to ",(0,r.jsx)(s.code,{children:"true"}),", then the RPC will override hte"]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putprincipalrequestpertenantaclsentry",children:["Message ",(0,r.jsx)(s.code,{children:"PutPrincipalRequest.PerTenantAclsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracls",children:"ServerACLs"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"puttenantrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutTenantRequest"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"serveracl",children:["Message ",(0,r.jsx)(s.code,{children:"ServerACL"})]}),"\n",(0,r.jsxs)(s.p,{children:["Represents a specific set of permissions over a specific set of objects\nin a Tenant. This is a ",(0,r.jsx)(s.em,{children:"positive"})," permission."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"resources"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#aclresource",children:"ACLResource"})}),(0,r.jsx)(s.td,{children:"The resource types over which permission is granted."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"allowed_actions"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#aclaction",children:"ACLAction"})}),(0,r.jsx)(s.td,{children:"The actions that are permitted."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"resource_filter"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["If set, then only the resources with this exact name are allowed. For example, the ",(0,r.jsx)(s.code,{children:"READ"})," and ",(0,r.jsx)(s.code,{children:"RUN"})," ",(0,r.jsx)(s.code,{children:"allowed_actions"})," over ",(0,r.jsx)(s.code,{children:"ACL_TASK"})," with ",(0,r.jsx)(s.code,{children:"name"})," == ",(0,r.jsx)(s.code,{children:"my-task"})," allows a Task Worker to only execute the ",(0,r.jsx)(s.code,{children:"my-task"})," TaskDef.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If ",(0,r.jsx)(s.code,{children:"name"})," and ",(0,r.jsx)(s.code,{children:"prefix"})," are unset, then the ACL applies to all resources of the specified types."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"resource_filter"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["If set, then only the resources whose names match this prefix are allowed.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If ",(0,r.jsx)(s.code,{children:"name"})," and ",(0,r.jsx)(s.code,{children:"prefix"})," are unset, then the ACL applies to all resources of the specified types."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"serveracls",children:["Message ",(0,r.jsx)(s.code,{children:"ServerACLs"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ACL's for LittleHorse"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"acls"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#serveracl",children:"ServerACL"})}),(0,r.jsx)(s.td,{children:"The associated ACL's"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"tenant",children:["Message ",(0,r.jsx)(s.code,{children:"Tenant"})]}),"\n",(0,r.jsx)(s.p,{children:"A Tenant is a logically isolated environment within LittleHorse. All workflows and\nassociated data (WfSpec, WfRun, TaskDef, TaskRun, NodeRun, etc) are scoped to within\na Tenant."}),"\n",(0,r.jsx)(s.p,{children:"Future versions will include quotas on a per-Tenant basis."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantid",children:"TenantId"})}),(0,r.jsx)(s.td,{children:"The ID of the Tenant."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which the Tenant was created."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"exponentialbackoffretrypolicy",children:["Message ",(0,r.jsx)(s.code,{children:"ExponentialBackoffRetryPolicy"})]}),"\n",(0,r.jsxs)(s.p,{children:["Defines an Exponential backoff policy for TaskRun retries. The delay for a retry\nattempt ",(0,r.jsx)(s.code,{children:"N"})," is defined as:"]}),"\n",(0,r.jsx)(s.p,{children:"min(base_interval_ms * (multiplier ^(N-1)), max_delay_ms)"}),"\n",(0,r.jsx)(s.p,{children:"Note that timers in LittleHorse have a resolution of about 500-1000 milliseconds,\nso timing is not exact."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"base_interval_ms"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Base delay in ms for the first retry. Note that in LittleHorse, timers have a resolution of 500-1000 milliseconds. Must be greater than zero."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"max_delay_ms"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Maximum delay in milliseconds between retries."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"multiplier"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"float"}),(0,r.jsx)(s.td,{children:"The multiplier to use in calculating the retry backoff policy. We recommend starting with 2.0. Must be at least 1.0."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tasknode",children:["Message ",(0,r.jsx)(s.code,{children:"TaskNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines a TaskRun execution. Used in a Node and also in the UserTask Trigger Actions."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_to_execute"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"dynamic_task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_to_execute"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timeout_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"How long until LittleHorse determines that the Task Worker had a technical ERROR if the worker does not yet reply to the Server. This is determined on a per-Attempt basis."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retries"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Configures the amount of retries allowed on this TaskNode.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Retryable errors include: - TASK_TIMEOUT: the TaskRun was started but the scheduler didn't hear back from the Task Worker in time. - TASK_FAILED: the Task Worker reported an unexpected ",(0,r.jsx)(s.em,{children:"technical"})," ERROR when executing the Task Function.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Other result codes are not retryable (including TASK_OUTPUT_SERIALIZING_ERROR, TASK_INPUT_VAR_SUB_ERROR, and TASK_EXCEPTION)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exponential_backoff"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exponentialbackoffretrypolicy",children:"ExponentialBackoffRetryPolicy"})}),(0,r.jsx)(s.td,{children:"If this field is set, then retries will use Exponential Backoff."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Input variables into the TaskDef."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontrigger",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger"})]}),"\n",(0,r.jsx)(s.p,{children:"A UTActionTrigger triggers an action upon certain lifecycle hooks\nin a User Task. Actions include:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"re-assign the User Task Run"}),"\n",(0,r.jsx)(s.li,{children:"cancel the User Task Run"}),"\n",(0,r.jsx)(s.li,{children:"execute a Reminder Task"}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Hooks include:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Upon creation of the UserTaskRun"}),"\n",(0,r.jsx)(s.li,{children:"Upon rescheduling the UserTaskRun"}),"\n"]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"action"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggerutatask",children:"UTActionTrigger.UTATask"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cancel"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"action"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggerutacancel",children:"UTActionTrigger.UTACancel"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"reassign"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"action"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggerutareassign",children:"UTActionTrigger.UTAReassign"})}),(0,r.jsx)(s.td,{children:"later on, might enable scheduling entire ThreadRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"delay_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"The Action is triggered some time after the Hook matures. The delay is controlled by this field."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"hook"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontriggeruthook",children:"UTActionTrigger.UTHook"})}),(0,r.jsx)(s.td,{children:"The hook on which this UserTaskAction is scheduled."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontriggerutacancel",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger.UTACancel"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskAction that causes a UserTaskRun to be CANCELLED when it fires."}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontriggerutareassign",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger.UTAReassign"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskAction that causes a UserTaskRun to be reassigned when it fires."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"A variable assignment that resolves to a STR representing the new user_id. If not set, the user_id of the UserTaskRun will be un-set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"A variable assignment that resolves to a STR representing the new user_group. If not set, the user_group of the UserTaskRun will be un-set."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"utactiontriggerutatask",children:["Message ",(0,r.jsx)(s.code,{children:"UTActionTrigger.UTATask"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskAction that causes a TaskRun to be scheduled when it fires."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknode",children:"TaskNode"})}),(0,r.jsx)(s.td,{children:"The specification of the Task to schedule."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"mutations"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutation",children:"VariableMutation"})}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: Any variables in the ThreadRun which we should mutate."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableassignment",children:["Message ",(0,r.jsx)(s.code,{children:"VariableAssignment"})]}),"\n",(0,r.jsx)(s.p,{children:"A VariableAssignment is used within a WfSpec to determine how a value should be\nassigned in the context of a specific WfRun. For example, in a TASK node, you\nuse a VariableAssignment for each input parameter to determine how the value\nis set."}),"\n",(0,r.jsx)(s.p,{children:"Note that the VariableAssignment is normally handled by the SDK; you shouldn't\nhave to worry about this in daily LittleHorse usage."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_path"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["If you provide a ",(0,r.jsx)(s.code,{children:"variable_name"})," and the specified variable is JSON_OBJ or JSON_ARR type, then you may also provide a json_path which makes the VariableAssignment resolve to the specified field."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"source"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Assign the value from a variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"literal_value"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Assign a literal value"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"format_string"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignmentformatstring",children:"VariableAssignment.FormatString"})}),(0,r.jsx)(s.td,{children:"Assign a format string"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableassignmentformatstring",children:["Message ",(0,r.jsx)(s.code,{children:"VariableAssignment.FormatString"})]}),"\n",(0,r.jsx)(s.p,{children:"A FormatString formats a template String with values from the WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"format"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:['A VariableAssignment which must resolve to a String that has format args. A valid string is "This is a format string with three args: ',0,", ",1,", ",2,'"']})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"args"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"VariableAssignments which fill out the args."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variabledef",children:["Message ",(0,r.jsx)(s.code,{children:"VariableDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Declares a Variable."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"The Type of the variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"default_value"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Optional default value if the variable isn't set; for example, in a ThreadRun if you start a ThreadRun or WfRun without passing a variable in, then this is used."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked_value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"If true, the variable value will show as a masked string."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablemutation",children:["Message ",(0,r.jsx)(s.code,{children:"VariableMutation"})]}),"\n",(0,r.jsx)(s.p,{children:"A VariableMutation defines a modification made to one of a ThreadRun's variables.\nThe LHS determines the variable that is modified; the operation determines how\nit is modified, and the RHS is the input to the operation."}),"\n",(0,r.jsx)(s.p,{children:"Day-to-day users of LittleHorse generally don't interact with this structure unless\nthey are writing their own WfSpec SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"lhs_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable to mutate"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"lhs_json_path"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"For JSON_ARR and JSON_OBJ variables, this allows you to optionally mutate a specific sub-field of the variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"operation"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutationtype",children:"VariableMutationType"})}),(0,r.jsx)(s.td,{children:"Defines the operation that we are executing."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"source_variable"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"rhs_value"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Set the source_variable as the RHS to use another variable from the workflow to as the RHS/"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"literal_value"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"rhs_value"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Use a literal value as the RHS."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_output"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"rhs_value"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutationnodeoutputsource",children:"VariableMutation.NodeOutputSource"})}),(0,r.jsx)(s.td,{children:"Use the output of the current node as the RHS."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablemutationnodeoutputsource",children:["Message ",(0,r.jsx)(s.code,{children:"VariableMutation.NodeOutputSource"})]}),"\n",(0,r.jsx)(s.p,{children:"Specifies to use the output of a NodeRun as the RHS."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"jsonpath"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Use this specific field from a JSON output"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externalevent",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEvent"})]}),"\n",(0,r.jsx)(s.p,{children:"An ExternalEvent represents A Thing That Happened outside the context of a WfRun.\nGenerally, an ExternalEvent is used to represent a document getting signed, an incident\nbeing resolved, an order being fulfilled, etc."}),"\n",(0,r.jsx)(s.p,{children:"ExternalEvent's are created via the 'rpc PutExternalEvent'"}),"\n",(0,r.jsxs)(s.p,{children:["For more context on ExternalEvents, check our documentation here:\n",(0,r.jsx)(s.a,{href:"https://littlehorse.dev/docs/concepts/external-events",children:"https://littlehorse.dev/docs/concepts/external-events"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ExternalEvent. This contains WfRunId, ExternalEventDefId, and a unique guid which can be used for idempotency of the ",(0,r.jsx)(s.code,{children:"PutExternalEvent"})," rpc call."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ExternalEvent was registered with LittleHorse."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The payload of this ExternalEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If the ExternalEvent was claimed by a specific ThreadRun (via Interrupt or EXTERNAL_EVENT Node), this is set to the number of the relevant ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If the ExternalEvent was claimed by a specific ThreadRun (via EXTERNAL_EVENT Node; note that in the case of an Interrupt the node_run_position will never be set), this is set to the number of the relevant NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"claimed"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the ExternalEvent has been claimed by a WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventdef",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventDef"})]}),"\n",(0,r.jsx)(s.p,{children:"The ExternalEventDef defines the blueprint for an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The id of the ExternalEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the ExternalEventDef was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventretentionpolicy",children:"ExternalEventRetentionPolicy"})}),(0,r.jsxs)(s.td,{children:["The retention policy for ExternalEvent's of this ExternalEventDef. This applies to the ExternalEvent ",(0,r.jsx)(s.strong,{children:"only before"})," it is matched with a WfRun."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventretentionpolicy",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventRetentionPolicy"})]}),"\n",(0,r.jsx)(s.p,{children:"Policy to determine how long an ExternalEvent is retained after creation if it\nis not yet claimed by a WfRun. Note that once a WfRun has been matched with the\nExternalEvent, the ExternalEvent is deleted if/when that WfRun is deleted.\nIf not set, then ExternalEvent's are not deleted if they are not matched with\na WfRun."}),"\n",(0,r.jsxs)(s.p,{children:["A future version of LittleHorse will allow changing the retention_policy, which\nwill trigger a cleanup of old ",(0,r.jsx)(s.code,{children:"ExternalEvent"}),"s."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"seconds_after_put"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"ext_evt_gc_policy"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Delete such an ExternalEvent X seconds after it has been registered if it has not yet been claimed by a WfRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"entrypointrun",children:["Message ",(0,r.jsx)(s.code,{children:"EntrypointRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for an ENTRYPOINT NodeRun. Currently Empty."}),"\n",(0,r.jsxs)(s.h3,{id:"exitrun",children:["Message ",(0,r.jsx)(s.code,{children:"ExitRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for an EXIT NodeRun. Currently Empty, will contain info\nabout ThreadRun Outputs once those are added in the future."}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventnoderun",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for an EXTERNAL_EVENT NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventDefId that we are waiting for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"event_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the ExternalEvent arrived. Unset if still waiting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventId of the ExternalEvent. Unset if still waiting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timed_out"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether we had a timeout while waiting for the ExternalEvent to come."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failure",children:["Message ",(0,r.jsx)(s.code,{children:"Failure"})]}),"\n",(0,r.jsx)(s.p,{children:"Denotes a failure that happened during execution of a NodeRun or the outgoing\nedges."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["The name of the failure. LittleHorse has certain built-in failures, all named in UPPER_UNDERSCORE_CASE. Such failures correspond with the ",(0,r.jsx)(s.code,{children:"LHStatus.ERROR"}),".",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Any Failure named in ",(0,r.jsx)(s.code,{children:"kebab-case"})," is a user-defined business ",(0,r.jsx)(s.code,{children:"EXCEPTION"}),", treated as an ",(0,r.jsx)(s.code,{children:"LHStatus.EXCEPTION"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The human-readable message associated with this Failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsxs)(s.td,{children:["A user-defined Failure can have a value; for example, in Java an Exception is an Object with arbitrary properties and behaviors.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Future versions of LH will allow FailureHandler threads to accept that value as an input variable."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"was_properly_handled"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"A boolean denoting whether a Failure Handler ThreadRun properly handled the Failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handler_threadrun_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If there is a defined failure handler for the NodeRun, then this field is set to the id of the failure handler thread run."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderun",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A NodeRun is a running instance of a Node in a ThreadRun. Note that a NodeRun\nis a Getable object, meaning it can be retried from the LittleHorse grpc API."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the NodeRun. Note that the NodeRunId contains the WfRunId, the ThreadRun's number, and the position of the NodeRun within that ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsxs)(s.td,{children:["The ID of the WfSpec that this NodeRun is from. This is not ",(0,r.jsx)(s.em,{children:"always"})," the same as the ThreadRun it belongs to because of the upcoming WfSpec Version Migration feature."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handler_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"A list of all ThreadRun's that ran to handle a failure thrown by this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The status of this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"arrival_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ThreadRun arrived at this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the NodeRun was terminated (failed or completed)."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to which this NodeRun belongs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the Node in the ThreadSpec that this NodeRun belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error_message"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A human-readable error message intended to help developers diagnose WfSpec problems."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failures"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failure",children:"Failure"})}),(0,r.jsx)(s.td,{children:"A list of Failures thrown by this NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknoderun",children:"TaskNodeRun"})}),(0,r.jsx)(s.td,{children:"Denotes a TASK node, which runs a TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventnoderun",children:"ExternalEventNodeRun"})}),(0,r.jsx)(s.td,{children:"An EXTERNAL_EVENT node blocks until an ExternalEvent arrives."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#entrypointrun",children:"EntrypointRun"})}),(0,r.jsx)(s.td,{children:"An ENTRYPOINT node is the first thing that runs in a ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exit"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exitrun",children:"ExitRun"})}),(0,r.jsx)(s.td,{children:"An EXIT node completes a ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_thread"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startthreadrun",children:"StartThreadRun"})}),(0,r.jsx)(s.td,{children:"A START_THREAD node starts a child ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsrun",children:"WaitForThreadsRun"})}),(0,r.jsx)(s.td,{children:"A WAIT_THREADS node waits for one or more child ThreadRun's to complete."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"sleep"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#sleepnoderun",children:"SleepNodeRun"})}),(0,r.jsx)(s.td,{children:"A SLEEP node makes the ThreadRun block for a certain amount of time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertasknoderun",children:"UserTaskNodeRun"})}),(0,r.jsx)(s.td,{children:"A USER_TASK node waits until a human executes some work and reports the result."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_multiple_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startmultiplethreadsrun",children:"StartMultipleThreadsRun"})}),(0,r.jsx)(s.td,{children:"A START_MULTIPLE_THREADS node iterates over a JSON_ARR variable and spawns a child ThreadRun for each element in the list."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"throw_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#throweventnoderun",children:"ThrowEventNodeRun"})}),(0,r.jsx)(s.td,{children:"A THROW_EVENT node throws a WorkflowEvent of a specified WorkflowEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_for_condition"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node_type"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforconditionrun",children:"WaitForConditionRun"})}),(0,r.jsx)(s.td,{children:"A WAIT_FOR_CONDITION node blocks the ThreadRun until the specified condition evaluates to True."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"sleepnoderun",children:["Message ",(0,r.jsx)(s.code,{children:"SleepNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a SLEEP NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"maturation_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["The time at which the NodeRun is ",(0,r.jsx)(s.em,{children:"SCHEDULED TO"}),' wake up. In rare cases, if the LH Server is back-pressuring clients due to extreme load, the timer event which marks the sleep node as "matured" may come in slightly late.']})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"matured"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the SleepNodeRun has been matured."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startmultiplethreadsrun",children:["Message ",(0,r.jsx)(s.code,{children:"StartMultipleThreadsRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a START_MULTIPLE_THREADS NodeRun."}),"\n",(0,r.jsx)(s.p,{children:"Note: the output of this NodeRun, which can be used to mutate Variables,\nis a JSON_ARR variable containing the ID's of all the child threadRuns."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The thread_spec_name of the child thread_runs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"child_thread_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The list of all created child ThreadRun's"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startthreadrun",children:["Message ",(0,r.jsx)(s.code,{children:"StartThreadRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a START_THREAD NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"child_thread_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Contains the thread_run_number of the created Child ThreadRun, if it has been created already."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The thread_spec_name of the child thread_run."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tasknoderun",children:["Message ",(0,r.jsx)(s.code,{children:"TaskNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a TASK NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskRun. Note that if the ThreadRun was halted when it arrived at this TASK Node, then the task_run_id will be unset."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"throweventnoderun",children:["Message ",(0,r.jsx)(s.code,{children:"ThrowEventNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a THROW_EVENT NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"workflow_event_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ",(0,r.jsx)(s.code,{children:"WorkflowEvent"})," that was thrown by this ",(0,r.jsx)(s.code,{children:"ThrowEventNodeRun"}),"."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertasknoderun",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskNodeRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a USER_TASK NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskRun. Note that if the ThreadRun was halted when it arrived at this USER_TASK node, then the user_task_run_id will be unset."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforconditionrun",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForConditionRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a WAIT_FOR_CONDITION NodeRun"}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsrun",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsRun"})]}),"\n",(0,r.jsx)(s.p,{children:"The sub-node structure for a WAIT_FOR_THREADS NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"threads"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsrunwaitforthread",children:"WaitForThreadsRun.WaitForThread"})}),(0,r.jsx)(s.td,{children:"The threads that are being waited for."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsrunwaitforthread",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsRun.WaitForThread"})]}),"\n",(0,r.jsx)(s.p,{children:"A 'WaitForThread' structure defines a thread that is being waited for."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which the ThreadRun ended (successfully or not). Not set if the ThreadRun is still RUNNING, HALTED, or HALTING."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The current status of the ThreadRun being waited for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The number of the ThreadRun being waited for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"waiting_status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsrunwaitingthreadstatus",children:"WaitForThreadsRun.WaitingThreadStatus"})}),(0,r.jsx)(s.td,{children:'The "waiting status" of this specific thread: whether it\'s still running, already done, handling a failure, or completely failed.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handler_thread_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If there is a failure on the ThreadRun, and we have a failure handler defined for it, then we will start a failure handler for this threadrun. This field is the id of that threadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventdefid",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for ExternalEventDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"ExternalEventDef's are uniquedly identified by their name."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventid",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for the ExternalEvent. Note that every ExternalEvent is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventDef for this ExternalEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"guid"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A unique guid allowing for distinguishing this ExternalEvent from other events of the same ExternalEventDef and WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderunid",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"ID of the WfRun for this NodeRun. Note that every NodeRun is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"ThreadRun of this NodeRun. Note that each NodeRun belongs to a ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Position of this NodeRun within its ThreadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"principalid",children:["Message ",(0,r.jsx)(s.code,{children:"PrincipalId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a Principal."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The id of this principal. In OAuth, this is the OAuth Client ID (for machine principals) or the OAuth User Id (for human principals)."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrunid",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a ScheduledWfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"TaskDef's are uniquely identified by their name."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefmetricsid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefMetricsId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a specific window of TaskDef metrics."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The timestamp at which this metrics window starts."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The length of this window."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The TaskDefId that this metrics window reports on."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a TaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for this TaskRun. Note that every TaskRun is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_guid"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Unique identifier for this TaskRun. Unique among the WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkergroupid",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerGroupId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a TaskWorkerGroup."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"TaskWorkerGroups are uniquely identified by their TaskDefId."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"tenantid",children:["Message ",(0,r.jsx)(s.code,{children:"TenantId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a Tenant."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The Tenant ID."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskdefid",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a UserTaskDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of a UserTaskDef"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Note that UserTaskDef's use simple versioning."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunid",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a UserTaskRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for this UserTaskRun. Note that every UserTaskRun is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_guid"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Unique identifier for this UserTaskRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableid",children:["Message ",(0,r.jsx)(s.code,{children:"VariableId"})]}),"\n",(0,r.jsx)(s.p,{children:"Id for a Variable."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"WfRunId for the variable. Note that every Variable is associated with a WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Each Variable is owned by a specific ThreadRun inside the WfRun it belongs to. This is that ThreadRun's number."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfrunid",children:["Message ",(0,r.jsx)(s.code,{children:"WfRunId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a WfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID for this WfRun instance."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"A WfRun may have a parent WfRun. If so, this field is set to the parent's ID."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecid",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecId"})]}),"\n",(0,r.jsx)(s.p,{children:"The ID of a WfSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Name of the WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Major Version of a WfSpec.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Note that WfSpec's are versioned. Creating a new WfSpec with the same name and no breaking changes to the public Variables API results in a new WfSpec being created with the same MajorVersion and a new revision. Creating a WfSpec with a breaking change to the public Variables API results in a new WfSpec being created with the same name, an incremented major_version, and revision = 0."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Revision of a WfSpec.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Note that WfSpec's are versioned. Creating a new WfSpec with the same name and no breaking changes to the public Variables API results in a new WfSpec being created with the same MajorVersion and a new revision. Creating a WfSpec with a breaking change to the public Variables API results in a new WfSpec being created with the same name, an incremented major_version, and revision = 0."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecmetricsid",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecMetricsId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a specific window of WfSpec metrics."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The timestamp at which this metrics window starts."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The length of this window."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The WfSpecId that this metrics window reports on."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventdefid",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventDefId"})]}),"\n",(0,r.jsx)(s.p,{children:"ID for a WorkflowEventDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WorkflowEventDef"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventid",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventId"})]}),"\n",(0,r.jsx)(s.p,{children:"An ID for a WorkflowEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The Id of the WfRun that threw the event."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"workflow_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the WorkflowEventDef that this WorkflowEvent is a member of."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"A sequence number that makes the WorkflowEventId unique among all WorkflowEvent's of the same type thrown by the WfRun. This field starts at zero and is incremented every time a WorkflowEvent of the same type is thrown by the same WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrun",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRun"})]}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.code,{children:"ScheduledWfRun"})," is an object in the LittleHorse API that triggers a ",(0,r.jsx)(s.code,{children:"WfRun"})," to be started\non a cron schedule."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsx)(s.td,{children:"Unique id for this ScheduledWfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"WfSpec used to run a workflow on a schedule."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunvariablesentry",children:"ScheduledWfRun.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"A map from Variable Name to Values for those variables. The provided variables are passed as input to the Entrypoint ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Parent WfRunId associated with all the generated WfRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cron_expression"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"UNIX expression used to specify the schedule for executing WfRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Creation time for this ScheduledWfRun"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrunvariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRun.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"awaitworkfloweventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"AwaitWorkflowEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Request to await until a WorkflowEvent of a certain WorkflowEventDef on a certain WfRun\nis thrown. Relies upon native GRPC deadlines to configure timeouts."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun which must throw the WorkflowEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"event_def_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The IDs of the WorkflowEventDef that must be thrown. The request will return the first matching WorkflowEvent thrown. If event_def_ids is empty, then the request will return the first WorkflowEvent thrown by the WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"workflow_events_to_ignore"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsx)(s.td,{children:"Since a single WfRun may throw multiple WorkflowEvent's with the same WorkflowEventDefId, it is necessary to provide a client the ability to \"ignore\" WorkflowEvent's that have already been 'awaited'. Any WorkflowEvent specified by this field is ignored by the rpc."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteexternaleventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteExternalEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes an ExternalEventDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteexternaleventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteExternalEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEvent to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletescheduledwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteScheduledWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Delete an existing ScheduledWfRun, returns INVALID_ARGUMENT if object does not exist"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsxs)(s.td,{children:["Id of the ",(0,r.jsx)(s.code,{children:"ScheduledWfRun"})," to be deleted"]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletetaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskDef to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a UserTaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskDef to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deletewfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes a WfSpec"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec to delete"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"deleteworkfloweventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"DeleteWorkflowEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Deletes an WorkflowEventDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the WorkflowEventDef to delete."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventdefidlist",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventDefIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ExternalEventDef Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventidlist",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ExternalEvent Id's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventlist",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of ExternalEvents."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externalevent",children:"ExternalEvent"})}),(0,r.jsx)(s.td,{children:"A list of ExternalEvent objects."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"GetLatestUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Returns the UserTaskDef with a given name and the highest version number."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the UserTaskDef to search for."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"getlatestwfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"GetLatestWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Get the latest WfSpec with a given name and optionally majorVersion"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to get. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally get only WfSpec's that have the same major version. This can be useful if you want to guarantee that there have been no breaking changes to the API of the WfSpec, for example, to ensure that there have been no changes to searchable variables or required input variables."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"lhhostinfo",children:["Message ",(0,r.jsx)(s.code,{children:"LHHostInfo"})]}),"\n",(0,r.jsx)(s.p,{children:"Information about a specific LH Server to contact."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"host"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The host on the server"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"port"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The port for the specified listener."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listexternaleventsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListExternalEventsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List all ExternalEvents for a specific WfRunId. Note that List Requests return actual\nExternalEvent objects, not ExternalEventId's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRunId for whom we list ExternalEvent's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listnoderunsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListNodeRunsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List all NodeRun's for a given WfRun. Note that List requests return actual NodeRun Objects,\nnot NodeRunId's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for whom we list NodeRun's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify the thread run number to filter NodeRun's by."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskmetricsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListTaskMetricsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve TaskDef Metrics over a period of time."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"TaskDef id for whichwe retrieve metrics."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"last_window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["This parameter is a timestamp that is used to determine the ",(0,r.jsx)(s.em,{children:"last"})," window returned. The server will then return ",(0,r.jsx)(s.code,{children:"num_windows"})," worth of data from before this timestamp."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_length"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"Window size"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"num_windows"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Number of windows to retrieve."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskmetricsresponse",children:["Message ",(0,r.jsx)(s.code,{children:"ListTaskMetricsResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of TaskDef Metrics WIndows"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefmetrics",children:"TaskDefMetrics"})}),(0,r.jsx)(s.td,{children:"List of TaskDef Metrics Windows"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listtaskrunsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListTaskRunsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List TaskRun's for a specific WfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for which to list TaskRun's"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List UserTaskRun's for a specific WfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for which to list UserTaskRuns"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listvariablesrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListVariablesRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List all Variables for a specific WfRun. Note that List requests return actual Variable Objects,\nnot VariableId's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRun for whom we will list Variables."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listwfmetricsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListWfMetricsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve WfSpec Metrics over a period of time."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"WfSpecId of metrics to get."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"last_window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["This parameter is a timestamp that is used to determine the ",(0,r.jsx)(s.em,{children:"last"})," window returned. The server will then return ",(0,r.jsx)(s.code,{children:"num_windows"})," worth of data from before this timestamp."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_length"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The window size"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"num_windows"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Number of windows to retrieve"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"listwfmetricsresponse",children:["Message ",(0,r.jsx)(s.code,{children:"ListWfMetricsResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of WfSpec Metrics Windows"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecmetrics",children:"WfSpecMetrics"})}),(0,r.jsx)(s.td,{children:"List of WfSpec Metrics Windows"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"listworkfloweventsrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ListWorkflowEventsRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"List all WorkflowEvents for a specific WfRunId. Note that List Requests return actual\nWorkflowEvent objects, not WorkflowEventId's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The WfRunId for whom we list WorkflowEvent's."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"migratewfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"MigrateWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: migrate live WfRun's from one version of a WfSpec to another."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_wf_spec"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"migration"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecversionmigration",children:"WfSpecVersionMigration"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of NodeRun Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"noderunlist",children:["Message ",(0,r.jsx)(s.code,{children:"NodeRunList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of NodeRun Objects."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderun",children:"NodeRun"})}),(0,r.jsx)(s.td,{children:"A list of NodeRun Objects."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"polltaskrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PollTaskRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Request sent by the Task Worker SDK to tell the Server that the Task Worker is ready\nto execute a TaskRun. Generally used only by the Task Worker SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"Is the TaskDefId that the Task Worker wants to execute."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"client_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the ID of the Task Worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optionally specifies the version of the Task Worker, so that it can be recorded for debugging purposes on the TaskRun itself."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"polltaskresponse",children:["Message ",(0,r.jsx)(s.code,{children:"PollTaskResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"Response from the server for PollTaskRequest."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"result"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledtask",children:"ScheduledTask"})}),(0,r.jsx)(s.td,{children:"If possible, a ScheduledTask is returned."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"principalidlist",children:["Message ",(0,r.jsx)(s.code,{children:"PrincipalIdList"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#principalid",children:"PrincipalId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternaleventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutExternalEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Field to create an ExternalEventDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the resulting ExternalEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventretentionpolicy",children:"ExternalEventRetentionPolicy"})}),(0,r.jsxs)(s.td,{children:["Policy to determine how long an ExternalEvent is retained after creation if it is not yet claimed by a WfRun. Note that once a WfRun has been matched with the ExternalEvent, the ExternalEvent is deleted if/when that WfRun is deleted. If not set, then ExternalEvent's are not deleted if they are not matched with a WfRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"A future version of LittleHorse will allow changing the retention_policy, which will trigger a cleanup of old ",(0,r.jsx)(s.code,{children:"ExternalEvent"}),"s."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putexternaleventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutExternalEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Request used to create an ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun that this Event is sent to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef that this event implements."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"guid"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Note that an ExternalEventDefId is a three-part ID: 1. WfRunId 2. ExternalEventDef Name 3. A guid The guid from part 3) can be optionally provided to the PutExternalEventRequest in order to make it idempotent. It is a best practice to do so."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The content of this event."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify that this ExternalEvent may only be claimed by a specific ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify that this ExternalEvent may only be claimed by a specific NodeRun. In order for this to be set, you must also set thread_run_number."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"puttaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Creates a TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the TaskDef to create."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"input_vars"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"Variables required to execute the TaskDef. Normally, these are automatically generated by the Task Worker SDK."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"output_schema"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefoutputschema",children:"TaskDefOutputSchema"})}),(0,r.jsx)(s.td,{children:"Schema that validates the TaskDef's output"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Creates a UserTaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the UserTaskDef to create."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fields"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskfield",children:"UserTaskField"})}),(0,r.jsx)(s.td,{children:"The fields that should be presented to the user on the screen in order to fill out the User Task. Note that these fields also define a data contract for the result of the UserTaskDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"description"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optional metadata field to store user-defined data. Does not impact workflow execution. Fine to store up to a few KB of text here."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putwfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Creates a WfSpec. Generally, this request is generated by the Workflow object in\nour various SDK's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the resulting WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_specs"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#putwfspecrequestthreadspecsentry",children:"PutWfSpecRequest.ThreadSpecsEntry"})}),(0,r.jsx)(s.td,{children:"Map from name the ThreadSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint_thread_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to be used as the workflow entrypoint."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowretentionpolicy",children:"WorkflowRetentionPolicy"})}),(0,r.jsx)(s.td,{children:"Optional policy to determine how long a WfRun is retained in the data store after it is completed or terminated."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_spec"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecparentwfspecreference",children:"WfSpec.ParentWfSpecReference"})}),(0,r.jsxs)(s.td,{children:["Parent WfSpec Reference. If this is set, then all WfRun's for this WfSpec ",(0,r.jsx)(s.em,{children:"MUST"})," be Child WfRun's of the specified WfSpec."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"allowed_updates"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#allowedupdatetype",children:"AllowedUpdateType"})}),(0,r.jsx)(s.td,{children:"Configures the behavior of this individual request. Can be used to prevent breaking changes to the WfSpec, prevent any changes to the WfSpec, or allow all changes to the WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putwfspecrequestthreadspecsentry",children:["Message ",(0,r.jsx)(s.code,{children:"PutWfSpecRequest.ThreadSpecsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspec",children:"ThreadSpec"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"putworkfloweventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"PutWorkflowEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Creates a WorkflowEventDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the resulting WorkflowEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"The type of 'content' thrown with a WorkflowEvent based on this WorkflowEventDef."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"registertaskworkerrequest",children:["Message ",(0,r.jsx)(s.code,{children:"RegisterTaskWorkerRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Message used by Task Worker to register itself to the server and ask for assignments of\nservers to poll."}),"\n",(0,r.jsx)(s.p,{children:"Used by the Task Worker SDK; generally, you shouldn't have to touch this manually."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the ID of the Task Worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The TaskDef the worker wants to poll for."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"registertaskworkerresponse",children:["Message ",(0,r.jsx)(s.code,{children:"RegisterTaskWorkerResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"Response containing list of Servers that the Task Worker should connect to and start polling from.\nOnly used internally by the Task Worker SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"your_hosts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhhostinfo",children:"LHHostInfo"})}),(0,r.jsx)(s.td,{children:"The list of LH Server hosts that the Task Worker should start polling."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"is_cluster_healthy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the LH Cluster is healthy."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"reporttaskrun",children:["Message ",(0,r.jsx)(s.code,{children:"ReportTaskRun"})]}),"\n",(0,r.jsx)(s.p,{children:"Request used by the Task Worker SDK to report the result of a TaskRun execution."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"ID of the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the TaskRun was executed"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"Status of the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"log_output"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Optional information for logging or exceptions"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"attempt_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Attempt number of the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"output"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Successfully completed task"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskerror",children:"LHTaskError"})}),(0,r.jsx)(s.td,{children:"Technical error"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exception"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskexception",children:"LHTaskException"})}),(0,r.jsx)(s.td,{children:"Business exception"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"rescuethreadrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"RescueThreadRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"The request used to rescue a failed ThreadRun at a specific NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsxs)(s.td,{children:["The id of the ",(0,r.jsx)(s.code,{children:"WfRun"})," which we are going to rescue."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the failed ",(0,r.jsx)(s.code,{children:"ThreadRun"})," that we will rescue. The specified ",(0,r.jsx)(s.code,{children:"ThreadRun"})," must be in a state where it's latest ",(0,r.jsx)(s.code,{children:"NodeRun"})," is: ",(0,r.jsx)("br",{})," - In the ",(0,r.jsx)(s.code,{children:"ERROR"})," state.",(0,r.jsx)("br",{})," - Has no ",(0,r.jsx)(s.code,{children:"FailureHandler"})," ",(0,r.jsx)(s.code,{children:"ThreadRun"}),"s ",(0,r.jsx)("br",{})," - The parent ",(0,r.jsx)(s.code,{children:"ThreadRun"}),", or any parent of the parent, has not handled the ",(0,r.jsx)(s.code,{children:"Failure"})," yet.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If that is not true, then the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," cannot be rescued and the request will return ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"skip_current_node"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsxs)(s.td,{children:["If set to ",(0,r.jsx)(s.code,{children:"true"}),", then the ThreadRun will skip past the ",(0,r.jsx)(s.code,{children:"Node"})," of the current failed ",(0,r.jsx)(s.code,{children:"NodeRun"})," and advance according to the outgoing edges. If set to ",(0,r.jsx)(s.code,{children:"false"}),", then the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," will schedule another ",(0,r.jsx)(s.code,{children:"NodeRun"})," for the current ",(0,r.jsx)(s.code,{children:"Node"})]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"resumewfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ResumeWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Resume a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Is the WfRunId"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the ThreadRun to resume. Note that resuming the entrypoint ThreadRun (which always has number ",(0,r.jsx)(s.code,{children:"0"}),") causes the whole WfRun to resume. If you do not manually set the thread_run_number field, it defaults to zero, so resuming the entire WfRun is the default behavior."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"runwfrequest",children:["Message ",(0,r.jsx)(s.code,{children:"RunWfRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Create a Workflow Run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to run."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:'Optionally specify the major version of the WfSpec to run. This guarantees that the "signature" of the WfSpec (i.e. the required input variables, and searchable variables) will not change for this app.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify the specific revision of the WfSpec to run. It is not recommended to use this in practice, as the WfSpec logic should be de-coupled from the applications that run WfRun's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#runwfrequestvariablesentry",children:"RunWfRequest.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"A map from Variable Name to Values for those variables. The provided variables are passed as input to the Entrypoint ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"You can optionally specify the ID of this WfRun. This is a recommended best practice as it also makes your request idempotent and allows you to easily find the WfRun at a later time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"runwfrequestvariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"RunWfRequest.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"schedulewfrequest",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduleWfRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Schedule WfRuns based on a specific cron UNIX expression"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specific ID"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to run."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:'Optionally specify the major version of the WfSpec to run. This guarantees that the "signature" of the WfSpec (i.e. the required input variables, and searchable variables) will not change for this app.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Optionally specify the specific revision of the WfSpec to run. It is not recommended to use this in practice, as the WfSpec logic should be de-coupled from the applications that run WfRun's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#schedulewfrequestvariablesentry",children:"ScheduleWfRequest.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"A map from Variable Name to Values for those variables. The provided variables are passed as input to the Entrypoint ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_run_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Parent WfRunId associated with all the generated WfRuns"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cron_expression"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"UNIX expression used to specify the schedule for executing WfRuns"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"schedulewfrequestvariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduleWfRequest.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledtask",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledTask"})]}),"\n",(0,r.jsx)(s.p,{children:"Message sent by server to Task Worker SDK specifying a specific TaskRun to be executed.\nThis is used and handled internally by the Task Worker SDK."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"Id of the TaskRun to execute."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"ID of the TaskDef to which the TaskRun belongs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"attempt_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Attempt number of the TaskRun, zero indexed. attempt_number of ",(0,r.jsx)(s.code,{children:"0"})," means this is the first attempt; ",(0,r.jsx)(s.code,{children:"1"})," means this is the first retry, etc."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#varnameandval",children:"VarNameAndVal"})}),(0,r.jsx)(s.td,{children:"Input variables for this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"source"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunsource",children:"TaskRunSource"})}),(0,r.jsx)(s.td,{children:"Source of the TaskRun. Currently, there are two options: 1. A TASK node 2. A reminder task scheduled by a trigger on a User Task."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"scheduledwfrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"ScheduledWfRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of ScheduledWfRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#scheduledwfrunid",children:"ScheduledWfRunId"})}),(0,r.jsx)(s.td,{children:"A list of ScheduledWfRun Objects"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternaleventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchExternalEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for ExternalEventDefs based on certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optionally search only for ExternalEventDef's whose name starts with this prefix."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchexternaleventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchExternalEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for ExternalEvents based on certain criteria."}),"\n",(0,r.jsx)(s.p,{children:"Required field ExternalEventDefId specifies which ExternalEventDef\nto search for ExternalEvents under."}),"\n",(0,r.jsx)(s.p,{children:"At this time, it is not possible to make a search for all ExternalEvents."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only ExternalEvents created after this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only ExternalEvents created before this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsxs)(s.td,{children:["Search for ExternalEvents by their ExternalEventDefId",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"* Note: If ExternalEventDefId is not provided or does not exist, gRPC status code 'INVALID_ARGUMENT' will be returned."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"is_claimed"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Optionally search for only ExternalEvents that are claimed or not."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchnoderunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchNodeRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for NodeRun's by certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Only return NodeRun's created after this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Only return NodeRun's created before this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#searchnoderunrequestnodetype",children:"SearchNodeRunRequest.NodeType"})}),(0,r.jsx)(s.td,{children:"Specifies the type of NodeRun to search for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"Specifies the status of NodeRun to search for."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchprincipalrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchPrincipalRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for Principals based on certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only Principals's created after this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only Principals's created before this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"isAdmin"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"principal_criteria"})]}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"List only Principals that are admins"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"tenantId"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"principal_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"List Principals associated with this Tenant ID"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchscheduledwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchScheduledWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search filters for ScheduledWfRun's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the WfSpec to filter"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The major version of the WfSpec to filter"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The revision number of the WfSpec to filter"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for TaskDef's based on certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optionally specify to only return TaskDef's with a specific prefix."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Searches for TaskRuns by various criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specifies the TaskDef of TaskRun's to return. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"Specifies to only return TaskRun's matching this status."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to only return TaskRun's that were scheduled after this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to only return TaskRun's that were scheduled before this time."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchtenantrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchTenantRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for all available TenantIds for current Principal"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchUserTaskDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for UserTaskDef's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"user_task_def_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return all UserTaskDef's with a specific prefix."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"user_task_def_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return all UserTaskDef's with a specific name."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for UserTaskRun's matching certain criteria. The attributes are additive,\nyou may specify any combination of fields in this request. Only UserTaskRun's\nmatching all criteria will be returned."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunstatus",children:"UserTaskRunStatus"})}),(0,r.jsx)(s.td,{children:"Status of UserTaskRun's to return."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_name"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"UserTaskDef name to search for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's assigned to this user id."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's assigned to this user group."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's that were created after this time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Search for UserTaskRun's that were created before this time."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchvariablerequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchVariableRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for Variables by their value. This request is also highly useful to search for\nWfRun's based on the value of Variable's that are not in the Entrypoint ThreadRun,\nand also when you are using LittleHorse as a data store and need to perform a search."}),"\n",(0,r.jsxs)(s.p,{children:["You may only search for a Variable that has an index specified on it. This may be done\nvia th ",(0,r.jsx)(s.code,{children:".searchable()"})," method on our SDK's."]}),"\n",(0,r.jsx)(s.p,{children:"Note that we do not yet support searching JSON_OBJ or JSON_ARR fields, but you may\nstill mark those fields as searchable. We will soon add the ability to query those\nfields via the indices."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Specifies the value that the variable must be. Exact match is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies major version of the WfSpec for the associated WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies the revision of the WfSpec for the associated WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specifies the name of the variable to search for. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Specifies the name of the WfSpec for the associated WfRun's. This is required."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"A request used to retrieve a list of WfRunId's by certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The WfSpec whose WfRun's we are searching for. This is required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_major_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's from this WfSpec Major Version."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_revision"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's from this WfSpec Revision. Can only be set if wf_spec_major_version is also set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's matching this status."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's that started after this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only WfRun's that started before this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_filters"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablematch",children:"VariableMatch"})}),(0,r.jsx)(s.td,{children:"Allows filtering WfRun's based on the value of the Variables. This ONLY works for the Variables in the entrypiont threadrun (that is, variables where the threadRunNumber == 0)."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchwfspecrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchWfSpecRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for WfSpec's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_spec_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return WfSpec's with a specific name."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_spec_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return WfSpec's with a specific prefix."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_name"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_spec_criteria"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Return all WfSpec's that make use of a given TaskDef."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchworkfloweventdefrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchWorkflowEventDefRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for WorkflowEventDefs based on certain criteria."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"prefix"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optionally search only for WorkflowEventDef's whose name starts with this prefix."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"searchworkfloweventrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SearchWorkflowEventRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Search for WorkflowEvents based on certain criteria."}),"\n",(0,r.jsx)(s.p,{children:"Required field WorkflowEventDefId specifies which WorkflowEventDef\nto search for WorkflowEvents under."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"limit"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Maximum results to return in one request."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"earliest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only WorkflowEvent created after this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_start"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Specifies to return only WorkflowEvent created before this time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"workflow_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsxs)(s.td,{children:["Search for WorkflowEvents by their WorkflowEventDefId",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"* Note: If WorkflowEventDefId is not provided or does not exist, gRPC status code 'INVALID_ARGUMENT' will be returned."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"serverversionresponse",children:["Message ",(0,r.jsx)(s.code,{children:"ServerVersionResponse"})]}),"\n",(0,r.jsx)(s.p,{children:"The version of the LH Server according to Semantic Versioning"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Server Major Version"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"minor_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Server Minor Version"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"patch_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Server Patch Version"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pre_release_identifier"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Prerelease Identifier. If this is set, then the server is NOT a production release but rather a release candidate or experimental pre-release."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"stopwfrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"StopWfRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Message to HALT a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"Is the WfRunId"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the ThreadRun to halt. Note that halting the entrypoint ThreadRun (which always has number ",(0,r.jsx)(s.code,{children:"0"}),") causes the whole WfRun to halt. If you do not manually set the thread_run_number field, it defaults to zero, so stopping the entire WfRun is the default behavior."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefidlist",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of TaskDef Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefmetrics",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefMetrics"})]}),"\n",(0,r.jsx)(s.p,{children:"Metrics for a TaskDef in a certain time period."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"TaskDef that the metrics apply to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the window started."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"Length of the window."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schedule_to_start_max"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Longest time that a TaskRun was in the TASK_SCHEDULED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schedule_to_start_avg"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Average time that a TaskRun was in the TASK_SCHEDULED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_max"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Longest time between a TaskRun being started and completed"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_avg"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Average time between a TaskRun being started and completed"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_completed"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that reached the TASK_SUCCESS state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_errored"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that reached the TASK_ERROR state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_started"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that transitioned to the TASK_RUNNING state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_scheduled"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of TaskRun's that were scheduled"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefmetricsqueryrequest",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefMetricsQueryRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve a specific TaskDef Metrics Window."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["Return the window ",(0,r.jsx)(s.em,{children:"containing"})," this timestamp. The window start is not guaranteed to align perfectly with the request."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The window size"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_name"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the specific TaskDef for which we are calculating metrics."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of TaskRun ID's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunlist",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of TaskRun's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrun",children:"TaskRun"})}),(0,r.jsx)(s.td,{children:"A list of TaskRun Objects"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkergroup",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerGroup"})]}),"\n",(0,r.jsx)(s.p,{children:"Describes all workers registered for a specific TaskDef."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkergroupid",children:"TaskWorkerGroupId"})}),(0,r.jsx)(s.td,{children:"Identifier for the group."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Timestamp indicating when the worker group was initially registered."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_workers"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkergrouptaskworkersentry",children:"TaskWorkerGroup.TaskWorkersEntry"})}),(0,r.jsx)(s.td,{children:"Metadata grouped by ClientId string."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkergrouptaskworkersentry",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerGroup.TaskWorkersEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskworkermetadata",children:"TaskWorkerMetadata"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkerheartbeatrequest",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerHeartBeatRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Message used by Task Worker to register itself to the server and ask for assignments of\nservers to poll."}),"\n",(0,r.jsx)(s.p,{children:"Used by the Task Worker SDK; generally, you shouldn't have to touch this manually."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"client_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"listener_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskworkermetadata",children:["Message ",(0,r.jsx)(s.code,{children:"TaskWorkerMetadata"})]}),"\n",(0,r.jsx)(s.p,{children:"Describes a specific task worker"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"User-defined identifier for the worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"latest_heartbeat"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"Timestamp indicating the last heartbeat sent by the worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"hosts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhhostinfo",children:"LHHostInfo"})}),(0,r.jsx)(s.td,{children:"The host(s) where the worker is polling tasks"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tenantidlist",children:["Message ",(0,r.jsx)(s.code,{children:"TenantIdList"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tenantid",children:"TenantId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"Bookmark for cursor-based pagination; pass if applicable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskdefidlist",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskDefIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of UserTaskDef Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of UserTaskRun Id's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunlist",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRunList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of UserTaskRuns"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrun",children:"UserTaskRun"})}),(0,r.jsx)(s.td,{children:"A list of UserTaskRun Objects"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"variableidlist",children:["Message ",(0,r.jsx)(s.code,{children:"VariableIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"This is a list of Variable ID's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableid",children:"VariableId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablelist",children:["Message ",(0,r.jsx)(s.code,{children:"VariableList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of Variables."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variable",children:"Variable"})}),(0,r.jsx)(s.td,{children:"A list of Variable objects."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablematch",children:["Message ",(0,r.jsx)(s.code,{children:"VariableMatch"})]}),"\n",(0,r.jsx)(s.p,{children:"Used by a SearchWfRunRequest to filter WfRun's and only return those whose Variable's\nmatch a certain filter."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the variable to inspect."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The value that the Variable must have in order to satisfy this VariableMatch"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfrunidlist",children:["Message ",(0,r.jsx)(s.code,{children:"WfRunIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of WfRun Id's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecidlist",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of WfSpec Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecmetrics",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecMetrics"})]}),"\n",(0,r.jsx)(s.p,{children:"Metrics for a WfSpec in a specific time window"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The WfSpecId that these metrics analyze"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the window started"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The length of the window"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_started"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of WfRun's created for this WfSpec"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_completed"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of WfRun's that reached the COMPLETED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_errored"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Total number of WfRun's that reached the ERROR state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_max"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Longest time between a WfRun being started and reaching the COMPLETED state"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_to_complete_avg"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Average time that a WfRun took to reach the COMPLETED state"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecmetricsqueryrequest",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecMetricsQueryRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Query to retrieve a specific WfSpec Metrics Window."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"WfSpecId of metrics to get."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_start"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["Return the window ",(0,r.jsx)(s.em,{children:"containing"})," this timestamp. The window start is not guaranteed to align perfectly with the request."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"window_length"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metricswindowlength",children:"MetricsWindowLength"})}),(0,r.jsx)(s.td,{children:"The window size"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventdefidlist",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventDefIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of WorkflowEventDef Id's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventidlist",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventIdList"})]}),"\n",(0,r.jsx)(s.p,{children:"List of WorkflowEvent Id's"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsx)(s.td,{children:"The resulting object id's."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bookmark"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"The bookmark can be used for cursor-based pagination. If it is null, the server has returned all results. If it is set, you can pass it into your next request to resume searching where your previous request left off."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventlist",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventList"})]}),"\n",(0,r.jsx)(s.p,{children:"A list of WorkflowEvents."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowevent",children:"WorkflowEvent"})}),(0,r.jsx)(s.td,{children:"A list of WorkflowEvent objects."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdef",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDef"})]}),"\n",(0,r.jsx)(s.p,{children:"A TaskDef defines a blueprint for a TaskRun that can be dispatched to Task Workers."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of this TaskDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"input_vars"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"The input variables required to execute this TaskDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time at which this TaskDef was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schema_output"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefoutputschema",children:"TaskDefOutputSchema"})}),(0,r.jsx)(s.td,{children:"Schema that validates the TaskDef's output"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskdefoutputschema",children:["Message ",(0,r.jsx)(s.code,{children:"TaskDefOutputSchema"})]}),"\n",(0,r.jsx)(s.p,{children:"Schema that validates the TaskDef's output"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value_def"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"The definition for the output content"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"lhtaskerror",children:["Message ",(0,r.jsx)(s.code,{children:"LHTaskError"})]}),"\n",(0,r.jsx)(s.p,{children:"Message denoting a TaskRun failed for technical reasons."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lherrortype",children:"LHErrorType"})}),(0,r.jsx)(s.td,{children:"The technical error code."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human readable message for debugging."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"lhtaskexception",children:["Message ",(0,r.jsx)(s.code,{children:"LHTaskException"})]}),"\n",(0,r.jsx)(s.p,{children:"Message denoting a TaskRun's execution signaled that something went wrong in the\nbusiness process, throwing a littlehorse 'EXCEPTION'."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:'The user-defined Failure name, for example, "credit-card-declined"'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human readadble description of the failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskattempt",children:["Message ",(0,r.jsx)(s.code,{children:"TaskAttempt"})]}),"\n",(0,r.jsx)(s.p,{children:"A single time that a TaskRun was scheduled for execution on a Task Queue."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"log_output"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsxs)(s.td,{children:["Optional information provided by the Task Worker SDK for debugging. Usually, if set it contains a stacktrace or it contains information logged via ",(0,r.jsx)(s.code,{children:"WorkerContext#log()"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"schedule_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the TaskAttempt was scheduled on the Task Queue. Not set for a TaskAttempt that is in the TASK_PENDING status; for example, when waiting between retries with exponential backoff."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the TaskAttempt was pulled off the queue and sent to a TaskWorker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the TaskAttempt was finished (either completed, reported as failed, or timed out)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"EXPERIMENTAL: the ID of the Task Worker who executed this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_worker_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The version of the Task Worker that executed the TaskAttempt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"The status of this TaskAttempt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"output"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"Denotes the Task Function executed properly and returned an output."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskerror",children:"LHTaskError"})}),(0,r.jsx)(s.td,{children:"An unexpected technical error was encountered. May or may not be retriable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exception"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"result"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhtaskexception",children:"LHTaskException"})}),(0,r.jsx)(s.td,{children:"The Task Function encountered a business problem and threw a technical exception."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked_value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Indicates whether the result of the attempt field has been masked"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"tasknodereference",children:["Message ",(0,r.jsx)(s.code,{children:"TaskNodeReference"})]}),"\n",(0,r.jsx)(s.p,{children:"Reference to a NodeRun of type TASK which caused a TaskRun to be scheduled."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the NodeRun which caused this TASK to be scheduled."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrun",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A TaskRun resents a single instance of a TaskDef being executed."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskRun. Note that the TaskRunId contains the WfRunId."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskdefid",children:"TaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the TaskDef being executed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"attempts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskattempt",children:"TaskAttempt"})}),(0,r.jsx)(s.td,{children:"All attempts scheduled for this TaskRun. A TaskAttempt represents an occurrence of the TaskRun being put on a Task Queue to be executed by the Task Workers."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"input_variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#varnameandval",children:"VarNameAndVal"})}),(0,r.jsx)(s.td,{children:"The input variables to pass into this TaskRun. Note that this is a list and not a map, because ordering matters. Depending on the language implementation, not every LittleHorse Task Worker SDK has the ability to determine the names of the variables from the method signature, so we provide both names and ordering."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"source"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunsource",children:"TaskRunSource"})}),(0,r.jsx)(s.td,{children:"The source (in the WfRun) that caused this TaskRun to be created. Currently, this can be either a TASK node, or a User Task Action Task Trigger in a USER_TASK node (such as a task used to send reminders)."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"scheduled_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the TaskRun was scheduled."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskstatus",children:"TaskStatus"})}),(0,r.jsx)(s.td,{children:"The status of the TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timeout_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The timeout before LH considers a TaskAttempt to be timed out."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"total_attempts"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The maximum number of attempts that may be scheduled for this TaskRun. NOTE: setting total_attempts to 1 means that there are no retries."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exponential_backoff"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exponentialbackoffretrypolicy",children:"ExponentialBackoffRetryPolicy"})}),(0,r.jsx)(s.td,{children:"Optional backoff policy ."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"taskrunsource",children:["Message ",(0,r.jsx)(s.code,{children:"TaskRunSource"})]}),"\n",(0,r.jsx)(s.p,{children:"The source of a TaskRun; i.e. why it was scheduled."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_node"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_run_source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknodereference",children:"TaskNodeReference"})}),(0,r.jsx)(s.td,{children:"Reference to a NodeRun of type TASK which scheduled this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_trigger"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"task_run_source"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertasktriggerreference",children:"UserTaskTriggerReference"})}),(0,r.jsx)(s.td,{children:"Reference to the specific UserTaskRun trigger action which scheduled this TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec that is being executed. Always set in ScheduledTask.source so that the WorkerContext can know this information."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"varnameandval",children:["Message ",(0,r.jsx)(s.code,{children:"VarNameAndVal"})]}),"\n",(0,r.jsx)(s.p,{children:"A key-value pair of variable name and value."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The variable name."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The value of the variable for this TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsxs)(s.td,{children:["Indicates whether the content of the ",(0,r.jsx)(s.code,{children:"value"})," field has been masked"]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"assignusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"AssignUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Re-Assigns a UserTaskRun to a specific userId or userGroup."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The UserTaskRun to assign to a new user_id or user_group."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"override_claim"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"If override_claim is set to false and the UserTaskRun is already assigned to a user_id, then the request throws a FAILED_PRECONDITION error. If set to true, then the old claim is overriden and the UserTaskRun is assigned to the new user."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The new user_group to which the UserTaskRun is assigned. If not set, then the user_group of the UserTaskRun is actively unset by this request. At least one of the user_group and user_id must be set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The new user_id to which the UserTaskRun is assigned. If not set, then the user_id of the UserTaskRun is actively unset by this request. At least one of the user_group and user_id must be set."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"cancelusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"CancelUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Cancels a UserTaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The id of the UserTaskRun to cancel."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"completeusertaskrunrequest",children:["Message ",(0,r.jsx)(s.code,{children:"CompleteUserTaskRunRequest"})]}),"\n",(0,r.jsx)(s.p,{children:"Completes a UserTaskRun with provided values."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The id of UserTaskRun to complete."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#completeusertaskrunrequestresultsentry",children:"CompleteUserTaskRunRequest.ResultsEntry"})}),(0,r.jsx)(s.td,{children:"A map from UserTaskField.name to a VariableValue containing the results of the user filling out the form."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID of the user who executed the task."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"completeusertaskrunrequestresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"CompleteUserTaskRunRequest.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"saveusertaskrunprogressrequest",children:["Message ",(0,r.jsx)(s.code,{children:"SaveUserTaskRunProgressRequest"})]}),"\n",(0,r.jsxs)(s.p,{children:["Saves the results of a UserTaskRun and logs who saved the content.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)("li",{children:[" Throws FAILED_PRECONDITION if the UserTaskRun is in the ",(0,r.jsx)(s.code,{children:"DONE"})," or ",(0,r.jsx)(s.code,{children:"CANCELLED"})," state."]}),"\n",(0,r.jsxs)("li",{children:[" If ",(0,r.jsx)(s.code,{children:"policy"})," is set to ",(0,r.jsx)(s.code,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),", returns ",(0,r.jsx)(s.code,{children:"FAILED_PRECONDITION"})," if the\n",(0,r.jsx)(s.code,{children:"user_id"})," field of the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," does not match the ",(0,r.jsx)(s.code,{children:"user_id"})," of the request."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The id of UserTaskRun to save."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#saveusertaskrunprogressrequestresultsentry",children:"SaveUserTaskRunProgressRequest.ResultsEntry"})}),(0,r.jsx)(s.td,{children:"A map from UserTaskField.name to a VariableValue containing the results of the user filling out the form."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The ID of the user who saved the task."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"policy"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#saveusertaskrunprogressrequestsaveusertaskrunassignmentpolicy",children:"SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy"})}),(0,r.jsxs)(s.td,{children:["Configures how to handle ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," ownership when saving it."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"saveusertaskrunprogressrequestresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"SaveUserTaskRunProgressRequest.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskdef",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskDef"})]}),"\n",(0,r.jsx)(s.p,{children:"UserTaskDef is the metadata blueprint for UserTaskRuns."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["The name of the ",(0,r.jsx)(s.code,{children:"UserTaskDef"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The version of the ",(0,r.jsx)(s.code,{children:"UserTaskDef"}),". Only simple versioning is supported."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"description"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Metadata field that does not impact WfRun execution. Useful for providing context on the UserTaskRun, for example when displaying it on a general-purpose task manager application."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fields"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskfield",children:"UserTaskField"})}),(0,r.jsx)(s.td,{children:"These are the fields comprise the User Task. A User Task Manager application, or any application used to complete a UserTaskRun, should inspect these fields and display form entries for each one."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the UserTaskRun was created."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskevent",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent"})]}),"\n",(0,r.jsxs)(s.p,{children:["This is an event stored in the audit log of a ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," purely for observability\npurposes."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"the time the event occurred."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_executed"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutetaskexecuted",children:"UserTaskEvent.UTETaskExecuted"})}),(0,r.jsx)(s.td,{children:"Denotes that a TaskRun was scheduled via a trigger."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"assigned"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventuteassigned",children:"UserTaskEvent.UTEAssigned"})}),(0,r.jsx)(s.td,{children:"Denotes that the UserTaskRun was assigned."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"cancelled"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutecancelled",children:"UserTaskEvent.UTECancelled"})}),(0,r.jsx)(s.td,{children:"Denotes that the UserTaskRun was cancelled."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"saved"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"event"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutesaved",children:"UserTaskEvent.UTESaved"})}),(0,r.jsxs)(s.td,{children:["Denotes that the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," was saved."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventuteassigned",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTEAssigned"})]}),"\n",(0,r.jsx)(s.p,{children:"Message denoting that the UserTaskRun was assigned."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_id before the ownership change, if set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_group before the ownership change, if set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_id after the ownership change, if set."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_group after the ownership change, if set."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutecancelled",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTECancelled"})]}),"\n",(0,r.jsxs)(s.p,{children:["Empty message used to denote that the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," was cancelled."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutesaved",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTESaved"})]}),"\n",(0,r.jsxs)(s.p,{children:["Message to denote that the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," was saved."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The user_id of the user who saved the UserTaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskeventutesavedresultsentry",children:"UserTaskEvent.UTESaved.ResultsEntry"})}),(0,r.jsx)(s.td,{children:"The results that were saved."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutesavedresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTESaved.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskeventutetaskexecuted",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskEvent.UTETaskExecuted"})]}),"\n",(0,r.jsxs)(s.p,{children:["Message to denote that a ",(0,r.jsx)(s.code,{children:"TaskRun"})," was scheduled by a trigger for this UserTaskRun."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task_run"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#taskrunid",children:"TaskRunId"})}),(0,r.jsxs)(s.td,{children:["The ",(0,r.jsx)(s.code,{children:"TaskRunId"})," of the scheduled ",(0,r.jsx)(s.code,{children:"TaskRun"})]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskfield",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskField"})]}),"\n",(0,r.jsx)(s.p,{children:"A UserTaskField is a specific field of data to be entered into a UserTaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the field. When a UserTaskRun is completed, the NodeOutput is a single-level JSON_OBJ. Each key is the name of the field. Must be unique."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"The type of the output. Must be a primitive type (STR, BOOL, INT, DOUBLE)."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"description"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Optional description which can be displayed by the User Task UI application. Does not affect WfRun execution."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"display_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name to be displayed by the User Task UI application. Does not affect WfRun execution."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"required"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether this field is required for UserTaskRun completion."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrun",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRun"})]}),"\n",(0,r.jsxs)(s.p,{children:["A UserTaskRun is a running instance of a UserTaskDef. It is created when a\nThreadRun arrives at a Node of type ",(0,r.jsx)(s.code,{children:"USER_TASK"}),"."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunid",children:"UserTaskRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskdefid",children:"UserTaskDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the UserTaskDef that this UserTaskRun comes from."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Denotes the UserTaskRun as belonging to a specific User Group.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"The ",(0,r.jsx)(s.code,{children:"user_group"})," does not refer to a group that is stored in LittleHorse; rather, it is the responsibility of the application to keep track of user/group identity and ensure that the user_group does indeed exist.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Either ",(0,r.jsx)(s.code,{children:"user_id"})," or ",(0,r.jsx)(s.code,{children:"user_group"})," or both are set at any time."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Denotes the UserTaskRun as assigned to a specific User ID. If this is set, then the UserTaskRun is either in the ASSIGNED, DONE, or CANCELLED status.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"The ",(0,r.jsx)(s.code,{children:"user_id"})," does not refer to a User that is stored in LittleHorse; rather, it is the responsibility of the application to keep track of user identity and ensure that the user_id does indeed exist.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Either ",(0,r.jsx)(s.code,{children:"user_id"})," or ",(0,r.jsx)(s.code,{children:"user_group"})," or both are set at any time."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"results"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunresultsentry",children:"UserTaskRun.ResultsEntry"})}),(0,r.jsxs)(s.td,{children:["The results of the UserTaskRun. Empty if the UserTaskRun has not yet been completed. Each key in this map is the ",(0,r.jsx)(s.code,{children:"name"})," of a corresponding ",(0,r.jsx)(s.code,{children:"UserTaskField"})," on the UserTaskDef."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskrunstatus",children:"UserTaskRunStatus"})}),(0,r.jsx)(s.td,{children:"Status of the UserTaskRun. Can be UNASSIGNED, ASSIGNED, DONE, or CANCELLED."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"events"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertaskevent",children:"UserTaskEvent"})}),(0,r.jsx)(s.td,{children:"A list of events that have happened. Used for auditing information."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"notes"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Notes about this UserTaskRun that are ",(0,r.jsx)(s.strong,{children:"specific to the WfRun"}),". These notes are set by the WfSpec based on variables inside the specific ",(0,r.jsx)(s.code,{children:"WfRun"})," and are intended to be displayed on the User Task Manager application. They do not affect WfRun execution."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"scheduled_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the UserTaskRun was created/scheduled."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"The NodeRun with which the UserTaskRun is associated."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"epoch"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Current observed epoch of the UserTaskRun, related to the number of times it has been updated or re-assigned. Used internally to implement automated reassignment and reminder tasks."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertaskrunresultsentry",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskRun.ResultsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertasktriggerreference",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskTriggerReference"})]}),"\n",(0,r.jsx)(s.p,{children:'All TaskRun\'s have a "trigger reference" which refers to the WfRun Element that\ncaused the TaskRun to be scheduled. For example, a TaskRun on a regular TASK_NODE\nhas a TaskNodeReference.'}),"\n",(0,r.jsx)(s.p,{children:'The UserTaskTriggerReference serves as the "Trigger Reference" for a TaskRun that\nwas scheduled by a lifecycle hook on a UserTaskRun (eg. a reminder task).'}),"\n",(0,r.jsx)(s.p,{children:"The UserTaskTriggerReference is most useful in the WorkerContext of the Task Worker\nSDK, which allows the Task Method to determine where the TaskRun comes from."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#noderunid",children:"NodeRunId"})}),(0,r.jsx)(s.td,{children:"Is the NodeRun that the UserTaskRun belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_event_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["Is the index in the ",(0,r.jsx)(s.code,{children:"events"})," field of the UserTaskRun that the TaskRun corresponds to."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the user_id that the UserTaskRun is assigned to. Unset if UserTaskRun is not asigned to a specific user_id."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Is the user_id that the UserTaskRun is assigned to. Unset if UserTaskRun is not asigned to a specific user_id."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variable",children:["Message ",(0,r.jsx)(s.code,{children:"Variable"})]}),"\n",(0,r.jsx)(s.p,{children:"A Variable is an instance of a variable assigned to a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableid",children:"VariableId"})}),(0,r.jsx)(s.td,{children:"ID of this Variable. Note that the VariableId contains the relevant WfRunId inside it, the threadRunNumber, and the name of the Variabe."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The value of this Variable."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"When the Variable was created."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec that this Variable belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"masked"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Marks a variable to show masked values"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"variablevalue",children:["Message ",(0,r.jsx)(s.code,{children:"VariableValue"})]}),"\n",(0,r.jsx)(s.p,{children:"VariableValue is a structure containing a value in LittleHorse. It can be\nused to pass input variables into a WfRun/ThreadRun/TaskRun/etc, as output\nfrom a TaskRun, as the value of a WfRun's Variable, etc."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_obj"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A String representing a serialized json object."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_arr"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A String representing a serialized json list."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"double"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"double"}),(0,r.jsx)(s.td,{children:"A 64-bit floating point number."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bool"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"A boolean."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"str"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"A string."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"int"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsxs)(s.td,{children:["The ",(0,r.jsx)(s.code,{children:"INT"})," variable type is stored as a 64-bit integer. The ",(0,r.jsx)(s.code,{children:"INT"})," can be cast to a ",(0,r.jsx)(s.code,{children:"DOUBLE"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bytes"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"value"})]}),(0,r.jsx)(s.td,{children:"bytes"}),(0,r.jsx)(s.td,{children:"An arbitrary String of bytes."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failurebeinghandled",children:["Message ",(0,r.jsx)(s.code,{children:"FailureBeingHandled"})]}),"\n",(0,r.jsx)(s.p,{children:"Points to the Failure that is currently being handled in the ThreadRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The thread run number."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The position of the NodeRun causing the failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The number of the failure."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"handlingfailurehaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"HandlingFailureHaltReason"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted while a Failure Handler is being run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the Failure Handler ThreadRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"interrupted",children:["Message ",(0,r.jsx)(s.code,{children:"Interrupted"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted because it is waiting for the\ninterrupt handler threadRun to run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupt_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the Interrupt Handler ThreadRun."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"manualhalt",children:["Message ",(0,r.jsx)(s.code,{children:"ManualHalt"})]}),"\n",(0,r.jsxs)(s.p,{children:["A Halt Reason denoting that a ThreadRun was halted manually, via the ",(0,r.jsx)(s.code,{children:"rpc StopWfRun"})," request."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"meaning_of_life"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Nothing to store."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"parenthalted",children:["Message ",(0,r.jsx)(s.code,{children:"ParentHalted"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted because its parent is also HALTED."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the halted parent."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendingfailurehandler",children:["Message ",(0,r.jsx)(s.code,{children:"PendingFailureHandler"})]}),"\n",(0,r.jsx)(s.p,{children:"Represents a Failure Handler that is pending to be run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failed_thread_run"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ThreadRun that failed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to run to handle the failure."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendingfailurehandlerhaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"PendingFailureHandlerHaltReason"})]}),"\n",(0,r.jsxs)(s.p,{children:["A Halt Reason denoting that a ThreadRun is halted while a Failure Handler is ",(0,r.jsx)(s.em,{children:"enqueued"})," to be\nrun."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_run_position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The position of the NodeRun which threw the failure."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendinginterrupt",children:["Message ",(0,r.jsx)(s.code,{children:"PendingInterrupt"})]}),"\n",(0,r.jsx)(s.p,{children:"Represents an ExternalEvent that has a registered Interrupt Handler for it\nand which is pending to be sent to the relevant ThreadRun's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEvent triggering the Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to run to handle the Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupted_thread_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The ID of the ThreadRun to interrupt. Must wait for this ThreadRun to be HALTED before running the Interrupt Handler."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"pendinginterrupthaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"PendingInterruptHaltReason"})]}),"\n",(0,r.jsx)(s.p,{children:"A Halt Reason denoting that a ThreadRun is halted while waiting for an Interrupt handler\nto be run."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"The ExternalEventId that caused the Interrupt."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadhaltreason",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadHaltReason"})]}),"\n",(0,r.jsxs)(s.p,{children:["Denotes a reason why a ThreadRun is halted. See ",(0,r.jsx)(s.code,{children:"ThreadRun.halt_reasons"})," for context."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_halted"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#parenthalted",children:"ParentHalted"})}),(0,r.jsx)(s.td,{children:"Parent threadRun halted."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupted"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#interrupted",children:"Interrupted"})}),(0,r.jsx)(s.td,{children:"Handling an Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_interrupt"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendinginterrupthaltreason",children:"PendingInterruptHaltReason"})}),(0,r.jsx)(s.td,{children:"Waiting to handle Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_failure"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendingfailurehandlerhaltreason",children:"PendingFailureHandlerHaltReason"})}),(0,r.jsx)(s.td,{children:"Waiting to handle a failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handling_failure"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#handlingfailurehaltreason",children:"HandlingFailureHaltReason"})}),(0,r.jsx)(s.td,{children:"Handling a failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"manual_halt"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"reason"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#manualhalt",children:"ManualHalt"})}),(0,r.jsx)(s.td,{children:"Manually stopped the WfRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadrun",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A ThreadRun is a running thread of execution within a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The current WfSpecId of this ThreadRun. This must be set explicitly because during a WfSpec Version Migration, it is possible for different ThreadSpec's to have different WfSpec versions."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The number of the ThreadRun. This is an auto-incremented integer corresponding to the chronological ordering of when the ThreadRun's were created. If you have not configured any retention policy for the ThreadRun's (i.e. never clean them up), then this also corresponds to the position of the ThreadRun in the WfRun's ",(0,r.jsx)(s.code,{children:"thread_runs"})," list."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The status of the ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec being run."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ThreadRun was started."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the ThreadRun was completed or failed. Unset if still active."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"error_message"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human-readable error message detailing what went wrong in the case of a failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"child_thread_ids"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"List of thread_run_number's for all child thread_runs."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_thread_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"Set for every ThreadRun except the ENTRYPOINT. This is the id of the parent thread."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"halt_reasons"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadhaltreason",children:"ThreadHaltReason"})}),(0,r.jsx)(s.td,{children:'If the ThreadRun is HALTED, this contains a list of every reason for which the ThreadRun is HALTED. Once every reason is "resolved" (and thus removed from the list), then the ThreadRun will return to the RUNNING state.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupt_trigger_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventid",children:"ExternalEventId"})}),(0,r.jsx)(s.td,{children:"If this ThreadRun is of type INTERRUPT_HANDLER, this field is set to the ID of the ExternalEvent that caused the Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_being_handled"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurebeinghandled",children:"FailureBeingHandled"})}),(0,r.jsx)(s.td,{children:"If this ThreadRun is of type FAILURE_HANDLER, this field is set to the exact Failure that is being handled by this ThreadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"current_node_position"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["This is the current ",(0,r.jsx)(s.code,{children:"position"})," of the current NodeRun being run. This is an auto-incremented field that gets incremented every time we run a new NodeRun."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handled_failed_children"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["List of every child ThreadRun which both a) failed, and b) was properly handled by a Failure Handler.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),'This is important because at the EXIT node, if a Child ThreadRun was discovered to have failed, then this ThreadRun (the parent) also fails with the same failure as the child. If, however, a Failure Handler had previously "handled" the Child Failure, that ThreadRun\'s number is appended to this list, and then the EXIT node ignores that ThreadRun.']})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadtype",children:"ThreadType"})}),(0,r.jsx)(s.td,{children:"The Type of this ThreadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfrun",children:["Message ",(0,r.jsx)(s.code,{children:"WfRun"})]}),"\n",(0,r.jsx)(s.p,{children:"A WfRun is a running instance of a WfSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunid",children:"WfRunId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"The ID of the WfSpec that this WfRun belongs to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"old_wf_spec_versions"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsx)(s.td,{children:"When a WfRun is migrated from an old verison of a WfSpec to a newer one, we add the old WfSpecId to this list for historical auditing and debugging purposes."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#lhstatus",children:"LHStatus"})}),(0,r.jsx)(s.td,{children:"The status of this WfRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"greatest_threadrun_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsxs)(s.td,{children:["The ID number of the greatest ThreadRUn in this WfRun. The total number of ThreadRuns is given by greatest_thread_run_number + 1.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Introduced now since with ThreadRun-level retention, we can't rely upon thread_runs.size() to determine the number of ThreadRuns, as a ThreadRun is removed from the thread_runs list once its retention period expires."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_time"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the WfRun was started."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"end_time"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time the WfRun failed or completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_runs"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadrun",children:"ThreadRun"})}),(0,r.jsx)(s.td,{children:"A list of all active ThreadRun's and terminated ThreadRun's whose retention periods have not yet expired."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_interrupts"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendinginterrupt",children:"PendingInterrupt"})}),(0,r.jsx)(s.td,{children:"A list of Interrupt events that will fire once their appropriate ThreadRun's finish halting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"pending_failures"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#pendingfailurehandler",children:"PendingFailureHandler"})}),(0,r.jsx)(s.td,{children:"A list of pending failure handlers which will fire once their appropriate ThreadRun's finish halting."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"edge",children:["Message ",(0,r.jsx)(s.code,{children:"Edge"})]}),"\n",(0,r.jsx)(s.p,{children:"The Edge is the line in the workflow that connects one Node to another."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"sink_node_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the Node that the Edge points to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"condition"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#edgecondition",children:"EdgeCondition"})}),(0,r.jsxs)(s.td,{children:["The Condition on which this Edge will be traversed. When choosing an Edge to travel after the completion of a NodeRun, the Edges are evaluated in order. The first one to either have no condition or have a condition which evaluates to ",(0,r.jsx)(s.code,{children:"true"})," is taken."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_mutations"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablemutation",children:"VariableMutation"})}),(0,r.jsx)(s.td,{children:"Ordered list of Variable Mutations to execute when traversing this Edge."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"edgecondition",children:["Message ",(0,r.jsx)(s.code,{children:"EdgeCondition"})]}),"\n",(0,r.jsx)(s.p,{children:"This is a boolean expression used to evaluate whether an Edge is valid."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"comparator"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#comparator",children:"Comparator"})}),(0,r.jsx)(s.td,{children:"The Operator used to evaluate the left versus the right."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"left"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"The left side of the boolean expression."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"right"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"The right side of the Boolean Expression."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"entrypointnode",children:["Message ",(0,r.jsx)(s.code,{children:"EntrypointNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines the beginning of the ThreadRun execution."}),"\n",(0,r.jsx)(s.p,{children:"Output is NULL"}),"\n",(0,r.jsxs)(s.h3,{id:"exitnode",children:["Message ",(0,r.jsx)(s.code,{children:"ExitNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines the end of the ThreadRun execution."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_def"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failuredef",children:"FailureDef"})}),(0,r.jsxs)(s.td,{children:["If set, this ExitNode throws the specified Failure upon arrival. Note that Failures are propagated up to the parent ThreadRun (or cause the entire WfRun to fail if sent by the entrypoint ThreadRun).",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If this is not set, then a ThreadRun arriving at this Exit Node will be COMPLETED."]})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"externaleventnode",children:["Message ",(0,r.jsx)(s.code,{children:"ExternalEventNode"})]}),"\n",(0,r.jsx)(s.p,{children:"An ExternalEventNode causes the WfRun to stop and wait for an ExternalEvent\nto arrive before continuing onwards."}),"\n",(0,r.jsx)(s.p,{children:"The output is just the content of the ExternalEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef that we are waiting for."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timeout_seconds"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Determines the maximum amount of time that the NodeRun will wait for the ExternalEvent to arrive."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failuredef",children:["Message ",(0,r.jsx)(s.code,{children:"FailureDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines a Failure that can be thrown."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The code for the failure. If in UPPER_CASE, it must be one of the LHErrorType enums, and represents an ERROR. If it is in kebab-case, then it is a user-defined EXCEPTION."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"message"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Human-readable message denoting why the Failure occurred."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"If specified, the thrown Failure will have this content."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"failurehandlerdef",children:["Message ",(0,r.jsx)(s.code,{children:"FailureHandlerDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Specifies a Failure Handler which can run in case of a certain Failure to allow\nthe ThreadRun to run compensatory logic and gracefully continue rather than\nfailing immediately."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to run as a"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"specific_failure"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"failure_to_catch"})]}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Specifies that this FailureHandlerDef will be triggered for a Failure with this exact name.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"If this and ",(0,r.jsx)(s.code,{children:"specific_failure"})," are both unset, then any failure is caught."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"any_failure_of_type"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"failure_to_catch"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurehandlerdeflhfailuretype",children:"FailureHandlerDef.LHFailureType"})}),(0,r.jsx)(s.td,{children:"Specifies that this FailureHandlerDef will be triggered for any failure matching this type (ERROR or EXCEPTION)."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"interruptdef",children:["Message ",(0,r.jsx)(s.code,{children:"InterruptDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines an Interrupt for a ThreadSpec. An Interrupt means that when an ExternalEvent\nof a certain type is registered to the WfRun, then the affected ThreadRun is HALTED\nand a handler ThreadRun is run as an interrupt handler. The interrupted ThreadRun\nis resumed once the interrupt handler completes."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventdefid",children:"ExternalEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the ExternalEventDef which triggers an Interrupt for this ThreadSpec. Note that as of 0.9.0, you cannot use an ExternalEventDefId for both an InterruptDef and an ExternalEventNode in the same WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"handler_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec that we run as the interrupt handler."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"jsonindex",children:["Message ",(0,r.jsx)(s.code,{children:"JsonIndex"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines an index to make a JSON_OBJ or JSON_ARR variable searchable over a specific\nJSON Path."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"field_path"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Denotes the path in JSONPath format (according to the Java Jayway library) that has a field we should index."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"field_type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"Is the type of the field we are indexing."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"node",children:["Message ",(0,r.jsx)(s.code,{children:"Node"})]}),"\n",(0,r.jsx)(s.p,{children:"A Node is a step in a ThreadRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"outgoing_edges"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#edge",children:"Edge"})}),(0,r.jsx)(s.td,{children:"Defines the flow of execution and determines where the ThreadRun goes next."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"failure_handlers"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurehandlerdef",children:"FailureHandlerDef"})}),(0,r.jsx)(s.td,{children:"Specifies handlers for failures (EXCEPTION or ERROR or both) which might be thrown by the NodeRun. If a Failure is thrown by the Node execution, then the first matching Failure Handler (if present) is run. If there is a matching Failure Handler and it runs to completion, then the ThreadRun advances from the Node; else, it fails."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#entrypointnode",children:"EntrypointNode"})}),(0,r.jsx)(s.td,{children:"Creates an EntrypointRun. Every ThreadRun has one Entrypoint node."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"exit"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#exitnode",children:"ExitNode"})}),(0,r.jsx)(s.td,{children:"Creates an `ExitRun``. Every ThreadSpec has at least one Exit Node."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#tasknode",children:"TaskNode"})}),(0,r.jsx)(s.td,{children:"Creates a TaskNodeRUn"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"external_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#externaleventnode",children:"ExternalEventNode"})}),(0,r.jsx)(s.td,{children:"Creates an ExternalEventNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_thread"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startthreadnode",children:"StartThreadNode"})}),(0,r.jsx)(s.td,{children:"Creates a StartThreadNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_for_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsnode",children:"WaitForThreadsNode"})}),(0,r.jsx)(s.td,{children:"Creates a WaitForThreadsNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"nop"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#nopnode",children:"NopNode"})}),(0,r.jsx)(s.td,{children:"Creates a NopNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"sleep"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#sleepnode",children:"SleepNode"})}),(0,r.jsx)(s.td,{children:"Creates a SleepNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#usertasknode",children:"UserTaskNode"})}),(0,r.jsx)(s.td,{children:"Creates a UserTaskNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"start_multiple_threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startmultiplethreadsnode",children:"StartMultipleThreadsNode"})}),(0,r.jsx)(s.td,{children:"Creates a StartMultipleThreadsNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"throw_event"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#throweventnode",children:"ThrowEventNode"})}),(0,r.jsx)(s.td,{children:"Creates a ThrowEventNodeRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wait_for_condition"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"node"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforconditionnode",children:"WaitForConditionNode"})}),(0,r.jsx)(s.td,{children:"Creates a WaitForConditionRun"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"nodemigration",children:["Message ",(0,r.jsx)(s.code,{children:"NodeMigration"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: Specification for migrating a WfRun from a Node in one WfSpec\nto a Node in another WfSpec version."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_node_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the Node on the new WfSpec to move to."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"nopnode",children:["Message ",(0,r.jsx)(s.code,{children:"NopNode"})]}),"\n",(0,r.jsx)(s.p,{children:"NOP node has no operations and is used for conditional branching."}),"\n",(0,r.jsxs)(s.h3,{id:"sleepnode",children:["Message ",(0,r.jsx)(s.code,{children:"SleepNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Sleep Node causes the WfRun to wait a specified time and then resume."}),"\n",(0,r.jsx)(s.p,{children:"There is no output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"raw_seconds"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"sleep_length"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Sleeps the specified number of seconds."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"timestamp"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"sleep_length"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Sleeps until the ",(0,r.jsx)(s.code,{children:"long"})," timestamp (epoch millis) specified here."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"iso_date"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"sleep_length"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Sleeps until the ISO-formatted date specified here."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startmultiplethreadsnode",children:["Message ",(0,r.jsx)(s.code,{children:"StartMultipleThreadsNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Iterates over a JSON_ARR and starts a Child ThreadRun for each element in the\nlist."}),"\n",(0,r.jsx)(s.p,{children:"Returns a JSON_ARR containing the thread_run_number of each spawned child."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to spawn."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startmultiplethreadsnodevariablesentry",children:"StartMultipleThreadsNode.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"Variables which are passed into the child ThreadRuns. These assignments are the same for all spawned threads."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"iterable"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Assignment that resolves to a JSON_ARR. For each element in the list, a child ThreadRun is started. The reserved ",(0,r.jsx)(s.code,{children:"INPUT"})," variable for each Child is set to the corresponding item in the list."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startmultiplethreadsnodevariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"StartMultipleThreadsNode.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startthreadnode",children:["Message ",(0,r.jsx)(s.code,{children:"StartThreadNode"})]}),"\n",(0,r.jsx)(s.p,{children:"Starts a Child ThreadRun with a specific ThreadSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec to spawn."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variables"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#startthreadnodevariablesentry",children:"StartThreadNode.VariablesEntry"})}),(0,r.jsx)(s.td,{children:"The input variables to pass into the Child ThreadRun."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"startthreadnodevariablesentry",children:["Message ",(0,r.jsx)(s.code,{children:"StartThreadNode.VariablesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadretentionpolicy",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadRetentionPolicy"})]}),"\n",(0,r.jsx)(s.p,{children:"ThreadRetentionPolicy specifies how long to keep record of a ThreadRun and its associated\nNodeRun's and TaskRun's and Variables after the ThreadRun has been completed."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"seconds_after_thread_termination"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"thread_gc_policy"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Delete associated ThreadRun's X seconds after they terminate, regardless of status."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspec",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpec"})]}),"\n",(0,r.jsx)(s.p,{children:"Defines a blueprint for a ThreadRun, which is a thread of execution inside a\nWfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"nodes"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspecnodesentry",children:"ThreadSpec.NodesEntry"})}),(0,r.jsx)(s.td,{children:"The Nodes inside this ThreadSpec. Maps from name to Node."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"variable_defs"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadvardef",children:"ThreadVarDef"})}),(0,r.jsx)(s.td,{children:"Defines Variables that are local to ThreadRun's of this ThreadSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"interrupt_defs"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#interruptdef",children:"InterruptDef"})}),(0,r.jsx)(s.td,{children:"Defines all interrupts for this ThreadSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadretentionpolicy",children:"ThreadRetentionPolicy"})}),(0,r.jsx)(s.td,{children:"Optional retention policy to clean up ThreadRun's of this ThreadSpec after they have been completed. This is important for long-lived WfRun's that could have hundreds of ThreadRun's, because a ThreadRun has a record inside the WfRun itself."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspecnodesentry",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpec.NodesEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#node",children:"Node"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspecmigration",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpecMigration"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: Specification for how to migrate a ThreadRun of a specific ThreadSpec\nfrom one WfSpec to another WfSpec version."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_thread_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"The name of the ThreadSpec in the new WfSpec that this ThreadSpec should migrate to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"node_migrations"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspecmigrationnodemigrationsentry",children:"ThreadSpecMigration.NodeMigrationsEntry"})}),(0,r.jsx)(s.td,{children:"Map from name of the nodes on the current ThreadSpec to the migration to perform on it to move it to a new WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadspecmigrationnodemigrationsentry",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadSpecMigration.NodeMigrationsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#nodemigration",children:"NodeMigration"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"threadvardef",children:["Message ",(0,r.jsx)(s.code,{children:"ThreadVarDef"})]}),"\n",(0,r.jsx)(s.p,{children:"Denotes a variable declaration at the ThreadSpec level."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"var_def"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabledef",children:"VariableDef"})}),(0,r.jsx)(s.td,{children:"Is the actual VariableDefinition containing name and type."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"required"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether the variable is required as input to the threadRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"searchable"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"bool"}),(0,r.jsx)(s.td,{children:"Whether this variable has an index configured."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"json_indexes"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#jsonindex",children:"JsonIndex"})}),(0,r.jsx)(s.td,{children:"Valid for JSON_OBJ and JSON_ARR variables only. List of JSON fields to index."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"access_level"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfrunvariableaccesslevel",children:"WfRunVariableAccessLevel"})}),(0,r.jsx)(s.td,{children:"The Access Level of this variable."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"throweventnode",children:["Message ",(0,r.jsx)(s.code,{children:"ThrowEventNode"})]}),"\n",(0,r.jsx)(s.p,{children:"A SubNode that throws a WorkflowEvent of a specific type. There is no output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"event_def_id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The WorkflowEventDefId of the WorkflowEvent that is thrown"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"A VariableAssignment defining the content of the WorkflowEvent that is thrown"})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"usertasknode",children:["Message ",(0,r.jsx)(s.code,{children:"UserTaskNode"})]}),"\n",(0,r.jsx)(s.p,{children:"The UserTaskNode creates a UserTaskRun, which is used to get input from a human\nuser into the workflow."}),"\n",(0,r.jsx)(s.p,{children:"The output is a JSON_OBJ variable with one key/value pair for each UserTaskField."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Denotes the name of the ",(0,r.jsx)(s.code,{children:"UserTaskDef"})," that should create the ",(0,r.jsx)(s.code,{children:"UserTaskRun"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_group"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Denotes the user_group to which the UserTaskRun is assigned upon creation."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_id"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Denotes the user_id to which the UserTaskRun is assigned upon creation."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"actions"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#utactiontrigger",children:"UTActionTrigger"})}),(0,r.jsx)(s.td,{children:'Specifies a list of actions that happen on various time-based triggers. Actions include reassigning the UserTaskRun, cancelling the UserTaskRun, or executing a "reminder" TaskRun.'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"user_task_def_version"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"If set, then the UserTaskRun will always have this specific version of the UserTaskDef. Otherwise, the UserTaskRun will have the latest version."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"notes"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Specifies the value to be displayed on the ",(0,r.jsx)(s.code,{children:"notes"})," field of the UserTaskRun."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"on_cancellation_exception_name"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Specifies the name of the exception thrown when the User Task is canceled. If not set, then the cancellation or timeout of a User Task Run throws an ERROR rather than an EXCEPTION."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforconditionnode",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForConditionNode"})]}),"\n",(0,r.jsx)(s.p,{children:"A SubNode that blocks until a condition is satisfied in the WfRun.\nThere is no output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"condition"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#edgecondition",children:"EdgeCondition"})}),(0,r.jsx)(s.td,{children:"The condition that this node will block for."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsnode",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsNode"})]}),"\n",(0,r.jsxs)(s.p,{children:["Specifies that a ThreadRun will wait for certain specified Child ThreadRun's to\ncomplete or fail before the WfRun continues. If one of the Child ThreadRun's\nthrows a Failure that is not caught by the ",(0,r.jsx)(s.code,{children:"per_thread_failure_handlers"}),",\nthen the Child ThreadRun's Failure is thrown by the WaitForThreadsRun."]}),"\n",(0,r.jsx)(s.p,{children:"No output."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"threads"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"threads_to_wait_for"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsnodethreadstowaitfor",children:"WaitForThreadsNode.ThreadsToWaitFor"})}),(0,r.jsx)(s.td,{children:"Specifies that the WaitForThreadsRun will wait for the threads specified here."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_list"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"threads_to_wait_for"})]}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsxs)(s.td,{children:["Specifies that the WaitForThreadsRun will wait for a list of ThreadRun's contained in the JSON_ARR value specified here. Each element in the list must be an INT representing the ",(0,r.jsx)(s.code,{children:"number"})," of a ThreadRun that we're waiting for."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"per_thread_failure_handlers"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#failurehandlerdef",children:"FailureHandlerDef"})}),(0,r.jsxs)(s.td,{children:["If any of the child ThreadRun's that we are waiting for throw a Failure, we will evaluate it against these FailureHandlerDef's and run the first matching FailureHandler (if any). The FailureHandler will be a child of the child, which means that it has access to all of the variables in the scope of the failed Child ThreadRun.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"This is different from Node-level Failure Handlers, which would be ",(0,r.jsx)(s.em,{children:"siblings"})," of the ThreadRuns that we're waiting for, and would run only when the overall nodeRun has failed."]})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsnodethreadtowaitfor",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsNode.ThreadToWaitFor"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_run_number"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variableassignment",children:"VariableAssignment"})}),(0,r.jsx)(s.td,{children:"Causes the WaitForThreadsNodeRun to wait for the ThreadRun whose number matches the value specified here. Must resolve to an INT."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"waitforthreadsnodethreadstowaitfor",children:["Message ",(0,r.jsx)(s.code,{children:"WaitForThreadsNode.ThreadsToWaitFor"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"threads"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#waitforthreadsnodethreadtowaitfor",children:"WaitForThreadsNode.ThreadToWaitFor"})}),(0,r.jsx)(s.td,{children:"Wait for one or more ThreadRun's"})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspec",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpec"})]}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.code,{children:"WfSpec"})," defines the logic for a workflow in LittleHorse. It is a metadata object\nand is a blueprint for a ",(0,r.jsx)(s.code,{children:"WfRun"})," execution."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecid",children:"WfSpecId"})}),(0,r.jsxs)(s.td,{children:["The ID of the ",(0,r.jsx)(s.code,{children:"WfSpec"}),". Note that this ID is versioned with both a major version and a minor revision. Creating new WfSpec's with the same name and different specifications results in a completely new ",(0,r.jsx)(s.code,{children:"WfSpec"})," object whose ",(0,r.jsx)(s.code,{children:"id.name"})," is the same but with different version."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsxs)(s.td,{children:["The timestamp at which the ",(0,r.jsx)(s.code,{children:"WfSpec"})," was created."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"frozen_variables"})}),(0,r.jsx)(s.td,{children:"repeated"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadvardef",children:"ThreadVarDef"})}),(0,r.jsx)(s.td,{children:"Variables whose types cannot be changed without causing a Breaking Change between the versions."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"status"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#metadatastatus",children:"MetadataStatus"})}),(0,r.jsxs)(s.td,{children:["The Status of the ",(0,r.jsx)(s.code,{children:"WfSpec"}),". Currently, only ",(0,r.jsx)(s.code,{children:"ACTIVE"})," exists. This field will be used in the future when de-commissioning a WfSpec gracefully."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_specs"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecthreadspecsentry",children:"WfSpec.ThreadSpecsEntry"})}),(0,r.jsxs)(s.td,{children:["The various ThreadSpec's in this ",(0,r.jsx)(s.code,{children:"WfSpec"}),". Each ",(0,r.jsx)(s.code,{children:"ThreadSpec"})," defines a blueprint for a parallel thread of execution (a ",(0,r.jsx)(s.code,{children:"ThreadRun"}),"). They are referred to by their names."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"entrypoint_thread_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["The name of the ",(0,r.jsx)(s.code,{children:"ENTRYPOINT"})," ThreadSpec. The Entrypoint is the ",(0,r.jsx)(s.code,{children:"ThreadSpec"})," for the Entrypoint ThreadRun, which is the ",(0,r.jsx)(s.code,{children:"ThreadRun"})," that is created upon starting the ",(0,r.jsx)(s.code,{children:"WfRun"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"retention_policy"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workflowretentionpolicy",children:"WorkflowRetentionPolicy"})}),(0,r.jsxs)(s.td,{children:["Optional policy that configures cleaning up old ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s after they are completed or failed. Recommended for production settings to avoid running out of disk space; unless you are using a ",(0,r.jsx)(s.code,{children:"WfRun"})," as a data record, in which case the application should clean up ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s as appropriate."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"migration"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecversionmigration",children:"WfSpecVersionMigration"})}),(0,r.jsxs)(s.td,{children:["EXPERIMENTAL: ongoing migration from one version of a ",(0,r.jsx)(s.code,{children:"WfSpec"})," to another."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"parent_wf_spec"})}),(0,r.jsx)(s.td,{children:"optional"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecparentwfspecreference",children:"WfSpec.ParentWfSpecReference"})}),(0,r.jsx)(s.td,{children:"Reference to the parent WfSpec. If this is set, all WfRun's for this WfSpec must be the child of a WfRun belonging to the referenced WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecparentwfspecreference",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpec.ParentWfSpecReference"})]}),"\n",(0,r.jsxs)(s.p,{children:["Reference to another WfSpec. If a WfSpec has a ParentWfSpecReference, then all\nWfRun's for that WfSpec ",(0,r.jsx)(s.em,{children:"MUST"})," be the child of a WfRun of the provided WfSpec; meaning\nthat the RunWf RPC must provide a ",(0,r.jsx)(s.code,{children:"parent_wf_run_id"})," that belongs to the specified\nWfSpec."]}),"\n",(0,r.jsx)(s.p,{children:"Currently, only reference by names is supported."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_name"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{children:"Name of the Parent WfSpec"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"wf_spec_major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"FOR NOW: no validation of variables on parent. In the future we will pass wf_spec_major_version, but we should probably examine the rules for evolution in the future."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecthreadspecsentry",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpec.ThreadSpecsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspec",children:"ThreadSpec"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecversionmigration",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecVersionMigration"})]}),"\n",(0,r.jsx)(s.p,{children:"EXPERIMENTAL: Specification for how to migrate an in-flight WfRun from one WfSpec\nto another WfSpec version."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_major_version"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The major version of the WfSpec that we are migrating to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"new_revision"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"int32"}),(0,r.jsx)(s.td,{children:"The revision of the WfSpec that we are migrating to."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"thread_spec_migrations"})}),(0,r.jsx)(s.td,{children:"map"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#wfspecversionmigrationthreadspecmigrationsentry",children:"WfSpecVersionMigration.ThreadSpecMigrationsEntry"})}),(0,r.jsx)(s.td,{children:"Map from ThreadSpec name to a specifier determining how to migrate ThreadRun's to the new version of the WfSpec."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"wfspecversionmigrationthreadspecmigrationsentry",children:["Message ",(0,r.jsx)(s.code,{children:"WfSpecVersionMigration.ThreadSpecMigrationsEntry"})]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"key"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"value"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#threadspecmigration",children:"ThreadSpecMigration"})}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workflowretentionpolicy",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowRetentionPolicy"})]}),"\n",(0,r.jsx)(s.p,{children:"A WorkflowRetentionPolicy configures how long a WfRun is retained in the data store before\nbeing deleted after it is completed or failed."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"seconds_after_wf_termination"})}),(0,r.jsxs)(s.td,{children:["oneof ",(0,r.jsx)(s.code,{children:"wf_gc_policy"})]}),(0,r.jsx)(s.td,{children:"int64"}),(0,r.jsx)(s.td,{children:"Delete all WfRun's X seconds after they terminate, regardless of status."})]})})]}),"\n",(0,r.jsxs)(s.h3,{id:"workflowevent",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEvent"})]}),"\n",(0,r.jsxs)(s.p,{children:['A WorkflowEvent represents a "Thing That Happened" ',(0,r.jsx)(s.em,{children:"INSIDE"})," a WfRun. It is DIFFERENT from\nan ExternalEvent, because an ExternalEvent represents something that happened OUTSIDE the WfRun,\nand is used to send information to the WfRun."]}),"\n",(0,r.jsx)(s.p,{children:"In contrast, a WorkflowEvent is thrown by the WfRun and is used to send information to the outside\nworld."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventid",children:"WorkflowEventId"})}),(0,r.jsx)(s.td,{children:"The ID of the WorkflowEvent. Contains WfRunId and WorkflowEventDefId."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"content"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variablevalue",children:"VariableValue"})}),(0,r.jsx)(s.td,{children:"The content of the WorkflowEvent."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the WorkflowEvent was created."})]})]})]}),"\n",(0,r.jsxs)(s.h3,{id:"workfloweventdef",children:["Message ",(0,r.jsx)(s.code,{children:"WorkflowEventDef"})]}),"\n",(0,r.jsx)(s.p,{children:"The WorkflowEventDef defines the blueprint for a WorkflowEvent."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Field"}),(0,r.jsx)(s.th,{children:"Label"}),(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"id"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#workfloweventdefid",children:"WorkflowEventDefId"})}),(0,r.jsx)(s.td,{children:"The ID of the WorkflowEventDef. Contains the name of the WorkflowEventDef."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"created_at"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"google.protobuf.Timestamp"}),(0,r.jsx)(s.td,{children:"The time that the WorkflowEventDef was created at."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"type"})}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"#variabletype",children:"VariableType"})}),(0,r.jsx)(s.td,{children:"The type of 'content' thrown with a WorkflowEvent based on this WorkflowEventDef."})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"littlehorse-enums",children:"LittleHorse Enums"}),"\n",(0,r.jsx)(s.p,{children:"This section contains the enums defined by the LittleHorse API."}),"\n",(0,r.jsx)(s.h3,{id:"aclaction",children:"Enum ACLAction"}),"\n",(0,r.jsx)(s.p,{children:"Describes an Action that can be taken over a specific set of resources."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"READ"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Allows all RPC's that start with ",(0,r.jsx)(s.code,{children:"Get"}),", ",(0,r.jsx)(s.code,{children:"List"}),", and ",(0,r.jsx)(s.code,{children:"Search"})," in relation to the metadata (eg. ",(0,r.jsx)(s.code,{children:"TaskDef"})," for ",(0,r.jsx)(s.code,{children:"ACL_TASK"}),") or run data (eg. ",(0,r.jsx)(s.code,{children:"TaskRun"})," for ",(0,r.jsx)(s.code,{children:"ACL_TASK"}),")"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"RUN"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Allows RPC's that are needed for mutating the ",(0,r.jsx)(s.em,{children:"runs"})," of the resource. For example, ",(0,r.jsx)(s.code,{children:"RUN"})," over ",(0,r.jsx)(s.code,{children:"ACL_TASK"})," allows the ",(0,r.jsx)(s.code,{children:"ReportTask"})," and ",(0,r.jsx)(s.code,{children:"PollTask"})," RPC's, and ",(0,r.jsx)(s.code,{children:"RUN"})," over ",(0,r.jsx)(s.code,{children:"ACL_WORKFLOW"})," allows the ",(0,r.jsx)(s.code,{children:"RunWf"}),", ",(0,r.jsx)(s.code,{children:"DeleteWfRun"}),", ",(0,r.jsx)(s.code,{children:"StopWfRun"}),", and ",(0,r.jsx)(s.code,{children:"ResumeWfRun"})," RPC's."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WRITE_METADATA"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["Allows mutating metadata. For example, ",(0,r.jsx)(s.code,{children:"WRITE_METADATA"})," over ",(0,r.jsx)(s.code,{children:"ACL_WORKFLOW"})," allows mutating ",(0,r.jsx)(s.code,{children:"WfSpec"}),"s, and ",(0,r.jsx)(s.code,{children:"WRITE_METADATA"})," over ",(0,r.jsx)(s.code,{children:"ACL_TASK"})," allows mutating ",(0,r.jsx)(s.code,{children:"TaskDef"}),"s."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ALL_ACTIONS"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Allows all actions related to a resource."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"aclresource",children:"Enum ACLResource"}),"\n",(0,r.jsx)(s.p,{children:"Defines a resource type for ACL's."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_WORKFLOW"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"WfSpec"})," and ",(0,r.jsx)(s.code,{children:"WfRun"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_TASK"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"TaskDef"})," and ",(0,r.jsx)(s.code,{children:"TaskRun"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_EXTERNAL_EVENT"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"ExternalEventDef"})," and ",(0,r.jsx)(s.code,{children:"ExternalEvent"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_USER_TASK"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"UserTaskDef"})," and ",(0,r.jsx)(s.code,{children:"UserTaskRun"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_PRINCIPAL"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsxs)(s.td,{children:["Refers to the ",(0,r.jsx)(s.code,{children:"Principal"})," resource. Currently, the ",(0,r.jsx)(s.code,{children:"ACL_PRINCIPAL"})," permission is only valid in the ",(0,r.jsx)(s.code,{children:"global_acls"})," field of the ",(0,r.jsx)(s.code,{children:"Principal"}),". A ",(0,r.jsx)(s.code,{children:"Principal"})," who only has access to a specific Tenant cannot create othe Principals because a Principal is scoped to the Cluster, and not to a Tenant."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_TENANT"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsxs)(s.td,{children:["Refers to the ",(0,r.jsx)(s.code,{children:"Tenant"})," resource. The ",(0,r.jsx)(s.code,{children:"ACL_TENANT"})," permission is only valid in the ",(0,r.jsx)(s.code,{children:"global_acls"})," field of the ",(0,r.jsx)(s.code,{children:"Principal"}),". This is because the ",(0,r.jsx)(s.code,{children:"Tenant"})," resource is cluster-scoped."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_ALL_RESOURCES"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsxs)(s.td,{children:["Refers to all resources. In the ",(0,r.jsx)(s.code,{children:"global_acls"})," field, this includes ",(0,r.jsx)(s.code,{children:"Principal"})," and ",(0,r.jsx)(s.code,{children:"Tenant"})," resources. In the ",(0,r.jsx)(s.code,{children:"per_tenant_acls"})," field, this does not include ",(0,r.jsx)(s.code,{children:"Principal"})," and ",(0,r.jsx)(s.code,{children:"Tenant"})," since those are cluster-scoped resources."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_TASK_WORKER_GROUP"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsxs)(s.td,{children:["Refers to the ",(0,r.jsx)(s.code,{children:"TaskWorkerGroup"})," associated with a TaskDef"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACL_WORKFLOW_EVENT"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsxs)(s.td,{children:["Refers to ",(0,r.jsx)(s.code,{children:"WorkflowEventDef"})," and ",(0,r.jsx)(s.code,{children:"WorkflowEvent"})]})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"lherrortype",children:"Enum LHErrorType"}),"\n",(0,r.jsx)(s.p,{children:"This enum is all of the types of technical failure that can occur in a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"CHILD_FAILURE"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"A child ThreadRun failed with a technical ERROR."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"VAR_SUB_ERROR"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Failed substituting input variables into a NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"VAR_MUTATION_ERROR"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Failed mutating variables after a NodeRun successfully completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"USER_TASK_CANCELLED"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"A UserTaskRun was cancelled (EVOLVING: this will become a Business EXCEPTION)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TIMEOUT"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"A NodeRun failed due to a timeout."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_FAILURE"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"A TaskRun failed due to an unexpected error."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"VAR_ERROR"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"Wrapper for VAR_SUB_ERROR and VAR_MUTATION_ERROR"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_ERROR"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsx)(s.td,{children:"Wrapper for TASK_FALIURE and TIMEOUT"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"INTERNAL_ERROR"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"An unexpected LittleHorse Internal error occurred. This is not expected to happen."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"lhstatus",children:"Enum LHStatus"}),"\n",(0,r.jsx)(s.p,{children:"Status used for WfRun, ThreadRun, and NodeRun"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"STARTING"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"The entity is starting."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"RUNNING"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"The entity is running."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"COMPLETED"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"The entity is completed. This is a terminal state."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"HALTING"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsxs)(s.td,{children:["The entity will move to ",(0,r.jsx)(s.code,{children:"HALTED"})," as soon as all preconditions for halting are satisfied."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"HALTED"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"The entity is halted, either by user intervention or by the workflow scheduler."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ERROR"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"The entity has failed due to a technical failure, such as a type conversion error, a task timeout due to network failure, or a task worker crash."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXCEPTION"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"The entity has failed due to a business exception defined by the user."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"metadatastatus",children:"Enum MetadataStatus"}),"\n",(0,r.jsx)(s.p,{children:"Status of a Metadata Object, such as WfSpec or TaskDef"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ACTIVE"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"ACTIVE means the object can be used."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ARCHIVED"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"An ARCHIVED WfSpec can no longer be used to create new WfRun's, but existing WfRun's will be allowed to run to completion."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TERMINATING"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"A TERMINATING WfSpec is actively deleting all running WfRun's, and will self-destruct once all of its child WfRun's are terminated."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"metricswindowlength",children:"Enum MetricsWindowLength"}),"\n",(0,r.jsx)(s.p,{children:"Metrics"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"MINUTES_5"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"HOURS_2"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"DAYS_1"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"taskstatus",children:"Enum TaskStatus"}),"\n",(0,r.jsx)(s.p,{children:"Status of a TaskRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_SCHEDULED"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Scheduled in the Task Queue but not yet picked up by a Task Worker."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_RUNNING"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Picked up by a Task Worker, but not yet reported or timed out."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_SUCCESS"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Successfully completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_FAILED"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Task Worker reported a technical failure while attempting to execute the TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_TIMEOUT"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Task Worker did not report a result in time."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_OUTPUT_SERIALIZING_ERROR"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"Task Worker reported that it was unable to serialize the output of the TaskRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_INPUT_VAR_SUB_ERROR"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"Task Worker was unable to deserialize the input variables into appropriate language-specific objects to pass into the Task Function"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_EXCEPTION"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"Task Function business logic determined that there was a business exception."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK_PENDING"}),(0,r.jsx)(s.td,{children:"9"}),(0,r.jsx)(s.td,{children:'Refers to a TaskAttempt that is not yet scheduled. This happens when using retries with an ExponentialBackoffRetryPolicy: the TaskAttempt isn\'t supposed to be scheduled until it "matures", but it does already exist.'})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"variabletype",children:"Enum VariableType"}),"\n",(0,r.jsx)(s.p,{children:"Type of a Varaible in LittleHorse. Corresponds to the possible value type's of a\nVariableValue."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"JSON_OBJ"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["An object represented as a json string. ",(0,r.jsx)("br",{})]})]})})]}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"JSON_OBJ"})," variable allows you to store complex objects in the JSON format. When using the Java and GoLang SDK's, the ",(0,r.jsx)(s.code,{children:"JSON_OBJ"})," variable type is often used transparently to the user. For example, the Java Task Worker SDK can inspect your method signature and automatically deserialize an input variable into a POJO. |\n| JSON_ARR | 1 | The ",(0,r.jsx)(s.code,{children:"JSON_ARR"})," variable allows you to store collections of objects as a JSON array. The behavior is similar to the ",(0,r.jsx)(s.code,{children:"JSON_OBJ"})," variable type. |\n| DOUBLE | 2 | The ",(0,r.jsx)(s.code,{children:"DOUBLE"})," variable type is a 64-bit floating point number. It can be cast to an ",(0,r.jsx)(s.code,{children:"INT"}),". |\n| BOOL | 3 | Boolean denotes a simple boolean switch. |\n| STR | 4 | The ",(0,r.jsx)(s.code,{children:"STR"})," variable type is stored as a String. ",(0,r.jsx)(s.code,{children:"INT"}),", ",(0,r.jsx)(s.code,{children:"DOUBLE"}),", and ",(0,r.jsx)(s.code,{children:"BOOL"})," variables can be cast to a ",(0,r.jsx)(s.code,{children:"STR"}),". |\n| INT | 5 | The ",(0,r.jsx)(s.code,{children:"INT"})," variable type is stored as a 64-bit integer. The ",(0,r.jsx)(s.code,{children:"INT"})," can be cast to a ",(0,r.jsx)(s.code,{children:"DOUBLE"}),". |\n| BYTES | 6 | The ",(0,r.jsx)(s.code,{children:"BYTES"})," variable type allows you to store an arbitrary byte string. |"]}),"\n",(0,r.jsx)(s.h3,{id:"comparator",children:"Enum Comparator"}),"\n",(0,r.jsx)(s.p,{children:"Operator for comparing two values to create a boolean expression."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LESS_THAN"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:"<"}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"GREATER_THAN"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:">"}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LESS_THAN_EQ"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:"<="}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"GREATER_THAN_EQ"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsxs)(s.td,{children:["Equivalent to ",(0,r.jsx)(s.code,{children:">="}),". Only valid for primitive types (no JSON_OBJ or JSON_ARR)."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EQUALS"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"This is valid for any variable type, and is similar to .equals() in Java."})]})]})]}),"\n",(0,r.jsxs)(s.p,{children:["One note: if the RHS is a different type from the LHS, then LittleHorse will try to cast the RHS to the same type as the LHS. If the cast fails, then the ThreadRun fails with a VAR_SUB_ERROR. |\n| NOT_EQUALS | 5 | This is the inverse of ",(0,r.jsx)(s.code,{children:"EQUALS"})," |\n| IN | 6 | Only valid if the RHS is a JSON_OBJ or JSON_ARR. Valid for any type on the LHS."]}),"\n",(0,r.jsxs)(s.p,{children:["For the JSON_OBJ type, this returns true if the LHS is equal to a ",(0,r.jsx)(s.em,{children:"KEY"})," in the RHS. For the JSON_ARR type, it returns true if one of the elements of the RHS is equal to the LHS. |\n| NOT_IN | 7 | The inverse of IN. |"]}),"\n",(0,r.jsx)(s.h3,{id:"utactiontriggeruthook",children:"Enum UTActionTrigger.UTHook"}),"\n",(0,r.jsx)(s.p,{children:"Enumerates the different lifecycle hooks that can cause the timer to start running."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ON_ARRIVAL"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["The hook should be scheduled ",(0,r.jsx)(s.code,{children:"delay_seconds"})," after the UserTaskRun is created. This hook only causes the action to be scheduled once."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ON_TASK_ASSIGNED"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["The hook should be scheduled ",(0,r.jsx)(s.code,{children:"delay_seconds"}),' after the ownership of the UserTaskRun changes. This hook causes the Action to be scheduled one or more times. The first time is scheduled when the UserTaskRun is created, since we treat the change from "UserTaskRun is nonexistent" to "UserTaskRun is owned by a userId or userGroup" as a change in ownership.']})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"variablemutationtype",children:"Enum VariableMutationType"}),"\n",(0,r.jsx)(s.p,{children:"Enumerates the available operations to mutate a variable in a WfRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ASSIGN"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Set the variable specified by the LHS to the value of the RHS."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ADD"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Add the RHS to the LHS."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXTEND"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Append the RHS to the LHS (valid if the LHS is a STR or JSON_ARR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"SUBTRACT"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Subtract the RHS from the LHS (both must be INT or DOUBLE)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"MULTIPLY"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Multiply the LHS by the RHS (both must be INT or DOUBLE)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"DIVIDE"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"Divide the LHS by the RHS (both must be INT or DOUBLE)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"REMOVE_IF_PRESENT"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"Remove any occurrences of RHS from LHS (LHS must be JSON_ARR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"REMOVE_INDEX"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsx)(s.td,{children:"Remove item at index RHS from LHS (LHS must be JSON_ARR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"REMOVE_KEY"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"Remove the key specified by RHS from the LHS (LHS must be JSON_OBJ)"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"waitforthreadsrunwaitingthreadstatus",children:"Enum WaitForThreadsRun.WaitingThreadStatus"}),"\n",(0,r.jsx)(s.p,{children:"The status of a single ThreadRun that we are waiting for."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_IN_PROGRESS"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"The ThreadRun is in progress (i.e. not COMPLETED nor EXCEPTION nor ERROR)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_HANDLING_FAILURE"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"The ThreadRun failed with some failure, and the FailureHandler is running for that Failure."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_COMPLETED_OR_FAILURE_HANDLED"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:'We can mark this ThreadRun as "already waited for", meaning that either: 1. It completed successfully, OR 2. It failed, and the Failure Handler successfully completed'})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"THREAD_UNSUCCESSFUL"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"The ThreadRun did not complete successfully, and there wasn't a successful run of a Failure Handler for the Failure that was thrown."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"allowedupdatetype",children:"Enum AllowedUpdateType"}),"\n",(0,r.jsx)(s.p,{children:"This enum controls the behavior of a PutWfSpecRequest when a WfSpec with the same\nname previously exists."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ALL_UPDATES"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Allows any update: both minor (revsion) changes and breaking (majorVersion) changes are accepted"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"MINOR_REVISION_UPDATES"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Allows only backwards-compatible changes that do not change the required input variables or the searchable variables in the WfSpec."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"NO_UPDATES"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"Rejects any changes to the WfSpec."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"searchnoderunrequestnodetype",children:"Enum SearchNodeRunRequest.NodeType"}),"\n",(0,r.jsx)(s.p,{children:"This enum denotes the type of a NodeRun."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TASK"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"TASK node schedules a TaskRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXTERNAL_EVENT"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"EXTERNAL_EVENT blocks the ThreadRun until a specified ExternalEvent arrives"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ENTRYPOINT"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"ENTRYPOINT kicks off a ThreadRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EXIT"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"EXIT completes a ThreadRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"START_THREAD"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"START_THREAD creates a Child ThreadRun"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WAIT_THREADS"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"WAIT_THREADS waits for one or more child ThreadRuns to complete"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"SLEEP"}),(0,r.jsx)(s.td,{children:"6"}),(0,r.jsx)(s.td,{children:"SLEEP makes the ThreadRun sleep for a specified time"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"USER_TASK"}),(0,r.jsx)(s.td,{children:"7"}),(0,r.jsx)(s.td,{children:"USER_TASK creates a UserTaskRun and blocks until the UserTaskRun is completed."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"START_MULTIPLE_THREADS"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"START_MULTIPLE_THREADS iterates over a list and starts a Child Thread for each item"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"saveusertaskrunprogressrequestsaveusertaskrunassignmentpolicy",children:"Enum SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy"}),"\n",(0,r.jsxs)(s.p,{children:["Configures how to handle ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," ownership when saving it."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"If the UserTaskRun is already assigned to a user_id, then the request throws a FAILED_PRECONDITION error."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"IGNORE_CLAIM"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["If the UserTaskRun is already assigned to a user_id, then the request will leave the ",(0,r.jsx)(s.code,{children:"UserTaskRun"})," assigned to the current user but still update the ",(0,r.jsx)(s.code,{children:"results"})," and log in the ",(0,r.jsx)(s.code,{children:"events"})," who updated the results."]})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"usertaskrunstatus",children:"Enum UserTaskRunStatus"}),"\n",(0,r.jsx)(s.p,{children:"The status that a UserTaskRun can be in."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"UNASSIGNED"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Not assigned to a specific user yet."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ASSIGNED"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"Assigned to a specific user, but not completed or cancelled yet."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"DONE"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Done."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"CANCELLED"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Cancelled."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"threadtype",children:"Enum ThreadType"}),"\n",(0,r.jsx)(s.p,{children:"The type of a ThreadRUn."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ENTRYPOINT"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"The ENTRYPOINT ThreadRun. Exactly one per WfRun. Always has number == 0."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"CHILD"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsx)(s.td,{children:"A ThreadRun explicitly created by another ThreadRun via a START_THREAD or START_MULTIPLE_THREADS NodeRun."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"INTERRUPT"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsx)(s.td,{children:"A ThreadRun that was created to handle an Interrupt."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAILURE_HANDLER"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"A ThreadRun that was created to handle a Failure."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"failurehandlerdeflhfailuretype",children:"Enum FailureHandlerDef.LHFailureType"}),"\n",(0,r.jsx)(s.p,{children:"Specifies a type of Failure"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAILURE_TYPE_ERROR"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["FAILURE_TYPE_ERROR specifies any technical ",(0,r.jsx)(s.code,{children:"ERROR"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"FAILURE_TYPE_EXCEPTION"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["Specifies a user-defined, business-related ",(0,r.jsx)(s.code,{children:"EXCEPTION"}),"."]})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"wfrunvariableaccesslevel",children:"Enum WfRunVariableAccessLevel"}),"\n",(0,r.jsx)(s.p,{children:"Determines the Access Level for a Variable in a ThreadSpec/WfSpec."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Name"}),(0,r.jsx)(s.th,{children:"Number"}),(0,r.jsx)(s.th,{children:"Description"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"PUBLIC_VAR"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["A ",(0,r.jsx)(s.code,{children:"PUBLIC_VAR"})," can be accessed (read + mutated) by child ",(0,r.jsx)(s.code,{children:"WfRun"}),"'s."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"PRIVATE_VAR"}),(0,r.jsx)(s.td,{children:"1"}),(0,r.jsxs)(s.td,{children:["A ",(0,r.jsx)(s.code,{children:"PRIVATE_VAR"})," cannot be accessed by a child ",(0,r.jsx)(s.code,{children:"WfRun"}),"."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"INHERITED_VAR"}),(0,r.jsx)(s.td,{children:"2"}),(0,r.jsxs)(s.td,{children:["An ",(0,r.jsx)(s.code,{children:"INHERITED_VAR"})," is inherited from the parent ",(0,r.jsx)(s.code,{children:"WfRun"}),". Only valid in a ",(0,r.jsx)(s.code,{children:"WfSpec"})," that has a parent. Also can only be declared in the Entrypoint Thread."]})]})]})]})]})}function x(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,s,d)=>{d.d(s,{R:()=>i,x:()=>h});var r=d(6540);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function h(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4bc002f8.8f763503.js b/assets/js/4bc002f8.8f763503.js new file mode 100644 index 000000000..1af40be7d --- /dev/null +++ b/assets/js/4bc002f8.8f763503.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[8488],{6603:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>s,metadata:()=>c,toc:()=>u});var r=t(4848),o=t(8453),a=t(1470),l=t(9365);const s={},i="Throwing Workflow Events",c={id:"developer-guide/wfspec-development/advanced/throwing-events",title:"Throwing Workflow Events",description:"Before you can add a THROW_EVENT Node to a WfSpec, you need to create a WorkflowEventDef metadata object in LittleHorse representing the event you want to throw. You can do that following our metadata management docs.",source:"@site/docs/05-developer-guide/08-wfspec-development/20-advanced/10-throwing-events.md",sourceDirName:"05-developer-guide/08-wfspec-development/20-advanced",slug:"/developer-guide/wfspec-development/advanced/throwing-events",permalink:"/docs/developer-guide/wfspec-development/advanced/throwing-events",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Waiting for Conditions",permalink:"/docs/developer-guide/wfspec-development/advanced/wait-for-condition"},next:{title:"Using the LittleHorse API",permalink:"/docs/developer-guide/grpc/"}},d={},u=[{value:"Defining a THROW_EVENT Node",id:"defining-a-throw_event-node",level:2},{value:"Required Parameters",id:"required-parameters",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"throwing-workflow-events",children:"Throwing Workflow Events"})}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["Before you can add a ",(0,r.jsx)(n.code,{children:"THROW_EVENT"})," Node to a ",(0,r.jsx)(n.code,{children:"WfSpec"}),", you need to create a ",(0,r.jsx)(n.code,{children:"WorkflowEventDef"})," metadata object in LittleHorse representing the event you want to throw. You can do that following our ",(0,r.jsx)(n.a,{href:"/docs/developer-guide/grpc/managing-metadata#workfloweventdef",children:"metadata management docs"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["To throw a WorkflowEvent in LittleHorse, you must define a ",(0,r.jsx)(n.code,{children:"THROW_EVENT"})," Node in a ",(0,r.jsx)(n.code,{children:"WfSpec"}),"."]}),"\n",(0,r.jsxs)(n.h2,{id:"defining-a-throw_event-node",children:["Defining a ",(0,r.jsx)(n.code,{children:"THROW_EVENT"})," Node"]}),"\n",(0,r.jsxs)(n.p,{children:["The following code defines a workflow that waits 5 seconds before throwing a ",(0,r.jsx)(n.code,{children:"WorkflowEvent"}),' named "my-event", with the content "Hello There!".']}),"\n","\n",(0,r.jsxs)(a.A,{children:[(0,r.jsx)(l.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static Workflow getWorkflow() {\n return Workflow.newWorkflow(\n "throw-wf-event",\n wf -> {\n wf.sleepSeconds(5);\n wf.throwEvent("my-event", "Hello There!");\n });\n}\n'})})}),(0,r.jsx)(l.A,{value:"python",label:"Python",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'def get_workflow() -> Workflow:\n def my_entrypoint(wf: WorkflowThread) -> None:\n wf.sleep(5)\n wf.throwEvent("sleep-done", "Hello There!")\n\n return Workflow("throw-wf-event", my_entrypoint)\n'})})}),(0,r.jsx)(l.A,{value:"go",label:"Go",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-go",children:'func ThrowWfEvent(wf *littlehorse.WorkflowThread) {\n wf.Sleep(5)\n wf.ThrowEvent("my-event", "Hello there!")\n}\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"required-parameters",children:"Required Parameters"}),"\n",(0,r.jsx)(n.p,{children:"The two required values are:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"workflowEventDefName"})," is the Name of the ",(0,r.jsx)(n.code,{children:"WorkflowEventDef"})," that you want to throw a ",(0,r.jsx)(n.code,{children:"WorkflowEvent"})," for."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"content"})," is the content of the ",(0,r.jsx)(n.code,{children:"WorkflowEvent"})," that will be stored in the ",(0,r.jsx)(n.code,{children:"content"})," field of the ",(0,r.jsx)(n.code,{children:"WorkflowEvent"}),". Content type will match the ",(0,r.jsx)(n.code,{children:"VariableType"})," specified in your ",(0,r.jsx)(n.code,{children:"WorkflowEventDef"}),"."]}),"\n"]})]})}function f(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var r=t(8215);const o={tabItem:"tabItem_Ymn6"};var a=t(4848);function l(e){let{children:n,hidden:t,className:l}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(o.tabItem,l),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var r=t(6540),o=t(8215),a=t(3104),l=t(6347),s=t(205),i=t(7485),c=t(1682),d=t(679);function u(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 u(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:o}}=e;return{value:n,label:t,attributes:r,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 f(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,l.W6)(),a=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,i.aZ)(a),(0,r.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(o.location.search);n.set(a,e),o.replace({...o.location,search:n.toString()})}),[a,o])]}function v(e){const{defaultValue:n,queryString:t=!1,groupId:o}=e,a=h(e),[l,i]=(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(!f({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:a}))),[c,u]=p({queryString:t,groupId:o}),[v,w]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[o,a]=(0,d.Dv)(t);return[o,(0,r.useCallback)((e=>{t&&a.set(e)}),[t,a])]}({groupId:o}),m=(()=>{const e=c??v;return f({value:e,tabValues:a})?e:null})();(0,s.A)((()=>{m&&i(m)}),[m]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!f({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),w(e)}),[u,w,a]),tabValues:a}}var w=t(2303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(4848);function b(e){let{className:n,block:t,selectedValue:r,selectValue:l,tabValues:s}=e;const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,t=i.indexOf(n),o=s[t].value;o!==r&&(c(n),l(o))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:a}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>i.push(e),onKeyDown:u,onClick:d,...a,className:(0,o.A)("tabs__item",m.tabItem,a?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function x(e){let{lazy:n,children:t,selectedValue:a}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function j(e){const n=v(e);return(0,g.jsxs)("div",{className:(0,o.A)("tabs-container",m.tabList),children:[(0,g.jsx)(b,{...n,...e}),(0,g.jsx)(x,{...n,...e})]})}function y(e){const n=(0,w.A)();return(0,g.jsx)(j,{...e,children:u(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>s});var r=t(6540);const o={},a=r.createContext(o);function l(e){const n=r.useContext(a);return r.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(o):e.components||o:l(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9e75eaed.6c0d8ee7.js b/assets/js/9e75eaed.6c0d8ee7.js new file mode 100644 index 000000000..9b74da921 --- /dev/null +++ b/assets/js/9e75eaed.6c0d8ee7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[456],{4261:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>d,toc:()=>u});var r=t(4848),a=t(8453),o=t(1470),i=t(9365);const s={},l="Waiting for Conditions",d={id:"developer-guide/wfspec-development/advanced/wait-for-condition",title:"Waiting for Conditions",description:"\x3c!-- We really need docusaurus versioning. This feature isn't released yet...if someone finds it",source:"@site/docs/05-developer-guide/08-wfspec-development/20-advanced/00-wait-for-condition.md",sourceDirName:"05-developer-guide/08-wfspec-development/20-advanced",slug:"/developer-guide/wfspec-development/advanced/wait-for-condition",permalink:"/docs/developer-guide/wfspec-development/advanced/wait-for-condition",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:0,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Advanced Features",permalink:"/docs/developer-guide/wfspec-development/advanced/"},next:{title:"Throwing Workflow Events",permalink:"/docs/developer-guide/wfspec-development/advanced/throwing-events"}},c={},u=[{value:"Use-Cases",id:"use-cases",level:2},{value:"Child Threads",id:"child-threads",level:3},{value:"Interrupt Handler",id:"interrupt-handler",level:3},{value:"Child Workflows",id:"child-workflows",level:3},{value:"Implementation",id:"implementation",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"waiting-for-conditions",children:"Waiting for Conditions"})}),"\n","\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If you want to wait for something to happen ",(0,r.jsxs)(n.em,{children:["outside the ",(0,r.jsx)(n.code,{children:"WfRun"})]}),", like a callback or a webhook, what you want is\nour ",(0,r.jsx)(n.a,{href:"/docs/developer-guide/wfspec-development/external-events",children:"External Events"})," feature."]})}),"\n",(0,r.jsxs)(n.p,{children:["Sometimes you want a single ",(0,r.jsx)(n.code,{children:"ThreadRun"})," in your workflow to block until ",(0,r.jsx)(n.em,{children:"some condition"})," is true, where that condition can be represented by variables in your ",(0,r.jsx)(n.code,{children:"WfRun"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"use-cases",children:"Use-Cases"}),"\n",(0,r.jsxs)(n.p,{children:["Use of this feature is advanced; and it only makes sense when you have Child ",(0,r.jsx)(n.code,{children:"ThreadRun"}),"'s or Child ",(0,r.jsx)(n.code,{children:"WfRun"}),"'s who can mutate the values of Variables in your parent ",(0,r.jsx)(n.code,{children:"ThreadRun"})," while it waits for the condition to be true. Otherwise, the ",(0,r.jsx)(n.code,{children:"ThreadRun"})," will block forever."]}),"\n",(0,r.jsxs)(n.p,{children:["The three patterns for using the Wait-for-Condition feature are described below. In all three cases, a child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," or ",(0,r.jsx)(n.code,{children:"WfRun"})," mutates the LHS variable in the condition we are waiting for."]}),"\n",(0,r.jsx)(n.h3,{id:"child-threads",children:"Child Threads"}),"\n",(0,r.jsxs)(n.p,{children:["Any child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," may mutate the value of variables in its parent."]}),"\n",(0,r.jsxs)(n.p,{children:["Most use-cases in which you want to wait for a child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," to do something before proceeding forward in the parent can be covered by a ",(0,r.jsxs)(n.a,{href:"/docs/developer-guide/wfspec-development/child-threads#waiting-for-child-threads",children:[(0,r.jsx)(n.code,{children:"WAIT_FOR_THREADS"})," node"]}),". However, sometimes a parent may want to wait for some ",(0,r.jsx)(n.em,{children:"intermediate step"})," inside the child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," to complete before proceeding. In this case, the ",(0,r.jsx)(n.code,{children:"WAIT_FOR_CONDITION"}),' provides a mechanism for the child to "wake up" the parent.']}),"\n",(0,r.jsx)(n.h3,{id:"interrupt-handler",children:"Interrupt Handler"}),"\n",(0,r.jsxs)(n.p,{children:["You can use an ",(0,r.jsx)(n.a,{href:"/docs/developer-guide/wfspec-development/interrupts",children:"Interrupt Handler"})," to mutate the value of a Variable in a ",(0,r.jsx)(n.code,{children:"WfRun"})," by posting an ",(0,r.jsx)(n.code,{children:"ExternalEvent"}),". This is because the Interrupt Handler causes a Child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," to be run, and the child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," may mutate variables in the parent."]}),"\n",(0,r.jsxs)(n.p,{children:["For example, you might have an ",(0,r.jsx)(n.code,{children:"ExternalEvent"})," that runs every 30 seconds to report the status of some infrastructure that is being deployed. The Interrupt Handler sets the ",(0,r.jsx)(n.code,{children:"status"})," variable. The parent ",(0,r.jsx)(n.code,{children:"ThreadRun"})," might do something like:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'wf.waitForCondition(wf.condition(status, EQUALS, "HEALTHY"));\n'})}),"\n",(0,r.jsx)(n.h3,{id:"child-workflows",children:"Child Workflows"}),"\n",(0,r.jsxs)(n.p,{children:["Child workflows can also mutate ",(0,r.jsx)(n.code,{children:"PUBLIC"})," variables in their parents, just like Child ",(0,r.jsx)(n.code,{children:"ThreadRun"}),"s. You would use Child Workflows instead of Child Threads when either:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Forces outside of the parent ",(0,r.jsx)(n.code,{children:"WfSpec"})," need to decide when to run child ",(0,r.jsx)(n.code,{children:"WfRun"}),"s, and Interrupts are not sufficient."]}),"\n",(0,r.jsxs)(n.li,{children:["You need to run thousands of children. A single ",(0,r.jsx)(n.code,{children:"WfRun"})," should not have more than 1,000 ",(0,r.jsx)(n.code,{children:"ThreadRun"}),"s due to serialization performance."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"implementation",children:"Implementation"}),"\n",(0,r.jsxs)(n.p,{children:["To wait for a condition inside a ",(0,r.jsx)(n.code,{children:"WfSpec"}),", you can do the following:"]}),"\n",(0,r.jsxs)(o.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public void wfExample(WorkflowThread wf) {\n WfRunVariable myVar = wf.addVariable("my-var", VariableType.STR);\n\n // register interrupt handler or spawn child thread that may mutate `my-var`.\n // Alternatively, rely on child workflows to mutate it.\n\n // Once `my-var` gets set to "some-value", the thread continues\n wf.waitForCondition(wf.condition(myVar, Comparator.EQUALS, "some-value"));\n\n // ...\n}\n'})})}),(0,r.jsx)(i.A,{value:"go",label:"Go",children:(0,r.jsx)(n.p,{children:"This feature is not yet supported in the Go sdk."})}),(0,r.jsx)(i.A,{value:"python",label:"Python",children:(0,r.jsx)(n.p,{children:"This feature is not yet supported in the Python sdk."})})]}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:"In the near future, we will add the following:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Timeouts on a ",(0,r.jsx)(n.code,{children:"WAIT_FOR_CONDITION"})," Node with the ability to specify an ",(0,r.jsx)(n.code,{children:"EXCEPTION"})," to throw upon timeout."]}),"\n",(0,r.jsxs)(n.li,{children:["Support for ",(0,r.jsx)(n.code,{children:"WAIT_FOR_CONDITION"})," nodes in our Python and Go SDK's"]}),"\n"]})]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>i});t(6540);var r=t(8215);const a={tabItem:"tabItem_Ymn6"};var o=t(4848);function i(e){let{children:n,hidden:t,className:i}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,i),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var r=t(6540),a=t(8215),o=t(3104),i=t(6347),s=t(205),l=t(7485),d=t(1682),c=t(679);function u(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 u(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,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 p(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,i.W6)(),o=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)(o),(0,r.useCallback)((e=>{if(!o)return;const n=new URLSearchParams(a.location.search);n.set(o,e),a.replace({...a.location,search:n.toString()})}),[o,a])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,o=h(e),[i,l]=(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(!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 r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o}))),[d,u]=f({queryString:t,groupId:a}),[m,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,o]=(0,c.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&o.set(e)}),[t,o])]}({groupId:a}),x=(()=>{const e=d??m;return p({value:e,tabValues:o})?e:null})();(0,s.A)((()=>{x&&l(x)}),[x]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),v(e)}),[u,v,o]),tabValues:o}}var v=t(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var w=t(4848);function b(e){let{className:n,block:t,selectedValue:r,selectValue:i,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),a=s[t].value;a!==r&&(d(n),i(a))},u=e=>{let n=null;switch(e.key){case"Enter":c(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,w.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:o}=e;return(0,w.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:u,onClick:c,...o,className:(0,a.A)("tabs__item",x.tabItem,o?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:o}=e;const i=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=i.find((e=>e.props.value===o));return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,w.jsx)("div",{className:"margin-top--md",children:i.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==o})))})}function g(e){const n=m(e);return(0,w.jsxs)("div",{className:(0,a.A)("tabs-container",x.tabList),children:[(0,w.jsx)(b,{...n,...e}),(0,w.jsx)(j,{...n,...e})]})}function y(e){const n=(0,v.A)();return(0,w.jsx)(g,{...e,children:u(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>s});var r=t(6540);const a={},o=r.createContext(a);function i(e){const n=r.useContext(o);return r.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(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9e75eaed.966b9594.js b/assets/js/9e75eaed.966b9594.js deleted file mode 100644 index 30e86ec45..000000000 --- a/assets/js/9e75eaed.966b9594.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[456],{4261:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>d,toc:()=>u});var r=t(4848),a=t(8453),i=t(1470),o=t(9365);const s={},l="Waiting for Conditions",d={id:"developer-guide/wfspec-development/advanced/wait-for-condition",title:"Waiting for Conditions",description:"\x3c!-- We really need docusaurus versioning. This feature isn't released yet...if someone finds it",source:"@site/docs/05-developer-guide/08-wfspec-development/20-advanced/00-wait-for-condition.md",sourceDirName:"05-developer-guide/08-wfspec-development/20-advanced",slug:"/developer-guide/wfspec-development/advanced/wait-for-condition",permalink:"/docs/developer-guide/wfspec-development/advanced/wait-for-condition",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:0,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Advanced Features",permalink:"/docs/developer-guide/wfspec-development/advanced/"},next:{title:"Using the LittleHorse API",permalink:"/docs/developer-guide/grpc/"}},c={},u=[{value:"Use-Cases",id:"use-cases",level:2},{value:"Child Threads",id:"child-threads",level:3},{value:"Interrupt Handler",id:"interrupt-handler",level:3},{value:"Child Workflows",id:"child-workflows",level:3},{value:"Implementation",id:"implementation",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"waiting-for-conditions",children:"Waiting for Conditions"})}),"\n","\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If you want to wait for something to happen ",(0,r.jsxs)(n.em,{children:["outside the ",(0,r.jsx)(n.code,{children:"WfRun"})]}),", like a callback or a webhook, what you want is\nour ",(0,r.jsx)(n.a,{href:"/docs/developer-guide/wfspec-development/external-events",children:"External Events"})," feature."]})}),"\n",(0,r.jsxs)(n.p,{children:["Sometimes you want a single ",(0,r.jsx)(n.code,{children:"ThreadRun"})," in your workflow to block until ",(0,r.jsx)(n.em,{children:"some condition"})," is true, where that condition can be represented by variables in your ",(0,r.jsx)(n.code,{children:"WfRun"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"use-cases",children:"Use-Cases"}),"\n",(0,r.jsxs)(n.p,{children:["Use of this feature is advanced; and it only makes sense when you have Child ",(0,r.jsx)(n.code,{children:"ThreadRun"}),"'s or Child ",(0,r.jsx)(n.code,{children:"WfRun"}),"'s who can mutate the values of Variables in your parent ",(0,r.jsx)(n.code,{children:"ThreadRun"})," while it waits for the condition to be true. Otherwise, the ",(0,r.jsx)(n.code,{children:"ThreadRun"})," will block forever."]}),"\n",(0,r.jsxs)(n.p,{children:["The three patterns for using the Wait-for-Condition feature are described below. In all three cases, a child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," or ",(0,r.jsx)(n.code,{children:"WfRun"})," mutates the LHS variable in the condition we are waiting for."]}),"\n",(0,r.jsx)(n.h3,{id:"child-threads",children:"Child Threads"}),"\n",(0,r.jsxs)(n.p,{children:["Any child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," may mutate the value of variables in its parent."]}),"\n",(0,r.jsxs)(n.p,{children:["Most use-cases in which you want to wait for a child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," to do something before proceeding forward in the parent can be covered by a ",(0,r.jsxs)(n.a,{href:"/docs/developer-guide/wfspec-development/child-threads#waiting-for-child-threads",children:[(0,r.jsx)(n.code,{children:"WAIT_FOR_THREADS"})," node"]}),". However, sometimes a parent may want to wait for some ",(0,r.jsx)(n.em,{children:"intermediate step"})," inside the child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," to complete before proceeding. In this case, the ",(0,r.jsx)(n.code,{children:"WAIT_FOR_CONDITION"}),' provides a mechanism for the child to "wake up" the parent.']}),"\n",(0,r.jsx)(n.h3,{id:"interrupt-handler",children:"Interrupt Handler"}),"\n",(0,r.jsxs)(n.p,{children:["You can use an ",(0,r.jsx)(n.a,{href:"/docs/developer-guide/wfspec-development/interrupts",children:"Interrupt Handler"})," to mutate the value of a Variable in a ",(0,r.jsx)(n.code,{children:"WfRun"})," by posting an ",(0,r.jsx)(n.code,{children:"ExternalEvent"}),". This is because the Interrupt Handler causes a Child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," to be run, and the child ",(0,r.jsx)(n.code,{children:"ThreadRun"})," may mutate variables in the parent."]}),"\n",(0,r.jsxs)(n.p,{children:["For example, you might have an ",(0,r.jsx)(n.code,{children:"ExternalEvent"})," that runs every 30 seconds to report the status of some infrastructure that is being deployed. The Interrupt Handler sets the ",(0,r.jsx)(n.code,{children:"status"})," variable. The parent ",(0,r.jsx)(n.code,{children:"ThreadRun"})," might do something like:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'wf.waitForCondition(wf.condition(status, EQUALS, "HEALTHY"));\n'})}),"\n",(0,r.jsx)(n.h3,{id:"child-workflows",children:"Child Workflows"}),"\n",(0,r.jsxs)(n.p,{children:["Child workflows can also mutate ",(0,r.jsx)(n.code,{children:"PUBLIC"})," variables in their parents, just like Child ",(0,r.jsx)(n.code,{children:"ThreadRun"}),"s. You would use Child Workflows instead of Child Threads when either:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Forces outside of the parent ",(0,r.jsx)(n.code,{children:"WfSpec"})," need to decide when to run child ",(0,r.jsx)(n.code,{children:"WfRun"}),"s, and Interrupts are not sufficient."]}),"\n",(0,r.jsxs)(n.li,{children:["You need to run thousands of children. A single ",(0,r.jsx)(n.code,{children:"WfRun"})," should not have more than 1,000 ",(0,r.jsx)(n.code,{children:"ThreadRun"}),"s due to serialization performance."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"implementation",children:"Implementation"}),"\n",(0,r.jsxs)(n.p,{children:["To wait for a condition inside a ",(0,r.jsx)(n.code,{children:"WfSpec"}),", you can do the following:"]}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public void wfExample(WorkflowThread wf) {\n WfRunVariable myVar = wf.addVariable("my-var", VariableType.STR);\n\n // register interrupt handler or spawn child thread that may mutate `my-var`.\n // Alternatively, rely on child workflows to mutate it.\n\n // Once `my-var` gets set to "some-value", the thread continues\n wf.waitForCondition(wf.condition(myVar, Comparator.EQUALS, "some-value"));\n\n // ...\n}\n'})})}),(0,r.jsx)(o.A,{value:"go",label:"Go",children:(0,r.jsx)(n.p,{children:"This feature is not yet supported in the Go sdk."})}),(0,r.jsx)(o.A,{value:"python",label:"Python",children:(0,r.jsx)(n.p,{children:"This feature is not yet supported in the Python sdk."})})]}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:"In the near future, we will add the following:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Timeouts on a ",(0,r.jsx)(n.code,{children:"WAIT_FOR_CONDITION"})," Node with the ability to specify an ",(0,r.jsx)(n.code,{children:"EXCEPTION"})," to throw upon timeout."]}),"\n",(0,r.jsxs)(n.li,{children:["Support for ",(0,r.jsx)(n.code,{children:"WAIT_FOR_CONDITION"})," nodes in our Python and Go SDK's"]}),"\n"]})]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var r=t(8215);const a={tabItem:"tabItem_Ymn6"};var i=t(4848);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})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var r=t(6540),a=t(8215),i=t(3104),o=t(6347),s=t(205),l=t(7485),d=t(1682),c=t(679);function u(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 u(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,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 p(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,l.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 m(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,i=h(e),[o,l]=(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(!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 r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:i}))),[d,u]=f({queryString:t,groupId:a}),[m,v]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,i]=(0,c.Dv)(t);return[a,(0,r.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:a}),x=(()=>{const e=d??m;return p({value:e,tabValues:i})?e:null})();(0,s.A)((()=>{x&&l(x)}),[x]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),v(e)}),[u,v,i]),tabValues:i}}var v=t(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(4848);function w(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,i.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),a=s[t].value;a!==r&&(d(n),o(a))},u=e=>{let n=null;switch(e.key){case"Enter":c(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,a.A)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:u,onClick:c,...i,className:(0,a.A)("tabs__item",x.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,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function g(e){const n=m(e);return(0,b.jsxs)("div",{className:(0,a.A)("tabs-container",x.tabList),children:[(0,b.jsx)(w,{...n,...e}),(0,b.jsx)(j,{...n,...e})]})}function y(e){const n=(0,v.A)();return(0,b.jsx)(g,{...e,children:u(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var r=t(6540);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 s(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/bead5408.ab58d23c.js b/assets/js/bead5408.ab58d23c.js new file mode 100644 index 000000000..d96afc18c --- /dev/null +++ b/assets/js/bead5408.ab58d23c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[3484],{5076:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var n=i(4848),r=i(8453);const s={},o="Using the LittleHorse API",l={id:"developer-guide/grpc/grpc",title:"Using the LittleHorse API",description:"The public API exposed by the LittleHorse Server is a GRPC server, defined here. We chose GRPC for multiple reasons, including:",source:"@site/docs/05-developer-guide/09-grpc/09-grpc.md",sourceDirName:"05-developer-guide/09-grpc",slug:"/developer-guide/grpc/",permalink:"/docs/developer-guide/grpc/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:9,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Throwing Workflow Events",permalink:"/docs/developer-guide/wfspec-development/advanced/throwing-events"},next:{title:"Background",permalink:"/docs/developer-guide/grpc/basics"}},c={},d=[];function a(e){const t={a:"a",code:"code",em:"em",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"using-the-littlehorse-api",children:"Using the LittleHorse API"})}),"\n",(0,n.jsxs)(t.p,{children:["The public API exposed by the LittleHorse Server is a GRPC server, defined ",(0,n.jsx)(t.a,{href:"https://github.com/littlehorse-enterprises/littlehorse/blob/0.7.0/schemas/service.proto#L25",children:"here"}),". We chose GRPC for multiple reasons, including:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Well-defined compatibility and schema evolution rules."}),"\n",(0,n.jsx)(t.li,{children:"Efficient serialization with Protocol Buffers."}),"\n",(0,n.jsx)(t.li,{children:"Automatic client generation in multiple languages, guaranteeing strongly-typed calls."}),"\n",(0,n.jsx)(t.li,{children:"Support for bi-directional streaming, which is used extensively by the Task Workers."}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The entirety of the LittleHorse functionality is exposed through our GRPC service. Our ",(0,n.jsxs)(t.a,{href:"/docs/developer-guide/wfspec-development/",children:[(0,n.jsx)(t.code,{children:"WfSpec"})," SDK's"]})," are simply convenience utilities which facilitate the creation of a ",(0,n.jsx)(t.code,{children:"PutWfSpecRequest"}),", and our ",(0,n.jsx)(t.a,{href:"/docs/developer-guide/task-worker-development",children:"Task Worker SDK's"})," utilize the grpc protocol to execute a provided function. These two client implementations are useful because they ",(0,n.jsx)(t.em,{children:"drastically"})," simplify the process of interacting with the LittleHorse API."]}),"\n",(0,n.jsx)(t.p,{children:"However, some actions, such as running a workflow, can be served perfectly well with the raw grpc client. The docs in this section show you how to use the LittleHorse GRPC API in order to perform common tasks, such as:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Managing metadata"}),"\n",(0,n.jsx)(t.li,{children:"Running workflows"}),"\n",(0,n.jsxs)(t.li,{children:["Posting ",(0,n.jsx)(t.code,{children:"ExternalEvent"}),"s"]}),"\n",(0,n.jsx)(t.li,{children:"Interacting with User Tasks"}),"\n",(0,n.jsx)(t.li,{children:"Searching for data"}),"\n",(0,n.jsxs)(t.li,{children:["Using LittleHorse ",(0,n.jsx)(t.code,{children:"WfRun"}),"'s as a data store for business entities"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>l});var n=i(6540);const r={},s=n.createContext(r);function o(e){const t=n.useContext(s);return n.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(r):e.components||r:o(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bead5408.d5194e8b.js b/assets/js/bead5408.d5194e8b.js deleted file mode 100644 index 1d2e64f5c..000000000 --- a/assets/js/bead5408.d5194e8b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[3484],{5076:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var n=t(4848),r=t(8453);const s={},o="Using the LittleHorse API",l={id:"developer-guide/grpc/grpc",title:"Using the LittleHorse API",description:"The public API exposed by the LittleHorse Server is a GRPC server, defined here. We chose GRPC for multiple reasons, including:",source:"@site/docs/05-developer-guide/09-grpc/09-grpc.md",sourceDirName:"05-developer-guide/09-grpc",slug:"/developer-guide/grpc/",permalink:"/docs/developer-guide/grpc/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:9,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Waiting for Conditions",permalink:"/docs/developer-guide/wfspec-development/advanced/wait-for-condition"},next:{title:"Background",permalink:"/docs/developer-guide/grpc/basics"}},c={},d=[];function a(e){const i={a:"a",code:"code",em:"em",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"using-the-littlehorse-api",children:"Using the LittleHorse API"})}),"\n",(0,n.jsxs)(i.p,{children:["The public API exposed by the LittleHorse Server is a GRPC server, defined ",(0,n.jsx)(i.a,{href:"https://github.com/littlehorse-enterprises/littlehorse/blob/0.7.0/schemas/service.proto#L25",children:"here"}),". We chose GRPC for multiple reasons, including:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Well-defined compatibility and schema evolution rules."}),"\n",(0,n.jsx)(i.li,{children:"Efficient serialization with Protocol Buffers."}),"\n",(0,n.jsx)(i.li,{children:"Automatic client generation in multiple languages, guaranteeing strongly-typed calls."}),"\n",(0,n.jsx)(i.li,{children:"Support for bi-directional streaming, which is used extensively by the Task Workers."}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["The entirety of the LittleHorse functionality is exposed through our GRPC service. Our ",(0,n.jsxs)(i.a,{href:"/docs/developer-guide/wfspec-development/",children:[(0,n.jsx)(i.code,{children:"WfSpec"})," SDK's"]})," are simply convenience utilities which facilitate the creation of a ",(0,n.jsx)(i.code,{children:"PutWfSpecRequest"}),", and our ",(0,n.jsx)(i.a,{href:"/docs/developer-guide/task-worker-development",children:"Task Worker SDK's"})," utilize the grpc protocol to execute a provided function. These two client implementations are useful because they ",(0,n.jsx)(i.em,{children:"drastically"})," simplify the process of interacting with the LittleHorse API."]}),"\n",(0,n.jsx)(i.p,{children:"However, some actions, such as running a workflow, can be served perfectly well with the raw grpc client. The docs in this section show you how to use the LittleHorse GRPC API in order to perform common tasks, such as:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Managing metadata"}),"\n",(0,n.jsx)(i.li,{children:"Running workflows"}),"\n",(0,n.jsxs)(i.li,{children:["Posting ",(0,n.jsx)(i.code,{children:"ExternalEvent"}),"s"]}),"\n",(0,n.jsx)(i.li,{children:"Interacting with User Tasks"}),"\n",(0,n.jsx)(i.li,{children:"Searching for data"}),"\n",(0,n.jsxs)(i.li,{children:["Using LittleHorse ",(0,n.jsx)(i.code,{children:"WfRun"}),"'s as a data store for business entities"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>l});var n=t(6540);const r={},s=n.createContext(r);function o(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c69aaf89.7f98a7e0.js b/assets/js/c69aaf89.7f98a7e0.js deleted file mode 100644 index 0138e06a7..000000000 --- a/assets/js/c69aaf89.7f98a7e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[3361],{2495:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var t=s(4848),r=s(8453),i=s(1470),o=s(9365);const a={},l="Handling User Tasks",d={id:"developer-guide/grpc/user-tasks",title:"Handling User Tasks",description:"User Tasks enable a ThreadRun to block until a human user provides some input into the workflow. Additionally, User Tasks have several useful hooks such as automatic reassignment, reminders, and auditing capabilities.",source:"@site/docs/05-developer-guide/09-grpc/20-user-tasks.md",sourceDirName:"05-developer-guide/09-grpc",slug:"/developer-guide/grpc/user-tasks",permalink:"/docs/developer-guide/grpc/user-tasks",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:20,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Posting ExternalEvents",permalink:"/docs/developer-guide/grpc/posting-external-events"},next:{title:"Operations",permalink:"/docs/operations/"}},c={},u=[{value:"UserTaskRun Lifecycle",id:"usertaskrun-lifecycle",level:2},{value:"Search for UserTaskRuns",id:"search-for-usertaskruns",level:2},{value:"Display a UserTaskRun",id:"display-a-usertaskrun",level:2},{value:"Complete a UserTaskRun",id:"complete-a-usertaskrun",level:2},{value:"Save a UserTaskRun",id:"save-a-usertaskrun",level:2},{value:"Re-Assign a UserTaskRun",id:"re-assign-a-usertaskrun",level:2},{value:"Cancel a UserTaskRun",id:"cancel-a-usertaskrun",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"handling-user-tasks",children:"Handling User Tasks"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," enable a ",(0,t.jsx)(n.code,{children:"ThreadRun"})," to block until a human user provides some input into the workflow. Additionally, User Tasks have several useful hooks such as automatic reassignment, reminders, and auditing capabilities."]}),"\n",(0,t.jsxs)(n.p,{children:["This page shows you how to interact with a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," on an already-running ",(0,t.jsx)(n.code,{children:"WfRun"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["For documentation about how to insert a ",(0,t.jsx)(n.code,{children:"USER_TASK"})," node into your ",(0,t.jsx)(n.code,{children:"WfSpec"}),", please refer to the ",(0,t.jsxs)(n.a,{href:"/docs/developer-guide/wfspec-development/user-tasks",children:[(0,t.jsx)(n.code,{children:"WfSpec"})," development documentation"]}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"Note that LittleHorse does not provide an out-of-the-box implementation of a User Task Manager application. This is because it would likely be of limited use to our users, because the implementation of User Task Applications is highly use-case specific. For example, each of the following considerations might be handled vastly differently depending on the application:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Presentation:"})," is the user task form presented in a mobile app, standalone internal web application, or embedded into a customer-facing site?"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Identity Management:"})," what system is used to manage and determine the identity of the person executing User Tasks?"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Look and Feel:"})," what is the style of the actual page?"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Access Permisions:"})," while the ",(0,t.jsx)(n.code,{children:"userGroup"})," field of a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is useful for determining who may execute a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", how should the Task Manager application determine who can perform additional acctions, such as reassignment and viewing audit information?"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"While those considerations are left to the user of LittleHorse, User Tasks still provide an incredibly valuable tool to our users, specifically:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Direct integrations with the ",(0,t.jsx)(n.code,{children:"WfSpec"})]}),"\n",(0,t.jsx)(n.li,{children:"Built-in reassignment and reminder capabilities"}),"\n",(0,t.jsx)(n.li,{children:"Built-in search capabilities."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This documentation explains everything you need in order to build your own application-specific User Tasks integration."}),"\n",(0,t.jsxs)(n.h2,{id:"usertaskrun-lifecycle",children:[(0,t.jsx)(n.code,{children:"UserTaskRun"})," Lifecycle"]}),"\n",(0,t.jsxs)(n.p,{children:["In order to use User Tasks, you must first create a ",(0,t.jsx)(n.code,{children:"WfSpec"})," that has a ",(0,t.jsx)(n.code,{children:"USER_TASK"})," node in it, for example by using the ",(0,t.jsx)(n.code,{children:"WorkflowThread#assignUserTask()"})," method (see our ",(0,t.jsxs)(n.a,{href:"/docs/developer-guide/wfspec-development/user-tasks",children:[(0,t.jsx)(n.code,{children:"WfSpec"})," Development Docs"]}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["When a ",(0,t.jsx)(n.code,{children:"ThreadRun"})," arrives at such a ",(0,t.jsx)(n.code,{children:"Node"}),", then a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," object is created in the LittleHorse Data Store. The ",(0,t.jsx)(n.code,{children:"ThreadRun"}),' will "block" at that ',(0,t.jsx)(n.code,{children:"Node"})," until the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is either completed or cancelled. When the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is completed, the ",(0,t.jsx)(n.code,{children:"NodeRun"})," returns an output which is a ",(0,t.jsx)(n.code,{children:"JSON_OBJ"})," containing a key-value pair for every field in the ",(0,t.jsx)(n.code,{children:"UserTaskDef"})," (in plain English, this is just one key-value for each field in the User Task form). When the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is cancelled, an ",(0,t.jsx)(n.code,{children:"EXCEPTION"})," is propagated to the ",(0,t.jsx)(n.code,{children:"ThreadRun"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The only way to Complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is via the ",(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun"})," endpoint on the LH Server. A ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," may be cancelled either by the ",(0,t.jsx)(n.code,{children:"rpc CancelUserTaskRun"})," or by lifecycle hooks built-in to the ",(0,t.jsx)(n.code,{children:"WfSpec"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," may be in one of the four statuses below:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"UNASSIGNED"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," does not have a specific ",(0,t.jsx)(n.code,{children:"user_id"})," set. In this case, ",(0,t.jsx)(n.code,{children:"user_group"})," must be set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ASSIGNED"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," has a specific ",(0,t.jsx)(n.code,{children:"user_id"})," set, and may have a ",(0,t.jsx)(n.code,{children:"user_group"})," set as well."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"DONE"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," has been completed."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"CANCELLED"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," has been cancelled either by a manual ",(0,t.jsx)(n.code,{children:"rpc CancelUserTaskRun"})," or by a built-in User Task lifecycle hook."]}),"\n"]}),"\n",(0,t.jsxs)(n.h2,{id:"search-for-usertaskruns",children:["Search for ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"s"]}),"\n",(0,t.jsxs)(n.p,{children:["Before you can do anything useful with User Tasks, you need to be able to search for a list of ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s matching certain criteria. The endpoint ",(0,t.jsx)(n.code,{children:"rpc SearchUserTaskRun"})," allows you to do this."]}),"\n",(0,t.jsxs)(n.p,{children:["You can find the documentation for ",(0,t.jsx)(n.code,{children:"rpc SearchUserTaskRun"})," ",(0,t.jsx)(n.a,{href:"/docs/api#searchusertaskrun",children:"here in our API documentation"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"There are six filters that can be provided:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"status"}),": an enum of either ",(0,t.jsx)(n.code,{children:"DONE"}),", ",(0,t.jsx)(n.code,{children:"UNASSIGNED"}),", ",(0,t.jsx)(n.code,{children:"ASSIGNED"}),", or ",(0,t.jsx)(n.code,{children:"CANCELLED"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"user_task_def_name"}),": the name of the associated ",(0,t.jsx)(n.code,{children:"UserTaskDef"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"user_id"}),": Only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s assigned to a specific user."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"user_group"}),": only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s assigned to a group."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"earliest_start"}),": only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s created after this date."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"latest_start"}),": only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s created before this date."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["All fields are additive; meaning that you can specify any combination of the fields, and only ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s matching ",(0,t.jsx)(n.em,{children:"all"})," of the criteria will be"]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"user_id"})," and ",(0,t.jsx)(n.code,{children:"user_group"})," fields are ",(0,t.jsx)(n.em,{children:"not"})," managed by LittleHorse. Rather, they are intended to allow the user of LittleHorse to pass values managed by an external identity provider. This allows User Tasks to support a wide array of identity management systems."]})}),"\n",(0,t.jsxs)(n.p,{children:["See below for an example of searching for ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s with the following criteria:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Assigned to the ",(0,t.jsx)(n.code,{children:"jedi-council"})," group, and specifically to be executed by ",(0,t.jsx)(n.code,{children:"obiwan"})]}),"\n",(0,t.jsx)(n.li,{children:"Created in the past week but at least 24 hours ago."}),"\n",(0,t.jsxs)(n.li,{children:["In the ",(0,t.jsx)(n.code,{children:"ASSIGNED"})," status."]}),"\n",(0,t.jsxs)(n.li,{children:["Of the type ",(0,t.jsx)(n.code,{children:"approve-funds-for-mission"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport java.time.Instant;\nimport java.time.temporal.ChronoUnit;\nimport com.google.protobuf.Timestamp;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.SearchUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunIdList;\nimport io.littlehorse.sdk.common.proto.UserTaskRunStatus;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n Timestamp oneWeekAgo = Timestamp.newBuilder()\n .setSeconds(Instant.now().minus(7, ChronoUnit.DAYS).getEpochSecond())\n .build();\n\n Timestamp oneDayAgo = Timestamp.newBuilder()\n .setSeconds(Instant.now().minus(7, ChronoUnit.DAYS).getEpochSecond())\n .build();\n\n // You can omit certain search criteria here if desired. Only one criterion is needed\n // but you may provide as many criteria as you wish. This request shows all of the\n // available search criteria.\n //\n // Note that it is a paginated request as per the "Basics" section of our grpc docs.\n SearchUserTaskRunRequest req = SearchUserTaskRunRequest.newBuilder()\n .setUserId("obiwan")\n .setUserGroup("jedi-council")\n .setUserTaskDefName("it-request")\n .setStatus(UserTaskRunStatus.ASSIGNED)\n .setEarliestStart(oneWeekAgo)\n .setLatestStart(oneDayAgo)\n .build();\n\n UserTaskRunIdList results = client.searchUserTaskRun(req);\n System.out.println(LHLibUtil.protoToJson(results));\n\n // Omitted: process the UserTaskRunIdList, maybe using pagination.\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\t"time"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n\t"google.golang.org/protobuf/types/known/timestamppb"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\toneWeekAgo := timestamppb.New(time.Now().Add(-7 * 24 * time.Hour))\n\toneDayAgo := timestamppb.New(time.Now().Add(-24 * time.Hour))\n\n\tuserTaskDefName := "it-request"\n\tuserGroup := "jedi-temple"\n\tuserId := "obi-wan"\n\tstatus := lhproto.UserTaskRunStatus_ASSIGNED\n\n\t// You may provide any or all of the following options. The only requirement\n\t// is that you must specify at least one criterion.\n\tsearchReq := &lhproto.SearchUserTaskRunRequest{\n\t\tUserTaskDefName: &userTaskDefName,\n\t\tUserId: &userId,\n\t\tUserGroup: &userGroup,\n\t\tStatus: &status,\n\t\tEarliestStart: oneWeekAgo,\n\t\tLatestStart: oneDayAgo,\n\t}\n\n\tresults, _ := (*client).SearchUserTaskRun(context.Background(), searchReq)\n\tlittlehorse.PrintProto(results)\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom datetime import datetime, timedelta\nfrom google.protobuf.timestamp_pb2 import Timestamp\nfrom google.protobuf.json_format import MessageToJson\n\nconfig = LHConfig()\nclient = config.stub()\n\none_week_ago = Timestamp()\none_week_ago.FromDatetime(datetime.now() - timedelta(weeks=1))\n\none_day_ago = Timestamp()\none_day_ago.FromDatetime(datetime.now() - timedelta(days=1))\n\nresults: UserTaskRunIdList = client.SearchUserTaskRun(SearchUserTaskRunRequest(\n user_task_def_name="it-request",\n user_id="obiwan",\n user_group="jedi-council",\n status=UserTaskRunStatus.ASSIGNED,\n earliest_start=one_week_ago,\n latest_start=one_day_ago,\n))\n\nprint(MessageToJson(results))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"display-a-usertaskrun",children:["Display a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["Now that you've found some relevant ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s that you want to display in your application, how do you show them? This is particularly important to understand when building a generic User Task Manager."]}),"\n",(0,t.jsxs)(n.p,{children:["First, the ",(0,t.jsx)(n.code,{children:"rpc GetUserTaskRun"})," request can be used to get the details for of a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),". To use this request, you need a ",(0,t.jsx)(n.code,{children:"UserTaskRunId"})," (see the note on searching above!)."]}),"\n",(0,t.jsxs)(n.p,{children:["Once you have the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can inspect the results (if it's already completed). If you are trying to develop a frontend to execute the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can iterate through the ",(0,t.jsx)(n.code,{children:"fields"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskDef"})," and determine what fields are to be displayed."]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport java.util.Map;\n\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.UserTaskDef;\nimport io.littlehorse.sdk.common.proto.UserTaskField;\nimport io.littlehorse.sdk.common.proto.UserTaskRun;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.UserTaskRunStatus;\nimport io.littlehorse.sdk.common.proto.VariableValue;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("e0e49b53298a4965b059a1a5df095b09"))\n .setUserTaskGuid("8bb5d43e14894c82bb1deab7a68b32ae")\n .build();\n\n // Fetch the UserTaskRun\n UserTaskRun userTaskRun = client.getUserTaskRun(id);\n\n // See the current owners\n String userId = userTaskRun.hasUserId() ? userTaskRun.getUserId() : null;\n String userGroup = userTaskRun.hasUserGroup() ? userTaskRun.getUserGroup() : null;\n System.out.println(\n "The UserTaskRun is assigned to group \'%s\' and user \'%s\'".formatted(userGroup, userId));\n\n // In order to see the fields, you need to fetch the `UserTaskDef`.\n UserTaskDef utd = client.getUserTaskDef(userTaskRun.getUserTaskDefId());\n for (UserTaskField field : utd.getFieldsList()) {\n System.out.println("Field %s has type %s".formatted(field.getName(), field.getType()));\n }\n\n // If the UserTaskRun is in the `DONE` state, it will have `results`.\n if (userTaskRun.getStatus() == UserTaskRunStatus.DONE) {\n for (Map.Entry resultEntry : userTaskRun.getResultsMap().entrySet()) {\n System.out.println(\n resultEntry.getKey() +\n ": " +\n LHLibUtil.protoToJson(resultEntry.getValue()));\n }\n }\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\t"fmt"\n\t"log"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "e0e49b53298a4965b059a1a5df095b09",\n\t\t},\n\t\tUserTaskGuid: "8bb5d43e14894c82bb1deab7a68b32ae",\n\t}\n\n\t// Fetch the UserTaskRun\n\tuserTaskRun, err := (*client).GetUserTaskRun(context.Background(), id)\n\tif err != nil {\n\t\tlog.Fatalf("Failed to get UserTaskRun: %v", err)\n\t}\n\n\t// See the current owners\n\tuserId := ""\n\tif userTaskRun.UserId != nil {\n\t\tuserId = *userTaskRun.UserId\n\t}\n\tuserGroup := ""\n\tif userTaskRun.UserGroup != nil {\n\t\tuserGroup = *userTaskRun.UserGroup\n\t}\n\tfmt.Printf("The UserTaskRun is assigned to group \'%s\' and user \'%s\'\\n", userGroup, userId)\n\n\t// Fetch the UserTaskDef\n\tutd, err := (*client).GetUserTaskDef(context.Background(), userTaskRun.UserTaskDefId)\n\tif err != nil {\n\t\tlog.Fatalf("Failed to get UserTaskDef: %v", err)\n\t}\n\tfor _, field := range utd.Fields {\n\t\tfmt.Printf("Field %s has type %s\\n", field.Name, field.Type)\n\t}\n\n\t// If the UserTaskRun is in the DONE state, it will have results\n\tif userTaskRun.Status == lhproto.UserTaskRunStatus_DONE {\n\t\tfmt.Println(userTaskRun.Results)\n\t}\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="e0e49b53298a4965b059a1a5df095b09"),\n user_task_guid="8bb5d43e14894c82bb1deab7a68b32ae"\n )\n\n # Fetch the UserTaskRun\n user_task_run: UserTaskRun = client.GetUserTaskRun(id)\n\n # See the current owners\n user_id = user_task_run.user_id if user_task_run.user_id else ""\n user_group = user_task_run.user_group if user_task_run.user_group else ""\n print(f"The UserTaskRun is assigned to group \'{user_group}\' and user \'{user_id}\'")\n\n # Fetch the UserTaskDef\n utd: UserTaskDef = client.GetUserTaskDef(user_task_run.user_task_def_id)\n for field in utd.fields:\n print(f"Field {field.name} has type {VariableType.Name(field.type)}")\n\n # If the UserTaskRun is in the DONE state, it will have results\n if user_task_run.status == UserTaskRunStatus.DONE:\n print(user_task_run.results)\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"complete-a-usertaskrun",children:["Complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["To complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can use the ",(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun"}),". The protobuf for the call is as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun(CompleteUserTaskRunRequest) returns (google.protobuf.Empty) {}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"CompleteUserTaskRunRequest"})," message is defined as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:"message CompleteUserTaskRunRequest {\n UserTaskRunId user_task_run_id = 1;\n map results = 2;\n string user_id = 3;\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can also consult our autogenerated API documentation for the ",(0,t.jsx)(n.a,{href:"/docs/api#completeusertaskrun",children:(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun"})})," or for ",(0,t.jsx)(n.a,{href:"/docs/api#completeusertaskrunrequest",children:(0,t.jsx)(n.code,{children:"message CompleteUserTaskRunRequest"})}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The first field is the ",(0,t.jsx)(n.code,{children:"UserTaskRunId"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," which you intend to complete. The second is a map where each key is the name of a ",(0,t.jsx)(n.code,{children:"field"})," in the ",(0,t.jsx)(n.code,{children:"UserTaskDef"}),", and the value is a ",(0,t.jsx)(n.code,{children:"VariableValue"})," representing the value of that User Task Field. The ",(0,t.jsx)(n.code,{children:"user_id"})," field must be set and is the ",(0,t.jsx)(n.code,{children:"user_id"})," of the person completing the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The current behavior of the ",(0,t.jsx)(n.code,{children:"user_id"})," field is that, if it differs from the current owner of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", then the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," will be re-assigned to the new ",(0,t.jsx)(n.code,{children:"user_id"}),". We have an ",(0,t.jsx)(n.a,{href:"https://github.com/littlehorse-enterprises/littlehorse/issues/617",children:"open ticket"})," to make this behavior configurable. If this is an important feature for you, please comment on the ticket! We're happy to bump its priority; alternatively, we do accept Pull Requests ","\ud83d\ude04","."]}),"\n",(0,t.jsxs)(n.p,{children:["In the examples below, the user ",(0,t.jsx)(n.code,{children:"obiwan"})," will complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," that has two fields: a ",(0,t.jsx)(n.code,{children:"STR"})," field called ",(0,t.jsx)(n.code,{children:"requestedItem"})," set to ",(0,t.jsx)(n.code,{children:'"lightsaber"'}),", and a ",(0,t.jsx)(n.code,{children:"STR"})," field called ",(0,t.jsx)(n.code,{children:"justification"}),"."]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.CompleteUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("e0e49b53298a4965b059a1a5df095b09"))\n .setUserTaskGuid("8bb5d43e14894c82bb1deab7a68b32ae")\n .build();\n\n // Complete the UserTaskRun. The key of `putResults` is the `name` of the `UserTaskField`,\n // and the value comes from the `LHLibUtil#objToVarVal()` method which is a convenience\n // for creating a `VariableValue`.\n client.completeUserTaskRun(CompleteUserTaskRunRequest.newBuilder()\n .setUserId("obiwan") // if different than the current value, it will overwrite it.\n .putResults("requestedItem", LHLibUtil.objToVarVal("lightsaber"))\n .putResults("justification", LHLibUtil.objToVarVal("Darth Maul kicked it down the mine shaft"))\n .setUserTaskRunId(id)\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "f2491b41b7354382988215b789187b74",\n\t\t},\n\t\tUserTaskGuid: "aa87109f001b432394cec35713ef3359",\n\t}\n\n\tcompleteRequest := &lhproto.CompleteUserTaskRunRequest{\n\t\tUserTaskRunId: id,\n\t\tUserId: "obi-wan",\n\t\tResults: make(map[string]*lhproto.VariableValue),\n\t}\n\n\trequestedItem, _ := littlehorse.InterfaceToVarVal("lightsaber")\n\tjustification, _ := littlehorse.InterfaceToVarVal("Darth Maul took it away!")\n\n\tcompleteRequest.Results["requestedItem"] = requestedItem\n\tcompleteRequest.Results["justification"] = justification\n\n\t(*client).CompleteUserTaskRun(context.Background(), completeRequest)\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse import to_variable_value\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="ec9d975af1524f4cbcb988512b258623"),\n user_task_guid="f686ec1384404c27a90f86dcb4fd9edf"\n )\n\n client.CompleteUserTaskRun(CompleteUserTaskRunRequest(\n user_task_run_id=id,\n user_id="obiwan",\n results={\n "requestedItem": to_variable_value("lightsaber"),\n "justification": to_variable_value("Darth Maul kicked my old one off the balcony!")\n }\n ))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"save-a-usertaskrun",children:["Save a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["Sometimes, when a user is working on a User Task, they might want to save their progress without completing it. The ",(0,t.jsx)(n.a,{href:"/docs/api#saveusertaskrunprogress",children:(0,t.jsx)(n.code,{children:"rpc SaveUserTaskRunProgress"})})," allows you to do this."]}),"\n",(0,t.jsx)(n.p,{children:"Saving the progress of a User Task does the following:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Update the ",(0,t.jsx)(n.code,{children:"results"})," field in the ",(0,t.jsx)(n.a,{href:"/docs/api#usertaskrun",children:(0,t.jsx)(n.code,{children:"UserTaskRun"})})," object."]}),"\n",(0,t.jsxs)(n.li,{children:["Add a ",(0,t.jsx)(n.a,{href:"/docs/api#usertaskevent",children:(0,t.jsx)(n.code,{children:"UserTaskEvent"})})," to the ",(0,t.jsx)(n.code,{children:"events"})," field of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," object denoting which ",(0,t.jsx)(n.code,{children:"user_id"})," saved the progress, and what results were saved."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"policy"})," field of the ",(0,t.jsx)(n.a,{href:"/docs/api#saveusertaskrunprogressrequest",children:(0,t.jsx)(n.code,{children:"SaveUserTaskRunProgressRequest"})})," configures how to handle when the ",(0,t.jsx)(n.code,{children:"user_id"})," of the person saving the progress differs from the ",(0,t.jsx)(n.code,{children:"user_id"})," to whom the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is assigned."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),": this is the default value for ",(0,t.jsx)(n.code,{children:"policy"}),". If the ",(0,t.jsx)(n.code,{children:"user_id"})," of the request does not match the ",(0,t.jsx)(n.code,{children:"user_id"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", then the request fails with ",(0,t.jsx)(n.code,{children:"FAILED_PRECONDITION"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IGNORE_CLAIM"}),": this value allows the caller to save the progress of a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," even when ",(0,t.jsx)(n.code,{children:"user_id"})," of the ",(0,t.jsx)(n.code,{children:"SaveUserTaskRunRequest"})," differs from the ",(0,t.jsx)(n.code,{children:"user_id"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"rpc SaveUserTaskRunProgress"})," does NOT change the ownership of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),": the ",(0,t.jsx)(n.code,{children:"user_id"})," field is not changed by this request."]})}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.examples;\n\nimport java.io.IOException;\n\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.SaveUserTaskRunProgressRequest;\nimport io.littlehorse.sdk.common.proto.SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\npublic class Main {\n\n public static void main(String[] args) throws IOException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("e0e49b53298a4965b059a1a5df095b09"))\n .setUserTaskGuid("8bb5d43e14894c82bb1deab7a68b32ae")\n .build();\n\n // In this example, we use the FAIL_IF_CLAIMED_BY_OTHER policy.\n client.saveUserTaskRunProgress(SaveUserTaskRunProgressRequest.newBuilder()\n .setUserTaskRunId(id)\n // If the UserTaskRun is assigned to someone other than obi-wan this will fail\n .setUserId("obi-wan")\n .setPolicy(SaveUserTaskRunAssignmentPolicy.FAIL_IF_CLAIMED_BY_OTHER)\n .putResults("some-field", LHLibUtil.objToVarVal("lightsaber"))\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "f2491b41b7354382988215b789187b74",\n\t\t},\n\t\tUserTaskGuid: "aa87109f001b432394cec35713ef3359",\n\t}\n\n\tcompleteRequest := &lhproto.SaveUserTaskRunProgressRequest{\n\t\tUserTaskRunId: id,\n\t\tUserId: "obi-wan",\n\t\tResults: make(map[string]*lhproto.VariableValue),\n\t\tPolicy: lhproto.SaveUserTaskRunProgressRequest_FAIL_IF_CLAIMED_BY_OTHER,\n\t}\n\n\trequestedItem, _ := littlehorse.InterfaceToVarVal("some-field")\n\tjustification, _ := littlehorse.InterfaceToVarVal("lightsaber")\n\n\tcompleteRequest.Results["requestedItem"] = requestedItem\n\tcompleteRequest.Results["justification"] = justification\n\n\t(*client).SaveUserTaskRunProgress(context.Background(), completeRequest)\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse import to_variable_value\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="ec9d975af1524f4cbcb988512b258623"),\n user_task_guid="f686ec1384404c27a90f86dcb4fd9edf"\n )\n\n client.SaveUserTaskRunProgress(SaveUserTaskRunProgressRequest(\n user_task_run_id=id,\n user_id="obi-wan",\n results={\n "requestedItem": to_variable_value("some-field"),\n "justification": to_variable_value("lightsaber")\n },\n policy= SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy.FAIL_IF_CLAIMED_BY_OTHER\n ))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"re-assign-a-usertaskrun",children:["Re-Assign a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["When building a task manager application, you may wish to have an administrative panel in which an admin may assign or re-assign tasks to various people. To re-assign a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can use the request ",(0,t.jsx)(n.code,{children:"rpc AssignUserTaskRun"}),". The request proto is as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:"message AssignUserTaskRunRequest {\n UserTaskRunId user_task_run_id = 1;\n\n bool override_claim = 2;\n\n optional string user_group = 3;\n optional string user_id = 4;\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If the ",(0,t.jsx)(n.code,{children:"override_claim"})," field is set to ",(0,t.jsx)(n.code,{children:"false"})," and the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is already assigned to a specific ",(0,t.jsx)(n.code,{children:"user_id"}),", then the request will fail with ",(0,t.jsx)(n.code,{children:"FAILED_PRECONDITION"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["It is important to note that the request will ",(0,t.jsx)(n.em,{children:"overwrite"})," both the ",(0,t.jsx)(n.code,{children:"user_id"})," ",(0,t.jsx)(n.em,{children:"and"})," the ",(0,t.jsx)(n.code,{children:"user_group"})," with the provided values from this request. If the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is currently assigned to ",(0,t.jsx)(n.code,{children:"user_group == 'sales'"})," and ",(0,t.jsx)(n.code,{children:"user_id == null"}),", and a client makes the following request:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'{\n user_task_run_id: ...,\n override_claim: false,\n user_group: null,\n user_id: "sarah"\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," will be assigned to ",(0,t.jsx)(n.code,{children:'user_id: "sarah"'})," and ",(0,t.jsx)(n.code,{children:"user_group: null"}),". An example request is shown below."]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.AssignUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("a7476518fdff4dd49f47dbe40df3c5a6"))\n .setUserTaskGuid("709cac9fcd424d87810a6cabf66d400e")\n .build();\n\n // Reassign the UserTaskRun.\n client.assignUserTaskRun(AssignUserTaskRunRequest.newBuilder()\n .setUserId("mace-windu")\n .setUserGroup("jedi-temple")\n .setOverrideClaim(true)\n .setUserTaskRunId(id)\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "a7476518fdff4dd49f47dbe40df3c5a6",\n\t\t},\n\t\tUserTaskGuid: "709cac9fcd424d87810a6cabf66d400e",\n\t}\n\n\tnewUserId := "yoda"\n\tnewUserGroup := "jedi-temple"\n\n\t(*client).AssignUserTaskRun(context.Background(), &lhproto.AssignUserTaskRunRequest{\n\t\tUserTaskRunId: id,\n\t\tUserGroup: &newUserGroup,\n\t\tUserId: &newUserId,\n\t\tOverrideClaim: true,\n\t})\n}\n\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse import to_variable_value\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="a7476518fdff4dd49f47dbe40df3c5a6"),\n user_task_guid="709cac9fcd424d87810a6cabf66d400e"\n )\n\n client.AssignUserTaskRun(AssignUserTaskRunRequest(\n user_task_run_id=id,\n user_id="yaddle",\n user_group="jedi-temple",\n override_claim=True,\n ))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"cancel-a-usertaskrun",children:["Cancel a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:['The last useful operation you may need to do when building an application using User Tasks is to "cancel" a ',(0,t.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["By default, when a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is cancelled, the ",(0,t.jsx)(n.code,{children:"NodeRun"})," fails with an ",(0,t.jsx)(n.code,{children:"ERROR"}),". However, in the ",(0,t.jsx)(n.code,{children:"WfSpec"})," SDK's you can configure this behavior on a case-by-case basis. For example, you can override the behavior to throw a specific business ",(0,t.jsx)(n.code,{children:"EXCEPTION"})," upon cancellation."]})}),"\n",(0,t.jsxs)(n.p,{children:["The request ",(0,t.jsx)(n.code,{children:"rpc CancelUserTaskRun"})," is quite simple. The only edge-case is that the request throws ",(0,t.jsx)(n.code,{children:"FAILED_PRECONDITION"})," if the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is already in the ",(0,t.jsx)(n.code,{children:"DONE"})," status."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:"message CancelUserTaskRunRequest {\n UserTaskRunId user_task_run_id = 1;\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"A simple example is shown below:"}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.CancelUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("a7476518fdff4dd49f47dbe40df3c5a6"))\n .setUserTaskGuid("709cac9fcd424d87810a6cabf66d400e")\n .build();\n\n // Reassign the UserTaskRun.\n client.cancelUserTaskRun(CancelUserTaskRunRequest.newBuilder()\n .setUserTaskRunId(id)\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "a7476518fdff4dd49f47dbe40df3c5a6",\n\t\t},\n\t\tUserTaskGuid: "709cac9fcd424d87810a6cabf66d400e",\n\t}\n\n\t(*client).CancelUserTaskRun(context.Background(), &lhproto.CancelUserTaskRunRequest{\n\t\tUserTaskRunId: id,\n\t})\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="a7476518fdff4dd49f47dbe40df3c5a6"),\n user_task_guid="709cac9fcd424d87810a6cabf66d400e"\n )\n\n client.CancelUserTaskRun(CancelUserTaskRunRequest(\n user_task_run_id=id,\n ))\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},9365:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var t=s(8215);const r={tabItem:"tabItem_Ymn6"};var i=s(4848);function o(e){let{children:n,hidden:s,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,o),hidden:s,children:n})}},1470:(e,n,s)=>{s.d(n,{A:()=>R});var t=s(6540),r=s(8215),i=s(3104),o=s(6347),a=s(205),l=s(7485),d=s(1682),c=s(679);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:s}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:s,attributes:t,default:r}}=e;return{value:n,label:s,attributes:t,default:r}}))}(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 p(e){let{value:n,tabValues:s}=e;return s.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:s}=e;const r=(0,o.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,l.aZ)(i),(0,t.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function f(e){const{defaultValue:n,queryString:s=!1,groupId:r}=e,i=h(e),[o,l]=(0,t.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(!p({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 t=s.find((e=>e.default))??s[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i}))),[d,u]=m({queryString:s,groupId:r}),[f,g]=function(e){let{groupId:n}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,c.Dv)(s);return[r,(0,t.useCallback)((e=>{s&&i.set(e)}),[s,i])]}({groupId:r}),k=(()=>{const e=d??f;return p({value:e,tabValues:i})?e:null})();(0,a.A)((()=>{k&&l(k)}),[k]);return{selectedValue:o,selectValue:(0,t.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),g(e)}),[u,g,i]),tabValues:i}}var g=s(2303);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=s(4848);function j(e){let{className:n,block:s,selectedValue:t,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,i.a_)(),c=e=>{const n=e.currentTarget,s=l.indexOf(n),r=a[s].value;r!==t&&(d(n),o(r))},u=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;n=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;n=l[s]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":s},n),children:a.map((e=>{let{value:n,label:s,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>l.push(e),onKeyDown:u,onClick:c,...i,className:(0,r.A)("tabs__item",k.tabItem,i?.className,{"tabs__item--active":t===n}),children:s??n},n)}))})}function T(e){let{lazy:n,children:s,selectedValue:i}=e;const o=(Array.isArray(s)?s:[s]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function b(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",k.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(T,{...n,...e})]})}function R(e){const n=(0,g.A)();return(0,x.jsx)(b,{...e,children:u(e.children)},String(n))}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>a});var t=s(6540);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);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(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c69aaf89.b49fb459.js b/assets/js/c69aaf89.b49fb459.js new file mode 100644 index 000000000..055bb45f9 --- /dev/null +++ b/assets/js/c69aaf89.b49fb459.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[3361],{2495:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var t=s(4848),r=s(8453),i=s(1470),o=s(9365);const a={},l="Handling User Tasks",d={id:"developer-guide/grpc/user-tasks",title:"Handling User Tasks",description:"User Tasks enable a ThreadRun to block until a human user provides some input into the workflow. Additionally, User Tasks have several useful hooks such as automatic reassignment, reminders, and auditing capabilities.",source:"@site/docs/05-developer-guide/09-grpc/20-user-tasks.md",sourceDirName:"05-developer-guide/09-grpc",slug:"/developer-guide/grpc/user-tasks",permalink:"/docs/developer-guide/grpc/user-tasks",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:20,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Posting ExternalEvents",permalink:"/docs/developer-guide/grpc/posting-external-events"},next:{title:"Advanced",permalink:"/docs/developer-guide/grpc/advanced/"}},c={},u=[{value:"UserTaskRun Lifecycle",id:"usertaskrun-lifecycle",level:2},{value:"Search for UserTaskRuns",id:"search-for-usertaskruns",level:2},{value:"Display a UserTaskRun",id:"display-a-usertaskrun",level:2},{value:"Complete a UserTaskRun",id:"complete-a-usertaskrun",level:2},{value:"Save a UserTaskRun",id:"save-a-usertaskrun",level:2},{value:"Re-Assign a UserTaskRun",id:"re-assign-a-usertaskrun",level:2},{value:"Cancel a UserTaskRun",id:"cancel-a-usertaskrun",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"handling-user-tasks",children:"Handling User Tasks"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," enable a ",(0,t.jsx)(n.code,{children:"ThreadRun"})," to block until a human user provides some input into the workflow. Additionally, User Tasks have several useful hooks such as automatic reassignment, reminders, and auditing capabilities."]}),"\n",(0,t.jsxs)(n.p,{children:["This page shows you how to interact with a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," on an already-running ",(0,t.jsx)(n.code,{children:"WfRun"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["For documentation about how to insert a ",(0,t.jsx)(n.code,{children:"USER_TASK"})," node into your ",(0,t.jsx)(n.code,{children:"WfSpec"}),", please refer to the ",(0,t.jsxs)(n.a,{href:"/docs/developer-guide/wfspec-development/user-tasks",children:[(0,t.jsx)(n.code,{children:"WfSpec"})," development documentation"]}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"Note that LittleHorse does not provide an out-of-the-box implementation of a User Task Manager application. This is because it would likely be of limited use to our users, because the implementation of User Task Applications is highly use-case specific. For example, each of the following considerations might be handled vastly differently depending on the application:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Presentation:"})," is the user task form presented in a mobile app, standalone internal web application, or embedded into a customer-facing site?"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Identity Management:"})," what system is used to manage and determine the identity of the person executing User Tasks?"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Look and Feel:"})," what is the style of the actual page?"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Access Permisions:"})," while the ",(0,t.jsx)(n.code,{children:"userGroup"})," field of a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is useful for determining who may execute a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", how should the Task Manager application determine who can perform additional acctions, such as reassignment and viewing audit information?"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"While those considerations are left to the user of LittleHorse, User Tasks still provide an incredibly valuable tool to our users, specifically:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Direct integrations with the ",(0,t.jsx)(n.code,{children:"WfSpec"})]}),"\n",(0,t.jsx)(n.li,{children:"Built-in reassignment and reminder capabilities"}),"\n",(0,t.jsx)(n.li,{children:"Built-in search capabilities."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This documentation explains everything you need in order to build your own application-specific User Tasks integration."}),"\n",(0,t.jsxs)(n.h2,{id:"usertaskrun-lifecycle",children:[(0,t.jsx)(n.code,{children:"UserTaskRun"})," Lifecycle"]}),"\n",(0,t.jsxs)(n.p,{children:["In order to use User Tasks, you must first create a ",(0,t.jsx)(n.code,{children:"WfSpec"})," that has a ",(0,t.jsx)(n.code,{children:"USER_TASK"})," node in it, for example by using the ",(0,t.jsx)(n.code,{children:"WorkflowThread#assignUserTask()"})," method (see our ",(0,t.jsxs)(n.a,{href:"/docs/developer-guide/wfspec-development/user-tasks",children:[(0,t.jsx)(n.code,{children:"WfSpec"})," Development Docs"]}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["When a ",(0,t.jsx)(n.code,{children:"ThreadRun"})," arrives at such a ",(0,t.jsx)(n.code,{children:"Node"}),", then a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," object is created in the LittleHorse Data Store. The ",(0,t.jsx)(n.code,{children:"ThreadRun"}),' will "block" at that ',(0,t.jsx)(n.code,{children:"Node"})," until the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is either completed or cancelled. When the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is completed, the ",(0,t.jsx)(n.code,{children:"NodeRun"})," returns an output which is a ",(0,t.jsx)(n.code,{children:"JSON_OBJ"})," containing a key-value pair for every field in the ",(0,t.jsx)(n.code,{children:"UserTaskDef"})," (in plain English, this is just one key-value for each field in the User Task form). When the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is cancelled, an ",(0,t.jsx)(n.code,{children:"EXCEPTION"})," is propagated to the ",(0,t.jsx)(n.code,{children:"ThreadRun"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The only way to Complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is via the ",(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun"})," endpoint on the LH Server. A ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," may be cancelled either by the ",(0,t.jsx)(n.code,{children:"rpc CancelUserTaskRun"})," or by lifecycle hooks built-in to the ",(0,t.jsx)(n.code,{children:"WfSpec"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," may be in one of the four statuses below:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"UNASSIGNED"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," does not have a specific ",(0,t.jsx)(n.code,{children:"user_id"})," set. In this case, ",(0,t.jsx)(n.code,{children:"user_group"})," must be set."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ASSIGNED"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," has a specific ",(0,t.jsx)(n.code,{children:"user_id"})," set, and may have a ",(0,t.jsx)(n.code,{children:"user_group"})," set as well."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"DONE"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," has been completed."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"CANCELLED"}),": the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," has been cancelled either by a manual ",(0,t.jsx)(n.code,{children:"rpc CancelUserTaskRun"})," or by a built-in User Task lifecycle hook."]}),"\n"]}),"\n",(0,t.jsxs)(n.h2,{id:"search-for-usertaskruns",children:["Search for ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"s"]}),"\n",(0,t.jsxs)(n.p,{children:["Before you can do anything useful with User Tasks, you need to be able to search for a list of ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s matching certain criteria. The endpoint ",(0,t.jsx)(n.code,{children:"rpc SearchUserTaskRun"})," allows you to do this."]}),"\n",(0,t.jsxs)(n.p,{children:["You can find the documentation for ",(0,t.jsx)(n.code,{children:"rpc SearchUserTaskRun"})," ",(0,t.jsx)(n.a,{href:"/docs/api#searchusertaskrun",children:"here in our API documentation"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"There are six filters that can be provided:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"status"}),": an enum of either ",(0,t.jsx)(n.code,{children:"DONE"}),", ",(0,t.jsx)(n.code,{children:"UNASSIGNED"}),", ",(0,t.jsx)(n.code,{children:"ASSIGNED"}),", or ",(0,t.jsx)(n.code,{children:"CANCELLED"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"user_task_def_name"}),": the name of the associated ",(0,t.jsx)(n.code,{children:"UserTaskDef"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"user_id"}),": Only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s assigned to a specific user."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"user_group"}),": only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s assigned to a group."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"earliest_start"}),": only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s created after this date."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"latest_start"}),": only returns ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s created before this date."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["All fields are additive; meaning that you can specify any combination of the fields, and only ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s matching ",(0,t.jsx)(n.em,{children:"all"})," of the criteria will be"]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"user_id"})," and ",(0,t.jsx)(n.code,{children:"user_group"})," fields are ",(0,t.jsx)(n.em,{children:"not"})," managed by LittleHorse. Rather, they are intended to allow the user of LittleHorse to pass values managed by an external identity provider. This allows User Tasks to support a wide array of identity management systems."]})}),"\n",(0,t.jsxs)(n.p,{children:["See below for an example of searching for ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s with the following criteria:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Assigned to the ",(0,t.jsx)(n.code,{children:"jedi-council"})," group, and specifically to be executed by ",(0,t.jsx)(n.code,{children:"obiwan"})]}),"\n",(0,t.jsx)(n.li,{children:"Created in the past week but at least 24 hours ago."}),"\n",(0,t.jsxs)(n.li,{children:["In the ",(0,t.jsx)(n.code,{children:"ASSIGNED"})," status."]}),"\n",(0,t.jsxs)(n.li,{children:["Of the type ",(0,t.jsx)(n.code,{children:"approve-funds-for-mission"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport java.time.Instant;\nimport java.time.temporal.ChronoUnit;\nimport com.google.protobuf.Timestamp;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.SearchUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunIdList;\nimport io.littlehorse.sdk.common.proto.UserTaskRunStatus;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n Timestamp oneWeekAgo = Timestamp.newBuilder()\n .setSeconds(Instant.now().minus(7, ChronoUnit.DAYS).getEpochSecond())\n .build();\n\n Timestamp oneDayAgo = Timestamp.newBuilder()\n .setSeconds(Instant.now().minus(7, ChronoUnit.DAYS).getEpochSecond())\n .build();\n\n // You can omit certain search criteria here if desired. Only one criterion is needed\n // but you may provide as many criteria as you wish. This request shows all of the\n // available search criteria.\n //\n // Note that it is a paginated request as per the "Basics" section of our grpc docs.\n SearchUserTaskRunRequest req = SearchUserTaskRunRequest.newBuilder()\n .setUserId("obiwan")\n .setUserGroup("jedi-council")\n .setUserTaskDefName("it-request")\n .setStatus(UserTaskRunStatus.ASSIGNED)\n .setEarliestStart(oneWeekAgo)\n .setLatestStart(oneDayAgo)\n .build();\n\n UserTaskRunIdList results = client.searchUserTaskRun(req);\n System.out.println(LHLibUtil.protoToJson(results));\n\n // Omitted: process the UserTaskRunIdList, maybe using pagination.\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\t"time"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n\t"google.golang.org/protobuf/types/known/timestamppb"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\toneWeekAgo := timestamppb.New(time.Now().Add(-7 * 24 * time.Hour))\n\toneDayAgo := timestamppb.New(time.Now().Add(-24 * time.Hour))\n\n\tuserTaskDefName := "it-request"\n\tuserGroup := "jedi-temple"\n\tuserId := "obi-wan"\n\tstatus := lhproto.UserTaskRunStatus_ASSIGNED\n\n\t// You may provide any or all of the following options. The only requirement\n\t// is that you must specify at least one criterion.\n\tsearchReq := &lhproto.SearchUserTaskRunRequest{\n\t\tUserTaskDefName: &userTaskDefName,\n\t\tUserId: &userId,\n\t\tUserGroup: &userGroup,\n\t\tStatus: &status,\n\t\tEarliestStart: oneWeekAgo,\n\t\tLatestStart: oneDayAgo,\n\t}\n\n\tresults, _ := (*client).SearchUserTaskRun(context.Background(), searchReq)\n\tlittlehorse.PrintProto(results)\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\nfrom datetime import datetime, timedelta\nfrom google.protobuf.timestamp_pb2 import Timestamp\nfrom google.protobuf.json_format import MessageToJson\n\nconfig = LHConfig()\nclient = config.stub()\n\none_week_ago = Timestamp()\none_week_ago.FromDatetime(datetime.now() - timedelta(weeks=1))\n\none_day_ago = Timestamp()\none_day_ago.FromDatetime(datetime.now() - timedelta(days=1))\n\nresults: UserTaskRunIdList = client.SearchUserTaskRun(SearchUserTaskRunRequest(\n user_task_def_name="it-request",\n user_id="obiwan",\n user_group="jedi-council",\n status=UserTaskRunStatus.ASSIGNED,\n earliest_start=one_week_ago,\n latest_start=one_day_ago,\n))\n\nprint(MessageToJson(results))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"display-a-usertaskrun",children:["Display a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["Now that you've found some relevant ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"'s that you want to display in your application, how do you show them? This is particularly important to understand when building a generic User Task Manager."]}),"\n",(0,t.jsxs)(n.p,{children:["First, the ",(0,t.jsx)(n.code,{children:"rpc GetUserTaskRun"})," request can be used to get the details for of a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),". To use this request, you need a ",(0,t.jsx)(n.code,{children:"UserTaskRunId"})," (see the note on searching above!)."]}),"\n",(0,t.jsxs)(n.p,{children:["Once you have the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can inspect the results (if it's already completed). If you are trying to develop a frontend to execute the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can iterate through the ",(0,t.jsx)(n.code,{children:"fields"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskDef"})," and determine what fields are to be displayed."]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport java.util.Map;\n\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.UserTaskDef;\nimport io.littlehorse.sdk.common.proto.UserTaskField;\nimport io.littlehorse.sdk.common.proto.UserTaskRun;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.UserTaskRunStatus;\nimport io.littlehorse.sdk.common.proto.VariableValue;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("e0e49b53298a4965b059a1a5df095b09"))\n .setUserTaskGuid("8bb5d43e14894c82bb1deab7a68b32ae")\n .build();\n\n // Fetch the UserTaskRun\n UserTaskRun userTaskRun = client.getUserTaskRun(id);\n\n // See the current owners\n String userId = userTaskRun.hasUserId() ? userTaskRun.getUserId() : null;\n String userGroup = userTaskRun.hasUserGroup() ? userTaskRun.getUserGroup() : null;\n System.out.println(\n "The UserTaskRun is assigned to group \'%s\' and user \'%s\'".formatted(userGroup, userId));\n\n // In order to see the fields, you need to fetch the `UserTaskDef`.\n UserTaskDef utd = client.getUserTaskDef(userTaskRun.getUserTaskDefId());\n for (UserTaskField field : utd.getFieldsList()) {\n System.out.println("Field %s has type %s".formatted(field.getName(), field.getType()));\n }\n\n // If the UserTaskRun is in the `DONE` state, it will have `results`.\n if (userTaskRun.getStatus() == UserTaskRunStatus.DONE) {\n for (Map.Entry resultEntry : userTaskRun.getResultsMap().entrySet()) {\n System.out.println(\n resultEntry.getKey() +\n ": " +\n LHLibUtil.protoToJson(resultEntry.getValue()));\n }\n }\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\t"fmt"\n\t"log"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "e0e49b53298a4965b059a1a5df095b09",\n\t\t},\n\t\tUserTaskGuid: "8bb5d43e14894c82bb1deab7a68b32ae",\n\t}\n\n\t// Fetch the UserTaskRun\n\tuserTaskRun, err := (*client).GetUserTaskRun(context.Background(), id)\n\tif err != nil {\n\t\tlog.Fatalf("Failed to get UserTaskRun: %v", err)\n\t}\n\n\t// See the current owners\n\tuserId := ""\n\tif userTaskRun.UserId != nil {\n\t\tuserId = *userTaskRun.UserId\n\t}\n\tuserGroup := ""\n\tif userTaskRun.UserGroup != nil {\n\t\tuserGroup = *userTaskRun.UserGroup\n\t}\n\tfmt.Printf("The UserTaskRun is assigned to group \'%s\' and user \'%s\'\\n", userGroup, userId)\n\n\t// Fetch the UserTaskDef\n\tutd, err := (*client).GetUserTaskDef(context.Background(), userTaskRun.UserTaskDefId)\n\tif err != nil {\n\t\tlog.Fatalf("Failed to get UserTaskDef: %v", err)\n\t}\n\tfor _, field := range utd.Fields {\n\t\tfmt.Printf("Field %s has type %s\\n", field.Name, field.Type)\n\t}\n\n\t// If the UserTaskRun is in the DONE state, it will have results\n\tif userTaskRun.Status == lhproto.UserTaskRunStatus_DONE {\n\t\tfmt.Println(userTaskRun.Results)\n\t}\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="e0e49b53298a4965b059a1a5df095b09"),\n user_task_guid="8bb5d43e14894c82bb1deab7a68b32ae"\n )\n\n # Fetch the UserTaskRun\n user_task_run: UserTaskRun = client.GetUserTaskRun(id)\n\n # See the current owners\n user_id = user_task_run.user_id if user_task_run.user_id else ""\n user_group = user_task_run.user_group if user_task_run.user_group else ""\n print(f"The UserTaskRun is assigned to group \'{user_group}\' and user \'{user_id}\'")\n\n # Fetch the UserTaskDef\n utd: UserTaskDef = client.GetUserTaskDef(user_task_run.user_task_def_id)\n for field in utd.fields:\n print(f"Field {field.name} has type {VariableType.Name(field.type)}")\n\n # If the UserTaskRun is in the DONE state, it will have results\n if user_task_run.status == UserTaskRunStatus.DONE:\n print(user_task_run.results)\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"complete-a-usertaskrun",children:["Complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["To complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can use the ",(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun"}),". The protobuf for the call is as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun(CompleteUserTaskRunRequest) returns (google.protobuf.Empty) {}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"CompleteUserTaskRunRequest"})," message is defined as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:"message CompleteUserTaskRunRequest {\n UserTaskRunId user_task_run_id = 1;\n map results = 2;\n string user_id = 3;\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can also consult our autogenerated API documentation for the ",(0,t.jsx)(n.a,{href:"/docs/api#completeusertaskrun",children:(0,t.jsx)(n.code,{children:"rpc CompleteUserTaskRun"})})," or for ",(0,t.jsx)(n.a,{href:"/docs/api#completeusertaskrunrequest",children:(0,t.jsx)(n.code,{children:"message CompleteUserTaskRunRequest"})}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The first field is the ",(0,t.jsx)(n.code,{children:"UserTaskRunId"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," which you intend to complete. The second is a map where each key is the name of a ",(0,t.jsx)(n.code,{children:"field"})," in the ",(0,t.jsx)(n.code,{children:"UserTaskDef"}),", and the value is a ",(0,t.jsx)(n.code,{children:"VariableValue"})," representing the value of that User Task Field. The ",(0,t.jsx)(n.code,{children:"user_id"})," field must be set and is the ",(0,t.jsx)(n.code,{children:"user_id"})," of the person completing the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The current behavior of the ",(0,t.jsx)(n.code,{children:"user_id"})," field is that, if it differs from the current owner of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", then the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," will be re-assigned to the new ",(0,t.jsx)(n.code,{children:"user_id"}),". We have an ",(0,t.jsx)(n.a,{href:"https://github.com/littlehorse-enterprises/littlehorse/issues/617",children:"open ticket"})," to make this behavior configurable. If this is an important feature for you, please comment on the ticket! We're happy to bump its priority; alternatively, we do accept Pull Requests ","\ud83d\ude04","."]}),"\n",(0,t.jsxs)(n.p,{children:["In the examples below, the user ",(0,t.jsx)(n.code,{children:"obiwan"})," will complete a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," that has two fields: a ",(0,t.jsx)(n.code,{children:"STR"})," field called ",(0,t.jsx)(n.code,{children:"requestedItem"})," set to ",(0,t.jsx)(n.code,{children:'"lightsaber"'}),", and a ",(0,t.jsx)(n.code,{children:"STR"})," field called ",(0,t.jsx)(n.code,{children:"justification"}),"."]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.CompleteUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("e0e49b53298a4965b059a1a5df095b09"))\n .setUserTaskGuid("8bb5d43e14894c82bb1deab7a68b32ae")\n .build();\n\n // Complete the UserTaskRun. The key of `putResults` is the `name` of the `UserTaskField`,\n // and the value comes from the `LHLibUtil#objToVarVal()` method which is a convenience\n // for creating a `VariableValue`.\n client.completeUserTaskRun(CompleteUserTaskRunRequest.newBuilder()\n .setUserId("obiwan") // if different than the current value, it will overwrite it.\n .putResults("requestedItem", LHLibUtil.objToVarVal("lightsaber"))\n .putResults("justification", LHLibUtil.objToVarVal("Darth Maul kicked it down the mine shaft"))\n .setUserTaskRunId(id)\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "f2491b41b7354382988215b789187b74",\n\t\t},\n\t\tUserTaskGuid: "aa87109f001b432394cec35713ef3359",\n\t}\n\n\tcompleteRequest := &lhproto.CompleteUserTaskRunRequest{\n\t\tUserTaskRunId: id,\n\t\tUserId: "obi-wan",\n\t\tResults: make(map[string]*lhproto.VariableValue),\n\t}\n\n\trequestedItem, _ := littlehorse.InterfaceToVarVal("lightsaber")\n\tjustification, _ := littlehorse.InterfaceToVarVal("Darth Maul took it away!")\n\n\tcompleteRequest.Results["requestedItem"] = requestedItem\n\tcompleteRequest.Results["justification"] = justification\n\n\t(*client).CompleteUserTaskRun(context.Background(), completeRequest)\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse import to_variable_value\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="ec9d975af1524f4cbcb988512b258623"),\n user_task_guid="f686ec1384404c27a90f86dcb4fd9edf"\n )\n\n client.CompleteUserTaskRun(CompleteUserTaskRunRequest(\n user_task_run_id=id,\n user_id="obiwan",\n results={\n "requestedItem": to_variable_value("lightsaber"),\n "justification": to_variable_value("Darth Maul kicked my old one off the balcony!")\n }\n ))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"save-a-usertaskrun",children:["Save a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["Sometimes, when a user is working on a User Task, they might want to save their progress without completing it. The ",(0,t.jsx)(n.a,{href:"/docs/api#saveusertaskrunprogress",children:(0,t.jsx)(n.code,{children:"rpc SaveUserTaskRunProgress"})})," allows you to do this."]}),"\n",(0,t.jsx)(n.p,{children:"Saving the progress of a User Task does the following:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Update the ",(0,t.jsx)(n.code,{children:"results"})," field in the ",(0,t.jsx)(n.a,{href:"/docs/api#usertaskrun",children:(0,t.jsx)(n.code,{children:"UserTaskRun"})})," object."]}),"\n",(0,t.jsxs)(n.li,{children:["Add a ",(0,t.jsx)(n.a,{href:"/docs/api#usertaskevent",children:(0,t.jsx)(n.code,{children:"UserTaskEvent"})})," to the ",(0,t.jsx)(n.code,{children:"events"})," field of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," object denoting which ",(0,t.jsx)(n.code,{children:"user_id"})," saved the progress, and what results were saved."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"policy"})," field of the ",(0,t.jsx)(n.a,{href:"/docs/api#saveusertaskrunprogressrequest",children:(0,t.jsx)(n.code,{children:"SaveUserTaskRunProgressRequest"})})," configures how to handle when the ",(0,t.jsx)(n.code,{children:"user_id"})," of the person saving the progress differs from the ",(0,t.jsx)(n.code,{children:"user_id"})," to whom the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is assigned."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"FAIL_IF_CLAIMED_BY_OTHER"}),": this is the default value for ",(0,t.jsx)(n.code,{children:"policy"}),". If the ",(0,t.jsx)(n.code,{children:"user_id"})," of the request does not match the ",(0,t.jsx)(n.code,{children:"user_id"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", then the request fails with ",(0,t.jsx)(n.code,{children:"FAILED_PRECONDITION"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IGNORE_CLAIM"}),": this value allows the caller to save the progress of a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," even when ",(0,t.jsx)(n.code,{children:"user_id"})," of the ",(0,t.jsx)(n.code,{children:"SaveUserTaskRunRequest"})," differs from the ",(0,t.jsx)(n.code,{children:"user_id"})," of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"rpc SaveUserTaskRunProgress"})," does NOT change the ownership of the ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),": the ",(0,t.jsx)(n.code,{children:"user_id"})," field is not changed by this request."]})}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.examples;\n\nimport java.io.IOException;\n\nimport io.littlehorse.sdk.common.LHLibUtil;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.SaveUserTaskRunProgressRequest;\nimport io.littlehorse.sdk.common.proto.SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\npublic class Main {\n\n public static void main(String[] args) throws IOException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("e0e49b53298a4965b059a1a5df095b09"))\n .setUserTaskGuid("8bb5d43e14894c82bb1deab7a68b32ae")\n .build();\n\n // In this example, we use the FAIL_IF_CLAIMED_BY_OTHER policy.\n client.saveUserTaskRunProgress(SaveUserTaskRunProgressRequest.newBuilder()\n .setUserTaskRunId(id)\n // If the UserTaskRun is assigned to someone other than obi-wan this will fail\n .setUserId("obi-wan")\n .setPolicy(SaveUserTaskRunAssignmentPolicy.FAIL_IF_CLAIMED_BY_OTHER)\n .putResults("some-field", LHLibUtil.objToVarVal("lightsaber"))\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "f2491b41b7354382988215b789187b74",\n\t\t},\n\t\tUserTaskGuid: "aa87109f001b432394cec35713ef3359",\n\t}\n\n\tcompleteRequest := &lhproto.SaveUserTaskRunProgressRequest{\n\t\tUserTaskRunId: id,\n\t\tUserId: "obi-wan",\n\t\tResults: make(map[string]*lhproto.VariableValue),\n\t\tPolicy: lhproto.SaveUserTaskRunProgressRequest_FAIL_IF_CLAIMED_BY_OTHER,\n\t}\n\n\trequestedItem, _ := littlehorse.InterfaceToVarVal("some-field")\n\tjustification, _ := littlehorse.InterfaceToVarVal("lightsaber")\n\n\tcompleteRequest.Results["requestedItem"] = requestedItem\n\tcompleteRequest.Results["justification"] = justification\n\n\t(*client).SaveUserTaskRunProgress(context.Background(), completeRequest)\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse import to_variable_value\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="ec9d975af1524f4cbcb988512b258623"),\n user_task_guid="f686ec1384404c27a90f86dcb4fd9edf"\n )\n\n client.SaveUserTaskRunProgress(SaveUserTaskRunProgressRequest(\n user_task_run_id=id,\n user_id="obi-wan",\n results={\n "requestedItem": to_variable_value("some-field"),\n "justification": to_variable_value("lightsaber")\n },\n policy= SaveUserTaskRunProgressRequest.SaveUserTaskRunAssignmentPolicy.FAIL_IF_CLAIMED_BY_OTHER\n ))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"re-assign-a-usertaskrun",children:["Re-Assign a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:["When building a task manager application, you may wish to have an administrative panel in which an admin may assign or re-assign tasks to various people. To re-assign a ",(0,t.jsx)(n.code,{children:"UserTaskRun"}),", you can use the request ",(0,t.jsx)(n.code,{children:"rpc AssignUserTaskRun"}),". The request proto is as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:"message AssignUserTaskRunRequest {\n UserTaskRunId user_task_run_id = 1;\n\n bool override_claim = 2;\n\n optional string user_group = 3;\n optional string user_id = 4;\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If the ",(0,t.jsx)(n.code,{children:"override_claim"})," field is set to ",(0,t.jsx)(n.code,{children:"false"})," and the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is already assigned to a specific ",(0,t.jsx)(n.code,{children:"user_id"}),", then the request will fail with ",(0,t.jsx)(n.code,{children:"FAILED_PRECONDITION"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["It is important to note that the request will ",(0,t.jsx)(n.em,{children:"overwrite"})," both the ",(0,t.jsx)(n.code,{children:"user_id"})," ",(0,t.jsx)(n.em,{children:"and"})," the ",(0,t.jsx)(n.code,{children:"user_group"})," with the provided values from this request. If the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is currently assigned to ",(0,t.jsx)(n.code,{children:"user_group == 'sales'"})," and ",(0,t.jsx)(n.code,{children:"user_id == null"}),", and a client makes the following request:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'{\n user_task_run_id: ...,\n override_claim: false,\n user_group: null,\n user_id: "sarah"\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," will be assigned to ",(0,t.jsx)(n.code,{children:'user_id: "sarah"'})," and ",(0,t.jsx)(n.code,{children:"user_group: null"}),". An example request is shown below."]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.AssignUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("a7476518fdff4dd49f47dbe40df3c5a6"))\n .setUserTaskGuid("709cac9fcd424d87810a6cabf66d400e")\n .build();\n\n // Reassign the UserTaskRun.\n client.assignUserTaskRun(AssignUserTaskRunRequest.newBuilder()\n .setUserId("mace-windu")\n .setUserGroup("jedi-temple")\n .setOverrideClaim(true)\n .setUserTaskRunId(id)\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "a7476518fdff4dd49f47dbe40df3c5a6",\n\t\t},\n\t\tUserTaskGuid: "709cac9fcd424d87810a6cabf66d400e",\n\t}\n\n\tnewUserId := "yoda"\n\tnewUserGroup := "jedi-temple"\n\n\t(*client).AssignUserTaskRun(context.Background(), &lhproto.AssignUserTaskRunRequest{\n\t\tUserTaskRunId: id,\n\t\tUserGroup: &newUserGroup,\n\t\tUserId: &newUserId,\n\t\tOverrideClaim: true,\n\t})\n}\n\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse import to_variable_value\nfrom littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="a7476518fdff4dd49f47dbe40df3c5a6"),\n user_task_guid="709cac9fcd424d87810a6cabf66d400e"\n )\n\n client.AssignUserTaskRun(AssignUserTaskRunRequest(\n user_task_run_id=id,\n user_id="yaddle",\n user_group="jedi-temple",\n override_claim=True,\n ))\n'})})})]}),"\n",(0,t.jsxs)(n.h2,{id:"cancel-a-usertaskrun",children:["Cancel a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})]}),"\n",(0,t.jsxs)(n.p,{children:['The last useful operation you may need to do when building an application using User Tasks is to "cancel" a ',(0,t.jsx)(n.code,{children:"UserTaskRun"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["By default, when a ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is cancelled, the ",(0,t.jsx)(n.code,{children:"NodeRun"})," fails with an ",(0,t.jsx)(n.code,{children:"ERROR"}),". However, in the ",(0,t.jsx)(n.code,{children:"WfSpec"})," SDK's you can configure this behavior on a case-by-case basis. For example, you can override the behavior to throw a specific business ",(0,t.jsx)(n.code,{children:"EXCEPTION"})," upon cancellation."]})}),"\n",(0,t.jsxs)(n.p,{children:["The request ",(0,t.jsx)(n.code,{children:"rpc CancelUserTaskRun"})," is quite simple. The only edge-case is that the request throws ",(0,t.jsx)(n.code,{children:"FAILED_PRECONDITION"})," if the ",(0,t.jsx)(n.code,{children:"UserTaskRun"})," is already in the ",(0,t.jsx)(n.code,{children:"DONE"})," status."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:"message CancelUserTaskRunRequest {\n UserTaskRunId user_task_run_id = 1;\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"A simple example is shown below:"}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(o.A,{value:"java",label:"Java",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package io.littlehorse.quickstart;\n\nimport java.io.IOException;\nimport io.littlehorse.sdk.common.config.LHConfig;\nimport io.littlehorse.sdk.common.proto.LittleHorseGrpc.LittleHorseBlockingStub;\nimport io.littlehorse.sdk.common.proto.CancelUserTaskRunRequest;\nimport io.littlehorse.sdk.common.proto.UserTaskRunId;\nimport io.littlehorse.sdk.common.proto.WfRunId;\n\n\npublic class Main {\n public static void main(String[] args) throws IOException, InterruptedException {\n LHConfig config = new LHConfig();\n LittleHorseBlockingStub client = config.getBlockingStub();\n\n // Get a UserTaskRunId somehow. For example, you could search for one as shown\n // in the section above.\n UserTaskRunId id = UserTaskRunId.newBuilder()\n .setWfRunId(WfRunId.newBuilder().setId("a7476518fdff4dd49f47dbe40df3c5a6"))\n .setUserTaskGuid("709cac9fcd424d87810a6cabf66d400e")\n .build();\n\n // Reassign the UserTaskRun.\n client.cancelUserTaskRun(CancelUserTaskRunRequest.newBuilder()\n .setUserTaskRunId(id)\n .build());\n }\n}\n'})})}),(0,t.jsx)(o.A,{value:"go",label:"Go",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-go",children:'package main\n\nimport (\n\t"context"\n\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse"\n\t"github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto"\n)\n\nfunc main() {\n\t// Get a client\n\tconfig := littlehorse.NewConfigFromEnv()\n\tclient, _ := config.GetGrpcClient()\n\n\t// Get a UserTaskRunId\n\tid := &lhproto.UserTaskRunId{\n\t\tWfRunId: &lhproto.WfRunId{\n\t\t\tId: "a7476518fdff4dd49f47dbe40df3c5a6",\n\t\t},\n\t\tUserTaskGuid: "709cac9fcd424d87810a6cabf66d400e",\n\t}\n\n\t(*client).CancelUserTaskRun(context.Background(), &lhproto.CancelUserTaskRunRequest{\n\t\tUserTaskRunId: id,\n\t})\n}\n'})})}),(0,t.jsx)(o.A,{value:"python",label:"Python",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:'from littlehorse.config import LHConfig\nfrom littlehorse.model import *\n\n\nif __name__ == \'__main__\':\n config = LHConfig()\n client = config.stub()\n\n # Get a UserTaskRunId from somewhere; for example, use the search described above\n id = UserTaskRunId(\n wf_run_id=WfRunId(id="a7476518fdff4dd49f47dbe40df3c5a6"),\n user_task_guid="709cac9fcd424d87810a6cabf66d400e"\n )\n\n client.CancelUserTaskRun(CancelUserTaskRunRequest(\n user_task_run_id=id,\n ))\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},9365:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var t=s(8215);const r={tabItem:"tabItem_Ymn6"};var i=s(4848);function o(e){let{children:n,hidden:s,className:o}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,o),hidden:s,children:n})}},1470:(e,n,s)=>{s.d(n,{A:()=>R});var t=s(6540),r=s(8215),i=s(3104),o=s(6347),a=s(205),l=s(7485),d=s(1682),c=s(679);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:s}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:s,attributes:t,default:r}}=e;return{value:n,label:s,attributes:t,default:r}}))}(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 p(e){let{value:n,tabValues:s}=e;return s.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:s}=e;const r=(0,o.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,l.aZ)(i),(0,t.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function f(e){const{defaultValue:n,queryString:s=!1,groupId:r}=e,i=h(e),[o,l]=(0,t.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(!p({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 t=s.find((e=>e.default))??s[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i}))),[d,u]=m({queryString:s,groupId:r}),[f,g]=function(e){let{groupId:n}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,c.Dv)(s);return[r,(0,t.useCallback)((e=>{s&&i.set(e)}),[s,i])]}({groupId:r}),k=(()=>{const e=d??f;return p({value:e,tabValues:i})?e:null})();(0,a.A)((()=>{k&&l(k)}),[k]);return{selectedValue:o,selectValue:(0,t.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),g(e)}),[u,g,i]),tabValues:i}}var g=s(2303);const k={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=s(4848);function j(e){let{className:n,block:s,selectedValue:t,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,i.a_)(),c=e=>{const n=e.currentTarget,s=l.indexOf(n),r=a[s].value;r!==t&&(d(n),o(r))},u=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;n=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;n=l[s]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":s},n),children:a.map((e=>{let{value:n,label:s,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>l.push(e),onKeyDown:u,onClick:c,...i,className:(0,r.A)("tabs__item",k.tabItem,i?.className,{"tabs__item--active":t===n}),children:s??n},n)}))})}function T(e){let{lazy:n,children:s,selectedValue:i}=e;const o=(Array.isArray(s)?s:[s]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function b(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",k.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(T,{...n,...e})]})}function R(e){const n=(0,g.A)();return(0,x.jsx)(b,{...e,children:u(e.children)},String(n))}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>a});var t=s(6540);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);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(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddb4e1f1.82873e64.js b/assets/js/ddb4e1f1.82873e64.js deleted file mode 100644 index 26ba8d9aa..000000000 --- a/assets/js/ddb4e1f1.82873e64.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[7948],{7936:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=t(4848),r=t(8453);const n={sidebar_label:"Overview"},o="LittleHorse Overview",a={id:"overview",title:"LittleHorse Overview",description:"The LittleHorse Orchestrator is a high-performance platform for building workflow-driven applications for a variety of use-cases, including:",source:"@site/docs/01-overview.md",sourceDirName:".",slug:"/overview",permalink:"/docs/overview",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_label:"Overview"},sidebar:"tutorialSidebar",next:{title:"Architecture and Guarantees",permalink:"/docs/architecture-and-guarantees"}},l={},c=[{value:"How it Works",id:"how-it-works",level:2},{value:"Run an App",id:"run-an-app",level:3},{value:"Features",id:"features",level:2},{value:"Observable",id:"observable",level:3},{value:"Flexible",id:"flexible",level:3},{value:"Mission-Critical and Secure",id:"mission-critical-and-secure",level:3},{value:"Scalable",id:"scalable",level:3},{value:"User Tasks",id:"user-tasks",level:3},{value:"What LittleHorse is NOT",id:"what-littlehorse-is-not",level:2},{value:"Fully-Featured Database",id:"fully-featured-database",level:3},{value:"Vertical Solution",id:"vertical-solution",level:3},{value:"A Container Runtime",id:"a-container-runtime",level:3},{value:"Microservice-Specific Solution",id:"microservice-specific-solution",level:3},{value:"API Management System",id:"api-management-system",level:3},{value:"ETL System",id:"etl-system",level:3},{value:"Service Mesh",id:"service-mesh",level:3},{value:"Get Started",id:"get-started",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"littlehorse-overview",children:"LittleHorse Overview"})}),"\n",(0,i.jsx)("div",{class:"video-container",children:(0,i.jsx)("iframe",{src:"https://www.youtube.com/embed/ctZaChM-izY?si=Ic25sGibOjgQxPoA",class:"video",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,i.jsx)("br",{}),"\n",(0,i.jsx)(s.p,{children:"The LittleHorse Orchestrator is a high-performance platform for building workflow-driven applications for a variety of use-cases, including:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Microservice Orchestration"}),": The LittleHorse Orchestrator allows teams to enjoy the benefits of microservices (such as independent deployment and elasticity) while mitigating some of the challenges such as observability, error handling, and schema evolution."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Business Process Management"}),": LittleHorse is perfect for orchestrating long-running business workflows. The ",(0,i.jsx)(s.code,{children:"WfSpec"})," pattern makes it much easier for your code to exactly reflect business requirements; reducing friction between Product and Eng teams."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Generative AI Workflows"}),": LLM's are fantastic, but they are prone to hallucination and sometimes don't have all the answers. When that happens, LittleHorse ",(0,i.jsx)(s.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," allow you to seamlessly put a human-in-the-loop to correct the situation."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Compliance"}),': User Tasks are also perfect for regulation-driven processes in which people from different departments within an organization must "sign off" on certain transactions.']}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Legacy App Modernization"}),": LittleHorse workflows can easily span across both modern microservices and legacy monoliths, allowing you to easily connect both worlds into one business process."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"SAGA Transactions"}),": LittleHorse's advanced Exception Handling capabilities simplify the process of rolling back transactions across multiple systems in case of a problem (for example, canceling a shipment if payment fails)."]}),"\n",(0,i.jsx)(s.li,{children:"And more."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Building applications on LittleHorse enables engineering teams to save on infrastructure costs, reduce time to market, and deliver more robust software with less downtime."}),"\n",(0,i.jsxs)(s.p,{children:["The code for the LittleHorse Orchestrator and all clients is available at ",(0,i.jsx)(s.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"our github"}),", but if you want to get started we recommend you check out our ",(0,i.jsx)(s.a,{href:"/docs/developer-guide/install",children:"Quickstart"}),". All code is free for production use under the Server-Side Public License."]}),"\n",(0,i.jsx)(s.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,i.jsx)(s.p,{children:"An application built on LittleHorse has the following three components:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["A ",(0,i.jsx)(s.a,{href:"/docs/concepts/workflows",children:"Workflow Specification"}),", also known as a ",(0,i.jsx)(s.code,{children:"WfSpec"})]}),"\n",(0,i.jsx)(s.li,{children:"A LittleHorse Cluster"}),"\n",(0,i.jsx)(s.li,{children:"Task Workers"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"WfSpec"}),", short for Workflow Specification, is a metadata object that tells the LittleHorse Orchestrator which Tasks to schedule and when they should be scheduled. The Task Workers connect to the LittleHorse Orchestrator and execute Tasks as they are scheduled."]}),"\n",(0,i.jsxs)(s.p,{children:["You as the user of LittleHorse define your own ",(0,i.jsx)(s.code,{children:"WfSpec"}),"s, and write your own Task Workers which connect to the LH Orchestrator."]}),"\n",(0,i.jsx)(s.p,{children:"A depiction of where LittleHorse sits in the tech stack can be seen below:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Depiction of LittleHorse Stack",src:t(3482).A+"",width:"1117",height:"479"})}),"\n",(0,i.jsxs)(s.p,{children:["You can think of LittleHorse as Middleware software that sits in the same layer as your database. End-user software applications occupy the layer above LittleHorse and ",(0,i.jsx)(s.em,{children:"use"})," LittleHorse to support a vertical business process."]}),"\n",(0,i.jsx)(s.h3,{id:"run-an-app",children:"Run an App"}),"\n",(0,i.jsx)(s.p,{children:"To build an application with LittleHorse, there are three easy steps:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Define your ",(0,i.jsx)(s.code,{children:"WfSpec"})]}),"\n",(0,i.jsx)(s.li,{children:"Develop your Task Workers"}),"\n",(0,i.jsxs)(s.li,{children:["Run your ",(0,i.jsx)(s.code,{children:"WfRun"}),"!"]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"tip",children:(0,i.jsxs)(s.p,{children:["The easiest way to get your first workflow up and running is with our ",(0,i.jsx)(s.a,{href:"/docs/developer-guide/install#get-started",children:"Quickstarts"}),"."]})}),"\n",(0,i.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,i.jsx)(s.p,{children:"At LittleHorse, we spent almost two years developing a cutting-edge system from the ground up so that we could provide you with a platform to future-proof your applications. Best of all, LittleHorse's source code is available and free for production use under the SSPL."}),"\n",(0,i.jsx)(s.h3,{id:"observable",children:"Observable"}),"\n",(0,i.jsx)(s.p,{children:"By virtue of orchestrating your workflows with LittleHorse, every step can be audited. You can:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Quickly find workflow instances for a certain customer when they complain about a problem."}),"\n",(0,i.jsx)(s.li,{children:"Easily view what step the workflow is on."}),"\n",(0,i.jsx)(s.li,{children:"View the inputs and outputs of every task (and hide sensitive data too!)."}),"\n",(0,i.jsx)(s.li,{children:"See stacktraces from failed tasks."}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["The following screenshot shows a stacktrace from a failed ",(0,i.jsx)(s.code,{children:"TaskRun"})," using our Java SDK. No more hours of searching through DataDog!"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"LittleHorse Dashboard",src:t(4828).A+"",width:"1389",height:"893"})}),"\n",(0,i.jsx)(s.h3,{id:"flexible",children:"Flexible"}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse has clients in Java, Go, and Python. This allows you to easily integrate existing systems into a LittleHorse Workflow with minimal code change (in Java, for example, all you need to do to turn a Method into a LittleHorse Task Worker is add the ",(0,i.jsx)(s.code,{children:"@LHTaskMethod"})," annotation)."]}),"\n",(0,i.jsxs)(s.p,{children:["Additionally, LittleHorse supports integration with external systems through the ",(0,i.jsx)(s.a,{href:"/docs/concepts/external-events",children:"External Events"})," feature, which allows LittleHorse Workflows to respond to events originating outside of the LittleHorse ecosystem."]}),"\n",(0,i.jsx)(s.h3,{id:"mission-critical-and-secure",children:"Mission-Critical and Secure"}),"\n",(0,i.jsx)(s.p,{children:"All data in LittleHorse Cloud is synchronously replicated into three separate datacenters (for example, AWS Availability Zones). LittleHorse has automated failover such that, if a server or even an entire datacenter fails, your workloads will promptly resume making progress on another data center (failover can be as low as 20 seconds)."}),"\n",(0,i.jsx)(s.p,{children:"Due to the synchronous nature of LittleHorse replication, we support an RPO of zero (no data loss) when failing over due to a server crash."}),"\n",(0,i.jsxs)(s.p,{children:["Because LittleHorse was built for mission-critical workloads, we natively implements OAuth, TLS, and mTLS for authentication and encryption. LittleHorse also supports ",(0,i.jsx)(s.a,{href:"/docs/concepts/principals-and-tenants",children:"fine-grained ACL's"})," to further lock down the system. Additionally, LittleHorse can be deployed into your own infrastructure (on-prem, private, or public cloud) so that no data leaves your four walls."]}),"\n",(0,i.jsx)(s.h3,{id:"scalable",children:"Scalable"}),"\n",(0,i.jsxs)(s.p,{children:["The LittleHorse Scheduler can scale horizontally to dozens or hundreds of servers. With only a handful of LH Server ",(0,i.jsx)(s.code,{children:"Pod"}),"s utlizing a total of just 48 cores on AWS EKS, we were able to schedule over 15,000 tasks per second. We are confident that LittleHorse can scale to meet the demands of any customer's use case."]}),"\n",(0,i.jsx)(s.p,{children:"Additionally, LittleHorse is high-performance system that introduces minimal delay. The latency between a Task being completed and the next Task being scheduled can be as low as 12-20ms; for comparison, a leading competitor's delays can reach 100-300ms."}),"\n",(0,i.jsx)(s.h3,{id:"user-tasks",children:"User Tasks"}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse has rich and native support for assigning work to humans as well as computers. With the ",(0,i.jsx)(s.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," feature, a Workflow can wait for a human to provide input, and then immediately resume and take action based on the result provided by the human. User Tasks support a variety of useful features, including:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Assignment to users or groups of users"}),"\n",(0,i.jsx)(s.li,{children:"Automatic reassignment based on deadlines"}),"\n",(0,i.jsx)(s.li,{children:"Reminder notifications"}),"\n",(0,i.jsx)(s.li,{children:"Rich API's for querying and executing User Tasks."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"what-littlehorse-is-not",children:"What LittleHorse is NOT"}),"\n",(0,i.jsxs)(s.p,{children:["As the creators of LittleHorse, we believe that LittleHorse can help almost any IT organization. However, the reason why LittleHorse is so useful is because we very explicitly chose to focus on the specific problem of ",(0,i.jsx)(s.em,{children:"high-performance process orchestration."})]}),"\n",(0,i.jsx)(s.p,{children:"As a result, there are several problems that we don't attempt to solve, and some systems that we are not. They are listed below:"}),"\n",(0,i.jsx)(s.h3,{id:"fully-featured-database",children:"Fully-Featured Database"}),"\n",(0,i.jsxs)(s.p,{children:['LittleHorse is a special type of workflow engine for building workflow-driven applications and microservices. LittleHorse has a persistent storage layer which can be queried via the grpc API. It also has indexes which allow you to search for workflows based on the value of certain variables (eg. "find the workflow with ',(0,i.jsx)(s.code,{children:"email == foo@bar.com"}),'), workflow status (eg. "find all failed workflows in the last 2 days"), and workflow type. It is indeed possible to build a REST API using only LittleHorse as a data stores; in fact, it is often a good idea.']}),"\n",(0,i.jsxs)(s.p,{children:["However, LittleHorse's persistence layer is ",(0,i.jsx)(s.em,{children:"not"})," a general-purpose database. It lacks the rich feature set of SQL, and you cannot use LittleHorse as a store for arbitrary data structures. If your data model is not a workflow, LittleHorse cannot store it."]}),"\n",(0,i.jsx)(s.h3,{id:"vertical-solution",children:"Vertical Solution"}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse is intended to be used by Software Engineers ",(0,i.jsx)(s.em,{children:"in any industry"})," to build products that can be used by end-users. The current iteration is ",(0,i.jsx)(s.em,{children:"not"})," intended as a system to be used by Business Users to update business flows; rather, it is intended to ",(0,i.jsx)(s.em,{children:"reduce the turnaround time"})," when a Business User asks the IT Organization to implement a new application to automate a specific business flow."]}),"\n",(0,i.jsx)(s.p,{children:"However, LittleHorse has a certified implementation partner who can deliver a turnkey, end-to-end BPM solution to clients who require BPM solutions but do not have the engineering resources to implement one on their own."}),"\n",(0,i.jsx)(s.h3,{id:"a-container-runtime",children:"A Container Runtime"}),"\n",(0,i.jsx)(s.p,{children:'In the past, we described LittleHorse as a "microservice orchestration engine" because it orchestrates the activities of various microservices in a business flow. However, we no longer use that description since it causes confusion with Kubernetes, Nomad, Mesos, and other similar systems.'}),"\n",(0,i.jsx)(s.p,{children:"Rather than being a competitor or replacement for the aforementioned runtime systems, LittleHorse is unopinionated about where your code runs. LittleHorse (and especially LittleHorse Cloud) is compatible with any deployment system; all you need to do is provide the LittleHorse Server URL to your software system and it is LittleHorse-enabled, no matter where it runs."}),"\n",(0,i.jsx)(s.h3,{id:"microservice-specific-solution",children:"Microservice-Specific Solution"}),"\n",(0,i.jsx)(s.p,{children:"You do not need microservices in order to benefit from LittleHorse."}),"\n",(0,i.jsx)(s.p,{children:"It is true that LittleHorse solves many problems that microservice developers face (such as orchestrating transactions across multiple systems, error handling, and observability); however, you can use LittleHorse workflows with a monolithic architecture (in fact, we use this exact strategy in our LittleHorse Cloud back-office implementation)."}),"\n",(0,i.jsx)(s.p,{children:"In monolithic applications, LittleHorse can help several difficult problems such as:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Long-running workflows that span days or weeks and require human input."}),"\n",(0,i.jsx)(s.li,{children:"Atomic updates to external systems and API's."}),"\n",(0,i.jsx)(s.li,{children:"Observability and auditing of transactions."}),"\n",(0,i.jsx)(s.li,{children:"Ensuring that code and business requirements are well-connected."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"The way to integrate LittleHorse with a monolithic app server (for example, Spring Boot) is:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["The app server upserts the ",(0,i.jsx)(s.code,{children:"WfSpec"})," upon startup via ",(0,i.jsx)(s.code,{children:"rpc PutWfSpec"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Web endpoints (eg. REST, GRPC) on the app server result in calls to LittleHorse to run a ",(0,i.jsx)(s.code,{children:"WfRun"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"The app server process also runs Task Workers to implement the tasks in the workflow."}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"api-management-system",children:"API Management System"}),"\n",(0,i.jsx)(s.p,{children:"API gateways like Kong and MuleSoft act as intermediaries that manage, monitor, and secure interactions between client applications and backend services. In contrast, LittleHorse orchestrates complex business processes and automates sequences of tasks across different systems. While API gateways focus request routing, traffic control, and governance, LittleHorse emphasizes process execution, task coordination, and long-running workflows."}),"\n",(0,i.jsx)(s.h3,{id:"etl-system",children:"ETL System"}),"\n",(0,i.jsx)(s.p,{children:"LittleHorse is designed for dynamic, low-latency business process flows and not for bulk batch-loading flows or data transformation flows. We have a rich feature set which makes LittleHorse fantastic for orchestrating and debugging live (low-latency) workflow-driven applications and business process flows; however, LittleHorse's design lends itself less well for batch ETL and data ingestion + transformation."}),"\n",(0,i.jsxs)(s.p,{children:["For batch orchestration, we recommend systems like Airflow (",(0,i.jsx)(s.a,{href:"https://astronomer.io",children:"Astronomer"})," has a fantastic Cloud Service for Airflow)."]}),"\n",(0,i.jsxs)(s.p,{children:["For data ingestion, consider systems like ",(0,i.jsx)(s.a,{href:"https://kafka.apache.org",children:"Kafka"})," and Kafka Connect; for data transformation and processing we would recommend considering ",(0,i.jsx)(s.a,{href:"https://kafka.apache.org/documentation/streams/",children:"Kafka Streams"})," or (if you need to process data outside of Kafka) ",(0,i.jsx)(s.a,{href:"https://flink.apache.org",children:"Flink"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"service-mesh",children:"Service Mesh"}),"\n",(0,i.jsx)(s.p,{children:'To say that LittleHorse is "a system that intelligently routes tasks between your microservices" is mostly correct, but it is vague enough to mislead. In particular, you might ask, "doesn\'t a service mesh like Istio or a proxy like Envoy do the same?".'}),"\n",(0,i.jsxs)(s.p,{children:["Service mesh implementations such as ",(0,i.jsx)(s.a,{href:"https://istio.io",children:"Istio"})," provide many awesome features, but the two most common use-cases are securing traffic at the L4 layer (mTLS) and request routing, for example with a ",(0,i.jsx)(s.a,{href:"https://istio.io/latest/docs/reference/config/networking/virtual-service/",children:(0,i.jsx)(s.code,{children:"VirtualService"})}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse sits ",(0,i.jsx)(s.em,{children:"above"}),' the Istio layer. The LittleHorse Server is a server that LittleHorse Clients (eg. Task Workers and your Microservices) connect to. The Task Workers listen to virtual "task queues" within LittleHorse, and the LittleHorse Server dispatches ',(0,i.jsx)(s.a,{href:"/docs/concepts/tasks",children:"Tasks"})," to the Task Workers according to the workflows."]}),"\n",(0,i.jsx)(s.h2,{id:"get-started",children:"Get Started"}),"\n",(0,i.jsx)(s.p,{children:"Want to painlessly automate your workflows?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Check out our ",(0,i.jsx)(s.a,{href:"/docs/developer-guide/install",children:"Quickstarts"})]}),"\n",(0,i.jsxs)(s.li,{children:["Join our ",(0,i.jsx)(s.a,{href:"https://launchpass.com/littlehorsecommunity",children:"Slack Community"})]}),"\n",(0,i.jsxs)(s.li,{children:["Check out our code on ",(0,i.jsx)(s.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"Github"})]}),"\n",(0,i.jsxs)(s.li,{children:["Request early access to ",(0,i.jsx)(s.a,{href:"https://docs.google.com/forms/d/e/1FAIpQLScXVvTYy4LQnYoFoRKRQ7ppuxe0KgncsDukvm96qKN0pU5TnQ/viewform?usp=sf_link",children:"LittleHorse Cloud"})]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Ride well!"})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},4828:(e,s,t)=>{t.d(s,{A:()=>i});const i=t.p+"assets/images/dashboard-front-page-17f6c241efc60b681fd32956e32ffff4.png"},3482:(e,s,t)=>{t.d(s,{A:()=>i});const i=t.p+"assets/images/littlehorse-in-the-stack-169df1cd38f1c4f2346c21f077419c7f.png"},8453:(e,s,t)=>{t.d(s,{R:()=>o,x:()=>a});var i=t(6540);const r={},n=i.createContext(r);function o(e){const s=i.useContext(n);return i.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(r):e.components||r:o(e.components),i.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddb4e1f1.f93c2875.js b/assets/js/ddb4e1f1.f93c2875.js new file mode 100644 index 000000000..954f02670 --- /dev/null +++ b/assets/js/ddb4e1f1.f93c2875.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[7948],{7936:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=t(4848),r=t(8453);const n={sidebar_label:"Overview"},o="LittleHorse Overview",a={id:"overview",title:"LittleHorse Overview",description:"The LittleHorse Orchestrator is a high-performance platform for building workflow-driven applications for a variety of use-cases, including:",source:"@site/docs/01-overview.md",sourceDirName:".",slug:"/overview",permalink:"/docs/overview",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_label:"Overview"},sidebar:"tutorialSidebar",next:{title:"Architecture and Guarantees",permalink:"/docs/architecture-and-guarantees"}},l={},c=[{value:"How it Works",id:"how-it-works",level:2},{value:"Run an App",id:"run-an-app",level:3},{value:"Features",id:"features",level:2},{value:"Observable",id:"observable",level:3},{value:"Flexible",id:"flexible",level:3},{value:"Mission-Critical and Secure",id:"mission-critical-and-secure",level:3},{value:"Scalable",id:"scalable",level:3},{value:"User Tasks",id:"user-tasks",level:3},{value:"What LittleHorse is NOT",id:"what-littlehorse-is-not",level:2},{value:"Fully-Featured Database",id:"fully-featured-database",level:3},{value:"Vertical Solution",id:"vertical-solution",level:3},{value:"A Container Runtime",id:"a-container-runtime",level:3},{value:"Microservice-Specific Solution",id:"microservice-specific-solution",level:3},{value:"API Management System",id:"api-management-system",level:3},{value:"ETL System",id:"etl-system",level:3},{value:"Service Mesh",id:"service-mesh",level:3},{value:"Get Started",id:"get-started",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"littlehorse-overview",children:"LittleHorse Overview"})}),"\n",(0,i.jsx)("div",{className:"video-container",children:(0,i.jsx)("iframe",{src:"https://www.youtube.com/embed/ctZaChM-izY?si=Ic25sGibOjgQxPoA",className:"video",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,i.jsx)("br",{}),"\n",(0,i.jsx)(s.p,{children:"The LittleHorse Orchestrator is a high-performance platform for building workflow-driven applications for a variety of use-cases, including:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Microservice Orchestration"}),": The LittleHorse Orchestrator allows teams to enjoy the benefits of microservices (such as independent deployment and elasticity) while mitigating some of the challenges such as observability, error handling, and schema evolution."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Business Process Management"}),": LittleHorse is perfect for orchestrating long-running business workflows. The ",(0,i.jsx)(s.code,{children:"WfSpec"})," pattern makes it much easier for your code to exactly reflect business requirements; reducing friction between Product and Eng teams."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Generative AI Workflows"}),": LLM's are fantastic, but they are prone to hallucination and sometimes don't have all the answers. When that happens, LittleHorse ",(0,i.jsx)(s.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," allow you to seamlessly put a human-in-the-loop to correct the situation."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Compliance"}),': User Tasks are also perfect for regulation-driven processes in which people from different departments within an organization must "sign off" on certain transactions.']}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Legacy App Modernization"}),": LittleHorse workflows can easily span across both modern microservices and legacy monoliths, allowing you to easily connect both worlds into one business process."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"SAGA Transactions"}),": LittleHorse's advanced Exception Handling capabilities simplify the process of rolling back transactions across multiple systems in case of a problem (for example, canceling a shipment if payment fails)."]}),"\n",(0,i.jsx)(s.li,{children:"And more."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Building applications on LittleHorse enables engineering teams to save on infrastructure costs, reduce time to market, and deliver more robust software with less downtime."}),"\n",(0,i.jsxs)(s.p,{children:["The code for the LittleHorse Orchestrator and all clients is available at ",(0,i.jsx)(s.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"our github"}),", but if you want to get started we recommend you check out our ",(0,i.jsx)(s.a,{href:"/docs/developer-guide/install",children:"Quickstart"}),". All code is free for production use under the Server-Side Public License."]}),"\n",(0,i.jsx)(s.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,i.jsx)(s.p,{children:"An application built on LittleHorse has the following three components:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["A ",(0,i.jsx)(s.a,{href:"/docs/concepts/workflows",children:"Workflow Specification"}),", also known as a ",(0,i.jsx)(s.code,{children:"WfSpec"})]}),"\n",(0,i.jsx)(s.li,{children:"A LittleHorse Cluster"}),"\n",(0,i.jsx)(s.li,{children:"Task Workers"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"WfSpec"}),", short for Workflow Specification, is a metadata object that tells the LittleHorse Orchestrator which Tasks to schedule and when they should be scheduled. The Task Workers connect to the LittleHorse Orchestrator and execute Tasks as they are scheduled."]}),"\n",(0,i.jsxs)(s.p,{children:["You as the user of LittleHorse define your own ",(0,i.jsx)(s.code,{children:"WfSpec"}),"s, and write your own Task Workers which connect to the LH Orchestrator."]}),"\n",(0,i.jsx)(s.p,{children:"A depiction of where LittleHorse sits in the tech stack can be seen below:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Depiction of LittleHorse Stack",src:t(3482).A+"",width:"1117",height:"479"})}),"\n",(0,i.jsxs)(s.p,{children:["You can think of LittleHorse as Middleware software that sits in the same layer as your database. End-user software applications occupy the layer above LittleHorse and ",(0,i.jsx)(s.em,{children:"use"})," LittleHorse to support a vertical business process."]}),"\n",(0,i.jsx)(s.h3,{id:"run-an-app",children:"Run an App"}),"\n",(0,i.jsx)(s.p,{children:"To build an application with LittleHorse, there are three easy steps:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Define your ",(0,i.jsx)(s.code,{children:"WfSpec"})]}),"\n",(0,i.jsx)(s.li,{children:"Develop your Task Workers"}),"\n",(0,i.jsxs)(s.li,{children:["Run your ",(0,i.jsx)(s.code,{children:"WfRun"}),"!"]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"tip",children:(0,i.jsxs)(s.p,{children:["The easiest way to get your first workflow up and running is with our ",(0,i.jsx)(s.a,{href:"/docs/developer-guide/install#get-started",children:"Quickstarts"}),"."]})}),"\n",(0,i.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,i.jsx)(s.p,{children:"At LittleHorse, we spent almost two years developing a cutting-edge system from the ground up so that we could provide you with a platform to future-proof your applications. Best of all, LittleHorse's source code is available and free for production use under the SSPL."}),"\n",(0,i.jsx)(s.h3,{id:"observable",children:"Observable"}),"\n",(0,i.jsx)(s.p,{children:"By virtue of orchestrating your workflows with LittleHorse, every step can be audited. You can:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Quickly find workflow instances for a certain customer when they complain about a problem."}),"\n",(0,i.jsx)(s.li,{children:"Easily view what step the workflow is on."}),"\n",(0,i.jsx)(s.li,{children:"View the inputs and outputs of every task (and hide sensitive data too!)."}),"\n",(0,i.jsx)(s.li,{children:"See stacktraces from failed tasks."}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["The following screenshot shows a stacktrace from a failed ",(0,i.jsx)(s.code,{children:"TaskRun"})," using our Java SDK. No more hours of searching through DataDog!"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"LittleHorse Dashboard",src:t(4828).A+"",width:"1389",height:"893"})}),"\n",(0,i.jsx)(s.h3,{id:"flexible",children:"Flexible"}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse has clients in Java, Go, and Python. This allows you to easily integrate existing systems into a LittleHorse Workflow with minimal code change (in Java, for example, all you need to do to turn a Method into a LittleHorse Task Worker is add the ",(0,i.jsx)(s.code,{children:"@LHTaskMethod"})," annotation)."]}),"\n",(0,i.jsxs)(s.p,{children:["Additionally, LittleHorse supports integration with external systems through the ",(0,i.jsx)(s.a,{href:"/docs/concepts/external-events",children:"External Events"})," feature, which allows LittleHorse Workflows to respond to events originating outside of the LittleHorse ecosystem."]}),"\n",(0,i.jsx)(s.h3,{id:"mission-critical-and-secure",children:"Mission-Critical and Secure"}),"\n",(0,i.jsx)(s.p,{children:"All data in LittleHorse Cloud is synchronously replicated into three separate datacenters (for example, AWS Availability Zones). LittleHorse has automated failover such that, if a server or even an entire datacenter fails, your workloads will promptly resume making progress on another data center (failover can be as low as 20 seconds)."}),"\n",(0,i.jsx)(s.p,{children:"Due to the synchronous nature of LittleHorse replication, we support an RPO of zero (no data loss) when failing over due to a server crash."}),"\n",(0,i.jsxs)(s.p,{children:["Because LittleHorse was built for mission-critical workloads, we natively implements OAuth, TLS, and mTLS for authentication and encryption. LittleHorse also supports ",(0,i.jsx)(s.a,{href:"/docs/concepts/principals-and-tenants",children:"fine-grained ACL's"})," to further lock down the system. Additionally, LittleHorse can be deployed into your own infrastructure (on-prem, private, or public cloud) so that no data leaves your four walls."]}),"\n",(0,i.jsx)(s.h3,{id:"scalable",children:"Scalable"}),"\n",(0,i.jsxs)(s.p,{children:["The LittleHorse Scheduler can scale horizontally to dozens or hundreds of servers. With only a handful of LH Server ",(0,i.jsx)(s.code,{children:"Pod"}),"s utlizing a total of just 48 cores on AWS EKS, we were able to schedule over 15,000 tasks per second. We are confident that LittleHorse can scale to meet the demands of any customer's use case."]}),"\n",(0,i.jsx)(s.p,{children:"Additionally, LittleHorse is high-performance system that introduces minimal delay. The latency between a Task being completed and the next Task being scheduled can be as low as 12-20ms; for comparison, a leading competitor's delays can reach 100-300ms."}),"\n",(0,i.jsx)(s.h3,{id:"user-tasks",children:"User Tasks"}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse has rich and native support for assigning work to humans as well as computers. With the ",(0,i.jsx)(s.a,{href:"/docs/concepts/user-tasks",children:"User Tasks"})," feature, a Workflow can wait for a human to provide input, and then immediately resume and take action based on the result provided by the human. User Tasks support a variety of useful features, including:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Assignment to users or groups of users"}),"\n",(0,i.jsx)(s.li,{children:"Automatic reassignment based on deadlines"}),"\n",(0,i.jsx)(s.li,{children:"Reminder notifications"}),"\n",(0,i.jsx)(s.li,{children:"Rich API's for querying and executing User Tasks."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"what-littlehorse-is-not",children:"What LittleHorse is NOT"}),"\n",(0,i.jsxs)(s.p,{children:["As the creators of LittleHorse, we believe that LittleHorse can help almost any IT organization. However, the reason why LittleHorse is so useful is because we very explicitly chose to focus on the specific problem of ",(0,i.jsx)(s.em,{children:"high-performance process orchestration."})]}),"\n",(0,i.jsx)(s.p,{children:"As a result, there are several problems that we don't attempt to solve, and some systems that we are not. They are listed below:"}),"\n",(0,i.jsx)(s.h3,{id:"fully-featured-database",children:"Fully-Featured Database"}),"\n",(0,i.jsxs)(s.p,{children:['LittleHorse is a special type of workflow engine for building workflow-driven applications and microservices. LittleHorse has a persistent storage layer which can be queried via the grpc API. It also has indexes which allow you to search for workflows based on the value of certain variables (eg. "find the workflow with ',(0,i.jsx)(s.code,{children:"email == foo@bar.com"}),'), workflow status (eg. "find all failed workflows in the last 2 days"), and workflow type. It is indeed possible to build a REST API using only LittleHorse as a data stores; in fact, it is often a good idea.']}),"\n",(0,i.jsxs)(s.p,{children:["However, LittleHorse's persistence layer is ",(0,i.jsx)(s.em,{children:"not"})," a general-purpose database. It lacks the rich feature set of SQL, and you cannot use LittleHorse as a store for arbitrary data structures. If your data model is not a workflow, LittleHorse cannot store it."]}),"\n",(0,i.jsx)(s.h3,{id:"vertical-solution",children:"Vertical Solution"}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse is intended to be used by Software Engineers ",(0,i.jsx)(s.em,{children:"in any industry"})," to build products that can be used by end-users. The current iteration is ",(0,i.jsx)(s.em,{children:"not"})," intended as a system to be used by Business Users to update business flows; rather, it is intended to ",(0,i.jsx)(s.em,{children:"reduce the turnaround time"})," when a Business User asks the IT Organization to implement a new application to automate a specific business flow."]}),"\n",(0,i.jsx)(s.p,{children:"However, LittleHorse has a certified implementation partner who can deliver a turnkey, end-to-end BPM solution to clients who require BPM solutions but do not have the engineering resources to implement one on their own."}),"\n",(0,i.jsx)(s.h3,{id:"a-container-runtime",children:"A Container Runtime"}),"\n",(0,i.jsx)(s.p,{children:'In the past, we described LittleHorse as a "microservice orchestration engine" because it orchestrates the activities of various microservices in a business flow. However, we no longer use that description since it causes confusion with Kubernetes, Nomad, Mesos, and other similar systems.'}),"\n",(0,i.jsx)(s.p,{children:"Rather than being a competitor or replacement for the aforementioned runtime systems, LittleHorse is unopinionated about where your code runs. LittleHorse (and especially LittleHorse Cloud) is compatible with any deployment system; all you need to do is provide the LittleHorse Server URL to your software system and it is LittleHorse-enabled, no matter where it runs."}),"\n",(0,i.jsx)(s.h3,{id:"microservice-specific-solution",children:"Microservice-Specific Solution"}),"\n",(0,i.jsx)(s.p,{children:"You do not need microservices in order to benefit from LittleHorse."}),"\n",(0,i.jsx)(s.p,{children:"It is true that LittleHorse solves many problems that microservice developers face (such as orchestrating transactions across multiple systems, error handling, and observability); however, you can use LittleHorse workflows with a monolithic architecture (in fact, we use this exact strategy in our LittleHorse Cloud back-office implementation)."}),"\n",(0,i.jsx)(s.p,{children:"In monolithic applications, LittleHorse can help several difficult problems such as:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Long-running workflows that span days or weeks and require human input."}),"\n",(0,i.jsx)(s.li,{children:"Atomic updates to external systems and API's."}),"\n",(0,i.jsx)(s.li,{children:"Observability and auditing of transactions."}),"\n",(0,i.jsx)(s.li,{children:"Ensuring that code and business requirements are well-connected."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"The way to integrate LittleHorse with a monolithic app server (for example, Spring Boot) is:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["The app server upserts the ",(0,i.jsx)(s.code,{children:"WfSpec"})," upon startup via ",(0,i.jsx)(s.code,{children:"rpc PutWfSpec"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Web endpoints (eg. REST, GRPC) on the app server result in calls to LittleHorse to run a ",(0,i.jsx)(s.code,{children:"WfRun"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"The app server process also runs Task Workers to implement the tasks in the workflow."}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"api-management-system",children:"API Management System"}),"\n",(0,i.jsx)(s.p,{children:"API gateways like Kong and MuleSoft act as intermediaries that manage, monitor, and secure interactions between client applications and backend services. In contrast, LittleHorse orchestrates complex business processes and automates sequences of tasks across different systems. While API gateways focus request routing, traffic control, and governance, LittleHorse emphasizes process execution, task coordination, and long-running workflows."}),"\n",(0,i.jsx)(s.h3,{id:"etl-system",children:"ETL System"}),"\n",(0,i.jsx)(s.p,{children:"LittleHorse is designed for dynamic, low-latency business process flows and not for bulk batch-loading flows or data transformation flows. We have a rich feature set which makes LittleHorse fantastic for orchestrating and debugging live (low-latency) workflow-driven applications and business process flows; however, LittleHorse's design lends itself less well for batch ETL and data ingestion + transformation."}),"\n",(0,i.jsxs)(s.p,{children:["For batch orchestration, we recommend systems like Airflow (",(0,i.jsx)(s.a,{href:"https://astronomer.io",children:"Astronomer"})," has a fantastic Cloud Service for Airflow)."]}),"\n",(0,i.jsxs)(s.p,{children:["For data ingestion, consider systems like ",(0,i.jsx)(s.a,{href:"https://kafka.apache.org",children:"Kafka"})," and Kafka Connect; for data transformation and processing we would recommend considering ",(0,i.jsx)(s.a,{href:"https://kafka.apache.org/documentation/streams/",children:"Kafka Streams"})," or (if you need to process data outside of Kafka) ",(0,i.jsx)(s.a,{href:"https://flink.apache.org",children:"Flink"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"service-mesh",children:"Service Mesh"}),"\n",(0,i.jsx)(s.p,{children:'To say that LittleHorse is "a system that intelligently routes tasks between your microservices" is mostly correct, but it is vague enough to mislead. In particular, you might ask, "doesn\'t a service mesh like Istio or a proxy like Envoy do the same?".'}),"\n",(0,i.jsxs)(s.p,{children:["Service mesh implementations such as ",(0,i.jsx)(s.a,{href:"https://istio.io",children:"Istio"})," provide many awesome features, but the two most common use-cases are securing traffic at the L4 layer (mTLS) and request routing, for example with a ",(0,i.jsx)(s.a,{href:"https://istio.io/latest/docs/reference/config/networking/virtual-service/",children:(0,i.jsx)(s.code,{children:"VirtualService"})}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["LittleHorse sits ",(0,i.jsx)(s.em,{children:"above"}),' the Istio layer. The LittleHorse Server is a server that LittleHorse Clients (eg. Task Workers and your Microservices) connect to. The Task Workers listen to virtual "task queues" within LittleHorse, and the LittleHorse Server dispatches ',(0,i.jsx)(s.a,{href:"/docs/concepts/tasks",children:"Tasks"})," to the Task Workers according to the workflows."]}),"\n",(0,i.jsx)(s.h2,{id:"get-started",children:"Get Started"}),"\n",(0,i.jsx)(s.p,{children:"Want to painlessly automate your workflows?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Check out our ",(0,i.jsx)(s.a,{href:"/docs/developer-guide/install",children:"Quickstarts"})]}),"\n",(0,i.jsxs)(s.li,{children:["Join our ",(0,i.jsx)(s.a,{href:"https://launchpass.com/littlehorsecommunity",children:"Slack Community"})]}),"\n",(0,i.jsxs)(s.li,{children:["Check out our code on ",(0,i.jsx)(s.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"Github"})]}),"\n",(0,i.jsxs)(s.li,{children:["Request early access to ",(0,i.jsx)(s.a,{href:"https://docs.google.com/forms/d/e/1FAIpQLScXVvTYy4LQnYoFoRKRQ7ppuxe0KgncsDukvm96qKN0pU5TnQ/viewform?usp=sf_link",children:"LittleHorse Cloud"})]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Ride well!"})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},4828:(e,s,t)=>{t.d(s,{A:()=>i});const i=t.p+"assets/images/dashboard-front-page-17f6c241efc60b681fd32956e32ffff4.png"},3482:(e,s,t)=>{t.d(s,{A:()=>i});const i=t.p+"assets/images/littlehorse-in-the-stack-169df1cd38f1c4f2346c21f077419c7f.png"},8453:(e,s,t)=>{t.d(s,{R:()=>o,x:()=>a});var i=t(6540);const r={},n=i.createContext(r);function o(e){const s=i.useContext(n);return i.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(r):e.components||r:o(e.components),i.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb7e2344.21ec2458.js b/assets/js/fb7e2344.21ec2458.js deleted file mode 100644 index c90710e40..000000000 --- a/assets/js/fb7e2344.21ec2458.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[7142],{8066:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var o=i(4848),n=i(8453);const r={},s="Operations",a={id:"operations/operations",title:"Operations",description:"LittleHorse OSS, which can be found on our GitHub, contains all of the LittleHorse functionality. It is an enterprise-ready workflow engine that can scale to the largest workloads while meeting the most strict security requirements when deployed on premise.",source:"@site/docs/06-operations/06-operations.md",sourceDirName:"06-operations",slug:"/operations/",permalink:"/docs/operations/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Handling User Tasks",permalink:"/docs/developer-guide/grpc/user-tasks"},next:{title:"Operations Overview",permalink:"/docs/operations/overview"}},l={},c=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"operations",children:"Operations"})}),"\n",(0,o.jsxs)(t.p,{children:["LittleHorse OSS, which can be found on ",(0,o.jsx)(t.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"our GitHub"}),", contains all of the LittleHorse functionality. It is an enterprise-ready workflow engine that can scale to the largest workloads while meeting the most strict security requirements when deployed on premise."]}),"\n",(0,o.jsxs)(t.p,{children:["Additionally, it is licensed according to the ",(0,o.jsx)(t.a,{href:"https://www.mongodb.com/licensing/server-side-public-license",children:"Server-Side Public License"}),", meaning that any organization may use LH OSS in production without consequence so long as their product is not LittleHorse-as-a-Service but rather a different product ",(0,o.jsx)(t.em,{children:"powered by"})," LittleHorse."]}),"\n",(0,o.jsx)(t.p,{children:"This section is intended to give the community the information that they need in order to successfully run LittleHorse in production."}),"\n",(0,o.jsxs)(t.p,{children:["In addition to reading the docs, we recommend that you join our ",(0,o.jsx)(t.a,{href:"https://launchpass.com/littlehorsecommunity",children:"Slack Community"}),", and please ask any questions there and raise issues on ",(0,o.jsx)(t.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"our GitHub"}),"."]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsxs)(t.p,{children:["If you would like professional support service for LittleHorse OSS, contact the LittleHorse Enterprises LLC team at ",(0,o.jsx)(t.code,{children:"sales@littlehorse.io"})," or visit our ",(0,o.jsx)(t.a,{href:"https://littlehorse.io",children:"website"}),". Alternatively, LittleHorse Enterprises provides a managed on-premise service (",(0,o.jsx)(t.a,{href:"https://www.littlehorse.io/lh-platform",children:"LH Platform"}),") and a fully-managed cloud service (",(0,o.jsx)(t.a,{href:"https://www.littlehorse.io/lh-cloud",children:"LH Cloud"}),") for LittleHorse."]})})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var o=i(6540);const n={},r=o.createContext(n);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(n):e.components||n:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb7e2344.d1fce15a.js b/assets/js/fb7e2344.d1fce15a.js new file mode 100644 index 000000000..33786b63b --- /dev/null +++ b/assets/js/fb7e2344.d1fce15a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[7142],{8066:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=o(4848),n=o(8453);const r={},s="Operations",a={id:"operations/operations",title:"Operations",description:"LittleHorse OSS, which can be found on our GitHub, contains all of the LittleHorse functionality. It is an enterprise-ready workflow engine that can scale to the largest workloads while meeting the most strict security requirements when deployed on premise.",source:"@site/docs/06-operations/06-operations.md",sourceDirName:"06-operations",slug:"/operations/",permalink:"/docs/operations/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Await Workflow Events",permalink:"/docs/developer-guide/grpc/advanced/await-workflow-events"},next:{title:"Operations Overview",permalink:"/docs/operations/overview"}},l={},c=[];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"operations",children:"Operations"})}),"\n",(0,i.jsxs)(t.p,{children:["LittleHorse OSS, which can be found on ",(0,i.jsx)(t.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"our GitHub"}),", contains all of the LittleHorse functionality. It is an enterprise-ready workflow engine that can scale to the largest workloads while meeting the most strict security requirements when deployed on premise."]}),"\n",(0,i.jsxs)(t.p,{children:["Additionally, it is licensed according to the ",(0,i.jsx)(t.a,{href:"https://www.mongodb.com/licensing/server-side-public-license",children:"Server-Side Public License"}),", meaning that any organization may use LH OSS in production without consequence so long as their product is not LittleHorse-as-a-Service but rather a different product ",(0,i.jsx)(t.em,{children:"powered by"})," LittleHorse."]}),"\n",(0,i.jsx)(t.p,{children:"This section is intended to give the community the information that they need in order to successfully run LittleHorse in production."}),"\n",(0,i.jsxs)(t.p,{children:["In addition to reading the docs, we recommend that you join our ",(0,i.jsx)(t.a,{href:"https://launchpass.com/littlehorsecommunity",children:"Slack Community"}),", and please ask any questions there and raise issues on ",(0,i.jsx)(t.a,{href:"https://github.com/littlehorse-enterprises/littlehorse",children:"our GitHub"}),"."]}),"\n",(0,i.jsx)(t.admonition,{type:"tip",children:(0,i.jsxs)(t.p,{children:["If you would like professional support service for LittleHorse OSS, contact the LittleHorse Enterprises LLC team at ",(0,i.jsx)(t.code,{children:"sales@littlehorse.io"})," or visit our ",(0,i.jsx)(t.a,{href:"https://littlehorse.io",children:"website"}),". Alternatively, LittleHorse Enterprises provides a managed on-premise service (",(0,i.jsx)(t.a,{href:"https://www.littlehorse.io/lh-platform",children:"LH Platform"}),") and a fully-managed cloud service (",(0,i.jsx)(t.a,{href:"https://www.littlehorse.io/lh-cloud",children:"LH Cloud"}),") for LittleHorse."]})})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var i=o(6540);const n={},r=i.createContext(n);function s(e){const t=i.useContext(r);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:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.bb74e6f2.js b/assets/js/main.bb74e6f2.js new file mode 100644 index 000000000..49368b636 --- /dev/null +++ b/assets/js/main.bb74e6f2.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bb74e6f2.js.LICENSE.txt */ +(self.webpackChunklh_site=self.webpackChunklh_site||[]).push([[8792],{3219:(e,t,n)=>{"use strict";n.d(t,{Bc:()=>g,E8:()=>Hn,a1:()=>Un});var r=n(6540);n(961);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function c(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(e){l=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(l)throw o}}return a}}(e,t)||d(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e){return function(e){if(Array.isArray(e))return p(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||d(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(e,t){if(e){if("string"==typeof e)return p(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?p(e,t):void 0}}function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function L(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function R(e){for(var t=1;t=3||2===n&&r>=4||1===n&&r>=10);function a(t,n,r){if(o&&void 0!==r){var a=r[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[t].concat(P(n),[{headers:i}]))}else e.apply(void 0,[t].concat(P(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("clickedObjectIDsAfterSearch",M(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("clickedObjectIDs",M(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("convertedObjectIDsAfterSearch",M(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("convertedObjectIDs",M(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&t.reduce((function(e,t){var n=t.items,r=N(t,j);return[].concat(P(e),P(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function B(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function z(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function $(e){return $="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},$(e)}function U(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?H(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&G({onItemsChange:r,items:n,insights:l,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;i("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:l}}),n((function(e){var t=e.item,n=e.state,r=e.event;z(t)&&o({state:n,event:r,insights:l,item:t,insightsEvents:[V({eventName:"Item Selected"},O({item:t,items:s.current}))]})})),r((function(e){var t=e.item,n=e.state,r=e.event;z(t)&&a({state:n,event:r,insights:l,item:t,insightsEvents:[V({eventName:"Item Active"},O({item:t,items:s.current}))]})}))},onStateChange:function(e){var t=e.state;c({state:t})},__autocomplete_pluginOptions:e}}function Y(e,t){var n=t;return{then:function(t,r){return Y(e.then(X(t,n,e),X(r,n,e)),n)},catch:function(t){return Y(e.catch(X(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),Y(e.finally(X(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function Z(e){return Y(e,{isCanceled:!1,onCancelList:[]})}function X(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function J(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function te(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(w++),plugins:o,initialState:ge({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(function(e){return function(e){if(Array.isArray(e))return me(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return me(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?me(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:E,onResolve:E};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=te(te({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return y(e)})).then((function(e){return e.map((function(e){return ge(ge({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:ge({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function ye(e){return ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ye(e)}function we(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Se(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Ie);Be&&o.environment.clearTimeout(Be);var c=s.setCollections,u=s.setIsOpen,d=s.setQuery,p=s.setActiveItemId,f=s.setStatus;if(d(a),p(o.defaultActiveItemId),!a&&!1===o.openOnFocus){var m,h=l.getState().collections.map((function(e){return Le(Le({},e),{},{items:[]})}));f("idle"),c(h),u(null!==(m=r.isOpen)&&void 0!==m?m:o.shouldPanelOpen({state:l.getState()}));var g=Z(ze(h).then((function(){return Promise.resolve()})));return l.pendingRequests.add(g)}f("loading"),Be=o.environment.setTimeout((function(){f("stalled")}),o.stallThreshold);var b=Z(ze(o.getSources(Le({query:a,refresh:i,state:l.getState()},s)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(Le({query:a,refresh:i,state:l.getState()},s))).then((function(t){return function(e,t,n){if(o=e,Boolean(null==o?void 0:o.execute)){var r="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(Ce(Object.keys(n.context).map((function(e){var t;return null===(t=n.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return _e(_e({},e),{},{requests:e.queries.map((function(n){return{query:"algolia"===e.requesterId?_e(_e({},n),{},{params:_e(_e({},r),n.params)}):n,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}(t,e.sourceId,l.getState())}))}))).then(Te).then((function(t){return function(e,t,n){return t.map((function(t){var r,o=e.filter((function(e){return e.sourceId===t.sourceId})),a=o.map((function(e){return e.items})),i=o[0].transformResponse,l=i?i({results:r=a,hits:r.map((function(e){return e.hits})).filter(Boolean),facetHits:r.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):a;return t.onResolve({source:t,results:a,items:l,state:n.getState()}),l.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:l}}))}(t,e,l)})).then((function(e){return function(e){var t=e.props,n=e.state,r=e.collections.reduce((function(e,t){return Se(Se({},e),{},ke({},t.source.sourceId,Se(Se({},t.source),{},{getItems:function(){return y(t.items)}})))}),{}),o=t.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:r,state:n}).sourcesBySourceId;return y(t.reshape({sourcesBySourceId:o,sources:Object.values(o),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:l.getState()})}))})))).then((function(e){var n;f("idle"),c(e);var d=o.shouldPanelOpen({state:l.getState()});u(null!==(n=r.isOpen)&&void 0!==n?n:o.openOnFocus&&!a&&d||d);var p=oe(l.getState());if(null!==l.getState().activeItemId&&p){var m=p.item,h=p.itemInputValue,g=p.itemUrl,b=p.source;b.onActive(Le({event:t,item:m,itemInputValue:h,itemUrl:g,refresh:i,source:b,state:l.getState()},s))}})).finally((function(){f("idle"),Be&&o.environment.clearTimeout(Be)}));return l.pendingRequests.add(b)}function Ue(e){return Ue="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ue(e)}var He=["event","props","refresh","store"];function qe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ve(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function at(e){var t=e.props,n=e.refresh,r=e.store,o=ot(e,Ge),a=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return(n=t)===(r=e.target)||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return nt({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},ot(e,Qe))},getRootProps:function(e){return nt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){return e.inputElement,nt({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(nt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(nt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},ot(e,Ye))},getLabelProps:function(e){var n=e||{},r=n.sourceIndex,o=ot(n,Xe);return nt({htmlFor:"".concat(a(t.id,r),"-input"),id:"".concat(a(t.id,r),"-label")},o)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&$e(nt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var l=e||{},s=(l.inputElement,l.maxLength),c=void 0===s?512:s,u=ot(l,Ze),d=oe(r.getState()),p=function(e){return Boolean(e&&e.match(ae))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),f=null!=d&&d.itemUrl&&!p?"go":"search";return nt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?"".concat(t.id,"-item-").concat(r.getState().activeItemId):void 0,"aria-controls":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:r.getState().completion||r.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:f,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){$e(nt({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,He);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},l=function(){var e=oe(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,l=e.itemUrl,s=e.source;s.onActive(Ve({event:t,item:n,itemInputValue:i,itemUrl:l,refresh:r,source:s,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?$e(Ve({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),l(),setTimeout(i,0)})):(o.dispatch(t.key,{}),l(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var s=oe(o.getState()),c=s.item,u=s.itemInputValue,d=s.itemUrl,p=s.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(p.onSelect(Ve({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(p.onSelect(Ve({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return p.onSelect(Ve({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});$e(Ve({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){p.onSelect(Ve({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a))}))}}}(nt({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:E,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return nt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.sourceIndex,o=ot(n,Je);return nt({role:"listbox","aria-labelledby":"".concat(a(t.id,r),"-label"),id:"".concat(a(t.id,r),"-list")},o)},getItemProps:function(e){var i=e.item,l=e.source,s=e.sourceIndex,c=ot(e,et);return nt({id:"".concat(a(t.id,s),"-item-").concat(i.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===i.__autocomplete_id,onMouseMove:function(e){if(i.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",i.__autocomplete_id);var t=oe(r.getState());if(null!==r.getState().activeItemId&&t){var a=t.item,l=t.itemInputValue,s=t.itemUrl,c=t.source;c.onActive(nt({event:e,item:a,itemInputValue:l,itemUrl:s,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=l.getItemInputValue({item:i,state:r.getState()}),s=l.getItemUrl({item:i,state:r.getState()});(s?Promise.resolve():$e(nt({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){l.onSelect(nt({event:e,item:i,itemInputValue:a,itemUrl:s,refresh:n,source:l,state:r.getState()},o))}))}},c)}}}function it(e){return it="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},it(e)}function lt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function st(e){for(var t=1;t0&&r.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},r.createElement("p",{className:"DocSearch-Help"},c,":"),r.createElement("ul",null,h.slice(0,3).reduce((function(e,t){return[].concat(u(e),[r.createElement("li",{key:t},r.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){o.setQuery(t.toLowerCase()+" "),o.refresh(),o.inputRef.current.focus()}},t))])}),[]))),o.getMissingResultsUrl&&r.createElement("p",{className:"DocSearch-Help"},"".concat(p," "),r.createElement("a",{href:o.getMissingResultsUrl({query:o.state.query}),target:"_blank",rel:"noopener noreferrer"},m)))}var zt=["hit","attribute","tagName"];function $t(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,n=e.attribute,o=e.tagName,i=void 0===o?"span":o,l=s(e,zt);return(0,r.createElement)(i,a(a({},l),{},{dangerouslySetInnerHTML:{__html:$t(t,"_snippetResult.".concat(n,".value"))||$t(t,n)}}))}function Ht(e){return e.collection&&0!==e.collection.items.length?r.createElement("section",{className:"DocSearch-Hits"},r.createElement("div",{className:"DocSearch-Hit-source"},e.title),r.createElement("ul",e.getListProps(),e.collection.items.map((function(t,n){return r.createElement(qt,l({key:[e.title,t.objectID].join(":"),item:t,index:n},e))})))):null}function qt(e){var t=e.item,n=e.index,o=e.renderIcon,a=e.renderAction,i=e.getItemProps,s=e.onItemClick,u=e.collection,d=e.hitComponent,p=c(r.useState(!1),2),f=p[0],m=p[1],h=c(r.useState(!1),2),g=h[0],b=h[1],v=r.useRef(null),y=d;return r.createElement("li",l({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",f&&"DocSearch-Hit--deleting",g&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){v.current&&v.current()}},i({item:t,source:u.source,onClick:function(e){s(t,e)}})),r.createElement(y,{hit:t},r.createElement("div",{className:"DocSearch-Hit-Container"},o({item:t,index:n}),t.hierarchy[t.type]&&"lvl1"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&r.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),r.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),r.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),a({item:t,runDeleteTransition:function(e){m(!0),v.current=e},runFavoriteTransition:function(e){b(!0),v.current=e}}))))}function Vt(e,t,n){return e.reduce((function(e,r){var o=t(r);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(n||5)&&e[o].push(r),e}),{})}function Wt(e){return e}function Kt(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function Gt(){}var Qt=/(|<\/mark>)/g,Yt=RegExp(Qt.source);function Zt(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((r.__docsearch_parent?null===(t=r.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(n=e._highlightResult)||void 0===n||null===(n=n.hierarchy)||void 0===n?void 0:n.lvl0)||{}).value;return o&&Yt.test(o)?o.replace(Qt,""):o}function Xt(e){return r.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var n=Zt(t.items[0]);return r.createElement(Ht,l({},e,{key:t.source.sourceId,title:n,collection:t,renderIcon:function(e){var n,o=e.item,a=e.index;return r.createElement(r.Fragment,null,o.__docsearch_parent&&r.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},o.__docsearch_parent!==(null===(n=t.items[a+1])||void 0===n?void 0:n.__docsearch_parent)?r.createElement("path",{d:"M8 6v21M20 27H8.3"}):r.createElement("path",{d:"M8 6v42M20 27H8.3"}))),r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Pt,{type:o.type})))},renderAction:function(){return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement(jt,null))}}))})),e.resultsFooterComponent&&r.createElement("section",{className:"DocSearch-HitsFooter"},r.createElement(e.resultsFooterComponent,{state:e.state})))}var Jt=["translations"];function en(e){var t=e.translations,n=void 0===t?{}:t,o=s(e,Jt),a=n.recentSearchesTitle,i=void 0===a?"Recent":a,c=n.noRecentSearchesText,u=void 0===c?"No recent searches":c,d=n.saveRecentSearchButtonTitle,p=void 0===d?"Save this search":d,f=n.removeRecentSearchButtonTitle,m=void 0===f?"Remove this search from history":f,h=n.favoriteSearchesTitle,g=void 0===h?"Favorite":h,b=n.removeFavoriteSearchButtonTitle,v=void 0===b?"Remove this search from favorites":b;return"idle"===o.state.status&&!1===o.hasCollections?o.disableUserPersonalization?null:r.createElement("div",{className:"DocSearch-StartScreen"},r.createElement("p",{className:"DocSearch-Help"},u)):!1===o.hasCollections?null:r.createElement("div",{className:"DocSearch-Dropdown-Container"},r.createElement(Ht,l({},o,{title:i,collection:o.state.collections[0],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Ct,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,a=e.runDeleteTransition;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:p,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.add(t),o.recentSearches.remove(t),o.refresh()}))}},r.createElement(Lt,null))),r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:m,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),a((function(){o.recentSearches.remove(t),o.refresh()}))}},r.createElement(At,null))))}})),r.createElement(Ht,l({},o,{title:g,collection:o.state.collections[1],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Lt,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:v,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.remove(t),o.refresh()}))}},r.createElement(At,null)))}})))}var tn=["translations"],nn=r.memo((function(e){var t=e.translations,n=void 0===t?{}:t,o=s(e,tn);if("error"===o.state.status)return r.createElement(Mt,{translations:null==n?void 0:n.errorScreen});var a=o.state.collections.some((function(e){return e.items.length>0}));return o.state.query?!1===a?r.createElement(Bt,l({},o,{translations:null==n?void 0:n.noResultsScreen})):r.createElement(Xt,o):r.createElement(en,l({},o,{hasCollections:a,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),rn=["translations"];function on(e){var t=e.translations,n=void 0===t?{}:t,o=s(e,rn),a=n.resetButtonTitle,i=void 0===a?"Clear the query":a,c=n.resetButtonAriaLabel,u=void 0===c?"Clear the query":c,d=n.cancelButtonText,p=void 0===d?"Cancel":d,f=n.cancelButtonAriaLabel,h=void 0===f?"Cancel":f,g=n.searchInputLabel,b=void 0===g?"Search":g,v=o.getFormProps({inputElement:o.inputRef.current}).onReset;return r.useEffect((function(){o.autoFocus&&o.inputRef.current&&o.inputRef.current.focus()}),[o.autoFocus,o.inputRef]),r.useEffect((function(){o.isFromSelection&&o.inputRef.current&&o.inputRef.current.select()}),[o.isFromSelection,o.inputRef]),r.createElement(r.Fragment,null,r.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:v},r.createElement("label",l({className:"DocSearch-MagnifierLabel"},o.getLabelProps()),r.createElement(m,null),r.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},b)),r.createElement("div",{className:"DocSearch-LoadingIndicator"},r.createElement(Ot,null)),r.createElement("input",l({className:"DocSearch-Input",ref:o.inputRef},o.getInputProps({inputElement:o.inputRef.current,autoFocus:o.autoFocus,maxLength:64}))),r.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":u,hidden:!o.state.query},r.createElement(At,null))),r.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":h,onClick:o.onClose},p))}var an=["_highlightResult","_snippetResult"];function ln(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=function(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}(t),a=o.getItem().slice(0,r);return{add:function(e){var t=e,n=(t._highlightResult,t._snippetResult,s(t,an)),i=a.findIndex((function(e){return e.objectID===n.objectID}));i>-1&&a.splice(i,1),a.unshift(n),a=a.slice(0,r),o.setItem(a)},remove:function(e){a=a.filter((function(t){return t.objectID!==e.objectID})),o.setItem(a)},getAll:function(){return a}}}function sn(e){const t=`algoliasearch-client-js-${e.key}`;let n;const r=()=>(void 0===n&&(n=e.localStorage||window.localStorage),n),o=()=>JSON.parse(r().getItem(t)||"{}"),a=e=>{r().setItem(t,JSON.stringify(e))};return{get:(t,n,r={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,n=o(),r=Object.fromEntries(Object.entries(n).filter((([,e])=>void 0!==e.timestamp)));if(a(r),!t)return;const i=Object.fromEntries(Object.entries(r).filter((([,e])=>{const n=(new Date).getTime();return!(e.timestamp+tPromise.all([e?e.value:n(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||r.miss(e)]))).then((([e])=>e)),set:(e,n)=>Promise.resolve().then((()=>{const a=o();return a[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:n},r().setItem(t,JSON.stringify(a)),n})),delete:e=>Promise.resolve().then((()=>{const n=o();delete n[JSON.stringify(e)],r().setItem(t,JSON.stringify(n))})),clear:()=>Promise.resolve().then((()=>{r().removeItem(t)}))}}function cn(e){const t=[...e.caches],n=t.shift();return void 0===n?{get:(e,t,n={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,n.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,r,o={miss:()=>Promise.resolve()})=>n.get(e,r,o).catch((()=>cn({caches:t}).get(e,r,o))),set:(e,r)=>n.set(e,r).catch((()=>cn({caches:t}).set(e,r))),delete:e=>n.delete(e).catch((()=>cn({caches:t}).delete(e))),clear:()=>n.clear().catch((()=>cn({caches:t}).clear()))}}function un(e={serializable:!0}){let t={};return{get(n,r,o={miss:()=>Promise.resolve()}){const a=JSON.stringify(n);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);const i=r(),l=o&&o.miss||(()=>Promise.resolve());return i.then((e=>l(e))).then((()=>i))},set:(n,r)=>(t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function dn(e){let t=e.length-1;for(;t>0;t--){const n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function pn(e,t){return t?(Object.keys(t).forEach((n=>{e[n]=t[n](e)})),e):e}function fn(e,...t){let n=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[n++])))}const mn={WithinQueryParameters:0,WithinHeaders:1};function hn(e,t){const n=e||{},r=n.data||{};return Object.keys(n).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(r[e]=n[e])})),{data:Object.entries(r).length>0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}const gn={Read:1,Write:2,Any:3},bn=1,vn=3;function yn(e,t=bn){return{...e,status:t,lastUpdate:Date.now()}}function wn(e){return"string"==typeof e?{protocol:"https",url:e,accept:gn.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||gn.Any}}const Sn="GET",kn="POST";function xn(e,t,n,r){const o=[],a=function(e,t){if(e.method===Sn||void 0===e.data&&void 0===t.data)return;const n=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(n)}(n,r),i=function(e,t){const n={...e.headers,...t.headers},r={};return Object.keys(n).forEach((e=>{const t=n[e];r[e.toLowerCase()]=t})),r}(e,r),l=n.method,s=n.method!==Sn?{}:{...n.data,...r.data},c={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...s,...r.queryParameters};let u=0;const d=(t,s)=>{const p=t.pop();if(void 0===p)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Cn(o)};const f={data:a,headers:i,method:l,url:_n(p,n.path,c),connectTimeout:s(u,e.timeouts.connect),responseTimeout:s(u,r.timeout)},m=e=>{const n={request:f,response:e,host:p,triesLeft:t.length};return o.push(n),n},h={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(n){const r=m(n);return n.isTimedOut&&u++,Promise.all([e.logger.info("Retryable failure",An(r)),e.hostsCache.set(p,yn(p,n.isTimedOut?vn:2))]).then((()=>d(t,s)))},onFail(e){throw m(e),function({content:e,status:t},n){let r=e;try{r=JSON.parse(e).message}catch(e){}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(r,t,n)}(e,Cn(o))}};return e.requester.send(f).then((e=>((e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&!~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e))(e,h)))};return function(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(yn(t))))))).then((e=>{const n=e.filter((e=>function(e){return e.status===bn||Date.now()-e.lastUpdate>12e4}(e))),r=e.filter((e=>function(e){return e.status===vn&&Date.now()-e.lastUpdate<=12e4}(e))),o=[...n,...r];return{getTimeout:(e,t)=>(0===r.length&&0===e?1:r.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>wn(e))):t}}))}(e.hostsCache,t).then((e=>d([...e.statelessHosts].reverse(),e.getTimeout)))}function En(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const n=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(n)&&(t.value=`${t.value}${n}`),t}};return t}function _n(e,t,n){const r=On(n);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return r.length&&(o+=`?${r}`),o}function On(e){return Object.keys(e).map((t=>{return fn("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n})).join("&")}function Cn(e){return e.map((e=>An(e)))}function An(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const jn=e=>{const t=e.appId,n=function(e,t,n){const r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:()=>e===mn.WithinHeaders?r:{},queryParameters:()=>e===mn.WithinQueryParameters?r:{}}}(void 0!==e.authMode?e.authMode:mn.WithinHeaders,t,e.apiKey),r=function(e){const{hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:a,timeouts:i,userAgent:l,hosts:s,queryParameters:c,headers:u}=e,d={hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:a,timeouts:i,userAgent:l,headers:u,queryParameters:c,hosts:s.map((e=>wn(e))),read(e,t){const n=hn(t,d.timeouts.read),r=()=>xn(d,d.hosts.filter((e=>!!(e.accept&gn.Read))),e,n);if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();const o={request:e,mappedRequestOptions:n,transporter:{queryParameters:d.queryParameters,headers:d.headers}};return d.responsesCache.get(o,(()=>d.requestsCache.get(o,(()=>d.requestsCache.set(o,r()).then((e=>Promise.all([d.requestsCache.delete(o),e])),(e=>Promise.all([d.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>d.responsesCache.set(o,e)})},write:(e,t)=>xn(d,d.hosts.filter((e=>!!(e.accept&gn.Write))),e,hn(t,d.timeouts.write))};return d}({hosts:[{url:`${t}-dsn.algolia.net`,accept:gn.Read},{url:`${t}.algolia.net`,accept:gn.Write}].concat(dn([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...n.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...n.queryParameters(),...e.queryParameters}}),o={transporter:r,appId:t,addAlgoliaAgent(e,t){r.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([r.requestsCache.clear(),r.responsesCache.clear()]).then((()=>{}))};return pn(o,e.methods)},Tn=e=>(t,n)=>t.method===Sn?e.transporter.read(t,n):e.transporter.write(t,n),Pn=e=>(t,n={})=>pn({transporter:e.transporter,appId:e.appId,indexName:t},n.methods),In=e=>(t,n)=>{const r=t.map((e=>({...e,params:On(e.params||{})})));return e.transporter.read({method:kn,path:"1/indexes/*/queries",data:{requests:r},cacheable:!0},n)},Nn=e=>(t,n)=>Promise.all(t.map((t=>{const{facetName:r,facetQuery:o,...a}=t.params;return Pn(e)(t.indexName,{methods:{searchForFacetValues:Dn}}).searchForFacetValues(r,o,{...n,...a})}))),Ln=e=>(t,n,r)=>e.transporter.read({method:kn,path:fn("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:n},cacheable:!0},r),Rn=e=>(t,n)=>e.transporter.read({method:kn,path:fn("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n),Dn=e=>(t,n,r)=>e.transporter.read({method:kn,path:fn("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},r),Mn=1,Fn=2,Bn=3;function zn(e,t,n){const r={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>n.setRequestHeader(t,e.headers[t])));const r=(e,r)=>setTimeout((()=>{n.abort(),t({status:0,content:r,isTimedOut:!0})}),1e3*e),o=r(e.connectTimeout,"Connection timeout");let a;n.onreadystatechange=()=>{n.readyState>n.OPENED&&void 0===a&&(clearTimeout(o),a=r(e.responseTimeout,"Socket timeout"))},n.onerror=()=>{0===n.status&&(clearTimeout(o),clearTimeout(a),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=()=>{clearTimeout(o),clearTimeout(a),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))},logger:(o=Bn,{debug:(e,t)=>(Mn>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Fn>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:un(),requestsCache:un({serializable:!1}),hostsCache:cn({caches:[sn({key:`4.19.1-${e}`}),un()]}),userAgent:En("4.19.1").add({segment:"Browser",version:"lite"}),authMode:mn.WithinQueryParameters};var o;return jn({...r,...n,methods:{search:In,searchForFacetValues:Nn,multipleQueries:In,multipleSearchForFacetValues:Nn,customRequest:Tn,initIndex:e=>t=>Pn(e)(t,{methods:{search:Rn,searchForFacetValues:Dn,findAnswers:Ln}})}})}zn.version="4.19.1";var $n=["footer","searchBox"];function Un(e){var t=e.appId,n=e.apiKey,o=e.indexName,i=e.placeholder,u=void 0===i?"Search docs":i,d=e.searchParameters,p=e.maxResultsPerGroup,f=e.onClose,m=void 0===f?Gt:f,h=e.transformItems,g=void 0===h?Wt:h,b=e.hitComponent,v=void 0===b?_t:b,y=e.resultsFooterComponent,w=void 0===y?function(){return null}:y,S=e.navigator,k=e.initialScrollY,x=void 0===k?0:k,E=e.transformSearchClient,_=void 0===E?Wt:E,O=e.disableUserPersonalization,C=void 0!==O&&O,A=e.initialQuery,j=void 0===A?"":A,T=e.translations,P=void 0===T?{}:T,I=e.getMissingResultsUrl,N=e.insights,L=void 0!==N&&N,R=P.footer,D=P.searchBox,M=s(P,$n),F=c(r.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),B=F[0],z=F[1],$=r.useRef(null),U=r.useRef(null),H=r.useRef(null),q=r.useRef(null),V=r.useRef(null),W=r.useRef(10),K=r.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,G=r.useRef(j||K).current,Q=function(e,t,n){return r.useMemo((function(){var r=zn(e,t);return r.addAlgoliaAgent("docsearch","3.6.1"),!1===/docsearch.js \(.*\)/.test(r.transporter.userAgent.value)&&r.addAlgoliaAgent("docsearch-react","3.6.1"),n(r)}),[e,t,n])}(t,n,_),Y=r.useRef(ln({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(o),limit:10})).current,Z=r.useRef(ln({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(o),limit:0===Y.getAll().length?7:4})).current,X=r.useCallback((function(e){if(!C){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===Y.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&Z.add(t)}}),[Y,Z,C]),J=r.useCallback((function(e){if(B.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,n={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};B.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(n)}}),[B.context.algoliaInsightsPlugin]),ee=r.useMemo((function(){return St({id:"docsearch",defaultActiveItemId:0,placeholder:u,openOnFocus:!0,initialState:{query:G,context:{searchSuggestions:[]}},insights:L,navigator:S,onStateChange:function(e){z(e.state)},getSources:function(e){var r=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!r)return C?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,n=e.event;X(t),Kt(n)||m()},getItemUrl:function(e){return e.item.url},getItems:function(){return Z.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,n=e.event;X(t),Kt(n)||m()},getItemUrl:function(e){return e.item.url},getItems:function(){return Y.getAll()}}];var c=Boolean(L);return Q.search([{query:r,indexName:o,params:a({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(W.current),"hierarchy.lvl2:".concat(W.current),"hierarchy.lvl3:".concat(W.current),"hierarchy.lvl4:".concat(W.current),"hierarchy.lvl5:".concat(W.current),"hierarchy.lvl6:".concat(W.current),"content:".concat(W.current)],snippetEllipsisText:"\u2026",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:c},d)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var r=e.results[0],s=r.hits,u=r.nbHits,d=Vt(s,(function(e){return Zt(e)}),p);i.context.searchSuggestions.length0&&(re(),V.current&&V.current.focus())}),[G,re]),r.useEffect((function(){function e(){if(U.current){var e=.01*window.innerHeight;U.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),r.createElement("div",l({ref:$},ne({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===B.status&&"DocSearch-Container--Stalled","error"===B.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&m()}}),r.createElement("div",{className:"DocSearch-Modal",ref:U},r.createElement("header",{className:"DocSearch-SearchBar",ref:H},r.createElement(on,l({},ee,{state:B,autoFocus:0===G.length,inputRef:V,isFromSelection:Boolean(G)&&G===K,translations:D,onClose:m}))),r.createElement("div",{className:"DocSearch-Dropdown",ref:q},r.createElement(nn,l({},ee,{indexName:o,state:B,hitComponent:v,resultsFooterComponent:w,disableUserPersonalization:C,recentSearches:Z,favoriteSearches:Y,inputRef:V,translations:M,getMissingResultsUrl:I,onItemClick:function(e,t){J(e),X(e),Kt(t)||m()}}))),r.createElement("footer",{className:"DocSearch-Footer"},r.createElement(Et,{translations:R}))))}function Hn(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}},8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,6164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6164],"015df829":[()=>n.e(4372).then(n.bind(n,1393)),"@site/blog/2024-08-27-challenges-of-microservices.md",1393],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"03cca2c9":[()=>Promise.all([n.e(1869),n.e(8087)]).then(n.bind(n,2889)),"@site/docs/05-developer-guide/09-grpc/40-advanced/00-await-workflow-events.md",2889],"0bd106d9":[()=>Promise.all([n.e(1869),n.e(9371)]).then(n.bind(n,3193)),"@site/docs/05-developer-guide/08-wfspec-development/02-conditionals.md",3193],"0fad6d0a":[()=>n.e(1173).then(n.t.bind(n,7700,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-coltmcnealy-4ff.json",7700],"141346fb":[()=>n.e(4098).then(n.bind(n,3910)),"@site/blog/2024-09-04-basics-of-workflows.md",3910],"150c26e9":[()=>Promise.all([n.e(1869),n.e(4792)]).then(n.bind(n,4591)),"@site/docs/05-developer-guide/09-grpc/05-managing-metadata.md",4591],17896441:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8401)]).then(n.bind(n,575)),"@theme/DocItem",575],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,673)),"@theme/SearchPage",673],"1d85cfc3":[()=>n.e(9964).then(n.bind(n,6172)),"@site/blog/2024-07-12-0.10-release.md?truncated=true",6172],"1e599e21":[()=>n.e(4198).then(n.bind(n,8289)),"@site/docs/05-developer-guide/09-grpc/40-advanced/40-advanced.md",8289],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(8498),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"209570fd":[()=>n.e(312).then(n.bind(n,5321)),"@site/blog/2024-08-31-0.11-release.md?truncated=true",5321],"23f588f5":[()=>n.e(7434).then(n.bind(n,4299)),"@site/blog/2023-08-30-0.2.0-release.md",4299],"2494aaaa":[()=>n.e(6958).then(n.bind(n,1511)),"@site/blog/2024-08-22-promise-of-microservices.md",1511],"24a81a13":[()=>n.e(6848).then(n.bind(n,2509)),"@site/docs/06-operations/03-client-configuration.md",2509],"2a162317":[()=>n.e(7828).then(n.bind(n,4620)),"@site/docs/08-api.md",4620],"32279f3c":[()=>n.e(1634).then(n.bind(n,3715)),"@site/blog/2024-09-24-saga-pattern.md?truncated=true",3715],"33fc5bb8":[()=>Promise.all([n.e(1869),n.e(8498),n.e(3347),n.e(867)]).then(n.bind(n,778)),"@theme/Blog/Pages/BlogAuthorsPostsPage",778],"366d7c2c":[()=>n.e(4325).then(n.t.bind(n,6552,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-mitchellh-454.json",6552],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"393be207":[()=>n.e(4134).then(n.bind(n,633)),"@site/src/pages/markdown-page.md",633],"3a2db09e":[()=>n.e(8121).then(n.t.bind(n,8070,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",8070],"477ea5a4":[()=>n.e(9993).then(n.bind(n,7945)),"@site/docs/06-operations/02-dashboard-configuration.md",7945],"4781d3d2":[()=>n.e(8892).then(n.bind(n,8969)),"@site/blog/2024-08-22-promise-of-microservices.md?truncated=true",8969],"49cd91b3":[()=>n.e(5808).then(n.bind(n,6422)),"@site/docs/05-developer-guide/05-developer-guide.md",6422],"4bc002f8":[()=>Promise.all([n.e(1869),n.e(8488)]).then(n.bind(n,6603)),"@site/docs/05-developer-guide/08-wfspec-development/20-advanced/10-throwing-events.md",6603],"524a0089":[()=>n.e(4982).then(n.bind(n,8588)),"@site/docs/04-concepts/04-external-events.md",8588],"5263bac3":[()=>n.e(7962).then(n.bind(n,240)),"@site/docs/05-developer-guide/08-wfspec-development/08-wfspec-development.md",240],"57cb429f":[()=>n.e(2775).then(n.bind(n,2879)),"@site/blog/2023-09-08-0.5.0-release.md?truncated=true",2879],"59f5fc7c":[()=>n.e(9905).then(n.bind(n,5283)),"@site/docs/06-operations/01-server-configuration.md",5283],"5a5f8fd5":[()=>n.e(8035).then(n.t.bind(n,4884,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-littlehorse-67f.json",4884],"5a6d38a2":[()=>Promise.all([n.e(1869),n.e(9291)]).then(n.bind(n,3972)),"@site/docs/05-developer-guide/08-wfspec-development/03-mutating-variables.md",3972],"5af1e9f6":[()=>n.e(8648).then(n.bind(n,9451)),"@site/blog/2024-03-26-0.8.1-release.md",9451],"5b3e9818":[()=>n.e(538).then(n.t.bind(n,5002,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-integration-patterns-c03.json",5002],"5b77cc54":[()=>n.e(3457).then(n.t.bind(n,517,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-microservice-and-workflow-c14.json",517],"5d0b0e70":[()=>n.e(1946).then(n.bind(n,4102)),"@site/docs/04-concepts/04-concepts.md",4102],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"621db11d":[()=>Promise.all([n.e(1869),n.e(3347),n.e(4212)]).then(n.bind(n,3250)),"@theme/Blog/Pages/BlogAuthorsListPage",3250],62796615:[()=>Promise.all([n.e(1869),n.e(9445)]).then(n.bind(n,1296)),"@site/docs/05-developer-guide/09-grpc/10-running-workflows.md",1296],"66680c26":[()=>n.e(1642).then(n.bind(n,9399)),"@site/docs/04-concepts/30-advanced/00-wfspec-versioning.md",9399],"6875c492":[()=>Promise.all([n.e(1869),n.e(8498),n.e(3347),n.e(4813)]).then(n.bind(n,3069)),"@theme/BlogTagsPostsPage",3069],"6ddfedc5":[()=>Promise.all([n.e(1869),n.e(6928)]).then(n.bind(n,5638)),"@site/docs/05-developer-guide/08-wfspec-development/08-user-tasks.md",5638],"6ed84113":[()=>Promise.all([n.e(1869),n.e(6417)]).then(n.bind(n,7194)),"@site/docs/05-developer-guide/02-client-configuration.md",7194],"74974c25":[()=>n.e(8090).then(n.bind(n,8805)),"@site/docs/07-faq.md",8805],"7e3e0d30":[()=>n.e(7746).then(n.bind(n,7697)),"@site/docs/06-operations/10-docker-compose/15-three-servers.md",7697],"7f375326":[()=>n.e(1886).then(n.bind(n,1777)),"@site/blog/2024-01-28-0.7-release.md?truncated=true",1777],"7f97f38f":[()=>n.e(5739).then(n.bind(n,7027)),"@site/blog/2024-08-27-challenges-of-microservices.md?truncated=true",7027],"80b6e621":[()=>n.e(6309).then(n.bind(n,3308)),"@site/docs/04-concepts/03-tasks.md",3308],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"81a46808":[()=>n.e(1715).then(n.bind(n,6112)),"@site/blog/2024-07-12-0.10-release.md",6112],83879120:[()=>Promise.all([n.e(1869),n.e(4723)]).then(n.bind(n,4327)),"@site/docs/05-developer-guide/08-wfspec-development/05-interrupts.md",4327],"845dc8ad":[()=>n.e(7506).then(n.bind(n,8156)),"@site/docs/04-concepts/13-principals-and-tenants.md",8156],84954295:[()=>n.e(7757).then(n.bind(n,6010)),"@site/blog/2024-09-04-basics-of-workflows.md?truncated=true",6010],"8bb7c884":[()=>n.e(3133).then(n.bind(n,3046)),"@site/docs/04-concepts/01-workflows.md",3046],"8bc86172":[()=>n.e(3828).then(n.bind(n,4298)),"@site/blog/2024-06-24-0.9.2-release.md",4298],"8dbae9ea":[()=>n.e(7316).then(n.bind(n,7693)),"@site/blog/2024-03-26-0.8.1-release.md?truncated=true",7693],"9215fec6":[()=>n.e(536).then(n.bind(n,8842)),"@site/docs/05-developer-guide/08-wfspec-development/20-advanced/20-advanced.md",8842],"971c8a60":[()=>n.e(3896).then(n.bind(n,1994)),"@site/docs/06-operations/10-docker-compose/10-docker-compose.md",1994],"9a24bfa0":[()=>Promise.all([n.e(1869),n.e(3372)]).then(n.bind(n,1867)),"@site/docs/05-developer-guide/08-wfspec-development/07-child-threads.md",1867],"9b53f530":[()=>n.e(4120).then(n.bind(n,7783)),"@site/docs/06-operations/10-docker-compose/05-confluent-cloud.md",7783],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],"9e75eaed":[()=>Promise.all([n.e(1869),n.e(456)]).then(n.bind(n,4261)),"@site/docs/05-developer-guide/08-wfspec-development/20-advanced/00-wait-for-condition.md",4261],a06c0eb2:[()=>n.e(300).then(n.bind(n,4898)),"@site/docs/05-developer-guide/03-lhctl.md",4898],a1824316:[()=>Promise.all([n.e(1869),n.e(9045)]).then(n.bind(n,3307)),"@site/docs/05-developer-guide/08-wfspec-development/04-external-events.md",3307],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8498),n.e(3347),n.e(7643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a86a7ed2:[()=>n.e(7173).then(n.bind(n,3773)),"@site/blog/2023-08-30-0.2.0-release.md?truncated=true",3773],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],a957f15c:[()=>n.e(5174).then(n.bind(n,488)),"@site/blog/2024-09-02-microservices-and-workflow.md?truncated=true",488],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],b136319f:[()=>n.e(7762).then(n.bind(n,7393)),"@site/blog/2024-09-24-saga-pattern.md",7393],b1ad0a29:[()=>n.e(9685).then(n.bind(n,3095)),"@site/blog/2024-08-31-0.11-release.md",3095],b23d33c8:[()=>n.e(1561).then(n.bind(n,998)),"@site/docs/04-concepts/05-user-tasks.md",998],b770e739:[()=>n.e(9615).then(n.bind(n,7100)),"@site/blog/2024-09-30-transactional-outbox.md?truncated=true",7100],bd28587a:[()=>n.e(3408).then(n.bind(n,2702)),"@site/blog/2024-06-24-0.9.2-release.md?truncated=true",2702],be5744c7:[()=>n.e(8046).then(n.bind(n,7915)),"@site/docs/04-concepts/30-advanced/30-advanced.md",7915],bead5408:[()=>n.e(3484).then(n.bind(n,5076)),"@site/docs/05-developer-guide/09-grpc/09-grpc.md",5076],c141421f:[()=>n.e(957).then(n.t.bind(n,936,19)),"@generated/docusaurus-theme-search-algolia/default/__plugin.json",936],c15d9823:[()=>n.e(8146).then(n.t.bind(n,9328,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",9328],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,2083)),"@site/src/pages/index.js",2083],c69aaf89:[()=>Promise.all([n.e(1869),n.e(3361)]).then(n.bind(n,2495)),"@site/docs/05-developer-guide/09-grpc/20-user-tasks.md",2495],c9736c35:[()=>Promise.all([n.e(1869),n.e(1872)]).then(n.bind(n,8023)),"@site/docs/05-developer-guide/05-task-worker-development.md",8023],ccc49370:[()=>Promise.all([n.e(1869),n.e(8498),n.e(3347),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],d0f4e7d1:[()=>n.e(2296).then(n.t.bind(n,2343,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-release-bae.json",2343],d52af3ba:[()=>n.e(9403).then(n.bind(n,9333)),"@site/docs/06-operations/00-overview.md",9333],d5e335f6:[()=>n.e(7130).then(n.bind(n,6e3)),"@site/blog/2023-09-08-0.5.0-release.md",6e3],d61070d0:[()=>n.e(6583).then(n.bind(n,3535)),"@site/blog/2024-01-28-0.7-release.md",3535],d9c5bba9:[()=>n.e(7784).then(n.bind(n,9548)),"@site/docs/06-operations/10-docker-compose/00-basic.md",9548],db1cb5ce:[()=>n.e(2186).then(n.bind(n,1500)),"@site/docs/04-concepts/06-workflow-events.md",1500],dd97924f:[()=>Promise.all([n.e(1869),n.e(832)]).then(n.bind(n,8162)),"@site/docs/05-developer-guide/09-grpc/00-basics.md",8162],ddb4e1f1:[()=>n.e(7948).then(n.bind(n,7936)),"@site/docs/01-overview.md",7936],df0890b4:[()=>n.e(7080).then(n.t.bind(n,3362,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-analysis-2d6.json",3362],e33a6d67:[()=>Promise.all([n.e(1869),n.e(3324)]).then(n.bind(n,7720)),"@site/docs/05-developer-guide/08-wfspec-development/01-basics.md",7720],e359e6f5:[()=>Promise.all([n.e(1869),n.e(3983)]).then(n.bind(n,3157)),"@site/docs/05-developer-guide/08-wfspec-development/06-exception-handling.md",3157],e3618154:[()=>n.e(826).then(n.bind(n,9100)),"@site/blog/2024-09-02-microservices-and-workflow.md",9100],eed23361:[()=>Promise.all([n.e(1869),n.e(3234)]).then(n.bind(n,3039)),"@site/docs/02-architecture-and-guarantees.md",3039],ef8b811a:[()=>n.e(8947).then(n.t.bind(n,6600,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",6600],f13b4cb1:[()=>n.e(6051).then(n.t.bind(n,2349,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-lh-council-1ba.json",2349],f21a8f01:[()=>n.e(2558).then(n.bind(n,6720)),"@site/blog/2024-09-30-transactional-outbox.md",6720],f23abd89:[()=>Promise.all([n.e(1869),n.e(216)]).then(n.bind(n,4689)),"@site/docs/05-developer-guide/00-install.md",4689],f447dd38:[()=>Promise.all([n.e(1869),n.e(4635)]).then(n.bind(n,323)),"@site/docs/05-developer-guide/09-grpc/15-posting-external-events.md",323],f81c1134:[()=>n.e(8130).then(n.t.bind(n,7735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",7735],fb7e2344:[()=>n.e(7142).then(n.bind(n,8066)),"@site/docs/06-operations/06-operations.md",8066]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return o()({loading:s,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const s=o.__props;return delete o.__props,(0,l.jsx)(u.W,{value:i,children:(0,l.jsx)(a,{...o,...s,...n})})}})}const p=[{path:"/blog",component:d("/blog","7cb"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/authors",component:d("/blog/authors","0b7"),exact:!0},{path:"/blog/authors/coltmcnealy",component:d("/blog/authors/coltmcnealy","d5e"),exact:!0},{path:"/blog/authors/lh-council",component:d("/blog/authors/lh-council","42e"),exact:!0},{path:"/blog/authors/mitchellh",component:d("/blog/authors/mitchellh","602"),exact:!0},{path:"/blog/basics-of-workflow",component:d("/blog/basics-of-workflow","828"),exact:!0},{path:"/blog/challenge-of-microservices",component:d("/blog/challenge-of-microservices","0e6"),exact:!0},{path:"/blog/littlehorse-0.10-release",component:d("/blog/littlehorse-0.10-release","309"),exact:!0},{path:"/blog/littlehorse-0.11-release",component:d("/blog/littlehorse-0.11-release","ff6"),exact:!0},{path:"/blog/littlehorse-0.2.0-release",component:d("/blog/littlehorse-0.2.0-release","e1a"),exact:!0},{path:"/blog/littlehorse-0.5.0-release",component:d("/blog/littlehorse-0.5.0-release","19d"),exact:!0},{path:"/blog/littlehorse-0.7-release",component:d("/blog/littlehorse-0.7-release","ca0"),exact:!0},{path:"/blog/littlehorse-0.8-release",component:d("/blog/littlehorse-0.8-release","4e9"),exact:!0},{path:"/blog/littlehorse-0.9-release",component:d("/blog/littlehorse-0.9-release","288"),exact:!0},{path:"/blog/microservices-and-workflow",component:d("/blog/microservices-and-workflow","bf7"),exact:!0},{path:"/blog/promise-of-microservices",component:d("/blog/promise-of-microservices","920"),exact:!0},{path:"/blog/saga-pattern",component:d("/blog/saga-pattern","5e0"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/analysis/",component:d("/blog/tags/analysis/","f0d"),exact:!0},{path:"/blog/tags/integration-patterns/",component:d("/blog/tags/integration-patterns/","7a2"),exact:!0},{path:"/blog/tags/littlehorse/",component:d("/blog/tags/littlehorse/","f10"),exact:!0},{path:"/blog/tags/microservice-and-workflow/",component:d("/blog/tags/microservice-and-workflow/","ca4"),exact:!0},{path:"/blog/tags/release/",component:d("/blog/tags/release/","42a"),exact:!0},{path:"/blog/transactional-outbox",component:d("/blog/transactional-outbox","6e7"),exact:!0},{path:"/markdown-page",component:d("/markdown-page","3d7"),exact:!0},{path:"/search",component:d("/search","5de"),exact:!0},{path:"/docs",component:d("/docs","f97"),routes:[{path:"/docs",component:d("/docs","6bf"),routes:[{path:"/docs",component:d("/docs","ae7"),routes:[{path:"/docs/api",component:d("/docs/api","8dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/architecture-and-guarantees",component:d("/docs/architecture-and-guarantees","a57"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/",component:d("/docs/concepts/","05c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/advanced/",component:d("/docs/concepts/advanced/","1aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/advanced/wfspec-versioning",component:d("/docs/concepts/advanced/wfspec-versioning","c97"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/external-events",component:d("/docs/concepts/external-events","0bd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/principals-and-tenants",component:d("/docs/concepts/principals-and-tenants","18d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/tasks",component:d("/docs/concepts/tasks","6d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/user-tasks",component:d("/docs/concepts/user-tasks","648"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/workflow-events",component:d("/docs/concepts/workflow-events","483"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/workflows",component:d("/docs/concepts/workflows","2dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/",component:d("/docs/developer-guide/","30e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/client-configuration",component:d("/docs/developer-guide/client-configuration","238"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/",component:d("/docs/developer-guide/grpc/","297"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/advanced/",component:d("/docs/developer-guide/grpc/advanced/","1cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/advanced/await-workflow-events",component:d("/docs/developer-guide/grpc/advanced/await-workflow-events","b92"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/basics",component:d("/docs/developer-guide/grpc/basics","1e2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/managing-metadata",component:d("/docs/developer-guide/grpc/managing-metadata","d01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/posting-external-events",component:d("/docs/developer-guide/grpc/posting-external-events","57f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/running-workflows",component:d("/docs/developer-guide/grpc/running-workflows","dc9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/grpc/user-tasks",component:d("/docs/developer-guide/grpc/user-tasks","be7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/install",component:d("/docs/developer-guide/install","d47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/lhctl",component:d("/docs/developer-guide/lhctl","809"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/task-worker-development",component:d("/docs/developer-guide/task-worker-development","168"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/",component:d("/docs/developer-guide/wfspec-development/","db2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/advanced/",component:d("/docs/developer-guide/wfspec-development/advanced/","b4b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/advanced/throwing-events",component:d("/docs/developer-guide/wfspec-development/advanced/throwing-events","420"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/advanced/wait-for-condition",component:d("/docs/developer-guide/wfspec-development/advanced/wait-for-condition","442"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/basics",component:d("/docs/developer-guide/wfspec-development/basics","801"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/child-threads",component:d("/docs/developer-guide/wfspec-development/child-threads","663"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/conditionals",component:d("/docs/developer-guide/wfspec-development/conditionals","576"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/exception-handling",component:d("/docs/developer-guide/wfspec-development/exception-handling","fde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/external-events",component:d("/docs/developer-guide/wfspec-development/external-events","302"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/interrupts",component:d("/docs/developer-guide/wfspec-development/interrupts","d53"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/mutating-variables",component:d("/docs/developer-guide/wfspec-development/mutating-variables","da1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/developer-guide/wfspec-development/user-tasks",component:d("/docs/developer-guide/wfspec-development/user-tasks","8ee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/faq",component:d("/docs/faq","47d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/",component:d("/docs/operations/","99e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/client-configuration",component:d("/docs/operations/client-configuration","6ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/dashboard-configuration",component:d("/docs/operations/dashboard-configuration","138"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/docker-compose/",component:d("/docs/operations/docker-compose/","691"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/docker-compose/basic",component:d("/docs/operations/docker-compose/basic","cbb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/docker-compose/confluent-cloud",component:d("/docs/operations/docker-compose/confluent-cloud","7a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/docker-compose/three-servers",component:d("/docs/operations/docker-compose/three-servers","813"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/overview",component:d("/docs/operations/overview","2ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/operations/server-configuration",component:d("/docs/operations/server-configuration","43c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/overview",component:d("/docs/overview","904"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),l=n(4784),s=n(8193);const c=[n(1911),n(119),n(6134),n(6294),n(1043)];var u=n(8328),d=n(6347),p=n(2831),f=n(4848);function m(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var h=n(5260),g=n(4586),b=n(6025),v=n(6342),y=n(5500),w=n(2131),S=n(4090),k=n(2967),x=n(440),E=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function O(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,x.Ks)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,v.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:S.w})]}),n&&(0,f.jsx)(y.be,{image:n}),(0,f.jsx)(O,{}),(0,f.jsx)(_,{}),(0,f.jsx)(E.A,{tag:k.C,locale:e}),(0,f.jsx)(h.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const A=new Map;var j=n(6125),T=n(6988),P=n(205);function I(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,P.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),I("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const D=R,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(D,{location:e,children:K})}function Q(){return(0,f.jsx)(q.A,{children:(0,f.jsx)(T.l,{children:(0,f.jsxs)(j.x,{children:[(0,f.jsxs)(m,{children:[(0,f.jsx)(H,{}),(0,f.jsx)(C,{}),(0,f.jsx)(U,{}),(0,f.jsx)(G,{})]}),(0,f.jsx)(W,{})]})})})}var Y=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),L(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(Q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};L(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"overview","docs":[{"id":"api","path":"/docs/api","sidebar":"tutorialSidebar"},{"id":"architecture-and-guarantees","path":"/docs/architecture-and-guarantees","sidebar":"tutorialSidebar"},{"id":"concepts/advanced/advanced","path":"/docs/concepts/advanced/","sidebar":"tutorialSidebar"},{"id":"concepts/advanced/wfspec-versioning","path":"/docs/concepts/advanced/wfspec-versioning","sidebar":"tutorialSidebar"},{"id":"concepts/concepts","path":"/docs/concepts/","sidebar":"tutorialSidebar"},{"id":"concepts/external-events","path":"/docs/concepts/external-events","sidebar":"tutorialSidebar"},{"id":"concepts/principals-and-tenants","path":"/docs/concepts/principals-and-tenants","sidebar":"tutorialSidebar"},{"id":"concepts/tasks","path":"/docs/concepts/tasks","sidebar":"tutorialSidebar"},{"id":"concepts/user-tasks","path":"/docs/concepts/user-tasks","sidebar":"tutorialSidebar"},{"id":"concepts/workflow-events","path":"/docs/concepts/workflow-events","sidebar":"tutorialSidebar"},{"id":"concepts/workflows","path":"/docs/concepts/workflows","sidebar":"tutorialSidebar"},{"id":"developer-guide/client-configuration","path":"/docs/developer-guide/client-configuration","sidebar":"tutorialSidebar"},{"id":"developer-guide/developer-guide","path":"/docs/developer-guide/","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/advanced/advanced","path":"/docs/developer-guide/grpc/advanced/","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/advanced/await-workflow-events","path":"/docs/developer-guide/grpc/advanced/await-workflow-events","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/basics","path":"/docs/developer-guide/grpc/basics","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/grpc","path":"/docs/developer-guide/grpc/","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/managing-metadata","path":"/docs/developer-guide/grpc/managing-metadata","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/posting-external-events","path":"/docs/developer-guide/grpc/posting-external-events","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/running-workflows","path":"/docs/developer-guide/grpc/running-workflows","sidebar":"tutorialSidebar"},{"id":"developer-guide/grpc/user-tasks","path":"/docs/developer-guide/grpc/user-tasks","sidebar":"tutorialSidebar"},{"id":"developer-guide/install","path":"/docs/developer-guide/install","sidebar":"tutorialSidebar"},{"id":"developer-guide/lhctl","path":"/docs/developer-guide/lhctl","sidebar":"tutorialSidebar"},{"id":"developer-guide/task-worker-development","path":"/docs/developer-guide/task-worker-development","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/advanced/advanced","path":"/docs/developer-guide/wfspec-development/advanced/","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/advanced/throwing-events","path":"/docs/developer-guide/wfspec-development/advanced/throwing-events","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/advanced/wait-for-condition","path":"/docs/developer-guide/wfspec-development/advanced/wait-for-condition","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/basics","path":"/docs/developer-guide/wfspec-development/basics","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/child-threads","path":"/docs/developer-guide/wfspec-development/child-threads","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/conditionals","path":"/docs/developer-guide/wfspec-development/conditionals","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/exception-handling","path":"/docs/developer-guide/wfspec-development/exception-handling","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/external-events","path":"/docs/developer-guide/wfspec-development/external-events","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/interrupts","path":"/docs/developer-guide/wfspec-development/interrupts","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/mutating-variables","path":"/docs/developer-guide/wfspec-development/mutating-variables","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/user-tasks","path":"/docs/developer-guide/wfspec-development/user-tasks","sidebar":"tutorialSidebar"},{"id":"developer-guide/wfspec-development/wfspec-development","path":"/docs/developer-guide/wfspec-development/","sidebar":"tutorialSidebar"},{"id":"faq","path":"/docs/faq","sidebar":"tutorialSidebar"},{"id":"operations/client-configuration","path":"/docs/operations/client-configuration","sidebar":"tutorialSidebar"},{"id":"operations/dashboard-configuration","path":"/docs/operations/dashboard-configuration","sidebar":"tutorialSidebar"},{"id":"operations/docker-compose/basic","path":"/docs/operations/docker-compose/basic","sidebar":"tutorialSidebar"},{"id":"operations/docker-compose/confluent-cloud","path":"/docs/operations/docker-compose/confluent-cloud","sidebar":"tutorialSidebar"},{"id":"operations/docker-compose/docker-compose","path":"/docs/operations/docker-compose/","sidebar":"tutorialSidebar"},{"id":"operations/docker-compose/three-servers","path":"/docs/operations/docker-compose/three-servers","sidebar":"tutorialSidebar"},{"id":"operations/operations","path":"/docs/operations/","sidebar":"tutorialSidebar"},{"id":"operations/overview","path":"/docs/operations/overview","sidebar":"tutorialSidebar"},{"id":"operations/server-configuration","path":"/docs/operations/server-configuration","sidebar":"tutorialSidebar"},{"id":"overview","path":"/docs/overview","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/overview","label":"Overview"}}}}],"breadcrumbs":true}},"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-1DL56CH5SS"],"anonymizeIP":false,"id":"default"}},"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-NCK3N2PC","id":"default"}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.5.2"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.5.2"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:s,globalData:a,i18n:i,codeTranslations:l},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(6540),o=n(8193),a=n(5260),i=n(440),l=n(1957),s=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(l.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const m=e=>(0,c.jsx)(f,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??m)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),l=n(6654),s=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:y}=(0,i.A)(),{trailingSlash:w,baseUrl:S}=y,k=y.future.experimental_router,{withBaseUrl:x}=(0,u.hH)(),E=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const O=p||f;const C=(0,l.A)(O),A=O?.replace("pathname://","");let j=void 0!==A?(T=A,b&&(e=>e.startsWith("/"))(T)?x(T):T):void 0;var T;"hash"===k&&j?.startsWith("./")&&(j=j?.slice(1)),j&&C&&(j=(0,a.Ks)(j,{trailingSlash:w,baseUrl:S}));const P=(0,r.useRef)(!1),I=n?o.k2:o.N_,N=s.A.canUseIntersectionObserver,L=(0,r.useRef)(),R=()=>{P.current||null==j||(window.docusaurus.preload(j),P.current=!0)};(0,r.useEffect)((()=>(!N&&C&&s.A.canUseDOM&&null!=j&&window.docusaurus.prefetch(j),()=>{N&&L.current&&L.current.disconnect()})),[L,j,N,C]);const D=j?.startsWith("#")??!1,M=!v.target||"_self"===v.target,F=!j||!C||!M||D&&"hash"!==k;g||!D&&F||E.collectLink(j),v.id&&E.collectAnchor(v.id);const B={};return F?(0,d.jsx)("a",{ref:_,href:j,...O&&!C&&{target:"_blank",rel:"noopener noreferrer"},...v,...B}):(0,d.jsx)(I,{...v,onMouseEnter:R,onTouchStart:R,innerRef:e=>{_.current=e,N&&e&&C&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=j&&window.docusaurus.prefetch(j))}))})),L.current.observe(e))},to:j,...n&&{isActive:h,activeClassName:m},...B})}const f=r.forwardRef(p)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>s});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(l({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3102);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const l=o?`${o}.${a}`:a;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:l,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>y,g1:()=>v});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),l=n(679),s=n(9532),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,l.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,l.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,l.Wf)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function m(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return(0,c.jsx)(f.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return(0,c.jsx)(h,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function y(){const e=(0,o.Gy)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},2565:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(4070),o=n(3886);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],l=e[r].versions.find((e=>e.isLast));return a(r,(o??i??l).name)}))]}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},6972:(e,t,n)=>{"use strict";n.d(t,{B5:()=>x,Nr:()=>p,OF:()=>y,QB:()=>k,Vd:()=>w,Y:()=>b,fW:()=>S,w8:()=>h});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),l=n(9169),s=n(1682),c=n(3886),u=n(3025),d=n(609);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}const f=(e,t)=>void 0!==e&&(0,l.ys)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||m(e.items,t))}function g(e,t){switch(e.type){case"category":return h(e,t)||e.items.some((e=>g(e,t)));case"link":return!e.unlisted||h(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>g(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,l.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,l.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function y(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,s.sb)([t,n,o].filter(Boolean))),[t,n,o])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,s.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function x(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,l=i.find((e=>(0,o.B6)(n.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?r.docsSidebars[s]:void 0;return{docElement:(0,a.v)(i),sidebarName:s,sidebarItems:c}}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>b,vT:()=>f,gk:()=>m,Gy:()=>d,HW:()=>v,ht:()=>p,r7:()=>g,jh:()=>h});var r=n(6347),o=n(4586),a=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return l(t)}function b(e){const t=p(e),{pathname:n}=(0,r.zy)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},1911:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";var r=n(4876),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(3524)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8215),o=n(1312),a=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},1957:(e,t,n)=>{"use strict";n.d(t,{A:()=>Ot});var r=n(6540),o=n(8215),a=n(7489),i=n(5500),l=n(6347),s=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,s.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const v={skipToContent:"skipToContent_fXgn"};function y(){return(0,u.jsx)(h,{className:v.skipToContent})}var w=n(6342),S=n(5041);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const x={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",x.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function O(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const C={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,S.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:C.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:C.announcementBarPlaceholder}),(0,u.jsx)(O,{className:C.announcementBarContent}),a&&(0,u.jsx)(E,{onClick:n,className:C.announcementBarClose})]})}var j=n(2069),T=n(3104);var P=n(9532),I=n(5600);const N=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,P.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(N.Provider,{value:n,children:t})}function R(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new P.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,I.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:R(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(5293),B=n(2303);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,B.A)(),l=(0,s.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const q=r.memo(H),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,u.jsx)(q,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var K=n(3465);function G(){return(0,u.jsx)(K.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,j.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(G,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(Q,{})]})}var Z=n(8774),X=n(6025),J=n(6654),ee=n(1252),te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,J.A)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.A,{...l&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:s?f:o,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...l}=e;const s=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,u.jsxs)("div",{ref:s,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,o.A)("navbar__link",a),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:l.children??l.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Fe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Fe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var me=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var be=n(961),ve=n(3219),ye=n(5260),we=n(4255),Se=n(1062),ke=n(2967),xe=n(2565);function Ee(){return[`language:${(0,se.A)().i18n.currentLocale}`,function(){const e=(0,xe.v)();return[ke.C,...e]}().map((e=>`docusaurus_tag:${e}`))]}const _e={button:{buttonText:(0,s.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,s.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,s.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,s.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,s.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,s.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,s.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,s.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,s.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,s.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,s.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,s.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,s.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,s.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,s.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,s.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,s.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,s.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,s.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Oe=null;function Ce(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function Ae(e){let{state:t,onClose:n}=e;const r=(0,we.w)();return(0,u.jsx)(Z.A,{to:r(t.query),onClick:n,children:(0,u.jsx)(s.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function je(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,se.A)(),s=(0,Se.C)(),c=Ee(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...a.searchParameters,facetFilters:p},m=(0,l.W6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),S=(0,r.useCallback)((()=>Oe?Promise.resolve():Promise.all([n.e(8158).then(n.bind(n,8158)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,8913)),Promise.all([n.e(1869),n.e(416)]).then(n.bind(n,416))]).then((e=>{let[{DocSearchModal:t}]=e;Oe=t}))),[]),k=(0,r.useCallback)((()=>{if(!h.current){const e=document.createElement("div");h.current=e,document.body.insertBefore(e,document.body.firstChild)}}),[]),x=(0,r.useCallback)((()=>{k(),S().then((()=>v(!0)))}),[S,k]),E=(0,r.useCallback)((()=>{v(!1),g.current?.focus()}),[]),_=(0,r.useCallback)((e=>{"f"===e.key&&(e.metaKey||e.ctrlKey)||(e.preventDefault(),w(e.key),x())}),[x]),O=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.G)(o,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:s(e.url)}))))).current,A=(0,r.useMemo)((()=>e=>(0,u.jsx)(Ae,{...e,onClose:E})),[E]),j=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return(0,ve.E8)({isOpen:b,onOpen:x,onClose:E,onInput:_,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ye.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(ve.Bc,{onTouchStart:S,onFocus:S,onMouseOver:S,onClick:x,ref:g,translations:_e.button}),b&&Oe&&h.current&&(0,be.createPortal)((0,u.jsx)(Oe,{onClose:E,initialScrollY:window.scrollY,initialQuery:y,navigator:O,transformItems:C,hitComponent:Ce,transformSearchClient:j,...a.searchPagePath&&{resultsFooterComponent:A},...a,searchParameters:f,placeholder:_e.placeholder,translations:_e.modal}),h.current)]})}function Te(){const{siteConfig:e}=(0,se.A)();return(0,u.jsx)(je,{...e.themeConfig.algolia})}const Pe={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ie(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Pe.navbarSearchContainer),children:t})}var Ne=n(4070),Le=n(6972);var Re=n(3886);function De(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Me={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),p=(0,me.o)(),{search:f,hash:m}=(0,l.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Ie,{className:n,children:(0,u.jsx)(Te,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Ne.zK)(r),i=(0,Le.QB)(t,r),l=a?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>l||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Ne.zK)(r),i=(0,Le.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,Le.Vd)(r)[0],i=t??a.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,l.zy)(),p=(0,Ne.zK)(n),f=(0,Ne.jh)(n),{savePreferredVersionName:m}=(0,Re.g1)(n),h=[...o,...f.map((function(e){const t=De(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,Le.Vd)(n)[0],b=t&&h.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,v=t&&h.length>1?void 0:De(g,p).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:v,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:v,items:h,isActive:r?()=>!1:void 0})}};function Fe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Me[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Be(){const e=(0,j.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Fe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function ze(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function $e(){const e=0===(0,w.p)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(ze,{onClick:()=>t.hide()}),t.content]})}function Ue(){const e=(0,j.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Be,{}),secondaryMenu:(0,u.jsx)($e,{})}):null}const He={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function qe(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Ve(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.p)(),i=(0,j.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,T.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[He.navbarHideable,!d&&He.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(qe,{onClick:i.toggle}),(0,u.jsx)(Ue,{})]})}var We=n(440);const Ke={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Ge(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Qe(e){let{error:t}=e;const n=(0,We.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Ke.errorBoundaryError,children:n})}class Ye extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ze="right";function Xe(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Je(){const{toggle:e,shown:t}=(0,j.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Xe,{})})}const et={colorModeToggle:"colorModeToggle_DEke"};function tt(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Ye,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Fe,{...e})},t)))})}function nt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function rt(){const e=(0,j.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Ze)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(nt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Je,{}),(0,u.jsx)(G,{}),(0,u.jsx)(tt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(tt,{items:r}),(0,u.jsx)(W,{className:et.colorModeToggle}),!o&&(0,u.jsx)(Ie,{children:(0,u.jsx)(Te,{})})]})})}function ot(){return(0,u.jsx)(Ve,{children:(0,u.jsx)(rt,{})})}function at(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?s:r}:{to:l},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function it(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(at,{item:t})},t.href??t.to)}function lt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(it,{item:e},t)))})]})}function st(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(lt,{column:e},t)))})}function ct(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function ut(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(at,{item:t})}function dt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(ut,{item:e}),t.length!==n+1&&(0,u.jsx)(ct,{})]},n)))})})}function pt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(st,{columns:t}):(0,u.jsx)(dt,{links:t})}var ft=n(1122);const mt={footerLogoLink:"footerLogoLink_BH7S"};function ht(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(ft.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function gt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:mt.footerLogoLink,target:t.target,children:(0,u.jsx)(ht,{logo:t})}):(0,u.jsx)(ht,{logo:t})}function bt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function vt(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function yt(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(vt,{style:o,links:n&&n.length>0&&(0,u.jsx)(pt,{links:n}),logo:r&&(0,u.jsx)(gt,{logo:r}),copyright:t&&(0,u.jsx)(bt,{copyright:t})})}const wt=r.memo(yt),St=(0,P.fM)([F.a,S.o,T.Tv,Re.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(I.y_,{children:(0,u.jsx)(j.e,{children:(0,u.jsx)(L,{children:t})})})}]);function kt(e){let{children:t}=e;return(0,u.jsx)(St,{children:t})}var xt=n(1107);function Et(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(xt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Ge,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Qe,{error:t})})]})})})}const _t={mainWrapper:"mainWrapper_z2l0"};function Ot(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,b.J)(),(0,u.jsxs)(kt,{children:[(0,u.jsx)(i.be,{title:l,description:s}),(0,u.jsx)(y,{}),(0,u.jsx)(A,{}),(0,u.jsx)(ot,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,_t.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Et,{...e}),children:t})}),!n&&(0,u.jsx)(wt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),l=n(1122),s=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Ay)(l?.href||"/"),m=n?"":t,h=l?.alt??m;return(0,s.jsxs)(r.A,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:h,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(5066),a=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,l.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:s,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,l.jsx)(h,{...n,collapsed:s}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>m});var r=n(6540),o=n(2303),a=n(679),i=n(9532),l=n(6342),s=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(679),l=n(6342),s=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),l=n(6342),s=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,l.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[s,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(s)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:s})),[e,n,u,s])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new s.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>s,y_:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,l]=a,s=(0,o.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4255:(e,t,n)=>{"use strict";n.d(t,{b:()=>l,w:()=>s});var r=n(6540),o=n(4586),a=n(7485);const i="q";function l(){return(0,a.l)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},481:(e,t,n)=>{"use strict";n.d(t,{s:()=>o});var r=n(4586);function o(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,aZ:()=>s,l:()=>c});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function s(e){return l((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=s(e)??"",n=function(e){const t=(0,o.W6)();return(0,r.useCallback)(((n,r)=>{const o=new URLSearchParams(t.location.search);n?o.set(e,n):o.delete(e),(r?.push?t.push:t.replace)({search:o.toString()})}),[e,t])}(e);return[t,n]}},1682:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}function a(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{$z:()=>a,XI:()=>r,sb:()=>o})},5500:(e,t,n)=>{"use strict";n.d(t,{Jx:()=>f,be:()=>u,e3:()=>p});var r=n(6540),o=n(5066),a=n(5260),i=n(6803),l=n(6025),s=n(481),c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=(0,s.s)(t),{withBaseUrl:d}=(0,l.hH)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:l,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},1252:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,a_:()=>m,gk:()=>h});var r=n(6540),o=n(8193),a=n(2303),i=n(205),l=n(9532),s=n(4848);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new l.dV("ScrollControllerProvider");return e}const p=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,l._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function m(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.A)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function h(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});const r="default"},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(6540);const o=JSON.parse('{"N":"localStorage","M":""}'),a=o.N;function i(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function l(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=l(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,o.zy)(),c=(0,a.Ks)(s,{trailingSlash:n,baseUrl:e}),u=l===i?e:e.replace(`/${l}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},8126:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(4586);function o(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},1062:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(6540),o=n(1252),a=n(6025),i=n(8126);function l(){const{withBaseUrl:e}=(0,a.hH)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.G)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,c=n,c?o(s):a(s));var s,c;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(1635);t.LU="__blog-post-container";var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>O,yJ:()=>f,sC:()=>A,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(1561);function s(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,h(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var S=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,x="?"===y||"*"===y,E=n[2]||u,_=b||v;r.push({name:g||a++,prefix:h||"",delimiter:E,optional:x,repeat:k,partial:S,asterisk:!!w,pattern:_?c(_):w?".*":"[^"+s(E)+"]+?"})}}return i{Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]},5538:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},6976:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=a.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(Prism)},9535:()=>{!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},3524:(e,t,n)=>{var r={"./prism-go":6378,"./prism-groovy":5538,"./prism-java":6976,"./prism-protobuf":9535};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=3524},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n