@redplanethq/corebrain 2.1.0 → 2.2.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 (98) hide show
  1. package/dist/commands/browser/close.d.ts +1 -1
  2. package/dist/commands/browser/close.d.ts.map +1 -1
  3. package/dist/commands/browser/close.js +39 -50
  4. package/dist/commands/browser/close.js.map +1 -1
  5. package/dist/commands/browser/command.d.ts +1 -1
  6. package/dist/commands/browser/command.d.ts.map +1 -1
  7. package/dist/commands/browser/command.js +46 -56
  8. package/dist/commands/browser/command.js.map +1 -1
  9. package/dist/commands/browser/create-profile.d.ts +1 -1
  10. package/dist/commands/browser/create-profile.d.ts.map +1 -1
  11. package/dist/commands/browser/create-profile.js +27 -21
  12. package/dist/commands/browser/create-profile.js.map +1 -1
  13. package/dist/commands/browser/delete-profile.d.ts +1 -1
  14. package/dist/commands/browser/delete-profile.d.ts.map +1 -1
  15. package/dist/commands/browser/delete-profile.js +26 -19
  16. package/dist/commands/browser/delete-profile.js.map +1 -1
  17. package/dist/commands/browser/install.d.ts +1 -1
  18. package/dist/commands/browser/install.d.ts.map +1 -1
  19. package/dist/commands/browser/install.js +31 -42
  20. package/dist/commands/browser/install.js.map +1 -1
  21. package/dist/commands/browser/open.d.ts +1 -1
  22. package/dist/commands/browser/open.d.ts.map +1 -1
  23. package/dist/commands/browser/open.js +40 -52
  24. package/dist/commands/browser/open.js.map +1 -1
  25. package/dist/commands/browser/status.d.ts +1 -1
  26. package/dist/commands/browser/status.d.ts.map +1 -1
  27. package/dist/commands/browser/status.js +36 -41
  28. package/dist/commands/browser/status.js.map +1 -1
  29. package/dist/commands/coding/config.d.ts +1 -1
  30. package/dist/commands/coding/config.d.ts.map +1 -1
  31. package/dist/commands/coding/config.js +95 -98
  32. package/dist/commands/coding/config.js.map +1 -1
  33. package/dist/commands/coding/remove.d.ts +1 -1
  34. package/dist/commands/coding/remove.d.ts.map +1 -1
  35. package/dist/commands/coding/remove.js +26 -28
  36. package/dist/commands/coding/remove.js.map +1 -1
  37. package/dist/commands/coding/setup.d.ts +1 -1
  38. package/dist/commands/coding/setup.d.ts.map +1 -1
  39. package/dist/commands/coding/setup.js +56 -71
  40. package/dist/commands/coding/setup.js.map +1 -1
  41. package/dist/commands/exec/config.d.ts +1 -1
  42. package/dist/commands/exec/config.d.ts.map +1 -1
  43. package/dist/commands/exec/config.js +71 -66
  44. package/dist/commands/exec/config.js.map +1 -1
  45. package/dist/commands/gateway/config.d.ts +10 -2
  46. package/dist/commands/gateway/config.d.ts.map +1 -1
  47. package/dist/commands/gateway/config.js +427 -156
  48. package/dist/commands/gateway/config.js.map +1 -1
  49. package/dist/commands/gateway/off.d.ts +1 -1
  50. package/dist/commands/gateway/off.d.ts.map +1 -1
  51. package/dist/commands/gateway/off.js +53 -63
  52. package/dist/commands/gateway/off.js.map +1 -1
  53. package/dist/commands/gateway/on.d.ts +1 -1
  54. package/dist/commands/gateway/on.d.ts.map +1 -1
  55. package/dist/commands/gateway/on.js +88 -117
  56. package/dist/commands/gateway/on.js.map +1 -1
  57. package/dist/commands/gateway/restart.d.ts +1 -1
  58. package/dist/commands/gateway/restart.d.ts.map +1 -1
  59. package/dist/commands/gateway/restart.js +49 -63
  60. package/dist/commands/gateway/restart.js.map +1 -1
  61. package/dist/commands/gateway/status.d.ts +1 -1
  62. package/dist/commands/gateway/status.d.ts.map +1 -1
  63. package/dist/commands/gateway/status.js +62 -76
  64. package/dist/commands/gateway/status.js.map +1 -1
  65. package/dist/commands/gateway/uninstall.d.ts +1 -1
  66. package/dist/commands/gateway/uninstall.d.ts.map +1 -1
  67. package/dist/commands/gateway/uninstall.js +60 -72
  68. package/dist/commands/gateway/uninstall.js.map +1 -1
  69. package/dist/commands/login.d.ts +1 -1
  70. package/dist/commands/login.d.ts.map +1 -1
  71. package/dist/commands/login.js +87 -107
  72. package/dist/commands/login.js.map +1 -1
  73. package/dist/commands/logout.d.ts +1 -1
  74. package/dist/commands/logout.d.ts.map +1 -1
  75. package/dist/commands/logout.js +24 -45
  76. package/dist/commands/logout.js.map +1 -1
  77. package/dist/commands/me.d.ts +1 -1
  78. package/dist/commands/me.d.ts.map +1 -1
  79. package/dist/commands/me.js +40 -50
  80. package/dist/commands/me.js.map +1 -1
  81. package/dist/commands/token.d.ts +1 -1
  82. package/dist/commands/token.d.ts.map +1 -1
  83. package/dist/commands/token.js +19 -24
  84. package/dist/commands/token.js.map +1 -1
  85. package/dist/components/error-message.js +0 -1
  86. package/dist/components/error-message.js.map +1 -1
  87. package/dist/components/warning-message.js +0 -1
  88. package/dist/components/warning-message.js.map +1 -1
  89. package/dist/server/gateway-client.d.ts +4 -0
  90. package/dist/server/gateway-client.d.ts.map +1 -1
  91. package/dist/server/gateway-client.js +45 -6
  92. package/dist/server/gateway-client.js.map +1 -1
  93. package/dist/server/tools/exec-tools.d.ts.map +1 -1
  94. package/dist/server/tools/exec-tools.js +9 -0
  95. package/dist/server/tools/exec-tools.js.map +1 -1
  96. package/dist/types/config.d.ts +15 -0
  97. package/dist/types/config.d.ts.map +1 -1
  98. package/package.json +6 -3
