@xenosystem/agent-interface-ui 0.1.15 → 0.1.17

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.
@@ -12,11 +12,13 @@ export type Workspace = WorkspaceStoreWorkspace;
12
12
  export interface AgentInterfaceProps {
13
13
  surface?: 'embedded' | 'standalone-desktop';
14
14
  initialSdkSessionId?: string;
15
+ initialLaunchMode?: 'chat' | 'agent';
16
+ initialWorkspaceRoot?: string;
15
17
  windowControls?: {
16
18
  onMinimize?: XenoAgentWindowAction;
17
19
  onMaximize?: XenoAgentWindowAction;
18
20
  onClose?: XenoAgentWindowAction;
19
21
  };
20
22
  }
21
- export default function AgentInterface({ surface, initialSdkSessionId, windowControls, }?: AgentInterfaceProps): React.JSX.Element;
23
+ export default function AgentInterface({ surface, initialSdkSessionId, initialLaunchMode, initialWorkspaceRoot, windowControls, }?: AgentInterfaceProps): React.JSX.Element;
22
24
  //# sourceMappingURL=AgentInterface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentInterface.d.ts","sourceRoot":"","sources":["../../../src/components/agent/AgentInterface.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAqFhF,OAAO,EAEL,KAAK,KAAK,IAAI,mBAAmB,EACjC,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,0BAA0B,IAAI,wCAAwC,EAC3E,KAAK,mBAAmB,IAAI,0BAA0B,EACtD,KAAK,IAAI,IAAI,kBAAkB,EAC/B,KAAK,SAAS,IAAI,uBAAuB,EACzC,KAAK,YAAY,IAAI,iBAAiB,EACvC,MAAM,gCAAgC,CAAA;AAmBvC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAA;AAgnF7C,MAAM,MAAM,YAAY,GAAG,0BAA0B,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,0BAA0B,GAAG,wCAAwC,CAAA;AACjF,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAC5C,MAAM,MAAM,KAAK,GAAG,mBAAmB,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,kBAAkB,CAAA;AACrC,MAAM,MAAM,SAAS,GAAG,uBAAuB,CAAA;AAwxE/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,UAAU,GAAG,oBAAoB,CAAA;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,cAAc,CAAC,EAAE;QACf,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAChC,CAAA;CACF;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,OAAoB,EACpB,mBAAmB,EACnB,cAAc,GACf,GAAE,mBAAwB,qBAurL1B"}
1
+ {"version":3,"file":"AgentInterface.d.ts","sourceRoot":"","sources":["../../../src/components/agent/AgentInterface.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAqFhF,OAAO,EAEL,KAAK,KAAK,IAAI,mBAAmB,EACjC,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,iBAAiB,IAAI,+BAA+B,EACzD,KAAK,0BAA0B,IAAI,wCAAwC,EAC3E,KAAK,mBAAmB,IAAI,0BAA0B,EACtD,KAAK,IAAI,IAAI,kBAAkB,EAC/B,KAAK,SAAS,IAAI,uBAAuB,EACzC,KAAK,YAAY,IAAI,iBAAiB,EACvC,MAAM,gCAAgC,CAAA;AAmBvC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAA;AAgnF7C,MAAM,MAAM,YAAY,GAAG,0BAA0B,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,iBAAiB,GAAG,+BAA+B,CAAA;AAC/D,MAAM,MAAM,0BAA0B,GAAG,wCAAwC,CAAA;AACjF,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAC5C,MAAM,MAAM,KAAK,GAAG,mBAAmB,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,kBAAkB,CAAA;AACrC,MAAM,MAAM,SAAS,GAAG,uBAAuB,CAAA;AAwxE/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,UAAU,GAAG,oBAAoB,CAAA;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACpC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE;QACf,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,UAAU,CAAC,EAAE,qBAAqB,CAAA;QAClC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAChC,CAAA;CACF;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,OAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,GACf,GAAE,mBAAwB,qBAuuL1B"}
@@ -3137,7 +3137,7 @@ function waitForSubagentConversationResult(conversationId, timeoutMs) {
3137
3137
  });
3138
3138
  });
3139
3139
  }
