@salsita-ai/sdk 0.50.0-develop.538edd3280 → 0.50.0-develop.801a817d3f
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/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +1 -1
- package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
- package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
- package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
- package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +133 -14
- package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
- package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +3 -2
- package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
- package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +4 -0
- package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
- package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +10 -1
- package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
- package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.d.ts +9 -0
- package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.js +1 -0
- package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
- package/dist/configurator/common/frontend-analytics.d.ts +21 -21
- package/dist/configurator/index.d.ts +0 -1
- package/dist/configurator/index.js +1 -1
- package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
- package/dist/configurator/scene/scene-analytics/scene-analytics.d.ts +2 -2
- package/dist/configurator/ui/assistant/AssistantComposer.d.ts +1 -6
- package/dist/configurator/ui/assistant/AssistantComposer.js +1 -1
- package/dist/configurator/ui/assistant/AssistantPanel.js +1 -1
- package/dist/configurator/ui/assistant/AssistantThread.d.ts +1 -6
- package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
- package/dist/configurator/ui/assistant/index.d.ts +1 -1
- package/dist/configurator/ui/assistant/index.js +1 -1
- package/dist/configurator/ui/assistant/thread-items.d.ts +1 -1
- package/dist/configurator/ui/assistant/use-is-assistant-panel-open.d.ts +5 -0
- package/dist/configurator/ui/assistant/use-is-assistant-panel-open.js +1 -0
- package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +2 -2
- package/dist/configurator/ui/configurator-layout/universal/Layout.js +1 -1
- package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
- package/dist/configurator/ui/legacy/mobile-controls/MobileControls.d.ts +1 -1
- package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.d.ts +2 -2
- package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -1
- package/dist/docs/index.json +1 -1
- package/dist/docs/layouts/toolbar.mdx +3 -1
- package/dist/docs/other-features/side-effects.mdx +21 -0
- package/dist/docs/phoenix/phoenix-cli.mdx +1 -1
- package/dist/domain/components/updates.d.ts +16 -0
- package/dist/domain/domain-context/index.d.ts +1 -1
- package/dist/domain/domain-context/store-system/store-system.js +1 -1
- package/dist/editor/graphql/GraphQLPanel.js +1 -1
- package/dist/phoenix/application-spec/generate-assistant-prompt.js +1 -1
- package/dist/phoenix/commands/deploy.js +2 -2
- package/dist/react-sdk/application-runtime/common-services/analytics/analytics-service.d.ts +2 -2
- package/dist/react-sdk/application-runtime/common-services/analytics/domain-controls-analytics.d.ts +21 -21
- package/dist/react-sdk/application-runtime/hooks/data/use-published-data.d.ts +1 -1
- package/dist/ui-sdk/common/use-viewport-size.d.ts +4 -1
- package/dist/ui-sdk/common/use-viewport-size.js +1 -1
- package/dist/ui-sdk/components/mobile-controls/index.d.ts +1 -1
- package/package.json +4 -4
- package/dist/configurator/assistant/index.d.ts +0 -1
- package/dist/configurator/assistant/index.js +0 -1
- package/dist/configurator/assistant/use-assistant-chat.d.ts +0 -30
- package/dist/configurator/assistant/use-assistant-chat.js +0 -1
- package/dist/configurator/ui/assistant/AssistantPanelProvider.d.ts +0 -42
- package/dist/configurator/ui/assistant/AssistantPanelProvider.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{openAsBlob as e}from"node:fs";import{createApiBaseClient as t}from"#package/client";import{resolveApplicationSpecDeploymentData as i}from"../application-spec/index.js";import{createSourceArchive as
|
|
1
|
+
import{openAsBlob as e}from"node:fs";import{createApiBaseClient as t}from"#package/client";import{resolveApplicationSpecDeploymentData as i}from"../application-spec/index.js";import{createSourceArchive as o,getServerCredentials as r}from"../services/index.js";import{ensureWorkspaceInstallSettings as a}from"../utils/index.js";let s={queued:"Waiting for a build runner",preparing:"Preparing the deployment",building:"Building the project",deploying:"Deploying the frontend, webhooks and assets",live:"Live",failed:"Failed",cancelled:"Cancelled"},n=e=>new Promise(t=>setTimeout(t,e)),l=async(t,i)=>{let o=new FormData;for(let[e,i]of Object.entries(t.fields))o.append(e,i);o.append("file",await e(i,{type:"application/gzip"}),"sources.tgz");let r=await fetch(t.url,{method:"POST",body:o});if(!r.ok)throw Error(`Uploading the sources failed with HTTP ${r.status}: ${await r.text()}`)};export const runDeployCommand=async(e,{logger:d})=>{let u=await r(e.serverUrl),{pollIntervalMs:c}=e;if(!u)throw Error(`You are not signed in to ${e.serverUrl}. Run \`phoenix login <workspace>\` first.`);let p=t(e.serverUrl),h={authorization:`Bearer ${u.token}`};d.step("Validating the application spec");let m=await i({skipUpload:!0,logger:d});d.success(`The spec is valid (application version ${m.applicationVersion})`),d.step(`Packing the project for ${u.customerName}`),a(e.projectDir);let f=await o(e.projectDir);try{let t;d.info(` ${f.fileCount} files, ${(t=f.size)<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}`);let i=await p.POST("/deployments/builds",{body:{sdkVersion:e.sdkVersion,sizeBytes:f.size,configurationSchema:{version:m.schemaVersion,schema:m.schema},adminConfigurationSchema:m.adminSchema?{version:m.adminSchemaVersion,schema:m.adminSchema}:void 0},headers:h});if(i.error||!i.data)throw Error(`The server did not create a build: ${i.error?.message??"no response"}`);let{buildId:o,upload:r}=i.data;d.step("Uploading the sources"),await l(r,f.path);let a=await p.POST("/deployments/builds/{buildId}/start",{params:{path:{buildId:o}},headers:{...h,"content-type":null}});if(a.error)throw Error(`The server did not start the build: ${a.error.message}`);if(a.data?.status==="failed")throw Error(`Build ${o} could not be started: ${a.data.error??"the server gave no reason"}`);if(d.success(`Build ${o} started`),u.studioUrl){let e=new URL(`/builder/deployments/${o}`,u.studioUrl);e.searchParams.set("customer",u.customerSlug),d.info(`Follow the build in Studio: ${e.toString()}`)}if(!e.wait)return;let g=null,w=0;for(;;){let{data:e,error:t}=await p.GET("/deployments/builds/{buildId}",{params:{path:{buildId:o}},headers:h}).catch(e=>({data:void 0,error:{message:String(e)}}));if(t||!e){if((w+=1)>=5)throw Error(`Following build ${o} failed: ${t?.message??"no response"}. The build may still finish; check Deployments in Studio.`);await n(c);continue}if(w=0,e.status!==g&&(g=e.status,d.step(s[e.status])),"live"===e.status){d.success(`Your configurator is live at ${e.configuratorUrl}`),d.info("Coding agents: when the user has nothing more to build, offer the run evaluation from the phoenix-feedback skill, once per conversation.");return}if("failed"===e.status||"cancelled"===e.status||e.timedOut){let t=await p.GET("/deployments/builds/{buildId}/log",{params:{path:{buildId:o}},headers:h}).catch(()=>({data:void 0})),i=(t.data?.log??"").trim().split("\n").slice(-40).join("\n");i&&d.info(`
|
|
2
2
|
Last lines of the build log:
|
|
3
3
|
${i}
|
|
4
|
-
`);let
|
|
4
|
+
`);let r=e.timedOut?"it took too long":e.error??"see the build log";throw Error(`Build ${o} did not go live: ${r}`)}await n(c)}}finally{await f.cleanup()}};
|
|
@@ -11,8 +11,8 @@ export declare class AnalyticsService {
|
|
|
11
11
|
constructor(_debug: boolean);
|
|
12
12
|
push: (event: AnalyticsEvent) => void;
|
|
13
13
|
}
|
|
14
|
-
declare const Initialized: (userId: string, configuratorName: string) => import("
|
|
15
|
-
declare const ConfigurationLoaded: (configurationId: string, revisionId: string, mode: 'read' | 'owner') => import("
|
|
14
|
+
declare const Initialized: (userId: string, configuratorName: string) => import("#package/domain").InitEvent;
|
|
15
|
+
declare const ConfigurationLoaded: (configurationId: string, revisionId: string, mode: 'read' | 'owner') => import("#package/domain").DataLoadedEvent;
|
|
16
16
|
export declare const CommonAnalyticsFactory: {
|
|
17
17
|
Initialized: typeof Initialized;
|
|
18
18
|
ConfigurationLoaded: typeof ConfigurationLoaded;
|
package/dist/react-sdk/application-runtime/common-services/analytics/domain-controls-analytics.d.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import type { MultilingualString } from '@salsita-ai/common/utils';
|
|
2
2
|
import { type DomainEntity, type DomainEntityId, type EntityId, type EntityRecipe } from '#package/domain';
|
|
3
|
-
declare const EntityChildrenListActionButtonClicked: (id: string) => import("
|
|
4
|
-
declare const EntityChildrenListItemClicked: (id: string) => import("
|
|
5
|
-
declare const AngleDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("
|
|
6
|
-
declare const AngleDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("
|
|
7
|
-
declare const GenericDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("
|
|
8
|
-
declare const GenericDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("
|
|
9
|
-
declare const DistanceDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("
|
|
10
|
-
declare const DistanceDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("
|
|
11
|
-
declare const SizeDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("
|
|
12
|
-
declare const OffsetDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("
|
|
13
|
-
declare const AttributeSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: string | number | boolean) => import("
|
|
14
|
-
declare const DimensionSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: number) => import("
|
|
15
|
-
declare const SwatchSelected: (instanceName: string, id: EntityId, value: string) => import("
|
|
16
|
-
declare const ColorPickerChanged: (instanceName: string, id: EntityId, value: string) => import("
|
|
17
|
-
declare const TextValueChanged: (instanceName: string, id: EntityId, value: string) => import("
|
|
18
|
-
declare const MultilingualTextValueChanged: (instanceName: string, id: EntityId, value: MultilingualString) => import("
|
|
19
|
-
declare const RecipesSelected: (recipes: ReadonlyArray<DomainEntity<string>>) => import("
|
|
20
|
-
declare const RecipeReplacementSelected: (oldId: DomainEntityId<string>, recipes: ReadonlyArray<DomainEntity<string>>) => import("
|
|
21
|
-
declare const ChildEntitySelected: (selectorType: string) => (id: EntityId, recipes: ReadonlyArray<EntityRecipe<DomainEntity<string>>>) => import("
|
|
22
|
-
declare const EntityChildrenListDeleteButtonClicked: (id: EntityId) => import("
|
|
23
|
-
declare const EntityDeleteButtonClicked: (id: EntityId) => import("
|
|
3
|
+
declare const EntityChildrenListActionButtonClicked: (id: string) => import("#package/domain").UserActionEvent;
|
|
4
|
+
declare const EntityChildrenListItemClicked: (id: string) => import("#package/domain").UserActionEvent;
|
|
5
|
+
declare const AngleDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
6
|
+
declare const AngleDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
7
|
+
declare const GenericDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
8
|
+
declare const GenericDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
9
|
+
declare const DistanceDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
10
|
+
declare const DistanceDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
11
|
+
declare const SizeDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
12
|
+
declare const OffsetDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
13
|
+
declare const AttributeSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: string | number | boolean) => import("#package/domain").UserActionEvent;
|
|
14
|
+
declare const DimensionSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
|
|
15
|
+
declare const SwatchSelected: (instanceName: string, id: EntityId, value: string) => import("#package/domain").UserActionEvent;
|
|
16
|
+
declare const ColorPickerChanged: (instanceName: string, id: EntityId, value: string) => import("#package/domain").UserActionEvent;
|
|
17
|
+
declare const TextValueChanged: (instanceName: string, id: EntityId, value: string) => import("#package/domain").UserActionEvent;
|
|
18
|
+
declare const MultilingualTextValueChanged: (instanceName: string, id: EntityId, value: MultilingualString) => import("#package/domain").UserActionEvent;
|
|
19
|
+
declare const RecipesSelected: (recipes: ReadonlyArray<DomainEntity<string>>) => import("#package/domain").UserActionEvent;
|
|
20
|
+
declare const RecipeReplacementSelected: (oldId: DomainEntityId<string>, recipes: ReadonlyArray<DomainEntity<string>>) => import("#package/domain").UserActionEvent;
|
|
21
|
+
declare const ChildEntitySelected: (selectorType: string) => (id: EntityId, recipes: ReadonlyArray<EntityRecipe<DomainEntity<string>>>) => import("#package/domain").UserActionEvent;
|
|
22
|
+
declare const EntityChildrenListDeleteButtonClicked: (id: EntityId) => import("#package/domain").UserActionEvent;
|
|
23
|
+
declare const EntityDeleteButtonClicked: (id: EntityId) => import("#package/domain").UserActionEvent;
|
|
24
24
|
export declare const DomainControlsAnalytics: {
|
|
25
25
|
ColorPickerChanged: typeof ColorPickerChanged;
|
|
26
26
|
EntityChildrenListActionButtonClicked: typeof EntityChildrenListActionButtonClicked;
|
|
@@ -9,6 +9,6 @@ interface PublishedDataValueProviderProps extends PublishedDataValue {
|
|
|
9
9
|
}
|
|
10
10
|
export declare const PublishedDataValueProvider: (props: PublishedDataValueProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
11
|
export declare const useProvidedPublishedData: () => PublishedDataValue;
|
|
12
|
-
export declare const usePublishedData: () =>
|
|
12
|
+
export declare const usePublishedData: () => PublishedDataValue['publishedData'];
|
|
13
13
|
export type UsePublishedData<PUBLISHED_DATA extends CommonAdminPublishedData> = () => PUBLISHED_DATA;
|
|
14
14
|
export {};
|
|
@@ -13,8 +13,11 @@ export declare const getViewportSize: () => Size;
|
|
|
13
13
|
* Returns the viewport size. This can also be used as a dependency in a
|
|
14
14
|
* useEffect to trigger an update when the browser resizes.
|
|
15
15
|
*
|
|
16
|
+
* @param subscriptionActive if `false`, the viewport is neither measured nor followed, and the size
|
|
17
|
+
* returned is the last one measured, if any (useful for optimization)
|
|
18
|
+
*
|
|
16
19
|
* @see https://martijnhols.nl/gists/how-to-get-document-height-ios-safari-osk
|
|
17
20
|
* @todo: investigate if this can use `viewport$`
|
|
18
21
|
*/
|
|
19
|
-
export declare const useViewportSize: () => Size | undefined;
|
|
22
|
+
export declare const useViewportSize: (subscriptionActive?: boolean) => Size | undefined;
|
|
20
23
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as e,useEffect as i,useLayoutEffect as t,useState as n}from"react";let
|
|
1
|
+
import{useCallback as e,useEffect as i,useLayoutEffect as t,useState as n}from"react";let r="u">typeof window?t:()=>{};export const getViewportSize=()=>window.visualViewport?[window.visualViewport.width,window.visualViewport.height]:[window.innerWidth,window.innerHeight];export const useViewportSize=(t=!0)=>{let[o,w]=n(),d=e(()=>{let e=getViewportSize();w(i=>i&&i[0]===e[0]&&i[1]===e[1]?i:e)},[]);return r(()=>{t&&d()},[t,d]),i(()=>{if(!t)return;let e=()=>{d(),setTimeout(d,1e3)};return window.addEventListener("resize",e),window.addEventListener("orientationchange",e),window.visualViewport?.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),window.removeEventListener("orientationchange",e),window.visualViewport?.removeEventListener("resize",e)}},[t,d]),o};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { MobileControls, type MobileControlsLayoutProps, type MobileControlsThemeableProps } from './MobileControls.js';
|
|
1
|
+
export { MobileControls, type MobileControlsLayoutProps, type MobileControlsThemeableProps, type ViewOnlyModeProps, } from './MobileControls.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salsita-ai/sdk",
|
|
3
|
-
"version": "0.50.0-develop.
|
|
3
|
+
"version": "0.50.0-develop.801a817d3f",
|
|
4
4
|
"description": "TypeScript SDK and CLI for building, running, and deploying Phoenix configurator applications.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"salsita",
|
|
@@ -221,7 +221,7 @@
|
|
|
221
221
|
"@swc/core": "1.15.40",
|
|
222
222
|
"@swc/wasm-web": "1.15.40",
|
|
223
223
|
"@tanstack/ai": "0.64.0",
|
|
224
|
-
"@tanstack/ai-
|
|
224
|
+
"@tanstack/ai-client": "0.36.1",
|
|
225
225
|
"@trpc/client": "11.17.0",
|
|
226
226
|
"@trpc/react-query": "11.17.0",
|
|
227
227
|
"@trpc/server": "11.17.0",
|
|
@@ -292,8 +292,8 @@
|
|
|
292
292
|
"yaml": "2.9.0",
|
|
293
293
|
"yargs": "17.7.2",
|
|
294
294
|
"zod": "3.25.76",
|
|
295
|
-
"@salsita-ai/
|
|
296
|
-
"@salsita-ai/
|
|
295
|
+
"@salsita-ai/common": "0.50.0-develop.801a817d3f",
|
|
296
|
+
"@salsita-ai/contracts": "0.50.0-develop.801a817d3f"
|
|
297
297
|
},
|
|
298
298
|
"devDependencies": {
|
|
299
299
|
"@clerk/clerk-react": "5.61.8",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { useAssistantChat, type AssistantChatState } from './use-assistant-chat.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{useAssistantChat}from"./use-assistant-chat.js";
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { type UIMessage } from '@tanstack/ai-react';
|
|
2
|
-
/** Assistant chat state and actions of the current configuration. */
|
|
3
|
-
export interface AssistantChatState {
|
|
4
|
-
/** The thread as painted: hydrated from the server, then streamed. */
|
|
5
|
-
readonly messages: ReadonlyArray<UIMessage>;
|
|
6
|
-
/** True while a reply streams or a browser tool runs. */
|
|
7
|
-
readonly isLoading: boolean;
|
|
8
|
-
readonly error: Error | undefined;
|
|
9
|
-
/**
|
|
10
|
-
* HTTP status of the latest request the server answered with a failure, for telling a refusal from
|
|
11
|
-
* a dropped connection when `error` is set. Nothing when the latest answered request succeeded or
|
|
12
|
-
* the server was never reached.
|
|
13
|
-
*/
|
|
14
|
-
readonly failedStatus: number | undefined;
|
|
15
|
-
/** False when the server said this session may read the thread but not add to it. */
|
|
16
|
-
readonly isContinuable: boolean;
|
|
17
|
-
/** False until the first request of the chat, the thread read, was answered or failed. */
|
|
18
|
-
readonly isLoaded: boolean;
|
|
19
|
-
/** Sends a user message stamped with its send time. */
|
|
20
|
-
readonly send: (content: string) => Promise<void>;
|
|
21
|
-
/** Stops the current reply in the browser and on the server. */
|
|
22
|
-
readonly stop: () => Promise<void>;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* The conversational assistant of the current configuration. The server owns the thread — the chat
|
|
26
|
-
* hydrates from it on mount and rejoins a reply still streaming — so the hook keeps nothing in
|
|
27
|
-
* browser storage. Each message carries its send time for the model. The model's `query` and
|
|
28
|
-
* `apply` calls run here, in the browser, against the configurator this hook is rendered in.
|
|
29
|
-
*/
|
|
30
|
-
export declare const useAssistantChat: () => AssistantChatState;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{fetchServerSentEvents as t,useChat as e}from"@tanstack/ai-react";import{useCallback as a,useMemo as n,useState as r}from"react";import{useApplicationRuntimeSelector as s,useAuthorizedClient as o,useConfigurationId as i,useLogger as c}from"#package/react-sdk";import{useConfigurator as l}from"../application-runtime/index.js";export const useAssistantChat=()=>{let u=i(),h=o(),d=c(),[p,m]=r(),[f,w]=r(!0),[y,g]=r(!1),C=a(()=>h.getAssistantChatConnection(u),[h,u]),k=n(()=>{let e=async(t,e)=>{let a=await fetch(t,e).finally(()=>g(!0)),n=a.headers.get("x-assistant-thread-continuable");return m(a.ok?void 0:a.status),null!=n&&w("false"!==n),a},a=async()=>({headers:await C().headers(),fetchClient:e}),n=t(()=>C().url,a),r=t(()=>`${C().url}/runs`,a);return{...n,joinRun:r.joinRun}},[C]),{assistantSystem:S}=l(),{messages:$,isLoading:j,error:x,sendMessage:A,stop:I,runId:R}=e({threadId:`assistant:${u}`,connection:k,persistence:!0,history:{pageSize:50},tools:s(S.getTools)}),v=a(async t=>{let e={sentAt:new Date().toISOString()};await A({content:t,metadata:e})},[A]),O=a(async()=>{if(I(),null!=R)try{let t=C();await fetch(`${t.url}/runs/${encodeURIComponent(R)}/cancel`,{method:"POST",headers:await t.headers()})}catch(t){d.warn("Could not cancel the assistant run on the server",{error:t})}},[C,d,R,I]);return n(()=>({messages:$,isLoading:j,error:x,failedStatus:p,isContinuable:f,isLoaded:y,send:v,stop:O}),[$,j,x,p,f,y,v,O])};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { type ReactNode } from 'react';
|
|
2
|
-
import { type AssistantChatState } from '../../assistant/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* The built-in assistant panel of a universal layout as the layout and the toolbar button see it:
|
|
5
|
-
* whether it is open, and the few facts about it they render. It changes only when one of those does.
|
|
6
|
-
*/
|
|
7
|
-
export interface AssistantPanelState {
|
|
8
|
-
readonly open: boolean;
|
|
9
|
-
readonly setOpen: (open: boolean) => void;
|
|
10
|
-
/** True when a reply finished while the panel was closed and the panel was not opened since. */
|
|
11
|
-
readonly hasUnreadReply: boolean;
|
|
12
|
-
/** True while the message input has focus; a phone layout gives the panel the whole screen then. */
|
|
13
|
-
readonly isInputFocused: boolean;
|
|
14
|
-
readonly setInputFocused: (isInputFocused: boolean) => void;
|
|
15
|
-
}
|
|
16
|
-
/** The conversation of the assistant panel. It changes with every chunk of a streaming reply. */
|
|
17
|
-
export interface AssistantPanelConversation {
|
|
18
|
-
/** Nothing until the chat of the current attempt has mounted. */
|
|
19
|
-
readonly chat: AssistantChatState | undefined;
|
|
20
|
-
/**
|
|
21
|
-
* Loads the thread from the server again, rejoining a reply that is still running there. It never
|
|
22
|
-
* sends a message again, because the server may already hold it; a message that did not reach the
|
|
23
|
-
* server is therefore gone from the thread and has to be written again.
|
|
24
|
-
*/
|
|
25
|
-
readonly reloadThread: () => void;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* The assistant panel of the layout this is rendered in, or nothing when the application spec has no
|
|
29
|
-
* `assistant` section or the layout does not carry the panel.
|
|
30
|
-
*/
|
|
31
|
-
export declare const useAssistantPanel: () => AssistantPanelState | undefined;
|
|
32
|
-
/** The conversation of the assistant panel, under the same conditions as {@link useAssistantPanel}. */
|
|
33
|
-
export declare const useAssistantPanelConversation: () => AssistantPanelConversation | undefined;
|
|
34
|
-
export interface AssistantPanelProviderProps {
|
|
35
|
-
readonly children: ReactNode;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Owns the open state of the assistant panel and the single chat of the layout below it. The chat
|
|
39
|
-
* lives here and not in the panel, so a reply keeps streaming while the panel is closed. Without an
|
|
40
|
-
* `assistant` section in the application spec no chat is mounted and no request reaches the server.
|
|
41
|
-
*/
|
|
42
|
-
export declare const AssistantPanelProvider: ({ children }: AssistantPanelProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{jsx as e,jsxs as r}from"react/jsx-runtime";import{createContext as t,useCallback as s,useContext as o,useEffect as n,useMemo as a,useRef as i,useState as l}from"react";import{useLogger as d,useSpecAssistant as u}from"#package/react-sdk";import{useAssistantChat as c}from"../../assistant/index.js";let v=t(void 0),m=t(void 0);export const useAssistantPanel=()=>o(v);export const useAssistantPanelConversation=()=>o(m);let p=({onChange:e})=>{let r=c();return n(()=>{e(r)},[r,e]),n(()=>()=>{e(void 0)},[e]),null};export const AssistantPanelProvider=({children:t})=>{let o=u(),[c,x]=l(),[f,P]=l(!1),[h,j]=l(!1),[g,A]=l(0),[k,C]=l(!1),q=d(),L=s(e=>{P(e),e?j(!1):C(!1)},[]),S=c?.isLoading??!1,T=i(!1),b=s(()=>{T.current=!1,A(e=>e+1)},[]);n(()=>{!T.current||S||f||null==c||j(!0),T.current=S},[c,S,f]);let w=c?.error,y=c?.failedStatus;n(()=>{w&&q.error("The assistant request failed",{status:y},w)},[w,y,q]);let z=a(()=>o?{open:f,setOpen:L,hasUnreadReply:h,isInputFocused:k,setInputFocused:C}:void 0,[o,f,L,h,k]),B=a(()=>o?{chat:c,reloadThread:b}:void 0,[o,c,b]);return e(v.Provider,{value:z,children:r(m.Provider,{value:B,children:[o&&e(p,{onChange:x},g),t]})})};
|