@@ -1 +1 @@
1
- {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/commands/gateway/restart.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACN,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,YAAY,GACZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAMtC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,MAAa;IACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAQlC,UAAU,CAAC,CAAC;IACd,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,CAAC,KAAK,IAAI,EAAE;YACX,IAAI,CAAC;gBACJ,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;gBAErC,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;wBAChB,SAAS,CAAC,aAAa,CAAC,CAAC;oBAC1B,CAAC;oBACD,OAAO;gBACR,CAAC;gBAED,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBAExD,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,IAAI,CAAC,SAAS,EAAE,CAAC;wBAChB,SAAS,CAAC,eAAe,CAAC,CAAC;oBAC5B,CAAC;oBACD,OAAO;gBACR,CAAC;gBAED,kBAAkB;gBAClB,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC1D,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBACjC,IAAI,CAAC,SAAS,EAAE,CAAC;wBAChB,SAAS,CAAC,UAAU,CAAC,CAAC;oBACvB,CAAC;oBACD,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;oBAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC3D,CAAC;gBAED,QAAQ;gBACR,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,SAAS,CAAC,UAAU,CAAC,CAAC;gBACvB,CAAC;gBAED,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;gBAChC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAE1D,iBAAiB;gBACjB,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC5D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBACpF,CAAC;gBAED,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,SAAS,CAAC,SAAS,CAAC,CAAC;gBACtB,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;oBAC/D,SAAS,CAAC,OAAO,CAAC,CAAC;gBACpB,CAAC;YACF,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,GAAG,EAAE;YACX,SAAS,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACN,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,iBAAiB,YAC7C,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CACxB,KAAC,IAAI,IAAC,QAAQ,iDAAkC,CAChD,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAC3B,KAAC,IAAI,IAAC,QAAQ,0CAA2B,CACzC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAC3B,KAAC,IAAI,IAAC,QAAQ,0CAA2B,CACzC,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAC9B,KAAC,YAAY,IAAC,OAAO,EAAC,oDAAoD,GAAG,CAC7E,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,CAChC,KAAC,YAAY,IAAC,OAAO,EAAC,kDAAkD,EAAC,SAAS,SAAG,CACrF,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAC1B,KAAC,cAAc,IAAC,OAAO,EAAC,mBAAmB,GAAG,CAC9C,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CACxB,KAAC,YAAY,IAAC,OAAO,EAAE,sBAAsB,KAAK,EAAE,GAAI,CACxD,CAAC,CAAC,CAAC,IAAI,GACe,CACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/commands/gateway/restart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACN,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,YAAY,GACZ,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAMtC,KAAK,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC5B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO;IACR,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAE5C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAExD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO;IACR,CAAC;IAED,kBAAkB;IAClB,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1D,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvC,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ;IACR,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACvC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAChC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,iBAAiB;IACjB,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO;IACR,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,MAAa;IACnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACd,iBAAiB,EAAE;aACjB,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3F,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -3,6 +3,6 @@ export declare const options: zod.ZodObject<{}, zod.core.$strip>;
3
3
  type Props = {
4
4
  options: zod.infer<typeof options>;
5
5
  };
6
- export default function GatewayStatus(_props: Props): import("react/jsx-runtime").JSX.Element;
6
+ export default function GatewayStatus(_props: Props): null;
7
7
  export {};
8
8
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,KAAK,CAAC;AActB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAwBF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,KAAK,2CAqGlD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAUtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA2EF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,KAAK,QAclD"}
@@ -1,13 +1,10 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
3
- import { Text } from 'ink';
1
+ import { useEffect } from 'react';
2
+ import { useApp } from 'ink';
3
+ import * as p from '@clack/prompts';
4
+ import chalk from 'chalk';
4
5
  import zod from 'zod';
5
6
  import { getPreferences } from '../../config/preferences.js';
6
7
  import { getServiceType, getServiceName, isServiceInstalled, getServiceStatus, getServicePid, } from '../../utils/service-manager/index.js';
7
- import InfoMessage from '../../components/info-message.js';
8
- import ErrorMessage from '../../components/error-message.js';
9
- import { ThemeContext } from '../../hooks/useTheme.js';
10
- import { themeContextValue } from '../../config/themes.js';
11
8
  export const options = zod.object({});
12
9
  function formatUptime(startedAt) {
13
10
  const uptimeMs = Date.now() - startedAt;
@@ -23,76 +20,65 @@ function formatUptime(startedAt) {
23
20
  return `${minutes}m ${seconds % 60}s`;
24
21
  return `${seconds}s`;
25
22
  }
23
+ function getServiceTypeLabel(type) {
24
+ if (type === 'launchd')
25
+ return 'launchd (macOS)';
26
+ if (type === 'systemd')
27
+ return 'systemd (Linux)';
28
+ return 'unknown';
29
+ }
30
+ async function runGatewayStatus() {
31
+ const spinner = p.spinner();
32
+ spinner.start('Checking gateway status...');
33
+ const serviceType = getServiceType();
34
+ if (serviceType === 'none') {
35
+ spinner.stop(chalk.red('Not supported'));
36
+ p.log.error('Service management not supported on this platform.');
37
+ return;
38
+ }
39
+ const serviceName = getServiceName();
40
+ const installed = await isServiceInstalled(serviceName);
41
+ if (!installed) {
42
+ spinner.stop(chalk.yellow('Not installed'));
43
+ p.log.warning('Gateway not installed.');
44
+ p.log.info("Start with: corebrain gateway on");
45
+ return;
46
+ }
47
+ const status = await getServiceStatus(serviceName);
48
+ const running = status === 'running';
49
+ if (!running) {
50
+ spinner.stop(chalk.yellow('Stopped'));
51
+ p.log.warning('Gateway installed but stopped.');
52
+ p.log.info("Start with: corebrain gateway on");
53
+ return;
54
+ }
55
+ // Get PID from service manager, fallback to preferences
56
+ const prefs = getPreferences();
57
+ let pid = getServicePid(serviceName);
58
+ if (!pid && prefs.gateway?.pid) {
59
+ pid = prefs.gateway.pid;
60
+ }
61
+ spinner.stop(chalk.green('Running'));
62
+ p.note([
63
+ `${chalk.bold('Status:')} ${chalk.green('Running')}`,
64
+ `${chalk.bold('Service:')} ${getServiceTypeLabel(serviceType)}`,
65
+ `${chalk.bold('PID:')} ${pid || 'unknown'}`,
66
+ `${chalk.bold('Uptime:')} ${prefs.gateway?.startedAt ? formatUptime(prefs.gateway.startedAt) : 'unknown'}`,
67
+ '',
68
+ `${chalk.dim('Logs: ~/.corebrain/logs/gateway.log')}`,
69
+ ].join('\n'), 'Gateway Status');
70
+ }
26
71
  export default function GatewayStatus(_props) {
27
- const [status, setStatus] = useState('loading');
28
- const [gatewayStatus, setGatewayStatus] = useState({
29
- running: false,
30
- installed: false,
31
- });
72
+ const { exit } = useApp();
32
73
  useEffect(() => {
33
- let cancelled = false;
34
- (async () => {
35
- try {
36
- const serviceType = getServiceType();
37
- if (serviceType === 'none') {
38
- if (!cancelled) {
39
- setStatus('unsupported');
40
- }
41
- return;
42
- }
43
- const serviceName = getServiceName();
44
- const installed = await isServiceInstalled(serviceName);
45
- if (!installed) {
46
- if (!cancelled) {
47
- setGatewayStatus({ running: false, installed: false });
48
- setStatus('ready');
49
- }
50
- return;
51
- }
52
- const serviceStatus = await getServiceStatus(serviceName);
53
- const running = serviceStatus === 'running';
54
- // Get PID from service manager, fallback to preferences
55
- const prefs = getPreferences();
56
- let pid = null;
57
- if (running) {
58
- pid = getServicePid(serviceName);
59
- // Fallback to stored PID in preferences
60
- if (!pid && prefs.gateway?.pid) {
61
- pid = prefs.gateway.pid;
62
- }
63
- }
64
- if (!cancelled) {
65
- setGatewayStatus({
66
- running,
67
- installed: true,
68
- pid: pid || undefined,
69
- startedAt: prefs.gateway?.startedAt,
70
- uptime: prefs.gateway?.startedAt
71
- ? formatUptime(prefs.gateway.startedAt)
72
- : undefined,
73
- serviceType: serviceType === 'launchd' ? 'launchd' : 'systemd',
74
- });
75
- setStatus('ready');
76
- }
77
- }
78
- catch {
79
- if (!cancelled) {
80
- setGatewayStatus({ running: false, installed: false });
81
- setStatus('ready');
82
- }
83
- }
84
- })();
85
- return () => {
86
- cancelled = true;
87
- };
88
- }, []);
89
- const getServiceTypeLabel = () => {
90
- if (gatewayStatus.serviceType === 'launchd')
91
- return 'launchd (macOS)';
92
- if (gatewayStatus.serviceType === 'systemd')
93
- return 'systemd (Linux)';
94
- return 'unknown';
95
- };
96
- return (_jsx(ThemeContext.Provider, { value: themeContextValue, children: status === 'loading' ? (_jsx(Text, { dimColor: true, children: "Checking gateway status..." })) : status === 'unsupported' ? (_jsx(ErrorMessage, { message: "Service management not supported on this platform." })) : !gatewayStatus.installed ? (_jsx(ErrorMessage, { message: `Gateway not installed.\n\nStart with: corebrain gateway on`, hideTitle: true })) : !gatewayStatus.running ? (_jsx(ErrorMessage, { message: `Gateway installed but stopped.\n\nStart with: corebrain gateway on`, hideTitle: true })) : (_jsx(InfoMessage, { message: `Gateway: Running\n\nService: ${getServiceTypeLabel()}\nPID: ${gatewayStatus.pid || 'unknown'}\nUptime: ${gatewayStatus.uptime || 'unknown'}\n\nLogs: ~/.corebrain/logs/gateway.log` })) }));
74
+ runGatewayStatus()
75
+ .catch((err) => {
76
+ p.log.error(err instanceof Error ? err.message : 'Unknown error');
77
+ })
78
+ .finally(() => {
79
+ setTimeout(() => exit(), 100);
80
+ });
81
+ }, [exit]);
82
+ return null;
97
83
  }
