@runfusion/fusion 0.55.0 → 0.56.0
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/bin.js +5785 -1351
- package/dist/client/.vite/manifest.json +321 -321
- package/dist/client/assets/{AgentDetailView-B_VfFSlt.js → AgentDetailView-BPzzEIn1.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-QZhz41AU.js → AgentPermissionPolicyEditor-CqlLF0pf.js} +1 -1
- package/dist/client/assets/{AgentsView-hkhJ8SUq.js → AgentsView-C4uCWzdt.js} +6 -6
- package/dist/client/assets/ChatView-BGV9F2K0.js +6 -0
- package/dist/client/assets/{CommandCenter-B3fAajUO.js → CommandCenter-BhIfVVjz.js} +1 -1
- package/dist/client/assets/{DevServerView-BR0ngFBw.js → DevServerView-Bd86MWUa.js} +1 -1
- package/dist/client/assets/DirectoryPicker-BDe9G84f.js +1 -0
- package/dist/client/assets/{DocumentsView-BnRvIUpa.js → DocumentsView-BkAHMt19.js} +1 -1
- package/dist/client/assets/{EvalsView-Bvx18QyC.js → EvalsView-BxxCVaJ8.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-CKGJcfXI.js → ExperimentalAgentOnboardingModal-7-BD6W1v.js} +1 -1
- package/dist/client/assets/{GoalsView-Bj1yVIiv.js → GoalsView-B3KICwNu.js} +1 -1
- package/dist/client/assets/{InsightsView-DBX8DI60.js → InsightsView-DO8qefU1.js} +2 -2
- package/dist/client/assets/{MemoryView-CqkRH2fa.js → MemoryView-urkPdqTn.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BMMmGWe2.js → PiExtensionsManager-BwVKjJIo.js} +2 -2
- package/dist/client/assets/{PluginManager-C1bdfN2W.js → PluginManager-C-OuqDLa.js} +1 -1
- package/dist/client/assets/{PullRequestView-D0CsXWLl.js → PullRequestView-B4q4X5WV.js} +1 -1
- package/dist/client/assets/{ResearchView-CVgmXAlj.js → ResearchView-DlW6z3sm.js} +1 -1
- package/dist/client/assets/{SecretsView-Bv_gw5Ix.js → SecretsView-C-3eC0KB.js} +1 -1
- package/dist/client/assets/SessionTerminal-DVfyVeS2.js +2 -0
- package/dist/client/assets/SettingsModal-BC_2Y56_.css +1 -0
- package/dist/client/assets/{SettingsModal-D7YgojbV.js → SettingsModal-BzXctrhu.js} +1 -1
- package/dist/client/assets/SettingsModal-qs8w3rov.js +21 -0
- package/dist/client/assets/SetupWizardModal-DDJ8PCkH.js +2 -0
- package/dist/client/assets/{ShadcnColorPicker-DM2fqGwl.js → ShadcnColorPicker-BcD5fZ_P.js} +1 -1
- package/dist/client/assets/{SkillsView-Bb-JTo99.js → SkillsView-DojlvxFh.js} +1 -1
- package/dist/client/assets/TodoView-BKZ07WxZ.js +6 -0
- package/dist/client/assets/WorkflowNodeEditor-BJNbi4_V.js +8 -0
- package/dist/client/assets/{agentSkills-DGFyuKuP.js → agentSkills-NbIIJy87.js} +1 -1
- package/dist/client/assets/app-0jcSCRQr.js +13 -0
- package/dist/client/assets/app-BPzPEE6G.js +13 -0
- package/dist/client/assets/app-BSZU5Uns.js +13 -0
- package/dist/client/assets/app-CEtD1B9K.js +13 -0
- package/dist/client/assets/app-CVyRSEUX.js +13 -0
- package/dist/client/assets/app-DoLz_4Dg.js +13 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-DP7vOyXY.js → architectureDiagram-3BPJPVTR-CJu9RVXs.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-Di9v1pV8.js → blockDiagram-GPEHLZMM-crZsLLTq.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-Dvb8RSfr.js → c4Diagram-AAUBKEIU-D5mmJKvW.js} +1 -1
- package/dist/client/assets/channel-Zfk0yRN2.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-gLcAuGjI.js → chunk-2J33WTMH-BZIDltTX.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-B-B0wjkx.js → chunk-4BX2VUAB-ND_SzhUa.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-XUDeC0Co.js → chunk-55IACEB6-C3n-Nisk.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-1eebiGA2.js → chunk-727SXJPM-DfiPA7wv.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-D9VOB5QS.js → chunk-AQP2D5EJ-CDE0u57Z.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-EFNFEaAz.js → chunk-FMBD7UC4-COR53PTE.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-CbeQailD.js → chunk-ND2GUHAM-CbcTdl7C.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-D55N6EBz.js → chunk-QZHKN3VN-DiB3PReK.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BehQ-wnv.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BehQ-wnv.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-B0zbhkX3.js → cose-bilkent-S5V4N54A-Dg3YVyLX.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BL6peXwl.js → dagre-BM42HDAG-D2bK3gNb.js} +1 -1
- package/dist/client/assets/{dashboard-view-CS1H5SQN.js → dashboard-view-BcbTWSCe.js} +1 -1
- package/dist/client/assets/{dashboard-view-Db3n_W85.js → dashboard-view-t2UfQxck.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-cYKwSHk7.js → diagram-2AECGRRQ-BWT8KaEl.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DHIwTGuM.js → diagram-5GNKFQAL-DWfJlASD.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DfHBJ4aX.js → diagram-KO2AKTUF-DE3hFbLT.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-pWhYmB6Z.js → diagram-LMA3HP47-CYCFeD4B.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-GzWqbi_m.js → diagram-OG6HWLK6-C0C8lEGv.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-CCVm5eiR.js → erDiagram-TEJ5UH35-kSo7RjKA.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-CUTdnU6S.js → flowDiagram-I6XJVG4X-DxRf1SVH.js} +1 -1
- package/dist/client/assets/{folder-open-DOCy9GVC.js → folder-open-DO1rnCxq.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CW4ENJaC.js → ganttDiagram-6RSMTGT7-CGtxSeWq.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-QXXMfSzp.js → gitGraphDiagram-PVQCEYII-BNZv_DFY.js} +1 -1
- package/dist/client/assets/index-BCf32Sgx.css +1 -0
- package/dist/client/assets/index-D7eX7QJk.js +2511 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-CZyHbj0n.js → infoDiagram-5YYISTIA-DailohMo.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Dea84lqZ.js → ishikawaDiagram-YF4QCWOH-Cy3shDZP.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-Db2iKGU5.js → journeyDiagram-JHISSGLW-B1rU18Qx.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CB9loIqR.js → kanban-definition-UN3LZRKU-CRNUDgkO.js} +1 -1
- package/dist/client/assets/{mermaid.core-CoQ8aCb0.js → mermaid.core-Cg0po76i.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-JPb2wF-K.js → mindmap-definition-RKZ34NQL-CEjwlhOe.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-pdZzOreP.js → pieDiagram-4H26LBE5-70T-php2.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Dh9Ids90.js → quadrantDiagram-W4KKPZXB-ChcpRG7l.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-BVPOSvHU.js → requirementDiagram-4Y6WPE33-9Pzb_Cot.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BqSMUpsx.js → sankeyDiagram-5OEKKPKP-Bx6DkeKq.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B8nepQ6X.js → sequenceDiagram-3UESZ5HK-emWPkPv7.js} +1 -1
- package/dist/client/assets/{shield-alert-CtSaIQNY.js → shield-alert-BdAjnDkU.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CQv9RdRp.js → stateDiagram-AJRCARHV-B_X2-VQy.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DvQssSEq.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CAjwM-Z5.js → timeline-definition-PNZ67QCA-CkyhunuI.js} +1 -1
- package/dist/client/assets/{upload-0_pT1euA.js → upload-D9-yuO2D.js} +1 -1
- package/dist/client/assets/{users--1B6mnm8.js → users-B4aebngl.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-BO3Um3rH.js → vennDiagram-CIIHVFJN-8OGD6Vb7.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-BzqJcqDA.js → wardley-L42UT6IY-MnRFGNPm.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Bctxc6_5.js → wardleyDiagram-YWT4CUSO-BAEzb08c.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-CgDuiMFR.js → xychartDiagram-2RQKCTM6-DUxideKC.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +4668 -913
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +47 -3
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/ChatView-B4WnXLYA.js +0 -6
- package/dist/client/assets/DirectoryPicker-BiS41Hca.js +0 -1
- package/dist/client/assets/SessionTerminal-VLdVV3Ji.js +0 -2
- package/dist/client/assets/SettingsModal-4t8rV7rh.css +0 -1
- package/dist/client/assets/SettingsModal-gcrh5EOG.js +0 -21
- package/dist/client/assets/SetupWizardModal-DvmTlFP_.js +0 -2
- package/dist/client/assets/TodoView-bV-7deOh.js +0 -6
- package/dist/client/assets/WorkflowNodeEditor-Ui1q_fFI.js +0 -8
- package/dist/client/assets/app--OM-ul6R.js +0 -13
- package/dist/client/assets/app-BCvqf8qq.js +0 -13
- package/dist/client/assets/app-BZqqEiWR.js +0 -13
- package/dist/client/assets/app-DQeH1UDD.js +0 -13
- package/dist/client/assets/app-FiYwRatp.js +0 -13
- package/dist/client/assets/app-rGdYcsAA.js +0 -13
- package/dist/client/assets/channel-C5g9M3Sk.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-B-wdlvD6.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B-wdlvD6.js +0 -1
- package/dist/client/assets/index-B6ttSchA.js +0 -1336
- package/dist/client/assets/index-CPE2Kwra.css +0 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BZ_mlvie.js +0 -1
|
@@ -289,6 +289,21 @@ interface InReviewStallSignal {
|
|
|
289
289
|
observedAt: string;
|
|
290
290
|
}
|
|
291
291
|
|
|
292
|
+
declare const PLANNER_OVERSEER_STATES: readonly ["idle", "watching", "steering", "recovering", "awaiting-confirmation"];
|
|
293
|
+
type PlannerOverseerState = (typeof PLANNER_OVERSEER_STATES)[number];
|
|
294
|
+
interface PlannerOverseerRuntimeSnapshot {
|
|
295
|
+
state: PlannerOverseerState;
|
|
296
|
+
oversightLevel: PlannerOversightLevel;
|
|
297
|
+
watchedStage?: string;
|
|
298
|
+
signal?: string;
|
|
299
|
+
attemptCount?: number;
|
|
300
|
+
attemptLimit?: number;
|
|
301
|
+
pendingConfirmation?: boolean;
|
|
302
|
+
observedAt?: number;
|
|
303
|
+
reason?: string;
|
|
304
|
+
lastAction?: string;
|
|
305
|
+
}
|
|
306
|
+
|
|
292
307
|
interface ModelPricing {
|
|
293
308
|
inputPer1M: number;
|
|
294
309
|
outputPer1M: number;
|
|
@@ -404,7 +419,7 @@ type AuthMaterialSnapshot = SharedSnapshotEnvelope<{
|
|
|
404
419
|
providerAuth?: Record<string, ProviderAuthEntry>;
|
|
405
420
|
}>;
|
|
406
421
|
|
|
407
|
-
type WorkflowIrNodeKind = "start" | "prompt" | "script" | "gate" | "end" | "hold" | "split" | "join" | "foreach" | "loop" | "optional-group" | "step-review" | "parse-steps" | "code" | "notify" | "merge-gate" | "merge-attempt" | "manual-merge-hold" | "retry-backoff" | "recovery-router" | "branch-group-member-integration" | "branch-group-promotion" | "pr-create" | "pr-respond" | "pr-merge";
|
|
422
|
+
type WorkflowIrNodeKind = "start" | "prompt" | "script" | "gate" | "end" | "hold" | "split" | "join" | "foreach" | "loop" | "optional-group" | "step-review" | "parse-steps" | "code" | "notify" | "merge-gate" | "merge-attempt" | "manual-merge-hold" | "retry-backoff" | "recovery-router" | "branch-group-member-integration" | "branch-group-promotion" | "pr-create" | "pr-respond" | "pr-merge" | "ask-user" | "exit-gate";
|
|
408
423
|
interface WorkflowIrNode {
|
|
409
424
|
id: string;
|
|
410
425
|
kind: WorkflowIrNodeKind;
|
|
@@ -2621,6 +2636,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
2621
2636
|
private pollingInProgress;
|
|
2622
2637
|
private lastKnownModified;
|
|
2623
2638
|
private lastPollTime;
|
|
2639
|
+
private lastArtifactRowId;
|
|
2624
2640
|
private donePauseBackfillDone;
|
|
2625
2641
|
private startupSlimListMemo;
|
|
2626
2642
|
private static readonly STARTUP_SLIM_LIST_MEMO_TTL_MS;
|
|
@@ -2892,6 +2908,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
2892
2908
|
windowMs?: number;
|
|
2893
2909
|
includeArchived?: boolean;
|
|
2894
2910
|
}): Promise<Task[]>;
|
|
2911
|
+
findOpenRevertTaskForSource(sourceTaskId: string): Promise<Task | null>;
|
|
2895
2912
|
private clearNearDuplicateReferencesTo;
|
|
2896
2913
|
private clearNearDuplicateReferencesToFailSoft;
|
|
2897
2914
|
getTasksByAssignedAgent(agentId: string, options?: {
|
|
@@ -2978,6 +2995,9 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
2978
2995
|
size?: "S" | "M" | "L";
|
|
2979
2996
|
reviewLevel?: number;
|
|
2980
2997
|
executionMode?: ExecutionMode | null;
|
|
2998
|
+
plannerOversightLevel?: PlannerOversightLevel | null;
|
|
2999
|
+
awaitingApprovalReason?: Task["awaitingApprovalReason"] | null;
|
|
3000
|
+
approvedPlanFingerprint?: string | null;
|
|
2981
3001
|
mergeRetries?: number;
|
|
2982
3002
|
workflowStepRetries?: number;
|
|
2983
3003
|
stuckKillCount?: number | null;
|
|
@@ -3196,7 +3216,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
3196
3216
|
mimeType: string;
|
|
3197
3217
|
}>;
|
|
3198
3218
|
deleteAttachment(id: string, filename: string): Promise<Task>;
|
|
3199
|
-
appendAgentLog(taskId: string, text: string, type: AgentLogEntry["type"], detail?: string, agent?: AgentLogEntry["agent"]): Promise<void>;
|
|
3219
|
+
appendAgentLog(taskId: string, text: string, type: AgentLogEntry["type"], detail?: string, agent?: AgentLogEntry["agent"], timing?: Pick<AgentLogEntry, "durationMs" | "timeToFirstTokenMs">): Promise<void>;
|
|
3200
3220
|
emitUsageEvent(event: UsageEventInput): boolean;
|
|
3201
3221
|
private flushAgentLogBuffer;
|
|
3202
3222
|
appendAgentLogBatch(entries: Array<{
|
|
@@ -3205,6 +3225,8 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
3205
3225
|
type: AgentLogEntry["type"];
|
|
3206
3226
|
detail?: string;
|
|
3207
3227
|
agent?: AgentLogEntry["agent"];
|
|
3228
|
+
durationMs?: number;
|
|
3229
|
+
timeToFirstTokenMs?: number;
|
|
3208
3230
|
}>): Promise<void>;
|
|
3209
3231
|
addTaskComment(id: string, text: string, author: string): Promise<Task>;
|
|
3210
3232
|
addSteeringComment(id: string, text: string, author?: "user" | "agent", runContext?: RunMutationContext): Promise<Task>;
|
|
@@ -4359,6 +4381,8 @@ interface HandoffToReviewOptions {
|
|
|
4359
4381
|
}
|
|
4360
4382
|
declare const EXECUTION_MODES: readonly ["standard", "fast"];
|
|
4361
4383
|
type ExecutionMode = (typeof EXECUTION_MODES)[number];
|
|
4384
|
+
declare const PLANNER_OVERSIGHT_LEVELS: readonly ["off", "observe", "steer", "autonomous"];
|
|
4385
|
+
type PlannerOversightLevel = (typeof PLANNER_OVERSIGHT_LEVELS)[number];
|
|
4362
4386
|
declare const COMPLETION_DOCUMENTATION_MODES: readonly ["off", "changeset", "changelog"];
|
|
4363
4387
|
type CompletionDocumentationMode = (typeof COMPLETION_DOCUMENTATION_MODES)[number];
|
|
4364
4388
|
declare const THEME_MODES: readonly ["dark", "light", "system"];
|
|
@@ -4625,6 +4649,8 @@ interface AgentLogEntry {
|
|
|
4625
4649
|
type: AgentLogType;
|
|
4626
4650
|
detail?: string;
|
|
4627
4651
|
agent?: AgentRole;
|
|
4652
|
+
durationMs?: number;
|
|
4653
|
+
timeToFirstTokenMs?: number;
|
|
4628
4654
|
}
|
|
4629
4655
|
type ArchiveAgentLogMode = "none" | "compact" | "full";
|
|
4630
4656
|
interface TaskAttachment {
|
|
@@ -5220,8 +5246,12 @@ interface Task {
|
|
|
5220
5246
|
reviewerFallbackRetryCount?: number;
|
|
5221
5247
|
retrySummary?: RetrySummary;
|
|
5222
5248
|
nextRecoveryAt?: string;
|
|
5249
|
+
awaitingApprovalReason?: "release-authorization";
|
|
5250
|
+
approvedPlanFingerprint?: string;
|
|
5223
5251
|
thinkingLevel?: ThinkingLevel;
|
|
5224
5252
|
executionMode?: ExecutionMode;
|
|
5253
|
+
plannerOversightLevel?: PlannerOversightLevel;
|
|
5254
|
+
plannerOverseerState?: PlannerOverseerRuntimeSnapshot;
|
|
5225
5255
|
assignedAgentId?: string;
|
|
5226
5256
|
nodeId?: string;
|
|
5227
5257
|
effectiveNodeId?: string;
|
|
@@ -5318,6 +5348,7 @@ interface TaskCreateInput {
|
|
|
5318
5348
|
githubTracking?: Pick<TaskGithubTracking, "enabled" | "repoOverride">;
|
|
5319
5349
|
reviewLevel?: number;
|
|
5320
5350
|
executionMode?: ExecutionMode;
|
|
5351
|
+
plannerOversightLevel?: PlannerOversightLevel;
|
|
5321
5352
|
}
|
|
5322
5353
|
interface MeshReplicatedTaskCreatePayload {
|
|
5323
5354
|
replicationVersion: 1;
|
|
@@ -5470,11 +5501,20 @@ interface McpServersSettings {
|
|
|
5470
5501
|
enabled?: boolean;
|
|
5471
5502
|
servers?: McpServerDefinition[];
|
|
5472
5503
|
}
|
|
5504
|
+
interface DashboardKeyboardShortcuts {
|
|
5505
|
+
quickChat?: string;
|
|
5506
|
+
terminal?: string;
|
|
5507
|
+
openFiles?: string;
|
|
5508
|
+
openSettings?: string;
|
|
5509
|
+
openCommandCenter?: string;
|
|
5510
|
+
newTask?: string;
|
|
5511
|
+
}
|
|
5473
5512
|
interface GlobalSettings {
|
|
5474
5513
|
themeMode?: ThemeMode;
|
|
5475
5514
|
colorTheme?: ColorTheme;
|
|
5476
5515
|
shadcnCustomColors?: Record<string, string>;
|
|
5477
5516
|
dashboardFontScalePct?: number;
|
|
5517
|
+
dashboardKeyboardShortcuts?: DashboardKeyboardShortcuts;
|
|
5478
5518
|
dismissModalsOnOutsideClick?: boolean;
|
|
5479
5519
|
language?: Locale;
|
|
5480
5520
|
defaultProvider?: string;
|
|
@@ -5641,6 +5681,7 @@ interface ProjectSettings {
|
|
|
5641
5681
|
globalPause?: boolean;
|
|
5642
5682
|
globalPauseReason?: string;
|
|
5643
5683
|
defaultWorkflowId?: string;
|
|
5684
|
+
aiUndoTaskWorkflowId?: string;
|
|
5644
5685
|
enabledBuiltinWorkflowIds?: string[];
|
|
5645
5686
|
approvedWorkflowCliCommands?: string[];
|
|
5646
5687
|
approvedCliAutonomyAdapters?: string[];
|
|
@@ -6046,6 +6087,7 @@ interface ArchivedTaskEntry {
|
|
|
6046
6087
|
size?: "S" | "M" | "L";
|
|
6047
6088
|
reviewLevel?: number;
|
|
6048
6089
|
executionMode?: ExecutionMode;
|
|
6090
|
+
plannerOversightLevel?: PlannerOversightLevel;
|
|
6049
6091
|
prInfo?: PrInfo;
|
|
6050
6092
|
prInfos?: PrInfo[];
|
|
6051
6093
|
issueInfo?: IssueInfo;
|
|
@@ -6079,6 +6121,7 @@ interface ArchivedTaskEntry {
|
|
|
6079
6121
|
validatorModelId?: string;
|
|
6080
6122
|
planningModelProvider?: string;
|
|
6081
6123
|
planningModelId?: string;
|
|
6124
|
+
tokenUsage?: TaskTokenUsage;
|
|
6082
6125
|
breakIntoSubtasks?: boolean;
|
|
6083
6126
|
noCommitsExpected?: boolean;
|
|
6084
6127
|
paused?: boolean;
|
|
@@ -6095,6 +6138,7 @@ interface ArchivedTaskEntry {
|
|
|
6095
6138
|
nextRecoveryAt?: string;
|
|
6096
6139
|
error?: string;
|
|
6097
6140
|
assigneeUserId?: string;
|
|
6141
|
+
mergeDetails?: MergeDetails;
|
|
6098
6142
|
}
|
|
6099
6143
|
type PlanningQuestionType = "text" | "single_select" | "multi_select" | "confirm";
|
|
6100
6144
|
type IsolationMode = "in-process" | "child-process";
|
|
@@ -6484,7 +6528,7 @@ interface PluginActivationInput {
|
|
|
6484
6528
|
activatedAt?: string;
|
|
6485
6529
|
}
|
|
6486
6530
|
type RunAuditDomain = "database" | "git" | "filesystem" | "sandbox";
|
|
6487
|
-
type RunAuditMutationType = "mergeQueue:enqueue" | "mergeQueue:lease-acquired" | "mergeQueue:lease-released" | "mergeQueue:lease-expired" | "task:handoff" | "task:handoff-invariant-violation" | (string & {});
|
|
6531
|
+
type RunAuditMutationType = "mergeQueue:enqueue" | "mergeQueue:lease-acquired" | "mergeQueue:lease-released" | "mergeQueue:lease-expired" | "task:handoff" | "task:handoff-invariant-violation" | "overseer:intervention" | (string & {});
|
|
6488
6532
|
interface RunAuditEventInput {
|
|
6489
6533
|
timestamp?: string;
|
|
6490
6534
|
taskId?: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.56.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
|
|
6
6
|
"homepage": "https://github.com/Runfusion/Fusion#readme",
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{r as s,j as t,b as Xa}from"./vendor-react-SZ_qB27O.js";import{c as qa,aA as et,ay as qe,dN as Os,dO as ts,bV as Dt,dP as zs,aD as ie,dQ as on,dz as vt,dR as Bs,dS as Et,dT as Qa,dA as dn,dM as pt,dU as Ya,dV as Hs,dW as Ja,dX as Za,dY as er,dZ as tr,ai as ya,d_ as nr,az as qn,bC as Us,d$ as sr,e0 as ar,e1 as $n,e2 as rr,e3 as or,e4 as ir,e5 as cr,e6 as lr,e7 as dr,f as un,e8 as ur,e9 as mr,bp as hr,al as fr,bc as cn,a2 as gr,c1 as pr,ea as br,i as vr,eb as wa,ec as yr,dx as wr,W as xr,ed as Cr,ee as Ks,G as Sr,H as Mr,du as On,bv as Qn,o as Zt,I as zn,P as ht,V as kr,bt as Vs,dk as Gs,dj as Rr,X as Ar,aK as Nr,J as Bn,bP as Tr,ef as Hn,eg as Ws,eh as Xs,ei as qs,D as Qs,F as Ys,ej as Er,bN as Js,bQ as jr}from"./index-B6ttSchA.js";import{u as tt}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as Zs}from"./SessionTerminal-VLdVV3Ji.js";import"./vendor-reactflow-CnI7NMXG.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./shield-alert-CtSaIQNY.js";/**
|
|
2
|
-
* @license lucide-react v1.7.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const Dr=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],xa=qa("hash",Dr);function ea(n){const{sessionId:r,tempUserMessageId:i,initialText:g,initialThinking:c,initialToolCalls:d,setStreamingText:b,setStreamingThinking:p,setStreamingToolCalls:o,cancelStreamingFlushesRef:f,addToast:z,onDone:C,onError:M,onFallbackSession:N}=n;let F=g??"",T=c??"",A=d?[...d]:[],W,k=null,ae=null;const V=()=>{k=null,b(F)},ue=()=>{ae=null,p(T)},R=()=>{k!==null&&(cancelAnimationFrame(k),k=null),ae!==null&&(cancelAnimationFrame(ae),ae=null)};return f.current=R,{handlers:{onThinking:U=>{T+=U,ae===null&&(ae=requestAnimationFrame(ue))},onText:U=>{F+=U,k===null&&(k=requestAnimationFrame(V))},onToolStart:U=>{A=[...A,{toolName:U.toolName,args:U.args,isError:!1,status:"running"}],o(A)},onToolEnd:U=>{const X=[...A];for(let _=X.length-1;_>=0;_--){const G=X[_];if(G?.toolName===U.toolName&&G.status==="running"){X[_]={...G,status:"completed",isError:U.isError,result:U.result},A=X,o(X);return}}A=[...X,{toolName:U.toolName,isError:U.isError,result:U.result,status:"completed"}],o(A)},onFallback:U=>{W=U,N?.(U,r),z?.(`Primary model unavailable. Switched to fallback ${U.fallbackModel}.`,"warning")},onDone:U=>{R(),C({messageId:U.messageId,message:U.message,accumulated:{text:F,thinking:T,toolCalls:A,fallbackInfo:W}})},onError:(U,X)=>{R(),M(U,i,X)}},cancelFlushes:R}}const Fr="fusion:chat-pending:";function ns(n){return n?`${Fr}${n}`:null}function Ir(n){const r=ns(n);if(!r||typeof window>"u")return[];try{const i=localStorage.getItem(r);if(!i)return[];try{const c=JSON.parse(i);if(Array.isArray(c))return c.filter(d=>typeof d=="string"&&d.trim().length>0)}catch{}const g=i.trim();return g?[g]:[]}catch{return[]}}function Un(n,r){const i=ns(n);if(!(!i||typeof window>"u"))try{const g=r.filter(c=>c.trim().length>0);if(g.length===0){localStorage.removeItem(i);return}localStorage.setItem(i,JSON.stringify(g))}catch{}}function en(n){const r=ns(n);if(!(!r||typeof window>"u"))try{localStorage.removeItem(r)}catch{}}const Kn="kb-chat-active-session",Pr="task-planner:";function Yn(n){return n.agentId.startsWith(Pr)}function Lr(n){return Yn(n)&&!n.lastMessageAt&&!n.lastMessagePreview}function ta(n){const r=typeof n=="string"?n.trim():"",i=r.indexOf("/");return!r||i<=0||i>=r.length-1?{}:{modelProvider:r.slice(0,i),modelId:r.slice(i+1)}}function _r(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const i=r.map(g=>{if(!g||typeof g!="object")return null;const c=g,d=typeof c.toolName=="string"?c.toolName:"";if(!d)return null;const b=c.args;return{toolName:d,...b&&typeof b=="object"?{args:b}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(g=>g!==null);return i.length>0?i:void 0}function $r(n){const r=n?.fallback;if(!r||typeof r!="object")return;const i=r,g=typeof i.primaryModel=="string"?i.primaryModel:"",c=typeof i.fallbackModel=="string"?i.fallbackModel:"",d=i.triggerPoint;if(!(!g||!c||d!=="session-creation"&&d!=="prompt-time"))return{primaryModel:g,fallbackModel:c,triggerPoint:d}}function Or(n){const r=n?.failureInfo;if(!r||typeof r!="object")return;const i=r,g=typeof i.summary=="string"?i.summary.trim():"";if(!g)return;const c=(()=>{const d=i.reference;if(!d||typeof d!="object")return;const b=d,p=typeof b.kind=="string"?b.kind.trim():"",o=typeof b.id=="string"?b.id.trim():"";if(!(!p||!o))return{kind:p,id:o,...typeof b.label=="string"&&b.label.trim()?{label:b.label.trim()}:{}}})();return{summary:g,...typeof i.errorClass=="string"&&i.errorClass.trim()?{errorClass:i.errorClass.trim()}:{},...typeof i.code=="string"&&i.code.trim()?{code:i.code.trim()}:{},...typeof i.detail=="string"&&i.detail.trim()?{detail:i.detail.trim()}:{},...c?{reference:c}:{}}}function na(n,r){const i="Failed to get response";return typeof n=="string"?{summary:n.trim()||i}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():i,...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...n.reference?{reference:n.reference}:{}}}function tn(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:_r(n.metadata),fallbackInfo:$r(n.metadata),failureInfo:Or(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function sa(n,r){if(n.some(c=>c.id===r.id))return n;const i=n.findIndex(c=>c.role==="user"&&c.id.startsWith("temp-")&&c.sessionId===r.sessionId&&c.content.trim()===r.content.trim());if(i<0)return[...n,r];const g=[...n];return g[i]=r,g}function zr(n,r){const i=s.useCallback(h=>h?`${et.CHAT_SESSIONS_PREFIX}${h}`:null,[]),g=s.useCallback((h,v)=>h&&v?`${et.CHAT_MESSAGES_PREFIX}${h}:${v}`:null,[]),c=s.useCallback(h=>{const v=i(h);return v?(qe(v,{maxAgeMs:Os})??[]).filter($=>!Yn($)):[]},[i]),[d,b]=s.useState(()=>c(n)),[p,o]=s.useState(null),[f,z]=s.useState(()=>c(n).length===0),[C,M]=s.useState([]),[N,F]=s.useState(!1),[T,A]=s.useState(!1),[W,k]=s.useState(""),[ae,V]=s.useState(""),[ue,R]=s.useState([]),[le,U]=s.useState([]),[X,_]=s.useState(""),[G,y]=s.useState(!1),{agentsMap:P}=ts(n),j=s.useRef(null),q=s.useRef(null),S=s.useRef(!1),E=s.useRef([]),D=s.useRef(()=>!1),m=s.useRef(null),I=s.useRef(d),l=s.useRef(p),re=s.useRef(C),O=s.useRef(T);I.current=d,l.current=p,re.current=C,O.current=T,s.useEffect(()=>{E.current=le},[le]);const B=s.useRef(new Set),fe=s.useRef(0),be=s.useRef(n);be.current!==n&&(Dt({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:be.current??null}}),be.current=n,fe.current++);const te=s.useCallback(async()=>{I.current.length===0&&z(!0);try{const v=[...(await zs(n)).sessions].sort(($,se)=>new Date(se.updatedAt).getTime()-new Date($.updatedAt).getTime());b(v);const x=i(n);x&&ie(x,v,{maxBytes:5e5})}catch{const h=c(n);if(I.current.length===0&&h.length===0){const v=i(n);v&&on(v)}}finally{z(!1)}},[i,n]);s.useEffect(()=>{const h=c(n);b(h),z(h.length===0)},[n,c]),s.useEffect(()=>{te()},[te,n]);const ye=s.useRef(()=>{}),we=s.useRef(!1);s.useEffect(()=>{we.current=!1,q.current=null},[n]),s.useEffect(()=>{if(f||we.current||l.current)return;const h=vt(Kn,n);if(!h){we.current=!0;return}const v=d.find(x=>x.id===h);if(v){we.current=!0,ye.current(h,v);return}we.current=!0},[f,d,n]);const Ue=s.useCallback((h,v)=>{const x=g(h,v);return x?qe(x,{maxAgeMs:Os})??[]:[]},[g]),Ke=s.useCallback((h,v)=>{const x=Ue(n,h);return x.length>0?(M(x),F(!1),!0):(v?.clearOnMiss!==!1&&M([]),!1)},[n,Ue]),xe=s.useCallback(async(h,v)=>{const x=typeof v?.offset=="number"&&v.offset>0||typeof v?.before=="string",$=g(n,h),se=x?[]:Ue(n,h),H=se.length>0;!x&&H?(M(se),F(!1)):F(!0);try{const Q=await Bs(h,{limit:50,order:"desc",...v},n),Y=Q.messages.slice().reverse().map(tn),K=l.current?.id===h||v?.commitForStreamingAttach===!0&&q.current?.sessionId===h;x?K&&(M(oe=>[...Y,...oe]),y(Q.messages.length>=50)):K&&(M(Y),y(Q.messages.length>=50),$&&ie($,Y,{maxBytes:5e5}))}catch{!x&&re.current.length===0&&H&&(M(se),F(!1))}finally{F(!1)}},[g,n,Ue]),Fe=s.useCallback(()=>{m.current?.(),m.current=null,E.current=[],U([]),k(""),V(""),R([]),A(!1)},[]),Ft=s.useCallback(h=>{const v=l.current?.id;if(typeof h=="number"){const x=E.current.filter(($,se)=>se!==h);E.current=x,U(x),Un(v,x);return}en(v),E.current=[],U([])},[]),ge=s.useCallback(()=>{const[h,...v]=E.current,x=h?.trim();if(!x)return;const $=l.current?.id;E.current=v,U(v),Un($,v),wt.current(x)},[]),Qe=s.useCallback(async(h,v)=>{try{const{session:x}=await Et(h,n);if(l.current?.id!==h||E.current.length===0)return;if(x.isGenerating||x.inFlightGeneration){D.current(h,x.inFlightGeneration,{silent:v?.silent,priorThreadLoadAlreadyStarted:!0});return}ge()}catch{}},[ge,n]),me=s.useCallback((h,v,x)=>{if(j.current||!h)return!0;S.current=!1;const $=re.current,se=$.length===0||$[0]?.sessionId!==h;q.current={sessionId:h,replayFromEventId:typeof v?.replayFromEventId=="number"?v.replayFromEventId:null},se&&!x?.priorThreadLoadAlreadyStarted&&(Ke(h,{clearOnMiss:!1}),xe(h,{commitForStreamingAttach:!0})),v&&(k(v.streamingText),V(v.streamingThinking),R(v.toolCalls)),A(!0);const{handlers:H}=ea({sessionId:h,tempUserMessageId:"",initialText:v?.streamingText,initialThinking:v?.streamingThinking,initialToolCalls:v?.toolCalls,setStreamingText:k,setStreamingThinking:V,setStreamingToolCalls:R,cancelStreamingFlushesRef:m,addToast:x?.silent?void 0:r,onFallbackSession:(Y,K)=>{const oe=ta(Y.fallbackModel);b(J=>J.map(Z=>Z.id===K?{...Z,...oe}:Z)),o(J=>J&&J.id===K?{...J,...oe}:J)},onDone:()=>{k(""),V(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null,xe(h),ge()},onError:Y=>{k(""),V(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null;const K=na(Y);x?.silent||r?.(K.summary,"error"),xe(h),Qe(h,{silent:x?.silent})}});Dt({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof v?.replayFromEventId=="number",replayFromEventId:v?.replayFromEventId??null,lastEventId:v?.replayFromEventId??null});const Q=Qa(h,H,n,{...typeof v?.replayFromEventId=="number"?{lastEventId:v.replayFromEventId}:{}});return j.current=Q,!0},[r,ge,Qe,Ke,xe,n]);D.current=me;const je=s.useCallback((h,v)=>{const x=l.current?.id??null;if(h&&x===h&&!v)return;j.current&&(j.current.close(),j.current=null),q.current=null;const $=v??d.find(se=>se.id===h);o($||null),l.current=$||null,h&&Et(h,n).then(({session:se})=>{!se.isGenerating||!se.inFlightGeneration||o(H=>!H||H.id!==h?H:{...H,...se})}).catch(()=>{}),Fe(),y(!1),h?(Ke(h),xe(h)):M([]),$?.isGenerating&&me($.id,$.inFlightGeneration,{priorThreadLoadAlreadyStarted:!0}),h?dn(Kn,h,n):pt(Kn,n)},[me,Ke,d,xe,n,Fe]);ye.current=je,s.useEffect(()=>{const h=p?.id;if(!h)return;const v=Ir(h);if(v.length===0)return;E.current=v,U(v);let x=!1;return Et(h,n).then(({session:$})=>{if(!(x||l.current?.id!==h||E.current.length===0)){if($.isGenerating){j.current||me(h,$.inFlightGeneration);return}!O.current&&!j.current&&ge()}}).catch(()=>{}),()=>{x=!0}},[p?.id,me,ge,n]);const yt=s.useCallback(async h=>{const v=l.current?.id,x=await Ya(h,n);j.current&&(j.current.close(),j.current=null),q.current=null;const $={id:x.session.id,title:x.session.title,agentId:x.session.agentId,status:x.session.status,modelProvider:x.session.modelProvider,modelId:x.session.modelId,createdAt:x.session.createdAt,updatedAt:x.session.updatedAt};return b(se=>se.some(H=>H.id===$.id)?se:[$,...se]),en(v),Fe(),je($.id,$),$},[n,Fe,je]),mn=s.useCallback(async h=>{en(h),await Hs(h,{status:"archived"},n),b(v=>v.filter(x=>x.id!==h)),p?.id===h&&(q.current=null,o(null),M([]))},[p,n]),nt=s.useCallback(async(h,v)=>{const x=v.trim()||null,$=d,se=p;b(H=>H.map(Q=>Q.id===h?{...Q,title:x}:Q)),o(H=>H?.id===h?{...H,title:x}:H);try{const Q=(await Hs(h,{title:x},n)).session;b(Y=>Y.map(K=>K.id===h?{...K,title:Q.title,updatedAt:Q.updatedAt}:K)),o(Y=>Y?.id===h?{...Y,title:Q.title,updatedAt:Q.updatedAt}:Y)}catch(H){throw b($),o(se),r?.("Failed to rename conversation","error"),H}},[p,r,n,d]),It=s.useCallback(async h=>{en(h),p?.id===h&&j.current&&(j.current.close(),j.current=null),p?.id===h&&(q.current=null),await Ja(h,n);const v=g(n,h);v&&on(v),b(x=>x.filter($=>$.id!==h)),p?.id===h&&(o(null),M([]))},[p,g,n]),De=s.useCallback(async()=>{if(!p||!G)return;const h=re.current[0]?.createdAt;h&&await xe(p.id,{before:h})},[p,G,xe]),Pt=s.useCallback(()=>{p&&(S.current=!0,m.current?.(),m.current=null,j.current?.close(),j.current=null,q.current=null,Za(p.id,n).catch(()=>{}),A(!1),O.current=!1,k(""),V(""),R([]),ge())},[p,n,ge]),wt=s.useRef(()=>{}),xt=er(),st=s.useCallback(async h=>{try{await te();const v=await Et(h,n);l.current?.id===h&&o(x=>!x||x.id!==h?x:{...x,...v.session}),v.session.isGenerating?(k(""),V(""),R([]),A(!0),O.current=!0,me(h,v.session.inFlightGeneration,{silent:!0})):(k(""),V(""),R([]),A(!1),O.current=!1,await xe(h))}catch{}},[me,xe,n,te]),at=s.useCallback((h,v)=>{if(!p)return;if(O.current){const H=h.trim();if(!H)return;const Q=[...E.current,H];E.current=Q,U(Q),Un(p.id,Q);return}S.current=!1,j.current&&(j.current.close(),j.current=null),q.current=null;const x=`temp-${Date.now()}`,$={id:x,sessionId:p.id,role:"user",content:h,createdAt:new Date().toISOString()};M(H=>[...H,$]),k(""),V(""),R([]),A(!0),O.current=!0;const{handlers:se}=ea({sessionId:p.id,tempUserMessageId:x,setStreamingText:k,setStreamingThinking:V,setStreamingToolCalls:R,cancelStreamingFlushesRef:m,addToast:r,onFallbackSession:(H,Q)=>{const Y=ta(H.fallbackModel);b(K=>K.map(oe=>oe.id===Q?{...oe,...Y}:oe)),o(K=>K&&K.id===Q?{...K,...Y}:K)},onDone:({messageId:H,message:Q,accumulated:Y})=>{const K=Q?{...tn(Q),...Y.text.length>0?{content:Y.text}:{}}:{id:H||`msg-${Date.now()}`,sessionId:p.id,role:"assistant",content:Y.text,thinkingOutput:Y.thinking,toolCalls:Y.toolCalls.length>0?Y.toolCalls:void 0,fallbackInfo:Y.fallbackInfo,createdAt:new Date().toISOString()};B.current.add(K.id),M(oe=>[...oe,K]),k(""),V(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null,setTimeout(()=>{B.current.delete(K.id)},1e3),te(),ge()},onError:(H,Q,Y)=>{const K=na(H),oe=typeof H=="string"?H:K.summary,J=nr(oe),Z=Y?.requestAccepted===!0;M(de=>{const pe=Z?de:de.filter(Me=>Me.id!==Q);return J?pe:[...pe,{id:`error-${Date.now()}`,sessionId:p.id,role:"assistant",content:K.summary,failureInfo:K,createdAt:new Date().toISOString()}]}),k(""),V(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null,console.error("[useChat] Stream error:",H),J?(console.info("[useChat] Suppressed tab-suspension stream error:",H),p?.id&&(k(""),V(""),R([]),A(!0),O.current=!0,st(p.id))):(r?.(K.summary,"error"),Z&&Bs(p.id,{limit:50,order:"desc"},n).then(de=>{if(l.current?.id!==p.id)return;const pe=de.messages.slice().reverse().map(tn);M(Me=>pe.reduce(sa,Me))}).catch(()=>{}),te()),S.current||ge()}});j.current=tr(p.id,h,se,v,n)},[p,n,te,r,me,st,ge]);wt.current=at;const hn=X?d.filter(h=>h.title?.toLowerCase().includes(X.toLowerCase())||h.agentId.toLowerCase().includes(X.toLowerCase())):d;return s.useEffect(()=>{if(!p?.id||p.isGenerating!==!0||j.current)return;const h=typeof p.inFlightGeneration?.replayFromEventId=="number"?p.inFlightGeneration.replayFromEventId:null,v=q.current;v?.sessionId===p.id&&v.replayFromEventId===h||me(p.id,p.inFlightGeneration,{silent:!0})},[p?.id,p?.isGenerating,p?.inFlightGeneration,me]),s.useEffect(()=>{if(!l.current?.isGenerating||(j.current||me(l.current.id,l.current.inFlightGeneration),!O.current||j.current||!l.current))return;const h=setInterval(async()=>{if(!O.current||j.current||!l.current){clearInterval(h);return}try{(await zs(n)).sessions.find($=>$.id===l.current?.id)?.isGenerating||(clearInterval(h),await xe(l.current.id),k(""),V(""),R([]),A(!1),O.current=!1,ge())}catch{}},3e3);return()=>clearInterval(h)},[me,xe,n,p,ge]),s.useEffect(()=>xt.onBecameVisible(()=>{const v=l.current;if(!v||j.current)return;const x=fe.current;Et(v.id,n).then($=>{if(!(fe.current!==x||j.current)){if($.session.isGenerating){k(""),V(""),R([]),A(!0),O.current=!0,me(v.id,$.session.inFlightGeneration,{silent:!0});return}O.current&&(k(""),V(""),R([]),A(!1),O.current=!1,ge(),xe(v.id))}}).catch(()=>{})}),[me,xe,n,xt,ge]),s.useEffect(()=>{const h=fe.current,v=n?`?projectId=${encodeURIComponent(n)}`:"",x=()=>fe.current!==h,$=oe=>{if(x())return;const J=JSON.parse(oe.data);if(Yn(J)){Lr(J)||te();return}b(Z=>Z.some(de=>de.id===J.id)?Z:[J,...Z])},se=oe=>{if(x())return;const J=JSON.parse(oe.data);b(Z=>[...Z.map(pe=>pe.id===J.id?J:pe)]),l.current?.id===J.id&&(o(J),J.isGenerating&&!j.current&&me(J.id,J.inFlightGeneration))},H=oe=>{if(x())return;const{id:J}=JSON.parse(oe.data);b(de=>de.filter(pe=>pe.id!==J));const Z=g(n,J);Z&&on(Z),l.current?.id===J&&(o(null),M([]))},Q=oe=>{if(x())return;const J=JSON.parse(oe.data),Z=tn(J);if(I.current.some(de=>de.id===Z.sessionId)||te(),!B.current.has(Z.id)){if(l.current?.id===Z.sessionId&&O.current&&!j.current&&Z.role==="assistant"){M(de=>de.some(pe=>pe.id===Z.id)?de:[...de,Z]),k(""),V(""),R([]),A(!1),O.current=!1,ge();return}l.current?.id===Z.sessionId&&!O.current&&M(de=>de.some(pe=>pe.id===Z.id)?de:Z.role==="user"?sa(de,Z):[...de,Z])}},Y=oe=>{if(x())return;const{id:J}=JSON.parse(oe.data);M(Z=>Z.filter(de=>de.id!==J))};return ya(`/api/events${v}`,{events:{"chat:session:created":$,"chat:session:updated":se,"chat:session:deleted":H,"chat:message:added":Q,"chat:message:deleted":Y}})},[me,g,n,ge,te]),s.useEffect(()=>()=>{j.current&&(j.current.close(),j.current=null),q.current=null},[]),{sessions:d,activeSession:p,sessionsLoading:f,messages:C,messagesLoading:N,isStreaming:T,streamingText:W,streamingThinking:ae,streamingToolCalls:ue,pendingMessages:le,selectSession:je,createSession:yt,archiveSession:mn,renameSession:nt,deleteSession:It,sendMessage:at,stopStreaming:Pt,clearPendingMessage:Ft,loadMoreMessages:De,hasMoreMessages:G,searchQuery:X,setSearchQuery:_,filteredSessions:hn,refreshSessions:te,agentsMap:P}}function nn(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function Br(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function Vn(n,r){const i=Br(),g=r?.warm===!0,c=nn(),d=new Map;let b=!1,p=!1;return{mark(f){b||p||!i||d.has(f)||d.set(f,nn())},complete:f=>{if(!i||b||p){b=!0;return}b=!0,d.set("complete",nn());const z=Array.from(d.entries()).sort((F,T)=>F[1]-T[1]);let C=c;const M={};for(const[F,T]of z)M[F]=Math.max(0,T-C),C=T;const N=Math.max(0,nn()-c);try{console.debug("[room-open]",{roomId:n,warm:g,totalMs:N,phases:M,...f??{}})}catch{}},cancel(){p=!0,b=!0}}}const Xe="fusion:chat-active-room";class Ca extends Error{roomId;constructor(r,i){super(r),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=i}}function Jn(n){return[...n].sort((r,i)=>new Date(i.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function ft(n,r){const i=n.findIndex(c=>c.id===r.id);if(i===-1)return Jn([r,...n]);const g=[...n];return g[i]=r,Jn(g)}function He(n){try{return JSON.parse(n.data)}catch{return null}}function Hr(n,r,i){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:n,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...i?.length?{attachments:i}:{},createdAt:new Date().toISOString()}}function aa(n,r,i){if(n.some(c=>c.id===r.id))return n;const g=i?n.findIndex(c=>c.id===i):-1;if(g>=0){const c=[...n];return c[g]=r,c}if(r.role==="user"){const c=n.findIndex(d=>d.role==="user"&&d.id.startsWith("temp-")&&d.content.trim()===r.content.trim());if(c>=0){const d=[...n];return d[c]=r,d}}return[...n,r]}function Ur(n,r){const{t:i}=tt("app"),g=`${et.CHAT_ROOMS}:${n??"global"}`,c=`${et.ACTIVE_CHAT_ROOM_ID}:${n??"global"}`,d=s.useCallback(S=>`${et.CHAT_ROOM_MESSAGES_PREFIX}${n??"global"}:${S}`,[n]),b=s.useCallback(S=>`${et.CHAT_ROOM_MEMBERS_PREFIX}${n??"global"}:${S}`,[n]),[p,o]=s.useState(()=>{const S=qe(g,{maxAgeMs:qn});return Array.isArray(S)?S:[]}),[f,z]=s.useState(()=>p.length===0),[C,M]=s.useState(null),[N,F]=s.useState(()=>{const S=qe(c,{maxAgeMs:Us});return S?p.find(E=>E.id===S)??null:null}),[T,A]=s.useState([]),[W,k]=s.useState([]),[ae,V]=s.useState(!1),ue=s.useRef(p),R=s.useRef(N),le=s.useRef(0),U=s.useRef(n);ue.current=p,R.current=N,U.current!==n&&(U.current=n,le.current+=1);const X=s.useCallback(async S=>{if(!S){A([]),k([]),V(!1);return}const E=Vn(S.id,{warm:!1});E.mark("select");const D=qe(d(S.id),{maxAgeMs:sr}),m=qe(b(S.id),{maxAgeMs:qn}),I=Array.isArray(D)&&D.length>0,l=Array.isArray(m)&&m.length>0;I||l?(E.mark("cache-hit"),I&&(k(D),E.mark("hydrate")),l&&A(m),V(!1)):(k([]),V(!0));try{const[re,O]=await Promise.all([ar(S.id,n),$n(S.id,{limit:100,order:"desc"},n)]);E.mark("members-fetch"),E.mark("messages-fetch"),ie(b(S.id),re.members,{maxBytes:5e5}),ie(d(S.id),O.messages,{maxBytes:5e5}),R.current?.id===S.id&&(A(re.members),k(O.messages),E.mark("hydrate"))}catch{!I&&!l&&(A([]),k([]))}finally{V(!1),E.complete({warm:I,membersCached:l})}},[b,d,n]),_=s.useCallback(async()=>{ue.current.length===0&&z(!0);try{const S=await rr({},n),E=Jn(S.rooms);o(E),ie(g,E,{maxBytes:5e5}),M(null);const D=qe(c,{maxAgeMs:Us})??vt(Xe,n);if(D){const m=E.find(I=>I.id===D)??null;m?(F(m),X(m)):(pt(Xe,n),ie(c,"",{maxBytes:5e5}))}}catch(S){const E=S instanceof Error?S.message:i("chatRooms.error.failedToLoad","Failed to load chat rooms");M(E),r?.(E,"error")}finally{z(!1)}},[c,r,X,n,g]),G=s.useCallback(S=>{if(!S){R.current=null,F(null),pt(Xe,n),ie(c,"",{maxBytes:5e5}),X(null);return}const E=ue.current.find(D=>D.id===S)??null;R.current=E,F(E),E&&(dn(Xe,E.id,n),ie(c,E.id,{maxBytes:5e5}),X(E))},[c,X,n]),y=s.useCallback(async S=>{const D=(await or({name:S.name,memberAgentIds:S.memberAgentIds},n)).room;return o(m=>ft(m,D)),R.current=D,F(D),dn(Xe,D.id,n),ie(c,D.id,{maxBytes:5e5}),await X(D),D},[c,X,n]),P=s.useCallback(async S=>{await ir(S,n),o(E=>E.filter(D=>D.id!==S)),ie(d(S),[],{maxBytes:5e5}),ie(b(S),[],{maxBytes:5e5}),R.current?.id===S&&(R.current=null,F(null),A([]),k([]),pt(Xe,n),ie(c,"",{maxBytes:5e5}))},[c,b,d,n]),j=s.useCallback(async(S,E)=>{const D=R.current,m=D?.id;if(!m)throw new Error(i("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const I=Vn(m,{warm:!1}),l=E?.files?.map(B=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:B.name,originalName:B.name,mimeType:B.type||"application/octet-stream",size:B.size,createdAt:new Date().toISOString()})),re=Hr(m,S,l?.length?l:E?.attachments);R.current?.id===m&&k(B=>{const fe=[...B,re];return ie(d(m),fe,{maxBytes:5e5}),fe});let O=!1;try{const B=[];if(E?.files?.length)for(const ye of E.files)try{const we=await cr(m,ye,n);B.push(we.attachment)}catch{throw new Error(i("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:ye.name}))}const fe=[...E?.attachments??[],...B],be=await lr(m,{content:S,...fe.length?{attachments:fe}:{}},n);O=!0,be.message?.createdAt&&D&&o(ye=>ft(ye,{...D,updatedAt:be.message.createdAt})),R.current?.id===m&&k(ye=>{const we=aa(ye,be.message,re.id);return ie(d(m),we,{maxBytes:5e5}),we});const te=await $n(m,{limit:100,order:"desc"},n);if(ie(d(m),te.messages,{maxBytes:5e5}),R.current?.id!==m)return;k(te.messages),I.mark("hydrate")}catch(B){let fe=null;try{const te=await $n(m,{limit:100,order:"desc"},n);fe=te.messages,ie(d(m),te.messages,{maxBytes:5e5}),R.current?.id===m&&(k(te.messages),I.mark("hydrate"))}catch{!O&&R.current?.id===m&&k(te=>{const ye=te.filter(we=>we.id!==re.id);return ie(d(m),ye,{maxBytes:5e5}),ye})}const be=fe?.some(te=>te.role==="user"&&te.content.trim()===re.content.trim());if(O||be){const te=B instanceof Error&&B.message.trim()?B.message:i("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new Ca(te,m)}throw B}finally{I.complete({source:"send-room-message"})}},[d,n]),q=s.useCallback(async S=>{!S||!ue.current.some(E=>E.id===S)||(await dr(S,n),ie(d(S),[],{maxBytes:5e5}),R.current?.id===S&&k([]))},[d,n]);return s.useEffect(()=>{_()},[_]),s.useEffect(()=>{const S=le.current,E=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return ya(E,{onReconnect:()=>{Dt({view:"useChatRooms",trigger:"sse-reconnect",projectId:n,replayAttempted:!1});const D=R.current?.id;if(D){const m=Vn(D,{warm:!0});m.mark("sse-reconnect-refresh"),_().finally(()=>m.complete({source:"sse-reconnect"}));return}_()},events:{"chat:room:created":D=>{if(le.current!==S)return;const m=He(D);m&&o(I=>ft(I,m))},"chat:room:updated":D=>{if(le.current!==S)return;const m=He(D);m&&(o(I=>ft(I,m)),R.current?.id===m.id&&F(m))},"chat:room:deleted":D=>{if(le.current!==S)return;const m=He(D);m?.id&&(o(I=>I.filter(l=>l.id!==m.id)),ie(d(m.id),[],{maxBytes:5e5}),ie(b(m.id),[],{maxBytes:5e5}),R.current?.id===m.id&&(R.current=null,F(null),A([]),k([]),pt(Xe,n),ie(c,"",{maxBytes:5e5})))},"chat:room:member:added":D=>{if(le.current!==S)return;const m=He(D);!m||R.current?.id!==m.roomId||A(I=>{if(I.some(re=>re.agentId===m.agentId))return I;const l=[...I,m];return ie(b(m.roomId),l,{maxBytes:5e5}),l})},"chat:room:member:removed":D=>{if(le.current!==S)return;const m=He(D);!m||R.current?.id!==m.roomId||A(I=>{const l=I.filter(re=>re.agentId!==m.agentId);return ie(b(m.roomId),l,{maxBytes:5e5}),l})},"chat:room:message:added":D=>{if(le.current!==S)return;const m=He(D);m&&(o(I=>{const l=I.find(re=>re.id===m.roomId);return l?ft(I,{...l,updatedAt:m.createdAt}):I}),R.current?.id===m.roomId&&k(I=>{const l=aa(I,m);return l===I?I:(ie(d(m.roomId),l,{maxBytes:5e5}),l)}))},"chat:room:message:updated":D=>{if(le.current!==S)return;const m=He(D);!m||R.current?.id!==m.roomId||k(I=>{const l=I.map(re=>re.id===m.id?m:re);return ie(d(m.roomId),l,{maxBytes:5e5}),l})},"chat:room:message:deleted":D=>{if(le.current!==S)return;const m=He(D);m?.id&&k(I=>{const l=I.filter(O=>O.id!==m.id),re=R.current?.id;return re&&ie(d(re),l,{maxBytes:5e5}),l})},"chat:room:messages:cleared":D=>{if(le.current!==S)return;const m=He(D);m?.roomId&&(ie(d(m.roomId),[],{maxBytes:5e5}),R.current?.id===m.roomId&&k([]),o(I=>{const l=I.find(re=>re.id===m.roomId);return l?ft(I,{...l,updatedAt:new Date().toISOString()}):I}))}}})},[c,b,d,n,_]),s.useEffect(()=>{N&&(p.some(S=>S.id===N.id)||(R.current=null,F(null),A([]),k([]),pt(Xe,n),ie(c,"",{maxBytes:5e5})))},[N,c,n,p]),{rooms:p,roomsLoading:f,roomsError:C,activeRoom:N,activeRoomMembers:T,messages:W,messagesLoading:ae,selectRoom:G,createRoom:y,deleteRoom:P,sendRoomMessage:j,clearRoom:q,refreshRooms:_}}const jt={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},ra=200;function Zn(n){if(!n)return null;const r=new Date(n).getTime();return Number.isFinite(r)?r:null}function Sa(n){const r=Object.entries(n);if(r.length<=ra)return n;const i=r.map(([g,c])=>({id:g,timestamp:c,value:Zn(c)??0})).sort((g,c)=>c.value-g.value).slice(0,ra);return Object.fromEntries(i.map(({id:g,timestamp:c})=>[g,c]))}function sn(n){if(!n)return{};try{const r=JSON.parse(n);if(!r||typeof r!="object")return{};const i={};for(const[g,c]of Object.entries(r))typeof g=="string"&&typeof c=="string"&&(i[g]=c);return Sa(i)}catch{return{}}}function Kr(n){const[r,i]=s.useState(()=>{try{return sn(vt(jt.direct,n))}catch{return{}}}),[g,c]=s.useState(()=>{try{return sn(vt(jt.room,n))}catch{return{}}});s.useEffect(()=>{try{i(sn(vt(jt.direct,n)))}catch{i({})}try{c(sn(vt(jt.room,n)))}catch{c({})}},[n]);const d=s.useMemo(()=>({direct:r,room:g}),[r,g]),b=s.useCallback((C,M)=>{const N=Sa(M);try{dn(jt[C],JSON.stringify(N),n)}catch{}return N},[n]),p=s.useCallback((C,M)=>{if(C==="direct"){i(N=>b(C,M(N)));return}c(N=>b(C,M(N)))},[b]),o=s.useCallback((C,M,N)=>{const F=Zn(N);if(F===null)return!1;const T=d[C][M],A=Zn(T);return A===null?!0:F>A},[d]),f=s.useCallback((C,M,N)=>{if(!M)return;const F=N??new Date().toISOString();p(C,T=>({...T,[M]:F}))},[p]),z=s.useCallback((C,M)=>{M.length!==0&&p(C,N=>{const F={...N};for(const T of M)T.id&&(F[T.id]=T.lastActivityAt??new Date().toISOString());return F})},[p]);return{isUnread:o,markRead:f,markAllRead:z}}function oa(n){return n.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function Ma(n,r){const i=r.trim();if(!i)return!0;const g=oa(i);return oa(n).includes(g)||n.toLowerCase().includes(i.toLowerCase())}function ia({agents:n,filter:r,highlightedIndex:i,visible:g,onSelect:c,position:d="below",roomMemberIds:b,roomName:p}){const{t:o}=tt("app"),f=s.useMemo(()=>n.filter(T=>Ma(T.name,r)),[n,r]),z=!!b,C=z&&r.trim().length>0,M=s.useMemo(()=>z?f.filter(T=>b?.has(T.id)):f,[f,b,z]),N=s.useMemo(()=>z?f.filter(T=>!b?.has(T.id)):[],[f,b,z]),F=C?[...M,...N]:M;return g?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${d}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":o("agentMention.suggestionsLabel","Agent mention suggestions"),children:F.length===0?t.jsx("div",{className:"agent-mention-empty",children:o("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[z&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:p?o("agentMention.membersOf","Members of #{{roomName}}",{roomName:p}):o("agentMention.roomMembers","Room members")}),M.map((T,A)=>t.jsxs("button",{type:"button",className:`agent-mention-item${A===i?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${T.id}`,onMouseDown:W=>W.preventDefault(),onClick:()=>c(T),role:"option","aria-selected":A===i,children:[t.jsx(un,{agent:T,size:20}),z&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":o("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:T.name}),t.jsx("span",{className:"agent-mention-role",children:T.role})]},T.id)),z&&!C&&N.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:o("agentMention.typeToSearch","Type to search other agents")}),z&&C&&N.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:o("agentMention.otherAgents","Other agents")}),N.map((T,A)=>{const W=M.length+A;return t.jsxs("button",{type:"button",className:`agent-mention-item${W===i?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${T.id}`,onMouseDown:k=>k.preventDefault(),onClick:()=>c(T),role:"option","aria-selected":W===i,children:[t.jsx(un,{agent:T,size:20}),t.jsx("span",{className:"agent-mention-name",children:T.name}),t.jsx("span",{className:"agent-mention-role",children:T.role})]},T.id)})]})]})}):null}function Vr(n,r){return n+r}function Gr({visible:n,position:r,tasks:i,files:g,selectedIndex:c,onSelectTask:d,onSelectFile:b,loading:p}){const{t:o}=tt("app");if(!n)return null;const f=i.length>0,z=g.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:r.top,left:r.left},"data-testid":"file-mention-popup",onMouseDown:C=>{C.preventDefault()},children:[p&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!p&&!f&&!z&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:o("fileMention.empty","No tasks or files found")}),!p&&(f||z)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[f&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:o("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":o("fileMention.taskMatches","Task matches"),children:i.map((C,M)=>{const N=M;return t.jsxs("li",{className:`file-mention-popup-item${N===c?" file-mention-popup-item--selected":""}`,onClick:()=>d(C),role:"option","aria-selected":N===c,"data-testid":`task-mention-item-${N}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(xa,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsxs("div",{className:"file-mention-popup-task-row",children:[t.jsx("span",{className:"file-mention-popup-task-id",children:C.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${C.column}`,children:C.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:C.title})]})]},C.id)})})]}),z&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:o("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":o("fileMention.fileMatches","File matches"),children:g.map((C,M)=>{const N=Vr(i.length,M),F=ur(C.path);return t.jsxs("li",{className:`file-mention-popup-item${N===c?" file-mention-popup-item--selected":""}`,onClick:()=>b(C),role:"option","aria-selected":N===c,"data-testid":`file-mention-item-${N}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(mr,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:C.name}),F&&t.jsx("span",{className:"file-mention-popup-item-path",children:F})]})]},C.path)})})]})]})]})}function Wr(n,r=[],i){const g=n.trim().replace(/^#/,""),c=(b,p)=>i?i(b,p):p;if(!g)return{ok:!1,error:c("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(g))return{ok:!1,error:c("createRoom.lowercase","Use lowercase letters only.")};const d=g.toLowerCase();return d.length>80?{ok:!1,error:c("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(d)?/^[-_]|[-_]$/.test(d)?{ok:!1,error:c("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:r.some(b=>b.toLowerCase()===d)?{ok:!1,error:c("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:d}:{ok:!1,error:c("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function Xr({isOpen:n,onClose:r,onCreate:i,projectId:g,existingRoomNames:c=[]}){const{t:d}=tt("app"),[b,p]=s.useState(""),[o,f]=s.useState([]),[z,C]=s.useState(""),[M,N]=s.useState([]),[F,T]=s.useState(!1),[A,W]=s.useState(null),[k,ae]=s.useState(!1),V=s.useRef(null),ue=s.useRef(null);s.useEffect(()=>{n&&(ue.current=document.activeElement instanceof HTMLElement?document.activeElement:null,T(!0),W(null),hr(void 0,g).then(y=>f(y)).catch(()=>{f([]),W(d("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>T(!1)))},[n,g]),s.useEffect(()=>{if(!n){p(""),C(""),N([]),W(null),ae(!1);return}const y=window.requestAnimationFrame(()=>V.current?.focus());return()=>window.cancelAnimationFrame(y)},[n]),s.useEffect(()=>{if(!n)return;const y=P=>{P.key==="Escape"&&r()};return document.addEventListener("keydown",y),()=>document.removeEventListener("keydown",y)},[n,r]),s.useEffect(()=>{n||ue.current?.focus()},[n]);const R=s.useMemo(()=>Wr(b,c,d),[b,c,d]),le=s.useMemo(()=>{const y=z.trim().toLowerCase();return y?o.filter(P=>P.name.toLowerCase().includes(y)):o},[o,z]),U=s.useMemo(()=>o.filter(y=>M.includes(y.id)),[o,M]),X=R.ok&&M.length>0&&!k&&!F;if(!n)return null;const _=y=>{k||N(P=>P.includes(y)?P.filter(j=>j!==y):[...P,y])},G=async()=>{if(!R.ok){W(R.error);return}if(M.length===0){W(d("createRoom.selectMember","Select at least one member."));return}W(null),ae(!0);try{await i({name:R.name,displayName:`#${R.name}`,memberAgentIds:M}),r()}catch(y){W(y instanceof Error?y.message:d("createRoom.failedCreate","Failed to create room."))}finally{ae(!1)}};return Xa.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:y=>y.target===y.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":d("createRoom.title","Create room"),onClick:y=>y.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:d("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":d("actions.close","Close"),onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:d("createRoom.nameLabel","Room name")}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:V,id:"create-room-name",className:"input",value:b,disabled:k,onChange:y=>{const P=y.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();p(P)}})]}),!R.ok&&t.jsx("div",{className:"form-error",children:R.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:d("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:d("createRoom.searchAgents","Search agents"),value:z,disabled:k,onChange:y=>C(y.target.value)})]}),U.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:U.map(y=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>_(y.id),disabled:k,children:[y.name," ×"]},y.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:F?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx(fr,{label:d("createRoom.loadingAgents","Loading agents...")})}):le.length===0?t.jsx("div",{className:"create-room-modal-empty",children:o.length===0?d("createRoom.noAgents","No agents in this project yet."):d("createRoom.noMatch","No agents match your search.")}):le.map(y=>{const P=M.includes(y.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${P?" create-room-modal-member-row--selected":""}`,onClick:()=>_(y.id),disabled:k,children:[t.jsx(un,{agent:y,size:20}),t.jsx("span",{children:y.name}),t.jsx("span",{className:"create-room-modal-member-role",children:y.role})]},y.id)})}),A&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:A})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:k,children:d("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void G(),disabled:!X,children:k?d("createRoom.creating","Creating..."):d("createRoom.create","Create room")})]})]})}),document.body)}function qr({cliSessionId:n,tier:r,projectId:i,renderTranscript:g,renderComposer:c,queuedCount:d=0,terminalProps:b}){const{t:p}=tt("app"),o=r==="generic",[f,z]=s.useState(o?"terminal":"transcript");if(o)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(Zs,{sessionId:n,projectId:i,...b})});const C=f==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":r,"data-view":f,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":p("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!C,className:`cli-chat-surface__tab${C?"":" is-active"}`,onClick:()=>z("transcript"),children:[t.jsx(cn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:p("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":C,className:`cli-chat-surface__tab${C?" is-active":""}`,onClick:()=>z("terminal"),children:[t.jsx(gr,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:p("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:C?t.jsx(Zs,{sessionId:n,projectId:i,...b}):g()}),!C&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[d>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:p("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:d})}),c()]})]})}const Qr=200,Yr=8,Jr=8;function ca(){return new DOMException("The operation was aborted.","AbortError")}function la(n,r){return r.aborted?Promise.reject(ca()):new Promise((i,g)=>{const c=()=>g(ca());r.addEventListener("abort",c,{once:!0}),n.then(d=>{r.removeEventListener("abort",c),i(d)},d=>{r.removeEventListener("abort",c),g(d)})})}function da(n,r,i){const g=n.slice(0,r),c=n.slice(r+1),d=c.match(/[\s]|$/),b=d?d.index??c.length:c.length,p=c.slice(b);return`${g}${i}${p}`}function Zr(n={}){const{projectId:r,workspace:i="project"}=n,[g,c]=s.useState(!1),[d,b]=s.useState(""),[p,o]=s.useState(-1),[f,z]=s.useState([]),[C,M]=s.useState([]),[N,F]=s.useState(!1),[T,A]=s.useState(0),W=s.useRef(null),k=s.useRef(null),ae=[...f.map(_=>({kind:"task",task:_})),...C.map(_=>({kind:"file",file:_}))];s.useEffect(()=>()=>{W.current&&clearTimeout(W.current),k.current?.abort()},[]);const V=s.useCallback((_,G)=>{if(G<0||G>_.length){c(!1);return}const y=P=>/[a-zA-Z0-9/_.-]/.test(P);for(let P=G-1;P>=0;P--){if(_[P]==="#"){if(P===0){const q=_.slice(P+1,G);o(P),b(q),A(0),c(!0);return}const j=_[P-1];if(/[\s,.;:!?'"()[\]{}]/.test(j)){const q=_.slice(P+1,G);o(P),b(q),A(0),c(!0);return}c(!1);return}if(!y(_[P])){c(!1);return}}c(!1)},[]),ue=s.useCallback(()=>{k.current?.abort(),c(!1),b(""),o(-1),z([]),M([]),A(0),F(!1)},[]),R=s.useCallback(async _=>{if(!_.trim()){z([]),M([]),F(!1);return}k.current?.abort();const G=new AbortController;k.current=G;try{F(!0);const[y,P]=await Promise.allSettled([la(pr(20,0,r,_),G.signal),la(br(_,i,r),G.signal)]);if(G.signal.aborted)return;const j=y.status==="fulfilled"?y.value.slice(0,Yr).map(S=>({id:S.id,title:S.title??"",column:S.column})):[],q=P.status==="fulfilled"?P.value.files.slice(0,Jr):[];z(j),M(q),A(0)}catch(y){y.name!=="AbortError"&&(z([]),M([]))}finally{G.signal.aborted||F(!1)}},[i,r]);s.useEffect(()=>{if(g)return W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{R(d)},Qr),()=>{W.current&&clearTimeout(W.current)}},[d,g,R]);const le=s.useCallback((_,G)=>!g||p<0?G:da(G,p,`#${_.id}`),[g,p]),U=s.useCallback((_,G)=>!g||p<0?G:da(G,p,`#${_.path}`),[g,p]),X=s.useCallback((_,G)=>{if(!g||ae.length===0)return!1;switch(_.key){case"ArrowDown":return _.preventDefault(),A(y=>Math.min(y+1,ae.length-1)),!0;case"ArrowUp":return _.preventDefault(),A(y=>Math.max(y-1,0)),!0;case"Enter":case"Tab":return ae[T]?(_.preventDefault(),!0):!1;case"Escape":return _.preventDefault(),ue(),!0;default:return!1}},[g,ae,T,ue]);return{mentionActive:g,tasks:f,files:C,combinedItems:ae,loading:N,mentionQuery:d,selectedIndex:T,setSelectedIndex:A,detectMention:V,selectTask:le,selectFile:U,dismissMention:ue,handleKeyDown:X}}const Gn=new Map,ln=new Map;function ss(n){return n??"global"}function es(n){return`${et.DISCOVERED_SKILLS_PREFIX}${ss(n)}`}function gt(n){return qe(es(n),{maxAgeMs:qn})}function eo(n,r){for(const i of ln.get(n)??[])i(r)}async function to(n){const r=ss(n),i=Gn.get(r);if(i)return i;const g=vr(n).finally(()=>{Gn.delete(r)});return Gn.set(r,g),g}function no(n){const[r,i]=s.useState(()=>gt(n)??[]),[g,c]=s.useState(()=>gt(n)===null),d=s.useRef(gt(n)!==null),b=ss(n);s.useEffect(()=>{const f=gt(n)??[];i(f),c(gt(n)===null),d.current=gt(n)!==null},[n]),s.useEffect(()=>{const f=ln.get(b)??new Set;return f.add(i),ln.set(b,f),()=>{f.delete(i),f.size===0&&ln.delete(b)}},[b]);const p=s.useCallback(async()=>{try{const f=await to(n);d.current=!0,ie(es(n),f,{maxBytes:5e5}),eo(b,f)}catch{d.current||on(es(n))}finally{c(!1)}},[n,b]);s.useEffect(()=>{p()},[p]);const o=s.useCallback(async()=>{c(!0),await p()},[p]);return{skills:r,loading:g,refresh:o}}function so(n,r){const i=n.reduce((g,c)=>g+(c.content?.length??0),0)+(r?.length??0);return Math.ceil(i/4)}function ua(n){if(!Number.isFinite(n)||n<=0)return"0";if(n<1e3)return String(Math.round(n));const r=n/1e3;return r<10?`~${Number(r.toFixed(1))}k`:`${Math.round(r)}k`}const as=640,ao=200,ma="__SKIP__";let Wn=!1;function ro(n,r=as){return n>r?"auto":"hidden"}function oo(n,r=as){return Math.max(40,Math.min(n,r))}function io(n,r){const i=new Date(n),c=new Date().getTime()-i.getTime(),d=Math.floor(c/1e3),b=Math.floor(d/60),p=Math.floor(b/60),o=Math.floor(p/24);return d<60?r("chat.relativeTimeJustNow","just now"):b<60?r("chat.relativeTimeMinutes","{{count}}m ago",{count:b}):p<24?r("chat.relativeTimeHours","{{count}}h ago",{count:p}):o<7?r("chat.relativeTimeDays","{{count}}d ago",{count:o}):i.toLocaleDateString()}const bt="__fn_agent__",co=280,an=180,rn=500,ha="fusion:chat-sidebar-width",Xn="fusion:chat-scope",lo="fusion:chat-draft:";function fa(n,r){return n.slice(r+1).find(i=>i.role==="user")?.content}function ga(n,r){return r?`${lo}${n}:${r}`:null}function pa(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const uo=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function ba(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const i=r[1]??"",g=r[2]??"",c=r.index+i.length;return{filter:g,start:c,end:n.length}}function mo(n,r){const i=n.slice(0,r),g=/(^|[\s\n])@([\w-]*)$/.exec(i);if(!g)return null;const c=g[2]??"",d=i.length-c.length-1;return{filter:c,start:d,end:r}}function ho(n){const r=n?.runtimeConfig;if(!r||typeof r!="object")return null;const i=Reflect.get(r,"modelProvider"),g=Reflect.get(r,"modelId");return typeof i!="string"||i.trim().length===0||typeof g!="string"||g.trim().length===0?null:{provider:i,modelId:g}}function va(n,r,i){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const g=ho(r??void 0);return g||(i.provider&&i.modelId?{provider:i.provider,modelId:i.modelId}:null)}function fo({projectId:n,defaultModel:r,onClose:i,onCreate:g}){const{t:c}=tt("app"),[d,b]=s.useState("agent"),{agents:p,loading:o}=ts(n),[f,z]=s.useState(""),{models:C,favoriteProviders:M,favoriteModels:N,loading:F,refresh:T}=wa(),A=r.provider&&r.modelId?`${r.provider}/${r.modelId}`:"",[W,k]=s.useState(A),[ae,V]=s.useState(M),[ue,R]=s.useState(N);s.useEffect(()=>{V(M)},[M]),s.useEffect(()=>{R(N)},[N]),s.useEffect(()=>{A&&k(y=>y||A)},[A]);const le=s.useCallback(async y=>{const P=ae,q=P.includes(y)?P.filter(S=>S!==y):[y,...P];V(q);try{await Js({favoriteProviders:q,favoriteModels:ue}),await T()}catch{V(P)}},[ae,ue,T]),U=s.useCallback(async y=>{const P=ue,q=P.includes(y)?P.filter(S=>S!==y):[y,...P];R(q);try{await Js({favoriteProviders:ae,favoriteModels:q}),await T()}catch{R(P)}},[ue,ae,T]),X=W||A,_=y=>{if(y.preventDefault(),d==="agent"){if(!f)return;g({agentId:f});return}if(!X)return;const P=X.indexOf("/");if(P<=0)return;const j=X.slice(0,P),q=X.slice(P+1);g({agentId:bt,modelProvider:j,modelId:q})},G=d==="agent"?!f:!X;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:y=>y.stopPropagation(),children:[t.jsx("h3",{children:c("chat.newChatTitle","New Chat")}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{b("agent")},children:c("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{b("model"),z(""),k(y=>y||A)},children:c("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:_,children:[d==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[c("chat.newChatModeAgent","Agent"),o?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingAgents","Loading agents...")}):p.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:c("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:p.map(y=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${f===y.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>z(y.id),"data-testid":`agent-option-${y.id}`,children:[t.jsx(Qn,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:y.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:y.role})]},y.id))})]}),d==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:F?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingModels","Loading models...")}):t.jsx(jr,{models:C,value:W,onChange:k,label:c("chat.newChatModeModel","Model"),placeholder:c("chat.selectModel","Select a model"),favoriteProviders:ae,onToggleFavorite:le,favoriteModels:ue,onToggleModelFavorite:U})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:c("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:G,children:c("chat.create","Create")})]})]})]})})}function So({projectId:n,addToast:r,floating:i=!1,compactLayout:g=!1,onPopOut:c,onMaximize:d,onMinimize:b,onClose:p}){const{t:o}=tt("app");s.useEffect(()=>(Dt({view:"ChatView",trigger:Wn?"route-active":"remount",projectId:n,replayAttempted:!1}),Wn=!1,()=>{Wn=!0,Dt({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:f,sessionsLoading:z,messages:C,messagesLoading:M,isStreaming:N,streamingText:F,streamingThinking:T,streamingToolCalls:A,selectSession:W,createSession:k,archiveSession:ae,renameSession:V,deleteSession:ue,sendMessage:R,stopStreaming:le,pendingMessages:U,clearPendingMessage:X,loadMoreMessages:_,hasMoreMessages:G,searchQuery:y,setSearchQuery:P,filteredSessions:j,agentsMap:q}=zr(n,r),[S,E]=s.useState(!1),D=!0,[m,I]=s.useState(()=>{try{if(localStorage.getItem(Xn)==="rooms"&&D)return"rooms"}catch{}return"direct"}),l=Ur(n,r),{isUnread:re,markRead:O}=Kr(n),[B,fe]=s.useState(()=>{const e=ga(m,m==="rooms"?l.activeRoom?.id:f?.id);return pa(e)}),[be,te]=s.useState(null),[ye,we]=s.useState(null),[Ue,Ke]=s.useState(""),[xe,Fe]=s.useState(null),[Ft,ge]=s.useState(null),[Qe,me]=s.useState(!0),[je,yt]=s.useState(co),[mn,nt]=s.useState(!1),{agentsMap:It}=ts(n),De=s.useMemo(()=>q.size>0?q:It,[It,q]),{models:Pt,defaultProvider:wt,defaultModelId:xt}=wa(),st=s.useMemo(()=>({provider:wt,modelId:xt}),[xt,wt]),{skills:at,loading:hn}=no(n),[h,v]=s.useState(!1),[x,$]=s.useState(""),[se,H]=s.useState(0),[Q,Y]=s.useState(""),[K,oe]=s.useState(!1),[J,Z]=s.useState(0),[de,pe]=s.useState(-1),[Me,ka]=s.useState(!1),[Ne,fn]=s.useState([]),[rs,rt]=s.useState(!1),[os,Lt]=s.useState(!1),[ot,is]=s.useState({}),[_t,Ve]=s.useState(!1),[$t,Ct]=s.useState(!1),{pushNav:cs}=yr(),[,Ot]=s.useState(!1),[Ra,Aa]=s.useState({top:0,left:0}),ce=Zr({projectId:n}),gn=s.useCallback(e=>{if(!e||!ce.mentionActive)return;const a=e.getBoundingClientRect();Aa({top:a.top-260,left:a.left+8})},[ce.mentionActive]),ls=s.useRef(null),ds=s.useRef(null),us=s.useRef(null),ms=s.useRef(null),ke=s.useRef(!1),zt=s.useRef(null),hs=s.useRef(null),Ge=s.useRef(null),Bt=s.useRef(0),pn=s.useRef(null),St=s.useRef(null),Pe=s.useRef(null),Re=s.useRef(null),bn=s.useRef(null),Ht=s.useRef(!1),Le=s.useRef(null),_e=s.useRef(null),Se=s.useRef(null),Ut=s.useRef(null),fs=s.useRef([]),it=s.useRef(0),Mt=s.useRef(new Map),vn=s.useRef(!1),Kt=wr(),Ye=Kt==="mobile",yn=Kt==="tablet",gs=s.useRef(null),[Na,ps]=s.useState(!1);s.useLayoutEffect(()=>{if(!i){ps(!1);return}const e=gs.current;if(!e||typeof ResizeObserver>"u")return;const a=()=>{ps(e.getBoundingClientRect().width<=768)};a();const u=new ResizeObserver(a);return u.observe(e),()=>u.disconnect()},[i]);const ee=Ye||Na||g;s.useEffect(()=>{f?.id&&O("direct",f.id,f.lastMessageAt??f.updatedAt)},[f?.id,f?.lastMessageAt,f?.updatedAt,O]),s.useEffect(()=>{l.activeRoom?.id&&O("room",l.activeRoom.id,l.activeRoom.updatedAt)},[l.activeRoom?.id,l.activeRoom?.updatedAt,O]),s.useEffect(()=>{if(!f?.id||C.length===0)return;const e=C[C.length-1];O("direct",f.id,e?.createdAt??f.lastMessageAt??f.updatedAt)},[f?.id,f?.lastMessageAt,f?.updatedAt,O,C]),s.useEffect(()=>{if(!l.activeRoom?.id||l.messages.length===0)return;const e=l.messages[l.messages.length-1];O("room",l.activeRoom.id,e?.createdAt??l.activeRoom.updatedAt)},[O,l.activeRoom?.id,l.activeRoom?.updatedAt,l.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(ha);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const u=Math.max(an,Math.min(rn,a));yt(u)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(Xn);if(e==="direct"){I("direct");return}e==="rooms"&&D&&I("rooms")}catch{}},[D]),s.useEffect(()=>{try{localStorage.setItem(Xn,m)}catch{}},[D,m]);const Ae=ga(m,m==="rooms"?l.activeRoom?.id:f?.id),wn=s.useRef(Ae);s.useEffect(()=>{Ae!==wn.current&&(wn.current=Ae,fe(pa(Ae)))},[Ae]),s.useEffect(()=>{if(!(!Ae||wn.current!==Ae))try{if(B){localStorage.setItem(Ae,B);return}localStorage.removeItem(Ae)}catch{}},[Ae,B]);const ve=m==="rooms"&&!!l.activeRoom,{keyboardOverlap:bs,keyboardOpen:Vt}=xr({enabled:(ee||yn)&&(!!f||ve),allowNonMobileViewport:yn}),kt=yn&&Vt,Te=s.useMemo(()=>{const e=x.trim().toLowerCase();return(e?at.filter(u=>u.name.toLowerCase().includes(e)):at).slice(0,10)},[at,x]),ct=s.useMemo(()=>Array.from(De.values()),[De]),$e=s.useMemo(()=>m!=="rooms"||!l.activeRoom?null:{roomId:l.activeRoom.id,roomName:l.activeRoom.name,memberIds:new Set(l.activeRoomMembers.map(e=>e.agentId))},[D,m,l.activeRoom,l.activeRoomMembers]),Je=s.useMemo(()=>{const e=ct.filter(w=>Ma(w.name,Q));if(!$e)return e;const a=e.filter(w=>$e.memberIds.has(w.id));if(Q.trim().length===0)return a;const u=e.filter(w=>!$e.memberIds.has(w.id));return[...a,...u]},[ct,Q,$e]),xn=s.useMemo(()=>{const e=new Map;for(const a of ct)e.set(a.name.toLowerCase(),a);return e},[ct]),Ta=s.useMemo(()=>Te.map(e=>e.id).join("\0"),[Te]);s.useEffect(()=>{H(0)},[Ta]),s.useEffect(()=>{Z(0)},[Q,K]),s.useEffect(()=>()=>{Pe.current!==null&&window.clearTimeout(Pe.current)},[]),s.useEffect(()=>{const e=ds.current;if(!e||!G||M)return;const a=new IntersectionObserver(u=>{u[0].isIntersecting&&_()},{threshold:.1});return a.observe(e),()=>a.disconnect()},[G,M,_]);const lt=s.useCallback(()=>ve?l.activeRoom?.id??null:f?.id??null,[ve,l.activeRoom?.id,f?.id]),vs=s.useCallback((e,a)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(a)}"]`):e.querySelector(`.chat-message[data-message-id="${a.replace(/"/g,'\\"')}"]`),[]),Gt=s.useCallback(()=>{const e=Re.current,a=lt();if(!e||!a)return;const u=e.scrollTop,w=e.querySelectorAll(".chat-message[data-message-id]"),L=Array.from(w).find(Ce=>Ce.offsetTop+Ce.offsetHeight>=u)??w[0]??null,ne=L?.getAttribute("data-message-id")??null,he=L?L.offsetTop-u:0;St.current={threadId:a,scrollTop:u,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:ne,anchorOffset:he,wasPinnedBefore:!ke.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[lt]),ys=s.useCallback(()=>{const e=Re.current;if(!e)return;const u=e.scrollTop+e.clientHeight>=e.scrollHeight-50;Lt(!u),ke.current=!u,Gt()},[Gt]),Oe=s.useCallback((e,a)=>{if(!e.isConnected||!a?.force&&ke.current)return;let u=0,w=0,L=-1;const ne=6,he=()=>{if(e.isConnected&&!(!a?.force&&ke.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===L?w+=1:(w=0,L=e.scrollHeight),u+=1,u>=ne||w>=2){Lt(!1),ke.current=!1;return}window.requestAnimationFrame(he)}};he()},[]),Rt=ve?l.messages:C;s.useLayoutEffect(()=>{const e=Re.current,a=lt(),u=St.current;if(!e||!a||!u||u.threadId!==a||u.wasPinnedBefore)return;const w=(typeof performance<"u"?performance.now():Date.now())-u.capturedAtMs,L=e.scrollHeight>e.clientHeight,ne=w>3e3,he=u.scrollTop<=0&&u.anchorOffset<=0&&L;if(!ke.current||ne||he){St.current=null;return}let Ce=u.scrollTop;if(u.anchorMessageId){const Be=vs(e,u.anchorMessageId);Be?Ce=Be.offsetTop-u.anchorOffset:Ce=u.scrollTop+(e.scrollHeight-u.scrollHeight)}else Ce=u.scrollTop+(e.scrollHeight-u.scrollHeight);e.scrollTop=Math.max(0,Ce),ke.current=!0,Lt(!0),St.current=null},[Rt,lt,vs]);const Cn=s.useCallback(e=>{},[Rt.length,ve]),Ie=s.useCallback(e=>{Cn(e);const a=Re.current;a&&(St.current=null,ke.current=!1,Oe(a))},[Oe,Cn]);s.useLayoutEffect(()=>{Ge.current!==null&&(window.clearTimeout(Ge.current),Ge.current=null);const e=ve?l.activeRoom?.id??null:f?.id??null;if(!e){zt.current=null;return}const a={threadId:e,loaded:ve?!l.messagesLoading:!M,hasMessages:ve?l.messages.length>0:C.length>0},u=zt.current,w=u?.threadId!==e,L=u?.threadId===e&&!u.loaded&&a.loaded,ne=u?.threadId===e&&!u.hasMessages&&a.hasMessages;if(!(u===null||w||L||ne))return;const Ce=Re.current;if(Ce)return Cn(w?"thread-change":L?"finished-loading":ne?"first-messages":"mount"),Oe(Ce,{force:!0}),ve||(Ge.current=window.setTimeout(()=>{if(Ge.current=null,ke.current)return;const Be=Re.current;Be&&Oe(Be)},250)),zt.current=a,()=>{Ge.current!==null&&(window.clearTimeout(Ge.current),Ge.current=null)}},[ve,l.activeRoom?.id,l.messages.length,l.messagesLoading,f?.id,C.length,M,Oe]),s.useEffect(()=>{!N||ke.current||Ie("streaming")},[N,F,T,Ie]),s.useEffect(()=>{const e=lt();if(!e){Bt.current=0,pn.current=null;return}if(pn.current!==e){pn.current=e,Bt.current=Rt.length;return}const a=Bt.current,u=Rt.length,w=u>a,L=!ke.current;Bt.current=u,w&&L&&Ie("new-message")},[Rt,lt,Ie]),s.useEffect(()=>{bs<=0||!Re.current||Ie("keyboard")},[bs,Ie]),Cr(Ye&&Vt),s.useLayoutEffect(()=>{if(!Ye||!f&&!ve||typeof window>"u")return;const e=bn.current,a=window.visualViewport;if(!e||!a)return;const u=L=>{if(!(L instanceof HTMLElement))return!1;if(L.tagName==="TEXTAREA")return!0;if(L.tagName!=="INPUT")return!1;const ne=L.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(ne)},w=()=>{if(Ht.current){e.classList.remove("chat-thread--keyboard-active"),e.style.transform="",e.style.willChange="";return}const L=Math.max(0,window.innerHeight-a.offsetTop-a.height),ne=a.offsetTop||0;e.style.setProperty("--vv-height",`${a.height}px`),e.style.setProperty("--vv-offset-top",`${ne}px`),e.style.setProperty("--keyboard-overlap",`${L}px`);const he=(L>0||ne>0)&&u(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",he),he&&ne>0?(e.style.transform=`translateY(${ne}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return w(),a.addEventListener("resize",w),a.addEventListener("scroll",w),document.addEventListener("focusin",w),document.addEventListener("focusout",w),window.addEventListener("pageshow",w),document.addEventListener("visibilitychange",w),()=>{a.removeEventListener("resize",w),a.removeEventListener("scroll",w),document.removeEventListener("focusin",w),document.removeEventListener("focusout",w),window.removeEventListener("pageshow",w),document.removeEventListener("visibilitychange",w),e.classList.remove("chat-thread--keyboard-active"),e.style.transform="",e.style.willChange=""}},[f,Ye,ve]),s.useEffect(()=>{const e=()=>te(null);if(be)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[be]),s.useEffect(()=>{if(!Ye||!Vt)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[Ye,Vt]),s.useEffect(()=>{const e=hs.current;if(hs.current=m,m==="rooms"&&!l.activeRoom){zt.current=null;return}if(!(m==="direct"&&(e===null||e==="rooms"))&&!(m==="rooms"&&(e===null||e==="direct")))return;const w=Re.current;w&&(Oe(w,{force:!0}),ke.current=!1,Lt(!1))},[m,l.activeRoom,Oe]),s.useEffect(()=>{if(!f&&!ve||ve&&!ee)return;const e=()=>{const u=!ke.current;Gt(),u&&ee&&Re.current&&Ie("visibility-restore")},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[ee,Ye,f,ve,Gt,Ie]),s.useEffect(()=>{if(ve||typeof ResizeObserver>"u")return;const e=Re.current;if(!e)return;const a=new ResizeObserver(()=>{ke.current||Oe(e)});return a.observe(e),()=>{a.disconnect()}},[ve,Oe,f?.id,m]),s.useEffect(()=>{fs.current=Ne},[Ne]),s.useEffect(()=>()=>{for(const e of fs.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of Mt.current.values())window.clearTimeout(e);Mt.current.clear()},[]);const dt=s.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const u of Array.from(e)){if(!uo.includes(u.type))continue;const w=u.type.startsWith("image/");a.push({file:u,previewUrl:w?URL.createObjectURL(u):""})}a.length>0&&fn(u=>[...u,...a])},[]),ws=s.useCallback(e=>{fn(a=>{const u=a[e];return u?.previewUrl&&URL.revokeObjectURL(u.previewUrl),a.filter((w,L)=>L!==e)})},[]),xs=s.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const u=Array.from(a).filter(w=>w.type.startsWith("image/"));u.length!==0&&dt(u)},[dt]),Ea=s.useCallback(async e=>{try{await k(e),E(!1),ee&&me(!1)}catch{r(o("chat.failedToCreateSession","Failed to create chat session"),"error")}},[k,r,ee]),Ee=s.useCallback(e=>{const a=e??Se.current;if(!a)return;const u=Kt==="tablet"?ao:as;a.style.height="auto",a.style.height=`${oo(a.scrollHeight,u)}px`,a.style.overflowY=ro(a.scrollHeight,u)},[Kt]),Cs=s.useCallback(e=>{Se.current=e,e&&Ee(e)},[Ee]);s.useLayoutEffect(()=>{Ee()},[m,B,f?.id,l.activeRoom?.id,Ee]);const ut=s.useCallback(()=>{if(fe(""),Ae)try{localStorage.removeItem(Ae)}catch{}v(!1),$(""),oe(!1),Y(""),pe(-1),fn(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[Ae]),Sn=s.useCallback(()=>{const e=B.trim(),a=Ne.map(u=>u.file);if(!(!e&&a.length===0||!f)){if(e==="/clear"||e==="/new"){ut(),X(),le(),k({agentId:f.agentId,modelProvider:f.modelProvider??void 0,modelId:f.modelId??void 0}).catch(()=>{r(o("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}ut(),R(e,a)}},[B,Ne,f,ut,le,X,k,r,R]),Mn=s.useCallback(async()=>{const e=B.trim(),a=Ne.map(u=>u.file);if(!(!e&&a.length===0)){if(m==="rooms"){if(!l.activeRoom)return;if(e==="/clear"||e==="/new"){ut();try{await l.clearRoom(l.activeRoom.id)}catch{r(o("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(vn.current)return;vn.current=!0;const u=B;ut();try{await l.sendRoomMessage(e,{files:a})}catch(w){if(w instanceof Ca){const ne=w.message.trim()?w.message:o("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");r(o("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:ne}),"error");return}fe(u);const L=w instanceof Error&&w.message.trim()?w.message:o("chat.failedToSendRoomMessage","Failed to send room message");r(L,"error")}finally{vn.current=!1}return}Sn()}},[B,Ne,D,m,l,l.clearRoom,ut,r,Sn]),Wt=s.useCallback(async e=>{if(m==="rooms"){if(!l.activeRoom)return;try{await l.sendRoomMessage(e)}catch(a){const u=a instanceof Error&&a.message.trim()?a.message:o("chat.failedToSendRoomMessage","Failed to send room message");r(u,"error")}return}f&&R(e)},[f,r,D,m,l,R,o]),kn=s.useCallback(e=>{fe(a=>{const u=ba(a);if(!u)return a;const w=`/skill:${e.name} `,L=a.slice(0,u.start)+w+a.slice(u.end);return window.requestAnimationFrame(()=>{Se.current&&(Ee(Se.current),Se.current.focus())}),L}),v(!1),$(""),H(0)},[Ee]),Xt=s.useCallback(e=>{const a=Se.current;if(!a||de<0)return;const u=a.selectionStart??it.current,w=a.selectionEnd??u,L=Math.max(u,w),ne=Math.min(de,L),Ce=`${`@${e.name.replace(/\s+/g,"_")}`} `,Be=B.slice(0,ne)+Ce+B.slice(L),mt=ne+Ce.length;fe(Be),oe(!1),Y(""),Z(0),pe(-1),window.requestAnimationFrame(()=>{Se.current&&(Ee(Se.current),Se.current.focus(),Se.current.setSelectionRange(mt,mt))})},[de,B,Ee]),At=s.useCallback((e,a)=>{const w=Se.current?.selectionStart??it.current,L=B.lastIndexOf("#",w),ne=L>=0?L+a.length:e.length;fe(e),ce.dismissMention(),Ot(!1),window.requestAnimationFrame(()=>{Se.current&&(Ee(Se.current),Se.current.focus(),Se.current.setSelectionRange(ne,ne))})},[ce,B,Ee]),Ss=s.useCallback(e=>{if(it.current=e.currentTarget.selectionStart??it.current,ce.mentionActive&&ce.combinedItems.length>0){if(ce.handleKeyDown(e,B),e.key==="Enter"||e.key==="Tab"){const a=ce.combinedItems[ce.selectedIndex];a?.kind==="task"?At(ce.selectTask(a.task,B),`#${a.task.id}`):a?.kind==="file"&&At(ce.selectFile(a.file,B),`#${a.file.path}`)}return}if(K&&e.key==="ArrowDown"){e.preventDefault(),Je.length>0&&Z(a=>(a+1)%Je.length);return}if(K&&e.key==="ArrowUp"){e.preventDefault(),Je.length>0&&Z(a=>a===0?Je.length-1:a-1);return}if(K&&e.key==="Enter"){e.preventDefault();const a=Je[J]??Je[0];a&&Xt(a);return}if(K&&e.key==="Escape"){e.preventDefault(),oe(!1),Y(""),pe(-1);return}if(h&&e.key==="ArrowDown"){e.preventDefault(),Te.length>0&&H(a=>(a+1)%Te.length);return}if(h&&e.key==="ArrowUp"){e.preventDefault(),Te.length>0&&H(a=>a===0?Te.length-1:a-1);return}if(h&&(e.key==="Enter"||e.key==="Tab")&&Te.length>0){e.preventDefault();const a=Te[se]??Te[0];a&&kn(a);return}if(h&&e.key==="Escape"){e.preventDefault(),v(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Mn())},[K,Je,J,Xt,h,Te,se,kn,Mn,ce,At,B]),qt=s.useCallback((e,a)=>{const u=mo(e,a);if(u){oe(!0),Y(u.filter),pe(u.start);return}oe(!1),Y(""),pe(-1)},[]),Ms=s.useCallback(e=>{const a=e.target,u=a.value,w=a.selectionStart??u.length;Ee(a),it.current=w,fe(u);const L=ba(u);L?(v(!0),$(L.filter)):(v(!1),$("")),qt(u,w),ce.detectMention(u,w),Ot(ce.mentionActive),ce.mentionActive&&gn(a)},[qt,Ee]),Qt=s.useCallback(e=>{const a=e.currentTarget,u=a.selectionStart??a.value.length;it.current=u,qt(a.value,u),ce.detectMention(a.value,u),Ot(ce.mentionActive),ce.mentionActive&&gn(a)},[qt,ce,gn]),ks=s.useCallback(e=>{e.key!=="Escape"&&Qt(e)},[Qt]),Rs=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Ht.current=!0,Le.current!==null&&window.clearTimeout(Le.current),Le.current=window.setTimeout(()=>{Ht.current=!1,Le.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),_e.current!==null&&window.clearTimeout(_e.current),_e.current=window.setTimeout(()=>{_e.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Pe.current!==null&&window.clearTimeout(Pe.current),Pe.current=window.setTimeout(()=>{v(!1),oe(!1),Y(""),pe(-1),Ot(!1),ce.dismissMention(),Pe.current=null},120)},[ce]),As=s.useCallback(()=>{Ht.current=!1,Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null),Pe.current!==null&&(window.clearTimeout(Pe.current),Pe.current=null),_e.current!==null&&(window.clearTimeout(_e.current),_e.current=null)},[]);s.useEffect(()=>()=>{Le.current!==null&&window.clearTimeout(Le.current),_e.current!==null&&window.clearTimeout(_e.current)},[]);const ja=s.useCallback(async e=>{te(null);try{await ae(e),r(o("chat.conversationArchived","Conversation archived"),"success")}catch{r(o("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[ae,r]),Rn=s.useCallback(e=>{const a=j.find(u=>u.id===e)??(f?.id===e?f:null);te(null),Ve(!1),Ke(a?.title??""),we({sessionId:e,title:a?.title??""})},[f,j]),Ns=s.useCallback(async()=>{if(ye)try{await V(ye.sessionId,Ue),we(null),Ke(""),r(o("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[r,ye,V,Ue,o]),Da=s.useCallback(async e=>{Fe(null),te(null);try{await ue(e),r(o("chat.conversationDeleted","Conversation deleted"),"success")}catch{r(o("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[ue,r]),Nt=s.useCallback(e=>{try{localStorage.setItem(ha,String(e))}catch{}},[]),Fa=s.useCallback(e=>{if(ee||kt)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const u=e.clientX,w=je;let L=w;document.body.style.userSelect="none";const ne=Ce=>{const Be=Ce.clientX-u,mt=Math.max(an,Math.min(rn,w+Be));L=mt,yt(mt),Nt(mt)},he=Ce=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(Ce.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",ne),document.removeEventListener("pointerup",he),Nt(L)};document.addEventListener("pointermove",ne),document.addEventListener("pointerup",he)},[ee,Nt,je,kt]),Ia=s.useCallback(e=>{if(ee||kt||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,u=e.key==="ArrowLeft"?-a:a,w=Math.max(an,Math.min(rn,je+u));yt(w),Nt(w)},[ee,Nt,je,kt]),Ts=s.useCallback(e=>{const a=j.find(u=>u.id===e);O("direct",e,a?.lastMessageAt??a?.updatedAt),W(e),Ve(!1),ee&&me(!1)},[j,ee,O,W]),An=s.useCallback(()=>{W(""),me(!0),Ve(!1)},[W]),Nn=s.useCallback(()=>{l.selectRoom(null),me(!0),Ve(!1)},[l]),Pa=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(cn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:o("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>E(!0),children:[t.jsx(ht,{size:16}),o("chat.newChat","New Chat")]})]}),ze=va(f,f?.agentId?De.get(f.agentId)??null:null,st),Tn=s.useMemo(()=>{if(!ze?.provider||!ze.modelId)return null;const e=Pt.find(a=>a.provider===ze.provider&&a.id===ze.modelId);return e?.contextWindow?e.contextWindow:null},[ze?.modelId,ze?.provider,Pt]),La=s.useMemo(()=>so(C,N?F:void 0),[N,C,F]),We=Ks(ze?.provider,ze?.modelId),Ze=ze?.provider??null,Tt=!!(f||N||C.length>0),Yt=m==="rooms"?ve:!!f,Es=s.useRef(Yt);s.useEffect(()=>{const e=Es.current;Es.current=Yt,ee&&(e||!Yt||cs({type:"view",revert:m==="rooms"?Nn:An}))},[m,An,Nn,Yt,ee,cs]);const js=f?.agentId===bt?We??"Fusion":f?.title||De.get(f?.agentId??"")?.name||f?.agentId||"Chat",_a=f?.title||o("chat.untitledSession","Untitled"),$a=!!(We&&We!==js),Oa=!ee&&Tt&&Tn!==null,Ds=ua(La),Jt=Tn!==null?ua(Tn):null,En=Jt?o("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:Ds,total:Jt}):null,za=ee&&m==="direct"&&!!f,Fs=ee&&m==="direct"&&Tt,jn=De.get(f?.agentId??"")?.name||(f?.agentId===bt?We??"Fusion":f?.agentId?.slice(0,30)??"Fusion"),Dn=!1,Fn=f?.agentId===bt,Ba=e=>e.length>50?`${e.slice(0,50)}…`:e,Is=s.useCallback(()=>{ka(e=>!e)},[]);s.useEffect(()=>{if(!_t)return;const e=a=>{us.current?.contains(a.target)||Ve(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[_t]),s.useEffect(()=>{if(!$t)return;const e=u=>{ms.current?.contains(u.target)||Ct(!1)},a=u=>{u.key==="Escape"&&Ct(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",a),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",a)}},[$t]),s.useEffect(()=>{(!ee||m!=="direct"||Qe)&&Ve(!1)},[ee,m,Qe]),s.useEffect(()=>{Ct(!1)},[l.activeRoom?.id]);const In=s.useCallback((e,a)=>{const u=Mt.current.get(e);u&&window.clearTimeout(u),is(L=>({...L,[e]:a}));const w=window.setTimeout(()=>{is(L=>{const{[e]:ne,...he}=L;return he}),Mt.current.delete(e)},2e3);Mt.current.set(e,w)},[]),Ps=s.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),In(e,"success")}catch{In(e,"error")}},[In]),Pn=f?.agentId===bt,Ln=s.useCallback((e,a,u)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${ot[e]==="success"?" chat-message-copy-action--success":""}${ot[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":u??`chat-copy-response-${e}`,"aria-label":ot[e]==="success"?o("chat.responseCopied","Response copied"):ot[e]==="error"?o("chat.copyFailed","Copy failed"):o("chat.copyResponse","Copy response"),onClick:()=>{Ps(e,a)},children:ot[e]==="success"?t.jsx(Sr,{size:14}):t.jsx(Mr,{size:14})}),[ot,Ps]),_n=s.useCallback(e=>{const a=Re.current;if(!a)return;const u=`[data-testid="chat-message-${e}"]`,w=a.querySelector(u);if(!w)return;const L=w.getBoundingClientRect().top-a.getBoundingClientRect().top+a.scrollTop,ne=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;a.scrollTo({top:L,behavior:ne?"auto":"smooth"})},[]),Ls=f?.cliExecutorAdapterId??null,Ha=!!Ls,Ua=Ls==="generic"?"generic":"hybrid",Ka=f?.cliSessionFile||f?.id||"",_s=()=>t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:ys,children:[t.jsx("div",{ref:ds,className:"chat-load-more-sentinel",children:G&&M&&t.jsx("div",{className:"chat-loading-older",children:o("chat.loadingOlderMessages","Loading older messages…")})}),N?t.jsxs(t.Fragment,{children:[C.map((e,a)=>t.jsx(Hn,{message:e,forcePlain:Me,agentName:jn,hideAssistantIdentity:Fn,showAssistantModelTag:Dn,activeModelTag:We,activeModelProvider:Ze,activeSessionId:f?.id??null,mentionAgentsByName:xn,roomContext:null,copyAction:Pn&&e.role==="assistant"?Ln(e.id,e.content):void 0,onScrollToTop:_n,isAwaitingQuestionAnswer:e.role==="assistant"&&a===C.length-1&&!N,submittedQuestionAnswer:fa(C,a),onQuestionSubmit:Wt},e.id)),t.jsx(Er,{streamingText:F,streamingThinking:T,streamingToolCalls:A,forcePlain:Me,agentName:jn,hideAssistantIdentity:Fn,showAssistantModelTag:Dn,activeModelTag:We,activeModelProvider:Ze,copyAction:Pn&&F?Ln("__streaming__",F,"chat-copy-response-streaming"):void 0,onQuestionSubmit:Wt})]}):M?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):C.length===0&&!f?Pa():C.length===0&&f?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:C.map((e,a)=>t.jsx(Hn,{message:e,forcePlain:Me,agentName:jn,hideAssistantIdentity:Fn,showAssistantModelTag:Dn,activeModelTag:We,activeModelProvider:Ze,activeSessionId:f?.id??null,mentionAgentsByName:xn,roomContext:null,copyAction:Pn&&e.role==="assistant"?Ln(e.id,e.content):void 0,onScrollToTop:_n,isAwaitingQuestionAnswer:e.role==="assistant"&&a===C.length-1&&!N,submittedQuestionAnswer:fa(C,a),onQuestionSubmit:Wt},e.id))}),t.jsx("div",{ref:ls})]}),$s=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Ut,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{dt(e.target.files),e.target.value=""}}),h&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":o("chat.skillSuggestions","Skill suggestions"),children:hn?t.jsx("div",{className:"chat-skill-menu-empty",children:o("chat.loadingSkills","Loading skills…")}):Te.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:x?o("chat.noSkillsFound","No skills found"):o("chat.noSkillsAvailable","No skills available")}):Te.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===se,className:`chat-skill-menu-item${a===se?" chat-skill-menu-item--highlighted":""}`,onMouseDown:u=>u.preventDefault(),onMouseEnter:()=>H(a),onClick:()=>kn(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),Ne.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Ne.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>ws(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),U.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:U.map((e,a)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:o("chat.queuedMessage","Queued: {{preview}}",{preview:Ba(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":o("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${a}`,onClick:()=>X(a),children:"×"})]},`${a}-${e}`))}),t.jsx("div",{className:"chat-pending-divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":o("chat.attachFiles","Attach files"),onClick:()=>Ut.current?.click(),children:t.jsx(Ws,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${rs?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),rt(!0)},onDragLeave:()=>rt(!1),onDrop:e=>{e.preventDefault(),rt(!1),dt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:Cs,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:B,onChange:Ms,onKeyDown:Ss,onKeyUp:ks,onClick:Qt,onBlur:Rs,onFocus:As,onPaste:xs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Xs()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(ia,{agents:ct,filter:Q,highlightedIndex:J,visible:K,onSelect:Xt,position:"below",roomMemberIds:$e?.memberIds,roomName:$e?.roomName}),t.jsx(Gr,{visible:ce.mentionActive&&!K,position:Ra,tasks:ce.tasks,files:ce.files,selectedIndex:ce.selectedIndex,onSelectTask:e=>{At(ce.selectTask(e,B),`#${e.id}`)},onSelectFile:e=>{At(ce.selectFile(e,B),`#${e.path}`)},loading:ce.loading})]}),t.jsx(qs,{isStreaming:N,canSend:!!(B.trim()||Ne.length>0),onSend:Sn,onStop:le})]})]}),Va=ee?void 0:{width:`${je}px`},Ga=za?t.jsxs("div",{className:"chat-mobile-session-menu",ref:us,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":_t,onClick:()=>Ve(e=>!e),children:[Ze?t.jsx(On,{provider:Ze,size:"md"}):t.jsx(Qn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:_a}),t.jsx(Zt,{size:16,"aria-hidden":"true"})]}),_t&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[j.map(e=>t.jsxs("div",{className:`chat-mobile-session-option-row${f?.id===e.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${f?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>Ts(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||o("chat.untitledSession","Untitled")})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${e.id}`,"aria-label":o("chat.renameConversationAria","Rename conversation {{title}}",{title:e.title||o("chat.untitledSession","Untitled")}),onClick:()=>Rn(e.id),children:t.jsx(zn,{size:14})})]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{Ve(!1),E(!0)},children:[t.jsx(ht,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.newChat","New Chat")})]})]})]}):null,Wa=t.jsxs("div",{className:"chat-sidebar-scope-toggle chat-view-header-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${m==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":m==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>I("direct"),children:[t.jsx(cn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.scopeDirect","Direct")})]}),t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${m==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":m==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>I("rooms"),children:[t.jsx(xa,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:gs,className:`chat-view${i?" chat-view--floating":""}${ee?" chat-view--narrow":""}${Fs?" chat-view--mobile-direct-thread":""}`,children:[t.jsx(kr,{icon:cn,title:o("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[Fs?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn-icon chat-back-btn",onClick:An,"data-testid":"chat-back-btn","aria-label":o("chat.backToConversations","Back to conversations"),children:t.jsx(Vs,{size:16})}),Ga]}):Wa,ee?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:()=>E(!0),"data-testid":"chat-new-btn",children:[t.jsx(ht,{size:14}),o("chat.newChat","New Chat")]}),!i&&c?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:c,"aria-label":o("chat.popOut","Pop out chat"),title:o("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(Gs,{size:16})}):null,i&&d?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:d,"aria-label":o("chat.maximizeToChatView","Open in Chat view"),title:o("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:t.jsx(Gs,{size:16})}):null,i&&b?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:b,"aria-label":o("chat.minimizeToQuickChat","Minimize to quick chat"),title:o("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:t.jsx(Rr,{size:16})}):null,i&&p?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:p,"aria-label":o("chat.closeChat","Close chat"),title:o("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(Ar,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${Qe?"":" chat-sidebar--hidden"}`,style:Va,children:[m==="direct"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-sidebar-search-container",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Nr,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:o("chat.searchConversations","Search conversations..."),value:y,onChange:e=>P(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:z?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.loadingConversations","Loading...")}):j.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.noConversationsYet","No conversations yet")}):j.map(e=>{const a=f?.id===e.id,u=!a&&re("direct",e.id,e.lastMessageAt??e.updatedAt),w=va(e,De.get(e.agentId)??null,st),L=Ks(w?.provider,w?.modelId)??"Fusion",ne=e.title||o("chat.untitledSession","Untitled");return t.jsxs("div",{className:`chat-session-item${a?" chat-session-item--active":""}`,onClick:()=>Ts(e.id),onContextMenu:he=>{he.preventDefault(),te({sessionId:e.id,x:he.clientX,y:he.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsxs("div",{className:"chat-session-actions",children:[t.jsx("button",{type:"button",className:"btn-icon chat-session-action-btn chat-session-rename-btn",onClick:he=>{he.stopPropagation(),Rn(e.id)},"data-testid":"chat-session-rename-btn","aria-label":o("chat.renameConversationAria","Rename conversation {{title}}",{title:ne}),children:t.jsx(zn,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon chat-session-action-btn chat-session-delete-btn",onClick:he=>{he.stopPropagation(),Fe(e.id)},"data-testid":"chat-session-delete-btn","aria-label":o("chat.deleteConversation","Delete conversation"),children:t.jsx(Bn,{size:14})})]}),t.jsxs("div",{className:"chat-session-title",children:[ne,u?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||o("chat.noMessages","No messages")}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[w?.provider?t.jsx(On,{provider:w.provider,size:"sm"}):null,t.jsx("span",{children:De.get(e.agentId)?.name||(e.agentId===bt?L:e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?io(e.updatedAt,o):""})]})]},e.id)})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!ee&&t.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>nt(!0),children:[t.jsx(ht,{size:14}),o("chat.createRoom","Create room")]})}),l.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:o("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l.rooms.map(e=>{const a=l.activeRoom?.id===e.id,u=!a&&re("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{O("room",e.id,e.updatedAt),l.selectRoom(e.id),ee&&me(!1)},onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),O("room",e.id,e.updatedAt),l.selectRoom(e.id),ee&&me(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name-row",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),u?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),a?t.jsx("span",{className:"chat-room-item-meta",children:o("chat.roomMemberCount","{{count}} member",{count:l.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":o("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:w=>{w.stopPropagation(),ge(e.id)},children:t.jsx(Bn,{size:14})})]},e.id)})})]}),m==="rooms"?ee?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>nt(!0),children:[t.jsx(ht,{size:14}),o("chat.createRoom","Create room")]})}):null:ee?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>E(!0),"data-testid":"chat-new-btn",children:[t.jsx(ht,{size:14}),o("chat.newChat","New Chat")]})}):null]}),!ee&&Qe&&!kt&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":an,"aria-valuemax":rn,"aria-valuenow":je,"aria-label":o("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:Fa,onKeyDown:Ia}),be&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:be.y,left:be.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Rn(be.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(zn,{size:14}),o("chat.rename","Rename")]}),t.jsxs("button",{onClick:()=>ja(be.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Tr,{size:14}),o("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{te(null),Fe(be.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Bn,{size:14}),o("chat.delete","Delete")]})]}),ye&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>we(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"chat-rename-dialog-title",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{id:"chat-rename-dialog-title",children:o("chat.renameConversationTitle","Rename Conversation")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.renameConversationBody","Choose a new name for this conversation. Leave it blank to show Untitled.")}),t.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:o("chat.conversationName","Conversation name")}),t.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:Ue,placeholder:o("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>Ke(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),Ns())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>we(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Ns(),"data-testid":"chat-rename-save",children:o("chat.save","Save")})]})]})}),xe&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Fe(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.deleteConversationBody","This action cannot be undone. All messages in this conversation will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Fe(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Da(xe),children:o("chat.delete","Delete")})]})]})}),Ft&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>ge(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.deleteRoomBody","This action cannot be undone. This room and all its messages will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>ge(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await l.deleteRoom(Ft),ge(null)}catch{r(o("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:o("chat.delete","Delete")})]})]})}),m==="rooms"?t.jsxs("div",{ref:bn,className:"chat-thread",children:[l.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[ee&&t.jsx("button",{className:"btn-icon",onClick:Nn,"data-testid":"chat-back-btn",children:t.jsx(Vs,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:ms,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":$t,onClick:()=>Ct(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",l.activeRoom.name]}),t.jsx(Zt,{size:16,"aria-hidden":"true"})]}),$t&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:l.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===l.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{O("room",e.id,e.updatedAt),l.selectRoom(e.id),Ct(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:l.activeRoomMembers.map(e=>t.jsx(un,{agent:De.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:ys,children:[l.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):l.messages.filter(e=>e.content.trim()!==ma).length===0?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):l.messages.filter(e=>e.content.trim()!==ma).map(e=>{const a=e.senderAgentId?De.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):o("chat.you","You"),u={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(Hn,{message:u,forcePlain:Me,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:l.activeRoom?.id??null,mentionAgentsByName:xn,roomContext:$e,onScrollToTop:_n,isAwaitingQuestionAnswer:!1,onQuestionSubmit:Wt},e.id)}),t.jsx("div",{ref:ls})]}),l.activeRoom&&os&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Ie("fab-click"),children:[t.jsx(Zt,{size:14}),o("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:o("chat.selectRoomOrCreate","Select a room or create one")}),l.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Ut,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{dt(e.target.files),e.target.value=""}}),Ne.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Ne.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>ws(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":o("chat.attachFiles","Attach files"),onClick:()=>Ut.current?.click(),children:t.jsx(Ws,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${rs?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),rt(!0)},onDragLeave:()=>rt(!1),onDrop:e=>{e.preventDefault(),rt(!1),dt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:Cs,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:B,onChange:Ms,onKeyDown:Ss,onKeyUp:ks,onClick:Qt,onBlur:Rs,onFocus:As,onPaste:xs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Xs()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(ia,{agents:ct,filter:Q,highlightedIndex:J,visible:K,onSelect:Xt,position:"below",roomMemberIds:$e?.memberIds,roomName:$e?.roomName})]}),t.jsx(qs,{isStreaming:!1,canSend:!!(B.trim()||Ne.length>0),onSend:Mn})]})]})]}):t.jsxs("div",{ref:bn,className:"chat-thread",children:[!ee&&(Tt||!ee)&&t.jsxs("div",{className:"chat-thread-header",children:[t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[Ze?t.jsx(On,{provider:Ze,size:"md"}):t.jsx(Qn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:js}),$a&&t.jsx("span",{className:"chat-model-tag",children:We}),Oa&&Jt&&En?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:En,"aria-label":En,children:[Ds," / ",Jt]}):null]}),Tt&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${Me?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":Me?o("chat.showRenderedMarkdown","Show all messages as rendered Markdown"):o("chat.showPlainText","Show all messages as plain text"),onClick:Is,children:Me?t.jsx(Qs,{size:14}):t.jsx(Ys,{size:14})})]}),ee&&Tt&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle chat-thread-header-render-toggle--floating${Me?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":Me?o("chat.showRenderedMarkdown","Show all messages as rendered Markdown"):o("chat.showPlainText","Show all messages as plain text"),onClick:Is,children:Me?t.jsx(Qs,{size:14}):t.jsx(Ys,{size:14})}),Ha?t.jsx(qr,{cliSessionId:Ka,tier:Ua,projectId:n,renderTranscript:_s,renderComposer:()=>f?$s():null}):t.jsxs(t.Fragment,{children:[_s(),os&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Ie("fab-click"),children:[t.jsx(Zt,{size:14}),o("chat.latest","Latest")]}),f&&$s()]})]}),t.jsx(Xr,{isOpen:mn,onClose:()=>nt(!1),projectId:n,existingRoomNames:l.rooms.map(e=>e.name),onCreate:async e=>{await l.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),m!=="rooms"&&I("rooms"),nt(!1),ee&&me(!1)}})]}),S&&t.jsx(fo,{projectId:n,defaultModel:st,onClose:()=>E(!1),onCreate:Ea})]})}export{So as ChatView,oo as clampChatInputHeight,ro as resolveChatInputOverflowY,va as resolveSessionProvider};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a9 as v,aa as z,ab as D,ac as x,C as j,ad as S,D as T,F as B,P as A,L,q as w}from"./index-B6ttSchA.js";import{u as K}from"./vendor-i18n-GF3RlKbq.js";import{F as R}from"./folder-open-DOCy9GVC.js";function J({value:p,onChange:u,placeholder:f,onInputKeyDown:N,nodeId:b,localNodeId:k}){const{t:i}=K("app"),[e,s]=n.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[l,h]=n.useState(""),d=n.useCallback(async(t,c=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await v(t,c,b,k);s(a=>({...a,loading:!1,currentPath:o.currentPath,parentPath:o.parentPath,entries:o.entries}))}catch(o){s(a=>({...a,loading:!1,error:o instanceof Error?o.message:"Failed to browse directory"}))}},[b,k]),F=n.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);n.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(p||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,p,e.showHidden,d,b,k]);const m=n.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),C=n.useCallback(()=>{u(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,u]),g=n.useCallback(()=>{s(t=>{const c=!t.showHidden;return{...t,showHidden:c}})},[]);n.useEffect(()=>{e.isOpen&&e.currentPath&&d(e.currentPath,e.showHidden)},[e.showHidden,d]);const P=n.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),h("")},[]),y=n.useCallback(async()=>{if(!l.trim()||!e.currentPath)return;const t=l.trim();if(t.includes("/")||t.includes("\\")||t.includes("..")){s(a=>({...a,createFolderError:i("dirPicker.createFolderError","Folder name cannot contain path separators or '..'")}));return}const c=e.currentPath.includes("\\")?"\\":"/",o=e.currentPath.endsWith(c)?e.currentPath+t:e.currentPath+c+t;s(a=>({...a,loading:!0,createFolderError:null}));try{await z(o),h(""),s(a=>({...a,createFolderOpen:!1})),await d(e.currentPath,e.showHidden)}catch(a){s(O=>({...O,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[l,e.currentPath,e.showHidden,d]),H=n.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),y()):t.key==="Escape"&&(s(c=>({...c,createFolderOpen:!1,createFolderError:null})),h(""))},[y]),E=e.currentPath?D(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:p,onChange:t=>u(t.target.value),onKeyDown:N,placeholder:f||i("dirPicker.defaultPlaceholder","/path/to/your/project")}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:F,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(R,{size:16}):r.jsx(x,{size:16}),r.jsx("span",{children:i("dirPicker.browse","Browse")})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":i("dirPicker.ariaLabel","Directory browser"),children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:E.map((t,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(j,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>m(t.path),title:t.path,children:t.label})]},t.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>m(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(S,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:g,"aria-label":e.showHidden?i("dirPicker.hideHiddenAria","Hide hidden directories"):i("dirPicker.showHiddenAria","Show hidden directories"),title:e.showHidden?i("dirPicker.hideHiddenTitle","Hide hidden"):i("dirPicker.showHiddenTitle","Show hidden"),children:[e.showHidden?r.jsx(T,{size:14}):r.jsx(B,{size:14}),r.jsx("span",{children:e.showHidden?i("dirPicker.hideHidden","Hide hidden"):i("dirPicker.showHidden","Show hidden")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-create-folder-toggle",onClick:P,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(A,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(L,{size:20,className:"animate-spin"}),r.jsx("span",{children:i("dirPicker.loading","Loading…")})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(w,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:i("dirPicker.noSubdirs","No subdirectories")}):e.entries.map(t=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>m(t.path),role:"treeitem",title:t.path,children:[r.jsx(x,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:t.name}),t.hasChildren&&r.jsx(j,{size:14,className:"directory-picker-entry-arrow"})]},t.path))}),e.createFolderOpen&&r.jsxs("div",{className:"directory-picker-create-folder",children:[r.jsx("input",{type:"text",className:"input directory-picker-create-folder-input",value:l,onChange:t=>h(t.target.value),onKeyDown:H,placeholder:i("dirPicker.newFolderPlaceholder","Folder name"),autoFocus:!0}),r.jsxs("div",{className:"directory-picker-create-folder-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:y,disabled:!l.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:P,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(w,{size:14}),r.jsx("span",{children:e.createFolderError})]})]}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:C,children:i("dirPicker.select","Select")})]})]})]})}export{J as D};
|