dual-brain 0.3.16 → 0.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,6 +38,34 @@ function _claudeNewArgs(cwd) {
38
38
  return args;
39
39
  }
40
40
 
41
+ function _codexResumeArgs(sessionId) {
42
+ return ['resume', sessionId];
43
+ }
44
+
45
+ function _sessionTool(session) {
46
+ return session?.tool === 'codex' ? 'codex' : 'claude';
47
+ }
48
+
49
+ function _sessionLaunchArgs(session, cwd) {
50
+ return _sessionTool(session) === 'codex'
51
+ ? _codexResumeArgs(session.id)
52
+ : _claudeResumeArgs(session.id, cwd);
53
+ }
54
+
55
+ function _sessionBrief(session, targetProvider = 'codex') {
56
+ const name = session?.smartName || session?.name || session?.prompts?.first || session?.firstPrompt || session?.id || 'previous session';
57
+ const tool = _sessionTool(session);
58
+ const parts = [
59
+ `Continue the ${tool} session "${String(name).replace(/\s+/g, ' ').slice(0, 120)}" in ${targetProvider}.`,
60
+ ];
61
+ if (session?.id) parts.push(`Original session id: ${session.id}.`);
62
+ if (session?.project) parts.push(`Project: ${session.project}.`);
63
+ if (session?.lastActive) parts.push(`Last active: ${session.lastActive}.`);
64
+ if (session?.prompts?.last) parts.push(`Last prompt: ${String(session.prompts.last).replace(/\s+/g, ' ').slice(0, 500)}`);
65
+ else if (session?.prompts?.first) parts.push(`First prompt: ${String(session.prompts.first).replace(/\s+/g, ' ').slice(0, 500)}`);
66
+ return parts.join(' ');
67
+ }
68
+
41
69
  // ─── Agent/skill registry cache (populated at startup) ───────────────────────
42
70
  // These are set by _primeRegistryCache() so classifyInput can use them
43
71
  // synchronously without async overhead on each keystroke.
@@ -1241,6 +1269,27 @@ async function cmdSwitch(args = []) {
1241
1269
  await cmdHandoff(handoffArgs);
1242
1270
  }
1243
1271
 