98
84
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"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"}
@@ -3,6 +3,6 @@ export declare const options: zod.ZodObject<{}, zod.core.$strip>;
3
3
  type Props = {
4
4
  options: zod.infer<typeof options>;
5
5
  };
6
- export default function GatewayUninstall(_props: Props): import("react/jsx-runtime").JSX.Element;
6
+ export default function GatewayUninstall(_props: Props): null;
7
7
  export {};
8
8
  //# sourceMappingURL=uninstall.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,KAAK,CAAC;AAetB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,MAAM,EAAE,KAAK,2CA0GrD"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAWtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA8DF,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,MAAM,EAAE,KAAK,QAcrD"}
@@ -1,80 +1,68 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
3
- import { Text } from 'ink';
1
+ import { useEffect } from 'react';
2
+ import { useApp } from 'ink';
3
+ import * as p from '@clack/prompts';
4
+ import chalk from 'chalk';
4
5
  import zod from 'zod';
5
6
  import { getPreferences, updatePreferences } from '../../config/preferences.js';
6
7
  import { getServiceType, getServiceName, uninstallService, isServiceInstalled, stopService, getServiceStatus, } from '../../utils/service-manager/index.js';
7
- import SuccessMessage from '../../components/success-message.js';
8
- import ErrorMessage from '../../components/error-message.js';
9
- import { ThemeContext } from '../../hooks/useTheme.js';
10
- import { themeContextValue } from '../../config/themes.js';
11
8
  export const options = zod.object({});
