sleev 0.0.11 → 0.0.13

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 (144) hide show
  1. package/README.md +19 -39
  2. package/dist/auth/browser.d.ts +12 -0
  3. package/dist/auth/browser.js +33 -24
  4. package/dist/auth/browser.js.map +1 -0
  5. package/dist/auth/firebase-tokens.d.ts +39 -0
  6. package/dist/auth/firebase-tokens.js +173 -0
  7. package/dist/auth/firebase-tokens.js.map +1 -0
  8. package/dist/auth/firebase.d.ts +17 -0
  9. package/dist/auth/firebase.js +55 -0
  10. package/dist/auth/firebase.js.map +1 -0
  11. package/dist/auth/login.d.ts +22 -0
  12. package/dist/auth/login.js +31 -28
  13. package/dist/auth/login.js.map +1 -0
  14. package/dist/auth/loopback.d.ts +19 -0
  15. package/dist/auth/loopback.js +114 -44
  16. package/dist/auth/loopback.js.map +1 -0
  17. package/dist/auth/schema.d.ts +26 -0
  18. package/dist/auth/schema.js +59 -17
  19. package/dist/auth/schema.js.map +1 -0
  20. package/dist/auth/token.d.ts +19 -0
  21. package/dist/auth/token.js +53 -0
  22. package/dist/auth/token.js.map +1 -0
  23. package/dist/auth/verify.d.ts +6 -0
  24. package/dist/auth/verify.js +22 -0
  25. package/dist/auth/verify.js.map +1 -0
  26. package/dist/cli.d.ts +8 -0
  27. package/dist/cli.js +245 -59
  28. package/dist/cli.js.map +1 -0
  29. package/dist/config/paths.d.ts +12 -0
  30. package/dist/config/paths.js +34 -0
  31. package/dist/config/paths.js.map +1 -0
  32. package/dist/config/store.d.ts +63 -0
  33. package/dist/config/store.js +270 -0
  34. package/dist/config/store.js.map +1 -0
  35. package/dist/control/local-installations.d.ts +13 -0
  36. package/dist/control/local-installations.js +37 -0
  37. package/dist/control/local-installations.js.map +1 -0
  38. package/dist/daemon/config.d.ts +10 -0
  39. package/dist/daemon/config.js +52 -0
  40. package/dist/daemon/config.js.map +1 -0
  41. package/dist/daemon/controller.d.ts +29 -0
  42. package/dist/daemon/controller.js +34 -0
  43. package/dist/daemon/controller.js.map +1 -0
  44. package/dist/daemon/health.d.ts +8 -0
  45. package/dist/daemon/health.js +47 -0
  46. package/dist/daemon/health.js.map +1 -0
  47. package/dist/daemon/start.d.ts +5 -0
  48. package/dist/daemon/start.js +24 -0
  49. package/dist/daemon/start.js.map +1 -0
  50. package/dist/daemon/systemd.d.ts +35 -0
  51. package/dist/daemon/systemd.js +181 -0
  52. package/dist/daemon/systemd.js.map +1 -0
  53. package/dist/gateway/acquire.d.ts +14 -0
  54. package/dist/gateway/acquire.js +112 -0
  55. package/dist/gateway/acquire.js.map +1 -0
  56. package/dist/gateway/manifest.d.ts +26 -0
  57. package/dist/gateway/manifest.js +98 -0
  58. package/dist/gateway/manifest.js.map +1 -0
  59. package/dist/gateway/platform.d.ts +5 -0
  60. package/dist/gateway/platform.js +27 -0
  61. package/dist/gateway/platform.js.map +1 -0
  62. package/dist/harness/claude.d.ts +8 -0
  63. package/dist/{apps → harness}/claude.js +28 -28
  64. package/dist/harness/claude.js.map +1 -0
  65. package/dist/harness/codex.d.ts +10 -0
  66. package/dist/harness/codex.js +213 -0
  67. package/dist/harness/codex.js.map +1 -0
  68. package/dist/harness/index.d.ts +13 -0
  69. package/dist/harness/index.js +63 -0
  70. package/dist/harness/index.js.map +1 -0
  71. package/dist/harness/opencode-config.d.ts +8 -0
  72. package/dist/{apps → harness}/opencode-config.js +116 -83
  73. package/dist/harness/opencode-config.js.map +1 -0
  74. package/dist/harness/opencode.d.ts +14 -0
  75. package/dist/harness/opencode.js +50 -0
  76. package/dist/harness/opencode.js.map +1 -0
  77. package/dist/harness/providers.d.ts +8 -0
  78. package/dist/harness/providers.js +30 -0
  79. package/dist/harness/providers.js.map +1 -0
  80. package/dist/harness/types.d.ts +14 -0
  81. package/dist/harness/types.js +2 -0
  82. package/dist/harness/types.js.map +1 -0
  83. package/dist/product.d.ts +12 -0
  84. package/dist/product.js +53 -10
  85. package/dist/product.js.map +1 -0
  86. package/dist/tui/clipboard.d.ts +1 -0
  87. package/dist/tui/clipboard.js +48 -0
  88. package/dist/tui/clipboard.js.map +1 -0
  89. package/dist/tui/openTuiApp.d.ts +1 -0
  90. package/dist/tui/openTuiApp.js +1436 -0
  91. package/dist/tui/openTuiApp.js.map +1 -0
  92. package/dist/tui/pages/flow-screen.d.ts +50 -0
  93. package/dist/tui/pages/flow-screen.js +435 -0
  94. package/dist/tui/pages/flow-screen.js.map +1 -0
  95. package/dist/tui/pages/footer.d.ts +7 -0
  96. package/dist/tui/pages/footer.js +14 -0
  97. package/dist/tui/pages/footer.js.map +1 -0
  98. package/dist/tui/pages/home-screen.d.ts +19 -0
  99. package/dist/tui/pages/home-screen.js +89 -0
  100. package/dist/tui/pages/home-screen.js.map +1 -0
  101. package/dist/tui/pages/index.d.ts +17 -0
  102. package/dist/tui/pages/index.js +11 -0
  103. package/dist/tui/pages/index.js.map +1 -0
  104. package/dist/tui/pages/local-setup-screen.d.ts +23 -0
  105. package/dist/tui/pages/local-setup-screen.js +134 -0
  106. package/dist/tui/pages/local-setup-screen.js.map +1 -0
  107. package/dist/tui/pages/location-card.d.ts +19 -0
  108. package/dist/tui/pages/location-card.js +116 -0
  109. package/dist/tui/pages/location-card.js.map +1 -0
  110. package/dist/tui/pages/menu-screen.d.ts +24 -0
  111. package/dist/tui/pages/menu-screen.js +117 -0
  112. package/dist/tui/pages/menu-screen.js.map +1 -0
  113. package/dist/tui/pages/session-grid.d.ts +23 -0
  114. package/dist/tui/pages/session-grid.js +552 -0
  115. package/dist/tui/pages/session-grid.js.map +1 -0
  116. package/dist/tui/pages/setup-screen.d.ts +15 -0
  117. package/dist/tui/pages/setup-screen.js +80 -0
  118. package/dist/tui/pages/setup-screen.js.map +1 -0
  119. package/dist/tui/pages/terminal-log.d.ts +14 -0
  120. package/dist/tui/pages/terminal-log.js +104 -0
  121. package/dist/tui/pages/terminal-log.js.map +1 -0
  122. package/dist/tui/pages/welcome-screen.d.ts +16 -0
  123. package/dist/tui/pages/welcome-screen.js +80 -0
  124. package/dist/tui/pages/welcome-screen.js.map +1 -0
  125. package/dist/tui/saved-tokens.d.ts +10 -0
  126. package/dist/tui/saved-tokens.js +104 -0
  127. package/dist/tui/saved-tokens.js.map +1 -0
  128. package/dist/tui/theme.d.ts +25 -0
  129. package/dist/tui/theme.js +27 -0
  130. package/dist/tui/theme.js.map +1 -0
  131. package/package.json +55 -38
  132. package/dist/apps/codex.js +0 -184
  133. package/dist/apps/opencode.js +0 -158
  134. package/dist/apps.js +0 -148
  135. package/dist/auth/command.js +0 -109
  136. package/dist/auth/index.js +0 -2
  137. package/dist/auth/validation.js +0 -27
  138. package/dist/credentials/index.js +0 -3
  139. package/dist/credentials/schema.js +0 -63
  140. package/dist/credentials/store.js +0 -52
  141. package/dist/harnesses.js +0 -66
  142. package/dist/index.js +0 -3
  143. package/dist/providers.js +0 -30
  144. package/dist/terminal.js +0 -55
