solace-agent-mesh 0.1.3__py3-none-any.whl → 0.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (73) hide show
  1. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +9 -2
  2. solace_agent_mesh/agents/global/actions/plotly_graph.py +70 -46
  3. solace_agent_mesh/agents/web_request/actions/do_web_request.py +34 -33
  4. solace_agent_mesh/cli/__init__.py +1 -1
  5. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +8 -6
  6. solace_agent_mesh/cli/commands/add/gateway.py +162 -9
  7. solace_agent_mesh/cli/commands/build.py +15 -1
  8. solace_agent_mesh/cli/commands/init/ai_provider_step.py +45 -28
  9. solace_agent_mesh/cli/commands/init/broker_step.py +1 -4
  10. solace_agent_mesh/cli/commands/init/create_config_file_step.py +8 -0
  11. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +52 -1
  12. solace_agent_mesh/cli/commands/init/init.py +50 -37
  13. solace_agent_mesh/cli/commands/plugin/build.py +60 -9
  14. solace_agent_mesh/cli/commands/run.py +2 -2
  15. solace_agent_mesh/cli/config.py +4 -0
  16. solace_agent_mesh/cli/main.py +14 -8
  17. solace_agent_mesh/cli/utils.py +7 -2
  18. solace_agent_mesh/common/constants.py +10 -0
  19. solace_agent_mesh/common/prompt_templates.py +1 -3
  20. solace_agent_mesh/common/utils.py +104 -30
  21. solace_agent_mesh/config_portal/__init__.py +0 -0
  22. solace_agent_mesh/config_portal/backend/__init__.py +0 -0
  23. solace_agent_mesh/config_portal/backend/common.py +35 -0
  24. solace_agent_mesh/config_portal/backend/server.py +233 -0
  25. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DRPGOzHj.js +42 -0
  26. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +191 -0
  27. solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-DX1misIU.js +19 -0
  28. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +17 -0
  29. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-8147e469.js +1 -0
  30. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DgMDqKDc.js +10 -0
  31. solace_agent_mesh/config_portal/frontend/static/client/assets/root-hhS5izs8.css +1 -0
  32. solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
  33. solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
  34. solace_agent_mesh/configs/orchestrator.yaml +1 -1
  35. solace_agent_mesh/configs/service_embedding.yaml +1 -1
  36. solace_agent_mesh/configs/service_llm.yaml +1 -1
  37. solace_agent_mesh/gateway/components/gateway_base.py +7 -1
  38. solace_agent_mesh/gateway/components/gateway_input.py +8 -5
  39. solace_agent_mesh/gateway/components/gateway_output.py +12 -3
  40. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +4 -0
  41. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +43 -12
  42. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +19 -5
  43. solace_agent_mesh/orchestrator/orchestrator_main.py +11 -5
  44. solace_agent_mesh/orchestrator/orchestrator_prompt.py +184 -60
  45. solace_agent_mesh/services/file_service/file_service.py +5 -0
  46. solace_agent_mesh/services/file_service/file_service_constants.py +1 -1
  47. solace_agent_mesh/services/file_service/file_transformations.py +11 -1
  48. solace_agent_mesh/services/file_service/file_utils.py +2 -0
  49. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +21 -46
  50. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +74 -0
  51. solace_agent_mesh/services/history_service/history_providers/index.py +40 -0
  52. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +19 -156
  53. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +66 -0
  54. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +40 -140
  55. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +93 -0
  56. solace_agent_mesh/services/history_service/history_service.py +315 -41
  57. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  58. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +399 -0
  59. solace_agent_mesh/services/llm_service/components/llm_request_component.py +19 -0
  60. solace_agent_mesh/templates/gateway-config-template.yaml +2 -1
  61. solace_agent_mesh/templates/gateway-default-config.yaml +3 -3
  62. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +29 -0
  63. solace_agent_mesh/templates/rest-api-default-config.yaml +2 -1
  64. solace_agent_mesh/templates/slack-default-config.yaml +1 -1
  65. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +9 -0
  66. solace_agent_mesh/templates/web-default-config.yaml +2 -1
  67. solace_agent_mesh-0.2.1.dist-info/METADATA +172 -0
  68. {solace_agent_mesh-0.1.3.dist-info → solace_agent_mesh-0.2.1.dist-info}/RECORD +71 -52
  69. solace_agent_mesh/common/prompt_templates_unused_delete.py +0 -161
  70. solace_agent_mesh-0.1.3.dist-info/METADATA +0 -208
  71. {solace_agent_mesh-0.1.3.dist-info → solace_agent_mesh-0.2.1.dist-info}/WHEEL +0 -0
  72. {solace_agent_mesh-0.1.3.dist-info → solace_agent_mesh-0.2.1.dist-info}/entry_points.txt +0 -0
  73. {solace_agent_mesh-0.1.3.dist-info → solace_agent_mesh-0.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,19 @@
1
+ import{r,j as v}from"./index-BJHAE5s4.js";import{E as p,i as C,d as M,c as y,m as g,s as E,a as S,g as b,b as F,e as P,f as k,u as D,R as z,h as j,j as H,k as L,r as O}from"./components-ZIfdTbrV.js";/**
2
+ * @remix-run/react v2.16.2
3
+ *
4
+ * Copyright (c) Remix Software Inc.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */function T(n){if(!n)return null;let x=Object.entries(n),u={};for(let[a,e]of x)if(e&&e.__type==="RouteErrorResponse")u[a]=new p(e.status,e.statusText,e.data,e.internal===!0);else if(e&&e.__type==="Error"){if(e.__subType){let i=window[e.__subType];if(typeof i=="function")try{let o=new i(e.message);o.stack=e.stack,u[a]=o}catch{}}if(u[a]==null){let i=new Error(e.message);i.stack=e.stack,u[a]=i}}else u[a]=e;return u}/**
11
+ * @remix-run/react v2.16.2
12
+ *
13
+ * Copyright (c) Remix Software Inc.
14
+ *
15
+ * This source code is licensed under the MIT license found in the
16
+ * LICENSE.md file in the root directory of this source tree.
17
+ *
18
+ * @license MIT
19
+ */let s,t,f=!1,R;new Promise(n=>{R=n}).catch(()=>{});function B(n){if(!t){if(window.__remixContext.future.v3_singleFetch){if(!s){let d=window.__remixContext.stream;C(d,"No stream found for single fetch decoding"),window.__remixContext.stream=void 0,s=M(d,window).then(l=>{window.__remixContext.state=l.value,s.value=!0}).catch(l=>{s.error=l})}if(s.error)throw s.error;if(!s.value)throw s}let i=y(window.__remixManifest.routes,window.__remixRouteModules,window.__remixContext.state,window.__remixContext.future,window.__remixContext.isSpaMode),o;if(!window.__remixContext.isSpaMode){o={...window.__remixContext.state,loaderData:{...window.__remixContext.state.loaderData}};let d=g(i,window.location,window.__remixContext.basename);if(d)for(let l of d){let _=l.route.id,c=window.__remixRouteModules[_],w=window.__remixManifest.routes[_];c&&E(w,c,window.__remixContext.isSpaMode)&&(c.HydrateFallback||!w.hasLoader)?o.loaderData[_]=void 0:w&&!w.hasLoader&&(o.loaderData[_]=null)}o&&o.errors&&(o.errors=T(o.errors))}t=S({routes:i,history:P(),basename:window.__remixContext.basename,future:{v7_normalizeFormMethod:!0,v7_fetcherPersist:window.__remixContext.future.v3_fetcherPersist,v7_partialHydration:!0,v7_prependBasename:!0,v7_relativeSplatPath:window.__remixContext.future.v3_relativeSplatPath,v7_skipActionErrorRevalidation:window.__remixContext.future.v3_singleFetch===!0},hydrationData:o,mapRouteProperties:L,dataStrategy:window.__remixContext.future.v3_singleFetch&&!window.__remixContext.isSpaMode?F(window.__remixManifest,window.__remixRouteModules,()=>t):void 0,patchRoutesOnNavigation:b(window.__remixManifest,window.__remixRouteModules,window.__remixContext.future,window.__remixContext.isSpaMode,window.__remixContext.basename)}),t.state.initialized&&(f=!0,t.initialize()),t.createRoutesForHMR=k,window.__remixRouter=t,R&&R(t)}let[x,u]=r.useState(void 0),[a,e]=r.useState(t.state.location);return r.useLayoutEffect(()=>{f||(f=!0,t.initialize())},[]),r.useLayoutEffect(()=>t.subscribe(i=>{i.location!==a&&e(i.location)}),[a]),D(t,window.__remixManifest,window.__remixRouteModules,window.__remixContext.future,window.__remixContext.isSpaMode),r.createElement(r.Fragment,null,r.createElement(z.Provider,{value:{manifest:window.__remixManifest,routeModules:window.__remixRouteModules,future:window.__remixContext.future,criticalCss:x,isSpaMode:window.__remixContext.isSpaMode}},r.createElement(j,{location:a},r.createElement(H,{router:t,fallbackElement:null,future:{v7_startTransition:!0}}))),window.__remixContext.future.v3_singleFetch?r.createElement(r.Fragment,null):null)}var m={},h;function q(){if(h)return m;h=1;var n=O();return m.createRoot=n.createRoot,m.hydrateRoot=n.hydrateRoot,m}var I=q();r.startTransition(()=>{I.hydrateRoot(document,v.jsx(r.StrictMode,{children:v.jsx(B,{})}))});
@@ -0,0 +1,17 @@
1
+ function ne(l,S){for(var v=0;v<S.length;v++){const _=S[v];if(typeof _!="string"&&!Array.isArray(_)){for(const m in _)if(m!=="default"&&!(m in l)){const h=Object.getOwnPropertyDescriptor(_,m);h&&Object.defineProperty(l,m,h.get?h:{enumerable:!0,get:()=>_[m]})}}}return Object.freeze(Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}))}function oe(l){return l&&l.__esModule&&Object.prototype.hasOwnProperty.call(l,"default")?l.default:l}var A={exports:{}},w={},F={exports:{}},r={};/**
2
+ * @license React
3
+ * react.production.min.js
4
+ *
5
+ * Copyright (c) Facebook, Inc. and its affiliates.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */var W;function ue(){if(W)return r;W=1;var l=Symbol.for("react.element"),S=Symbol.for("react.portal"),v=Symbol.for("react.fragment"),_=Symbol.for("react.strict_mode"),m=Symbol.for("react.profiler"),h=Symbol.for("react.provider"),O=Symbol.for("react.context"),E=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),j=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),R=Symbol.iterator;function k(e){return e===null||typeof e!="object"?null:(e=R&&e[R]||e["@@iterator"],typeof e=="function"?e:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},L=Object.assign,N={};function b(e,t,n){this.props=e,this.context=t,this.refs=N,this.updater=n||x}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function U(){}U.prototype=b.prototype;function P(e,t,n){this.props=e,this.context=t,this.refs=N,this.updater=n||x}var q=P.prototype=new U;q.constructor=P,L(q,b.prototype),q.isPureReactComponent=!0;var V=Array.isArray,M=Object.prototype.hasOwnProperty,I={current:null},J={key:!0,ref:!0,__self:!0,__source:!0};function z(e,t,n){var u,o={},c=null,f=null;if(t!=null)for(u in t.ref!==void 0&&(f=t.ref),t.key!==void 0&&(c=""+t.key),t)M.call(t,u)&&!J.hasOwnProperty(u)&&(o[u]=t[u]);var s=arguments.length-2;if(s===1)o.children=n;else if(1<s){for(var i=Array(s),d=0;d<s;d++)i[d]=arguments[d+2];o.children=i}if(e&&e.defaultProps)for(u in s=e.defaultProps,s)o[u]===void 0&&(o[u]=s[u]);return{$$typeof:l,type:e,key:c,ref:f,props:o,_owner:I.current}}function Z(e,t){return{$$typeof:l,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function T(e){return typeof e=="object"&&e!==null&&e.$$typeof===l}function ee(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(n){return t[n]})}var B=/\/+/g;function D(e,t){return typeof e=="object"&&e!==null&&e.key!=null?ee(""+e.key):t.toString(36)}function $(e,t,n,u,o){var c=typeof e;(c==="undefined"||c==="boolean")&&(e=null);var f=!1;if(e===null)f=!0;else switch(c){case"string":case"number":f=!0;break;case"object":switch(e.$$typeof){case l:case S:f=!0}}if(f)return f=e,o=o(f),e=u===""?"."+D(f,0):u,V(o)?(n="",e!=null&&(n=e.replace(B,"$&/")+"/"),$(o,t,n,"",function(d){return d})):o!=null&&(T(o)&&(o=Z(o,n+(!o.key||f&&f.key===o.key?"":(""+o.key).replace(B,"$&/")+"/")+e)),t.push(o)),1;if(f=0,u=u===""?".":u+":",V(e))for(var s=0;s<e.length;s++){c=e[s];var i=u+D(c,s);f+=$(c,t,n,i,o)}else if(i=k(e),typeof i=="function")for(e=i.call(e),s=0;!(c=e.next()).done;)c=c.value,i=u+D(c,s++),f+=$(c,t,n,i,o);else if(c==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return f}function g(e,t,n){if(e==null)return e;var u=[],o=0;return $(e,u,"","",function(c){return t.call(n,c,o++)}),u}function te(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(n){(e._status===0||e._status===-1)&&(e._status=1,e._result=n)},function(n){(e._status===0||e._status===-1)&&(e._status=2,e._result=n)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var a={current:null},C={transition:null},re={ReactCurrentDispatcher:a,ReactCurrentBatchConfig:C,ReactCurrentOwner:I};function H(){throw Error("act(...) is not supported in production builds of React.")}return r.Children={map:g,forEach:function(e,t,n){g(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return g(e,function(){t++}),t},toArray:function(e){return g(e,function(t){return t})||[]},only:function(e){if(!T(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},r.Component=b,r.Fragment=v,r.Profiler=m,r.PureComponent=P,r.StrictMode=_,r.Suspense=p,r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=re,r.act=H,r.cloneElement=function(e,t,n){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var u=L({},e.props),o=e.key,c=e.ref,f=e._owner;if(t!=null){if(t.ref!==void 0&&(c=t.ref,f=I.current),t.key!==void 0&&(o=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(i in t)M.call(t,i)&&!J.hasOwnProperty(i)&&(u[i]=t[i]===void 0&&s!==void 0?s[i]:t[i])}var i=arguments.length-2;if(i===1)u.children=n;else if(1<i){s=Array(i);for(var d=0;d<i;d++)s[d]=arguments[d+2];u.children=s}return{$$typeof:l,type:e.type,key:o,ref:c,props:u,_owner:f}},r.createContext=function(e){return e={$$typeof:O,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:h,_context:e},e.Consumer=e},r.createElement=z,r.createFactory=function(e){var t=z.bind(null,e);return t.type=e,t},r.createRef=function(){return{current:null}},r.forwardRef=function(e){return{$$typeof:E,render:e}},r.isValidElement=T,r.lazy=function(e){return{$$typeof:y,_payload:{_status:-1,_result:e},_init:te}},r.memo=function(e,t){return{$$typeof:j,type:e,compare:t===void 0?null:t}},r.startTransition=function(e){var t=C.transition;C.transition={};try{e()}finally{C.transition=t}},r.unstable_act=H,r.useCallback=function(e,t){return a.current.useCallback(e,t)},r.useContext=function(e){return a.current.useContext(e)},r.useDebugValue=function(){},r.useDeferredValue=function(e){return a.current.useDeferredValue(e)},r.useEffect=function(e,t){return a.current.useEffect(e,t)},r.useId=function(){return a.current.useId()},r.useImperativeHandle=function(e,t,n){return a.current.useImperativeHandle(e,t,n)},r.useInsertionEffect=function(e,t){return a.current.useInsertionEffect(e,t)},r.useLayoutEffect=function(e,t){return a.current.useLayoutEffect(e,t)},r.useMemo=function(e,t){return a.current.useMemo(e,t)},r.useReducer=function(e,t,n){return a.current.useReducer(e,t,n)},r.useRef=function(e){return a.current.useRef(e)},r.useState=function(e){return a.current.useState(e)},r.useSyncExternalStore=function(e,t,n){return a.current.useSyncExternalStore(e,t,n)},r.useTransition=function(){return a.current.useTransition()},r.version="18.3.1",r}var Y;function Q(){return Y||(Y=1,F.exports=ue()),F.exports}/**
10
+ * @license React
11
+ * react-jsx-runtime.production.min.js
12
+ *
13
+ * Copyright (c) Facebook, Inc. and its affiliates.
14
+ *
15
+ * This source code is licensed under the MIT license found in the
16
+ * LICENSE file in the root directory of this source tree.
17
+ */var G;function ie(){if(G)return w;G=1;var l=Q(),S=Symbol.for("react.element"),v=Symbol.for("react.fragment"),_=Object.prototype.hasOwnProperty,m=l.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,h={key:!0,ref:!0,__self:!0,__source:!0};function O(E,p,j){var y,R={},k=null,x=null;j!==void 0&&(k=""+j),p.key!==void 0&&(k=""+p.key),p.ref!==void 0&&(x=p.ref);for(y in p)_.call(p,y)&&!h.hasOwnProperty(y)&&(R[y]=p[y]);if(E&&E.defaultProps)for(y in p=E.defaultProps,p)R[y]===void 0&&(R[y]=p[y]);return{$$typeof:S,type:E,key:k,ref:x,props:R,_owner:m.current}}return w.Fragment=v,w.jsx=O,w.jsxs=O,w}var K;function ce(){return K||(K=1,A.exports=ie()),A.exports}var fe=ce(),X=Q();const se=oe(X),le=ne({__proto__:null,default:se},[X]);export{le as R,Q as a,oe as g,fe as j,X as r};
@@ -0,0 +1 @@
1
+ window.__remixManifest={"entry":{"module":"/assets/entry.client-DX1misIU.js","imports":["/assets/index-BJHAE5s4.js","/assets/components-ZIfdTbrV.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/root-DgMDqKDc.js","imports":["/assets/index-BJHAE5s4.js","/assets/components-ZIfdTbrV.js"],"css":["/assets/root-hhS5izs8.css"]},"routes/_index":{"id":"routes/_index","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_index-DRPGOzHj.js","imports":["/assets/index-BJHAE5s4.js"],"css":[]}},"url":"/assets/manifest-8147e469.js","version":"8147e469"};
@@ -0,0 +1,10 @@
1
+ import{r as i,j as t}from"./index-BJHAE5s4.js";import{l as m,n as f,o as y,p as x,_ as g,O as S,M as w,L as j,S as k}from"./components-ZIfdTbrV.js";/**
2
+ * @remix-run/react v2.16.2
3
+ *
4
+ * Copyright (c) Remix Software Inc.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */let a="positions";function M({getKey:e,...l}){let{isSpaMode:c}=m(),r=f(),p=y();x({getKey:e,storageKey:a});let u=i.useMemo(()=>{if(!e)return null;let s=e(r,p);return s!==r.key?s:null},[]);if(c)return null;let h=((s,d)=>{if(!window.history.state||!window.history.state.key){let o=Math.random().toString(32).slice(2);window.history.replaceState({key:o},"")}try{let n=JSON.parse(sessionStorage.getItem(s)||"{}")[d||window.history.state.key];typeof n=="number"&&window.scrollTo(0,n)}catch(o){console.error(o),sessionStorage.removeItem(s)}}).toString();return i.createElement("script",g({},l,{suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:`(${h})(${JSON.stringify(a)}, ${JSON.stringify(u)})`}}))}const I=()=>[{rel:"preconnect",href:"https://fonts.googleapis.com"},{rel:"preconnect",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"},{rel:"stylesheet",href:"https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"}];function R({children:e}){return t.jsxs("html",{lang:"en",children:[t.jsxs("head",{children:[t.jsx("meta",{charSet:"utf-8"}),t.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),t.jsx(w,{}),t.jsx(j,{})]}),t.jsxs("body",{children:[e,t.jsx(M,{}),t.jsx(k,{})]})]})}function _(){return t.jsx(S,{})}function b(){return t.jsx("p",{children:"Loading..."})}export{b as HydrateFallback,R as Layout,_ as default,I as links};
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-1{left:.25rem}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-5{top:1.25rem}.z-10{z-index:10}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.-mb-10{margin-bottom:-2.5rem}.-ml-1{margin-left:-.25rem}.-ml-10{margin-left:-2.5rem}.-mr-10{margin-right:-2.5rem}.-mt-10{margin-top:-2.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-9{margin-left:2.25rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-9{margin-right:2.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-10{height:2.5rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-full{height:100%}.max-h-60{max-height:15rem}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-full{width:100%}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-grow{flex-grow:1}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-solace-blue{--tw-border-opacity: 1;border-color:rgb(32 52 74 / var(--tw-border-opacity, 1))}.border-solace-green{--tw-border-opacity: 1;border-color:rgb(0 175 131 / var(--tw-border-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-200{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-solace-blue{--tw-bg-opacity: 1;background-color:rgb(32 52 74 / var(--tw-bg-opacity, 1))}.bg-solace-dark-green{--tw-bg-opacity: 1;background-color:rgb(6 143 108 / var(--tw-bg-opacity, 1))}.bg-solace-green{--tw-bg-opacity: 1;background-color:rgb(0 175 131 / var(--tw-bg-opacity, 1))}.bg-solace-light-blue\/10{background-color:#0320341a}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-opacity-10{--tw-bg-opacity: .1}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-green-50{--tw-gradient-from: #f0fdf4 var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 253 244 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-blue-50{--tw-gradient-to: #eff6ff var(--tw-gradient-to-position)}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-4{padding-bottom:1rem}.pl-1{padding-left:.25rem}.pl-4{padding-left:1rem}.pr-10{padding-right:2.5rem}.pt-4{padding-top:1rem}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-solace-blue{--tw-text-opacity: 1;color:rgb(32 52 74 / var(--tw-text-opacity, 1))}.text-solace-dark-green{--tw-text-opacity: 1;color:rgb(6 143 108 / var(--tw-text-opacity, 1))}.text-solace-green{--tw-text-opacity: 1;color:rgb(0 175 131 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}html,body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));color-scheme:light}.last\:mb-0:last-child{margin-bottom:0}.last\:border-0:last-child{border-width:0px}.last\:pb-0:last-child{padding-bottom:0}.hover\:border-solace-blue\/30:hover{border-color:#20344a4d}.hover\:border-solace-blue\/50:hover{border-color:#20344a80}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-solace-blue:hover{--tw-bg-opacity: 1;background-color:rgb(32 52 74 / var(--tw-bg-opacity, 1))}.hover\:bg-solace-dark-green:hover{--tw-bg-opacity: 1;background-color:rgb(6 143 108 / var(--tw-bg-opacity, 1))}.hover\:bg-stone-300:hover{--tw-bg-opacity: 1;background-color:rgb(214 211 209 / var(--tw-bg-opacity, 1))}.hover\:text-solace-blue:hover{--tw-text-opacity: 1;color:rgb(32 52 74 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-gray-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1))}.focus\:ring-solace-green:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 175 131 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.disabled\:bg-gray-100:disabled{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.disabled\:bg-solace-green\/50:disabled{background-color:#00af8380}.disabled\:text-gray-400:disabled{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.disabled\:text-gray-500:disabled{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:bg-opacity-20{--tw-bg-opacity: .2}.group:hover .group-hover\:text-solace-blue{--tw-text-opacity: 1;color:rgb(32 52 74 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 768px){.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
@@ -0,0 +1,7 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/root-hhS5izs8.css"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&amp;display=swap"/></head><body><p>Loading...</p><link rel="modulepreload" href="/assets/manifest-8147e469.js"/><link rel="modulepreload" href="/assets/entry.client-DX1misIU.js"/><link rel="modulepreload" href="/assets/index-BJHAE5s4.js"/><link rel="modulepreload" href="/assets/components-ZIfdTbrV.js"/><link rel="modulepreload" href="/assets/root-DgMDqKDc.js"/><script>window.__remixContext = {"basename":"/","future":{"v3_fetcherPersist":false,"v3_relativeSplatPath":false,"v3_throwAbortReason":false,"v3_routeConfig":false,"v3_singleFetch":false,"v3_lazyRouteDiscovery":false,"unstable_optimizeDeps":false},"isSpaMode":true,"state":{"loaderData":{"root":null,"routes/_index":null},"actionData":null,"errors":null}};</script><script type="module" async="">import "/assets/manifest-8147e469.js";
3
+ import * as route0 from "/assets/root-DgMDqKDc.js";
4
+
5
+ window.__remixRouteModules = {"root":route0};
6
+
7
+ import("/assets/entry.client-DX1misIU.js");</script></body></html>
@@ -50,7 +50,7 @@ flows:
50
50
  component_base_path: .
51
51
  component_module: src.orchestrator.components.orchestrator_register_component
52
52
  component_config:
53
- agent_ttl_ms: 60000000
53
+ agent_ttl_ms: 60000
54
54
  component_input:
55
55
  source_expression: input.payload
56
56
 
@@ -53,7 +53,7 @@ flows:
53
53
  source_expression: input.payload
54
54
 
55
55
  - component_name: embedding_service_model
56
- num_instances: 1
56
+ num_instances: ${EMBEDDING_SERVICE_MODEL_NUM_INSTANCES, 1}
57
57
  component_module: litellm_embeddings
58
58
  component_config:
59
59
  load_balancer:
@@ -81,7 +81,7 @@ flows:
81
81
  source_expression: input.payload
82
82
 
83
83
  - component_name: llm_service_planning
84
- num_instances: 1
84
+ num_instances: ${LLM_SERVICE_PLANNING_MODEL_NUM_INSTANCES, 1}
85
85
  component_module: litellm_chat_model
86
86
  component_config:
87
87
  <<: *llm_config
@@ -3,15 +3,17 @@ from solace_ai_connector.common.log import log
3
3
  from ...services.history_service import HistoryService
4
4
  from ..identity.identity_provider import IdentityProvider
5
5
  from ...common.constants import DEFAULT_IDENTITY_KEY_FIELD
6
+ from ...orchestrator.orchestrator_prompt import LONG_TERM_MEMORY_PROMPT
6
7
 
7
8
 
8
9
  class GatewayBase(ComponentBase):
9
10
  def __init__(self, info, **kwargs):
10
11
  super().__init__(info, **kwargs)
11
12
  self.gateway_id = self.get_config("gateway_id", "default-change-me")
13
+ self.system_purpose_prompt_suffix = ""
12
14
  self.history_instance = self._initialize_history()
13
15
 
14
- def _initialize_history(self):
16
+ def _initialize_history(self) -> HistoryService:
15
17
  self.use_history = self.get_config("retain_history", True)
16
18
 
17
19
  if not self.use_history:
@@ -19,6 +21,9 @@ class GatewayBase(ComponentBase):
19
21
 
20
22
  history_config = self.get_config("history_config", {})
21
23
 
24
+ if history_config.get("enable_long_term_memory", False):
25
+ self.system_purpose_prompt_suffix = LONG_TERM_MEMORY_PROMPT
26
+
22
27
  try:
23
28
  return HistoryService(
24
29
  history_config, identifier=self.gateway_id + "_history"
@@ -27,6 +32,7 @@ class GatewayBase(ComponentBase):
27
32
  log.error("Failed to load history class: %s", e)
28
33
  raise
29
34
 
35
+
30
36
  def _initialize_identity_component(self):
31
37
  identity_config = self.get_config("identity", {})
32
38
  identity_key_field = self.get_config("identity_key_field", DEFAULT_IDENTITY_KEY_FIELD)
@@ -6,7 +6,7 @@ from uuid import uuid4
6
6
  from solace_ai_connector.common.message import Message
7
7
  from solace_ai_connector.common.log import log
8
8
  from ...services.file_service import FileService
9
- from ...common.constants import DEFAULT_IDENTITY_KEY_FIELD
9
+ from ...common.constants import DEFAULT_IDENTITY_KEY_FIELD, HISTORY_USER_ROLE
10
10
  from .gateway_base import GatewayBase
11
11
 
12
12
  info = {
@@ -130,7 +130,7 @@ class GatewayInput(GatewayBase):
130
130
 
131
131
  def __init__(self, **kwargs):
132
132
  super().__init__(info, **kwargs)
133
- self.system_purpose = self.get_config("system_purpose", DEFAULT_SYSTEM_PURPOSE)
133
+ self.system_purpose = self.get_config("system_purpose", DEFAULT_SYSTEM_PURPOSE) + self.system_purpose_prompt_suffix
134
134
  self.interaction_type = self.get_config(
135
135
  "interaction_type", DEFAULT_INTERACTION_TYPE
136
136
  )
@@ -209,17 +209,20 @@ class GatewayInput(GatewayBase):
209
209
 
210
210
  copied_data["history"] = []
211
211
  if self.use_history:
212
+ other_history_props = {
213
+ "identity": identity_value,
214
+ }
212
215
  prompt = data.get("text", "")
213
- self.history_instance.store_history(session_id, "user", prompt)
216
+ self.history_instance.store_history(session_id, HISTORY_USER_ROLE, prompt, other_history_props)
214
217
 
215
218
  for file in attached_files:
216
- self.history_instance.store_file(session_id, file)
219
+ self.history_instance.store_file(session_id, file )
217
220
 
218
221
  # retrieve all files for the session
219
222
  available_files = self.history_instance.get_files(session_id)
220
223
 
221
224
  # Add history to the data
222
- copied_data["history"] = self.history_instance.get_history(session_id)
225
+ copied_data["history"] = self.history_instance.get_history(session_id, other_history_props)
223
226
 
224
227
  available_files = json.dumps(available_files)
225
228
  except Exception as e:
@@ -5,7 +5,7 @@ from solace_ai_connector.common.log import log
5
5
  from .gateway_base import GatewayBase
6
6
  from ...services.file_service import FileService
7
7
  from ...common.utils import files_to_block_text
8
-
8
+ from ...common.constants import HISTORY_ASSISTANT_ROLE
9
9
 
10
10
  info = {
11
11
  "class_name": "GatewayOutput",
@@ -170,6 +170,7 @@ class GatewayOutput(GatewayBase):
170
170
  file_service = FileService()
171
171
  user_properties = message.get_user_properties()
172
172
  session_id = user_properties.get("session_id")
173
+ identity_value = user_properties.get("identity")
173
174
  files = data.get("files", [])
174
175
 
175
176
  # Extract the interface queue ID
@@ -181,6 +182,10 @@ class GatewayOutput(GatewayBase):
181
182
  )
182
183
 
183
184
  if self.use_history and session_id:
185
+ other_history_props = {
186
+ "identity": identity_value,
187
+ }
188
+
184
189
  topic = message.get_topic()
185
190
  content = data.get("text") or ""
186
191
 
@@ -193,14 +198,18 @@ class GatewayOutput(GatewayBase):
193
198
  and data.get("last_chunk")
194
199
  and "text" in data
195
200
  ):
201
+ actions_called = user_properties.get("actions_called", [])
202
+ if actions_called:
203
+ self.history_instance.store_actions(session_id, actions_called)
204
+
196
205
  if content:
197
206
  self.history_instance.store_history(
198
- session_id, "assistant", content
207
+ session_id, HISTORY_ASSISTANT_ROLE, content, other_history_props
199
208
  )
200
209
 
201
210
  for file in files:
202
211
  self.history_instance.store_history(
203
- session_id, "assistant", f'\n[Returned file: {{name: {file.get("name")}, url: {file.get("url")}}}]\n'
212
+ session_id, HISTORY_ASSISTANT_ROLE, f'\n[Returned file: {{name: {file.get("name")}, url: {file.get("url")}}}]\n', other_history_props
204
213
  )
205
214
  self.history_instance.store_file(session_id, file)
206
215
 
@@ -30,6 +30,10 @@ class OrchestratorActionManagerTimeoutComponent(ComponentBase):
30
30
  # Need to go through all the active action_requests and check if any of them have timed out
31
31
  timeout_events = self.action_manager.do_timeout_check()
32
32
 
33
+ # Also check on agents
34
+ orchestrator_state = self.kv_store_get("orchestrator_state")
35
+ orchestrator_state.age_out_agents()
36
+
33
37
  # Now turn these into messages
34
38
  messages = []
35
39
  for event in timeout_events:
@@ -14,8 +14,11 @@ import yaml
14
14
  from solace_ai_connector.common.log import log
15
15
  from solace_ai_connector.common.message import Message
16
16
 
17
- from ...common.constants import ORCHESTRATOR_COMPONENT_NAME
18
- from ...services.llm_service.components.llm_request_component import LLMRequestComponent, info as base_info
17
+ from ...common.constants import ORCHESTRATOR_COMPONENT_NAME, HISTORY_MEMORY_ROLE
18
+ from ...services.llm_service.components.llm_request_component import (
19
+ LLMRequestComponent,
20
+ info as base_info,
21
+ )
19
22
  from ...services.middleware_service.middleware_service import MiddlewareService
20
23
  from ...services.file_service import FileService
21
24
  from ...services.history_service import HistoryService
@@ -112,10 +115,9 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
112
115
  self.action_manager = ActionManager(self.flow_kv_store, self.flow_lock_manager)
113
116
  self.stream_to_flow = self.get_config("stream_to_flow")
114
117
 
115
-
116
118
  def invoke(self, message: Message, data: Dict[str, Any]) -> Dict[str, Any]:
117
119
  user_properties = message.get_user_properties()
118
- user_properties['timestamp_start'] = time()
120
+ user_properties["timestamp_start"] = time()
119
121
  message.set_user_properties(user_properties)
120
122
 
121
123
  results = self.pre_llm(message, data)
@@ -127,7 +129,23 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
127
129
  results = self.post_llm(message, results)
128
130
 
129
131
  user_properties = message.get_user_properties()
130
- user_properties['timestamp_end'] = time()
132
+ user_properties["timestamp_end"] = time()
133
+
134
+ actions_called = []
135
+ if results:
136
+ for result in results:
137
+ if result.get("payload", {}).get("action_name"):
138
+ actions_called.append(
139
+ {
140
+ "agent_name": result.get("payload", {}).get("agent_name"),
141
+ "action_name": result.get("payload", {}).get("action_name"),
142
+ "action_params": result.get("payload", {}).get(
143
+ "action_params"
144
+ ),
145
+ }
146
+ )
147
+ user_properties["actions_called"] = actions_called
148
+
131
149
  message.set_user_properties(user_properties)
132
150
 
133
151
  return results
@@ -206,7 +224,7 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
206
224
  }
207
225
 
208
226
  # Get the prompts
209
- gateway_history = self.get_gateway_history(data)
227
+ gateway_history, memory_history = self.get_gateway_history(data)
210
228
  system_prompt = SystemPrompt(full_input, examples)
211
229
  if action_response_reinvoke:
212
230
  user_prompt = ActionResponsePrompt(
@@ -217,6 +235,8 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
217
235
  user_prompt = UserStimulusPrompt(
218
236
  full_input, gateway_history, errors, has_files
219
237
  )
238
+ if memory_history:
239
+ self.history.store_history(stimulus_uuid, "system", memory_history)
220
240
 
221
241
  # Store the user prompt in the history
222
242
  self.history.store_history(stimulus_uuid, "user", user_prompt)
@@ -256,7 +276,11 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
256
276
  if response_obj:
257
277
  content = response_obj.get("content", [])
258
278
  actions = response_obj.get("actions", [])
259
- if len(content) == 0 and len(actions) == 0:
279
+ errors = response_obj.get("errors", [])
280
+ if len(errors) > 0:
281
+ msg = "There were errors in the response: " + ", ".join(errors)
282
+ msg += "\n\nPlease try again and ensure your formatting is correct."
283
+ elif len(content) == 0 and len(actions) == 0 and len(errors) == 0:
260
284
  msg = "There were no actions and no text or files in the response. Please try again and ensure your formatting is correct."
261
285
  elif len(actions):
262
286
  # Loop through the actions and make sure they all have an action and agent
@@ -361,7 +385,9 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
361
385
  Dict[str, Any]: The response from the LLM service.
362
386
  """
363
387
  messages = data.get("messages", [])
364
- llm_message = self._create_llm_message(message, messages, {"type": "orchestrator"})
388
+ llm_message = self._create_llm_message(
389
+ message, messages, {"type": "orchestrator"}
390
+ )
365
391
  response_uuid = str(uuid.uuid4())
366
392
 
367
393
  try:
@@ -375,6 +401,9 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
375
401
 
376
402
  def get_gateway_history(self, data):
377
403
  gateway_history = data.get("history", [])
404
+ memory_history = None
405
+ if gateway_history and gateway_history[0].get("role") == HISTORY_MEMORY_ROLE:
406
+ memory_history = gateway_history[0].get("content")
378
407
  # Returning the history from the last user message
379
408
  first_user_idx = None
380
409
  last_user_idx = None
@@ -385,13 +414,13 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
385
414
  last_user_idx = idx
386
415
 
387
416
  if first_user_idx is None:
388
- return [] # No user query found
417
+ return [], memory_history # No user query found
389
418
 
390
419
  if not last_user_idx > first_user_idx:
391
420
  # Latest user message is already handled by orchestator history
392
- return []
421
+ return [], memory_history
393
422
 
394
- return gateway_history[first_user_idx:last_user_idx]
423
+ return gateway_history[first_user_idx:last_user_idx], memory_history
395
424
 
396
425
  def get_user_input(self, chat_text):
397
426
 
@@ -449,7 +478,9 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
449
478
  f"Action not found in agent: {agent_name}, {action_name}"
450
479
  )
451
480
  middleware_service = MiddlewareService()
452
- if middleware_service.get("validate_action_request")(user_properties, action_details):
481
+ if middleware_service.get("validate_action_request")(
482
+ user_properties, action_details
483
+ ):
453
484
  action_params = action.get("parameters", {})
454
485
 
455
486
  action_requests.append(
@@ -5,7 +5,7 @@ from datetime import datetime
5
5
  from solace_ai_connector.components.component_base import ComponentBase
6
6
  from solace_ai_connector.common.log import log
7
7
  from solace_ai_connector.common.message import Message
8
- from ...common.utils import parse_orchestrator_response
8
+ from ...common.utils import parse_orchestrator_response, strip_text_after_invoke_action
9
9
  from ...services.history_service import HistoryService
10
10
  from ...services.file_service import FileService
11
11
  from ...orchestrator.orchestrator_main import (
@@ -75,6 +75,7 @@ class OrchestratorStreamingOutputComponent(ComponentBase):
75
75
  response_uuid = data.get("response_uuid")
76
76
  first_chunk = data.get("first_chunk")
77
77
  last_chunk = data.get("last_chunk")
78
+ check_reasoning = data.get("check_reasoning", True)
78
79
 
79
80
  if first_chunk:
80
81
  response_state = self.add_response_state(response_uuid)
@@ -87,9 +88,15 @@ class OrchestratorStreamingOutputComponent(ComponentBase):
87
88
  if last_chunk:
88
89
  self.delete_response_state(response_uuid)
89
90
  if stimulus_uuid:
90
- self.history.store_history(stimulus_uuid, "assistant", text)
91
+ # Temporary change to remove any bare text and files after the last invoke_action tag
92
+ stripped_text = strip_text_after_invoke_action(text)
93
+ self.history.store_history(
94
+ stimulus_uuid, "assistant", stripped_text
95
+ )
91
96
 
92
- obj = parse_orchestrator_response(text, last_chunk=last_chunk)
97
+ obj = parse_orchestrator_response(
98
+ text, last_chunk=last_chunk, check_reasoning=check_reasoning
99
+ )
93
100
 
94
101
  if not obj or isinstance(obj, str) or not obj.get("content"):
95
102
  log.debug("Error parsing LLM output: %s", obj)
@@ -112,7 +119,7 @@ class OrchestratorStreamingOutputComponent(ComponentBase):
112
119
  response_state,
113
120
  response_uuid,
114
121
  last_chunk,
115
- session_id
122
+ session_id,
116
123
  )
117
124
  if item_text:
118
125
  full_text += item_text
@@ -158,7 +165,14 @@ class OrchestratorStreamingOutputComponent(ComponentBase):
158
165
  return outputs
159
166
 
160
167
  def process_content_item(
161
- self, item_idx, num_items, item, response_state, response_uuid, last_chunk, session_id
168
+ self,
169
+ item_idx,
170
+ num_items,
171
+ item,
172
+ response_state,
173
+ response_uuid,
174
+ last_chunk,
175
+ session_id,
162
176
  ):
163
177
  """Process a content item"""
164
178
  streaming_content_idx = response_state.get("streaming_content_idx", 0)
@@ -46,8 +46,9 @@ class OrchestratorState:
46
46
  with self._lock:
47
47
  agent_name = agent.get("agent_name")
48
48
  agent["state"] = "closed"
49
- if agent_name not in self.registered_agents:
50
- self.registered_agents[agent_name] = agent
49
+
50
+ # Always update the agent information
51
+ self.registered_agents[agent_name] = agent
51
52
 
52
53
  # Reset its TTL
53
54
  self.registered_agents[agent_name][
@@ -79,10 +80,13 @@ class OrchestratorState:
79
80
  def age_out_agents(self):
80
81
  with self._lock:
81
82
  now = datetime.now()
83
+ agents_to_remove = []
82
84
  for agent_name, agent in self.registered_agents.items():
83
- if agent.get("expire_time") < now:
85
+ if agent.get("expire_time", datetime.max) < now:
84
86
  log.warning("Agent %s has expired. Removing.", agent_name)
85
- del self.registered_agents[agent_name]
87
+ agents_to_remove.append(agent_name)
88
+ for agent_name in agents_to_remove:
89
+ del self.registered_agents[agent_name]
86
90
 
87
91
  def delete_agent(self, agent_name):
88
92
  with self._lock:
@@ -145,7 +149,9 @@ class OrchestratorState:
145
149
 
146
150
  for agent_name, agent in self.registered_agents.items():
147
151
  actions = agent.get("actions", [])
148
- filtered_actions = middleware_service.get("filter_action")(user_properties, actions)
152
+ filtered_actions = middleware_service.get("filter_action")(
153
+ user_properties, actions
154
+ )
149
155
 
150
156
  if filtered_actions:
151
157
  agent_state = self.get_agent_state(session_id).get(agent_name, {})