@stigmer/react 0.0.91 → 0.0.93
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/README.md +57 -12
- package/agent/AgentDetailView.js +7 -7
- package/agent/AgentDetailView.js.map +1 -1
- package/agent/AgentPicker.js +3 -3
- package/agent/AgentPicker.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.js +1 -1
- package/api-key/ApiKeyCreatedAlert.js.map +1 -1
- package/api-key/ApiKeyListPanel.js +4 -4
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.js +1 -1
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/attachment/AttachmentChipList.js +2 -2
- package/attachment/AttachmentChipList.js.map +1 -1
- package/color-mode.d.ts +48 -0
- package/color-mode.d.ts.map +1 -0
- package/color-mode.js +53 -0
- package/color-mode.js.map +1 -0
- package/composer/ComposerToolbar.d.ts +6 -2
- package/composer/ComposerToolbar.d.ts.map +1 -1
- package/composer/ComposerToolbar.js +5 -3
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/ConfigureMenu.js +3 -3
- package/composer/ConfigureMenu.js.map +1 -1
- package/composer/ContextChip.js +1 -1
- package/composer/ContextChip.js.map +1 -1
- package/composer/ContextPopover.js +1 -1
- package/composer/ContextPopover.js.map +1 -1
- package/composer/SessionComposer.d.ts +24 -3
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +5 -4
- package/composer/SessionComposer.js.map +1 -1
- package/environment/CreateEnvironmentForm.js +1 -1
- package/environment/CreateEnvironmentForm.js.map +1 -1
- package/environment/EnvVarForm.js +2 -2
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentListPanel.js +2 -2
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/environment/EnvironmentVariableEditor.js +6 -6
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/error/ErrorMessage.js +1 -1
- package/error/ErrorMessage.js.map +1 -1
- package/execution/ApprovalCard.js +4 -4
- package/execution/ApprovalCard.js.map +1 -1
- package/execution/ArtifactCard.js +1 -1
- package/execution/ArtifactCard.js.map +1 -1
- package/execution/ArtifactPreviewModal.js +4 -4
- package/execution/ArtifactPreviewModal.js.map +1 -1
- package/execution/FollowUpInput.js +1 -1
- package/execution/FollowUpInput.js.map +1 -1
- package/execution/McpToolDetail.js +4 -4
- package/execution/McpToolDetail.js.map +1 -1
- package/execution/MessageEntry.js +1 -1
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.js +1 -1
- package/execution/MessageThread.js.map +1 -1
- package/execution/SessionVariablesInput.js +4 -4
- package/execution/SessionVariablesInput.js.map +1 -1
- package/execution/SubAgentSection.js +2 -2
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/ToolCallDetail.js +2 -2
- package/execution/ToolCallDetail.js.map +1 -1
- package/execution/ToolCallGroup.js +1 -1
- package/execution/ToolCallGroup.js.map +1 -1
- package/execution/ToolCallItem.js +2 -2
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/WriteBackCard.js +3 -3
- package/execution/WriteBackCard.js.map +1 -1
- package/execution/tool-rendering-primitives.js +3 -3
- package/execution/tool-rendering-primitives.js.map +1 -1
- package/github/GitHubRepoPicker.js +5 -5
- package/github/GitHubRepoPicker.js.map +1 -1
- package/iam-policy/GrantAccessForm.js +1 -1
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.js +5 -5
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +3 -3
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +5 -5
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +3 -3
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +7 -7
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/ProviderPicker.js +2 -2
- package/identity-provider/ProviderPicker.js.map +1 -1
- package/index.d.ts +8 -4
- package/index.d.ts.map +1 -1
- package/index.js +7 -3
- package/index.js.map +1 -1
- package/internal/CloudFeatureNotice.js +1 -1
- package/internal/CloudFeatureNotice.js.map +1 -1
- package/internal/Tabs.js +1 -1
- package/internal/Tabs.js.map +1 -1
- package/internal/markdown-components.js +2 -2
- package/internal/markdown-components.js.map +1 -1
- package/invitation/InvitationCreatedAlert.js +1 -1
- package/invitation/InvitationCreatedAlert.js.map +1 -1
- package/invitation/InvitationManager.js +5 -5
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.js +4 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/library/ResourceCountCard.js +1 -1
- package/library/ResourceCountCard.js.map +1 -1
- package/library/ResourceListView.js +5 -5
- package/library/ResourceListView.js.map +1 -1
- package/mcp-server/McpServerConfigPanel.js +5 -5
- package/mcp-server/McpServerConfigPanel.js.map +1 -1
- package/mcp-server/McpServerConnectDialog.js +4 -4
- package/mcp-server/McpServerConnectDialog.js.map +1 -1
- package/mcp-server/McpServerDetailView.js +14 -14
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/McpServerPicker.js +4 -4
- package/mcp-server/McpServerPicker.js.map +1 -1
- package/mcp-server/McpToolSelector.js +3 -3
- package/mcp-server/McpToolSelector.js.map +1 -1
- package/mcp-server/OAuthAppForm.js +1 -1
- package/mcp-server/OAuthAppForm.js.map +1 -1
- package/models/ModelSelector.js +1 -1
- package/models/ModelSelector.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +1 -1
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +3 -3
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/oauth-app/OAuthAppListPanel.js +2 -2
- package/oauth-app/OAuthAppListPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.js +1 -1
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.js +3 -3
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.js +2 -2
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +4 -4
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.js +3 -3
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +2 -2
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +39 -2
- package/provider.d.ts.map +1 -1
- package/provider.js +11 -3
- package/provider.js.map +1 -1
- package/runner/RunnerListPanel.d.ts +65 -0
- package/runner/RunnerListPanel.d.ts.map +1 -0
- package/runner/RunnerListPanel.js +237 -0
- package/runner/RunnerListPanel.js.map +1 -0
- package/runner/RunnerPicker.d.ts +54 -0
- package/runner/RunnerPicker.d.ts.map +1 -0
- package/runner/RunnerPicker.js +133 -0
- package/runner/RunnerPicker.js.map +1 -0
- package/runner/__tests__/useDeleteRunner.test.d.ts +2 -0
- package/runner/__tests__/useDeleteRunner.test.d.ts.map +1 -0
- package/runner/__tests__/useDeleteRunner.test.js +108 -0
- package/runner/__tests__/useDeleteRunner.test.js.map +1 -0
- package/runner/__tests__/useLaunchLocalRunner.test.d.ts +2 -0
- package/runner/__tests__/useLaunchLocalRunner.test.d.ts.map +1 -0
- package/runner/__tests__/useLaunchLocalRunner.test.js +143 -0
- package/runner/__tests__/useLaunchLocalRunner.test.js.map +1 -0
- package/runner/__tests__/useStopRunner.test.d.ts +2 -0
- package/runner/__tests__/useStopRunner.test.d.ts.map +1 -0
- package/runner/__tests__/useStopRunner.test.js +114 -0
- package/runner/__tests__/useStopRunner.test.js.map +1 -0
- package/runner/index.d.ts +14 -0
- package/runner/index.d.ts.map +1 -0
- package/runner/index.js +8 -0
- package/runner/index.js.map +1 -0
- package/runner/phase.d.ts +30 -0
- package/runner/phase.d.ts.map +1 -0
- package/runner/phase.js +58 -0
- package/runner/phase.js.map +1 -0
- package/runner/useDeleteRunner.d.ts +36 -0
- package/runner/useDeleteRunner.d.ts.map +1 -0
- package/runner/useDeleteRunner.js +42 -0
- package/runner/useDeleteRunner.js.map +1 -0
- package/runner/useLaunchLocalRunner.d.ts +84 -0
- package/runner/useLaunchLocalRunner.d.ts.map +1 -0
- package/runner/useLaunchLocalRunner.js +75 -0
- package/runner/useLaunchLocalRunner.js.map +1 -0
- package/runner/useRunnerList.d.ts +49 -0
- package/runner/useRunnerList.d.ts.map +1 -0
- package/runner/useRunnerList.js +70 -0
- package/runner/useRunnerList.js.map +1 -0
- package/runner/useStopRunner.d.ts +53 -0
- package/runner/useStopRunner.d.ts.map +1 -0
- package/runner/useStopRunner.js +50 -0
- package/runner/useStopRunner.js.map +1 -0
- package/session/draft.d.ts +53 -0
- package/session/draft.d.ts.map +1 -0
- package/session/draft.js +45 -0
- package/session/draft.js.map +1 -0
- package/session/index.d.ts +10 -0
- package/session/index.d.ts.map +1 -1
- package/session/index.js +5 -0
- package/session/index.js.map +1 -1
- package/session/useCreateSession.d.ts +8 -0
- package/session/useCreateSession.d.ts.map +1 -1
- package/session/useCreateSession.js +1 -0
- package/session/useCreateSession.js.map +1 -1
- package/session/useEditSessionPrep.d.ts +26 -0
- package/session/useEditSessionPrep.d.ts.map +1 -0
- package/session/useEditSessionPrep.js +83 -0
- package/session/useEditSessionPrep.js.map +1 -0
- package/session/useNewSessionFlow.d.ts +110 -0
- package/session/useNewSessionFlow.d.ts.map +1 -0
- package/session/useNewSessionFlow.js +184 -0
- package/session/useNewSessionFlow.js.map +1 -0
- package/session/usePersistedModel.d.ts +18 -0
- package/session/usePersistedModel.d.ts.map +1 -0
- package/session/usePersistedModel.js +31 -0
- package/session/usePersistedModel.js.map +1 -0
- package/session/useSessionPageFlow.d.ts +104 -0
- package/session/useSessionPageFlow.d.ts.map +1 -0
- package/session/useSessionPageFlow.js +172 -0
- package/session/useSessionPageFlow.js.map +1 -0
- package/skill/SkillDetailView.js +3 -3
- package/skill/SkillDetailView.js.map +1 -1
- package/skill/SkillPicker.js +3 -3
- package/skill/SkillPicker.js.map +1 -1
- package/src/agent/AgentDetailView.tsx +8 -8
- package/src/agent/AgentPicker.tsx +3 -3
- package/src/api-key/ApiKeyCreatedAlert.tsx +2 -2
- package/src/api-key/ApiKeyListPanel.tsx +6 -6
- package/src/api-key/CreateApiKeyForm.tsx +2 -2
- package/src/attachment/AttachmentChipList.tsx +3 -3
- package/src/color-mode.ts +75 -0
- package/src/composer/ComposerToolbar.tsx +29 -7
- package/src/composer/ConfigureMenu.tsx +6 -6
- package/src/composer/ContextChip.tsx +1 -1
- package/src/composer/ContextPopover.tsx +2 -2
- package/src/composer/SessionComposer.tsx +34 -5
- package/src/environment/CreateEnvironmentForm.tsx +3 -3
- package/src/environment/EnvVarForm.tsx +6 -6
- package/src/environment/EnvironmentListPanel.tsx +3 -3
- package/src/environment/EnvironmentVariableEditor.tsx +7 -7
- package/src/error/ErrorMessage.tsx +5 -5
- package/src/execution/ApprovalCard.tsx +5 -5
- package/src/execution/ArtifactCard.tsx +2 -2
- package/src/execution/ArtifactPreviewModal.tsx +4 -4
- package/src/execution/FollowUpInput.tsx +2 -2
- package/src/execution/McpToolDetail.tsx +4 -4
- package/src/execution/MessageEntry.tsx +1 -1
- package/src/execution/MessageThread.tsx +1 -1
- package/src/execution/SessionVariablesInput.tsx +7 -7
- package/src/execution/SubAgentSection.tsx +5 -5
- package/src/execution/ToolCallDetail.tsx +2 -2
- package/src/execution/ToolCallGroup.tsx +3 -3
- package/src/execution/ToolCallItem.tsx +4 -4
- package/src/execution/WriteBackCard.tsx +5 -5
- package/src/execution/tool-rendering-primitives.tsx +5 -5
- package/src/github/GitHubRepoPicker.tsx +5 -5
- package/src/iam-policy/GrantAccessForm.tsx +2 -2
- package/src/iam-policy/OrgMembersPanel.tsx +11 -11
- package/src/identity-provider/CreateIdentityProviderForm.tsx +4 -4
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +7 -7
- package/src/identity-provider/IdentityProviderListPanel.tsx +7 -7
- package/src/identity-provider/IdentityProviderWizard.tsx +8 -8
- package/src/identity-provider/ProviderPicker.tsx +2 -2
- package/src/index.ts +46 -7
- package/src/internal/CloudFeatureNotice.tsx +1 -1
- package/src/internal/Tabs.tsx +1 -1
- package/src/internal/markdown-components.tsx +2 -2
- package/src/invitation/InvitationCreatedAlert.tsx +2 -2
- package/src/invitation/InvitationManager.tsx +9 -9
- package/src/invitation/InvitationRedemption.tsx +11 -11
- package/src/library/ResourceCountCard.tsx +1 -1
- package/src/library/ResourceListView.tsx +7 -7
- package/src/mcp-server/McpServerConfigPanel.tsx +7 -7
- package/src/mcp-server/McpServerConnectDialog.tsx +5 -5
- package/src/mcp-server/McpServerDetailView.tsx +19 -19
- package/src/mcp-server/McpServerPicker.tsx +6 -6
- package/src/mcp-server/McpToolSelector.tsx +4 -4
- package/src/mcp-server/OAuthAppForm.tsx +3 -3
- package/src/models/ModelSelector.tsx +1 -1
- package/src/oauth-app/CreateOAuthAppForm.tsx +3 -3
- package/src/oauth-app/OAuthAppDetailPanel.tsx +7 -7
- package/src/oauth-app/OAuthAppListPanel.tsx +3 -3
- package/src/organization/CreateOrganizationForm.tsx +3 -3
- package/src/organization/OrgProfilePanel.tsx +4 -5
- package/src/platform-client/CreatePlatformClientForm.tsx +6 -6
- package/src/platform-client/PlatformClientDetailPanel.tsx +19 -19
- package/src/platform-client/PlatformClientListPanel.tsx +7 -7
- package/src/platform-client/PlatformClientSecretAlert.tsx +2 -2
- package/src/provider.tsx +52 -2
- package/src/runner/RunnerListPanel.tsx +725 -0
- package/src/runner/RunnerPicker.tsx +319 -0
- package/src/runner/__tests__/useDeleteRunner.test.tsx +150 -0
- package/src/runner/__tests__/useLaunchLocalRunner.test.tsx +223 -0
- package/src/runner/__tests__/useStopRunner.test.tsx +154 -0
- package/src/runner/index.ts +34 -0
- package/src/runner/phase.ts +62 -0
- package/src/runner/useDeleteRunner.ts +67 -0
- package/src/runner/useLaunchLocalRunner.ts +139 -0
- package/src/runner/useRunnerList.ts +114 -0
- package/src/runner/useStopRunner.ts +92 -0
- package/src/session/draft.ts +82 -0
- package/src/session/index.ts +28 -0
- package/src/session/useCreateSession.ts +9 -0
- package/src/session/useEditSessionPrep.ts +111 -0
- package/src/session/useNewSessionFlow.ts +283 -0
- package/src/session/usePersistedModel.ts +41 -0
- package/src/session/useSessionPageFlow.ts +280 -0
- package/src/skill/SkillDetailView.tsx +5 -5
- package/src/skill/SkillPicker.tsx +3 -3
- package/src/styles.css +25 -1
- package/src/usage/OrgUsagePanel.tsx +4 -4
- package/src/workspace/WorkspaceEditor.tsx +78 -66
- package/src/workspace/index.ts +0 -8
- package/styles.css +1 -1
- package/usage/OrgUsagePanel.js +2 -2
- package/usage/OrgUsagePanel.js.map +1 -1
- package/workspace/WorkspaceEditor.d.ts +28 -3
- package/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/workspace/WorkspaceEditor.js +24 -25
- package/workspace/WorkspaceEditor.js.map +1 -1
- package/workspace/index.d.ts +0 -4
- package/workspace/index.d.ts.map +1 -1
- package/workspace/index.js +0 -2
- package/workspace/index.js.map +1 -1
- package/src/workspace/FolderBrowser.tsx +0 -579
- package/src/workspace/useFolderListing.ts +0 -164
- package/workspace/FolderBrowser.d.ts +0 -37
- package/workspace/FolderBrowser.d.ts.map +0 -1
- package/workspace/FolderBrowser.js +0 -188
- package/workspace/FolderBrowser.js.map +0 -1
- package/workspace/useFolderListing.d.ts +0 -73
- package/workspace/useFolderListing.d.ts.map +0 -1
- package/workspace/useFolderListing.js +0 -110
- package/workspace/useFolderListing.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEditSessionPrep.js","sourceRoot":"","sources":["../../src/session/useEditSessionPrep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { type McpServerUsageInput, type ResourceRef } from "@stigmer/sdk";
|
|
2
|
+
import type { AgentResolution } from "../agent";
|
|
3
|
+
import { type UseWorkspaceEntriesReturn } from "../workspace";
|
|
4
|
+
import { type UseSessionVariablesReturn } from "../execution/useSessionVariables";
|
|
5
|
+
import type { SessionComposerSubmitContext } from "../composer";
|
|
6
|
+
/** Options for {@link useNewSessionFlow}. */
|
|
7
|
+
export interface UseNewSessionFlowOptions {
|
|
8
|
+
/** Organization slug. Required for session and execution creation. */
|
|
9
|
+
readonly org: string;
|
|
10
|
+
/**
|
|
11
|
+
* Called after a session and its first execution are created successfully.
|
|
12
|
+
* The consumer is responsible for navigation (e.g. `router.push`).
|
|
13
|
+
*/
|
|
14
|
+
readonly onSessionCreated: (sessionId: string) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Called when an error occurs during session creation.
|
|
17
|
+
* The consumer can use this for toast notifications or other UI feedback.
|
|
18
|
+
* If not provided, errors are still available via {@link UseNewSessionFlowReturn.submitError}.
|
|
19
|
+
*/
|
|
20
|
+
readonly onError?: (message: string) => void;
|
|
21
|
+
}
|
|
22
|
+
/** Return value of {@link useNewSessionFlow}. */
|
|
23
|
+
export interface UseNewSessionFlowReturn {
|
|
24
|
+
/** Currently selected model ID (persisted to localStorage). */
|
|
25
|
+
readonly modelId: string | undefined;
|
|
26
|
+
/** Update the selected model. Automatically persists to localStorage. */
|
|
27
|
+
readonly setModelId: (id: string) => void;
|
|
28
|
+
/** Currently selected agent reference, or `null` for the default agent. */
|
|
29
|
+
readonly agentRef: ResourceRef | null;
|
|
30
|
+
/** Update the selected agent reference. */
|
|
31
|
+
readonly setAgentRef: (ref: ResourceRef | null) => void;
|
|
32
|
+
/** Current agent resolution state (saved instance vs direct reference). */
|
|
33
|
+
readonly resolution: AgentResolution | null;
|
|
34
|
+
/** Update the agent resolution. */
|
|
35
|
+
readonly setResolution: (r: AgentResolution | null) => void;
|
|
36
|
+
/** Active MCP server configurations. */
|
|
37
|
+
readonly mcpServerUsages: McpServerUsageInput[];
|
|
38
|
+
/** Update MCP server configurations. */
|
|
39
|
+
readonly setMcpServerUsages: (usages: McpServerUsageInput[]) => void;
|
|
40
|
+
/** Active skill references. */
|
|
41
|
+
readonly skillRefs: ResourceRef[];
|
|
42
|
+
/** Update skill references. */
|
|
43
|
+
readonly setSkillRefs: (refs: ResourceRef[]) => void;
|
|
44
|
+
/** Selected runner ID, or `null` for auto-selection. */
|
|
45
|
+
readonly runnerId: string | null;
|
|
46
|
+
/** Update the selected runner. */
|
|
47
|
+
readonly setRunnerId: (id: string | null) => void;
|
|
48
|
+
/** Workspace entries manager (git repos and local paths). */
|
|
49
|
+
readonly workspace: UseWorkspaceEntriesReturn;
|
|
50
|
+
/** Session variables (per-execution secrets) manager. */
|
|
51
|
+
readonly sessionVariables: UseSessionVariablesReturn;
|
|
52
|
+
/** `true` while the create session + execution flow is in flight. */
|
|
53
|
+
readonly isSubmitting: boolean;
|
|
54
|
+
/** Human-readable error from the last failed submission, or `null`. */
|
|
55
|
+
readonly submitError: string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Create a session with the first execution.
|
|
58
|
+
*
|
|
59
|
+
* Composes all managed state (agent, workspace, MCP servers, skills,
|
|
60
|
+
* runner, model, session variables) into the session and execution
|
|
61
|
+
* creation RPCs, then calls `onSessionCreated` on success.
|
|
62
|
+
*
|
|
63
|
+
* The `model` parameter overrides `modelId` for this submission only
|
|
64
|
+
* (used when SessionComposer passes a per-message model selection).
|
|
65
|
+
*/
|
|
66
|
+
readonly submit: (message: string, model?: string, context?: SessionComposerSubmitContext) => Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Orchestrates the "create a new session" flow.
|
|
70
|
+
*
|
|
71
|
+
* Manages all the state required to configure and submit a new session:
|
|
72
|
+
* model selection (with localStorage persistence), agent resolution,
|
|
73
|
+
* MCP server/skill/runner selection, workspace entries, and session
|
|
74
|
+
* variables. On submission, creates the session and its first execution
|
|
75
|
+
* in sequence, then notifies the consumer via `onSessionCreated`.
|
|
76
|
+
*
|
|
77
|
+
* This hook is framework-agnostic — it works identically in Next.js,
|
|
78
|
+
* Vite, Tauri, or any React environment. Navigation, toast notifications,
|
|
79
|
+
* and draft-mode logic are the consumer's responsibility.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* const flow = useNewSessionFlow({
|
|
84
|
+
* org: "acme",
|
|
85
|
+
* onSessionCreated: (id) => navigate(`/sessions/${id}`),
|
|
86
|
+
* onError: (msg) => toast.error(msg),
|
|
87
|
+
* });
|
|
88
|
+
*
|
|
89
|
+
* <SessionComposer
|
|
90
|
+
* onSubmit={flow.submit}
|
|
91
|
+
* isSubmitting={flow.isSubmitting}
|
|
92
|
+
* org="acme"
|
|
93
|
+
* workspace={flow.workspace}
|
|
94
|
+
* agentRef={flow.agentRef}
|
|
95
|
+
* onAgentRefChange={flow.setAgentRef}
|
|
96
|
+
* onAgentResolutionChange={flow.setResolution}
|
|
97
|
+
* mcpServerUsages={flow.mcpServerUsages}
|
|
98
|
+
* onMcpServerUsagesChange={flow.setMcpServerUsages}
|
|
99
|
+
* skillRefs={flow.skillRefs}
|
|
100
|
+
* onSkillRefsChange={flow.setSkillRefs}
|
|
101
|
+
* runnerId={flow.runnerId}
|
|
102
|
+
* onRunnerIdChange={flow.setRunnerId}
|
|
103
|
+
* sessionVariables={flow.sessionVariables}
|
|
104
|
+
* defaultModelId={flow.modelId}
|
|
105
|
+
* onModelChange={flow.setModelId}
|
|
106
|
+
* />
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export declare function useNewSessionFlow(options: UseNewSessionFlowOptions): UseNewSessionFlowReturn;
|
|
110
|
+
//# sourceMappingURL=useNewSessionFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNewSessionFlow.d.ts","sourceRoot":"","sources":["../../src/session/useNewSessionFlow.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AACvG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAMhE,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IACtC,2CAA2C;IAC3C,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAExD,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,mCAAmC;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAE5D,wCAAwC;IACxC,QAAQ,CAAC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IAChD,wCAAwC;IACxC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAErE,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAErD,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kCAAkC;IAClC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAElD,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9C,yDAAyD;IACzD,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;IAErD,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,uBAAuB,CAoJzB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
4
|
+
import { useDefaultAgent } from "../agent";
|
|
5
|
+
import { useModelRegistry } from "../models";
|
|
6
|
+
import { useWorkspaceEntries } from "../workspace";
|
|
7
|
+
import { useSessionVariables } from "../execution/useSessionVariables";
|
|
8
|
+
import { useCreateSession } from "./useCreateSession";
|
|
9
|
+
import { useCreateAgentExecution } from "../execution/useCreateAgentExecution";
|
|
10
|
+
const STORAGE_KEY_MODEL = "stigmer:session:model";
|
|
11
|
+
/**
|
|
12
|
+
* Orchestrates the "create a new session" flow.
|
|
13
|
+
*
|
|
14
|
+
* Manages all the state required to configure and submit a new session:
|
|
15
|
+
* model selection (with localStorage persistence), agent resolution,
|
|
16
|
+
* MCP server/skill/runner selection, workspace entries, and session
|
|
17
|
+
* variables. On submission, creates the session and its first execution
|
|
18
|
+
* in sequence, then notifies the consumer via `onSessionCreated`.
|
|
19
|
+
*
|
|
20
|
+
* This hook is framework-agnostic — it works identically in Next.js,
|
|
21
|
+
* Vite, Tauri, or any React environment. Navigation, toast notifications,
|
|
22
|
+
* and draft-mode logic are the consumer's responsibility.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* const flow = useNewSessionFlow({
|
|
27
|
+
* org: "acme",
|
|
28
|
+
* onSessionCreated: (id) => navigate(`/sessions/${id}`),
|
|
29
|
+
* onError: (msg) => toast.error(msg),
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* <SessionComposer
|
|
33
|
+
* onSubmit={flow.submit}
|
|
34
|
+
* isSubmitting={flow.isSubmitting}
|
|
35
|
+
* org="acme"
|
|
36
|
+
* workspace={flow.workspace}
|
|
37
|
+
* agentRef={flow.agentRef}
|
|
38
|
+
* onAgentRefChange={flow.setAgentRef}
|
|
39
|
+
* onAgentResolutionChange={flow.setResolution}
|
|
40
|
+
* mcpServerUsages={flow.mcpServerUsages}
|
|
41
|
+
* onMcpServerUsagesChange={flow.setMcpServerUsages}
|
|
42
|
+
* skillRefs={flow.skillRefs}
|
|
43
|
+
* onSkillRefsChange={flow.setSkillRefs}
|
|
44
|
+
* runnerId={flow.runnerId}
|
|
45
|
+
* onRunnerIdChange={flow.setRunnerId}
|
|
46
|
+
* sessionVariables={flow.sessionVariables}
|
|
47
|
+
* defaultModelId={flow.modelId}
|
|
48
|
+
* onModelChange={flow.setModelId}
|
|
49
|
+
* />
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export function useNewSessionFlow(options) {
|
|
53
|
+
const { org, onSessionCreated, onError } = options;
|
|
54
|
+
const { getModel } = useModelRegistry();
|
|
55
|
+
const { create: createSession } = useCreateSession();
|
|
56
|
+
const { create: createExecution } = useCreateAgentExecution();
|
|
57
|
+
const { agent: defaultAgent } = useDefaultAgent(org);
|
|
58
|
+
const workspace = useWorkspaceEntries();
|
|
59
|
+
const sessionVariables = useSessionVariables();
|
|
60
|
+
const [modelId, setModelId] = useState(undefined);
|
|
61
|
+
const [agentRef, setAgentRef] = useState(null);
|
|
62
|
+
const [resolution, setResolution] = useState(null);
|
|
63
|
+
const [mcpServerUsages, setMcpServerUsages] = useState([]);
|
|
64
|
+
const [skillRefs, setSkillRefs] = useState([]);
|
|
65
|
+
const [runnerId, setRunnerId] = useState(null);
|
|
66
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
67
|
+
const [submitError, setSubmitError] = useState(null);
|
|
68
|
+
const validModelId = modelId && getModel(modelId) ? modelId : undefined;
|
|
69
|
+
// Restore persisted model on mount
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
const stored = localStorage.getItem(STORAGE_KEY_MODEL);
|
|
72
|
+
if (stored && getModel(stored)) {
|
|
73
|
+
setModelId(stored);
|
|
74
|
+
}
|
|
75
|
+
}, [getModel]);
|
|
76
|
+
// Persist model on change
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (modelId) {
|
|
79
|
+
localStorage.setItem(STORAGE_KEY_MODEL, modelId);
|
|
80
|
+
}
|
|
81
|
+
}, [modelId]);
|
|
82
|
+
const submit = useCallback(async (message, selectedModel, context) => {
|
|
83
|
+
if (isSubmitting)
|
|
84
|
+
return;
|
|
85
|
+
if (!org) {
|
|
86
|
+
const msg = "Select an organization before starting a session.";
|
|
87
|
+
setSubmitError(msg);
|
|
88
|
+
onError?.(msg);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
setIsSubmitting(true);
|
|
92
|
+
setSubmitError(null);
|
|
93
|
+
try {
|
|
94
|
+
const sessionFields = {
|
|
95
|
+
org,
|
|
96
|
+
workspaceEntries: workspace.hasEntries
|
|
97
|
+
? workspace.toInput()
|
|
98
|
+
: undefined,
|
|
99
|
+
mcpServerUsages: mcpServerUsages.length > 0 ? mcpServerUsages : undefined,
|
|
100
|
+
skillRefs: skillRefs.length > 0 ? skillRefs : undefined,
|
|
101
|
+
runnerId: runnerId ?? undefined,
|
|
102
|
+
};
|
|
103
|
+
const executionFields = {
|
|
104
|
+
org,
|
|
105
|
+
message,
|
|
106
|
+
modelName: selectedModel ?? validModelId,
|
|
107
|
+
runtimeEnv: context?.runtimeEnv,
|
|
108
|
+
attachments: context?.attachments,
|
|
109
|
+
};
|
|
110
|
+
let sessionId;
|
|
111
|
+
if (agentRef && resolution) {
|
|
112
|
+
if (resolution.mode === "saved") {
|
|
113
|
+
({ sessionId } = await createSession({
|
|
114
|
+
...sessionFields,
|
|
115
|
+
agentInstanceId: resolution.instanceId,
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
({ sessionId } = await createSession({
|
|
120
|
+
...sessionFields,
|
|
121
|
+
agentRef,
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const defaultInstanceId = defaultAgent?.status?.defaultInstanceId;
|
|
127
|
+
if (!defaultInstanceId) {
|
|
128
|
+
throw new Error("No default agent available. Select an agent to start a session.");
|
|
129
|
+
}
|
|
130
|
+
({ sessionId } = await createSession({
|
|
131
|
+
...sessionFields,
|
|
132
|
+
agentInstanceId: defaultInstanceId,
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
await createExecution({ ...executionFields, sessionId });
|
|
136
|
+
sessionVariables.clear();
|
|
137
|
+
onSessionCreated(sessionId);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const detail = getUserMessage(err, "Failed to start session");
|
|
141
|
+
setSubmitError(detail);
|
|
142
|
+
onError?.(detail);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
setIsSubmitting(false);
|
|
146
|
+
}
|
|
147
|
+
}, [
|
|
148
|
+
isSubmitting,
|
|
149
|
+
org,
|
|
150
|
+
validModelId,
|
|
151
|
+
workspace,
|
|
152
|
+
mcpServerUsages,
|
|
153
|
+
skillRefs,
|
|
154
|
+
runnerId,
|
|
155
|
+
agentRef,
|
|
156
|
+
resolution,
|
|
157
|
+
defaultAgent,
|
|
158
|
+
createSession,
|
|
159
|
+
createExecution,
|
|
160
|
+
sessionVariables,
|
|
161
|
+
onSessionCreated,
|
|
162
|
+
onError,
|
|
163
|
+
]);
|
|
164
|
+
return {
|
|
165
|
+
modelId: validModelId,
|
|
166
|
+
setModelId,
|
|
167
|
+
agentRef,
|
|
168
|
+
setAgentRef,
|
|
169
|
+
resolution,
|
|
170
|
+
setResolution,
|
|
171
|
+
mcpServerUsages,
|
|
172
|
+
setMcpServerUsages,
|
|
173
|
+
skillRefs,
|
|
174
|
+
setSkillRefs,
|
|
175
|
+
runnerId,
|
|
176
|
+
setRunnerId,
|
|
177
|
+
workspace,
|
|
178
|
+
sessionVariables,
|
|
179
|
+
isSubmitting,
|
|
180
|
+
submitError,
|
|
181
|
+
submit,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=useNewSessionFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNewSessionFlow.js","sourceRoot":"","sources":["../../src/session/useNewSessionFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Return value of {@link usePersistedModel}. */
|
|
2
|
+
export type UsePersistedModelReturn = readonly [
|
|
3
|
+
modelId: string | undefined,
|
|
4
|
+
setModelId: (id: string) => void
|
|
5
|
+
];
|
|
6
|
+
/**
|
|
7
|
+
* Model selection with localStorage persistence.
|
|
8
|
+
*
|
|
9
|
+
* Restores the last selected model on mount and validates it against the
|
|
10
|
+
* model registry. Invalid or removed models are silently ignored (returns
|
|
11
|
+
* `undefined`). On change, persists the new selection to localStorage so
|
|
12
|
+
* it survives page reloads and navigation.
|
|
13
|
+
*
|
|
14
|
+
* Used by both the session launcher (new session) and session page
|
|
15
|
+
* (follow-up messages) to maintain a consistent model preference.
|
|
16
|
+
*/
|
|
17
|
+
export declare function usePersistedModel(): UsePersistedModelReturn;
|
|
18
|
+
//# sourceMappingURL=usePersistedModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePersistedModel.d.ts","sourceRoot":"","sources":["../../src/session/usePersistedModel.ts"],"names":[],"mappings":"AAOA,iDAAiD;AACjD,MAAM,MAAM,uBAAuB,GAAG,SAAS;IAC7C,OAAO,EAAE,MAAM,GAAG,SAAS;IAC3B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI;CACjC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,IAAI,uBAAuB,CAgB3D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { useModelRegistry } from "../models";
|
|
4
|
+
const STORAGE_KEY_MODEL = "stigmer:session:model";
|
|
5
|
+
/**
|
|
6
|
+
* Model selection with localStorage persistence.
|
|
7
|
+
*
|
|
8
|
+
* Restores the last selected model on mount and validates it against the
|
|
9
|
+
* model registry. Invalid or removed models are silently ignored (returns
|
|
10
|
+
* `undefined`). On change, persists the new selection to localStorage so
|
|
11
|
+
* it survives page reloads and navigation.
|
|
12
|
+
*
|
|
13
|
+
* Used by both the session launcher (new session) and session page
|
|
14
|
+
* (follow-up messages) to maintain a consistent model preference.
|
|
15
|
+
*/
|
|
16
|
+
export function usePersistedModel() {
|
|
17
|
+
const { getModel } = useModelRegistry();
|
|
18
|
+
const [modelId, setModelId] = useState(() => {
|
|
19
|
+
if (typeof window === "undefined")
|
|
20
|
+
return undefined;
|
|
21
|
+
return localStorage.getItem(STORAGE_KEY_MODEL) ?? undefined;
|
|
22
|
+
});
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (modelId) {
|
|
25
|
+
localStorage.setItem(STORAGE_KEY_MODEL, modelId);
|
|
26
|
+
}
|
|
27
|
+
}, [modelId]);
|
|
28
|
+
const validModelId = modelId && getModel(modelId) ? modelId : undefined;
|
|
29
|
+
return [validModelId, setModelId];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=usePersistedModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePersistedModel.js","sourceRoot":"","sources":["../../src/session/usePersistedModel.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAQlD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAExC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,GAAG,EAAE;QAC9D,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QACpD,OAAO,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,YAAY,GAAG,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,OAAO,CAAC,YAAY,EAAE,UAAU,CAAU,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { McpServerUsageInput, ResourceRef } from "@stigmer/sdk";
|
|
2
|
+
import type { AgentResolution } from "../agent";
|
|
3
|
+
import { type UseWorkspaceEntriesReturn } from "../workspace";
|
|
4
|
+
import { type UseSessionVariablesReturn } from "../execution/useSessionVariables";
|
|
5
|
+
import type { SessionComposerSubmitContext } from "../composer";
|
|
6
|
+
import { type UseSessionConversationReturn } from "./useSessionConversation";
|
|
7
|
+
import { type UsePersistedModelReturn } from "./usePersistedModel";
|
|
8
|
+
/** Options for {@link useSessionPageFlow}. */
|
|
9
|
+
export interface UseSessionPageFlowOptions {
|
|
10
|
+
/** Session ID to load and manage. */
|
|
11
|
+
readonly sessionId: string;
|
|
12
|
+
/** Organization slug. */
|
|
13
|
+
readonly org: string;
|
|
14
|
+
}
|
|
15
|
+
/** Return value of {@link useSessionPageFlow}. */
|
|
16
|
+
export interface UseSessionPageFlowReturn {
|
|
17
|
+
/** Full conversation state from `useSessionConversation`. */
|
|
18
|
+
readonly conv: UseSessionConversationReturn;
|
|
19
|
+
/** Persisted model selection: `[modelId, setModelId]`. */
|
|
20
|
+
readonly model: UsePersistedModelReturn;
|
|
21
|
+
/** Currently selected agent reference (derived from session, or overridden by user). */
|
|
22
|
+
readonly agentRef: ResourceRef | null;
|
|
23
|
+
/** Update the agent reference for future follow-ups. */
|
|
24
|
+
readonly setAgentRef: (ref: ResourceRef | null) => void;
|
|
25
|
+
/** Current agent resolution state. */
|
|
26
|
+
readonly resolution: AgentResolution | null;
|
|
27
|
+
/** Update the agent resolution. */
|
|
28
|
+
readonly setResolution: (r: AgentResolution | null) => void;
|
|
29
|
+
/** Active MCP server configurations for follow-ups. */
|
|
30
|
+
readonly mcpServerUsages: McpServerUsageInput[];
|
|
31
|
+
/** Update MCP server configurations. */
|
|
32
|
+
readonly setMcpServerUsages: (usages: McpServerUsageInput[]) => void;
|
|
33
|
+
/** Active skill references for follow-ups. */
|
|
34
|
+
readonly skillRefs: ResourceRef[];
|
|
35
|
+
/** Update skill references. */
|
|
36
|
+
readonly setSkillRefs: (refs: ResourceRef[]) => void;
|
|
37
|
+
/** Workspace entries manager (synced from session on load). */
|
|
38
|
+
readonly workspace: UseWorkspaceEntriesReturn;
|
|
39
|
+
/** Session variables (per-execution secrets) manager. */
|
|
40
|
+
readonly sessionVariables: UseSessionVariablesReturn;
|
|
41
|
+
/**
|
|
42
|
+
* Submit a follow-up message. Handles agent override resolution
|
|
43
|
+
* (if the user changed the agent mid-session) and delegates to
|
|
44
|
+
* `conv.sendFollowUp` with all managed state.
|
|
45
|
+
*/
|
|
46
|
+
readonly handleSubmit: (message: string, model?: string, context?: SessionComposerSubmitContext) => Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* The most relevant execution for sidebar display — the active
|
|
49
|
+
* streaming execution, or the last completed one.
|
|
50
|
+
*/
|
|
51
|
+
readonly displayExecution: UseSessionConversationReturn["activeStreamExecution"];
|
|
52
|
+
/**
|
|
53
|
+
* All executions for widget display (completed + active stream).
|
|
54
|
+
*/
|
|
55
|
+
readonly allExecutions: UseSessionConversationReturn["completedExecutions"];
|
|
56
|
+
/**
|
|
57
|
+
* Sandbox workspace root for file path normalization, or `undefined`
|
|
58
|
+
* when the session has no git-repo workspace entries.
|
|
59
|
+
*/
|
|
60
|
+
readonly sandboxWorkspaceRoot: string | undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Orchestrates the session page experience.
|
|
64
|
+
*
|
|
65
|
+
* Composes `useSessionConversation` with agent resolution, workspace
|
|
66
|
+
* synchronization, model persistence, and follow-up submission logic.
|
|
67
|
+
* Returns everything a session page needs to render its UI without
|
|
68
|
+
* duplicating domain orchestration.
|
|
69
|
+
*
|
|
70
|
+
* Framework-agnostic — works identically in Next.js, Vite, Tauri, or
|
|
71
|
+
* any React environment. The consumer provides layout, error states,
|
|
72
|
+
* and loading skeletons.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```tsx
|
|
76
|
+
* const flow = useSessionPageFlow({ sessionId: "ses_abc", org: "acme" });
|
|
77
|
+
*
|
|
78
|
+
* if (flow.conv.isLoading) return <Spinner />;
|
|
79
|
+
* if (flow.conv.loadError) return <ErrorView error={flow.conv.loadError} />;
|
|
80
|
+
*
|
|
81
|
+
* return (
|
|
82
|
+
* <>
|
|
83
|
+
* <MessageThread
|
|
84
|
+
* executions={flow.conv.completedExecutions}
|
|
85
|
+
* activeStreamExecution={flow.conv.activeStreamExecution}
|
|
86
|
+
* sandboxWorkspaceRoot={flow.sandboxWorkspaceRoot}
|
|
87
|
+
* />
|
|
88
|
+
* <SessionComposer
|
|
89
|
+
* onSubmit={flow.handleSubmit}
|
|
90
|
+
* isSubmitting={flow.conv.isSending}
|
|
91
|
+
* disabled={!flow.conv.canSendFollowUp}
|
|
92
|
+
* workspace={flow.workspace}
|
|
93
|
+
* agentRef={flow.agentRef}
|
|
94
|
+
* onAgentRefChange={flow.setAgentRef}
|
|
95
|
+
* onAgentResolutionChange={flow.setResolution}
|
|
96
|
+
* defaultModelId={flow.model[0]}
|
|
97
|
+
* onModelChange={flow.model[1]}
|
|
98
|
+
* />
|
|
99
|
+
* </>
|
|
100
|
+
* );
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export declare function useSessionPageFlow(options: UseSessionPageFlowOptions): UseSessionPageFlowReturn;
|
|
104
|
+
//# sourceMappingURL=useSessionPageFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSessionPageFlow.d.ts","sourceRoot":"","sources":["../../src/session/useSessionPageFlow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AACvG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAA0B,KAAK,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAErG,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAQtF,8CAA8C;AAC9C,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACvC,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAE5C,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IAExC,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IACtC,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACxD,sCAAsC;IACtC,QAAQ,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,mCAAmC;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAE5D,uDAAuD;IACvD,QAAQ,CAAC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IAChD,wCAAwC;IACxC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAErE,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAErD,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9C,yDAAyD;IACzD,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;IAErD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,CACrB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,4BAA4B,CAAC,uBAAuB,CAAC,CAAC;IAEjF;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;IAE5E;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;CACnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CAmJ1B"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { useDefaultAgent } from "../agent";
|
|
4
|
+
import { useStigmer } from "../hooks";
|
|
5
|
+
import { useWorkspaceEntries } from "../workspace";
|
|
6
|
+
import { useSessionVariables } from "../execution/useSessionVariables";
|
|
7
|
+
import { useSessionConversation } from "./useSessionConversation";
|
|
8
|
+
import { useAgentRefFromSession } from "./useAgentRefFromSession";
|
|
9
|
+
import { usePersistedModel } from "./usePersistedModel";
|
|
10
|
+
/**
|
|
11
|
+
* Well-known Daytona sandbox workspace root. Used as the SDK safety-net
|
|
12
|
+
* normalization target for cloud sessions (git-repo workspace entries).
|
|
13
|
+
*/
|
|
14
|
+
const DAYTONA_WORKSPACE_ROOT = "/home/daytona/workspace";
|
|
15
|
+
/**
|
|
16
|
+
* Orchestrates the session page experience.
|
|
17
|
+
*
|
|
18
|
+
* Composes `useSessionConversation` with agent resolution, workspace
|
|
19
|
+
* synchronization, model persistence, and follow-up submission logic.
|
|
20
|
+
* Returns everything a session page needs to render its UI without
|
|
21
|
+
* duplicating domain orchestration.
|
|
22
|
+
*
|
|
23
|
+
* Framework-agnostic — works identically in Next.js, Vite, Tauri, or
|
|
24
|
+
* any React environment. The consumer provides layout, error states,
|
|
25
|
+
* and loading skeletons.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* const flow = useSessionPageFlow({ sessionId: "ses_abc", org: "acme" });
|
|
30
|
+
*
|
|
31
|
+
* if (flow.conv.isLoading) return <Spinner />;
|
|
32
|
+
* if (flow.conv.loadError) return <ErrorView error={flow.conv.loadError} />;
|
|
33
|
+
*
|
|
34
|
+
* return (
|
|
35
|
+
* <>
|
|
36
|
+
* <MessageThread
|
|
37
|
+
* executions={flow.conv.completedExecutions}
|
|
38
|
+
* activeStreamExecution={flow.conv.activeStreamExecution}
|
|
39
|
+
* sandboxWorkspaceRoot={flow.sandboxWorkspaceRoot}
|
|
40
|
+
* />
|
|
41
|
+
* <SessionComposer
|
|
42
|
+
* onSubmit={flow.handleSubmit}
|
|
43
|
+
* isSubmitting={flow.conv.isSending}
|
|
44
|
+
* disabled={!flow.conv.canSendFollowUp}
|
|
45
|
+
* workspace={flow.workspace}
|
|
46
|
+
* agentRef={flow.agentRef}
|
|
47
|
+
* onAgentRefChange={flow.setAgentRef}
|
|
48
|
+
* onAgentResolutionChange={flow.setResolution}
|
|
49
|
+
* defaultModelId={flow.model[0]}
|
|
50
|
+
* onModelChange={flow.model[1]}
|
|
51
|
+
* />
|
|
52
|
+
* </>
|
|
53
|
+
* );
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function useSessionPageFlow(options) {
|
|
57
|
+
const { sessionId, org } = options;
|
|
58
|
+
const stigmer = useStigmer();
|
|
59
|
+
const conv = useSessionConversation(sessionId, org);
|
|
60
|
+
const model = usePersistedModel();
|
|
61
|
+
const [modelId] = model;
|
|
62
|
+
const workspace = useWorkspaceEntries();
|
|
63
|
+
const sessionVariables = useSessionVariables();
|
|
64
|
+
const [mcpServerUsages, setMcpServerUsages] = useState([]);
|
|
65
|
+
const [skillRefs, setSkillRefs] = useState([]);
|
|
66
|
+
const initialSyncDone = useRef(false);
|
|
67
|
+
// -------------------------------------------------------------------------
|
|
68
|
+
// Agent — derive from session, allow mid-session changes
|
|
69
|
+
// -------------------------------------------------------------------------
|
|
70
|
+
const sessionInstanceId = conv.session?.spec?.agentInstanceId ?? null;
|
|
71
|
+
const { agentRef: derivedAgentRef } = useAgentRefFromSession(sessionInstanceId);
|
|
72
|
+
const { agent: defaultAgent, isLoading: isDefaultAgentLoading } = useDefaultAgent(org);
|
|
73
|
+
const [agentRef, setAgentRef] = useState(null);
|
|
74
|
+
const [resolution, setResolution] = useState(null);
|
|
75
|
+
const [agentInitDone, setAgentInitDone] = useState(false);
|
|
76
|
+
if (!agentInitDone && derivedAgentRef && sessionInstanceId && !isDefaultAgentLoading) {
|
|
77
|
+
setAgentInitDone(true);
|
|
78
|
+
const isDefault = defaultAgent &&
|
|
79
|
+
derivedAgentRef.org === defaultAgent.metadata?.org &&
|
|
80
|
+
derivedAgentRef.slug === defaultAgent.metadata?.slug;
|
|
81
|
+
if (!isDefault) {
|
|
82
|
+
setAgentRef(derivedAgentRef);
|
|
83
|
+
setResolution({ mode: "saved", instanceId: sessionInstanceId });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
// Workspace — sync entries from session on first load
|
|
88
|
+
// -------------------------------------------------------------------------
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (!conv.session || initialSyncDone.current)
|
|
91
|
+
return;
|
|
92
|
+
initialSyncDone.current = true;
|
|
93
|
+
const protoEntries = conv.session.spec?.workspaceEntries ?? [];
|
|
94
|
+
for (const entry of protoEntries) {
|
|
95
|
+
if (entry.source?.source.case === "gitRepo") {
|
|
96
|
+
const { url, branch } = entry.source.source.value;
|
|
97
|
+
workspace.addGitRepo(url, branch || undefined);
|
|
98
|
+
}
|
|
99
|
+
else if (entry.source?.source.case === "localPath") {
|
|
100
|
+
workspace.addLocalPath(entry.source.source.value.path);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}, [conv.session, workspace]);
|
|
104
|
+
// -------------------------------------------------------------------------
|
|
105
|
+
// Follow-up submission with agent override
|
|
106
|
+
// -------------------------------------------------------------------------
|
|
107
|
+
const handleSubmit = useCallback(async (message, selectedModel, context) => {
|
|
108
|
+
let agentInstanceIdOverride;
|
|
109
|
+
if (resolution) {
|
|
110
|
+
if (resolution.mode === "saved" &&
|
|
111
|
+
resolution.instanceId !== sessionInstanceId) {
|
|
112
|
+
agentInstanceIdOverride = resolution.instanceId;
|
|
113
|
+
}
|
|
114
|
+
else if (resolution.mode === "direct" && agentRef) {
|
|
115
|
+
const agent = await stigmer.agent.getByReference(agentRef);
|
|
116
|
+
const defaultId = agent.status?.defaultInstanceId;
|
|
117
|
+
if (defaultId && defaultId !== sessionInstanceId) {
|
|
118
|
+
agentInstanceIdOverride = defaultId;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
conv.sendFollowUp(message, {
|
|
123
|
+
agentInstanceId: agentInstanceIdOverride,
|
|
124
|
+
modelName: selectedModel ?? modelId,
|
|
125
|
+
workspaceEntries: workspace.hasEntries
|
|
126
|
+
? workspace.toInput()
|
|
127
|
+
: undefined,
|
|
128
|
+
mcpServerUsages: mcpServerUsages.length > 0 ? mcpServerUsages : undefined,
|
|
129
|
+
skillRefs: skillRefs.length > 0 ? skillRefs : undefined,
|
|
130
|
+
runtimeEnv: context?.runtimeEnv,
|
|
131
|
+
attachments: context?.attachments,
|
|
132
|
+
});
|
|
133
|
+
sessionVariables.clear();
|
|
134
|
+
}, [conv, modelId, workspace, mcpServerUsages, skillRefs, sessionVariables, resolution, agentRef, sessionInstanceId, stigmer]);
|
|
135
|
+
// -------------------------------------------------------------------------
|
|
136
|
+
// Derived display state
|
|
137
|
+
// -------------------------------------------------------------------------
|
|
138
|
+
const displayExecution = useMemo(() => {
|
|
139
|
+
if (conv.activeStreamExecution)
|
|
140
|
+
return conv.activeStreamExecution;
|
|
141
|
+
const completed = conv.completedExecutions;
|
|
142
|
+
return completed.length > 0 ? completed[completed.length - 1] : null;
|
|
143
|
+
}, [conv.activeStreamExecution, conv.completedExecutions]);
|
|
144
|
+
const allExecutions = useMemo(() => [
|
|
145
|
+
...conv.completedExecutions,
|
|
146
|
+
...(conv.activeStreamExecution ? [conv.activeStreamExecution] : []),
|
|
147
|
+
], [conv.completedExecutions, conv.activeStreamExecution]);
|
|
148
|
+
const sandboxWorkspaceRoot = useMemo(() => {
|
|
149
|
+
const entries = conv.workspaceEntries;
|
|
150
|
+
const hasGitRepo = entries.some((e) => e.source?.source.case === "gitRepo");
|
|
151
|
+
return hasGitRepo ? DAYTONA_WORKSPACE_ROOT : undefined;
|
|
152
|
+
}, [conv.workspaceEntries]);
|
|
153
|
+
return {
|
|
154
|
+
conv,
|
|
155
|
+
model,
|
|
156
|
+
agentRef,
|
|
157
|
+
setAgentRef,
|
|
158
|
+
resolution,
|
|
159
|
+
setResolution,
|
|
160
|
+
mcpServerUsages,
|
|
161
|
+
setMcpServerUsages,
|
|
162
|
+
skillRefs,
|
|
163
|
+
setSkillRefs,
|
|
164
|
+
workspace,
|
|
165
|
+
sessionVariables,
|
|
166
|
+
handleSubmit,
|
|
167
|
+
displayExecution,
|
|
168
|
+
allExecutions,
|
|
169
|
+
sandboxWorkspaceRoot,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=useSessionPageFlow.js.map
|