@xenosystem/agent-interface-ui 0.1.6 → 0.1.8
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/adapters/agentHostPlatformBridge.d.ts.map +1 -1
- package/dist/adapters/agentHostPlatformBridge.js +131 -36
- package/dist/adapters/agentHostPlatformBridge.js.map +1 -1
- package/dist/adapters/xenoAgentHostCatalog.d.ts +1 -1
- package/dist/adapters/xenoAgentHostCatalog.d.ts.map +1 -1
- package/dist/adapters/xenoAgentHostCatalog.js +2 -2
- package/dist/adapters/xenoAgentHostCatalog.js.map +1 -1
- package/dist/components/agent/AIStatusIndicator.js +2 -2
- package/dist/components/agent/AIStatusIndicator.js.map +1 -1
- package/dist/components/agent/AgentInterface.d.ts +2 -2
- package/dist/components/agent/AgentInterface.d.ts.map +1 -1
- package/dist/components/agent/AgentInterface.js +343 -53
- package/dist/components/agent/AgentInterface.js.map +1 -1
- package/dist/components/agent/AgentOnboarding.d.ts +1 -1
- package/dist/components/agent/AgentOnboarding.d.ts.map +1 -1
- package/dist/components/agent/AgentOnboarding.js +1 -1
- package/dist/components/agent/AgentOnboarding.js.map +1 -1
- package/dist/components/agent/AgentView.d.ts +4 -3
- package/dist/components/agent/AgentView.d.ts.map +1 -1
- package/dist/components/agent/AgentView.js +168 -36
- package/dist/components/agent/AgentView.js.map +1 -1
- package/dist/components/agent/AgentWorkbenchCliPanel.d.ts +1 -1
- package/dist/components/agent/AgentWorkbenchCliPanel.d.ts.map +1 -1
- package/dist/components/agent/AgentWorkbenchCliPanel.js +1 -1
- package/dist/components/agent/AgentWorkbenchCliPanel.js.map +1 -1
- package/dist/components/agent/AgentWorkbenchPanel.d.ts +2 -2
- package/dist/components/agent/AgentWorkbenchPanel.d.ts.map +1 -1
- package/dist/components/agent/AgentWorkbenchPanel.js +7 -7
- package/dist/components/agent/AgentWorkbenchPanel.js.map +1 -1
- package/dist/components/agent/AgentWorkspaceBrowserPanel.js +1 -1
- package/dist/components/agent/AgentWorkspaceBrowserPanel.js.map +1 -1
- package/dist/components/agent/AssistantTurnStatusNotice.d.ts +1 -1
- package/dist/components/agent/AssistantTurnStatusNotice.d.ts.map +1 -1
- package/dist/components/agent/FleetPanel.js +1 -1
- package/dist/components/agent/FleetPanel.js.map +1 -1
- package/dist/components/agent/IntakePanel.js +1 -1
- package/dist/components/agent/IntakePanel.js.map +1 -1
- package/dist/components/agent/KnowledgePanel.js +1 -1
- package/dist/components/agent/KnowledgePanel.js.map +1 -1
- package/dist/components/agent/MonacoDiffWorkbenchEditor.d.ts +1 -1
- package/dist/components/agent/MonacoDiffWorkbenchEditor.d.ts.map +1 -1
- package/dist/components/agent/MonacoDiffWorkbenchEditor.js +2 -2
- package/dist/components/agent/MonacoDiffWorkbenchEditor.js.map +1 -1
- package/dist/components/agent/MonacoWorkbenchEditor.d.ts +1 -1
- package/dist/components/agent/MonacoWorkbenchEditor.d.ts.map +1 -1
- package/dist/components/agent/MonacoWorkbenchEditor.js +2 -2
- package/dist/components/agent/MonacoWorkbenchEditor.js.map +1 -1
- package/dist/components/agent/PluginManager.js +1 -1
- package/dist/components/agent/PluginManager.js.map +1 -1
- package/dist/components/agent/RunReviewPanel.js +1 -1
- package/dist/components/agent/RunReviewPanel.js.map +1 -1
- package/dist/components/agent/SessionsPanel.js +1 -1
- package/dist/components/agent/SessionsPanel.js.map +1 -1
- package/dist/components/agent/acp/AcpAgentConfigForm.d.ts +1 -1
- package/dist/components/agent/acp/AcpAgentConfigForm.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpAgentManager.js +12 -12
- package/dist/components/agent/acp/AcpAgentManager.js.map +1 -1
- package/dist/components/agent/acp/AcpAgentTestResultPanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpAgentTestResultPanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpApprovalPanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpApprovalPanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpCertificationPanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpCertificationPanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpProviderManagerPanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpProviderManagerPanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpProviderModelsPanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpProviderModelsPanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpProviderModelsPanel.js +1 -1
- package/dist/components/agent/acp/AcpProviderModelsPanel.js.map +1 -1
- package/dist/components/agent/acp/AcpSupportBundlePanel.d.ts +1 -1
- package/dist/components/agent/acp/AcpSupportBundlePanel.d.ts.map +1 -1
- package/dist/components/agent/acp/AcpSupportBundlePanel.js +1 -1
- package/dist/components/agent/acp/AcpSupportBundlePanel.js.map +1 -1
- package/dist/components/agent/settings/EntitySettingsLayout.d.ts +3 -3
- package/dist/components/agent/settings/EntitySettingsLayout.d.ts.map +1 -1
- package/dist/components/agent/settings/EntitySettingsLayout.js +14 -14
- package/dist/components/agent/settings/EntitySettingsLayout.js.map +1 -1
- package/dist/components/agent/settings/SettingsNavigation.d.ts +1 -1
- package/dist/components/agent/settings/SettingsNavigation.d.ts.map +1 -1
- package/dist/components/agent/settings/SettingsNavigation.js +1 -1
- package/dist/components/agent/settings/SettingsNavigation.js.map +1 -1
- package/dist/components/agent/settings/sections/AccessMembersSection.js +5 -5
- package/dist/components/agent/settings/sections/AccessMembersSection.js.map +1 -1
- package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js +1 -1
- package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js.map +1 -1
- package/dist/components/agent/settings/sections/DangerZoneSection.js +2 -2
- package/dist/components/agent/settings/sections/DangerZoneSection.js.map +1 -1
- package/dist/components/agent/settings/sections/DefaultAgentConfigSection.js +5 -5
- package/dist/components/agent/settings/sections/DefaultAgentConfigSection.js.map +1 -1
- package/dist/components/agent/settings/sections/EnvironmentSecretsSection.js +4 -4
- package/dist/components/agent/settings/sections/EnvironmentSecretsSection.js.map +1 -1
- package/dist/components/agent/settings/sections/ExportBackupSection.js +4 -4
- package/dist/components/agent/settings/sections/ExportBackupSection.js.map +1 -1
- package/dist/components/agent/settings/sections/GeneralSection.js +3 -3
- package/dist/components/agent/settings/sections/GeneralSection.js.map +1 -1
- package/dist/components/agent/settings/sections/IntegrationsSection.js +4 -4
- package/dist/components/agent/settings/sections/IntegrationsSection.js.map +1 -1
- package/dist/components/agent/settings/sections/NotificationsSection.js +3 -3
- package/dist/components/agent/settings/sections/NotificationsSection.js.map +1 -1
- package/dist/components/agent/settings/sections/ResourceLimitsSection.js +2 -2
- package/dist/components/agent/settings/sections/ResourceLimitsSection.js.map +1 -1
- package/dist/components/agent/settings/sections/SecurityComplianceSection.js +4 -4
- package/dist/components/agent/settings/sections/SecurityComplianceSection.js.map +1 -1
- package/dist/components/agent/settings/sections/UsageAnalyticsSection.js +3 -3
- package/dist/components/agent/settings/sections/UsageAnalyticsSection.js.map +1 -1
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.d.ts +3 -3
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.d.ts.map +1 -1
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.js +5 -5
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.js.map +1 -1
- package/dist/components/agent/settings/shared/MembersTable.d.ts +1 -1
- package/dist/components/agent/settings/shared/MembersTable.d.ts.map +1 -1
- package/dist/platformApiTypes.d.ts +49 -0
- package/dist/platformApiTypes.d.ts.map +1 -1
- package/dist/stores/acpAgentStore.js +1 -1
- package/dist/stores/acpAgentStore.js.map +1 -1
- package/dist/stores/agentChatStore.d.ts +26 -9
- package/dist/stores/agentChatStore.d.ts.map +1 -1
- package/dist/stores/agentChatStore.js +195 -58
- package/dist/stores/agentChatStore.js.map +1 -1
- package/dist/stores/agentSearchStore.js +1 -1
- package/dist/stores/agentSearchStore.js.map +1 -1
- package/dist/stores/authStore.js +1 -1
- package/dist/stores/authStore.js.map +1 -1
- package/dist/stores/entitySettingsStore.js +4 -4
- package/dist/stores/entitySettingsStore.js.map +1 -1
- package/dist/stores/permissionStore.d.ts +1 -1
- package/dist/stores/permissionStore.d.ts.map +1 -1
- package/dist/stores/permissionStore.js +1 -1
- package/dist/stores/permissionStore.js.map +1 -1
- package/dist/stores/suggestionStore.js +2 -2
- package/dist/stores/suggestionStore.js.map +1 -1
- package/dist/stores/themeStore.js +1 -1
- package/dist/stores/themeStore.js.map +1 -1
- package/dist/stores/workspaceStore.d.ts +1 -1
- package/dist/stores/workspaceStore.d.ts.map +1 -1
- package/dist/stores/workspaceStore.js +3 -3
- package/dist/stores/workspaceStore.js.map +1 -1
- package/dist/stores/xenoChatStore.js +2 -2
- package/dist/stores/xenoChatStore.js.map +1 -1
- package/dist/utils/acpExecutionAuthority.d.ts +1 -1
- package/dist/utils/acpExecutionAuthority.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1,17 +1,55 @@
|
|
|
1
|
-
import { getAgentPlatformBridge } from '../platformBridge';
|
|
1
|
+
import { getAgentPlatformBridge } from '../platformBridge.js';
|
|
2
2
|
import { create } from 'zustand';
|
|
3
|
-
import { createLegacyAskUserRequestedRuntimeEvent, createLegacyPermissionRequestedRuntimeEvent, createLegacyThinkingRuntimeEvent, createLegacyTextRuntimeEvent, createLegacyToolCompletedRuntimeEvent, createLegacyToolStartedRuntimeEvent, createLegacyTurnCompletedRuntimeEvent, createLegacyTurnFailedRuntimeEvent, } from '../utils/legacyAgentRuntimeEvents';
|
|
4
|
-
import { appendAgentModelContextToSystemPrompt, buildAgentModelContext, } from '../utils/agentModelContext';
|
|
5
|
-
import { resolveHubAcpPromptExecutionContext } from '../utils/acpExecutionAuthority';
|
|
6
|
-
import { buildRuntimeAttachedContextPrompt } from '../utils/agentAttachedContextPrompt';
|
|
7
|
-
import { createConversationRuntimeBinding, migrateConversationRuntimeBinding, } from '../utils/conversationRuntime';
|
|
3
|
+
import { createLegacyAskUserRequestedRuntimeEvent, createLegacyPermissionRequestedRuntimeEvent, createLegacyThinkingRuntimeEvent, createLegacyTextRuntimeEvent, createLegacyToolCompletedRuntimeEvent, createLegacyToolStartedRuntimeEvent, createLegacyTurnCompletedRuntimeEvent, createLegacyTurnFailedRuntimeEvent, } from '../utils/legacyAgentRuntimeEvents.js';
|
|
4
|
+
import { appendAgentModelContextToSystemPrompt, buildAgentModelContext, } from '../utils/agentModelContext.js';
|
|
5
|
+
import { resolveHubAcpPromptExecutionContext } from '../utils/acpExecutionAuthority.js';
|
|
6
|
+
import { buildRuntimeAttachedContextPrompt } from '../utils/agentAttachedContextPrompt.js';
|
|
7
|
+
import { createConversationRuntimeBinding, migrateConversationRuntimeBinding, } from '../utils/conversationRuntime.js';
|
|
8
8
|
const ACP_AGENT_PROMPT_TIMEOUT_MS = 15 * 60_000;
|
|
9
|
+
export function resolveConversationWorkspaceBinding(input) {
|
|
10
|
+
const conversationDirectories = Array.from(new Set([
|
|
11
|
+
input.rootDirectory,
|
|
12
|
+
...(input.grantedDirectories || []),
|
|
13
|
+
].filter((value) => typeof value === 'string' && value.trim().length > 0)));
|
|
14
|
+
if (input.workspaceMode === 'chat-only') {
|
|
15
|
+
return { mode: 'chat-only', allowedDirectories: [], legacyInferred: false };
|
|
16
|
+
}
|
|
17
|
+
if (input.workspaceMode === 'workspace') {
|
|
18
|
+
if (conversationDirectories.length > 0) {
|
|
19
|
+
return {
|
|
20
|
+
mode: 'workspace',
|
|
21
|
+
rootDirectory: input.rootDirectory || conversationDirectories[0],
|
|
22
|
+
allowedDirectories: conversationDirectories,
|
|
23
|
+
legacyInferred: false,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return { mode: 'unselected', allowedDirectories: [], legacyInferred: false };
|
|
27
|
+
}
|
|
28
|
+
if (input.workspaceMode === 'unselected') {
|
|
29
|
+
return { mode: 'unselected', allowedDirectories: [], legacyInferred: false };
|
|
30
|
+
}
|
|
31
|
+
if (conversationDirectories.length > 0) {
|
|
32
|
+
return {
|
|
33
|
+
mode: 'workspace',
|
|
34
|
+
rootDirectory: input.rootDirectory || conversationDirectories[0],
|
|
35
|
+
allowedDirectories: conversationDirectories,
|
|
36
|
+
legacyInferred: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return { mode: 'chat-only', allowedDirectories: [], legacyInferred: true };
|
|
40
|
+
}
|
|
41
|
+
export function resetAcpContinuationForWorkspaceChange(sessionUi) {
|
|
42
|
+
if (!sessionUi)
|
|
43
|
+
return {};
|
|
44
|
+
const { sdkSessionId: _sdkSessionId, sdkSessionDir: _sdkSessionDir, sdkSessionHistoryPath: _sdkSessionHistoryPath, acpSessionId: _acpSessionId, acpAgentConfigId: _acpAgentConfigId, acpAgentConfigFingerprint: _acpAgentConfigFingerprint, acpWorkspaceFingerprint: _acpWorkspaceFingerprint, activeLane: _activeLane, lanes: _lanes, acpLastCompletedRequestId: _acpLastCompletedRequestId, acpBindingUpdatedAt: _acpBindingUpdatedAt, ...rest } = sessionUi;
|
|
45
|
+
return rest;
|
|
46
|
+
}
|
|
9
47
|
function generateId() {
|
|
10
48
|
return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
11
49
|
}
|
|
12
50
|
const MAX_RENDERER_RUNTIME_EVENTS = 5000;
|
|
13
51
|
function logRendererAgentDebug(message, meta) {
|
|
14
|
-
if (!import.meta.env
|
|
52
|
+
if (!import.meta.env?.DEV)
|
|
15
53
|
return;
|
|
16
54
|
try {
|
|
17
55
|
getAgentPlatformBridge()?.debug?.log('AgentRenderer', message, meta);
|
|
@@ -26,7 +64,7 @@ function logRendererAgentDebug(message, meta) {
|
|
|
26
64
|
console.debug(`[AgentRenderer] ${message}`);
|
|
27
65
|
}
|
|
28
66
|
function isLegacyCallbackRuntimeEventCompatibilityEnabled() {
|
|
29
|
-
if (!import.meta.env
|
|
67
|
+
if (!import.meta.env?.DEV)
|
|
30
68
|
return false;
|
|
31
69
|
try {
|
|
32
70
|
return window.localStorage?.getItem('xeno.debug.legacyCallbackRuntimeEvents') === '1';
|
|
@@ -1218,23 +1256,7 @@ function runtimeEventTimestampMs(event) {
|
|
|
1218
1256
|
const parsed = typeof event.timestamp === 'string' ? Date.parse(event.timestamp) : NaN;
|
|
1219
1257
|
return Number.isFinite(parsed) ? parsed : Date.now();
|
|
1220
1258
|
}
|
|
1221
|
-
|
|
1222
|
-
const value = event.acpResumeState;
|
|
1223
|
-
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
1224
|
-
return undefined;
|
|
1225
|
-
const record = value;
|
|
1226
|
-
if (record.schemaVersion !== 1
|
|
1227
|
-
|| typeof record.providerId !== 'string'
|
|
1228
|
-
|| !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(record.providerId)
|
|
1229
|
-
|| typeof record.nativeSessionId !== 'string'
|
|
1230
|
-
|| !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/.test(record.nativeSessionId))
|
|
1231
|
-
return undefined;
|
|
1232
|
-
return {
|
|
1233
|
-
schemaVersion: 1,
|
|
1234
|
-
providerId: record.providerId,
|
|
1235
|
-
nativeSessionId: record.nativeSessionId,
|
|
1236
|
-
};
|
|
1237
|
-
}
|
|
1259
|
+
// Clear nativeSessionId resume state is removed in favor of host lane bindings.
|
|
1238
1260
|
function pruneSessionUiForMessages(sessionUi, messages) {
|
|
1239
1261
|
if (!sessionUi)
|
|
1240
1262
|
return sessionUi;
|
|
@@ -2390,11 +2412,12 @@ function snapshotRunCapabilities(capabilities) {
|
|
|
2390
2412
|
}
|
|
2391
2413
|
function buildCheckpointSnapshot(conv) {
|
|
2392
2414
|
return deepCloneJson({
|
|
2393
|
-
schemaVersion: conv.schemaVersion ||
|
|
2415
|
+
schemaVersion: conv.schemaVersion || 3,
|
|
2394
2416
|
model: conv.model,
|
|
2395
2417
|
runtime: conv.runtime,
|
|
2396
2418
|
workspaceId: conv.workspaceId,
|
|
2397
2419
|
teamId: conv.teamId,
|
|
2420
|
+
workspaceMode: conv.workspaceMode,
|
|
2398
2421
|
rootDirectory: conv.rootDirectory,
|
|
2399
2422
|
grantedDirectories: conv.grantedDirectories || [],
|
|
2400
2423
|
editorState: conv.editorState,
|
|
@@ -2548,15 +2571,17 @@ function removePersistedConversation(id) {
|
|
|
2548
2571
|
function conversationPolicyCaller(conv) {
|
|
2549
2572
|
if (!conv)
|
|
2550
2573
|
return undefined;
|
|
2551
|
-
const
|
|
2552
|
-
|
|
2553
|
-
conv.rootDirectory,
|
|
2554
|
-
|
|
2574
|
+
const workspaceBinding = resolveConversationWorkspaceBinding({
|
|
2575
|
+
workspaceMode: conv.workspaceMode,
|
|
2576
|
+
rootDirectory: conv.rootDirectory,
|
|
2577
|
+
grantedDirectories: conv.grantedDirectories,
|
|
2578
|
+
hasMessages: conv.messages.length > 0,
|
|
2579
|
+
});
|
|
2555
2580
|
return {
|
|
2556
2581
|
workspaceId: conv.workspaceId,
|
|
2557
2582
|
teamId: conv.teamId,
|
|
2558
2583
|
agentId: conv.agentId,
|
|
2559
|
-
allowedDirectories,
|
|
2584
|
+
allowedDirectories: workspaceBinding.allowedDirectories,
|
|
2560
2585
|
};
|
|
2561
2586
|
}
|
|
2562
2587
|
export const useAgentChatStore = create((set, get) => {
|
|
@@ -2798,7 +2823,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
2798
2823
|
const isFirstUserMessage = appendUserMessage && nextMessages.filter(m => m.role === 'user').length === 1;
|
|
2799
2824
|
const updated = {
|
|
2800
2825
|
...conv,
|
|
2801
|
-
schemaVersion:
|
|
2826
|
+
schemaVersion: 3,
|
|
2802
2827
|
model,
|
|
2803
2828
|
runtime,
|
|
2804
2829
|
messages: nextMessages,
|
|
@@ -2936,6 +2961,25 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
2936
2961
|
return base ? `${base}\n\n${context}` : context;
|
|
2937
2962
|
};
|
|
2938
2963
|
const dispatchConversationTurn = (conversationId, agentId, model, content, systemPrompt, options) => {
|
|
2964
|
+
const conversationBeforeTurn = get().conversations[conversationId];
|
|
2965
|
+
const workspaceBinding = resolveConversationWorkspaceBinding({
|
|
2966
|
+
workspaceMode: conversationBeforeTurn?.workspaceMode,
|
|
2967
|
+
rootDirectory: conversationBeforeTurn?.rootDirectory,
|
|
2968
|
+
grantedDirectories: conversationBeforeTurn?.grantedDirectories,
|
|
2969
|
+
inheritedDirectories: options?.allowedDirectories,
|
|
2970
|
+
hasMessages: (conversationBeforeTurn?.messages.length || 0) > 0,
|
|
2971
|
+
});
|
|
2972
|
+
if (workspaceBinding.mode === 'unselected') {
|
|
2973
|
+
get().appendMessage(conversationId, {
|
|
2974
|
+
role: 'assistant',
|
|
2975
|
+
content: 'Choose a project workspace or select Chat only before sending a message.',
|
|
2976
|
+
error: 'Conversation workspace is not selected.',
|
|
2977
|
+
});
|
|
2978
|
+
return;
|
|
2979
|
+
}
|
|
2980
|
+
const turnAllowedDirectories = workspaceBinding.mode === 'workspace'
|
|
2981
|
+
? workspaceBinding.allowedDirectories
|
|
2982
|
+
: [];
|
|
2939
2983
|
const appendUserMessage = options?.appendUserMessage !== false;
|
|
2940
2984
|
const attachments = options?.attachments || [];
|
|
2941
2985
|
const enableThinking = options?.enableThinking !== false;
|
|
@@ -2962,7 +3006,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
2962
3006
|
runtime: deepCloneJson(runtime),
|
|
2963
3007
|
permissionProfile: options?.permissionProfile || 'standard',
|
|
2964
3008
|
capabilities: snapshotRunCapabilities(options?.capabilities),
|
|
2965
|
-
allowedDirectories:
|
|
3009
|
+
allowedDirectories: [...turnAllowedDirectories].sort(),
|
|
2966
3010
|
createdAt: now,
|
|
2967
3011
|
};
|
|
2968
3012
|
const userMsg = appendUserMessage && !options?.existingUserMessageId
|
|
@@ -3003,13 +3047,14 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3003
3047
|
: message));
|
|
3004
3048
|
const isFirstUserMessage = appendUserMessage && updatedMessages.filter(m => m.role === 'user').length === 0;
|
|
3005
3049
|
const updated = {
|
|
3006
|
-
schemaVersion:
|
|
3050
|
+
schemaVersion: 3,
|
|
3007
3051
|
id: conversationId,
|
|
3008
3052
|
agentId,
|
|
3009
3053
|
model,
|
|
3010
3054
|
runtime,
|
|
3011
3055
|
workspaceId: conv?.workspaceId,
|
|
3012
3056
|
teamId: conv?.teamId,
|
|
3057
|
+
workspaceMode: workspaceBinding.mode,
|
|
3013
3058
|
rootDirectory: conv?.rootDirectory,
|
|
3014
3059
|
grantedDirectories: conv?.grantedDirectories || [],
|
|
3015
3060
|
editorState: conv?.editorState,
|
|
@@ -3073,8 +3118,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3073
3118
|
workspaceState: {
|
|
3074
3119
|
rootDirectory: conv?.rootDirectory,
|
|
3075
3120
|
grantedDirectories: Array.from(new Set([
|
|
3076
|
-
...
|
|
3077
|
-
...(conv?.grantedDirectories || []),
|
|
3121
|
+
...turnAllowedDirectories,
|
|
3078
3122
|
])),
|
|
3079
3123
|
activeTasks: conv?.tasks,
|
|
3080
3124
|
checkpoints: conv?.checkpoints?.map((checkpoint) => ({
|
|
@@ -3086,9 +3130,9 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3086
3130
|
const messages = compactedContext.messages;
|
|
3087
3131
|
const modelSystemPrompt = appendRuntimeModelContextToSystemPrompt(appendAgentModelContextToSystemPrompt(systemPrompt, compactedContext.systemPromptContext), model, options?.acpProviderModel, previousAssistantModels);
|
|
3088
3132
|
const mergedAllowedDirectories = Array.from(new Set([
|
|
3089
|
-
...
|
|
3090
|
-
...(conv?.grantedDirectories || [])
|
|
3133
|
+
...turnAllowedDirectories,
|
|
3091
3134
|
]));
|
|
3135
|
+
const agentRunMode = workspaceBinding.mode === 'workspace' ? 'development' : 'chat';
|
|
3092
3136
|
const subagentRunId = conv?.sessionUi?.subagentRunId;
|
|
3093
3137
|
if (subagentRunId)
|
|
3094
3138
|
markSubagentRunStarted(conversationId, requestId);
|
|
@@ -3143,7 +3187,6 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3143
3187
|
: messages;
|
|
3144
3188
|
const resumableAcpBinding = conv?.sessionUi?.acpAgentConfigId === acpAgentConfigId
|
|
3145
3189
|
&& !!conv.sessionUi.acpSessionId
|
|
3146
|
-
&& !!conv.sessionUi.acpSessionResumeState
|
|
3147
3190
|
&& !!conv.sessionUi.acpLastCompletedRequestId
|
|
3148
3191
|
&& !!conv.sessionUi.acpAgentConfigFingerprint
|
|
3149
3192
|
&& !!conv.sessionUi.acpWorkspaceFingerprint;
|
|
@@ -3156,6 +3199,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3156
3199
|
teamId: conv?.teamId,
|
|
3157
3200
|
agentId,
|
|
3158
3201
|
prompt: acpPrompt,
|
|
3202
|
+
workspaceMode: workspaceBinding.mode,
|
|
3159
3203
|
history: replayHistory.map((message) => ({
|
|
3160
3204
|
role: message.role,
|
|
3161
3205
|
content: message.content,
|
|
@@ -3169,7 +3213,6 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3169
3213
|
...(resumableAcpBinding
|
|
3170
3214
|
? {
|
|
3171
3215
|
resumeSessionId: conv?.sessionUi?.acpSessionId,
|
|
3172
|
-
resumeState: conv?.sessionUi?.acpSessionResumeState,
|
|
3173
3216
|
resumeAgentConfigId: conv?.sessionUi?.acpAgentConfigId,
|
|
3174
3217
|
resumeAgentConfigFingerprint: conv?.sessionUi?.acpAgentConfigFingerprint,
|
|
3175
3218
|
resumeWorkspaceFingerprint: conv?.sessionUi?.acpWorkspaceFingerprint,
|
|
@@ -3179,6 +3222,16 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3179
3222
|
caller: conversationPolicyCaller(conv),
|
|
3180
3223
|
});
|
|
3181
3224
|
})().then((result) => {
|
|
3225
|
+
if (result?.hostBinding && result.activeLane) {
|
|
3226
|
+
get().updateConversation(conversationId, {
|
|
3227
|
+
sessionUi: {
|
|
3228
|
+
...(useAgentChatStore.getState().getConversation(conversationId)?.sessionUi || {}),
|
|
3229
|
+
hostBinding: result.hostBinding,
|
|
3230
|
+
activeLane: result.activeLane,
|
|
3231
|
+
lanes: result.lanes || [result.activeLane],
|
|
3232
|
+
},
|
|
3233
|
+
});
|
|
3234
|
+
}
|
|
3182
3235
|
const sawTerminal = appendRuntimeEventsFromEnvelopes(requestId, Array.isArray(result?.events) ? result.events : []);
|
|
3183
3236
|
logRendererAgentDebug('acp.runAgentPrompt resolved', {
|
|
3184
3237
|
requestId,
|
|
@@ -3223,7 +3276,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3223
3276
|
requestId,
|
|
3224
3277
|
conversationId,
|
|
3225
3278
|
providerKind: 'xeno-cloud',
|
|
3226
|
-
mode:
|
|
3279
|
+
mode: agentRunMode,
|
|
3227
3280
|
workspaceId: conv?.workspaceId,
|
|
3228
3281
|
teamId: conv?.teamId,
|
|
3229
3282
|
agentId,
|
|
@@ -3234,6 +3287,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3234
3287
|
enableThinking,
|
|
3235
3288
|
capabilities: options?.capabilities,
|
|
3236
3289
|
permissionProfile: options?.permissionProfile,
|
|
3290
|
+
allowedDirectories: mergedAllowedDirectories,
|
|
3237
3291
|
approvalRules: (options?.approvalRules || []),
|
|
3238
3292
|
contextCompaction: compactedContext.stats,
|
|
3239
3293
|
}).then((result) => {
|
|
@@ -3242,6 +3296,16 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3242
3296
|
success: !!result?.success,
|
|
3243
3297
|
error: result?.error,
|
|
3244
3298
|
});
|
|
3299
|
+
if (result?.hostBinding && result.activeLane) {
|
|
3300
|
+
get().updateConversation(conversationId, {
|
|
3301
|
+
sessionUi: {
|
|
3302
|
+
...(useAgentChatStore.getState().getConversation(conversationId)?.sessionUi || {}),
|
|
3303
|
+
hostBinding: result.hostBinding,
|
|
3304
|
+
activeLane: result.activeLane,
|
|
3305
|
+
lanes: result.lanes || [result.activeLane],
|
|
3306
|
+
},
|
|
3307
|
+
});
|
|
3308
|
+
}
|
|
3245
3309
|
if (!result?.success) {
|
|
3246
3310
|
get().setStreamError(requestId, result?.error || 'Cloud agent run failed to start.');
|
|
3247
3311
|
}
|
|
@@ -3280,6 +3344,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3280
3344
|
workspaceId: conv?.workspaceId,
|
|
3281
3345
|
teamId: conv?.teamId,
|
|
3282
3346
|
agentId,
|
|
3347
|
+
mode: agentRunMode,
|
|
3283
3348
|
model,
|
|
3284
3349
|
messages,
|
|
3285
3350
|
systemPrompt: sdkSystemPrompt,
|
|
@@ -3297,6 +3362,16 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3297
3362
|
success: !!result?.success,
|
|
3298
3363
|
error: result?.error
|
|
3299
3364
|
});
|
|
3365
|
+
if (result?.hostBinding && result.activeLane) {
|
|
3366
|
+
get().updateConversation(conversationId, {
|
|
3367
|
+
sessionUi: {
|
|
3368
|
+
...(useAgentChatStore.getState().getConversation(conversationId)?.sessionUi || {}),
|
|
3369
|
+
hostBinding: result.hostBinding,
|
|
3370
|
+
activeLane: result.activeLane,
|
|
3371
|
+
lanes: result.lanes || [result.activeLane],
|
|
3372
|
+
},
|
|
3373
|
+
});
|
|
3374
|
+
}
|
|
3300
3375
|
if (!result?.success) {
|
|
3301
3376
|
get().setStreamError(requestId, result?.error || 'Agent run failed.');
|
|
3302
3377
|
}
|
|
@@ -3630,13 +3705,14 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3630
3705
|
createConversation: (agentId) => {
|
|
3631
3706
|
const conversationId = generateId();
|
|
3632
3707
|
const conversation = {
|
|
3633
|
-
schemaVersion:
|
|
3708
|
+
schemaVersion: 3,
|
|
3634
3709
|
id: conversationId,
|
|
3635
3710
|
agentId,
|
|
3636
3711
|
tasks: [],
|
|
3637
3712
|
messages: [],
|
|
3638
3713
|
pendingTurns: [],
|
|
3639
3714
|
checkpoints: [],
|
|
3715
|
+
workspaceMode: 'chat-only',
|
|
3640
3716
|
sessionUi: {},
|
|
3641
3717
|
title: 'New conversation',
|
|
3642
3718
|
createdAt: Date.now(),
|
|
@@ -3782,7 +3858,7 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
3782
3858
|
const isFirstUser = message.role === 'user' && conv.messages.filter(m => m.role === 'user').length === 0;
|
|
3783
3859
|
const updated = {
|
|
3784
3860
|
...conv,
|
|
3785
|
-
schemaVersion:
|
|
3861
|
+
schemaVersion: 3,
|
|
3786
3862
|
model: message.model ?? conv.model,
|
|
3787
3863
|
runtime: message.runtime ?? conv.runtime,
|
|
3788
3864
|
messages: [...conv.messages, msg],
|
|
@@ -4041,6 +4117,26 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4041
4117
|
}
|
|
4042
4118
|
},
|
|
4043
4119
|
sendMessage: (conversationId, agentId, model, content, systemPrompt, options) => {
|
|
4120
|
+
const conversation = get().conversations[conversationId];
|
|
4121
|
+
const workspaceBinding = resolveConversationWorkspaceBinding({
|
|
4122
|
+
workspaceMode: conversation?.workspaceMode,
|
|
4123
|
+
rootDirectory: conversation?.rootDirectory,
|
|
4124
|
+
grantedDirectories: conversation?.grantedDirectories,
|
|
4125
|
+
inheritedDirectories: options?.allowedDirectories,
|
|
4126
|
+
hasMessages: (conversation?.messages.length || 0) > 0,
|
|
4127
|
+
});
|
|
4128
|
+
if (workspaceBinding.mode === 'unselected') {
|
|
4129
|
+
get().appendMessage(conversationId, {
|
|
4130
|
+
role: 'assistant',
|
|
4131
|
+
content: 'Choose a project workspace or select Chat only before sending a message.',
|
|
4132
|
+
error: 'Conversation workspace is not selected.',
|
|
4133
|
+
});
|
|
4134
|
+
return;
|
|
4135
|
+
}
|
|
4136
|
+
const scopedOptions = {
|
|
4137
|
+
...options,
|
|
4138
|
+
allowedDirectories: workspaceBinding.mode === 'workspace' ? workspaceBinding.allowedDirectories : [],
|
|
4139
|
+
};
|
|
4044
4140
|
if (get().activeRequestId || findOldestQueuedTurn(get().conversations)) {
|
|
4045
4141
|
logRendererAgentDebug('sendMessage queued', {
|
|
4046
4142
|
conversationId,
|
|
@@ -4048,13 +4144,33 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4048
4144
|
model,
|
|
4049
4145
|
promptPreview: content.slice(0, 200)
|
|
4050
4146
|
});
|
|
4051
|
-
queueConversationTurn(conversationId, agentId, model, content, systemPrompt,
|
|
4147
|
+
queueConversationTurn(conversationId, agentId, model, content, systemPrompt, scopedOptions);
|
|
4052
4148
|
return;
|
|
4053
4149
|
}
|
|
4054
|
-
dispatchConversationTurn(conversationId, agentId, model, content, systemPrompt,
|
|
4150
|
+
dispatchConversationTurn(conversationId, agentId, model, content, systemPrompt, scopedOptions);
|
|
4055
4151
|
},
|
|
4056
4152
|
sendAcpMessage: (conversationId, agentId, acpAgentConfigId, model, content, systemPrompt, options) => {
|
|
4057
|
-
const
|
|
4153
|
+
const conversation = get().conversations[conversationId];
|
|
4154
|
+
const workspaceBinding = resolveConversationWorkspaceBinding({
|
|
4155
|
+
workspaceMode: conversation?.workspaceMode,
|
|
4156
|
+
rootDirectory: conversation?.rootDirectory,
|
|
4157
|
+
grantedDirectories: conversation?.grantedDirectories,
|
|
4158
|
+
inheritedDirectories: options?.allowedDirectories,
|
|
4159
|
+
hasMessages: (conversation?.messages.length || 0) > 0,
|
|
4160
|
+
});
|
|
4161
|
+
if (workspaceBinding.mode === 'unselected') {
|
|
4162
|
+
get().appendMessage(conversationId, {
|
|
4163
|
+
role: 'assistant',
|
|
4164
|
+
content: 'Choose a project workspace or select Chat only before sending a message.',
|
|
4165
|
+
error: 'Conversation workspace is not selected.',
|
|
4166
|
+
});
|
|
4167
|
+
return;
|
|
4168
|
+
}
|
|
4169
|
+
const acpOptions = {
|
|
4170
|
+
...options,
|
|
4171
|
+
acpAgentConfigId,
|
|
4172
|
+
allowedDirectories: workspaceBinding.mode === 'workspace' ? workspaceBinding.allowedDirectories : [],
|
|
4173
|
+
};
|
|
4058
4174
|
if (get().activeRequestId || findOldestQueuedTurn(get().conversations)) {
|
|
4059
4175
|
logRendererAgentDebug('sendAcpMessage queued', {
|
|
4060
4176
|
conversationId,
|
|
@@ -4069,6 +4185,23 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4069
4185
|
dispatchConversationTurn(conversationId, agentId, model, content, systemPrompt, acpOptions);
|
|
4070
4186
|
},
|
|
4071
4187
|
sendDeterministicFileCreate: (conversationId, agentId, model, content, fileCreate, options) => {
|
|
4188
|
+
const conversation = get().conversations[conversationId];
|
|
4189
|
+
const workspaceBinding = resolveConversationWorkspaceBinding({
|
|
4190
|
+
workspaceMode: conversation?.workspaceMode,
|
|
4191
|
+
rootDirectory: conversation?.rootDirectory,
|
|
4192
|
+
grantedDirectories: conversation?.grantedDirectories,
|
|
4193
|
+
inheritedDirectories: options?.allowedDirectories,
|
|
4194
|
+
hasMessages: (conversation?.messages.length || 0) > 0,
|
|
4195
|
+
});
|
|
4196
|
+
if (workspaceBinding.mode !== 'workspace') {
|
|
4197
|
+
get().appendMessage(conversationId, {
|
|
4198
|
+
role: 'assistant',
|
|
4199
|
+
content: 'Choose a project workspace before creating or editing files.',
|
|
4200
|
+
error: 'A project workspace is required for file changes.',
|
|
4201
|
+
});
|
|
4202
|
+
return;
|
|
4203
|
+
}
|
|
4204
|
+
const scopedOptions = { ...options, allowedDirectories: workspaceBinding.allowedDirectories };
|
|
4072
4205
|
if (get().activeRequestId || findOldestQueuedTurn(get().conversations)) {
|
|
4073
4206
|
logRendererAgentDebug('sendDeterministicFileCreate queued', {
|
|
4074
4207
|
conversationId,
|
|
@@ -4078,10 +4211,10 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4078
4211
|
path: fileCreate.path,
|
|
4079
4212
|
selectedDirectory: fileCreate.selectedDirectory
|
|
4080
4213
|
});
|
|
4081
|
-
queueDeterministicFileCreateTurn(conversationId, agentId, model, content, fileCreate,
|
|
4214
|
+
queueDeterministicFileCreateTurn(conversationId, agentId, model, content, fileCreate, scopedOptions);
|
|
4082
4215
|
return;
|
|
4083
4216
|
}
|
|
4084
|
-
dispatchDeterministicFileCreateTurn(conversationId, agentId, model, content, fileCreate,
|
|
4217
|
+
dispatchDeterministicFileCreateTurn(conversationId, agentId, model, content, fileCreate, scopedOptions);
|
|
4085
4218
|
},
|
|
4086
4219
|
appendChunk: (requestId, content, thinking) => {
|
|
4087
4220
|
const conversationId = findConversationIdForRequest(get().conversations, requestId, get().activeConversationId);
|
|
@@ -4203,12 +4336,6 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4203
4336
|
const acpWorkspaceFingerprint = isAcpSessionBindingEvent && typeof eventWithRequest.workspaceFingerprint === 'string'
|
|
4204
4337
|
? eventWithRequest.workspaceFingerprint
|
|
4205
4338
|
: currentSessionUi.acpWorkspaceFingerprint;
|
|
4206
|
-
const eventAcpSessionResumeState = eventWithRequest.type === 'acp.session.completed'
|
|
4207
|
-
? getRuntimeAcpSessionResumeState(eventWithRequest)
|
|
4208
|
-
: undefined;
|
|
4209
|
-
const acpSessionResumeState = eventWithRequest.type === 'acp.session.started'
|
|
4210
|
-
? undefined
|
|
4211
|
-
: eventAcpSessionResumeState || currentSessionUi.acpSessionResumeState;
|
|
4212
4339
|
const acpLastCompletedRequestId = eventWithRequest.type === 'acp.session.completed'
|
|
4213
4340
|
? (getRuntimeEventString(eventWithRequest, 'requestId') || requestId)
|
|
4214
4341
|
: eventWithRequest.type === 'acp.session.failed' || eventWithRequest.type === 'acp.session.cancelled'
|
|
@@ -4239,7 +4366,6 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4239
4366
|
acpAgentConfigId,
|
|
4240
4367
|
acpAgentConfigFingerprint,
|
|
4241
4368
|
acpWorkspaceFingerprint,
|
|
4242
|
-
acpSessionResumeState,
|
|
4243
4369
|
acpLastCompletedRequestId,
|
|
4244
4370
|
acpBindingUpdatedAt: isAcpSessionBindingEvent || eventWithRequest.type === 'acp.session.completed'
|
|
4245
4371
|
? Date.now()
|
|
@@ -4410,7 +4536,11 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4410
4536
|
];
|
|
4411
4537
|
const updated = {
|
|
4412
4538
|
...conv,
|
|
4413
|
-
|
|
4539
|
+
schemaVersion: 3,
|
|
4540
|
+
workspaceMode: 'workspace',
|
|
4541
|
+
rootDirectory: conv.rootDirectory || normalizedDirectory,
|
|
4542
|
+
grantedDirectories,
|
|
4543
|
+
sessionUi: resetAcpContinuationForWorkspaceChange(conv.sessionUi),
|
|
4414
4544
|
};
|
|
4415
4545
|
logRendererAgentDebug('conversation directory granted', {
|
|
4416
4546
|
conversationId,
|
|
@@ -4494,11 +4624,12 @@ export const useAgentChatStore = create((set, get) => {
|
|
|
4494
4624
|
return currentState;
|
|
4495
4625
|
const restored = {
|
|
4496
4626
|
...current,
|
|
4497
|
-
schemaVersion: checkpoint.snapshot.schemaVersion ||
|
|
4627
|
+
schemaVersion: checkpoint.snapshot.schemaVersion || 3,
|
|
4498
4628
|
model: checkpoint.snapshot.model ?? current.model,
|
|
4499
4629
|
runtime: checkpoint.snapshot.runtime ?? current.runtime,
|
|
4500
4630
|
workspaceId: checkpoint.snapshot.workspaceId,
|
|
4501
4631
|
teamId: checkpoint.snapshot.teamId,
|
|
4632
|
+
workspaceMode: checkpoint.snapshot.workspaceMode,
|
|
4502
4633
|
rootDirectory: checkpoint.snapshot.rootDirectory,
|
|
4503
4634
|
grantedDirectories: checkpoint.snapshot.grantedDirectories || [],
|
|
4504
4635
|
editorState: checkpoint.snapshot.editorState,
|
|
@@ -5262,7 +5393,13 @@ export async function loadLocalAgentConversations() {
|
|
|
5262
5393
|
});
|
|
5263
5394
|
loaded[conv.id] = {
|
|
5264
5395
|
...conv,
|
|
5265
|
-
schemaVersion:
|
|
5396
|
+
schemaVersion: 3,
|
|
5397
|
+
workspaceMode: resolveConversationWorkspaceBinding({
|
|
5398
|
+
workspaceMode: conv.workspaceMode,
|
|
5399
|
+
rootDirectory: conv.rootDirectory,
|
|
5400
|
+
grantedDirectories: conv.grantedDirectories,
|
|
5401
|
+
hasMessages: projectedMessages.length > 0,
|
|
5402
|
+
}).mode,
|
|
5266
5403
|
runtime,
|
|
5267
5404
|
model: conv.model || runtime.model,
|
|
5268
5405
|
tasks: rebuildConversationPlanTasks(projectedTasks, projectedMessages) || [],
|