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.
- solace_agent_mesh/agents/global/actions/plantuml_diagram.py +9 -2
- solace_agent_mesh/agents/global/actions/plotly_graph.py +70 -46
- solace_agent_mesh/agents/web_request/actions/do_web_request.py +34 -33
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add/copy_from_plugin.py +8 -6
- solace_agent_mesh/cli/commands/add/gateway.py +162 -9
- solace_agent_mesh/cli/commands/build.py +15 -1
- solace_agent_mesh/cli/commands/init/ai_provider_step.py +45 -28
- solace_agent_mesh/cli/commands/init/broker_step.py +1 -4
- solace_agent_mesh/cli/commands/init/create_config_file_step.py +8 -0
- solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +52 -1
- solace_agent_mesh/cli/commands/init/init.py +50 -37
- solace_agent_mesh/cli/commands/plugin/build.py +60 -9
- solace_agent_mesh/cli/commands/run.py +2 -2
- solace_agent_mesh/cli/config.py +4 -0
- solace_agent_mesh/cli/main.py +14 -8
- solace_agent_mesh/cli/utils.py +7 -2
- solace_agent_mesh/common/constants.py +10 -0
- solace_agent_mesh/common/prompt_templates.py +1 -3
- solace_agent_mesh/common/utils.py +104 -30
- solace_agent_mesh/config_portal/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/common.py +35 -0
- solace_agent_mesh/config_portal/backend/server.py +233 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DRPGOzHj.js +42 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +191 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-DX1misIU.js +19 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +17 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-8147e469.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DgMDqKDc.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-hhS5izs8.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
- solace_agent_mesh/configs/orchestrator.yaml +1 -1
- solace_agent_mesh/configs/service_embedding.yaml +1 -1
- solace_agent_mesh/configs/service_llm.yaml +1 -1
- solace_agent_mesh/gateway/components/gateway_base.py +7 -1
- solace_agent_mesh/gateway/components/gateway_input.py +8 -5
- solace_agent_mesh/gateway/components/gateway_output.py +12 -3
- solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +4 -0
- solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +43 -12
- solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +19 -5
- solace_agent_mesh/orchestrator/orchestrator_main.py +11 -5
- solace_agent_mesh/orchestrator/orchestrator_prompt.py +184 -60
- solace_agent_mesh/services/file_service/file_service.py +5 -0
- solace_agent_mesh/services/file_service/file_service_constants.py +1 -1
- solace_agent_mesh/services/file_service/file_transformations.py +11 -1
- solace_agent_mesh/services/file_service/file_utils.py +2 -0
- solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +21 -46
- solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +74 -0
- solace_agent_mesh/services/history_service/history_providers/index.py +40 -0
- solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +19 -156
- solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +66 -0
- solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +40 -140
- solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +93 -0
- solace_agent_mesh/services/history_service/history_service.py +315 -41
- solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
- solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +399 -0
- solace_agent_mesh/services/llm_service/components/llm_request_component.py +19 -0
- solace_agent_mesh/templates/gateway-config-template.yaml +2 -1
- solace_agent_mesh/templates/gateway-default-config.yaml +3 -3
- solace_agent_mesh/templates/plugin-gateway-default-config.yaml +29 -0
- solace_agent_mesh/templates/rest-api-default-config.yaml +2 -1
- solace_agent_mesh/templates/slack-default-config.yaml +1 -1
- solace_agent_mesh/templates/solace-agent-mesh-default.yaml +9 -0
- solace_agent_mesh/templates/web-default-config.yaml +2 -1
- solace_agent_mesh-0.2.1.dist-info/METADATA +172 -0
- {solace_agent_mesh-0.1.3.dist-info → solace_agent_mesh-0.2.1.dist-info}/RECORD +71 -52
- solace_agent_mesh/common/prompt_templates_unused_delete.py +0 -161
- solace_agent_mesh-0.1.3.dist-info/METADATA +0 -208
- {solace_agent_mesh-0.1.3.dist-info → solace_agent_mesh-0.2.1.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-0.1.3.dist-info → solace_agent_mesh-0.2.1.dist-info}/entry_points.txt +0 -0
- {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))}}
|
|
Binary file
|
|
@@ -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&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>
|
|
@@ -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,
|
|
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,
|
|
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,
|
|
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
|
|
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[
|
|
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[
|
|
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
|
-
|
|
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(
|
|
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")(
|
|
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
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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")(
|
|
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, {})
|