package/dist/cli.js CHANGED
@@ -1,69 +1,255 @@
1
1
  #!/usr/bin/env node
2
- // Thin command dispatcher for the `sleev` executable.
3
- import { existsSync, realpathSync } from 'node:fs';
4
- import { pathToFileURL } from 'node:url';
5
- import { loginCommand, logoutCommand } from './auth/command.js';
6
- import { failure } from './terminal.js';
7
- const HELP = `sleev\n\nUsage:\n sleev login [--force]\n sleev install [--force]\n sleev auth login [--force]\n sleev auth <command>\n\nCommands:\n login Open the Sleev web app when needed and store a local auth token\n install Alias for login\n auth login Open the Sleev web app when needed and store a local auth token\n auth logout Delete the local auth file\n`;
8
- const LOGIN_HELP = `Usage:\n sleev login [--force]\n sleev install [--force]\n sleev auth login [--force]\n`;
9
- const AUTH_HELP = `Usage:\n sleev auth login [--force]\n sleev auth logout\n`;
10
- export async function main(argv = process.argv.slice(2)) {
11
- if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
12
- process.stdout.write(HELP);
13
- return 0;
2
+ import { readConfig, setGatewayConfig, signInConfig, signOutConfig, writeConfig, } from "./config/store.js";
3
+ import { acquireGateway } from "./gateway/acquire.js";
4
+ import { gatewayUpdates } from "./product.js";
5
+ import { resolveSleevedPaths } from "./config/paths.js";
6
+ import { createController } from "./daemon/controller.js";
7
+ import { clearGatewayConfig } from "./daemon/config.js";
8
+ import { runTui } from "./tui/openTuiApp.js";
9
+ import { firebaseLogin } from "./auth/firebase.js";
10
+ import { clearStoredFirebaseAuth, saveFirebaseLogin, } from "./auth/firebase-tokens.js";
11
+ import { verifyFirebaseAuth } from "./auth/verify.js";
12
+ import { unpatchHarnesses } from "./harness/index.js";
13
+ export async function runCli(argv) {
14
+ const [command, subcommand] = argv;
15
+ if (command === undefined || command === "tui") {
16
+ await runTui();
17
+ return { exitCode: 0 };
14
18
  }
15
- if (argv[0] === 'login' || argv[0] === 'install') {
16
- if (argv[1] === '--help' || argv[1] === '-h') {
17
- process.stdout.write(LOGIN_HELP);
18
- return 0;
19
+ if (command === "paths") {
20
+ const paths = resolveSleevedPaths();
21
+ return {
22
+ exitCode: 0,
23
+ output: JSON.stringify(paths, null, 2),
24
+ };
25
+ }
26
+ if (command === "status") {
27
+ const config = await readConfig();
28
+ let daemon;
29
+ try {
30
+ daemon = await (await createController(config)).status();
31
+ }
32
+ catch (error) {
33
+ daemon = {
34
+ error: error instanceof Error
35
+ ? error.message
36
+ : "Daemon status unavailable.",
37
+ };
19
38
  }
20
- return login(argv[0], argv.slice(1), LOGIN_HELP);
39
+ return {
40
+ exitCode: 0,
41
+ output: JSON.stringify({ config, daemon }, null, 2),
42
+ };
21
43
  }
22
- if (argv[0] !== 'auth') {
23
- process.stderr.write(`Unknown command: ${argv[0]}\n\n${HELP}`);
24
- return 1;
44
+ if (command === "init") {
45
+ const config = await readConfig();
46
+ await writeConfig(config);
47
+ return {
48
+ exitCode: 0,
49
+ output: "Initialized sleeved config.",
50
+ };
25
51
  }
26
- if (argv[1] === '--help' || argv[1] === '-h') {
27
- process.stdout.write(AUTH_HELP);
28
- return 0;
52
+ if (command === "auth" && subcommand === "login") {
53
+ const config = await readConfig();
54
+ const result = await firebaseLogin({});
55
+ await saveFirebaseLogin(result);
56
+ await writeConfig(signInConfig(config, {
57
+ label: result.label,
58
+ accountId: result.accountId,
59
+ email: result.email,
60
+ createdAt: new Date().toISOString(),
61
+ }));
62
+ return {
63
+ exitCode: 0,
64
+ output: `Signed in${result.email ? ` as ${result.email}` : ""}.`,
65
+ };
29
66
  }
30
- const command = argv[1];
31
- if (command !== 'login' && command !== 'logout') {
32
- process.stderr.write(`Unknown auth command: ${command ?? ''}\n\n${AUTH_HELP}`);
33
- return 1;
67
+ if (command === "auth" && subcommand === "logout") {
68
+ const config = await readConfig();
69
+ const cleanup = await unpatchHarnesses();
70
+ try {
71
+ const controller = await createController(config);
72
+ await controller.teardown();
73
+ }
74
+ catch {
75
+ // Best-effort: never block sign-out on daemon teardown.
76
+ }
77
+ await clearStoredFirebaseAuth();
78
+ await clearGatewayConfig();
79
+ await writeConfig(signOutConfig(config));
80
+ return {
81
+ exitCode: 0,
82
+ output: cleanup.failures[0]
83
+ ? `Signed out. Some harness config cleanup failed: ${cleanup.failures.join("; ")}`
84
+ : "Signed out.",
85
+ };
34
86
  }
35
- if (command === 'logout') {
36
- if (argv.length !== 2)
37
- return usageError(`auth ${command} does not accept flags yet.`, AUTH_HELP);
38
- return logoutCommand();
87
+ if (command === "auth" && subcommand === "verify") {
88
+ try {
89
+ const me = await verifyFirebaseAuth();
90
+ return {
91
+ exitCode: 0,
92
+ output: `Firebase auth OK${me.email ? ` (${me.email})` : ""}.`,
93
+ };
94
+ }
95
+ catch (error) {
96
+ return {
97
+ exitCode: 1,
98
+ error: error instanceof Error
99
+ ? error.message
100
+ : "Firebase auth verification failed.",
101
+ };
102
+ }
39
103
  }
40
- return login(`auth ${command}`, argv.slice(2), AUTH_HELP);
41
- }
42
- function login(command, flags, help) {
43
- if (flags.some((flag) => flag !== '--force'))
44
- return usageError(`Unknown ${command} flag.`, help);
45
- return loginCommand({ force: flags.includes('--force') });
46
- }
47
- function usageError(message, help) {
48
- process.stderr.write(`${message}\n\n${help}`);
49
- return 1;
50
- }
51
- if (isEntry()) {
52
- main().then((code) => {
53
- process.exitCode = code;
54
- }, (err) => {
55
- const message = err instanceof Error ? err.message : 'Command failed.';
56
- failure(process.stderr, message);
57
- process.exitCode = 1;
58
- });
104
+ if (command === "auth" &&
105
+ (subcommand === "status" || subcommand === undefined)) {
106
+ const config = await readConfig();
107
+ return {
108
+ exitCode: 0,
109
+ output: JSON.stringify({
110
+ signedIn: config.auth.signedIn,
111
+ email: config.auth.email,
112
+ accountId: config.auth.accountId,
113
+ createdAt: config.auth.createdAt,
114
+ }, null, 2),
115
+ };
116
+ }
117
+ if (command === "gateway" &&
118
+ (subcommand === "install" || subcommand === "update")) {
119
+ const config = await readConfig();
120
+ try {
121
+ const { channel } = gatewayUpdates();
122
+ const installed = await acquireGateway({
123
+ currentVersion: config.gateway?.version ?? null,
124
+ });
125
+ await writeConfig(setGatewayConfig(config, {
126
+ binPath: installed.binPath,
127
+ version: installed.version,
128
+ channel,
129
+ }));
130
+ return {
131
+ exitCode: 0,
132
+ output: `Gateway ${installed.version} ready at ${installed.binPath}.`,
133
+ };
134
+ }
135
+ catch (error) {
136
+ return {
137
+ exitCode: 1,
138
+ error: error instanceof Error
139
+ ? error.message
140
+ : "Failed to install the gateway binary.",
141
+ };
142
+ }
143
+ }
144
+ if (command === "daemon" && subcommand === "status") {
145
+ try {
146
+ const controller = await createController(await readConfig());
147
+ return {
148
+ exitCode: 0,
149
+ output: JSON.stringify(await controller.status(), null, 2),
150
+ };
151
+ }
152
+ catch (error) {
153
+ return {
154
+ exitCode: 1,
155
+ error: error instanceof Error
156
+ ? error.message
157
+ : "Daemon status unavailable.",
158
+ };
159
+ }
160
+ }
161
+ if (command === "daemon" &&
162
+ (subcommand === "start" || subcommand === "restart")) {
163
+ let config = await readConfig();
164
+ try {
165
+ // Auto-acquire the binary on first start unless a dev override
166
+ // (SLEEVE_GATEWAY_BIN) is set or it's already installed.
167
+ if (!config.gateway && !process.env.SLEEVE_GATEWAY_BIN?.trim()) {
168
+ const { channel } = gatewayUpdates();
169
+ const installed = await acquireGateway({
170
+ currentVersion: null,
171
+ });
172
+ config = setGatewayConfig(config, {
173
+ binPath: installed.binPath,
174
+ version: installed.version,
175
+ channel,
176
+ });
177
+ await writeConfig(config);
178
+ }
179
+ const controller = await createController(config);
180
+ const status = subcommand === "restart"
181
+ ? await controller.restart()
182
+ : await controller.start();
183
+ return {
184
+ exitCode: 0,
185
+ output: `Gateway daemon ${subcommand}ed via ${status.backend}: ${status.address} (healthy=${status.healthy}, configured=${status.configured ?? "n/a"}).`,
186
+ };
187
+ }
188
+ catch (error) {
189
+ return {
190
+ exitCode: 1,
191
+ error: error instanceof Error
192
+ ? error.message
193
+ : `Failed to ${subcommand} the gateway daemon.`,
194
+ };
195
+ }
196
+ }
197
+ if (command === "daemon" && subcommand === "stop") {
198
+ try {
199
+ const controller = await createController(await readConfig());
200
+ const status = await controller.stop();
201
+ return {
202
+ exitCode: 0,
203
+ output: status.running
204
+ ? `Gateway daemon still ${status.detail ?? "running"}.`
205
+ : `Gateway daemon stopped (${status.backend}).`,
206
+ };
207
+ }
208
+ catch (error) {
209
+ return {
210
+ exitCode: 1,
211
+ error: error instanceof Error
212
+ ? error.message
213
+ : "Failed to stop the gateway daemon.",
214
+ };
215
+ }
216
+ }
217
+ if (command === "setup") {
218
+ return {
219
+ exitCode: 2,
220
+ error: "Harness setup is not implemented yet.",
221
+ };
222
+ }
223
+ return {
224
+ exitCode: 2,
225
+ error: [
226
+ "Usage:",
227
+ " sleeved",
228
+ " sleeved tui",
229
+ " sleeved init",
230
+ " sleeved paths",
231
+ " sleeved status",
232
+ " sleeved auth login",
233
+ " sleeved auth status",
234
+ " sleeved auth logout",
235
+ " sleeved gateway install",
236
+ " sleeved daemon status",
237
+ " sleeved daemon start",
238
+ " sleeved daemon restart",
239
+ " sleeved daemon stop",
240
+ " sleeved setup <harness>",
241
+ ].join("\n"),
242
+ };
59
243
  }
60
- function isEntry() {
61
- const entry = process.argv[1];
62
- if (!entry)
63
- return false;
64
- if (import.meta.url === pathToFileURL(entry).href)
65
- return true;
66
- if (!existsSync(entry))
67
- return false;
68
- return realpathSync(new URL(import.meta.url)) === realpathSync(entry);
244
+ const isEntrypoint = process.argv[1] === new URL(import.meta.url).pathname;
245
+ if (isEntrypoint) {
246
+ const result = await runCli(process.argv.slice(2));
247
+ if (result.output) {
248
+ console.log(result.output);
249
+ }
250
+ if (result.error) {
251
+ console.error(result.error);
252
+ }
253
+ process.exitCode = result.exitCode;
69
254
  }
255
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EACH,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACH,uBAAuB,EACvB,iBAAiB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAQtD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAEnC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7C,MAAM,MAAM,EAAE,CAAC;QACf,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;QACpC,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;SACzC,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,GAAG;gBACL,KAAK,EACD,KAAK,YAAY,KAAK;oBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,4BAA4B;aACzC,CAAC;QACN,CAAC;QACD,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;SACtD,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,6BAA6B;SACxC,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,WAAW,CACb,YAAY,CAAC,MAAM,EAAE;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CACL,CAAC;QACF,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,YAAY,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;SACnE,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACzC,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACL,wDAAwD;QAC5D,CAAC;QACD,MAAM,uBAAuB,EAAE,CAAC;QAChC,MAAM,kBAAkB,EAAE,CAAC;QAC3B,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvB,CAAC,CAAC,mDAAmD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAClF,CAAC,CAAC,aAAa;SACtB,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAChD,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;YACtC,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;aACjE,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,KAAK,EACD,KAAK,YAAY,KAAK;oBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,oCAAoC;aACjD,CAAC;QACN,CAAC;IACL,CAAC;IAED,IACI,OAAO,KAAK,MAAM;QAClB,CAAC,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS,CAAC,EACvD,CAAC;QACC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAClB;gBACI,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;gBAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;gBACxB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;gBAChC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;aACnC,EACD,IAAI,EACJ,CAAC,CACJ;SACJ,CAAC;IACN,CAAC;IAED,IACI,OAAO,KAAK,SAAS;QACrB,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ,CAAC,EACvD,CAAC;QACC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;gBACnC,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI;aAClD,CAAC,CAAC;YACH,MAAM,WAAW,CACb,gBAAgB,CAAC,MAAM,EAAE;gBACrB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,OAAO;aACV,CAAC,CACL,CAAC;YACF,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,WAAW,SAAS,CAAC,OAAO,aAAa,SAAS,CAAC,OAAO,GAAG;aACxE,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,KAAK,EACD,KAAK,YAAY,KAAK;oBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,uCAAuC;aACpD,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClD,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;YAC9D,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC7D,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,KAAK,EACD,KAAK,YAAY,KAAK;oBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,4BAA4B;aACzC,CAAC;QACN,CAAC;IACL,CAAC;IAED,IACI,OAAO,KAAK,QAAQ;QACpB,CAAC,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,SAAS,CAAC,EACtD,CAAC;QACC,IAAI,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACD,+DAA+D;YAC/D,yDAAyD;YACzD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;oBACnC,cAAc,EAAE,IAAI;iBACvB,CAAC,CAAC;gBACH,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE;oBAC9B,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,OAAO;iBACV,CAAC,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,MAAM,GACR,UAAU,KAAK,SAAS;gBACpB,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE;gBAC5B,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,kBAAkB,UAAU,UAAU,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,gBAAgB,MAAM,CAAC,UAAU,IAAI,KAAK,IAAI;aAC3J,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,KAAK,EACD,KAAK,YAAY,KAAK;oBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,aAAa,UAAU,sBAAsB;aAC1D,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAChD,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,MAAM,CAAC,OAAO;oBAClB,CAAC,CAAC,wBAAwB,MAAM,CAAC,MAAM,IAAI,SAAS,GAAG;oBACvD,CAAC,CAAC,2BAA2B,MAAM,CAAC,OAAO,IAAI;aACtD,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,QAAQ,EAAE,CAAC;gBACX,KAAK,EACD,KAAK,YAAY,KAAK;oBAClB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,oCAAoC;aACjD,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,uCAAuC;SACjD,CAAC;IACN,CAAC;IAED,OAAO;QACH,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE;YACH,QAAQ;YACR,WAAW;YACX,eAAe;YACf,gBAAgB;YAChB,iBAAiB;YACjB,kBAAkB;YAClB,sBAAsB;YACtB,uBAAuB;YACvB,uBAAuB;YACvB,2BAA2B;YAC3B,yBAAyB;YACzB,wBAAwB;YACxB,0BAA0B;YAC1B,uBAAuB;YACvB,2BAA2B;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC;KACf,CAAC;AACN,CAAC;AAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AAE3E,IAAI,YAAY,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACvC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type SleevedPaths = {
2
+ configDir: string;
3
+ dataDir: string;
4
+ stateDir: string;
5
+ configFile: string;
6
+ firebaseCredentialsFile: string;
7
+ gatewayConfigFile: string;
8
+ databaseFile: string;
9
+ logDir: string;
10
+ pidFile: string;
11
+ };
12
+ export declare function resolveSleevedPaths(env?: NodeJS.ProcessEnv): SleevedPaths;
@@ -0,0 +1,34 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ const APP_NAME = "sleev";
4
+ export function resolveSleevedPaths(env = process.env) {
5
+ const home = os.homedir();
6
+ const platform = os.platform();
7
+ const configBase = env.XDG_CONFIG_HOME ??
8
+ (platform === "win32"
9
+ ? (env.APPDATA ?? path.join(home, "AppData", "Roaming"))
10
+ : path.join(home, ".config"));
11
+ const dataBase = env.XDG_DATA_HOME ??
12
+ (platform === "win32"
13
+ ? (env.LOCALAPPDATA ?? path.join(home, "AppData", "Local"))
14
+ : path.join(home, ".local", "share"));
15
+ const stateBase = env.XDG_STATE_HOME ??
16
+ (platform === "win32"
17
+ ? (env.LOCALAPPDATA ?? path.join(home, "AppData", "Local"))
18
+ : path.join(home, ".local", "state"));
19
+ const configDir = path.join(configBase, APP_NAME);
20
+ const dataDir = path.join(dataBase, APP_NAME);
21
+ const stateDir = path.join(stateBase, APP_NAME);
22
+ return {
23
+ configDir,
24
+ dataDir,
25
+ stateDir,
26
+ configFile: path.join(configDir, "config.json"),
27
+ firebaseCredentialsFile: path.join(configDir, "firebase.json"),
28
+ gatewayConfigFile: path.join(configDir, "gateway.json"),
29
+ databaseFile: path.join(dataDir, "sleeve.sqlite"),
30
+ logDir: path.join(stateDir, "logs"),
31
+ pidFile: path.join(stateDir, "sleeved.pid"),
32
+ };
33
+ }
34
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,MAAM,UAAU,mBAAmB,CAC/B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,MAAM,UAAU,GACZ,GAAG,CAAC,eAAe;QACnB,CAAC,QAAQ,KAAK,OAAO;YACjB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtC,MAAM,QAAQ,GACV,GAAG,CAAC,aAAa;QACjB,CAAC,QAAQ,KAAK,OAAO;YACjB,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9C,MAAM,SAAS,GACX,GAAG,CAAC,cAAc;QAClB,CAAC,QAAQ,KAAK,OAAO;YACjB,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhD,OAAO;QACH,SAAS;QACT,OAAO;QACP,QAAQ;QACR,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QAC/C,uBAAuB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;QAC9D,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;QACvD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QACjD,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QACnC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC9C,CAAC;AACN,CAAC"}
@@ -0,0 +1,63 @@
1
+ export type HarnessSlug = "claude-code" | "codex" | "opencode" | "gemini";
2
+ export type ServiceLocation = "local" | "cloud";
3
+ export type SleevedConfig = {
4
+ version: 1;
5
+ proxy: {
6
+ host: string;
7
+ port: number;
8
+ };
9
+ auth: {
10
+ signedIn: boolean;
11
+ label?: string | null;
12
+ accountId?: string | null;
13
+ email?: string | null;
14
+ createdAt?: string;
15
+ };
16
+ location: {
17
+ mode: ServiceLocation | null;
18
+ };
19
+ localInstallation: LocalInstallation | null;
20
+ gateway: GatewayInstall | null;
21
+ tokens: {
22
+ defaultId: string | null;
23
+ items: SleevedToken[];
24
+ };
25
+ harnesses: Partial<Record<HarnessSlug, {
26
+ configured: boolean;
27
+ }>>;
28
+ };
29
+ export type LocalInstallation = {
30
+ installationId: string;
31
+ credential: string;
32
+ controlUrl: string;
33
+ };
34
+ export type GatewayInstall = {
35
+ binPath: string;
36
+ version: string;
37
+ channel: string;
38
+ };
39
+ export type SleevedToken = {
40
+ id: string;
41
+ token: string;
42
+ label: string | null;
43
+ proxyUrl: string;
44
+ createdAt: string;
45
+ };
46
+ type AuthSession = {
47
+ label: string | null;
48
+ accountId: string;
49
+ email: string | null;
50
+ createdAt: string;
51
+ };
52
+ export declare function defaultConfig(): SleevedConfig;
53
+ export declare function signInConfig(config: SleevedConfig, session: AuthSession): SleevedConfig;
54
+ export declare function signOutConfig(config: SleevedConfig): SleevedConfig;
55
+ export declare function setLocalInstallationConfig(config: SleevedConfig, localInstallation: LocalInstallation | null): SleevedConfig;
56
+ export declare function setGatewayConfig(config: SleevedConfig, gateway: GatewayInstall | null): SleevedConfig;
57
+ export declare function setLocationConfig(config: SleevedConfig, mode: ServiceLocation): SleevedConfig;
58
+ export declare function setHarnessesConfig(config: SleevedConfig, slugs: readonly HarnessSlug[]): SleevedConfig;
59
+ export declare function addTokenConfig(config: SleevedConfig, token: SleevedToken): SleevedConfig;
60
+ export declare function setDefaultTokenConfig(config: SleevedConfig, id: string): SleevedConfig;
61
+ export declare function readConfig(): Promise<SleevedConfig>;
62
+ export declare function writeConfig(config: SleevedConfig): Promise<void>;
63
+ export {};