sleev 0.0.12 → 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.
- package/README.md +19 -39
- package/dist/auth/browser.d.ts +12 -0
- package/dist/auth/browser.js +33 -24
- package/dist/auth/browser.js.map +1 -0
- package/dist/auth/firebase-tokens.d.ts +39 -0
- package/dist/auth/firebase-tokens.js +173 -0
- package/dist/auth/firebase-tokens.js.map +1 -0
- package/dist/auth/firebase.d.ts +17 -0
- package/dist/auth/firebase.js +55 -0
- package/dist/auth/firebase.js.map +1 -0
- package/dist/auth/login.d.ts +22 -0
- package/dist/auth/login.js +31 -28
- package/dist/auth/login.js.map +1 -0
- package/dist/auth/loopback.d.ts +19 -0
- package/dist/auth/loopback.js +114 -44
- package/dist/auth/loopback.js.map +1 -0
- package/dist/auth/schema.d.ts +26 -0
- package/dist/auth/schema.js +59 -17
- package/dist/auth/schema.js.map +1 -0
- package/dist/auth/token.d.ts +19 -0
- package/dist/auth/token.js +53 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/auth/verify.d.ts +6 -0
- package/dist/auth/verify.js +22 -0
- package/dist/auth/verify.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +245 -59
- package/dist/cli.js.map +1 -0
- package/dist/config/paths.d.ts +12 -0
- package/dist/config/paths.js +34 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/store.d.ts +63 -0
- package/dist/config/store.js +270 -0
- package/dist/config/store.js.map +1 -0
- package/dist/control/local-installations.d.ts +13 -0
- package/dist/control/local-installations.js +37 -0
- package/dist/control/local-installations.js.map +1 -0
- package/dist/daemon/config.d.ts +10 -0
- package/dist/daemon/config.js +52 -0
- package/dist/daemon/config.js.map +1 -0
- package/dist/daemon/controller.d.ts +29 -0
- package/dist/daemon/controller.js +34 -0
- package/dist/daemon/controller.js.map +1 -0
- package/dist/daemon/health.d.ts +8 -0
- package/dist/daemon/health.js +47 -0
- package/dist/daemon/health.js.map +1 -0
- package/dist/daemon/start.d.ts +5 -0
- package/dist/daemon/start.js +24 -0
- package/dist/daemon/start.js.map +1 -0
- package/dist/daemon/systemd.d.ts +35 -0
- package/dist/daemon/systemd.js +181 -0
- package/dist/daemon/systemd.js.map +1 -0
- package/dist/gateway/acquire.d.ts +14 -0
- package/dist/gateway/acquire.js +112 -0
- package/dist/gateway/acquire.js.map +1 -0
- package/dist/gateway/manifest.d.ts +26 -0
- package/dist/gateway/manifest.js +98 -0
- package/dist/gateway/manifest.js.map +1 -0
- package/dist/gateway/platform.d.ts +5 -0
- package/dist/gateway/platform.js +27 -0
- package/dist/gateway/platform.js.map +1 -0
- package/dist/harness/claude.d.ts +8 -0
- package/dist/{apps → harness}/claude.js +28 -28
- package/dist/harness/claude.js.map +1 -0
- package/dist/harness/codex.d.ts +10 -0
- package/dist/{apps → harness}/codex.js +50 -45
- package/dist/harness/codex.js.map +1 -0
- package/dist/harness/index.d.ts +13 -0
- package/dist/harness/index.js +63 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/opencode-config.d.ts +8 -0
- package/dist/{apps → harness}/opencode-config.js +116 -83
- package/dist/harness/opencode-config.js.map +1 -0
- package/dist/harness/opencode.d.ts +14 -0
- package/dist/harness/opencode.js +50 -0
- package/dist/harness/opencode.js.map +1 -0
- package/dist/harness/providers.d.ts +8 -0
- package/dist/harness/providers.js +30 -0
- package/dist/harness/providers.js.map +1 -0
- package/dist/harness/types.d.ts +14 -0
- package/dist/harness/types.js +2 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/product.d.ts +12 -0
- package/dist/product.js +53 -10
- package/dist/product.js.map +1 -0
- package/dist/tui/clipboard.d.ts +1 -0
- package/dist/tui/clipboard.js +48 -0
- package/dist/tui/clipboard.js.map +1 -0
- package/dist/tui/openTuiApp.d.ts +1 -0
- package/dist/tui/openTuiApp.js +1436 -0
- package/dist/tui/openTuiApp.js.map +1 -0
- package/dist/tui/pages/flow-screen.d.ts +50 -0
- package/dist/tui/pages/flow-screen.js +435 -0
- package/dist/tui/pages/flow-screen.js.map +1 -0
- package/dist/tui/pages/footer.d.ts +7 -0
- package/dist/tui/pages/footer.js +14 -0
- package/dist/tui/pages/footer.js.map +1 -0
- package/dist/tui/pages/home-screen.d.ts +19 -0
- package/dist/tui/pages/home-screen.js +89 -0
- package/dist/tui/pages/home-screen.js.map +1 -0
- package/dist/tui/pages/index.d.ts +17 -0
- package/dist/tui/pages/index.js +11 -0
- package/dist/tui/pages/index.js.map +1 -0
- package/dist/tui/pages/local-setup-screen.d.ts +23 -0
- package/dist/tui/pages/local-setup-screen.js +134 -0
- package/dist/tui/pages/local-setup-screen.js.map +1 -0
- package/dist/tui/pages/location-card.d.ts +19 -0
- package/dist/tui/pages/location-card.js +116 -0
- package/dist/tui/pages/location-card.js.map +1 -0
- package/dist/tui/pages/menu-screen.d.ts +24 -0
- package/dist/tui/pages/menu-screen.js +117 -0
- package/dist/tui/pages/menu-screen.js.map +1 -0
- package/dist/tui/pages/session-grid.d.ts +23 -0
- package/dist/tui/pages/session-grid.js +552 -0
- package/dist/tui/pages/session-grid.js.map +1 -0
- package/dist/tui/pages/setup-screen.d.ts +15 -0
- package/dist/tui/pages/setup-screen.js +80 -0
- package/dist/tui/pages/setup-screen.js.map +1 -0
- package/dist/tui/pages/terminal-log.d.ts +14 -0
- package/dist/tui/pages/terminal-log.js +104 -0
- package/dist/tui/pages/terminal-log.js.map +1 -0
- package/dist/tui/pages/welcome-screen.d.ts +16 -0
- package/dist/tui/pages/welcome-screen.js +80 -0
- package/dist/tui/pages/welcome-screen.js.map +1 -0
- package/dist/tui/saved-tokens.d.ts +10 -0
- package/dist/tui/saved-tokens.js +104 -0
- package/dist/tui/saved-tokens.js.map +1 -0
- package/dist/tui/theme.d.ts +25 -0
- package/dist/tui/theme.js +27 -0
- package/dist/tui/theme.js.map +1 -0
- package/package.json +55 -38
- package/dist/apps/opencode.js +0 -158
- package/dist/apps.js +0 -148
- package/dist/auth/command.js +0 -109
- package/dist/auth/index.js +0 -2
- package/dist/auth/validation.js +0 -27
- package/dist/credentials/index.js +0 -3
- package/dist/credentials/schema.js +0 -63
- package/dist/credentials/store.js +0 -52
- package/dist/harnesses.js +0 -66
- package/dist/index.js +0 -3
- package/dist/providers.js +0 -30
- package/dist/terminal.js +0 -55
package/dist/cli.js
CHANGED
|
@@ -1,69 +1,255 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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 (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
39
|
+
return {
|
|
40
|
+
exitCode: 0,
|
|
41
|
+
output: JSON.stringify({ config, daemon }, null, 2),
|
|
42
|
+
};
|
|
21
43
|
}
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
|
|
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 (
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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 ===
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 {};
|