1272
+ async function cmdUpdate() {
1273
+ const cwd = process.cwd();
1274
+ console.log(' Updating Dual Brain...');
1275
+ const install = _spawnSyncTop('npm', ['install', '-g', 'dual-brain@latest'], {
1276
+ stdio: 'inherit',
1277
+ cwd,
1278
+ });
1279
+ if (install.status !== 0) {
1280
+ process.exitCode = install.status || 1;
1281
+ return;
1282
+ }
1283
+
1284
+ const refresh = _spawnSyncTop('dual-brain', ['install'], {
1285
+ stdio: 'inherit',
1286
+ cwd,
1287
+ });
1288
+ if (refresh.status !== 0) {
1289
+ process.exitCode = refresh.status || 1;
1290
+ }
1291
+ }
1292
+
1244
1293
  function cmdHot(providerArg) {
1245
1294
  if (!providerArg) err('Usage: dual-brain hot <provider> (claude | openai)');
1246
1295
  const provider = providerArg.toLowerCase();
@@ -1854,6 +1903,17 @@ async function welcomeScreen(rl, ask) {
1854
1903
  if (existingSessions.length > 5) {
1855
1904
  console.log(` ... and ${existingSessions.length - 5} more`);
1856
1905
  }
1906
+ const meta = getSessionMeta(cwd);
1907
+ const now = new Date().toISOString();
1908
+ for (const sess of existingSessions) {
1909
+ meta[sess.id] = {
1910
+ ...meta[sess.id],
1911
+ source: 'data-tools',
1912
+ importedAt: meta[sess.id]?.importedAt || now,
1913
+ createdAt: meta[sess.id]?.createdAt || now,
1914
+ };
1915
+ }
1916
+ saveSessionMeta(meta, cwd);
1857
1917
  console.log('\n Sessions imported! They\'ll appear in your Recent list.\n');
1858
1918
  await ask(' Press Enter to continue...');
1859
1919
  // Fall through to auto-save
@@ -3158,7 +3218,9 @@ async function mainScreen(rl, ask) {
3158
3218
  const shortcuts = [
3159
3219
  [`Enter`, isReturning ? 'resume last session' : 'start working (or type a task)'],
3160
3220
  [`n`, 'new session'],
3221
+ [`g`, isReturning ? 'continue in other provider' : 'switch provider'],
3161
3222
  [`/`, 'search sessions'],
3223
+ [`i`, 'import sessions'],
3162
3224
  [`s`, 'settings & profiles'],
3163
3225
  [`d`, 'doctor — diagnose issues'],
3164
3226
  [`a`, profile.automode ? 'auto mode (on)' : 'auto mode (off)'],
@@ -3262,7 +3324,7 @@ async function mainScreen(rl, ask) {
3262
3324
  // Single-key commands only fire when buffer is empty
3263
3325
  if (taskBuffer.length === 0) {
3264
3326
  const lower = str.toLowerCase();
3265
- const singleKeySet = new Set(['n', 's', 't', 'q', '/', 'i', '?', 'h', 'd']);
3327
+ const singleKeySet = new Set(['n', 'g', 's', 't', 'q', '/', 'i', '?', 'h', 'd', 'a']);
3266
3328
  if (singleKeySet.has(lower)) {
3267
3329
  cleanup();
3268
3330
  process.stdout.write('\n');
@@ -3367,8 +3429,9 @@ async function mainScreen(rl, ask) {
3367
3429
  const sess = results[num - 1];
3368
3430
  const { spawnSync: sp2 } = await import('node:child_process');
3369
3431
  const tool = sess.tool === 'codex' ? 'codex' : 'claude';
3370
- process.stdout.write(`\n Launching: ${tool} --resume ${sess.id}\n\n`);
3371
- sp2(tool, ['--resume', sess.id], { stdio: 'inherit' });
3432
+ const launchArgs = tool === 'codex' ? _codexResumeArgs(sess.id) : _claudeResumeArgs(sess.id, cwd);
3433
+ process.stdout.write(`\n Launching: ${tool} ${launchArgs.join(' ')}\n\n`);
3434
+ sp2(tool, launchArgs, { stdio: 'inherit' });
3372
3435
  }
3373
3436
  return { next: 'main' };
3374
3437
  }
@@ -3510,8 +3573,10 @@ async function mainScreen(rl, ask) {
3510
3573
  }
3511
3574
  const sess = recentSessions[0];
3512
3575
  const { spawnSync } = await import('node:child_process');
3513
- process.stdout.write(`\n Launching: claude --resume ${sess.id}\n\n`);
3514
- spawnSync('claude', _claudeResumeArgs(sess.id, cwd), { stdio: 'inherit' });
3576
+ const tool = _sessionTool(sess);
3577
+ const launchArgs = _sessionLaunchArgs(sess, cwd);
3578
+ process.stdout.write(`\n Launching: ${tool} ${launchArgs.join(' ')}\n\n`);
3579
+ spawnSync(tool, launchArgs, { stdio: 'inherit' });
3515
3580
  saveTerminalState(cwd, getTerminalId(), sess.id, sess.tool || 'claude');
3516
3581
  return { next: 'main' };
3517
3582
  }
@@ -3529,13 +3594,19 @@ async function mainScreen(rl, ask) {
3529
3594
  }
3530
3595
  } catch {}
3531
3596
  const { spawnSync } = await import('node:child_process');
3532
- process.stdout.write(`\n Launching: claude --resume ${sess.id}\n\n`);
3533
- spawnSync('claude', _claudeResumeArgs(sess.id, cwd), { stdio: 'inherit' });
3597
+ const tool = _sessionTool(sess);
3598
+ const launchArgs = _sessionLaunchArgs(sess, cwd);
3599
+ process.stdout.write(`\n Launching: ${tool} ${launchArgs.join(' ')}\n\n`);
3600
+ spawnSync(tool, launchArgs, { stdio: 'inherit' });
3534
3601
  saveTerminalState(cwd, getTerminalId(), sess.id, sess.tool || 'claude');
3535
3602
  return { next: 'main' };
3536
3603
  }
3537
3604
 
3538
3605
  if (choice === 'n') { return { next: 'new-session' }; }
3606
+ if (choice === 'g') {
3607
+ if (recentSessions.length === 0) return { next: 'new-session' };
3608
+ return { next: 'switch-provider', session: recentSessions[0] };
3609
+ }
3539
3610
  if (choice === '?' || choice === 'h') { return { next: 'palette-help' }; }
3540
3611
  if (choice === 'd') { return { next: 'diagnostics' }; }
3541
3612
 
@@ -3569,8 +3640,9 @@ async function mainScreen(rl, ask) {
3569
3640
  const sess = results[num - 1];
3570
3641
  const { spawnSync } = await import('node:child_process');
3571
3642
  const tool = sess.tool === 'codex' ? 'codex' : 'claude';
3572
- process.stdout.write(`\n Launching: ${tool} --resume ${sess.id}\n\n`);
3573
- spawnSync(tool, ['--resume', sess.id], { stdio: 'inherit' });
3643
+ const launchArgs = tool === 'codex' ? _codexResumeArgs(sess.id) : _claudeResumeArgs(sess.id, cwd);
3644
+ process.stdout.write(`\n Launching: ${tool} ${launchArgs.join(' ')}\n\n`);
3645
+ spawnSync(tool, launchArgs, { stdio: 'inherit' });
3574
3646
  }
3575
3647
  return { next: 'main' };
3576
3648
  }
@@ -3578,6 +3650,14 @@ async function mainScreen(rl, ask) {
3578
3650
  if (choice === 's') { return { next: 'settings' }; }
3579
3651
  if (choice === 't') { return { next: 'team' }; }
3580
3652
  if (choice === 'i') { return { next: 'import-picker' }; }
3653
+ if (choice === 'a') {
3654
+ const prof = loadProfile(cwd);
3655
+ prof.automode = !(prof.automode ?? prof.settings?.automode ?? false);
3656
+ saveProfile(prof, { cwd });
3657
+ process.stdout.write(`\n Automode: ${prof.automode ? '\x1b[32mON\x1b[0m' : '\x1b[2mOFF\x1b[0m'}\n\n`);
3658
+ await ask(' Press Enter to continue...');
3659
+ return { next: 'main' };
3660
+ }
3581
3661
  if (choice === 'q' || choice === 'exit') { return { next: 'exit' }; }
3582
3662
 
3583
3663
  return { next: 'main' };
@@ -3596,6 +3676,30 @@ async function newSessionScreen(rl, ask) {
3596
3676
  return { next: 'main' };
3597
3677
  }
3598
3678
 
3679
+ // ─── Screen: switchProviderScreen ────────────────────────────────────────────
3680
+
3681
+ async function switchProviderScreen(rl, ask, ctx = {}) {
3682
+ const cwd = process.cwd();
3683
+ const session = ctx.session;
3684
+ if (!session) return { next: 'main' };
3685
+
3686
+ const currentTool = _sessionTool(session);
3687
+ const target = currentTool === 'codex' ? 'claude' : 'codex';
3688
+ const label = session.smartName || session.name || session.prompts?.first || session.id;
3689
+ const brief = _sessionBrief(session, target);
3690
+
3691
+ process.stdout.write('\n');
3692
+ process.stdout.write(` Continue in ${target === 'codex' ? 'Codex/GPT' : 'Claude'}\n`);
3693
+ process.stdout.write(` From: ${currentTool} · ${String(label || '').replace(/\s+/g, ' ').slice(0, 80)}\n\n`);
3694
+ process.stdout.write(` \x1b[36mEnter\x1b[0m switch now \x1b[36mb\x1b[0m back\n\n`);
3695
+
3696
+ const choice = (await ask(' Choice: ')).trim().toLowerCase();
3697
+ if (choice === 'b' || choice === 'q' || choice === 'n') return { next: 'main' };
3698
+
3699
+ await cmdSwitch([target, brief]);
3700
+ return { next: 'main' };
3701
+ }
3702
+
3599
3703
  // ─── Screen: paletteHelpScreen ───────────────────────────────────────────────
3600
3704
 
3601
3705
  async function paletteHelpScreen(rl, ask) {
@@ -3616,12 +3720,14 @@ async function paletteHelpScreen(rl, ask) {
3616
3720
  sep,
3617
3721
  row(`${CYAN}Enter${RESET} Resume last session`),
3618
3722
  row(`${CYAN}n${RESET} New coding session`),
3723
+ row(`${CYAN}g${RESET} Continue selected work in other provider`),
3619
3724
  row(`${CYAN}1-9${RESET} Resume session by number`),
3620
3725
  row(`${CYAN}/${RESET} Search session history`),
3726
+ row(`${CYAN}i${RESET} Import/sync sessions`),
3621
3727
  row(`${CYAN}s${RESET} Settings`),
3622
3728
  row(`${CYAN}d${RESET} Doctor (repo diagnostics)`),
3623
3729
  row(`${CYAN}t${RESET} Team`),
3624
- row(`${CYAN}i${RESET} Import sessions`),
3730
+ row(`${CYAN}a${RESET} Toggle auto mode`),
3625
3731
  row(`${CYAN}q${RESET} Quit`),
3626
3732
  row(`${CYAN}?${RESET} This help`),
3627
3733
  sep,
@@ -5497,6 +5603,7 @@ async function replScreen(rl, ask) {
5497
5603
  // ─── Screen: sessionDetailScreen ─────────────────────────────────────────────
5498
5604
 
5499
5605
  async function sessionDetailScreen(rl, ask, ctx = {}) {
5606
+ const cwd = process.cwd();
5500
5607
  const sess = ctx.session;
5501
5608
  if (!sess) return { next: 'dashboard' };
5502
5609
 
@@ -5529,27 +5636,33 @@ async function sessionDetailScreen(rl, ask, ctx = {}) {
5529
5636
  console.log('');
5530
5637
 
5531
5638
  if (sess.isActive) {
5532
- console.log(' [c] Continue this session (claude --continue)');
5639
+ console.log(` [c] Continue this session (${_sessionTool(sess)})`);
5533
5640
  } else {
5534
- console.log(' [r] Resume this session (claude --resume)');
5641
+ console.log(` [r] Resume this session (${_sessionTool(sess)})`);
5535
5642
  }
5643
+ console.log(' [g] Continue in other provider');
5536
5644
  console.log(' [b] Back to dashboard');
5537
5645
  console.log('');
5538
5646
 
5539
5647
  const choice = (await ask(' Choice: ')).trim().toLowerCase();
5540
5648
 
5541
5649
  if (choice === 'c' || choice === 'r') {
5542
- console.log(`\n Launching: claude --resume ${sess.id}\n`);
5650
+ const tool = _sessionTool(sess);
5651
+ const launchArgs = _sessionLaunchArgs(sess, cwd);
5652
+ console.log(`\n Launching: ${tool} ${launchArgs.join(' ')}\n`);
5543
5653
  try {
5544
5654
  const { spawnSync } = await import('node:child_process');
5545
- spawnSync('claude', _claudeResumeArgs(sess.id, cwd), { stdio: 'inherit' });
5655
+ spawnSync(tool, launchArgs, { stdio: 'inherit' });
5546
5656
  } catch {
5547
- console.log(' Could not launch claude CLI. Run manually:');
5548
- console.log(` claude --resume ${sess.id}`);
5657
+ console.log(` Could not launch ${tool} CLI.`);
5549
5658
  }
5550
5659
  return { next: 'dashboard' };
5551
5660
  }
5552
5661
 
5662
+ if (choice === 'g') {
5663
+ return { next: 'switch-provider', session: sess };
5664
+ }
5665
+
5553
5666
  return { next: 'dashboard' };
5554
5667
  }
5555
5668
 
@@ -5629,8 +5742,8 @@ async function sessionsScreen(rl, ask) {
5629
5742
  process.stdout.write(formatRow(sessions[i], i === cursor) + '\n');
5630
5743
  }
5631
5744
  process.stdout.write(sep + '\n');
5632
- process.stdout.write(makeBoxRow('↑↓ Navigate Enter Resume x Archive r Rename', W) + '\n');
5633
- process.stdout.write(makeBoxRow('q Back', W) + '\n');
5745
+ process.stdout.write(makeBoxRow('↑↓ Navigate Enter Resume g Switch Provider', W) + '\n');
5746
+ process.stdout.write(makeBoxRow('x Archive r Rename q Back', W) + '\n');
5634
5747
  process.stdout.write(bot + '\n');
5635
5748
  }
5636
5749
 
@@ -5690,9 +5803,11 @@ async function sessionsScreen(rl, ask) {
5690
5803
  const sess = sessions[cursor];
5691
5804
  cleanup();
5692
5805
  process.stdout.write('\n');
5693
- process.stdout.write(`\n Launching: claude --resume ${sess.id}\n\n`);
5806
+ const tool = _sessionTool(sess);
5807
+ const launchArgs = _sessionLaunchArgs(sess, cwd);
5808
+ process.stdout.write(`\n Launching: ${tool} ${launchArgs.join(' ')}\n\n`);
5694
5809
  const { spawnSync } = await import('node:child_process');
5695
- spawnSync('claude', _claudeResumeArgs(sess.id, cwd), { stdio: 'inherit' });
5810
+ spawnSync(tool, launchArgs, { stdio: 'inherit' });
5696
5811
  saveTerminalState(cwd, getTerminalId(), sess.id, sess.tool || 'claude');
5697
5812
  resolve({ next: 'main' });
5698
5813
  return;
@@ -5714,6 +5829,15 @@ async function sessionsScreen(rl, ask) {
5714
5829
  return;
5715
5830
  }
5716
5831
 
5832
+ // g → continue highlighted session in the other provider
5833
+ if (str === 'g' || str === 'G') {
5834
+ const sess = sessions[cursor];
5835
+ cleanup();
5836
+ process.stdout.write('\n');
5837
+ resolve({ next: 'switch-provider', session: sess });
5838
+ return;
5839
+ }
5840
+
5717
5841
  // r → rename highlighted session
5718
5842
  if (str === 'r' || str === 'R') {
5719
5843
  const sess = sessions[cursor];
@@ -5788,6 +5912,7 @@ async function sessionManageScreen(rl, ask, ctx = {}) {
5788
5912
  { key: 'p', label: pinLabel, section: '' },
5789
5913
  { key: 'c', label: 'Set category', section: '' },
5790
5914
  { key: 'o', label: 'Open (resume)', section: '' },
5915
+ { key: 'g', label: 'Continue in other provider', section: '' },
5791
5916
  { key: 'b', label: 'Back', section: '' },
5792
5917
  ]));
5793
5918
  console.log('');
@@ -5839,11 +5964,17 @@ async function sessionManageScreen(rl, ask, ctx = {}) {
5839
5964
 
5840
5965
  if (choice === 'o') {
5841
5966
  const { spawnSync } = await import('node:child_process');
5842
- console.log(`\n Launching: claude --resume ${sess.id}\n`);
5843
- spawnSync('claude', _claudeResumeArgs(sess.id, cwd), { stdio: 'inherit' });
5967
+ const tool = _sessionTool(sess);
5968
+ const launchArgs = _sessionLaunchArgs(sess, cwd);
5969
+ console.log(`\n Launching: ${tool} ${launchArgs.join(' ')}\n`);
5970
+ spawnSync(tool, launchArgs, { stdio: 'inherit' });
5844
5971
  return { next: 'sessions' };
5845
5972
  }
5846
5973
 
5974
+ if (choice === 'g') {
5975
+ return { next: 'switch-provider', session: sess };
5976
+ }
5977
+
5847
5978
  if (choice === 'b' || choice === 'back') return { next: 'sessions' };
5848
5979
 
5849
5980
  return { next: 'session-manage', session: sess };
@@ -6110,6 +6241,7 @@ const SCREENS = {
6110
6241
  settings: settingsScreen,
6111
6242
  team: teamScreen,
6112
6243
  'import-picker': importPickerScreen,
6244
+ 'switch-provider': switchProviderScreen,
6113
6245
  'pr-triage': prTriageScreen,
6114
6246
  subscriptions: subscriptionsScreen,
6115
6247
  dashboard: dashboardScreen,
@@ -6874,6 +7006,7 @@ async function main() {
6874
7006
  if (cmd === 'status') { await cmdStatus(args.slice(1)); return; }
6875
7007
  if (cmd === 'handoff') { await cmdHandoff(args.slice(1)); return; }
6876
7008
  if (cmd === 'switch') { await cmdSwitch(args.slice(1)); return; }
7009
+ if (cmd === 'update' || cmd === 'upgrade') { await cmdUpdate(); return; }
6877
7010
  if (cmd === 'hot') { cmdHot(args[1]); return; }
6878
7011
  if (cmd === 'cool') { cmdCool(args[1]); return; }
6879
7012
  if (cmd === 'remember') { cmdRemember(args[1]); return; }
@@ -6938,7 +7071,7 @@ fi
6938
7071
  // e.g. `dual-brain fix failing tests` → same as `dual-brain go "fix failing tests"`
6939
7072
  const KNOWN_COMMANDS = new Set([
6940
7073
  'init', 'install', 'uninstall', 'auth', 'go', 'do', 'plan', 'ship', 'think', 'review', 'pr', 'status', 'handoff', 'switch', 'hot', 'cool',
6941
- 'remember', 'forget', 'break-glass', 'specialists', 'search', 'shell-hook', 'watch',
7074
+ 'remember', 'forget', 'break-glass', 'specialists', 'search', 'shell-hook', 'watch', 'update', 'upgrade',
6942
7075
  '--help', '-h', '--version', '-v',
6943
7076
  ...Object.keys(loadSpecialistRegistry()),
6944
7077
  ]);
@@ -256,9 +256,11 @@ export function executeHandoff(opts) {
256
256
  createdAt: new Date().toISOString(),
257
257
  };
258
258
  atomicWriteJson(contextFilePath, handoffData);
259
- // Build the CLI command
259
+ // Build a provider-specific starter command for display/API consumers.
260
260
  const cli = PROVIDER_CLI[other] || other;
261
- const command = [cli, '--resume', contextFilePath];
261
+ const command = cli === 'codex'
262
+ ? [cli, prompt.slice(0, 4000)]
263
+ : [cli, prompt.slice(0, 4000)];
262
264
  const autoLabel = auto ? ' (auto)' : '';
263
265
  return {
264
266
  success: true,
@@ -307,8 +309,11 @@ export function spawnHandoff(opts) {
307
309
  : [prompt.slice(0, 4000)];
308
310
  }
309
311
  else {
310
- // Claude: use -p flag with prompt
311
- spawnArgs = ['-p', prompt.slice(0, 4000), '--no-input'];
312
+ // Claude accepts an initial prompt as a positional argument in interactive mode.
313
+ // Use print mode only for non-TTY callers.
314
+ spawnArgs = process.stdin.isTTY
315
+ ? [prompt.slice(0, 4000)]
316
+ : ['-p', prompt.slice(0, 4000), '--no-input'];
312
317
  }
313
318
  if (opts.interactive !== false) {
314
319
  // Spawn with inherited stdio — user stays in same terminal
@@ -1 +1 @@
1
- {"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../../src/auto-handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../../src/auto-handoff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAwB,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA2C3C,+EAA+E;AAE/E,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAC1C,MAAM,YAAY,GAAG,aAAa,CAAC;AACnC,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAEvD,0CAA0C;AAC1C,MAAM,YAAY,GAA2B;IAC3C,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,OAAO;CAChB,CAAC;AAEF,2CAA2C;AAC3C,MAAM,cAAc,GAA2B;IAC7C,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxD,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,OAAO,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAY,EAAE,KAAK,GAAG,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzD,0BAA0B;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,SAAS,GAA8D,EAAE,CAAC;QAEhF,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA6E,CAAC;gBAC3G,SAAS,CAAC,IAAI,CAAC;oBACb,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS;oBAC/B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,SAAS;oBAC/C,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACvD,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,GAAY;IAC/D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAElG,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;QAE3E,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChD,cAAc,GAAG,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;QACvF,CAAC;QAED,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,KAAK,CAAC,aAAa,IAAI,SAAS;YAC1C,cAAc;YACd,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC;YACrC,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE3C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAC;QAClE,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,EAAE,UAAU,IAAI,SAAS,CAAC;QAEtD,kDAAkD;QAClD,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,YAAY,CAAC,IAAI,CAAC,oBAAoB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;YACjD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,gCAAgC,CAAC;QAErC,OAAO;YACL,SAAS;YACT,YAAY;YACZ,eAAe,EAAE,SAAS;YAC1B,mBAAmB;YACnB,YAAY;YACZ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,SAAS,EAAE,4BAA4B;YACvC,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;YACnB,mBAAmB,EAAE,gBAAgB;YACrC,YAAY,EAAE,SAAS;YACvB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,MAAM,KAAK,GAAa;QACtB,yDAAyD;QACzD,EAAE;QACF,cAAc;QACd,OAAO,CAAC,SAAS;QACjB,EAAE;KACH,CAAC;IAEF,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,KAAK,gCAAgC,EAAE,CAAC;QACpG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;IACjG,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAElG,8DAA8D;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChD,IAAI,UAAU,CAAC,MAAM,KAAK,cAAc,IAAI,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACzE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,mBAAmB,KAAK,YAAY,UAAU,CAAC,MAAM,+BAA+B;iBAC9F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,KAAK,gCAAgC;gBAC5F,CAAC,CAAC,eAAe,OAAO,CAAC,SAAS,EAAE;gBACpC,CAAC,CAAC,GAAG,OAAO,CAAC,mBAAmB,iBAAiB,OAAO,CAAC,SAAS,EAAE,CAAC;YACvE,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS;gBACvD,CAAC,CAAC,yCAAyC;gBAC3C,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QAC3B,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAE3C,gCAAgC;QAChC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG;YAClB,OAAO;YACP,MAAM;YACN,YAAY,EAAE,UAAU;YACxB,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,IAAI,IAAI,KAAK;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,eAAe,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAE9C,uEAAuE;QACvE,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,KAAK,OAAO;YAC7B,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO;YACP,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,UAAU,SAAS,KAAK,UAAU,MAAM,KAAK,sBAAsB,eAAe,EAAE;SAC9F,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,mBAAmB,OAAO,EAAE;SACtC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAA8D;IACzF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,MAAM,CAAC;QAE7E,MAAM,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;QACzC,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAA+B,CAAC;QACnF,MAAM,MAAM,GAAG,WAAW,EAAE,MAAM,IAAI,EAAE,CAAC;QAEzC,mDAAmD;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,+BAA+B,CAAC,CAAC;QACpF,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE1C,uDAAuD;QACvD,IAAI,SAAmB,CAAC;QACxB,MAAM,WAAW,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5D,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,6DAA6D;YAC7D,0DAA0D;YAC1D,yEAAyE;YACzE,qDAAqD;YACrD,yEAAyE;YACzE,uEAAuE;YACvE,6BAA6B;YAC7B,SAAS,GAAG,WAAW;gBACrB,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACpE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,iFAAiF;YACjF,2CAA2C;YAC3C,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK;gBAC7B,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,2DAA2D;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE;gBAClC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;gBACjE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;aAC/B,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC5B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,kBAAkB,GAAG,KAAK;SACpC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,sBAAsB,OAAO,2CAA2C;SAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEjH,yBAAyB;IACzB,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC7C,gCAAgC;QAChC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,OAAO;gBACL,IAAI,EAAE,wCAAwC,OAAO,GAAG;gBACxD,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EAAE,2CAA2C;YACjD,MAAM,EAAE,MAAM;SACf,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACpE,OAAO;YACL,IAAI,EAAE,KAAK,aAAa,iCAAiC,UAAU,EAAE;YACrE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,2BAA2B,MAAM,CAAC,aAAa,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,KAAK,aAAa,0BAA0B,UAAU,oCAAoC;YAChG,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,iBAAiB;SAC3B,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,OAAO;QACL,IAAI,EAAE,GAAG,aAAa,yBAAyB;QAC/C,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC"}
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import readline from 'readline';
11
- import { existsSync, readFileSync, readdirSync, statSync, renameSync, writeFileSync } from 'fs';
11
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, renameSync, writeFileSync } from 'fs';
12
12
  import { dirname, join } from 'path';
13
13
  import { fileURLToPath } from 'url';
14
14
  import { spawnSync } from 'child_process';
@@ -368,6 +368,46 @@ function countRunning() {
368
368
  return { claude, codex };
369
369
  }
370
370
 
371
+ function otherProviderForSession(session) {
372
+ return session?.tool === 'codex' ? 'claude' : 'codex';
373
+ }
374
+
375
+ function sessionBrief(session, target) {
376
+ const prompt = session?.firstPrompt || session?.name || session?.id || 'previous session';
377
+ return [
378
+ `Continue the ${session?.tool || 'claude'} session in ${target}.`,
379
+ session?.id ? `Original session id: ${session.id}.` : '',
380
+ `Context: ${String(prompt).replace(/\s+/g, ' ').slice(0, 700)}`,
381
+ ].filter(Boolean).join(' ');
382
+ }
383
+
384
+ function importVisibleSessions(sessions) {
385
+ const dir = join(CWD, '.dualbrain');
386
+ const file = join(dir, 'sessions.json');
387
+ mkdirSync(dir, { recursive: true });
388
+ let meta = {};
389
+ try { meta = JSON.parse(readFileSync(file, 'utf8')); } catch {}
390
+ const now = new Date().toISOString();
391
+ let count = 0;
392
+ for (const s of sessions) {
393
+ if (!s?.id) continue;
394
+ if (meta[s.id]?.source === 'data-tools') continue;
395
+ meta[s.id] = {
396
+ ...(meta[s.id] || {}),
397
+ source: 'data-tools',
398
+ tool: s.tool || 'claude',
399
+ importedAt: now,
400
+ createdAt: meta[s.id]?.createdAt || now,
401
+ name: s.firstPrompt || s.id,
402
+ };
403
+ count++;
404
+ }
405
+ const tmp = file + '.tmp.' + process.pid;
406
+ writeFileSync(tmp, JSON.stringify(meta, null, 2) + '\n');
407
+ renameSync(tmp, file);
408
+ return count;
409
+ }
410
+
371
411
  // ─── Provider Balance ─────────────────────────────────────────────────────
372
412
 
373
413
  function loadProviderBalance() {
@@ -893,8 +933,10 @@ function renderReturningMenu(providers, sessions) {
893
933
  // ── Sessions
894
934
  lines.push(` ${dim('─── Sessions')}`);
895
935
  lines.push(` ${bold('[c]')} Continue last session`);
936
+ lines.push(` ${bold('[g]')} Continue last in other provider`);
896
937
  if (sessions.length > 0) lines.push(` ${bold('[1-9]')} Resume numbered above`);
897
938
  lines.push(` ${bold('[n]')} New session`);
939
+ lines.push(` ${bold('[i]')} Import/sync sessions`);
898
940
  lines.push(` ${bold('[w]')} Vibe workflow ${dim('(say what you want, we handle the rest)')}`);
899
941
 
900
942
  // ── Settings
@@ -1075,6 +1117,23 @@ async function mainLoop() {
1075
1117
  continue;
1076
1118
  }
1077
1119
 
1120
+ if (choice === 'g') {
1121
+ if (sessions.length === 0) {
1122
+ console.log('');
1123
+ console.log(` ${yellow('No recent session to switch.')} Start a new session first.`);
1124
+ console.log('');
1125
+ continue;
1126
+ }
1127
+ const s = sessions[0];
1128
+ const target = otherProviderForSession(s);
1129
+ const brief = sessionBrief(s, target);
1130
+ console.log('');
1131
+ console.log(` Switching ${s.tool || 'claude'} session to ${target}...`);
1132
+ console.log('');
1133
+ spawnSync('dual-brain', ['switch', target, brief], { stdio: 'inherit', cwd: CWD });
1134
+ continue;
1135
+ }
1136
+
1078
1137
  const num = parseInt(choice, 10);
1079
1138
  if (num >= 1 && num <= 9 && sessions[num - 1]) {
1080
1139
  const s = sessions[num - 1];
@@ -1102,6 +1161,17 @@ async function mainLoop() {
1102
1161
  continue;
1103
1162
  }
1104
1163
 
1164
+ if (choice === 'i') {
1165
+ const count = importVisibleSessions(sessions);
1166
+ console.log('');
1167
+ console.log(count > 0
1168
+ ? ` ${green('Imported ' + count + ' session' + (count === 1 ? '' : 's') + '.')}`
1169
+ : ` ${dim('Sessions already synced.')}`);
1170
+ console.log('');
1171
+ await ask();
1172
+ continue;
1173
+ }
1174
+
1105
1175
  if (choice === 'p') {
1106
1176
  await showProfilePicker(rl);
1107
1177
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dual-brain",
3
- "version": "0.3.16",
3
+ "version": "0.3.17",
4
4
  "description": "AI orchestration across Claude + OpenAI subscriptions — smart routing, budget awareness, and dual-brain collaboration",
5
5
  "type": "module",
6
6
  "bin": {