9
+ async function runGatewayUninstall() {
10
+ const spinner = p.spinner();
11
+ const serviceType = getServiceType();
12
+ if (serviceType === 'none') {
13
+ p.log.error('Service management not supported on this platform.');
14
+ return;
15
+ }
16
+ spinner.start('Checking service...');
17
+ const serviceName = getServiceName();
18
+ const installed = await isServiceInstalled(serviceName);
19
+ if (!installed) {
20
+ // Clean up preferences if needed
21
+ const prefs = getPreferences();
22
+ if (prefs.gateway?.serviceInstalled) {
23
+ const { gateway, ...rest } = prefs;
24
+ updatePreferences(rest);
25
+ }
26
+ spinner.stop(chalk.yellow('Not installed'));
27
+ p.log.warning('Gateway is not installed');
28
+ return;
29
+ }
30
+ // Stop if running
31
+ const serviceStatus = await getServiceStatus(serviceName);
32
+ if (serviceStatus === 'running') {
33
+ spinner.message('Stopping gateway...');
34
+ try {
35
+ await stopService(serviceName);
36
+ await new Promise((resolve) => setTimeout(resolve, 1000));
37
+ }
38
+ catch {
39
+ // Continue anyway
40
+ }
41
+ }
42
+ // Uninstall
43
+ spinner.message('Removing service...');
44
+ await uninstallService(serviceName);
45
+ // Clean up preferences
46
+ const prefs = getPreferences();
47
+ const { gateway, ...rest } = prefs;
48
+ updatePreferences(rest);
49
+ spinner.stop(chalk.green('Gateway service removed'));
50
+ p.note([
51
+ 'The gateway will no longer auto-start.',
52
+ 'To reinstall: corebrain gateway on',
53
+ ].join('\n'), 'Gateway Uninstalled');
54
+ }
12
55
  export default function GatewayUninstall(_props) {
13
- const [status, setStatus] = useState('checking');
14
- const [error, setError] = useState('');
56
+ const { exit } = useApp();
15
57
  useEffect(() => {
16
- let cancelled = false;
17
- (async () => {
18
- try {
19
- const serviceType = getServiceType();
20
- if (serviceType === 'none') {
21
- if (!cancelled) {
22
- setStatus('unsupported');
23
- }
24
- return;
25
- }
26
- const serviceName = getServiceName();
27
- const installed = await isServiceInstalled(serviceName);
28
- if (!installed) {
29
- // Clean up preferences if needed
30
- const prefs = getPreferences();
31
- if (prefs.gateway?.serviceInstalled) {
32
- const { gateway, ...rest } = prefs;
33
- updatePreferences(rest);
34
- }
35
- if (!cancelled) {
36
- setStatus('not-installed');
37
- }
38
- return;
39
- }
40
- // Stop if running
41
- const serviceStatus = await getServiceStatus(serviceName);
42
- if (serviceStatus === 'running') {
43
- if (!cancelled) {
44
- setStatus('stopping');
45
- }
46
- try {
47
- await stopService(serviceName);
48
- await new Promise((resolve) => setTimeout(resolve, 1000));
49
- }
50
- catch {
51
- // Continue anyway
52
- }
53
- }
54
- // Uninstall
55
- if (!cancelled) {
56
- setStatus('uninstalling');
57
- }
58
- await uninstallService(serviceName);
59
- // Clean up preferences
60
- const prefs = getPreferences();
61
- const { gateway, ...rest } = prefs;
62
- updatePreferences(rest);
63
- if (!cancelled) {
64
- setStatus('success');
65
- }
66
- }
67
- catch (err) {
68
- if (!cancelled) {
69
- setError(err instanceof Error ? err.message : 'Unknown error');
70
- setStatus('error');
71
- }
72
- }
73
- })();
74
- return () => {
75
- cancelled = true;
76
- };
77
- }, []);
78
- return (_jsx(ThemeContext.Provider, { value: themeContextValue, children: status === 'checking' ? (_jsx(Text, { dimColor: true, children: "Checking service..." })) : status === 'stopping' ? (_jsx(Text, { dimColor: true, children: "Stopping gateway..." })) : status === 'uninstalling' ? (_jsx(Text, { dimColor: true, children: "Removing service..." })) : status === 'unsupported' ? (_jsx(ErrorMessage, { message: "Service management not supported on this platform." })) : status === 'not-installed' ? (_jsx(ErrorMessage, { message: "Gateway is not installed", hideTitle: true })) : status === 'success' ? (_jsx(SuccessMessage, { message: `Gateway service removed.\n\nThe gateway will no longer auto-start.\nTo reinstall: corebrain gateway on` })) : status === 'error' ? (_jsx(ErrorMessage, { message: `Failed to uninstall: ${error}` })) : null }));
58
+ runGatewayUninstall()
59
+ .catch((err) => {
60
+ p.log.error(`Failed to uninstall: ${err instanceof Error ? err.message : 'Unknown error'}`);
61
+ })
62
+ .finally(() => {
63
+ setTimeout(() => exit(), 100);
64
+ });
65
+ }, [exit]);
66
+ return null;
79
67
  }
