orbitchat 2.13.1 → 2.14.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.
Files changed (60) hide show
  1. package/README.md +271 -219
  2. package/bin/dev-server.js +0 -3
  3. package/bin/orbitchat.js +146 -82
  4. package/dist/assets/_baseUniq-BRKsqoH--68FUaYxk.js +1 -0
  5. package/dist/assets/{arc-pab_su9s-DFq3JYvb.js → arc-pab_su9s-BuY-VRZt.js} +1 -1
  6. package/dist/assets/{architectureDiagram-VXUJARFQ-DqQ8r_6g-ejnypLyO.js → architectureDiagram-VXUJARFQ-DqQ8r_6g-C5b5VsO8.js} +1 -1
  7. package/dist/assets/{blockDiagram-VD42YOAC-B-dKfcH3-Bgo8FU6J.js → blockDiagram-VD42YOAC-B-dKfcH3-DVjqMJ-3.js} +4 -4
  8. package/dist/assets/{c4Diagram-YG6GDRKO-DMUPaBEl-CX9lx-UK.js → c4Diagram-YG6GDRKO-DMUPaBEl-o6ghjFV9.js} +1 -1
  9. package/dist/assets/channel-HKsfPa5q-rOME8XF8.js +1 -0
  10. package/dist/assets/{chunk-4BX2VUAB-CX67kh_B-Dm2c-Lyy.js → chunk-4BX2VUAB-CX67kh_B-Dl0Loq_e.js} +1 -1
  11. package/dist/assets/{chunk-55IACEB6-BocSyyvr-lclbFu9j.js → chunk-55IACEB6-BocSyyvr-DYW83vZR.js} +1 -1
  12. package/dist/assets/{chunk-B4BG7PRW-CO8QAyfE-CvvrZ063.js → chunk-B4BG7PRW-CO8QAyfE-CsF1OX4R.js} +1 -1
  13. package/dist/assets/{chunk-DI55MBZ5-Dw1L6Eos-BuD2OREa.js → chunk-DI55MBZ5-Dw1L6Eos-Dl1shJzL.js} +3 -3
  14. package/dist/assets/{chunk-FMBD7UC4-dPK7Boav-D0ZlDI-s.js → chunk-FMBD7UC4-dPK7Boav-Cz7OoDLR.js} +1 -1
  15. package/dist/assets/{chunk-QN33PNHL-vP2PqfVG-DqaIoebO.js → chunk-QN33PNHL-vP2PqfVG-BuQNN8G2.js} +1 -1
  16. package/dist/assets/{chunk-QZHKN3VN-Bcidzu63-DG8agfQA.js → chunk-QZHKN3VN-Bcidzu63-Bud1NKOb.js} +1 -1
  17. package/dist/assets/{chunk-TZMSLE5B-BtljMjlg-B6xEnbcW.js → chunk-TZMSLE5B-BtljMjlg-BKLxPJ-x.js} +1 -1
  18. package/dist/assets/{classDiagram-2ON5EDUG-C7cYN9hv-Dd-YCt5Q.js → classDiagram-2ON5EDUG-C7cYN9hv-BHg-LSxQ.js} +1 -1
  19. package/dist/assets/{classDiagram-v2-WZHVMYZB-C7cYN9hv-Dd-YCt5Q.js → classDiagram-v2-WZHVMYZB-C7cYN9hv-BHg-LSxQ.js} +1 -1
  20. package/dist/assets/clone-DoPb9X13-DejjKfXe.js +1 -0
  21. package/dist/assets/{cose-bilkent-S5V4N54A-BGzO4EsH-BMVWyh_a.js → cose-bilkent-S5V4N54A-BGzO4EsH-rofdToAx.js} +1 -1
  22. package/dist/assets/{dagre-6UL2VRFP-TzNvXCds-CbmhexaH.js → dagre-6UL2VRFP-TzNvXCds-Ls1mVyc7.js} +1 -1
  23. package/dist/assets/{diagram-PSM6KHXK-BqY4RpUg-BqmtaKLy.js → diagram-PSM6KHXK-BqY4RpUg-BJmYXUei.js} +1 -1
  24. package/dist/assets/{diagram-QEK2KX5R-CTjgBsne-Dbl2BvQJ.js → diagram-QEK2KX5R-CTjgBsne-dz-VLadE.js} +1 -1
  25. package/dist/assets/{diagram-S2PKOQOG-BqrhTIpA-DnNkr8UG.js → diagram-S2PKOQOG-BqrhTIpA-ikxUE9Dj.js} +2 -2
  26. package/dist/assets/{erDiagram-Q2GNP2WA-B2hsi_Tl-r9lLCSiy.js → erDiagram-Q2GNP2WA-B2hsi_Tl-B5gu6Jrx.js} +1 -1
  27. package/dist/assets/{flowDiagram-NV44I4VS-C03vtt_F-Bj1MoEwx.js → flowDiagram-NV44I4VS-C03vtt_F-C9LVdVvn.js} +1 -1
  28. package/dist/assets/{ganttDiagram-JELNMOA3-B3hAg964-CCnbkzn3.js → ganttDiagram-JELNMOA3-B3hAg964-CYO6ZcQ8.js} +1 -1
  29. package/dist/assets/{gitGraphDiagram-NY62KEGX-ByhMH0yZ-YRu-SLHD.js → gitGraphDiagram-NY62KEGX-ByhMH0yZ-BvO0WGzP.js} +3 -3
  30. package/dist/assets/{graph-BmNkcFEM-dUEThWgx.js → graph-BmNkcFEM-Bl2fiTgr.js} +1 -1
  31. package/dist/assets/{index-BXexqYFc-6FZAvmAF.js → index-BXexqYFc-CFPIFV8r.js} +1 -1
  32. package/dist/assets/index-KsGsuMGp.css +1 -0
  33. package/dist/assets/{index-BTk6gbYa.js → index-nqhgVFEP.js} +219 -239
  34. package/dist/assets/infoDiagram-WHAUD3N6-is6Ho4-T-D6tHdi3J.js +2 -0
  35. package/dist/assets/{journeyDiagram-XKPGCS4Q-CRTOL26C-BslRBPzU.js → journeyDiagram-XKPGCS4Q-CRTOL26C-CL4DFaQP.js} +1 -1
  36. package/dist/assets/{kanban-definition-3W4ZIXB7-CNnO_t6O-C2MPRjuS.js → kanban-definition-3W4ZIXB7-CNnO_t6O-DZBlsSao.js} +6 -6
  37. package/dist/assets/{layout-C0kZPebx-DBUyCsod.js → layout-C0kZPebx-DiUdszUx.js} +1 -1
  38. package/dist/assets/min-7Gb0pNxh-DsojA8pm.js +1 -0
  39. package/dist/assets/{mindmap-definition-VGOIOE7T-CJZ2wTTa-DP1XV6kP.js → mindmap-definition-VGOIOE7T-CJZ2wTTa-Cd46k2jT.js} +1 -1
  40. package/dist/assets/{pieDiagram-ADFJNKIX-C9OSknjr-BdkTw8nn.js → pieDiagram-ADFJNKIX-C9OSknjr-BGVcHmss.js} +2 -2
  41. package/dist/assets/{quadrantDiagram-AYHSOK5B-CW8yuAqv-BcCv0sYD.js → quadrantDiagram-AYHSOK5B-CW8yuAqv-CrCYjmJT.js} +3 -3
  42. package/dist/assets/{requirementDiagram-UZGBJVZJ-nGPhruO1-CZD7Xw4s.js → requirementDiagram-UZGBJVZJ-nGPhruO1-BzOGHXGi.js} +1 -1
  43. package/dist/assets/{sankeyDiagram-TZEHDZUN-CmL90u-m-BicoH15o.js → sankeyDiagram-TZEHDZUN-CmL90u-m-BWp9STLO.js} +3 -3
  44. package/dist/assets/{sequenceDiagram-WL72ISMW-B02VRcnM-CvY3TSCC.js → sequenceDiagram-WL72ISMW-B02VRcnM-DB4Adljk.js} +7 -7
  45. package/dist/assets/{stateDiagram-FKZM4ZOC-DjoyLUdz-Cy3GdNKr.js → stateDiagram-FKZM4ZOC-DjoyLUdz-pDyQ50aU.js} +1 -1
  46. package/dist/assets/{stateDiagram-v2-4FDKWEC3-Bq76BTB7-BTj88h18.js → stateDiagram-v2-4FDKWEC3-Bq76BTB7-C3j4gDpN.js} +1 -1
  47. package/dist/assets/{timeline-definition-IT6M3QCI-CTn0Gm3T-BPnEK60y.js → timeline-definition-IT6M3QCI-CTn0Gm3T-O1FhSixZ.js} +1 -1
  48. package/dist/assets/{treemap-KMMF4GRG-BjgLKKyi-Dpn6IoCt.js → treemap-KMMF4GRG-BjgLKKyi-DG8IQefJ.js} +1 -1
  49. package/dist/assets/{xychartDiagram-PRI3JC2R-Cgg6Uija-B3NNTn5p.js → xychartDiagram-PRI3JC2R-Cgg6Uija-CPVch5-l.js} +4 -4
  50. package/dist/index.html +2 -2
  51. package/package.json +2 -2
  52. package/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  53. package/dist/assets/_baseUniq-BRKsqoH--BnZ8jILn.js +0 -1
  54. package/dist/assets/api-C90fNFdj.js +0 -2
  55. package/dist/assets/api-Dg2si9TY.js +0 -2
  56. package/dist/assets/channel-HKsfPa5q-i-PY3wcB.js +0 -1
  57. package/dist/assets/clone-DoPb9X13-DxnBl06F.js +0 -1
  58. package/dist/assets/index-BjgS88qB.css +0 -1
  59. package/dist/assets/infoDiagram-WHAUD3N6-is6Ho4-T-BLBpQ0kq.js +0 -2
  60. package/dist/assets/min-7Gb0pNxh-9FduVVTw.js +0 -1
