@blueking/ai-ui-sdk 0.0.1-beta.9 → 0.0.2-beta.1
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.
- package/dist/hooks/use-chat.d.ts +5 -4
- package/dist/main.js +11 -5
- package/dist/types/type.d.ts +2 -2
- package/package.json +1 -1
package/dist/hooks/use-chat.d.ts
CHANGED
@@ -6,8 +6,8 @@ type SessionContentsMap = {
|
|
6
6
|
type SessionLoadingMap = {
|
7
7
|
[key: string]: boolean;
|
8
8
|
};
|
9
|
-
export declare const useChat: ({ handleStart, handleText, handleReferenceDoc, handleThink, handleEnd, handleError, }?: ChatCallbacks) => {
|
10
|
-
currentSession: import("vue").Ref<
|
9
|
+
export declare const useChat: <T extends ISession = ISession>({ handleStart, handleText, handleReferenceDoc, handleThink, handleEnd, handleError, }?: ChatCallbacks) => {
|
10
|
+
currentSession: import("vue").Ref<T | undefined, T | undefined>;
|
11
11
|
sessionContents: import("vue").Ref<{
|
12
12
|
id?: number | undefined;
|
13
13
|
createdAt?: string | undefined;
|
@@ -47,9 +47,10 @@ export declare const useChat: ({ handleStart, handleText, handleReferenceDoc, ha
|
|
47
47
|
stopChat: (sessionCode: string) => void;
|
48
48
|
plusSessionContent: (sessionCode: string, sessionContent: ISessionContent) => void;
|
49
49
|
updateSessionContent: (sessionContent: ISessionContent) => void;
|
50
|
-
|
50
|
+
getSessionContentById: (id: number, sessionCode: string) => ISessionContent | undefined;
|
51
|
+
getLastSessionContentBySessionCode: (sessionCode: string) => ISessionContent;
|
51
52
|
getSessionContentsBySessionCode: (sessionCode: string) => ISessionContent[];
|
52
|
-
setCurrentSession: (session?:
|
53
|
+
setCurrentSession: (session?: T) => void;
|
53
54
|
setSessionContents: (data: ISessionContent[]) => void;
|
54
55
|
deleteSessionContent: (sessionCode: string, contentId: number) => number[];
|
55
56
|
deleteSessionContents: (sessionCode: string, contentIds: number[]) => number[];
|
package/dist/main.js
CHANGED
@@ -50,13 +50,16 @@ url(${E}) format("embedded-opentype");
|
|
50
50
|
找到 ${A.length} 篇资料参考
|
51
51
|
<i class="ai-ui-sdk-icon icon-angle-up"></i>
|
52
52
|
</section>
|
53
|
-
<ul class="knowledge-body">`;return A.forEach(A=>{let{
|
53
|
+
<ul class="knowledge-body">`;return A.forEach(A=>{let{path:t,file_path:n,preview_path:o}=A.metadata,i=n.split("/").pop();e+=`<li
|
54
54
|
class="knowledge-item"
|
55
|
-
title="${
|
55
|
+
title="${i} (${o})"
|
56
56
|
>
|
57
57
|
<i class="ai-ui-sdk-icon icon-zhishiku"></i>
|
58
|
-
<a href="${
|
59
|
-
${
|
58
|
+
<a href="${o}" target="_blank" class="knowledge-link g-flex-truncate">
|
59
|
+
${i}
|
60
|
+
</a>
|
61
|
+
<a href="${t}" title="预览知识" target="_blank" class="knowledge-link g-flex-truncate">
|
62
|
+
<i class="ai-ui-sdk-icon ai-ui-sdk-yanjing-kejian"></i>
|
60
63
|
</a>
|
61
64
|
</li>`}),e+="</ul>"},g=A=>A.replace(/<section class="knowledge-head click-close">[\s\S]*?<\/section>/,"").replace(/<ul class="knowledge-body">[\s\S]*?<\/ul>/,"").replace(/<section class="knowledge-tips">[\s\S]*?<\/section>/,""),h=()=>{let A=null,e=()=>{let e=`.knowledge-tips {
|
62
65
|
position: relative;
|
@@ -165,6 +168,9 @@ url(${E}) format("embedded-opentype");
|
|
165
168
|
line-height: 28px;
|
166
169
|
a {
|
167
170
|
margin-right: 20px;
|
171
|
+
a:has(i) {
|
172
|
+
text-decoration: none;
|
173
|
+
}
|
168
174
|
}
|
169
175
|
.icon-zhishiku {
|
170
176
|
color: #D66F6B;
|
@@ -229,6 +235,6 @@ url(${E}) format("embedded-opentype");
|
|
229
235
|
&~ .knowledge-head {
|
230
236
|
margin-bottom: 8px;
|
231
237
|
}
|
232
|
-
}`;(A=document.createElement("style")).textContent=e,document.head.appendChild(A)},t=()=>{A&&(A.remove(),A=null)};(0,a.onBeforeMount)(()=>{e()}),(0,a.onBeforeUnmount)(()=>{t()})};function v(A,e,t,n,o,i,l){try{var s=A[i](l),a=s.value}catch(A){t(A);return}s.done?e(a):Promise.resolve(a).then(n,o)}function Q(A){return function(){var e=this,t=arguments;return new Promise(function(n,o){var i=A.apply(e,t);function l(A){v(i,n,o,l,s,"next",A)}function s(A){v(i,n,o,l,s,"throw",A)}l(void 0)})}}function w(A,e,t){return e in A?Object.defineProperty(A,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):A[e]=t,A}class b{stream({sessionCode:A,url:e,headers:t,data:n}){var o=this;return Q(function*(){var i,l;yield null===(i=o.handleStart)||void 0===i?void 0:i.call(o,A);let s=new AbortController;o.controllerMap[A]=s,fetch(e,{method:"post",signal:s.signal,headers:function(A){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{},n=Object.keys(t);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(A){return Object.getOwnPropertyDescriptor(t,A).enumerable}))),n.forEach(function(e){w(A,e,t[e])})}return A}({"Content-Type":"application/json"},t),mode:"cors",credentials:"include",body:JSON.stringify(n)}).then((l=Q(function*(e){let t=e.body.pipeThrough(new window.TextDecoderStream).getReader(),n="";for(;;)try{let{value:i,done:l}=yield t.read();if(!e.ok){o.handleError(A,i||e.statusText,e.status);break}if(l){o.handleEnd(A);break}(n+i.toString()).split("\n").forEach(t=>{let i=t.replace("data:","").trim();if(c(i)){var l,s;let{event:t,content:a,cover:r,documents:c,result:d,code:u,elapsed_time:B,message:g}=JSON.parse(i);if(!1===d||200!==e.status){o.handleError(A,g||"模型调用失败",u);return}switch(t){case"text":o.handleText(A,a,r);break;case"reference_doc":null===(l=o.handleReferenceDoc)||void 0===l||l.call(o,A,c,r);break;case"think":null===(s=o.handleThink)||void 0===s||s.call(o,A,a,r,B);break;case"done":o.handleEnd(A,r?a:"");break;case"error":o.handleError(A,g||"模型调用失败",u)}n=""}else i&&(n=i)})}catch(e){(null==e?void 0:e.code)!==20&&o.handleError(A,`模型调用失败:${e.message}`,e.code);break}}),function(A){return l.apply(this,arguments)}))})()}stop(A){var e,t;return null===(t=this.controllerMap[A])||void 0===t||null===(e=t.abort)||void 0===e||e.call(t),this.handleEnd(A)}constructor({handleStart:A,handleText:e,handleReferenceDoc:t,handleThink:n,handleEnd:o,handleError:i}){w(this,"handleStart",void 0),w(this,"handleText",void 0),w(this,"handleReferenceDoc",void 0),w(this,"handleThink",void 0),w(this,"handleEnd",void 0),w(this,"handleError",void 0),w(this,"controllerMap",void 0),this.handleStart=A,this.handleText=e,this.handleReferenceDoc=t,this.handleThink=n,this.handleEnd=o,this.handleError=i,this.controllerMap={}}}let C=({handleStart:A,handleText:o,handleReferenceDoc:i,handleThink:l,handleEnd:r,handleError:c}={})=>{let d="内容正在生成中...",u=(0,a.ref)(),h=(0,a.ref)({}),f=(0,a.ref)([]),v={},Q=(0,a.computed)(()=>{let A=[];for(let n=f.value.length-1;n>=0;n--){let o=f.value[n],i=n+1,l=f.value[i];for(;l&&![t.Ai,t.TokenExpired,t.ImageNotSupported,t.Pause,t.Guide].includes(l.role);)i+=1,l=f.value[i];if(o.role===t.System)break;o.status===e.Fail||(null==l?void 0:l.status)===e.Fail&&[t.User,t.UserImage].includes(o.role)||[t.Time,t.System].includes(o.role)||A.unshift(o)}return A}),w=(0,a.computed)(()=>{var A,e,n;let o=[],i=[],l=[],a=f.value.findLastIndex(A=>A.role===t.System&&["已启用角色","已启用模型"].some(e=>A.content.includes(e))),r=0;null===(n=u.value)||void 0===n||null===(e=n.roleInfo)||void 0===e||null===(A=e.content)||void 0===A||A.forEach(A=>{let e=f.value[a+1+r],n=f.value[a+2+r];if((null==e?void 0:e.content)===A.content&&e.role!==t.System&&(o.push(s(e)),r+=1,(null==e?void 0:e.role)===t.Pause)){for(;n&&n.role===t.System;)r+=1,n=f.value[a+1+r];for(;n&&[t.User,t.UserImage].includes(n.role);)o.push(s(n)),r+=1,n=f.value[a+1+r]}}),i.push(...Q.value.map(s));let c=A=>{let e=!0;for(let n=A;n<o.length;n++){var t;o[n].content!==(null===(t=i[n-A])||void 0===t?void 0:t.content)&&(e=!1)}return e};for(let A=0;A<o.length;A++){let e=o[A];if(c(A))break;l.push(e)}return l.push(...i),l.forEach(A=>{A.content=E(A.content),A.content=g(A.content)}),l}),C=new b({handleStart:x,handleText:function(A,t,n){let i=k(A);if(i.content===d)i.content=t;else{if(i.status!==e.Loading)return;i.content=n?t:i.content+t}return null==o?void 0:o(A,i)},handleReferenceDoc:function(A,e,t){let n=k(A),o=B(e);return n.content=t?o:n.content+o,null==i?void 0:i(A,n)},handleThink:function(A,e,t,n){let o=k(A);return o.content=p(o.content,e,t,n),null==l?void 0:l(A,o)},handleEnd:function(A,t){let n=k(A);if(n.status===e.Loading)return h.value[A]=!1,t&&(n.content=t),n.status=e.Success,null==r?void 0:r(A,n);(n.content===d||m(n.content))&&Y(A,"聊天内容已中断")},handleError:Y});function k(A){var e,t;return(null===(e=u.value)||void 0===e?void 0:e.sessionCode)===A?f.value.at(-1):null===(t=v[A])||void 0===t?void 0:t.at(-1)}function y(A){var e;return(null===(e=u.value)||void 0===e?void 0:e.sessionCode)===A?f.value:v[A]}function I(A,e){y(A).push(e)}function G(A,e,n){var o;let i=(null===(o=u.value)||void 0===o?void 0:o.sessionCode)===A?f.value:v[A],l=[];return e.forEach(A=>{let e=i.findIndex(e=>e.id===A);if(e>-1){let o=i[e-1],s=i[e+1],a=i[e+2];if(i.splice(e,1),l.push(A),[t.Hidden].includes(null==o?void 0:o.role)){let A=i.findIndex(A=>A.id===o.id);i.splice(A,1),l.push(o.id)}if((null==s?void 0:s.role)===t.Ai||n&&[t.Ai,t.Guide,t.TokenExpired,t.ImageNotSupported,t.Pause].includes(null==s?void 0:s.role)){let A=i.findIndex(A=>A.id===s.id);i.splice(A,1),l.push(s.id)}if([t.Guide].includes(null==a?void 0:a.role)&&n){let A=i.findIndex(A=>A.id===a.id);i.splice(A,1),l.push(a.id)}}}),l}function x(n){h.value[n]=!0;let o={sessionCode:n,role:t.Ai,status:e.Loading,content:d};return I(n,o),null==A?void 0:A(n,o)}function Y(A,o,i){let l=k(A);return l.status=e.Fail,l.content=o,h.value[A]=!1,i===n.TokenExpired&&(l.content="抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))",l.role=t.TokenExpired),i===n.ImageNotSupported&&(l.content="抱歉,当前模型不支持图片内容解析",l.role=t.ImageNotSupported),null==c?void 0:c(A,l,i)}return{currentSession:u,sessionContents:f,sessionContentsMap:v,sessionLoadingMap:h,prompts:w,chat:function({sessionCode:A,data:e,url:t,headers:n}){C.stream({sessionCode:A,url:t,data:e,headers:n})},stopChat:function(A){C.stop(A)},plusSessionContent:I,updateSessionContent:function(A){var e;let t=((null===(e=u.value)||void 0===e?void 0:e.sessionCode)===A.sessionCode?f.value:v[A.sessionCode]).find(e=>+(e.id||0)==+(A.id||0));t&&Object.assign(t,A)},
|
238
|
+
}`;(A=document.createElement("style")).textContent=e,document.head.appendChild(A)},t=()=>{A&&(A.remove(),A=null)};(0,a.onBeforeMount)(()=>{e()}),(0,a.onBeforeUnmount)(()=>{t()})};function v(A,e,t,n,o,i,l){try{var s=A[i](l),a=s.value}catch(A){t(A);return}s.done?e(a):Promise.resolve(a).then(n,o)}function Q(A){return function(){var e=this,t=arguments;return new Promise(function(n,o){var i=A.apply(e,t);function l(A){v(i,n,o,l,s,"next",A)}function s(A){v(i,n,o,l,s,"throw",A)}l(void 0)})}}function w(A,e,t){return e in A?Object.defineProperty(A,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):A[e]=t,A}class b{stream({sessionCode:A,url:e,headers:t,data:n}){var o=this;return Q(function*(){var i,l;yield null===(i=o.handleStart)||void 0===i?void 0:i.call(o,A);let s=new AbortController;o.controllerMap[A]=s,fetch(e,{method:"post",signal:s.signal,headers:function(A){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{},n=Object.keys(t);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(A){return Object.getOwnPropertyDescriptor(t,A).enumerable}))),n.forEach(function(e){w(A,e,t[e])})}return A}({"Content-Type":"application/json"},t),mode:"cors",credentials:"include",body:JSON.stringify(n)}).then((l=Q(function*(e){let t=e.body.pipeThrough(new window.TextDecoderStream).getReader(),n="";for(;;)try{let{value:i,done:l}=yield t.read();if(!e.ok){o.handleError(A,i||e.statusText,e.status);break}if(l){o.handleEnd(A);break}(n+i.toString()).split("\n").forEach(t=>{let i=t.replace("data:","").trim();if(c(i)){var l,s;let{event:t,content:a,cover:r,documents:c,result:d,code:u,elapsed_time:B,message:g}=JSON.parse(i);if(!1===d||200!==e.status){o.handleError(A,g||"模型调用失败",u);return}switch(t){case"text":o.handleText(A,a,r);break;case"reference_doc":null===(l=o.handleReferenceDoc)||void 0===l||l.call(o,A,c,r);break;case"think":null===(s=o.handleThink)||void 0===s||s.call(o,A,a,r,B);break;case"done":o.handleEnd(A,r?a:"");break;case"error":o.handleError(A,g||"模型调用失败",u)}n=""}else i&&(n=i)})}catch(e){(null==e?void 0:e.code)!==20&&o.handleError(A,`模型调用失败:${e.message}`,e.code);break}}),function(A){return l.apply(this,arguments)}))})()}stop(A){var e,t;return null===(t=this.controllerMap[A])||void 0===t||null===(e=t.abort)||void 0===e||e.call(t),this.handleEnd(A)}constructor({handleStart:A,handleText:e,handleReferenceDoc:t,handleThink:n,handleEnd:o,handleError:i}){w(this,"handleStart",void 0),w(this,"handleText",void 0),w(this,"handleReferenceDoc",void 0),w(this,"handleThink",void 0),w(this,"handleEnd",void 0),w(this,"handleError",void 0),w(this,"controllerMap",void 0),this.handleStart=A,this.handleText=e,this.handleReferenceDoc=t,this.handleThink=n,this.handleEnd=o,this.handleError=i,this.controllerMap={}}}let C=({handleStart:A,handleText:o,handleReferenceDoc:i,handleThink:l,handleEnd:r,handleError:c}={})=>{let d="内容正在生成中...",u=(0,a.ref)(),h=(0,a.ref)({}),f=(0,a.ref)([]),v={},Q=(0,a.computed)(()=>{let A=[];for(let n=f.value.length-1;n>=0;n--){let o=f.value[n],i=n+1,l=f.value[i];for(;l&&![t.Ai,t.TokenExpired,t.ImageNotSupported,t.Pause,t.Guide].includes(l.role);)i+=1,l=f.value[i];if(o.role===t.System)break;o.status===e.Fail||(null==l?void 0:l.status)===e.Fail&&[t.User,t.UserImage].includes(o.role)||[t.Time,t.System].includes(o.role)||A.unshift(o)}return A}),w=(0,a.computed)(()=>{var A,e,n;let o=[],i=[],l=[],a=f.value.findLastIndex(A=>A.role===t.System&&["已启用角色","已启用模型"].some(e=>A.content.includes(e))),r=0;null===(n=u.value)||void 0===n||null===(e=n.roleInfo)||void 0===e||null===(A=e.content)||void 0===A||A.forEach(A=>{let e=f.value[a+1+r],n=f.value[a+2+r];if((null==e?void 0:e.content)===A.content&&e.role!==t.System&&(o.push(s(e)),r+=1,(null==e?void 0:e.role)===t.Pause)){for(;n&&n.role===t.System;)r+=1,n=f.value[a+1+r];for(;n&&[t.User,t.UserImage].includes(n.role);)o.push(s(n)),r+=1,n=f.value[a+1+r]}}),i.push(...Q.value.map(s));let c=A=>{let e=!0;for(let n=A;n<o.length;n++){var t;o[n].content!==(null===(t=i[n-A])||void 0===t?void 0:t.content)&&(e=!1)}return e};for(let A=0;A<o.length;A++){let e=o[A];if(c(A))break;l.push(e)}return l.push(...i),l.forEach(A=>{A.content=E(A.content),A.content=g(A.content)}),l}),C=new b({handleStart:x,handleText:function(A,t,n){let i=k(A);if(i.content===d)i.content=t;else{if(i.status!==e.Loading)return;i.content=n?t:i.content+t}return null==o?void 0:o(A,i)},handleReferenceDoc:function(A,e,t){let n=k(A),o=B(e);return n.content=t?o:n.content+o,null==i?void 0:i(A,n)},handleThink:function(A,e,t,n){let o=k(A);return o.content=p(o.content,e,t,n),null==l?void 0:l(A,o)},handleEnd:function(A,t){let n=k(A);if(n.status===e.Loading)return h.value[A]=!1,t&&(n.content=t),n.status=e.Success,null==r?void 0:r(A,n);(n.content===d||m(n.content))&&Y(A,"聊天内容已中断")},handleError:Y});function k(A){var e,t;return(null===(e=u.value)||void 0===e?void 0:e.sessionCode)===A?f.value.at(-1):null===(t=v[A])||void 0===t?void 0:t.at(-1)}function y(A){var e;return(null===(e=u.value)||void 0===e?void 0:e.sessionCode)===A?f.value:v[A]}function I(A,e){y(A).push(e)}function G(A,e,n){var o;let i=(null===(o=u.value)||void 0===o?void 0:o.sessionCode)===A?f.value:v[A],l=[];return e.forEach(A=>{let e=i.findIndex(e=>e.id===A);if(e>-1){let o=i[e-1],s=i[e+1],a=i[e+2];if(i.splice(e,1),l.push(A),[t.Hidden].includes(null==o?void 0:o.role)){let A=i.findIndex(A=>A.id===o.id);i.splice(A,1),l.push(o.id)}if((null==s?void 0:s.role)===t.Ai||n&&[t.Ai,t.Guide,t.TokenExpired,t.ImageNotSupported,t.Pause].includes(null==s?void 0:s.role)){let A=i.findIndex(A=>A.id===s.id);i.splice(A,1),l.push(s.id)}if([t.Guide].includes(null==a?void 0:a.role)&&n){let A=i.findIndex(A=>A.id===a.id);i.splice(A,1),l.push(a.id)}}}),l}function x(n){h.value[n]=!0;let o={sessionCode:n,role:t.Ai,status:e.Loading,content:d};return I(n,o),null==A?void 0:A(n,o)}function Y(A,o,i){let l=k(A);return l.status=e.Fail,l.content=o,h.value[A]=!1,i===n.TokenExpired&&(l.content="抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))",l.role=t.TokenExpired),i===n.ImageNotSupported&&(l.content="抱歉,当前模型不支持图片内容解析",l.role=t.ImageNotSupported),null==c?void 0:c(A,l,i)}return{currentSession:u,sessionContents:f,sessionContentsMap:v,sessionLoadingMap:h,prompts:w,chat:function({sessionCode:A,data:e,url:t,headers:n}){C.stream({sessionCode:A,url:t,data:e,headers:n})},stopChat:function(A){C.stop(A)},plusSessionContent:I,updateSessionContent:function(A){var e;let t=((null===(e=u.value)||void 0===e?void 0:e.sessionCode)===A.sessionCode?f.value:v[A.sessionCode]).find(e=>+(e.id||0)==+(A.id||0));t&&Object.assign(t,A)},getSessionContentById:function(A,e){return y(e).find(e=>e.id===A)},getLastSessionContentBySessionCode:k,getSessionContentsBySessionCode:y,setCurrentSession:function(A){u.value=A,(null==A?void 0:A.sessionCode)&&(v[A.sessionCode]||(v[A.sessionCode]=[]),f.value=v[A.sessionCode])},setSessionContents:function(A){u.value&&(v[u.value.sessionCode]=A,f.value=A)},deleteSessionContent:function(A,e){return G(A,[e],!0)},deleteSessionContents:function(A,e){return G(A,e,!1)},handleStartChat:x,handleErrorChat:Y}},k=({handleStart:e,handleEnd:t,handleError:n}={})=>{let o="",i=new b({handleStart:()=>(o="",null==e?void 0:e()),handleText:(A,e,t)=>{t||"正在思考..."===o?o=e:o+=e},handleEnd:()=>("无话可说"===o&&(o=""),null==t?void 0:t(o)),handleError:(A,e,t)=>null==n?void 0:n(e,t)});return{summary:({content:e,url:t,headers:n,model:o})=>{let l=E(g(e)),s=[{role:A.User,content:`你是一个总结大师,请帮助我对下面这段话进行总结。要求总结精炼,不超过 15 个字!且末尾没有标点符号!请注意:如果你无法总结,请回复“无话可说”!
|
233
239
|
文字如下:
|
234
240
|
${l}`}];i.stream({sessionCode:"summary",url:t,data:{prompts:s,model:o},headers:n})}}},y=()=>{o(86),o(84),h(),f()},I=l.default;if("undefined"!=typeof window){let{currentScript:A}=window.document,e=A&&A.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);e&&(o.p=e[1])}})(),i})());
|
package/dist/types/type.d.ts
CHANGED
@@ -6,7 +6,7 @@ export type Document = {
|
|
6
6
|
preview_path: string;
|
7
7
|
};
|
8
8
|
};
|
9
|
-
export interface ISession<IVariable =
|
9
|
+
export interface ISession<IVariable = object, ISessionProperty = object, ITool = object, IAnchorPathResources = object> {
|
10
10
|
sessionCode: string;
|
11
11
|
sessionName: string;
|
12
12
|
model: string;
|
@@ -17,7 +17,7 @@ export interface ISession<IVariable = null, ISessionProperty = null, ITools = nu
|
|
17
17
|
variables: IVariable[];
|
18
18
|
};
|
19
19
|
sessionProperty?: ISessionProperty;
|
20
|
-
tools?:
|
20
|
+
tools?: ITool[];
|
21
21
|
anchorPathResources?: IAnchorPathResources;
|
22
22
|
}
|
23
23
|
export interface ISessionContent {
|