3140
- export default function AgentInterface({ surface = 'embedded', initialSdkSessionId, windowControls, } = {}) {
3140
+ export default function AgentInterface({ surface = 'embedded', initialSdkSessionId, initialLaunchMode, initialWorkspaceRoot, windowControls, } = {}) {
3141
3141
  const [settingsPanel, setSettingsPanel] = useState(null);
3142
3142
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
3143
3143
  const [folderPanelOpen, setFolderPanelOpen] = useState(false);
@@ -3242,6 +3242,7 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
3242
3242
  const sessionTabsRestoreAttemptedRef = useRef(false);
3243
3243
  const editorStatusTimerRef = useRef(null);
3244
3244
  const initialSdkSessionHandledRef = useRef(false);
3245
+ const initialLaunchModeHandledRef = useRef(false);
3245
3246
  const terminalDraftSyncTimerRef = useRef(null);
3246
3247
  const lastPersistedEditorStateRef = useRef('');
3247
3248
  const codeAutoIndexKeyRef = useRef('');
@@ -3261,78 +3262,6 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
3261
3262
  const setCenterPaneMode = useAgentIdeStore(s => s.setMode);
3262
3263
  const setAgentIdeHasOpenFiles = useAgentIdeStore(s => s.setHasOpenFiles);
3263
3264
  const authDisplayName = useAuthStore(s => s.user?.display_name);
3264
- useEffect(() => {
3265
- const sessionId = initialSdkSessionId?.trim();
3266
- if (!sessionId || initialSdkSessionHandledRef.current)
3267
- return;
3268
- initialSdkSessionHandledRef.current = true;
3269
- let cancelled = false;
3270
- const openSdkSession = async () => {
3271
- const state = useAgentChatStore.getState();
3272
- const existing = Object.values(state.conversations).find((conversation) => (conversation.sessionUi?.sdkSessionId === sessionId));
3273
- const conversationId = existing?.id || createConversation(MAIN_ASSISTANT_ID);
3274
- setViewMode('inbox');
3275
- setSelectedInboxConversationId(conversationId);
3276
- updateConversation(conversationId, {
3277
- model: MAIN_ASSISTANT_MODEL,
3278
- runtime: createConversationRuntimeBinding({
3279
- selection: runtimeSelectionForSdk('user'),
3280
- model: MAIN_ASSISTANT_MODEL,
3281
- reasoningModel: MAIN_ASSISTANT_MODEL,
3282
- inferenceMode: 'cloud',
3283
- }),
3284
- });
3285
- const attach = getAgentPlatformBridge()?.agent?.attachSdkSession;
3286
- if (!attach) {
3287
- appendMessage(conversationId, {
3288
- role: 'assistant',
3289
- content: `Unable to resume SDK session ${sessionId}: the Agent host session bridge is unavailable.`,
3290
- error: 'Agent host session bridge unavailable',
3291
- hideToolbar: true,
3292
- });
3293
- return;
3294
- }
3295
- try {
3296
- const result = await attach({ conversationId, sessionId });
3297
- if (cancelled)
3298
- return;
3299
- if (!result.success) {
3300
- const message = result.error || 'unknown host error';
3301
- console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
3302
- appendMessage(conversationId, {
3303
- role: 'assistant',
3304
- content: `Unable to resume SDK session ${sessionId}: ${message}`,
3305
- error: message,
3306
- hideToolbar: true,
3307
- });
3308
- return;
3309
- }
3310
- const current = useAgentChatStore.getState().getConversation(conversationId);
3311
- updateConversation(conversationId, {
3312
- sessionUi: {
3313
- ...(current?.sessionUi || {}),
3314
- sdkSessionId: sessionId,
3315
- sdkSessionDir: result.sessionDir,
3316
- sdkSessionHistoryPath: result.sessionHistoryPath,
3317
- },
3318
- });
3319
- }
3320
- catch (error) {
3321
- if (cancelled)
3322
- return;
3323
- const message = error instanceof Error ? error.message : 'unknown host error';
3324
- console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
3325
- appendMessage(conversationId, {
3326
- role: 'assistant',
3327
- content: `Unable to resume SDK session ${sessionId}: ${message}`,
3328
- error: message,
3329
- hideToolbar: true,
3330
- });
3331
- }
3332
- };
3333
- void openSdkSession();
3334
- return () => { cancelled = true; };
3335
- }, [appendMessage, createConversation, initialSdkSessionId, updateConversation]);
3336
3265
  // Dynamic context for system prompt enrichment (fetched from main process)
3337
3266
  const [runtimeContext, setRuntimeContext] = useState(null);
3338
3267
  // Fetch runtime context on mount and every 60 seconds
@@ -4367,6 +4296,118 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
4367
4296
  setSelectedConversationId(conversationId);
4368
4297
  setSelectedInboxConversationId(null);
4369
4298
  }, [setCenterPaneMode, updateConversation]);