80
68
  //# sourceMappingURL=uninstall.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EACN,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAMtC,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,MAAa;IACrD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAQlC,UAAU,CAAC,CAAC;IACd,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,CAAC,KAAK,IAAI,EAAE;YACX,IAAI,CAAC;gBACJ,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;gBAErC,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;wBAChB,SAAS,CAAC,aAAa,CAAC,CAAC;oBAC1B,CAAC;oBACD,OAAO;gBACR,CAAC;gBAED,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBAExD,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,iCAAiC;oBACjC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;oBAC/B,IAAI,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;wBACrC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;wBACnC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC;oBAED,IAAI,CAAC,SAAS,EAAE,CAAC;wBAChB,SAAS,CAAC,eAAe,CAAC,CAAC;oBAC5B,CAAC;oBACD,OAAO;gBACR,CAAC;gBAED,kBAAkB;gBAClB,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC1D,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBACjC,IAAI,CAAC,SAAS,EAAE,CAAC;wBAChB,SAAS,CAAC,UAAU,CAAC,CAAC;oBACvB,CAAC;oBACD,IAAI,CAAC;wBACJ,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;wBAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC3D,CAAC;oBAAC,MAAM,CAAC;wBACR,kBAAkB;oBACnB,CAAC;gBACF,CAAC;gBAED,YAAY;gBACZ,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,SAAS,CAAC,cAAc,CAAC,CAAC;gBAC3B,CAAC;gBAED,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAEpC,uBAAuB;gBACvB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;gBAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;gBACnC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAExB,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,SAAS,CAAC,SAAS,CAAC,CAAC;gBACtB,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;oBAC/D,SAAS,CAAC,OAAO,CAAC,CAAC;gBACpB,CAAC;YACF,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,GAAG,EAAE;YACX,SAAS,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACN,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,iBAAiB,YAC7C,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CACxB,KAAC,IAAI,IAAC,QAAQ,0CAA2B,CACzC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAC3B,KAAC,IAAI,IAAC,QAAQ,0CAA2B,CACzC,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,CAC/B,KAAC,IAAI,IAAC,QAAQ,0CAA2B,CACzC,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAC9B,KAAC,YAAY,IAAC,OAAO,EAAC,oDAAoD,GAAG,CAC7E,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,CAChC,KAAC,YAAY,IAAC,OAAO,EAAC,0BAA0B,EAAC,SAAS,SAAG,CAC7D,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAC1B,KAAC,cAAc,IACd,OAAO,EAAE,wGAAwG,GAChH,CACF,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CACxB,KAAC,YAAY,IAAC,OAAO,EAAE,wBAAwB,KAAK,EAAE,GAAI,CAC1D,CAAC,CAAC,CAAC,IAAI,GACe,CACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":"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"}