package/bin/orbitchat.js CHANGED
@@ -5,8 +5,8 @@
5
5
  * Serves the chat-app as a standalone application with runtime configuration.
6
6
  * Configuration can be provided via CLI arguments, config file, or environment variables.
7
7
  *
8
- * When VITE_ENABLE_API_MIDDLEWARE is enabled, the server acts as a proxy to hide
9
- * API keys from the client by mapping adapter names to actual API keys.
8
+ * The server acts as a proxy to hide API keys from the client by mapping
9
+ * adapter names to actual API keys.
10
10
  */
11
11
 
12
12
  import express from 'express';
@@ -34,9 +34,11 @@ const DEFAULT_CONFIG = {
34
34
  consoleDebug: false,
35
35
  enableUploadButton: false,
36
36
  enableAudioOutput: false,
37
+ enableAudioInput: false,
37
38
  enableFeedbackButtons: false,
38
39
  enableAutocomplete: false,
39
- enableApiMiddleware: false,
40
+ voiceSilenceTimeoutMs: 4000,
41
+ voiceRecognitionLanguage: '',
40
42
  outOfServiceMessage: null,
41
43
  maxFilesPerConversation: 5,
42
44
  maxFileSizeMB: 50,
@@ -46,6 +48,7 @@ const DEFAULT_CONFIG = {
46
48
  maxMessagesPerThread: 1000,
47
49
  maxTotalMessages: 10000,
48
50
  maxMessageLength: 1000,
51
+ settingsAboutMsg: 'ORBIT Chat',
49
52
  };
50
53
 
51
54
  function parseAdaptersListFromEnv() {
@@ -124,6 +127,7 @@ function parseArgs() {
124
127
  host: 'localhost',
125
128
  open: false,
126
129
  configFile: null,
130
+ apiOnly: false,
127
131
  };
128
132
 
129
133
  for (let i = 0; i < args.length; i++) {
@@ -167,14 +171,23 @@ function parseArgs() {
167
171
  case '--enable-audio':
168
172
  config.enableAudioOutput = true;
169
173
  break;
174
+ case '--enable-audio-input':
175
+ config.enableAudioInput = true;
176
+ break;
170
177
  case '--enable-feedback':
171
178
  config.enableFeedbackButtons = true;
172
179
  break;
173
180
  case '--enable-autocomplete':
174
181
  config.enableAutocomplete = true;
175
182
  break;
183
+ case '--voice-silence-timeout-ms':
184
+ config.voiceSilenceTimeoutMs = parseInt(args[++i], 10);
185
+ break;
186
+ case '--voice-recognition-lang':
187
+ config.voiceRecognitionLanguage = args[++i];
188
+ break;
176
189
  case '--enable-api-middleware':
177
- config.enableApiMiddleware = true;
190
+ // Ignored — middleware mode is now always enabled
178
191
  break;
179
192
  case '--out-of-service-message':
180
193
  config.outOfServiceMessage = args[++i];
@@ -203,6 +216,9 @@ function parseArgs() {
203
216
  case '--max-message-length':
204
217
  config.maxMessageLength = parseInt(args[++i], 10);
205
218
  break;
219
+ case '--settings-about-msg':
220
+ config.settingsAboutMsg = args[++i];
221
+ break;
206
222
  case '--port':
207
223
  serverConfig.port = parseInt(args[++i], 10);
208
224
  break;
@@ -212,6 +228,12 @@ function parseArgs() {
212
228
  case '--open':
213
229
  serverConfig.open = true;
214
230
  break;
231
+ case '--api-only':
232
+ serverConfig.apiOnly = true;
233
+ break;
234
+ case '--cors-origin':
235
+ serverConfig.corsOrigin = args[++i];
236
+ break;
215
237
  case '--config':
216
238
  serverConfig.configFile = args[++i];
217
239
  break;
@@ -268,9 +290,11 @@ function loadConfigFromEnv() {
268
290
  VITE_CONSOLE_DEBUG: 'consoleDebug',
269
291
  VITE_ENABLE_UPLOAD: 'enableUploadButton',
270
292
  VITE_ENABLE_AUDIO_OUTPUT: 'enableAudioOutput',
293
+ VITE_ENABLE_AUDIO_INPUT: 'enableAudioInput',
271
294
  VITE_ENABLE_FEEDBACK: 'enableFeedbackButtons',
272
295
  VITE_ENABLE_AUTOCOMPLETE: 'enableAutocomplete',
273
- VITE_ENABLE_API_MIDDLEWARE: 'enableApiMiddleware',
296
+ VITE_VOICE_SILENCE_TIMEOUT_MS: 'voiceSilenceTimeoutMs',
297
+ VITE_VOICE_RECOGNITION_LANG: 'voiceRecognitionLanguage',
274
298
  VITE_OUT_OF_SERVICE_MESSAGE: 'outOfServiceMessage',
275
299
  VITE_MAX_FILES_PER_CONVERSATION: 'maxFilesPerConversation',
276
300
  VITE_MAX_FILE_SIZE_MB: 'maxFileSizeMB',
@@ -280,16 +304,21 @@ function loadConfigFromEnv() {
280
304
  VITE_MAX_MESSAGES_PER_THREAD: 'maxMessagesPerThread',
281
305
  VITE_MAX_TOTAL_MESSAGES: 'maxTotalMessages',
282
306
  VITE_MAX_MESSAGE_LENGTH: 'maxMessageLength',
307
+ VITE_SETTINGS_ABOUT_MSG: 'settingsAboutMsg',
283
308
  };
284
309
 
285
310
  for (const [envKey, configKey] of Object.entries(envMap)) {
286
311
  const value = process.env[envKey];
287
- if (value !== undefined) {
288
- if (configKey === 'useLocalApi' || configKey === 'consoleDebug' ||
312
+ if (value !== undefined) {
313
+ if (configKey === 'useLocalApi' || configKey === 'consoleDebug' ||
289
314
  configKey === 'enableUploadButton' || configKey === 'enableAudioOutput' ||
290
- configKey === 'enableFeedbackButtons' || configKey === 'enableAutocomplete' ||
291
- configKey === 'enableApiMiddleware') {
315
+ configKey === 'enableAudioInput' || configKey === 'enableFeedbackButtons' || configKey === 'enableAutocomplete') {
292
316
  envConfig[configKey] = value === 'true';
317
+ } else if (configKey === 'voiceSilenceTimeoutMs') {
318
+ const parsed = parseInt(value, 10);
319
+ if (!isNaN(parsed)) {
320
+ envConfig[configKey] = parsed;
321
+ }
293
322
  } else if (configKey.includes('max') && configKey !== 'maxFileSizeMB') {
294
323
  const parsed = parseInt(value, 10);
295
324
  if (!isNaN(parsed)) {
@@ -372,14 +401,34 @@ function injectConfig(html, config) {
372
401
  }
373
402
 
374
403
  /**
375
- * Create Express server to serve the built app
404
+ * Create Express server
405
+ *
406
+ * @param {string|null} distPath - Path to built UI assets (null in api-only mode)
407
+ * @param {object} config - Merged application config
408
+ * @param {object} serverConfig - Server config (port, host, apiOnly, etc.)
376
409
  */
377
- function createServer(distPath, config) {
410
+ function createServer(distPath, config, serverConfig = {}) {
378
411
  const app = express();
379
- const adapters = config.enableApiMiddleware ? loadAdaptersConfig() : null;
412
+ const adapters = loadAdaptersConfig();
413
+ const apiOnly = serverConfig.apiOnly || false;
414
+
415
+ // In api-only mode, add CORS middleware so external UIs on other origins can call the API
416
+ if (apiOnly) {
417
+ const allowedOrigin = serverConfig.corsOrigin || '*';
418
+ app.use((req, res, next) => {
419
+ res.setHeader('Access-Control-Allow-Origin', allowedOrigin);
420
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
421
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-API-Key, X-Session-ID, X-Thread-ID, X-Adapter-Name, Accept');
422
+ res.setHeader('Access-Control-Expose-Headers', 'Content-Type');
423
+ if (req.method === 'OPTIONS') {
424
+ return res.sendStatus(204);
425
+ }
426
+ next();
427
+ });
428
+ }
380
429
 
381
- // API endpoints for middleware mode - MUST be before body parsers
382
- if (config.enableApiMiddleware && adapters) {
430
+ // API proxy endpoints - MUST be before body parsers
431
+ if (adapters) {
383
432
  // Pre-create proxy instances for each adapter to avoid memory leaks
384
433
  // Creating proxies on every request adds event listeners that accumulate
385
434
  const proxyInstances = {};
@@ -494,50 +543,53 @@ function createServer(distPath, config) {
494
543
  app.use(express.json());
495
544
  app.use(express.urlencoded({ extended: true }));
496
545
 
497
- // IMPORTANT: Handle index.html BEFORE express.static to inject runtime config
498
- // express.static would serve the file without config injection otherwise
499
- app.get(['/', '/index.html'], (req, res) => {
500
- try {
501
- const indexPath = path.join(distPath, 'index.html');
502
- let content = fs.readFileSync(indexPath, 'utf8');
503
- content = injectConfig(content, config);
504
- res.setHeader('Content-Type', 'text/html');
505
- res.send(content);
506
- } catch (error) {
507
- console.error('Error serving index.html:', error);
508
- res.status(500).send('Internal Server Error');
509
- }
510
- });
546
+ // --- UI serving (skipped in api-only mode) ---
547
+ if (!apiOnly && distPath) {
548
+ // IMPORTANT: Handle index.html BEFORE express.static to inject runtime config
549
+ // express.static would serve the file without config injection otherwise
550
+ app.get(['/', '/index.html'], (req, res) => {
551
+ try {
552
+ const indexPath = path.join(distPath, 'index.html');
553
+ let content = fs.readFileSync(indexPath, 'utf8');
554
+ content = injectConfig(content, config);
555
+ res.setHeader('Content-Type', 'text/html');
556
+ res.send(content);
557
+ } catch (error) {
558
+ console.error('Error serving index.html:', error);
559
+ res.status(500).send('Internal Server Error');
560
+ }
561
+ });
511
562
 
512
- // Serve static files (JS, CSS, images, etc.) - index.html is handled above
513
- app.use(express.static(distPath, {
514
- index: false, // Don't serve index.html automatically - we handle it above
515
- }));
563
+ // Serve static files (JS, CSS, images, etc.) - index.html is handled above
564
+ app.use(express.static(distPath, {
565
+ index: false, // Don't serve index.html automatically - we handle it above
566
+ }));
516
567
 
517
- // SPA fallback - serve index.html for all non-file routes (client-side routing)
518
- app.get('/{*splat}', (req, res, next) => {
519
- // Skip API routes
520
- if (req.path.startsWith('/api/')) {
521
- return next();
522
- }
568
+ // SPA fallback - serve index.html for all non-file routes (client-side routing)
569
+ app.get('/{*splat}', (req, res, next) => {
570
+ // Skip API routes
571
+ if (req.path.startsWith('/api/')) {
572
+ return next();
573
+ }
523
574
 
524
- // Skip requests for files with extensions (let them 404)
525
- if (path.extname(req.path)) {
526
- return res.status(404).send('Not Found');
527
- }
575
+ // Skip requests for files with extensions (let them 404)
576
+ if (path.extname(req.path)) {
577
+ return res.status(404).send('Not Found');
578
+ }
528
579
 
529
- // Serve index.html for SPA routes
530
- try {
531
- const indexPath = path.join(distPath, 'index.html');
532
- let content = fs.readFileSync(indexPath, 'utf8');
533
- content = injectConfig(content, config);
534
- res.setHeader('Content-Type', 'text/html');
535
- res.send(content);
536
- } catch (error) {
537
- console.error('Error serving index.html:', error);
538
- res.status(500).send('Internal Server Error');
539
- }
540
- });
580
+ // Serve index.html for SPA routes
581
+ try {
582
+ const indexPath = path.join(distPath, 'index.html');
583
+ let content = fs.readFileSync(indexPath, 'utf8');
584
+ content = injectConfig(content, config);
585
+ res.setHeader('Content-Type', 'text/html');
586
+ res.send(content);
587
+ } catch (error) {
588
+ console.error('Error serving index.html:', error);
589
+ res.status(500).send('Internal Server Error');
590
+ }
591
+ });
592
+ }
541
593
 
542
594
  return app;
543
595
  }
@@ -632,10 +684,13 @@ Options:
632
684
  --local-api-path PATH Path to local API
633
685
  --console-debug Enable console debug (default: false)
634
686
  --enable-upload Enable upload button (default: false)
635
- --enable-audio Enable audio button (default: false)
687
+ --enable-audio Enable audio output button (default: false)
688
+ --enable-audio-input Enable microphone input button (default: false)
636
689
  --enable-feedback Enable feedback buttons (default: false)
637
690
  --enable-autocomplete Enable autocomplete suggestions (default: false)
638
- --enable-api-middleware Enable API middleware mode (default: false)
691
+ --voice-silence-timeout-ms N Auto-stop voice capture after N ms of silence (default: 4000)
692
+ --voice-recognition-lang LANG BCP-47 language code for speech recognition (default: browser locale)
693
+ --enable-api-middleware Ignored (middleware mode is always enabled)
639
694
  --out-of-service-message TEXT Show maintenance screen blocking access
640
695
  --max-files-per-conversation N Max files per conversation (default: 5)
641
696
  --max-file-size-mb N Max file size in MB (default: 50)
@@ -645,9 +700,12 @@ Options:
645
700
  --max-messages-per-thread N Max messages per thread (default: 1000, 0 = unlimited)
646
701
  --max-total-messages N Max total messages (default: 10000, 0 = unlimited)
647
702
  --max-message-length N Max message length (default: 1000)
703
+ --settings-about-msg TEXT About message in settings page (default: ORBIT Chat)
648
704
  --port PORT Server port (default: 5173)
649
705
  --host HOST Server host (default: localhost)
650
706
  --open Open browser automatically
707
+ --api-only Run API proxy only (no UI serving, no build required)
708
+ --cors-origin ORIGIN Allowed CORS origin in api-only mode (default: *)
651
709
  --config PATH Path to config file (default: ~/.orbit-chat-app/config.json)
652
710
  --help, -h Show this help message
653
711
  --version, -v Show version number
@@ -665,9 +723,11 @@ Environment Variables for Middleware Mode:
665
723
  Examples:
666
724
  orbitchat --api-url http://localhost:3000 --port 8080
667
725
  orbitchat --api-key my-key --open
668
- orbitchat --enable-audio --enable-upload --console-debug
726
+ orbitchat --enable-audio --enable-audio-input --enable-upload --console-debug
669
727
  orbitchat --config /path/to/config.json
670
- ORBIT_ADAPTERS='[{"name":"Chat","apiKey":"mykey","apiUrl":"https://api.example.com"}]' orbitchat --enable-api-middleware
728
+ ORBIT_ADAPTERS='[{"name":"Chat","apiKey":"mykey","apiUrl":"https://api.example.com"}]' orbitchat
729
+ orbitchat --api-only --port 5174
730
+ orbitchat --api-only --cors-origin http://localhost:3001
671
731
  `);
672
732
 
673
733
  }
@@ -691,45 +751,48 @@ function main() {
691
751
  const { config: cliConfig, serverConfig } = parseArgs();
692
752
  const config = mergeConfig(cliConfig, serverConfig);
693
753
 
694
- if (config.enableApiMiddleware) {
695
- const trimmedDefaultKey = (config.defaultKey || '').trim();
696
- if (!trimmedDefaultKey || trimmedDefaultKey === DEFAULT_CONFIG.defaultKey) {
697
- const fallbackAdapter = getDefaultAdapterFromEnv();
698
- if (fallbackAdapter) {
699
- config.defaultKey = fallbackAdapter;
700
- console.debug(`ℹ️ Using '${fallbackAdapter}' as the default adapter (first entry from VITE_ADAPTERS).`);
701
- }
754
+ const trimmedDefaultKey = (config.defaultKey || '').trim();
755
+ if (!trimmedDefaultKey || trimmedDefaultKey === DEFAULT_CONFIG.defaultKey) {
756
+ const fallbackAdapter = getDefaultAdapterFromEnv();
757
+ if (fallbackAdapter) {
758
+ config.defaultKey = fallbackAdapter;
759
+ console.debug(`ℹ️ Using '${fallbackAdapter}' as the default adapter (first entry from VITE_ADAPTERS).`);
702
760
  }
703
761
  }
704
762
 
705
- // Find dist directory
706
- // Use __dirname which we defined at the top of the file
763
+ // Find dist directory (not required in api-only mode)
707
764
  const distPath = path.join(__dirname, '..', 'dist');
708
-
709
- if (!fs.existsSync(distPath)) {
765
+
766
+ if (!serverConfig.apiOnly && !fs.existsSync(distPath)) {
710
767
  console.error('Error: dist directory not found. Please run "npm run build" first.');
711
768
  process.exit(1);
712
769
  }
713
770
 
714
771
  // Create and start server
715
- const app = createServer(distPath, config);
772
+ const app = createServer(
773
+ serverConfig.apiOnly ? null : distPath,
774
+ config,
775
+ serverConfig
776
+ );
716
777
 
717
778
  app.listen(serverConfig.port, serverConfig.host, () => {
718
779
  const url = `http://${serverConfig.host}:${serverConfig.port}`;
719
- console.debug(`\n🚀 ORBIT Chat App is running at ${url}\n`);
780
+ if (serverConfig.apiOnly) {
781
+ console.debug(`\n🚀 ORBIT API Proxy is running at ${url}\n`);
782
+ } else {
783
+ console.debug(`\n🚀 ORBIT Chat App is running at ${url}\n`);
784
+ }
720
785
  console.debug('Configuration:');
786
+ console.debug(` Mode: ${serverConfig.apiOnly ? 'API-only (no UI)' : 'Full (API + UI)'}`);
721
787
  console.debug(` API URL: ${config.apiUrl}`);
722
788
  console.debug(` Default Key/Adapter: ${config.defaultKey || '(not set)'}`);
723
789
  console.debug(` Port: ${serverConfig.port}`);
724
790
  console.debug(` Host: ${serverConfig.host}`);
725
- if (config.enableApiMiddleware) {
726
- console.debug(` API Middleware: Enabled`);
727
- const adapters = loadAdaptersConfig();
728
- if (adapters) {
729
- console.debug(` Available Adapters: ${Object.keys(adapters).join(', ')}`);
730
- } else {
731
- console.debug(` Warning: No adapters configured. Set ORBIT_ADAPTERS or VITE_ADAPTERS environment variable.`);
732
- }
791
+ const startupAdapters = loadAdaptersConfig();
792
+ if (startupAdapters) {
793
+ console.debug(` Available Adapters: ${Object.keys(startupAdapters).join(', ')}`);
794
+ } else {
795
+ console.debug(` Warning: No adapters configured. Set ORBIT_ADAPTERS or VITE_ADAPTERS environment variable.`);
733
796
  }
734
797
  console.debug('');
735
798
 
@@ -750,11 +813,12 @@ function main() {
750
813
  const isMainModule = process.argv[1] && (
751
814
  import.meta.url === `file://${process.argv[1]}` ||
752
815
  import.meta.url.endsWith(process.argv[1].replace(/\\/g, '/')) ||
753
- process.argv[1].includes('orbitchat')
816
+ path.basename(process.argv[1]) === 'orbitchat' ||
817
+ path.basename(process.argv[1]) === 'orbitchat.js'
754
818
  );
755
819
 
756
820
  if (isMainModule) {
757
821
  main();
758
822
  }
759
823
 
760
- export { main, parseArgs, mergeConfig };
824
+ export { main, parseArgs, mergeConfig, createServer, loadAdaptersConfig };
@@ -0,0 +1 @@
1
+ import{aS as Q,bH as cr,bI as ir,aK as h,aL as U,bJ as L,bK as lr,aO as sr,by as k,br as P,bL as vr,bM as br,aP as hr,bN as V,bn as N,bo as T,bO as gr,bw as _,aG as pr,bP as x,bQ as yr,aT as dr}from"./index-nqhgVFEP.js";var jr="[object Symbol]";function B(r){return typeof r=="symbol"||k(r)&&vr(r)==jr}function _r(r,t){for(var e=-1,n=r==null?0:r.length,a=Array(n);++e<n;)a[e]=t(r[e],e,r);return a}var E=_?_.prototype:void 0,G=E?E.toString:void 0;function W(r){if(typeof r=="string")return r;if(h(r))return _r(r,W)+"";if(B(r))return G?G.call(r):"";var t=r+"";return t=="0"&&1/r==-1/0?"-0":t}function mr(){}function wr(r,t){for(var e=-1,n=r==null?0:r.length;++e<n&&t(r[e],e,r)!==!1;);return r}function Or(r,t,e,n){for(var a=r.length,u=e+-1;++u<a;)if(t(r[u],u,r))return u;return-1}function Sr(r){return r!==r}function Pr(r,t,e){for(var n=e-1,a=r.length;++n<a;)if(r[n]===t)return n;return-1}function Ar(r,t,e){return t===t?Pr(r,t,e):Or(r,Sr,e)}function Lr(r,t){var e=r==null?0:r.length;return!!e&&Ar(r,t,0)>-1}function C(r){return Q(r)?cr(r):ir(r)}var $r=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,kr=/^\w*$/;function z(r,t){if(h(r))return!1;var e=typeof r;return e=="number"||e=="symbol"||e=="boolean"||r==null||B(r)?!0:kr.test(r)||!$r.test(r)||t!=null&&r in Object(t)}var Br=500;function Cr(r){var t=yr(r,function(n){return e.size===Br&&e.clear(),n}),e=t.cache;return t}var zr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Dr=/\\(\\)?/g,Fr=Cr(function(r){var t=[];return r.charCodeAt(0)===46&&t.push(""),r.replace(zr,function(e,n,a,u){t.push(a?u.replace(Dr,"$1"):n||e)}),t});function Kr(r){return r==null?"":W(r)}function X(r,t){return h(r)?r:z(r,t)?[r]:Fr(Kr(r))}function A(r){if(typeof r=="string"||B(r))return r;var t=r+"";return t=="0"&&1/r==-1/0?"-0":t}function rr(r,t){t=X(t,r);for(var e=0,n=t.length;r!=null&&e<n;)r=r[A(t[e++])];return e&&e==n?r:void 0}function Mr(r,t,e){var n=r==null?void 0:rr(r,t);return n===void 0?e:n}function tr(r,t){for(var e=-1,n=t.length,a=r.length;++e<n;)r[a+e]=t[e];return r}var I=_?_.isConcatSpreadable:void 0;function Nr(r){return h(r)||V(r)||!!(I&&r&&r[I])}function Gt(r,t,e,n,a){var u=-1,o=r.length;for(e||(e=Nr),a||(a=[]);++u<o;){var f=r[u];e(f)?tr(a,f):n||(a[a.length]=f)}return a}function Tr(r,t,e,n){var a=-1,u=r==null?0:r.length;for(n&&u&&(e=r[++a]);++a<u;)e=t(e,r[a],a,r);return e}function er(r,t){for(var e=-1,n=r==null?0:r.length,a=0,u=[];++e<n;){var o=r[e];t(o,e,r)&&(u[a++]=o)}return u}function xr(){return[]}var Er=Object.prototype,Gr=Er.propertyIsEnumerable,J=Object.getOwnPropertySymbols,Ir=J?function(r){return r==null?[]:(r=Object(r),er(J(r),function(t){return Gr.call(r,t)}))}:xr;function Jr(r,t,e){var n=t(r);return h(r)?n:tr(n,e(r))}function q(r){return Jr(r,C,Ir)}var qr="__lodash_hash_undefined__";function Rr(r){return this.__data__.set(r,qr),this}function Yr(r){return this.__data__.has(r)}function m(r){var t=-1,e=r==null?0:r.length;for(this.__data__=new lr;++t<e;)this.add(r[t])}m.prototype.add=m.prototype.push=Rr;m.prototype.has=Yr;function Zr(r,t){for(var e=-1,n=r==null?0:r.length;++e<n;)if(t(r[e],e,r))return!0;return!1}function nr(r,t){return r.has(t)}var Hr=1,Qr=2;function ur(r,t,e,n,a,u){var o=e&Hr,f=r.length,c=t.length;if(f!=c&&!(o&&c>f))return!1;var v=u.get(r),l=u.get(t);if(v&&l)return v==t&&l==r;var i=-1,s=!0,p=e&Qr?new m:void 0;for(u.set(r,t),u.set(t,r);++i<f;){var b=r[i],g=t[i];if(n)var y=o?n(g,b,i,t,r,u):n(b,g,i,r,t,u);if(y!==void 0){if(y)continue;s=!1;break}if(p){if(!Zr(t,function(d,j){if(!nr(p,j)&&(b===d||a(b,d,e,n,u)))return p.push(j)})){s=!1;break}}else if(!(b===g||a(b,g,e,n,u))){s=!1;break}}return u.delete(r),u.delete(t),s}function Ur(r){var t=-1,e=Array(r.size);return r.forEach(function(n,a){e[++t]=[a,n]}),e}function D(r){var t=-1,e=Array(r.size);return r.forEach(function(n){e[++t]=n}),e}var Vr=1,Wr=2,Xr="[object Boolean]",rt="[object Date]",tt="[object Error]",et="[object Map]",nt="[object Number]",ut="[object RegExp]",at="[object Set]",ot="[object String]",ft="[object Symbol]",ct="[object ArrayBuffer]",it="[object DataView]",R=_?_.prototype:void 0,$=R?R.valueOf:void 0;function lt(r,t,e,n,a,u,o){switch(e){case it:if(r.byteLength!=t.byteLength||r.byteOffset!=t.byteOffset)return!1;r=r.buffer,t=t.buffer;case ct:return!(r.byteLength!=t.byteLength||!u(new x(r),new x(t)));case Xr:case rt:case nt:return pr(+r,+t);case tt:return r.name==t.name&&r.message==t.message;case ut:case ot:return r==t+"";case et:var f=Ur;case at:var c=n&Vr;if(f||(f=D),r.size!=t.size&&!c)return!1;var v=o.get(r);if(v)return v==t;n|=Wr,o.set(r,t);var l=ur(f(r),f(t),n,a,u,o);return o.delete(r),l;case ft:if($)return $.call(r)==$.call(t)}return!1}var st=1,vt=Object.prototype,bt=vt.hasOwnProperty;function ht(r,t,e,n,a,u){var o=e&st,f=q(r),c=f.length,v=q(t),l=v.length;if(c!=l&&!o)return!1;for(var i=c;i--;){var s=f[i];if(!(o?s in t:bt.call(t,s)))return!1}var p=u.get(r),b=u.get(t);if(p&&b)return p==t&&b==r;var g=!0;u.set(r,t),u.set(t,r);for(var y=o;++i<c;){s=f[i];var d=r[s],j=t[s];if(n)var M=o?n(j,d,s,t,r,u):n(d,j,s,r,t,u);if(!(M===void 0?d===j||a(d,j,e,n,u):M)){g=!1;break}y||(y=s=="constructor")}if(g&&!y){var w=r.constructor,O=t.constructor;w!=O&&"constructor"in r&&"constructor"in t&&!(typeof w=="function"&&w instanceof w&&typeof O=="function"&&O instanceof O)&&(g=!1)}return u.delete(r),u.delete(t),g}var gt=1,Y="[object Arguments]",Z="[object Array]",S="[object Object]",pt=Object.prototype,H=pt.hasOwnProperty;function yt(r,t,e,n,a,u){var o=h(r),f=h(t),c=o?Z:N(r),v=f?Z:N(t);c=c==Y?S:c,v=v==Y?S:v;var l=c==S,i=v==S,s=c==v;if(s&&T(r)){if(!T(t))return!1;o=!0,l=!1}if(s&&!l)return u||(u=new P),o||gr(r)?ur(r,t,e,n,a,u):lt(r,t,c,e,n,a,u);if(!(e&gt)){var p=l&&H.call(r,"__wrapped__"),b=i&&H.call(t,"__wrapped__");if(p||b){var g=p?r.value():r,y=b?t.value():t;return u||(u=new P),a(g,y,e,n,u)}}return s?(u||(u=new P),ht(r,t,e,n,a,u)):!1}function F(r,t,e,n,a){return r===t?!0:r==null||t==null||!k(r)&&!k(t)?r!==r&&t!==t:yt(r,t,e,n,F,a)}var dt=1,jt=2;function _t(r,t,e,n){var a=e.length,u=a;if(r==null)return!u;for(r=Object(r);a--;){var o=e[a];if(o[2]?o[1]!==r[o[0]]:!(o[0]in r))return!1}for(;++a<u;){o=e[a];var f=o[0],c=r[f],v=o[1];if(o[2]){if(c===void 0&&!(f in r))return!1}else{var l=new P,i;if(!(i===void 0?F(v,c,dt|jt,n,l):i))return!1}}return!0}function ar(r){return r===r&&!sr(r)}function mt(r){for(var t=C(r),e=t.length;e--;){var n=t[e],a=r[n];t[e]=[n,a,ar(a)]}return t}function or(r,t){return function(e){return e==null?!1:e[r]===t&&(t!==void 0||r in Object(e))}}function wt(r){var t=mt(r);return t.length==1&&t[0][2]?or(t[0][0],t[0][1]):function(e){return e===r||_t(e,r,t)}}function Ot(r,t){return r!=null&&t in Object(r)}function St(r,t,e){t=X(t,r);for(var n=-1,a=t.length,u=!1;++n<a;){var o=A(t[n]);if(!(u=r!=null&&e(r,o)))break;r=r[o]}return u||++n!=a?u:(a=r==null?0:r.length,!!a&&br(a)&&hr(o,a)&&(h(r)||V(r)))}function Pt(r,t){return r!=null&&St(r,t,Ot)}var At=1,Lt=2;function $t(r,t){return z(r)&&ar(t)?or(A(r),t):function(e){var n=Mr(e,r);return n===void 0&&n===t?Pt(e,r):F(t,n,At|Lt)}}function kt(r){return function(t){return t==null?void 0:t[r]}}function Bt(r){return function(t){return rr(t,r)}}function Ct(r){return z(r)?kt(A(r)):Bt(r)}function fr(r){return typeof r=="function"?r:r==null?U:typeof r=="object"?h(r)?$t(r[0],r[1]):wt(r):Ct(r)}function zt(r,t){return r&&dr(r,t,C)}function Dt(r,t){return function(e,n){if(e==null)return e;if(!Q(e))return r(e,n);for(var a=e.length,u=-1,o=Object(e);++u<a&&n(o[u],u,o)!==!1;);return e}}var K=Dt(zt);function Ft(r){return typeof r=="function"?r:U}function It(r,t){var e=h(r)?wr:K;return e(r,Ft(t))}function Kt(r,t){var e=[];return K(r,function(n,a,u){t(n,a,u)&&e.push(n)}),e}function Jt(r,t){var e=h(r)?er:Kt;return e(r,fr(t))}function Mt(r,t,e,n,a){return a(r,function(u,o,f){e=n?(n=!1,u):t(e,u,o,f)}),e}function qt(r,t,e){var n=h(r)?Tr:Mt,a=arguments.length<3;return n(r,fr(t),e,a,K)}var Nt=1/0,Tt=L&&1/D(new L([,-0]))[1]==Nt?function(r){return new L(r)}:mr,xt=200;function Rt(r,t,e){var n=-1,a=Lr,u=r.length,o=!0,f=[],c=f;if(u>=xt){var v=t?null:Tt(r);if(v)return D(v);o=!1,a=nr,c=new m}else c=t?[]:f;r:for(;++n<u;){var l=r[n],i=t?t(l):l;if(l=l!==0?l:0,o&&i===i){for(var s=c.length;s--;)if(c[s]===i)continue r;t&&c.push(i),f.push(l)}else a(c,i,e)||(c!==f&&c.push(i),f.push(l))}return f}export{zt as $,Gt as B,wr as E,Ft as F,Kr as G,A as I,Rt as J,xr as K,C as M,St as T,qt as Y,Jt as Z,fr as a,Pt as b,Or as c,Ir as d,q as e,Jr as f,K as g,X as j,rr as n,It as q,tr as r,_r as v,B as x};
@@ -1 +1 @@
1
- import{b0 as sn,b1 as an,b2 as l,as as on,b3 as j,b4 as F,b5 as E,b6 as un,b7 as cn,b8 as Y,b9 as e,aq as G,ba as en,bb as rn,bc as yn}from"./index-BTk6gbYa.js";function fn(i){return i.innerRadius}function ln(i){return i.outerRadius}function gn(i){return i.startAngle}function pn(i){return i.endAngle}function xn(i){return i&&i.padAngle}function mn(i,d,B,W,v,b,H,a){var C=B-i,r=W-d,n=H-v,p=a-b,u=p*C-n*r;if(!(u*u<l))return u=(n*(d-b)-p*(i-v))/u,[i+u*C,d+u*r]}function M(i,d,B,W,v,b,H){var a=i-B,C=d-W,r=(H?b:-b)/Y(a*a+C*C),n=r*C,p=-r*a,u=i+n,s=d+p,y=B+n,f=W+p,P=(u+y)/2,o=(s+f)/2,x=y-u,g=f-s,O=x*x+g*g,T=v-b,A=u*f-y*s,I=(g<0?-1:1)*Y(en(0,T*T*O-A*A)),L=(A*g-x*I)/O,D=(-A*x-g*I)/O,R=(A*g+x*I)/O,m=(-A*x+g*I)/O,h=L-P,t=D-o,c=R-P,_=m-o;return h*h+t*t>c*c+_*_&&(L=R,D=m),{cx:L,cy:D,x01:-n,y01:-p,x11:L*(v/T-1),y11:D*(v/T-1)}}function dn(){var i=fn,d=ln,B=G(0),W=null,v=gn,b=pn,H=xn,a=null,C=sn(r);function r(){var n,p,u=+i.apply(this,arguments),s=+d.apply(this,arguments),y=v.apply(this,arguments)-an,f=b.apply(this,arguments)-an,P=un(f-y),o=f>y;if(a||(a=n=C()),s<u&&(p=s,s=u,u=p),!(s>l))a.moveTo(0,0);else if(P>on-l)a.moveTo(s*j(y),s*F(y)),a.arc(0,0,s,y,f,!o),u>l&&(a.moveTo(u*j(f),u*F(f)),a.arc(0,0,u,f,y,o));else{var x=y,g=f,O=y,T=f,A=P,I=P,L=H.apply(this,arguments)/2,D=L>l&&(W?+W.apply(this,arguments):Y(u*u+s*s)),R=E(un(s-u)/2,+B.apply(this,arguments)),m=R,h=R,t,c;if(D>l){var _=rn(D/u*F(L)),k=rn(D/s*F(L));(A-=_*2)>l?(_*=o?1:-1,O+=_,T-=_):(A=0,O=T=(y+f)/2),(I-=k*2)>l?(k*=o?1:-1,x+=k,g-=k):(I=0,x=g=(y+f)/2)}var z=s*j(x),S=s*F(x),N=u*j(T),X=u*F(T);if(R>l){var Z=s*j(g),$=s*F(g),Q=u*j(O),U=u*F(O),q;if(P<cn)if(q=mn(z,S,Q,U,Z,$,N,X)){var V=z-q[0],w=S-q[1],J=Z-q[0],K=$-q[1],nn=1/F(yn((V*J+w*K)/(Y(V*V+w*w)*Y(J*J+K*K)))/2),tn=Y(q[0]*q[0]+q[1]*q[1]);m=E(R,(u-tn)/(nn-1)),h=E(R,(s-tn)/(nn+1))}else m=h=0}I>l?h>l?(t=M(Q,U,z,S,s,h,o),c=M(Z,$,N,X,s,h,o),a.moveTo(t.cx+t.x01,t.cy+t.y01),h<R?a.arc(t.cx,t.cy,h,e(t.y01,t.x01),e(c.y01,c.x01),!o):(a.arc(t.cx,t.cy,h,e(t.y01,t.x01),e(t.y11,t.x11),!o),a.arc(0,0,s,e(t.cy+t.y11,t.cx+t.x11),e(c.cy+c.y11,c.cx+c.x11),!o),a.arc(c.cx,c.cy,h,e(c.y11,c.x11),e(c.y01,c.x01),!o))):(a.moveTo(z,S),a.arc(0,0,s,x,g,!o)):a.moveTo(z,S),!(u>l)||!(A>l)?a.lineTo(N,X):m>l?(t=M(N,X,Z,$,u,-m,o),c=M(z,S,Q,U,u,-m,o),a.lineTo(t.cx+t.x01,t.cy+t.y01),m<R?a.arc(t.cx,t.cy,m,e(t.y01,t.x01),e(c.y01,c.x01),!o):(a.arc(t.cx,t.cy,m,e(t.y01,t.x01),e(t.y11,t.x11),!o),a.arc(0,0,u,e(t.cy+t.y11,t.cx+t.x11),e(c.cy+c.y11,c.cx+c.x11),o),a.arc(c.cx,c.cy,m,e(c.y11,c.x11),e(c.y01,c.x01),!o))):a.arc(0,0,u,T,O,o)}if(a.closePath(),n)return a=null,n+""||null}return r.centroid=function(){var n=(+i.apply(this,arguments)+ +d.apply(this,arguments))/2,p=(+v.apply(this,arguments)+ +b.apply(this,arguments))/2-cn/2;return[j(p)*n,F(p)*n]},r.innerRadius=function(n){return arguments.length?(i=typeof n=="function"?n:G(+n),r):i},r.outerRadius=function(n){return arguments.length?(d=typeof n=="function"?n:G(+n),r):d},r.cornerRadius=function(n){return arguments.length?(B=typeof n=="function"?n:G(+n),r):B},r.padRadius=function(n){return arguments.length?(W=n==null?null:typeof n=="function"?n:G(+n),r):W},r.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:G(+n),r):v},r.endAngle=function(n){return arguments.length?(b=typeof n=="function"?n:G(+n),r):b},r.padAngle=function(n){return arguments.length?(H=typeof n=="function"?n:G(+n),r):H},r.context=function(n){return arguments.length?(a=n??null,r):a},r}export{dn as h};
1
+ import{a$ as sn,b0 as an,b1 as l,ar as on,b2 as j,b3 as F,b4 as E,b5 as un,b6 as cn,b7 as Y,b8 as e,ap as G,b9 as en,ba as rn,bb as yn}from"./index-nqhgVFEP.js";function fn(i){return i.innerRadius}function ln(i){return i.outerRadius}function gn(i){return i.startAngle}function pn(i){return i.endAngle}function xn(i){return i&&i.padAngle}function mn(i,d,C,W,v,b,H,a){var I=C-i,r=W-d,n=H-v,p=a-b,u=p*I-n*r;if(!(u*u<l))return u=(n*(d-b)-p*(i-v))/u,[i+u*I,d+u*r]}function M(i,d,C,W,v,b,H){var a=i-C,I=d-W,r=(H?b:-b)/Y(a*a+I*I),n=r*I,p=-r*a,u=i+n,s=d+p,y=C+n,f=W+p,P=(u+y)/2,o=(s+f)/2,x=y-u,g=f-s,O=x*x+g*g,T=v-b,A=u*f-y*s,L=(g<0?-1:1)*Y(en(0,T*T*O-A*A)),q=(A*g-x*L)/O,D=(-A*x-g*L)/O,R=(A*g+x*L)/O,m=(-A*x+g*L)/O,h=q-P,t=D-o,c=R-P,_=m-o;return h*h+t*t>c*c+_*_&&(q=R,D=m),{cx:q,cy:D,x01:-n,y01:-p,x11:q*(v/T-1),y11:D*(v/T-1)}}function dn(){var i=fn,d=ln,C=G(0),W=null,v=gn,b=pn,H=xn,a=null,I=sn(r);function r(){var n,p,u=+i.apply(this,arguments),s=+d.apply(this,arguments),y=v.apply(this,arguments)-an,f=b.apply(this,arguments)-an,P=un(f-y),o=f>y;if(a||(a=n=I()),s<u&&(p=s,s=u,u=p),!(s>l))a.moveTo(0,0);else if(P>on-l)a.moveTo(s*j(y),s*F(y)),a.arc(0,0,s,y,f,!o),u>l&&(a.moveTo(u*j(f),u*F(f)),a.arc(0,0,u,f,y,o));else{var x=y,g=f,O=y,T=f,A=P,L=P,q=H.apply(this,arguments)/2,D=q>l&&(W?+W.apply(this,arguments):Y(u*u+s*s)),R=E(un(s-u)/2,+C.apply(this,arguments)),m=R,h=R,t,c;if(D>l){var _=rn(D/u*F(q)),$=rn(D/s*F(q));(A-=_*2)>l?(_*=o?1:-1,O+=_,T-=_):(A=0,O=T=(y+f)/2),(L-=$*2)>l?($*=o?1:-1,x+=$,g-=$):(L=0,x=g=(y+f)/2)}var z=s*j(x),S=s*F(x),k=u*j(T),N=u*F(T);if(R>l){var X=s*j(g),Z=s*F(g),Q=u*j(O),U=u*F(O),B;if(P<cn)if(B=mn(z,S,Q,U,X,Z,k,N)){var V=z-B[0],w=S-B[1],J=X-B[0],K=Z-B[1],nn=1/F(yn((V*J+w*K)/(Y(V*V+w*w)*Y(J*J+K*K)))/2),tn=Y(B[0]*B[0]+B[1]*B[1]);m=E(R,(u-tn)/(nn-1)),h=E(R,(s-tn)/(nn+1))}else m=h=0}L>l?h>l?(t=M(Q,U,z,S,s,h,o),c=M(X,Z,k,N,s,h,o),a.moveTo(t.cx+t.x01,t.cy+t.y01),h<R?a.arc(t.cx,t.cy,h,e(t.y01,t.x01),e(c.y01,c.x01),!o):(a.arc(t.cx,t.cy,h,e(t.y01,t.x01),e(t.y11,t.x11),!o),a.arc(0,0,s,e(t.cy+t.y11,t.cx+t.x11),e(c.cy+c.y11,c.cx+c.x11),!o),a.arc(c.cx,c.cy,h,e(c.y11,c.x11),e(c.y01,c.x01),!o))):(a.moveTo(z,S),a.arc(0,0,s,x,g,!o)):a.moveTo(z,S),!(u>l)||!(A>l)?a.lineTo(k,N):m>l?(t=M(k,N,X,Z,u,-m,o),c=M(z,S,Q,U,u,-m,o),a.lineTo(t.cx+t.x01,t.cy+t.y01),m<R?a.arc(t.cx,t.cy,m,e(t.y01,t.x01),e(c.y01,c.x01),!o):(a.arc(t.cx,t.cy,m,e(t.y01,t.x01),e(t.y11,t.x11),!o),a.arc(0,0,u,e(t.cy+t.y11,t.cx+t.x11),e(c.cy+c.y11,c.cx+c.x11),o),a.arc(c.cx,c.cy,m,e(c.y11,c.x11),e(c.y01,c.x01),!o))):a.arc(0,0,u,T,O,o)}if(a.closePath(),n)return a=null,n+""||null}return r.centroid=function(){var n=(+i.apply(this,arguments)+ +d.apply(this,arguments))/2,p=(+v.apply(this,arguments)+ +b.apply(this,arguments))/2-cn/2;return[j(p)*n,F(p)*n]},r.innerRadius=function(n){return arguments.length?(i=typeof n=="function"?n:G(+n),r):i},r.outerRadius=function(n){return arguments.length?(d=typeof n=="function"?n:G(+n),r):d},r.cornerRadius=function(n){return arguments.length?(C=typeof n=="function"?n:G(+n),r):C},r.padRadius=function(n){return arguments.length?(W=n==null?null:typeof n=="function"?n:G(+n),r):W},r.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:G(+n),r):v},r.endAngle=function(n){return arguments.length?(b=typeof n=="function"?n:G(+n),r):b},r.padAngle=function(n){return arguments.length?(H=typeof n=="function"?n:G(+n),r):H},r.context=function(n){return arguments.length?(a=n??null,r):a},r}export{dn as h};