4299
+ // Explicit desktop/CLI launch profiles must win over persisted session-tab
4300
+ // restoration. Wait until persisted conversations are loaded, then create and
4301
+ // activate the requested profile so an existing Chat tab cannot make an Agent
4302
+ // launch cosmetic (or vice versa).
4303
+ useEffect(() => {
4304
+ if (!sessionTabsHydrated
4305
+ || !initialLaunchMode
4306
+ || initialSdkSessionId
4307
+ || initialLaunchModeHandledRef.current)
4308
+ return;
4309
+ initialLaunchModeHandledRef.current = true;
4310
+ const conversationId = createConversation(MAIN_ASSISTANT_ID);
4311
+ const workspaceMode = initialLaunchMode === 'agent' && initialWorkspaceRoot ? 'workspace' : 'chat-only';
4312
+ updateConversation(conversationId, {
4313
+ schemaVersion: 3,
4314
+ workspaceMode,
4315
+ rootDirectory: workspaceMode === 'workspace' ? initialWorkspaceRoot : undefined,
4316
+ grantedDirectories: workspaceMode === 'workspace' && initialWorkspaceRoot ? [initialWorkspaceRoot] : [],
4317
+ });
4318
+ activateSessionConversation(conversationId);
4319
+ }, [
4320
+ activateSessionConversation,
4321
+ createConversation,
4322
+ initialLaunchMode,
4323
+ initialSdkSessionId,
4324
+ initialWorkspaceRoot,
4325
+ sessionTabsHydrated,
4326
+ updateConversation,
4327
+ ]);
4328
+ useEffect(() => {
4329
+ const sessionId = initialSdkSessionId?.trim();
4330
+ if (!sessionTabsHydrated || !sessionId || initialSdkSessionHandledRef.current)
4331
+ return;
4332
+ initialSdkSessionHandledRef.current = true;
4333
+ let cancelled = false;
4334
+ const openSdkSession = async () => {
4335
+ const state = useAgentChatStore.getState();
4336
+ const existing = Object.values(state.conversations).find((conversation) => (conversation.sessionUi?.sdkSessionId === sessionId));
4337
+ const conversationId = existing?.id || createConversation(MAIN_ASSISTANT_ID);
4338
+ updateConversation(conversationId, {
4339
+ workspaceMode: initialLaunchMode === 'agent' && initialWorkspaceRoot ? 'workspace' : 'chat-only',
4340
+ rootDirectory: initialLaunchMode === 'agent' ? initialWorkspaceRoot : undefined,
4341
+ grantedDirectories: initialLaunchMode === 'agent' && initialWorkspaceRoot ? [initialWorkspaceRoot] : [],
4342
+ model: MAIN_ASSISTANT_MODEL,
4343
+ runtime: createConversationRuntimeBinding({
4344
+ selection: runtimeSelectionForSdk('user'),
4345
+ model: MAIN_ASSISTANT_MODEL,
4346
+ reasoningModel: MAIN_ASSISTANT_MODEL,
4347
+ inferenceMode: 'cloud',
4348
+ }),
4349
+ });
4350
+ activateSessionConversation(conversationId);
4351
+ const attach = getAgentPlatformBridge()?.agent?.attachSdkSession;
4352
+ if (!attach) {
4353
+ appendMessage(conversationId, {
4354
+ role: 'assistant',
4355
+ content: `Unable to resume SDK session ${sessionId}: the Agent host session bridge is unavailable.`,
4356
+ error: 'Agent host session bridge unavailable',
4357
+ hideToolbar: true,
4358
+ });
4359
+ return;
4360
+ }
4361
+ try {
4362
+ const result = await attach({ conversationId, sessionId });
4363
+ if (cancelled)
4364
+ return;
4365
+ if (!result.success) {
4366
+ const message = result.error || 'unknown host error';
4367
+ console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
4368
+ appendMessage(conversationId, {
4369
+ role: 'assistant',
4370
+ content: `Unable to resume SDK session ${sessionId}: ${message}`,
4371
+ error: message,
4372
+ hideToolbar: true,
4373
+ });
4374
+ return;
4375
+ }
4376
+ const current = useAgentChatStore.getState().getConversation(conversationId);
4377
+ updateConversation(conversationId, {
4378
+ sessionUi: {
4379
+ ...(current?.sessionUi || {}),
4380
+ sdkSessionId: sessionId,
4381
+ sdkSessionDir: result.sessionDir,
4382
+ sdkSessionHistoryPath: result.sessionHistoryPath,
4383
+ },
4384
+ });
4385
+ }
4386
+ catch (error) {
4387
+ if (cancelled)
4388
+ return;
4389
+ const message = error instanceof Error ? error.message : 'unknown host error';
4390
+ console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
4391
+ appendMessage(conversationId, {
4392
+ role: 'assistant',
4393
+ content: `Unable to resume SDK session ${sessionId}: ${message}`,
4394
+ error: message,
4395
+ hideToolbar: true,
4396
+ });
4397
+ }
4398
+ };
4399
+ void openSdkSession();
4400
+ return () => { cancelled = true; };
4401
+ }, [
4402
+ activateSessionConversation,
4403
+ appendMessage,
4404
+ createConversation,
4405
+ initialLaunchMode,
4406
+ initialSdkSessionId,
4407
+ initialWorkspaceRoot,
4408
+ sessionTabsHydrated,
4409
+ updateConversation,
4410
+ ]);
4370
4411
  const createSessionConversation = useCallback(() => {
4371
4412
  const conversationId = createConversation(MAIN_ASSISTANT_ID);
4372
4413
  activateSessionConversation(conversationId);
@@ -4499,6 +4540,8 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
4499
4540
  if (!sessionTabsHydrated || sessionTabsRestoreAttemptedRef.current)
4500
4541
  return;
4501
4542
  sessionTabsRestoreAttemptedRef.current = true;
4543
+ if (initialLaunchMode || initialSdkSessionId?.trim())
4544
+ return;
4502
4545
  if (activeSessionTabId || orderedSessionConversations.length === 0)
4503
4546
  return;
4504
4547
  const mostRecent = [...orderedSessionConversations].sort((left, right) => ((right.sessionTab?.lastActiveAt || 0) - (left.sessionTab?.lastActiveAt || 0)))[0];
@@ -4507,6 +4550,8 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
4507
4550
  }, [
4508
4551
  activateSessionConversation,
4509
4552
  activeSessionTabId,
4553
+ initialLaunchMode,
4554
+ initialSdkSessionId,
4510
4555
  orderedSessionConversations,
4511
4556
  sessionTabsHydrated,
4512
4557
  ]);