@@ -3,6 +3,6 @@ export declare const options: zod.ZodObject<{}, zod.core.$strip>;
3
3
  type Props = {
4
4
  options: zod.infer<typeof options>;
5
5
  };
6
- export default function Login(_props: Props): import("react/jsx-runtime").JSX.Element | null;
6
+ export default function Login(_props: Props): null;
7
7
  export {};
8
8
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.tsx"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,KAAK,CAAC;AA4BtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,kDA0I1C"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAwBtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAoFF,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,QAc1C"}
@@ -1,6 +1,7 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
3
- import { Text } from 'ink';
1
+ import { useEffect } from 'react';
2
+ import { useApp } from 'ink';
3
+ import * as p from '@clack/prompts';
4
+ import chalk from 'chalk';
4
5
  import zod from 'zod';
5
6
  import { exec } from 'node:child_process';
6
7
  import { CoreClient } from '@redplanethq/sdk';
@@ -8,9 +9,6 @@ import { getConfig, updateConfig } from '../config/index.js';
8
9
  const BASE_URL = 'https://app.getcore.me';
9
10
  const POLL_INTERVAL_MS = 2000;
10
11
  const POLL_TIMEOUT_MS = 300_000; // 5 minutes
11
- /**
12
- * Open URL in the default browser
13
- */
14
12
  function openBrowser(url) {
15
13
  const command = process.platform === 'darwin'
16
14
  ? `open "${url}"`
@@ -19,113 +17,95 @@ function openBrowser(url) {
19
17
  : `xdg-open "${url}"`;
20
18
  exec(command, (error) => {
21
19
  if (error) {
22
- // Silently fail - user can still copy the URL manually
23
20
  console.error('Failed to open browser:', error.message);
24
21
  }
25
22
  });
26
23
  }
27
24
  export const options = zod.object({});
28
- export default function Login(_props) {
29
- const [status, setStatus] = useState('checking');
30
- const [url, setUrl] = useState('');
31
- const [error, setError] = useState('');
32
- useEffect(() => {
33
- let cancelled = false;
34
- (async () => {
35
- // Step 1: Check if already authenticated
36
- const config = getConfig();
37
- if (config.auth?.apiKey) {
38
- try {
39
- const client = new CoreClient({
40
- baseUrl: config.auth.url || BASE_URL,
41
- token: config.auth.apiKey,
42
- });
43
- await client.checkAuth();
44
- if (!cancelled)
45
- setStatus('already-authenticated');
46
- return;
47
- }
48
- catch {
49
- // Token invalid or expired — proceed with login flow
50
- }
51
- }
52
- // Step 2: Request authorization code
53
- setStatus('fetching-code');
54
- const client = new CoreClient({ baseUrl: BASE_URL, token: '' });
55
- let authCode = '';
56
- let verifyUrl = '';
57
- try {
58
- const res = await client.getAuthorizationCode();
59
- authCode = res.authorizationCode;
60
- const base64Token = Buffer.from(JSON.stringify({ authorizationCode: authCode, source: 'core-cli', clientName: 'core-cli' })).toString("base64");
61
- verifyUrl = `${BASE_URL}/agent/verify/${base64Token}?source=core-cli`;
62
- }
63
- catch (err) {
64
- if (!cancelled) {
65
- setError(err instanceof Error ? err.message : 'Failed to get authorization code');
66
- setStatus('error');
67
- }
68
- return;
69
- }
70
- if (!cancelled) {
71
- setUrl(verifyUrl);
72
- setStatus('polling');
73
- // Automatically open the URL in browser
74
- openBrowser(verifyUrl);
75
- }
76
- // Step 3: Poll for token
77
- const startedAt = Date.now();
78
- while (!cancelled) {
79
- if (Date.now() - startedAt > POLL_TIMEOUT_MS) {
80
- if (!cancelled) {
81
- setError('Login timed out after 5 minutes. Please try again.');
82
- setStatus('error');
83
- }
84
- return;
85
- }
86
- await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
87
- if (cancelled)
88
- break;
89
- try {
90
- const tokenRes = await client.exchangeToken({ authorizationCode: authCode });
91
- if (tokenRes.token) {
92
- const pat = tokenRes.token.token;
93
- // Step 4: Persist token
94
- updateConfig({
95
- auth: {
96
- url: BASE_URL,
97
- apiKey: pat,
98
- },
99
- });
100
- if (!cancelled)
101
- setStatus('success');
102
- return;
103
- }
104
- }
105
- catch {
106
- // Token endpoint returned an error — keep polling
107
- }
108
- }
109
- })();
110
- return () => {
111
- cancelled = true;
25
+ async function runLogin() {
26
+ p.intro(chalk.bgCyan(chalk.black(' Login ')));
27
+ const spinner = p.spinner();
28
+ // Step 1: Check if already authenticated
29
+ spinner.start('Checking existing authentication...');
30
+ const config = getConfig();
31
+ if (config.auth?.apiKey) {
32
+ try {
33
+ const client = new CoreClient({
34
+ baseUrl: config.auth.url || BASE_URL,
35
+ token: config.auth.apiKey,
36
+ });
37
+ await client.checkAuth();
38
+ spinner.stop(chalk.green('Already authenticated'));
39
+ p.outro('Use a different command or clear your config to re-login.');
40
+ return { success: true };
41
+ }
42
+ catch {
43
+ // Token invalid or expired — proceed with login flow
44
+ }
45
+ }
46
+ // Step 2: Request authorization code
47
+ spinner.message('Requesting authorization code...');
48
+ const client = new CoreClient({ baseUrl: BASE_URL, token: '' });
49
+ let authCode = '';
50
+ let verifyUrl = '';
51
+ try {
52
+ const res = await client.getAuthorizationCode();
53
+ authCode = res.authorizationCode;
54
+ const base64Token = Buffer.from(JSON.stringify({ authorizationCode: authCode, source: 'core-cli', clientName: 'core-cli' })).toString('base64');
55
+ verifyUrl = `${BASE_URL}/agent/verify/${base64Token}?source=core-cli`;
56
+ }
57
+ catch (err) {
58
+ spinner.stop(chalk.red('Failed to get authorization code'));
59
+ return {
60
+ success: false,
61
+ error: err instanceof Error ? err.message : 'Failed to get authorization code',
112
62
  };
113
- }, []);
114
- switch (status) {
115
- case 'checking':
116
- return _jsx(Text, { dimColor: true, children: "Checking existing authentication..." });
117
- case 'already-authenticated':
118
- return (_jsx(Text, { color: "green", children: "Already authenticated. Use a different command or clear your config to re-login." }));
119
- case 'fetching-code':
120
- return _jsx(Text, { dimColor: true, children: "Requesting authorization code..." });
121
- case 'polling':
122
- return (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", children: "Opening browser to authorize... If it doesn't open automatically, visit:" }), _jsx(Text, { color: "cyan", children: url }), _jsx(Text, { dimColor: true, children: "Waiting for authorization..." })] }));
123
- case 'success':
124
- return (_jsx(Text, { color: "green", bold: true, children: "Successfully logged in. Token saved to config." }));
125
- case 'error':
126
- return _jsx(Text, { color: "red", children: error });
127
- default:
128
- return null;
129
63
  }
64
+ spinner.stop(chalk.green('Authorization code received'));
65
+ // Open browser and show URL
66
+ p.log.info(`Opening browser to authorize...`);
67
+ p.log.message(chalk.cyan(verifyUrl));
68
+ openBrowser(verifyUrl);
69
+ // Step 3: Poll for token
70
+ spinner.start('Waiting for authorization...');
71
+ const startedAt = Date.now();
72
+ while (true) {
73
+ if (Date.now() - startedAt > POLL_TIMEOUT_MS) {
74
+ spinner.stop(chalk.red('Login timed out'));
75
+ return { success: false, error: 'Login timed out after 5 minutes. Please try again.' };
76
+ }
77
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
78
+ try {
79
+ const tokenRes = await client.exchangeToken({ authorizationCode: authCode });
80
+ if (tokenRes.token) {
81
+ const pat = tokenRes.token.token;
82
+ updateConfig({
83
+ auth: {
84
+ url: BASE_URL,
85
+ apiKey: pat,
86
+ },
87
+ });
88
+ spinner.stop(chalk.green('Authorization successful'));
89
+ p.outro(chalk.green('Successfully logged in. Token saved to config.'));
90
+ return { success: true };
91
+ }
92
+ }
93
+ catch {
94
+ // Token endpoint returned an error — keep polling
95
+ }
96
+ }
97
+ }
98
+ export default function Login(_props) {
99
+ const { exit } = useApp();
100
+ useEffect(() => {
101
+ runLogin()
102
+ .catch((err) => {
103
+ p.log.error(err instanceof Error ? err.message : 'Unknown error');
104
+ })
105
+ .finally(() => {
106
+ setTimeout(() => exit(), 100);
107
+ });
108
+ }, [exit]);
109
+ return null;
130
110
  }
131
111
  //# sourceMappingURL=login.js.map