@almadar/ui 2.17.0 → 2.19.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.
@@ -1,16 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var React3 = require('react');
3
+ var React2 = require('react');
4
+ var providers = require('@almadar/ui/providers');
4
5
  require('react/jsx-runtime');
5
6
  var reactQuery = require('@tanstack/react-query');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
9
 
9
- var React3__default = /*#__PURE__*/_interopDefault(React3);
10
+ var React2__default = /*#__PURE__*/_interopDefault(React2);
10
11
 
11
12
  function useOrbitalHistory(options) {
12
13
  const { appId, authToken, userId, onHistoryChange, onRevertSuccess } = options;
13
- const getHeaders2 = React3.useCallback(() => {
14
+ const getHeaders2 = React2.useCallback(() => {
14
15
  const headers = {
15
16
  "Content-Type": "application/json"
16
17
  };
@@ -22,11 +23,11 @@ function useOrbitalHistory(options) {
22
23
  }
23
24
  return headers;
24
25
  }, [authToken, userId]);
25
- const [timeline, setTimeline] = React3.useState([]);
26
- const [currentVersion, setCurrentVersion] = React3.useState(1);
27
- const [isLoading, setIsLoading] = React3.useState(false);
28
- const [error, setError] = React3.useState(null);
29
- const refresh = React3.useCallback(async () => {
26
+ const [timeline, setTimeline] = React2.useState([]);
27
+ const [currentVersion, setCurrentVersion] = React2.useState(1);
28
+ const [isLoading, setIsLoading] = React2.useState(false);
29
+ const [error, setError] = React2.useState(null);
30
+ const refresh = React2.useCallback(async () => {
30
31
  if (!appId) return;
31
32
  setIsLoading(true);
32
33
  setError(null);
@@ -75,7 +76,7 @@ function useOrbitalHistory(options) {
75
76
  setIsLoading(false);
76
77
  }
77
78
  }, [appId, getHeaders2]);
78
- const revertToSnapshot = React3.useCallback(async (snapshotId) => {
79
+ const revertToSnapshot = React2.useCallback(async (snapshotId) => {
79
80
  if (!appId) {
80
81
  return { success: false, error: "No app ID provided" };
81
82
  }
@@ -109,12 +110,12 @@ function useOrbitalHistory(options) {
109
110
  };
110
111
  }
111
112
  }, [appId, getHeaders2, refresh, onRevertSuccess]);
112
- React3.useEffect(() => {
113
+ React2.useEffect(() => {
113
114
  if (appId && authToken && userId) {
114
115
  refresh();
115
116
  }
116
117
  }, [appId, authToken, userId]);
117
- React3.useEffect(() => {
118
+ React2.useEffect(() => {
118
119
  onHistoryChange?.(timeline);
119
120
  }, [timeline]);
120
121
  return {
@@ -127,15 +128,15 @@ function useOrbitalHistory(options) {
127
128
  };
128
129
  }
129
130
  function useFileSystem() {
130
- const [status, setStatus] = React3.useState("idle");
131
- const [error, setError] = React3.useState(null);
132
- const [isLoading, setIsLoading] = React3.useState(false);
133
- const [files, setFiles] = React3.useState([]);
134
- const [selectedFile, setSelectedFile] = React3.useState(null);
135
- const [selectedPath, setSelectedPath] = React3.useState(null);
136
- const [previewUrl, setPreviewUrl] = React3.useState(null);
137
- const [fileContents, setFileContents] = React3.useState(/* @__PURE__ */ new Map());
138
- const boot = React3.useCallback(async () => {
131
+ const [status, setStatus] = React2.useState("idle");
132
+ const [error, setError] = React2.useState(null);
133
+ const [isLoading, setIsLoading] = React2.useState(false);
134
+ const [files, setFiles] = React2.useState([]);
135
+ const [selectedFile, setSelectedFile] = React2.useState(null);
136
+ const [selectedPath, setSelectedPath] = React2.useState(null);
137
+ const [previewUrl, setPreviewUrl] = React2.useState(null);
138
+ const [fileContents, setFileContents] = React2.useState(/* @__PURE__ */ new Map());
139
+ const boot = React2.useCallback(async () => {
139
140
  setStatus("booting");
140
141
  setError(null);
141
142
  setIsLoading(true);
@@ -150,7 +151,7 @@ function useFileSystem() {
150
151
  setIsLoading(false);
151
152
  }
152
153
  }, []);
153
- const mountFiles = React3.useCallback(async (filesToMount) => {
154
+ const mountFiles = React2.useCallback(async (filesToMount) => {
154
155
  setIsLoading(true);
155
156
  try {
156
157
  let filesArray;
@@ -208,17 +209,17 @@ function useFileSystem() {
208
209
  setIsLoading(false);
209
210
  }
210
211
  }, []);
211
- const readFile = React3.useCallback(async (path) => {
212
+ const readFile = React2.useCallback(async (path) => {
212
213
  return fileContents.get(path) || "";
213
214
  }, [fileContents]);
214
- const writeFile = React3.useCallback(async (path, content) => {
215
+ const writeFile = React2.useCallback(async (path, content) => {
215
216
  setFileContents((prev) => {
216
217
  const next = new Map(prev);
217
218
  next.set(path, content);
218
219
  return next;
219
220
  });
220
221
  }, []);
221
- const selectFile = React3.useCallback(async (path) => {
222
+ const selectFile = React2.useCallback(async (path) => {
222
223
  const content = fileContents.get(path) || "";
223
224
  const ext = path.split(".").pop()?.toLowerCase() || "";
224
225
  const languageMap = {
@@ -240,7 +241,7 @@ function useFileSystem() {
240
241
  isDirty: false
241
242
  });
242
243
  }, [fileContents]);
243
- const updateContent = React3.useCallback((pathOrContent, contentArg) => {
244
+ const updateContent = React2.useCallback((pathOrContent, contentArg) => {
244
245
  const path = contentArg !== void 0 ? pathOrContent : selectedPath;
245
246
  const content = contentArg !== void 0 ? contentArg : pathOrContent;
246
247
  if (!path) {
@@ -256,17 +257,17 @@ function useFileSystem() {
256
257
  setSelectedFile((prev) => prev ? { ...prev, content, isDirty: true } : null);
257
258
  }
258
259
  }, [selectedPath]);
259
- const updateSelectedContent = React3.useCallback((content) => {
260
+ const updateSelectedContent = React2.useCallback((content) => {
260
261
  setSelectedFile((prev) => prev ? { ...prev, content, isDirty: true } : null);
261
262
  }, []);
262
- const refreshTree = React3.useCallback(async () => {
263
+ const refreshTree = React2.useCallback(async () => {
263
264
  console.log("[useFileSystem] Refreshing tree");
264
265
  }, []);
265
- const runCommand = React3.useCallback(async (command) => {
266
+ const runCommand = React2.useCallback(async (command) => {
266
267
  console.log("[useFileSystem] Running command:", command);
267
268
  return { exitCode: 0, output: "" };
268
269
  }, []);
269
- const startDevServer = React3.useCallback(async () => {
270
+ const startDevServer = React2.useCallback(async () => {
270
271
  console.log("[useFileSystem] Starting dev server");
271
272
  setPreviewUrl("http://localhost:5173");
272
273
  }, []);
@@ -303,14 +304,14 @@ var defaultManifest = {
303
304
  };
304
305
  function useExtensions(options) {
305
306
  const { appId, loadOnMount = true } = options;
306
- const [extensions, setExtensions] = React3.useState([]);
307
- const [manifest] = React3.useState(defaultManifest);
308
- const [isLoading, setIsLoading] = React3.useState(false);
309
- const [error, setError] = React3.useState(null);
310
- const loadExtension = React3.useCallback(async (extensionId) => {
307
+ const [extensions, setExtensions] = React2.useState([]);
308
+ const [manifest] = React2.useState(defaultManifest);
309
+ const [isLoading, setIsLoading] = React2.useState(false);
310
+ const [error, setError] = React2.useState(null);
311
+ const loadExtension = React2.useCallback(async (extensionId) => {
311
312
  console.log("[useExtensions] Loading extension:", extensionId);
312
313
  }, []);
313
- const loadExtensions = React3.useCallback(async () => {
314
+ const loadExtensions = React2.useCallback(async () => {
314
315
  setIsLoading(true);
315
316
  setError(null);
316
317
  try {
@@ -329,7 +330,7 @@ function useExtensions(options) {
329
330
  setIsLoading(false);
330
331
  }
331
332
  }, []);
332
- const getExtensionForFile = React3.useCallback((filename) => {
333
+ const getExtensionForFile = React2.useCallback((filename) => {
333
334
  const ext = filename.split(".").pop()?.toLowerCase();
334
335
  if (!ext) return null;
335
336
  const languageMap = {
@@ -347,7 +348,7 @@ function useExtensions(options) {
347
348
  if (!language) return null;
348
349
  return extensions.find((e) => e.language === language) || null;
349
350
  }, [extensions]);
350
- React3.useEffect(() => {
351
+ React2.useEffect(() => {
351
352
  if (!appId || !loadOnMount) return;
352
353
  const loadExtensions2 = async () => {
353
354
  setIsLoading(true);
@@ -382,11 +383,11 @@ function useExtensions(options) {
382
383
  }
383
384
  function useFileEditor(options) {
384
385
  const { extensions, fileSystem, onSchemaUpdate } = options;
385
- const [openFiles, setOpenFiles] = React3.useState([]);
386
- const [activeFilePath, setActiveFilePath] = React3.useState(null);
387
- const [isSaving, setIsSaving] = React3.useState(false);
386
+ const [openFiles, setOpenFiles] = React2.useState([]);
387
+ const [activeFilePath, setActiveFilePath] = React2.useState(null);
388
+ const [isSaving, setIsSaving] = React2.useState(false);
388
389
  const activeFile = openFiles.find((f) => f.path === activeFilePath) || null;
389
- const openFile = React3.useCallback(async (path) => {
390
+ const openFile = React2.useCallback(async (path) => {
390
391
  const existing = openFiles.find((f) => f.path === path);
391
392
  if (existing) {
392
393
  setActiveFilePath(path);
@@ -407,24 +408,24 @@ function useFileEditor(options) {
407
408
  console.error("[useFileEditor] Failed to open file:", err);
408
409
  }
409
410
  }, [openFiles, fileSystem, extensions]);
410
- const closeFile = React3.useCallback((path) => {
411
+ const closeFile = React2.useCallback((path) => {
411
412
  setOpenFiles((prev) => prev.filter((f) => f.path !== path));
412
413
  if (activeFilePath === path) {
413
414
  const remaining = openFiles.filter((f) => f.path !== path);
414
415
  setActiveFilePath(remaining.length > 0 ? remaining[0].path : null);
415
416
  }
416
417
  }, [activeFilePath, openFiles]);
417
- const setActiveFile = React3.useCallback((path) => {
418
+ const setActiveFile = React2.useCallback((path) => {
418
419
  setActiveFilePath(path);
419
420
  }, []);
420
- const updateFileContent = React3.useCallback((path, content) => {
421
+ const updateFileContent = React2.useCallback((path, content) => {
421
422
  setOpenFiles(
422
423
  (prev) => prev.map(
423
424
  (f) => f.path === path ? { ...f, content, isDirty: true } : f
424
425
  )
425
426
  );
426
427
  }, []);
427
- const handleFileEdit = React3.useCallback(async (path, content) => {
428
+ const handleFileEdit = React2.useCallback(async (path, content) => {
428
429
  try {
429
430
  await fileSystem.writeFile(path, content);
430
431
  let action = "saved";
@@ -446,7 +447,7 @@ function useFileEditor(options) {
446
447
  };
447
448
  }
448
449
  }, [fileSystem, onSchemaUpdate]);
449
- const saveFile = React3.useCallback(async (path) => {
450
+ const saveFile = React2.useCallback(async (path) => {
450
451
  const file = openFiles.find((f) => f.path === path);
451
452
  if (!file) return;
452
453
  setIsSaving(true);
@@ -470,7 +471,7 @@ function useFileEditor(options) {
470
471
  setIsSaving(false);
471
472
  }
472
473
  }, [openFiles, fileSystem, onSchemaUpdate]);
473
- const saveAllFiles = React3.useCallback(async () => {
474
+ const saveAllFiles = React2.useCallback(async () => {
474
475
  setIsSaving(true);
475
476
  try {
476
477
  const dirtyFiles = openFiles.filter((f) => f.isDirty);
@@ -495,11 +496,11 @@ function useFileEditor(options) {
495
496
  };
496
497
  }
497
498
  function useCompile() {
498
- const [isCompiling, setIsCompiling] = React3.useState(false);
499
- const [stage, setStage] = React3.useState("idle");
500
- const [lastResult, setLastResult] = React3.useState(null);
501
- const [error, setError] = React3.useState(null);
502
- const compileSchema = React3.useCallback(async (schema) => {
499
+ const [isCompiling, setIsCompiling] = React2.useState(false);
500
+ const [stage, setStage] = React2.useState("idle");
501
+ const [lastResult, setLastResult] = React2.useState(null);
502
+ const [error, setError] = React2.useState(null);
503
+ const compileSchema = React2.useCallback(async (schema) => {
503
504
  setIsCompiling(true);
504
505
  setStage("compiling");
505
506
  setError(null);
@@ -531,18 +532,18 @@ function useCompile() {
531
532
  };
532
533
  }
533
534
  function usePreview(options) {
534
- const [previewUrl, setPreviewUrl] = React3.useState(null);
535
- const [isLoading, setIsLoading] = React3.useState(!!options?.appId);
536
- const [error, setError] = React3.useState(null);
537
- const [loadError, setLoadError] = React3.useState(null);
538
- const [app, setApp] = React3.useState(null);
539
- const [isFullscreen, setIsFullscreen] = React3.useState(false);
540
- const [isExecutingEvent, setIsExecutingEvent] = React3.useState(false);
541
- const [errorToast, setErrorToast] = React3.useState(null);
542
- const [currentStateName, setCurrentStateName] = React3.useState(null);
543
- const [notificationsList, setNotificationsList] = React3.useState([]);
544
- const [isPanelOpen, setIsPanelOpen] = React3.useState(false);
545
- const notifications = React3.useMemo(() => ({
535
+ const [previewUrl, setPreviewUrl] = React2.useState(null);
536
+ const [isLoading, setIsLoading] = React2.useState(!!options?.appId);
537
+ const [error, setError] = React2.useState(null);
538
+ const [loadError, setLoadError] = React2.useState(null);
539
+ const [app, setApp] = React2.useState(null);
540
+ const [isFullscreen, setIsFullscreen] = React2.useState(false);
541
+ const [isExecutingEvent, setIsExecutingEvent] = React2.useState(false);
542
+ const [errorToast, setErrorToast] = React2.useState(null);
543
+ const [currentStateName, setCurrentStateName] = React2.useState(null);
544
+ const [notificationsList, setNotificationsList] = React2.useState([]);
545
+ const [isPanelOpen, setIsPanelOpen] = React2.useState(false);
546
+ const notifications = React2.useMemo(() => ({
546
547
  notifications: notificationsList,
547
548
  isPanelOpen,
548
549
  closePanel: () => setIsPanelOpen(false),
@@ -556,7 +557,7 @@ function usePreview(options) {
556
557
  },
557
558
  clearAll: () => setNotificationsList([])
558
559
  }), [notificationsList, isPanelOpen]);
559
- React3.useEffect(() => {
560
+ React2.useEffect(() => {
560
561
  const appId = options?.appId;
561
562
  if (!appId) {
562
563
  setApp(null);
@@ -567,10 +568,10 @@ function usePreview(options) {
567
568
  setPreviewUrl(`/api/orbitals/${appId}`);
568
569
  setIsLoading(false);
569
570
  }, [options?.appId]);
570
- const startPreview = React3.useCallback(async () => {
571
+ const startPreview = React2.useCallback(async () => {
571
572
  console.log("[usePreview] startPreview called");
572
573
  }, []);
573
- const stopPreview = React3.useCallback(async () => {
574
+ const stopPreview = React2.useCallback(async () => {
574
575
  setIsLoading(true);
575
576
  try {
576
577
  console.log("[usePreview] Stopping preview server...");
@@ -580,16 +581,16 @@ function usePreview(options) {
580
581
  setIsLoading(false);
581
582
  }
582
583
  }, []);
583
- const refresh = React3.useCallback(async () => {
584
+ const refresh = React2.useCallback(async () => {
584
585
  if (!previewUrl) return;
585
586
  console.log("[usePreview] Refreshing preview...");
586
587
  setPreviewUrl(`${previewUrl.split("?")[0]}?t=${Date.now()}`);
587
588
  }, [previewUrl]);
588
- const handleRefresh = React3.useCallback(async () => {
589
+ const handleRefresh = React2.useCallback(async () => {
589
590
  console.log("[usePreview] Handle refresh...");
590
591
  await refresh();
591
592
  }, [refresh]);
592
- const handleReset = React3.useCallback(async () => {
593
+ const handleReset = React2.useCallback(async () => {
593
594
  console.log("[usePreview] Resetting preview...");
594
595
  setError(null);
595
596
  setLoadError(null);
@@ -597,10 +598,10 @@ function usePreview(options) {
597
598
  setIsExecutingEvent(false);
598
599
  setCurrentStateName(null);
599
600
  }, []);
600
- const toggleFullscreen = React3.useCallback(() => {
601
+ const toggleFullscreen = React2.useCallback(() => {
601
602
  setIsFullscreen((prev) => !prev);
602
603
  }, []);
603
- const dismissErrorToast = React3.useCallback(() => {
604
+ const dismissErrorToast = React2.useCallback(() => {
604
605
  setErrorToast(null);
605
606
  }, []);
606
607
  return {
@@ -625,16 +626,16 @@ function usePreview(options) {
625
626
  };
626
627
  }
627
628
  function useAgentChat(options) {
628
- const [messages, setMessages] = React3.useState([]);
629
- const [status, setStatus] = React3.useState("idle");
630
- const [activities, setActivities] = React3.useState([]);
631
- const [todos, setTodos] = React3.useState([]);
632
- const [schemaDiffs, setSchemaDiffs] = React3.useState([]);
633
- const [isLoading, setIsLoading] = React3.useState(false);
634
- const [error, setError] = React3.useState(null);
635
- const [threadId] = React3.useState(null);
636
- const [interrupt, setInterrupt] = React3.useState(null);
637
- const sendMessage = React3.useCallback(async (content) => {
629
+ const [messages, setMessages] = React2.useState([]);
630
+ const [status, setStatus] = React2.useState("idle");
631
+ const [activities, setActivities] = React2.useState([]);
632
+ const [todos, setTodos] = React2.useState([]);
633
+ const [schemaDiffs, setSchemaDiffs] = React2.useState([]);
634
+ const [isLoading, setIsLoading] = React2.useState(false);
635
+ const [error, setError] = React2.useState(null);
636
+ const [threadId] = React2.useState(null);
637
+ const [interrupt, setInterrupt] = React2.useState(null);
638
+ const sendMessage = React2.useCallback(async (content) => {
638
639
  setIsLoading(true);
639
640
  setStatus("running");
640
641
  setError(null);
@@ -663,7 +664,7 @@ function useAgentChat(options) {
663
664
  setIsLoading(false);
664
665
  }
665
666
  }, [options]);
666
- const startGeneration = React3.useCallback(async (skill, prompt, genOptions) => {
667
+ const startGeneration = React2.useCallback(async (skill, prompt, genOptions) => {
667
668
  setStatus("running");
668
669
  setIsLoading(true);
669
670
  setError(null);
@@ -680,22 +681,22 @@ function useAgentChat(options) {
680
681
  setIsLoading(false);
681
682
  }
682
683
  }, [options]);
683
- const continueConversation = React3.useCallback(async (message) => {
684
+ const continueConversation = React2.useCallback(async (message) => {
684
685
  console.log("[useAgentChat] Continue conversation", message);
685
686
  }, []);
686
- const resumeWithDecision = React3.useCallback(async (decisions) => {
687
+ const resumeWithDecision = React2.useCallback(async (decisions) => {
687
688
  console.log("[useAgentChat] Resume with decision:", decisions);
688
689
  setInterrupt(null);
689
690
  }, []);
690
- const cancel = React3.useCallback(() => {
691
+ const cancel = React2.useCallback(() => {
691
692
  setStatus("idle");
692
693
  setIsLoading(false);
693
694
  setInterrupt(null);
694
695
  }, []);
695
- const clearMessages = React3.useCallback(() => {
696
+ const clearMessages = React2.useCallback(() => {
696
697
  setMessages([]);
697
698
  }, []);
698
- const clearHistory = React3.useCallback(() => {
699
+ const clearHistory = React2.useCallback(() => {
699
700
  setMessages([]);
700
701
  setActivities([]);
701
702
  setTodos([]);
@@ -722,13 +723,13 @@ function useAgentChat(options) {
722
723
  };
723
724
  }
724
725
  function useValidation() {
725
- const [result, setResult] = React3.useState(null);
726
- const [isValidating, setIsValidating] = React3.useState(false);
727
- const [error, setError] = React3.useState(null);
728
- const [stage, setStage] = React3.useState("idle");
729
- const [isFixing, setIsFixing] = React3.useState(false);
730
- const [progressMessage, setProgressMessage] = React3.useState(null);
731
- const validate = React3.useCallback(async (appId) => {
726
+ const [result, setResult] = React2.useState(null);
727
+ const [isValidating, setIsValidating] = React2.useState(false);
728
+ const [error, setError] = React2.useState(null);
729
+ const [stage, setStage] = React2.useState("idle");
730
+ const [isFixing, setIsFixing] = React2.useState(false);
731
+ const [progressMessage, setProgressMessage] = React2.useState(null);
732
+ const validate = React2.useCallback(async (appId) => {
732
733
  setIsValidating(true);
733
734
  setError(null);
734
735
  setStage("validating");
@@ -760,11 +761,11 @@ function useValidation() {
760
761
  setIsValidating(false);
761
762
  }
762
763
  }, []);
763
- const clearResult = React3.useCallback(() => {
764
+ const clearResult = React2.useCallback(() => {
764
765
  setResult(null);
765
766
  setError(null);
766
767
  }, []);
767
- const reset = React3.useCallback(() => {
768
+ const reset = React2.useCallback(() => {
768
769
  setResult(null);
769
770
  setError(null);
770
771
  setStage("idle");
@@ -788,15 +789,15 @@ function useValidation() {
788
789
  };
789
790
  }
790
791
  function useDeepAgentGeneration() {
791
- const [requests, setRequests] = React3.useState([]);
792
- const [currentRequest, setCurrentRequest] = React3.useState(null);
793
- const [isGenerating, setIsGenerating] = React3.useState(false);
794
- const [isLoading, setIsLoading] = React3.useState(false);
795
- const [isComplete, setIsComplete] = React3.useState(false);
796
- const [progress, setProgress] = React3.useState({ stage: "idle", percent: 0, message: "" });
797
- const [error, setError] = React3.useState(null);
798
- const [interrupt, setInterrupt] = React3.useState(null);
799
- const generate = React3.useCallback(async (prompt) => {
792
+ const [requests, setRequests] = React2.useState([]);
793
+ const [currentRequest, setCurrentRequest] = React2.useState(null);
794
+ const [isGenerating, setIsGenerating] = React2.useState(false);
795
+ const [isLoading, setIsLoading] = React2.useState(false);
796
+ const [isComplete, setIsComplete] = React2.useState(false);
797
+ const [progress, setProgress] = React2.useState({ stage: "idle", percent: 0, message: "" });
798
+ const [error, setError] = React2.useState(null);
799
+ const [interrupt, setInterrupt] = React2.useState(null);
800
+ const generate = React2.useCallback(async (prompt) => {
800
801
  setIsGenerating(true);
801
802
  setIsLoading(true);
802
803
  setIsComplete(false);
@@ -829,11 +830,11 @@ function useDeepAgentGeneration() {
829
830
  setIsLoading(false);
830
831
  }
831
832
  }, []);
832
- const startGeneration = React3.useCallback(async (skill, prompt, _options) => {
833
+ const startGeneration = React2.useCallback(async (skill, prompt, _options) => {
833
834
  console.log("[useDeepAgentGeneration] Starting generation with skill:", skill);
834
835
  await generate(prompt);
835
836
  }, [generate]);
836
- const cancelGeneration = React3.useCallback(() => {
837
+ const cancelGeneration = React2.useCallback(() => {
837
838
  if (currentRequest) {
838
839
  currentRequest.status = "failed";
839
840
  currentRequest.error = "Cancelled by user";
@@ -844,14 +845,14 @@ function useDeepAgentGeneration() {
844
845
  setIsComplete(false);
845
846
  setProgress({ stage: "idle", percent: 0, message: "" });
846
847
  }, [currentRequest]);
847
- const clearRequests = React3.useCallback(() => {
848
+ const clearRequests = React2.useCallback(() => {
848
849
  setRequests([]);
849
850
  setCurrentRequest(null);
850
851
  setError(null);
851
852
  setProgress({ stage: "idle", percent: 0, message: "" });
852
853
  setIsComplete(false);
853
854
  }, []);
854
- const submitInterruptDecisions = React3.useCallback((decisions) => {
855
+ const submitInterruptDecisions = React2.useCallback((decisions) => {
855
856
  console.log("[useDeepAgentGeneration] Submitting interrupt decisions:", decisions);
856
857
  setInterrupt(null);
857
858
  }, []);
@@ -871,9 +872,6 @@ function useDeepAgentGeneration() {
871
872
  submitInterruptDecisions
872
873
  };
873
874
  }
874
- var EventBusContext = React3.createContext(null);
875
-
876
- // hooks/useEventBus.ts
877
875
  function getGlobalEventBus() {
878
876
  if (typeof window !== "undefined") {
879
877
  return window.__kflowEventBus ?? null;
@@ -941,14 +939,14 @@ var fallbackEventBus = {
941
939
  }
942
940
  };
943
941
  function useEventBus() {
944
- const context = React3.useContext(EventBusContext);
942
+ const context = React2.useContext(providers.EventBusContext);
945
943
  return context ?? getGlobalEventBus() ?? fallbackEventBus;
946
944
  }
947
945
  function useEventListener(event, handler) {
948
946
  const eventBus = useEventBus();
949
- const handlerRef = React3.useRef(handler);
947
+ const handlerRef = React2.useRef(handler);
950
948
  handlerRef.current = handler;
951
- React3.useEffect(() => {
949
+ React2.useEffect(() => {
952
950
  const wrappedHandler = (evt) => {
953
951
  handlerRef.current(evt);
954
952
  };
@@ -960,7 +958,7 @@ function useEventListener(event, handler) {
960
958
  }
961
959
  function useEmitEvent() {
962
960
  const eventBus = useEventBus();
963
- return React3.useCallback(
961
+ return React2.useCallback(
964
962
  (type, payload) => {
965
963
  eventBus.emit(type, payload);
966
964
  },
@@ -986,16 +984,16 @@ function generateId() {
986
984
  return `slot-content-${++idCounter}-${Date.now()}`;
987
985
  }
988
986
  function useUISlotManager() {
989
- const [slots, setSlots] = React3.useState(DEFAULT_SLOTS);
990
- const subscribersRef = React3.useRef(/* @__PURE__ */ new Set());
991
- const timersRef = React3.useRef(/* @__PURE__ */ new Map());
992
- React3.useEffect(() => {
987
+ const [slots, setSlots] = React2.useState(DEFAULT_SLOTS);
988
+ const subscribersRef = React2.useRef(/* @__PURE__ */ new Set());
989
+ const timersRef = React2.useRef(/* @__PURE__ */ new Map());
990
+ React2.useEffect(() => {
993
991
  return () => {
994
992
  timersRef.current.forEach((timer) => clearTimeout(timer));
995
993
  timersRef.current.clear();
996
994
  };
997
995
  }, []);
998
- const notifySubscribers = React3.useCallback((slot, content) => {
996
+ const notifySubscribers = React2.useCallback((slot, content) => {
999
997
  subscribersRef.current.forEach((callback) => {
1000
998
  try {
1001
999
  callback(slot, content);
@@ -1004,7 +1002,7 @@ function useUISlotManager() {
1004
1002
  }
1005
1003
  });
1006
1004
  }, []);
1007
- const render = React3.useCallback((config) => {
1005
+ const render = React2.useCallback((config) => {
1008
1006
  const id = generateId();
1009
1007
  const content = {
1010
1008
  id,
@@ -1043,7 +1041,7 @@ function useUISlotManager() {
1043
1041
  });
1044
1042
  return id;
1045
1043
  }, [notifySubscribers]);
1046
- const clear = React3.useCallback((slot) => {
1044
+ const clear = React2.useCallback((slot) => {
1047
1045
  setSlots((prev) => {
1048
1046
  const content = prev[slot];
1049
1047
  if (content) {
@@ -1058,7 +1056,7 @@ function useUISlotManager() {
1058
1056
  return { ...prev, [slot]: null };
1059
1057
  });
1060
1058
  }, [notifySubscribers]);
1061
- const clearById = React3.useCallback((id) => {
1059
+ const clearById = React2.useCallback((id) => {
1062
1060
  setSlots((prev) => {
1063
1061
  const entry = Object.entries(prev).find(([, content]) => content?.id === id);
1064
1062
  if (entry) {
@@ -1075,7 +1073,7 @@ function useUISlotManager() {
1075
1073
  return prev;
1076
1074
  });
1077
1075
  }, [notifySubscribers]);
1078
- const clearAll = React3.useCallback(() => {
1076
+ const clearAll = React2.useCallback(() => {
1079
1077
  timersRef.current.forEach((timer) => clearTimeout(timer));
1080
1078
  timersRef.current.clear();
1081
1079
  setSlots((prev) => {
@@ -1088,16 +1086,16 @@ function useUISlotManager() {
1088
1086
  return DEFAULT_SLOTS;
1089
1087
  });
1090
1088
  }, [notifySubscribers]);
1091
- const subscribe2 = React3.useCallback((callback) => {
1089
+ const subscribe2 = React2.useCallback((callback) => {
1092
1090
  subscribersRef.current.add(callback);
1093
1091
  return () => {
1094
1092
  subscribersRef.current.delete(callback);
1095
1093
  };
1096
1094
  }, []);
1097
- const hasContent = React3.useCallback((slot) => {
1095
+ const hasContent = React2.useCallback((slot) => {
1098
1096
  return slots[slot] !== null;
1099
1097
  }, [slots]);
1100
- const getContent = React3.useCallback((slot) => {
1098
+ const getContent = React2.useCallback((slot) => {
1101
1099
  return slots[slot];
1102
1100
  }, [slots]);
1103
1101
  return {
@@ -1111,7 +1109,7 @@ function useUISlotManager() {
1111
1109
  getContent
1112
1110
  };
1113
1111
  }
1114
- var SelectionContext = React3.createContext(null);
1112
+ var SelectionContext = React2.createContext(null);
1115
1113
 
1116
1114
  // hooks/useUIEvents.ts
1117
1115
  var UI_EVENT_MAP = {
@@ -1143,12 +1141,12 @@ function useUIEvents(dispatch, validEvents, eventBusInstance) {
1143
1141
  const defaultEventBus = useEventBus();
1144
1142
  const eventBus = eventBusInstance ?? defaultEventBus;
1145
1143
  const validEventsKey = validEvents ? validEvents.slice().sort().join(",") : "";
1146
- const stableValidEvents = React3.useMemo(
1144
+ const stableValidEvents = React2.useMemo(
1147
1145
  () => validEvents,
1148
1146
  [validEventsKey]
1149
1147
  // intentional — validEventsKey is the stable dep, not validEvents array ref
1150
1148
  );
1151
- React3.useEffect(() => {
1149
+ React2.useEffect(() => {
1152
1150
  const unsubscribes = [];
1153
1151
  Object.entries(UI_EVENT_MAP).forEach(([uiEvent, smEvent]) => {
1154
1152
  const handler = (event) => {
@@ -1199,9 +1197,9 @@ function useSelectedEntity(eventBusInstance) {
1199
1197
  const defaultEventBus = useEventBus();
1200
1198
  const eventBus = eventBusInstance ?? defaultEventBus;
1201
1199
  const selectionContext = useSelectionContext();
1202
- const [localSelected, setLocalSelected] = React3.useState(null);
1200
+ const [localSelected, setLocalSelected] = React2.useState(null);
1203
1201
  const usingContext = selectionContext !== null;
1204
- React3.useEffect(() => {
1202
+ React2.useEffect(() => {
1205
1203
  if (usingContext) return;
1206
1204
  const handleSelect = (event) => {
1207
1205
  const row = event.payload?.row;
@@ -1231,22 +1229,22 @@ function useSelectedEntity(eventBusInstance) {
1231
1229
  return [localSelected, setLocalSelected];
1232
1230
  }
1233
1231
  function useSelectionContext() {
1234
- const context = React3.useContext(SelectionContext);
1232
+ const context = React2.useContext(SelectionContext);
1235
1233
  return context;
1236
1234
  }
1237
- var EntityDataContext = React3.createContext(null);
1235
+ var EntityDataContext = React2.createContext(null);
1238
1236
  function EntityDataProvider({
1239
1237
  adapter,
1240
1238
  children
1241
1239
  }) {
1242
- return React3__default.default.createElement(
1240
+ return React2__default.default.createElement(
1243
1241
  EntityDataContext.Provider,
1244
1242
  { value: adapter },
1245
1243
  children
1246
1244
  );
1247
1245
  }
1248
1246
  function useEntityDataAdapter() {
1249
- return React3.useContext(EntityDataContext);
1247
+ return React2.useContext(EntityDataContext);
1250
1248
  }
1251
1249
  var entityDataKeys = {
1252
1250
  all: ["entities"],
@@ -1257,15 +1255,15 @@ var entityDataKeys = {
1257
1255
  };
1258
1256
  function useEntityList(entity, options = {}) {
1259
1257
  const { skip = false } = options;
1260
- const adapter = React3.useContext(EntityDataContext);
1261
- const adapterData = React3.useMemo(() => {
1258
+ const adapter = React2.useContext(EntityDataContext);
1259
+ const adapterData = React2.useMemo(() => {
1262
1260
  if (!adapter || !entity || skip) return [];
1263
1261
  return adapter.getData(entity);
1264
1262
  }, [adapter, entity, skip, adapter?.isLoading]);
1265
- const [stubData, setStubData] = React3.useState([]);
1266
- const [stubLoading, setStubLoading] = React3.useState(!skip && !!entity && !adapter);
1267
- const [stubError, setStubError] = React3.useState(null);
1268
- React3.useEffect(() => {
1263
+ const [stubData, setStubData] = React2.useState([]);
1264
+ const [stubLoading, setStubLoading] = React2.useState(!skip && !!entity && !adapter);
1265
+ const [stubError, setStubError] = React2.useState(null);
1266
+ React2.useEffect(() => {
1269
1267
  if (adapter || skip || !entity) {
1270
1268
  setStubLoading(false);
1271
1269
  return;
@@ -1290,15 +1288,15 @@ function useEntityList(entity, options = {}) {
1290
1288
  } };
1291
1289
  }
1292
1290
  function useEntity(entity, id) {
1293
- const adapter = React3.useContext(EntityDataContext);
1294
- const adapterData = React3.useMemo(() => {
1291
+ const adapter = React2.useContext(EntityDataContext);
1292
+ const adapterData = React2.useMemo(() => {
1295
1293
  if (!adapter || !entity || !id) return null;
1296
1294
  return adapter.getById(entity, id) ?? null;
1297
1295
  }, [adapter, entity, id, adapter?.isLoading]);
1298
- const [stubData, setStubData] = React3.useState(null);
1299
- const [stubLoading, setStubLoading] = React3.useState(!!entity && !!id && !adapter);
1300
- const [stubError, setStubError] = React3.useState(null);
1301
- React3.useEffect(() => {
1296
+ const [stubData, setStubData] = React2.useState(null);
1297
+ const [stubLoading, setStubLoading] = React2.useState(!!entity && !!id && !adapter);
1298
+ const [stubError, setStubError] = React2.useState(null);
1299
+ React2.useEffect(() => {
1302
1300
  if (adapter || !entity || !id) {
1303
1301
  setStubLoading(false);
1304
1302
  return;
@@ -1329,7 +1327,7 @@ function getSuspenseCacheKey(entity, type, id) {
1329
1327
  return id ? `${type}:${entity}:${id}` : `${type}:${entity}`;
1330
1328
  }
1331
1329
  function useEntityListSuspense(entity) {
1332
- const adapter = React3.useContext(EntityDataContext);
1330
+ const adapter = React2.useContext(EntityDataContext);
1333
1331
  if (adapter) {
1334
1332
  if (adapter.isLoading) {
1335
1333
  const cacheKey2 = getSuspenseCacheKey(entity, "list");
@@ -1383,7 +1381,7 @@ function useEntityListSuspense(entity) {
1383
1381
  } };
1384
1382
  }
1385
1383
  function useEntitySuspense(entity, id) {
1386
- const adapter = React3.useContext(EntityDataContext);
1384
+ const adapter = React2.useContext(EntityDataContext);
1387
1385
  if (adapter) {
1388
1386
  if (adapter.isLoading) {
1389
1387
  const cacheKey2 = getSuspenseCacheKey(entity, "detail", id);
@@ -1450,35 +1448,35 @@ function getOrCreateStore(query) {
1450
1448
  return queryStores.get(query);
1451
1449
  }
1452
1450
  function useQuerySingleton(query) {
1453
- const [, forceUpdate] = React3.useState({});
1451
+ const [, forceUpdate] = React2.useState({});
1454
1452
  if (!query) {
1455
1453
  return null;
1456
1454
  }
1457
- const store = React3.useMemo(() => getOrCreateStore(query), [query]);
1458
- React3.useMemo(() => {
1455
+ const store = React2.useMemo(() => getOrCreateStore(query), [query]);
1456
+ React2.useMemo(() => {
1459
1457
  const listener = () => forceUpdate({});
1460
1458
  store.listeners.add(listener);
1461
1459
  return () => {
1462
1460
  store.listeners.delete(listener);
1463
1461
  };
1464
1462
  }, [store]);
1465
- const notifyListeners = React3.useCallback(() => {
1463
+ const notifyListeners = React2.useCallback(() => {
1466
1464
  store.listeners.forEach((listener) => listener());
1467
1465
  }, [store]);
1468
- const setSearch = React3.useCallback((value) => {
1466
+ const setSearch = React2.useCallback((value) => {
1469
1467
  store.search = value;
1470
1468
  notifyListeners();
1471
1469
  }, [store, notifyListeners]);
1472
- const setFilter = React3.useCallback((key, value) => {
1470
+ const setFilter = React2.useCallback((key, value) => {
1473
1471
  store.filters = { ...store.filters, [key]: value };
1474
1472
  notifyListeners();
1475
1473
  }, [store, notifyListeners]);
1476
- const clearFilters = React3.useCallback(() => {
1474
+ const clearFilters = React2.useCallback(() => {
1477
1475
  store.filters = {};
1478
1476
  store.search = "";
1479
1477
  notifyListeners();
1480
1478
  }, [store, notifyListeners]);
1481
- const setSort = React3.useCallback((field, direction) => {
1479
+ const setSort = React2.useCallback((field, direction) => {
1482
1480
  store.sortField = field;
1483
1481
  store.sortDirection = direction;
1484
1482
  notifyListeners();
@@ -1945,7 +1943,7 @@ function getSnapshot() {
1945
1943
 
1946
1944
  // hooks/useEntities.ts
1947
1945
  function useEntities() {
1948
- const entities2 = React3.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1946
+ const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1949
1947
  return {
1950
1948
  entities: entities2,
1951
1949
  getEntity,
@@ -1960,34 +1958,34 @@ function useEntities() {
1960
1958
  };
1961
1959
  }
1962
1960
  function useEntity2(id) {
1963
- const entities2 = React3.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1961
+ const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1964
1962
  return entities2.get(id);
1965
1963
  }
1966
1964
  function useEntitiesByType(type) {
1967
- const entities2 = React3.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1965
+ const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1968
1966
  return [...entities2.values()].filter((e) => e.type === type);
1969
1967
  }
1970
1968
  function useSingletonEntity(type) {
1971
- const entities2 = React3.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1969
+ const entities2 = React2.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1972
1970
  return [...entities2.values()].find((e) => e.type === type);
1973
1971
  }
1974
1972
  function usePlayer() {
1975
1973
  const player = useSingletonEntity("Player");
1976
- const update = React3.useCallback((updates) => {
1974
+ const update = React2.useCallback((updates) => {
1977
1975
  if (player) updateEntity(player.id, updates);
1978
1976
  }, [player?.id]);
1979
1977
  return { player, updatePlayer: update };
1980
1978
  }
1981
1979
  function usePhysics() {
1982
1980
  const physics = useSingletonEntity("Physics");
1983
- const update = React3.useCallback((updates) => {
1981
+ const update = React2.useCallback((updates) => {
1984
1982
  if (physics) updateEntity(physics.id, updates);
1985
1983
  }, [physics?.id]);
1986
1984
  return { physics, updatePhysics: update };
1987
1985
  }
1988
1986
  function useInput() {
1989
1987
  const input = useSingletonEntity("Input");
1990
- const update = React3.useCallback((updates) => {
1988
+ const update = React2.useCallback((updates) => {
1991
1989
  if (input) updateEntity(input.id, updates);
1992
1990
  }, [input?.id]);
1993
1991
  return { input, updateInput: update };
@@ -2102,7 +2100,7 @@ var en_default = {
2102
2100
  // hooks/useTranslate.ts
2103
2101
  var { $meta: _meta, ...coreMessages } = en_default;
2104
2102
  var coreLocale = coreMessages;
2105
- var I18nContext = React3.createContext({
2103
+ var I18nContext = React2.createContext({
2106
2104
  locale: "en",
2107
2105
  direction: "ltr",
2108
2106
  t: (key) => coreLocale[key] ?? key
@@ -2111,7 +2109,7 @@ var I18nContext = React3.createContext({
2111
2109
  I18nContext.displayName = "I18nContext";
2112
2110
  var I18nProvider = I18nContext.Provider;
2113
2111
  function useTranslate() {
2114
- return React3.useContext(I18nContext);
2112
+ return React2.useContext(I18nContext);
2115
2113
  }
2116
2114
  function createTranslate(messages) {
2117
2115
  return (key, params) => {
@@ -2127,7 +2125,7 @@ function createTranslate(messages) {
2127
2125
  function useResolvedEntity(entity, data) {
2128
2126
  const shouldFetch = !data && !!entity;
2129
2127
  const fetched = useEntityList(entity, { skip: !shouldFetch });
2130
- return React3.useMemo(() => {
2128
+ return React2.useMemo(() => {
2131
2129
  if (data) {
2132
2130
  return {
2133
2131
  data,
@@ -2156,14 +2154,14 @@ function useAuthContext() {
2156
2154
  }
2157
2155
  function useSwipeGesture(callbacks, options = {}) {
2158
2156
  const { threshold = 50, velocityThreshold = 0.3, preventDefault = false } = options;
2159
- const startX = React3.useRef(0);
2160
- const startY = React3.useRef(0);
2161
- const startTime = React3.useRef(0);
2162
- const currentX = React3.useRef(0);
2163
- const tracking = React3.useRef(false);
2164
- const offsetXRef = React3.useRef(0);
2165
- const isSwipingRef = React3.useRef(false);
2166
- const onPointerDown = React3.useCallback((e) => {
2157
+ const startX = React2.useRef(0);
2158
+ const startY = React2.useRef(0);
2159
+ const startTime = React2.useRef(0);
2160
+ const currentX = React2.useRef(0);
2161
+ const tracking = React2.useRef(false);
2162
+ const offsetXRef = React2.useRef(0);
2163
+ const isSwipingRef = React2.useRef(false);
2164
+ const onPointerDown = React2.useCallback((e) => {
2167
2165
  startX.current = e.clientX;
2168
2166
  startY.current = e.clientY;
2169
2167
  currentX.current = e.clientX;
@@ -2173,7 +2171,7 @@ function useSwipeGesture(callbacks, options = {}) {
2173
2171
  offsetXRef.current = 0;
2174
2172
  e.target.setPointerCapture?.(e.pointerId);
2175
2173
  }, []);
2176
- const onPointerMove = React3.useCallback((e) => {
2174
+ const onPointerMove = React2.useCallback((e) => {
2177
2175
  if (!tracking.current) return;
2178
2176
  if (preventDefault) e.preventDefault();
2179
2177
  currentX.current = e.clientX;
@@ -2184,7 +2182,7 @@ function useSwipeGesture(callbacks, options = {}) {
2184
2182
  offsetXRef.current = dx;
2185
2183
  }
2186
2184
  }, [preventDefault]);
2187
- const onPointerUp = React3.useCallback((e) => {
2185
+ const onPointerUp = React2.useCallback((e) => {
2188
2186
  if (!tracking.current) return;
2189
2187
  tracking.current = false;
2190
2188
  const dx = e.clientX - startX.current;
@@ -2202,7 +2200,7 @@ function useSwipeGesture(callbacks, options = {}) {
2202
2200
  else if (dy > threshold) callbacks.onSwipeDown?.();
2203
2201
  }
2204
2202
  }, [threshold, velocityThreshold, callbacks]);
2205
- const onPointerCancel = React3.useCallback(() => {
2203
+ const onPointerCancel = React2.useCallback(() => {
2206
2204
  tracking.current = false;
2207
2205
  offsetXRef.current = 0;
2208
2206
  isSwipingRef.current = false;
@@ -2218,18 +2216,18 @@ function useSwipeGesture(callbacks, options = {}) {
2218
2216
  }
2219
2217
  function useLongPress(onLongPress, options = {}) {
2220
2218
  const { duration = 500, moveThreshold = 10 } = options;
2221
- const timerRef = React3.useRef(null);
2222
- const startPos = React3.useRef({ x: 0, y: 0 });
2223
- const isPressedRef = React3.useRef(false);
2224
- const firedRef = React3.useRef(false);
2225
- const cancel = React3.useCallback(() => {
2219
+ const timerRef = React2.useRef(null);
2220
+ const startPos = React2.useRef({ x: 0, y: 0 });
2221
+ const isPressedRef = React2.useRef(false);
2222
+ const firedRef = React2.useRef(false);
2223
+ const cancel = React2.useCallback(() => {
2226
2224
  if (timerRef.current) {
2227
2225
  clearTimeout(timerRef.current);
2228
2226
  timerRef.current = null;
2229
2227
  }
2230
2228
  isPressedRef.current = false;
2231
2229
  }, []);
2232
- const onPointerDown = React3.useCallback((e) => {
2230
+ const onPointerDown = React2.useCallback((e) => {
2233
2231
  firedRef.current = false;
2234
2232
  startPos.current = { x: e.clientX, y: e.clientY };
2235
2233
  isPressedRef.current = true;
@@ -2239,7 +2237,7 @@ function useLongPress(onLongPress, options = {}) {
2239
2237
  onLongPress();
2240
2238
  }, duration);
2241
2239
  }, [duration, onLongPress]);
2242
- const onPointerMove = React3.useCallback((e) => {
2240
+ const onPointerMove = React2.useCallback((e) => {
2243
2241
  if (!isPressedRef.current) return;
2244
2242
  const dx = e.clientX - startPos.current.x;
2245
2243
  const dy = e.clientY - startPos.current.y;
@@ -2247,10 +2245,10 @@ function useLongPress(onLongPress, options = {}) {
2247
2245
  cancel();
2248
2246
  }
2249
2247
  }, [moveThreshold, cancel]);
2250
- const onPointerUp = React3.useCallback(() => {
2248
+ const onPointerUp = React2.useCallback(() => {
2251
2249
  cancel();
2252
2250
  }, [cancel]);
2253
- const onPointerCancel = React3.useCallback(() => {
2251
+ const onPointerCancel = React2.useCallback(() => {
2254
2252
  cancel();
2255
2253
  }, [cancel]);
2256
2254
  return {
@@ -2262,22 +2260,22 @@ function useLongPress(onLongPress, options = {}) {
2262
2260
  };
2263
2261
  }
2264
2262
  function useDragReorder(initialItems, onReorder) {
2265
- const [items, setItems] = React3.useState(initialItems);
2266
- const [dragIndex, setDragIndex] = React3.useState(-1);
2267
- const [dragOverIndex, setDragOverIndex] = React3.useState(-1);
2268
- const itemsRef = React3.useRef(initialItems);
2263
+ const [items, setItems] = React2.useState(initialItems);
2264
+ const [dragIndex, setDragIndex] = React2.useState(-1);
2265
+ const [dragOverIndex, setDragOverIndex] = React2.useState(-1);
2266
+ const itemsRef = React2.useRef(initialItems);
2269
2267
  if (initialItems !== itemsRef.current) {
2270
2268
  itemsRef.current = initialItems;
2271
2269
  setItems(initialItems);
2272
2270
  }
2273
2271
  const isDragging = dragIndex >= 0;
2274
- const handleDragStart = React3.useCallback((index) => (e) => {
2272
+ const handleDragStart = React2.useCallback((index) => (e) => {
2275
2273
  e.preventDefault();
2276
2274
  setDragIndex(index);
2277
2275
  setDragOverIndex(index);
2278
2276
  e.target.setPointerCapture?.(e.pointerId);
2279
2277
  }, []);
2280
- const handleDragMove = React3.useCallback((index) => (e) => {
2278
+ const handleDragMove = React2.useCallback((index) => (e) => {
2281
2279
  if (dragIndex < 0) return;
2282
2280
  const target = document.elementFromPoint(e.clientX, e.clientY);
2283
2281
  if (!target) return;
@@ -2292,7 +2290,7 @@ function useDragReorder(initialItems, onReorder) {
2292
2290
  }
2293
2291
  }
2294
2292
  }, [dragIndex, dragOverIndex]);
2295
- const handleDragEnd = React3.useCallback(() => {
2293
+ const handleDragEnd = React2.useCallback(() => {
2296
2294
  if (dragIndex >= 0 && dragOverIndex >= 0 && dragIndex !== dragOverIndex) {
2297
2295
  const newItems = [...items];
2298
2296
  const [movedItem] = newItems.splice(dragIndex, 1);
@@ -2303,13 +2301,13 @@ function useDragReorder(initialItems, onReorder) {
2303
2301
  setDragIndex(-1);
2304
2302
  setDragOverIndex(-1);
2305
2303
  }, [dragIndex, dragOverIndex, items, onReorder]);
2306
- const getDragHandleProps = React3.useCallback((index) => ({
2304
+ const getDragHandleProps = React2.useCallback((index) => ({
2307
2305
  onPointerDown: handleDragStart(index),
2308
2306
  style: { cursor: "grab", touchAction: "none" },
2309
2307
  "aria-grabbed": dragIndex === index,
2310
2308
  role: "button"
2311
2309
  }), [handleDragStart, dragIndex]);
2312
- const getItemProps = React3.useCallback((index) => ({
2310
+ const getItemProps = React2.useCallback((index) => ({
2313
2311
  onPointerMove: handleDragMove(index),
2314
2312
  onPointerUp: handleDragEnd,
2315
2313
  "aria-dropeffect": "move",
@@ -2331,19 +2329,19 @@ function useDragReorder(initialItems, onReorder) {
2331
2329
  }
2332
2330
  function useInfiniteScroll(onLoadMore, options = {}) {
2333
2331
  const { rootMargin = "200px", hasMore = true, isLoading = false } = options;
2334
- const observerRef = React3.useRef(null);
2335
- const callbackRef = React3.useRef(onLoadMore);
2332
+ const observerRef = React2.useRef(null);
2333
+ const callbackRef = React2.useRef(onLoadMore);
2336
2334
  callbackRef.current = onLoadMore;
2337
- const hasMoreRef = React3.useRef(hasMore);
2335
+ const hasMoreRef = React2.useRef(hasMore);
2338
2336
  hasMoreRef.current = hasMore;
2339
- const isLoadingRef = React3.useRef(isLoading);
2337
+ const isLoadingRef = React2.useRef(isLoading);
2340
2338
  isLoadingRef.current = isLoading;
2341
- React3.useEffect(() => {
2339
+ React2.useEffect(() => {
2342
2340
  return () => {
2343
2341
  observerRef.current?.disconnect();
2344
2342
  };
2345
2343
  }, []);
2346
- const sentinelRef = React3.useCallback((node) => {
2344
+ const sentinelRef = React2.useCallback((node) => {
2347
2345
  observerRef.current?.disconnect();
2348
2346
  if (!node) return;
2349
2347
  observerRef.current = new IntersectionObserver(
@@ -2361,12 +2359,12 @@ function useInfiniteScroll(onLoadMore, options = {}) {
2361
2359
  }
2362
2360
  function usePullToRefresh(onRefresh, options = {}) {
2363
2361
  const { threshold = 60, maxPull = 120 } = options;
2364
- const [pullDistance, setPullDistance] = React3.useState(0);
2365
- const [isPulling, setIsPulling] = React3.useState(false);
2366
- const [isRefreshing, setIsRefreshing] = React3.useState(false);
2367
- const startY = React3.useRef(0);
2368
- const scrollTopRef = React3.useRef(0);
2369
- const onTouchStart = React3.useCallback((e) => {
2362
+ const [pullDistance, setPullDistance] = React2.useState(0);
2363
+ const [isPulling, setIsPulling] = React2.useState(false);
2364
+ const [isRefreshing, setIsRefreshing] = React2.useState(false);
2365
+ const startY = React2.useRef(0);
2366
+ const scrollTopRef = React2.useRef(0);
2367
+ const onTouchStart = React2.useCallback((e) => {
2370
2368
  const container = e.currentTarget;
2371
2369
  scrollTopRef.current = container.scrollTop;
2372
2370
  if (scrollTopRef.current <= 0) {
@@ -2374,7 +2372,7 @@ function usePullToRefresh(onRefresh, options = {}) {
2374
2372
  setIsPulling(true);
2375
2373
  }
2376
2374
  }, []);
2377
- const onTouchMove = React3.useCallback((e) => {
2375
+ const onTouchMove = React2.useCallback((e) => {
2378
2376
  if (!isPulling || isRefreshing) return;
2379
2377
  const container = e.currentTarget;
2380
2378
  if (container.scrollTop > 0) {
@@ -2387,7 +2385,7 @@ function usePullToRefresh(onRefresh, options = {}) {
2387
2385
  setPullDistance(distance);
2388
2386
  }
2389
2387
  }, [isPulling, isRefreshing, maxPull]);
2390
- const onTouchEnd = React3.useCallback(() => {
2388
+ const onTouchEnd = React2.useCallback(() => {
2391
2389
  if (!isPulling) return;
2392
2390
  setIsPulling(false);
2393
2391
  if (pullDistance >= threshold && !isRefreshing) {
@@ -2398,7 +2396,7 @@ function usePullToRefresh(onRefresh, options = {}) {
2398
2396
  setPullDistance(0);
2399
2397
  }
2400
2398
  }, [isPulling, pullDistance, threshold, isRefreshing, onRefresh]);
2401
- const endRefresh = React3.useCallback(() => {
2399
+ const endRefresh = React2.useCallback(() => {
2402
2400
  setIsRefreshing(false);
2403
2401
  setPullDistance(0);
2404
2402
  }, []);
@@ -2426,18 +2424,18 @@ function getDistance(touches) {
2426
2424
  }
2427
2425
  function usePinchZoom(options = {}) {
2428
2426
  const { minScale = 0.5, maxScale = 4 } = options;
2429
- const [scale, setScale] = React3.useState(1);
2430
- const [isPinching, setIsPinching] = React3.useState(false);
2431
- const initialDistance = React3.useRef(0);
2432
- const initialScale = React3.useRef(1);
2433
- const onTouchStart = React3.useCallback((e) => {
2427
+ const [scale, setScale] = React2.useState(1);
2428
+ const [isPinching, setIsPinching] = React2.useState(false);
2429
+ const initialDistance = React2.useRef(0);
2430
+ const initialScale = React2.useRef(1);
2431
+ const onTouchStart = React2.useCallback((e) => {
2434
2432
  if (e.touches.length === 2) {
2435
2433
  initialDistance.current = getDistance(e.touches);
2436
2434
  initialScale.current = scale;
2437
2435
  setIsPinching(true);
2438
2436
  }
2439
2437
  }, [scale]);
2440
- const onTouchMove = React3.useCallback((e) => {
2438
+ const onTouchMove = React2.useCallback((e) => {
2441
2439
  if (e.touches.length !== 2 || !isPinching) return;
2442
2440
  e.preventDefault();
2443
2441
  const currentDistance = getDistance(e.touches);
@@ -2445,10 +2443,10 @@ function usePinchZoom(options = {}) {
2445
2443
  const newScale = Math.min(maxScale, Math.max(minScale, initialScale.current * ratio));
2446
2444
  setScale(newScale);
2447
2445
  }, [isPinching, minScale, maxScale]);
2448
- const onTouchEnd = React3.useCallback(() => {
2446
+ const onTouchEnd = React2.useCallback(() => {
2449
2447
  setIsPinching(false);
2450
2448
  }, []);
2451
- const resetZoom = React3.useCallback(() => {
2449
+ const resetZoom = React2.useCallback(() => {
2452
2450
  setScale(1);
2453
2451
  }, []);
2454
2452
  return {
@@ -2492,7 +2490,7 @@ function useGitHubStatus() {
2492
2490
  });
2493
2491
  }
2494
2492
  function useConnectGitHub() {
2495
- const connectGitHub = React3.useCallback(() => {
2493
+ const connectGitHub = React2.useCallback(() => {
2496
2494
  const userId = getUserId();
2497
2495
  const state = btoa(JSON.stringify({ userId, returnUrl: window.location.href }));
2498
2496
  window.location.href = `${API_BASE}/api/github/oauth/authorize?state=${state}`;