@@ -8037,6 +8082,6 @@ export default function AgentInterface({ surface = 'embedded', initialSdkSession
8037
8082
  if (surface !== 'standalone-desktop') {
8038
8083
  return (_jsxs("div", { className: "flex h-full w-full flex-col overflow-hidden", "data-xeno-agent-embedded-shell": "true", children: [_jsx("header", { className: "xeno-chrome-shell xeno-border-subtle h-10 flex-shrink-0 border-b", "data-xeno-agent-session-header": "embedded", "data-xeno-hub-header-style": "true", children: sessionTabsNode }), _jsx("div", { className: "min-h-0 min-w-0 flex-1", children: agentWorkspace })] }));
8039
8084
  }
8040
- return (_jsxs("div", { className: "flex h-full w-full flex-col overflow-hidden", "data-xeno-agent-standalone-shell": "true", children: [_jsx(XenoAgentProductHeader, { centerContent: sessionTabsNode, onMinimize: windowControls?.onMinimize, onMaximize: windowControls?.onMaximize, onClose: windowControls?.onClose }), _jsx("div", { className: "min-h-0 min-w-0 flex-1", children: agentWorkspace })] }));
8085
+ return (_jsxs("div", { className: "flex h-full w-full flex-col overflow-hidden", "data-xeno-agent-standalone-shell": "true", "data-xeno-agent-launch-mode": initialLaunchMode || 'default', children: [_jsx(XenoAgentProductHeader, { title: initialLaunchMode === 'chat' ? 'XENO Chat' : 'XENO Agent', centerContent: sessionTabsNode, onMinimize: windowControls?.onMinimize, onMaximize: windowControls?.onMaximize, onClose: windowControls?.onClose }), _jsx("div", { className: "min-h-0 min-w-0 flex-1", children: agentWorkspace })] }));
8041
8086
  }
8042
8087
  //# sourceMappingURL=AgentInterface.js.map