@elaraai/e3-cli 0.0.2-beta.11 → 0.0.2-beta.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 (63) hide show
  1. package/README.md +21 -9
  2. package/dist/src/cli.js +29 -14
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/commands/auth.d.ts +21 -0
  5. package/dist/src/commands/auth.d.ts.map +1 -0
  6. package/dist/src/commands/auth.js +185 -0
  7. package/dist/src/commands/auth.js.map +1 -0
  8. package/dist/src/commands/get.d.ts.map +1 -1
  9. package/dist/src/commands/get.js +32 -14
  10. package/dist/src/commands/get.js.map +1 -1
  11. package/dist/src/commands/list.d.ts.map +1 -1
  12. package/dist/src/commands/list.js +47 -14
  13. package/dist/src/commands/list.js.map +1 -1
  14. package/dist/src/commands/logs.d.ts.map +1 -1
  15. package/dist/src/commands/logs.js +126 -54
  16. package/dist/src/commands/logs.js.map +1 -1
  17. package/dist/src/commands/package.d.ts.map +1 -1
  18. package/dist/src/commands/package.js +55 -18
  19. package/dist/src/commands/package.js.map +1 -1
  20. package/dist/src/commands/repo.d.ts +29 -0
  21. package/dist/src/commands/repo.d.ts.map +1 -0
  22. package/dist/src/commands/repo.js +231 -0
  23. package/dist/src/commands/repo.js.map +1 -0
  24. package/dist/src/commands/run.d.ts.map +1 -1
  25. package/dist/src/commands/run.js +4 -3
  26. package/dist/src/commands/run.js.map +1 -1
  27. package/dist/src/commands/set.d.ts.map +1 -1
  28. package/dist/src/commands/set.js +16 -5
  29. package/dist/src/commands/set.js.map +1 -1
  30. package/dist/src/commands/start.d.ts.map +1 -1
  31. package/dist/src/commands/start.js +166 -47
  32. package/dist/src/commands/start.js.map +1 -1
  33. package/dist/src/commands/tree.d.ts.map +1 -1
  34. package/dist/src/commands/tree.js +110 -16
  35. package/dist/src/commands/tree.js.map +1 -1
  36. package/dist/src/commands/watch.d.ts.map +1 -1
  37. package/dist/src/commands/watch.js +8 -6
  38. package/dist/src/commands/watch.js.map +1 -1
  39. package/dist/src/commands/workspace.d.ts +4 -0
  40. package/dist/src/commands/workspace.d.ts.map +1 -1
  41. package/dist/src/commands/workspace.js +269 -29
  42. package/dist/src/commands/workspace.js.map +1 -1
  43. package/dist/src/credentials.d.ts +123 -0
  44. package/dist/src/credentials.d.ts.map +1 -0
  45. package/dist/src/credentials.js +213 -0
  46. package/dist/src/credentials.js.map +1 -0
  47. package/dist/src/utils.d.ts +48 -0
  48. package/dist/src/utils.d.ts.map +1 -1
  49. package/dist/src/utils.js +58 -0
  50. package/dist/src/utils.js.map +1 -1
  51. package/package.json +7 -6
  52. package/dist/src/commands/gc.d.ts +0 -12
  53. package/dist/src/commands/gc.d.ts.map +0 -1
  54. package/dist/src/commands/gc.js +0 -44
  55. package/dist/src/commands/gc.js.map +0 -1
  56. package/dist/src/commands/init.d.ts +0 -9
  57. package/dist/src/commands/init.d.ts.map +0 -1
  58. package/dist/src/commands/init.js +0 -33
  59. package/dist/src/commands/init.js.map +0 -1
  60. package/dist/src/commands/status.d.ts +0 -9
  61. package/dist/src/commands/status.d.ts.map +0 -1
  62. package/dist/src/commands/status.js +0 -157
  63. package/dist/src/commands/status.js.map +0 -1
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Credential storage for e3 CLI.
7
+ *
8
+ * Stores access and refresh tokens for authenticated servers
9
+ * in ~/.e3/credentials.json.
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import * as os from 'node:os';
14
+ /**
15
+ * Get path to credentials file.
16
+ * Uses E3_CREDENTIALS_PATH env var if set, otherwise ~/.e3/credentials.json.
17
+ */
18
+ function getCredentialsPath() {
19
+ return process.env.E3_CREDENTIALS_PATH ?? path.join(os.homedir(), '.e3', 'credentials.json');
20
+ }
21
+ /**
22
+ * Normalize server URL (remove trailing slash).
23
+ */
24
+ export function normalizeServerUrl(url) {
25
+ return url.replace(/\/+$/, '');
26
+ }
27
+ /**
28
+ * Load credentials file.
29
+ */
30
+ export function loadCredentials() {
31
+ try {
32
+ const content = fs.readFileSync(getCredentialsPath(), 'utf8');
33
+ return JSON.parse(content);
34
+ }
35
+ catch {
36
+ return { version: 1, credentials: {} };
37
+ }
38
+ }
39
+ /**
40
+ * Save credentials file.
41
+ */
42
+ export function saveCredentials(file) {
43
+ const credPath = getCredentialsPath();
44
+ const dir = path.dirname(credPath);
45
+ if (!fs.existsSync(dir)) {
46
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
47
+ }
48
+ fs.writeFileSync(credPath, JSON.stringify(file, null, 2), { mode: 0o600 });
49
+ }
50
+ /**
51
+ * Get credential for a server.
52
+ */
53
+ export function getCredential(serverUrl) {
54
+ const file = loadCredentials();
55
+ return file.credentials[normalizeServerUrl(serverUrl)] ?? null;
56
+ }
57
+ /**
58
+ * Set credential for a server.
59
+ */
60
+ export function setCredential(serverUrl, entry) {
61
+ const file = loadCredentials();
62
+ file.credentials[normalizeServerUrl(serverUrl)] = entry;
63
+ saveCredentials(file);
64
+ }
65
+ /**
66
+ * Remove credential for a server.
67
+ */
68
+ export function removeCredential(serverUrl) {
69
+ const file = loadCredentials();
70
+ const key = normalizeServerUrl(serverUrl);
71
+ if (key in file.credentials) {
72
+ delete file.credentials[key];
73
+ saveCredentials(file);
74
+ return true;
75
+ }
76
+ return false;
77
+ }
78
+ /**
79
+ * List all saved credentials.
80
+ */
81
+ export function listCredentials() {
82
+ const file = loadCredentials();
83
+ return Object.entries(file.credentials).map(([server, entry]) => ({
84
+ server,
85
+ expiresAt: entry.expiresAt,
86
+ }));
87
+ }
88
+ /**
89
+ * Check if a token expiration time has passed.
90
+ */
91
+ export function isExpired(expiresAt) {
92
+ return new Date(expiresAt).getTime() < Date.now();
93
+ }
94
+ /**
95
+ * Fetch OIDC discovery document.
96
+ */
97
+ export async function fetchDiscovery(serverUrl) {
98
+ const url = `${normalizeServerUrl(serverUrl)}/.well-known/openid-configuration`;
99
+ const response = await fetch(url);
100
+ if (!response.ok) {
101
+ throw new Error(`Failed to fetch OIDC discovery: ${response.status}`);
102
+ }
103
+ return response.json();
104
+ }
105
+ /**
106
+ * Start device authorization flow.
107
+ */
108
+ export async function startDeviceAuth(discovery) {
109
+ const response = await fetch(discovery.device_authorization_endpoint, {
110
+ method: 'POST',
111
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
112
+ body: new URLSearchParams({ client_id: 'e3-cli' }),
113
+ });
114
+ if (!response.ok) {
115
+ throw new Error(`Failed to start device authorization: ${response.status}`);
116
+ }
117
+ return response.json();
118
+ }
119
+ /**
120
+ * Poll for device code approval.
121
+ */
122
+ export async function pollForTokens(discovery, deviceCode, interval, expiresIn) {
123
+ const deadline = Date.now() + expiresIn * 1000;
124
+ while (Date.now() < deadline) {
125
+ await new Promise((resolve) => setTimeout(resolve, interval * 1000));
126
+ const response = await fetch(discovery.token_endpoint, {
127
+ method: 'POST',
128
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
129
+ body: new URLSearchParams({
130
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
131
+ device_code: deviceCode,
132
+ client_id: 'e3-cli',
133
+ }),
134
+ });
135
+ if (response.ok) {
136
+ return response.json();
137
+ }
138
+ const error = await response.json();
139
+ if (error.error === 'authorization_pending') {
140
+ continue; // Keep polling
141
+ }
142
+ if (error.error === 'slow_down') {
143
+ interval += 1; // Slow down as requested
144
+ continue;
145
+ }
146
+ throw new Error(`Token exchange failed: ${error.error} - ${error.error_description ?? ''}`);
147
+ }
148
+ throw new Error('Device authorization timed out');
149
+ }
150
+ /**
151
+ * Refresh an access token using a refresh token.
152
+ */
153
+ export async function refreshAccessToken(serverUrl, refreshToken) {
154
+ const discovery = await fetchDiscovery(serverUrl);
155
+ const response = await fetch(discovery.token_endpoint, {
156
+ method: 'POST',
157
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
158
+ body: new URLSearchParams({
159
+ grant_type: 'refresh_token',
160
+ refresh_token: refreshToken,
161
+ client_id: 'e3-cli',
162
+ }),
163
+ });
164
+ if (!response.ok) {
165
+ const error = await response.json();
166
+ throw new Error(`Token refresh failed: ${error.error} - ${error.error_description ?? ''}`);
167
+ }
168
+ return response.json();
169
+ }
170
+ /**
171
+ * Get a valid access token for a server.
172
+ *
173
+ * If the current token is expired, attempts to refresh it.
174
+ * Throws if not logged in or refresh fails.
175
+ */
176
+ export async function getValidToken(serverUrl) {
177
+ const creds = getCredential(serverUrl);
178
+ if (!creds) {
179
+ throw new Error(`Not logged in to ${serverUrl}. Run: e3 login ${serverUrl}`);
180
+ }
181
+ // Return existing token if not expired
182
+ if (!isExpired(creds.expiresAt)) {
183
+ return creds.accessToken;
184
+ }
185
+ // Attempt to refresh
186
+ try {
187
+ const tokens = await refreshAccessToken(serverUrl, creds.refreshToken);
188
+ const newEntry = {
189
+ accessToken: tokens.access_token,
190
+ refreshToken: tokens.refresh_token,
191
+ expiresAt: new Date(Date.now() + tokens.expires_in * 1000).toISOString(),
192
+ };
193
+ setCredential(serverUrl, newEntry);
194
+ return tokens.access_token;
195
+ }
196
+ catch (err) {
197
+ // Refresh failed, need to re-login
198
+ removeCredential(serverUrl);
199
+ const message = err instanceof Error ? err.message : 'unknown error';
200
+ throw new Error(`Session expired and refresh failed: ${message}. Run: e3 login ${serverUrl}`);
201
+ }
202
+ }
203
+ /**
204
+ * Decode JWT payload without verification (for display purposes only).
205
+ */
206
+ export function decodeJwtPayload(token) {
207
+ const parts = token.split('.');
208
+ if (parts.length !== 3) {
209
+ throw new Error('Invalid JWT format');
210
+ }
211
+ return JSON.parse(Buffer.from(parts[1], 'base64url').toString());
212
+ }
213
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/credentials.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,54 @@
4
4
  */
5
5
  import { parseDatasetPath, parsePackageRef } from '@elaraai/e3-types';
6
6
  export { parseDatasetPath, parsePackageRef };
7
+ /**
8
+ * Repository location - either local filesystem or remote URL.
9
+ */
10
+ export type RepoLocation = {
11
+ type: 'local';
12
+ path: string;
13
+ } | {
14
+ type: 'remote';
15
+ baseUrl: string;
16
+ repo: string;
17
+ token: string;
18
+ };
19
+ /**
20
+ * Parse a repository location argument.
21
+ *
22
+ * Supports:
23
+ * - Local paths: `.`, `./repo`, `/path/to/repo`
24
+ * - Remote URLs: `http://...`, `https://...`
25
+ *
26
+ * For remote URLs, the URL should be the user-facing "shareable" URL,
27
+ * e.g., `https://platform.example.com/repos/my_repo`.
28
+ * The CLI will internally add `/api` when making API calls.
29
+ *
30
+ * For remote locations, this function will load and validate the auth token.
31
+ * If not logged in or token is expired and cannot be refreshed, throws an error.
32
+ *
33
+ * @returns For local: { type: 'local', path: '/absolute/path/to/repo' }
34
+ * For remote: { type: 'remote', baseUrl: 'https://example.com', repo: 'my_repo', token: '...' }
35
+ */
36
+ export declare function parseRepoLocation(arg: string): Promise<RepoLocation>;
37
+ /**
38
+ * Repository location without required token (for sync parsing).
39
+ */
40
+ export type RepoLocationNoToken = {
41
+ type: 'local';
42
+ path: string;
43
+ } | {
44
+ type: 'remote';
45
+ baseUrl: string;
46
+ repo: string;
47
+ };
48
+ /**
49
+ * Parse a repository location (synchronous, no auth).
50
+ *
51
+ * Use this only for operations that don't need authentication (e.g., local repos).
52
+ * For remote repos, use parseRepoLocation() instead.
53
+ */
54
+ export declare function parseRepoLocationSync(arg: string): RepoLocationNoToken;
7
55
  /**
8
56
  * Resolve repository path from CLI argument.
9
57
  * Supports `.` for current directory and relative/absolute paths.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGhF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAKhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAGhD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAItE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqB1E;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CActE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGhF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAKhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAGhD"}
package/dist/src/utils.js CHANGED
@@ -8,8 +8,66 @@
8
8
  import { resolve } from 'path';
9
9
  import { repoGet } from '@elaraai/e3-core';
10
10
  import { parseDatasetPath, parsePackageRef } from '@elaraai/e3-types';
11
+ import { getValidToken } from './credentials.js';
11
12
  // Re-export for convenience
12
13
  export { parseDatasetPath, parsePackageRef };
14
+ /**
15
+ * Parse a repository location argument.
16
+ *
17
+ * Supports:
18
+ * - Local paths: `.`, `./repo`, `/path/to/repo`
19
+ * - Remote URLs: `http://...`, `https://...`
20
+ *
21
+ * For remote URLs, the URL should be the user-facing "shareable" URL,
22
+ * e.g., `https://platform.example.com/repos/my_repo`.
23
+ * The CLI will internally add `/api` when making API calls.
24
+ *
25
+ * For remote locations, this function will load and validate the auth token.
26
+ * If not logged in or token is expired and cannot be refreshed, throws an error.
27
+ *
28
+ * @returns For local: { type: 'local', path: '/absolute/path/to/repo' }
29
+ * For remote: { type: 'remote', baseUrl: 'https://example.com', repo: 'my_repo', token: '...' }
30
+ */
31
+ export async function parseRepoLocation(arg) {
32
+ if (arg.startsWith('https://') || arg.startsWith('http://')) {
33
+ const url = new URL(arg);
34
+ // Extract repo name from path: /repos/{repo}[/...]
35
+ const match = url.pathname.match(/^\/repos\/([^/]+)/);
36
+ if (!match) {
37
+ throw new Error(`Invalid remote URL: expected /repos/{repo} in path, got ${url.pathname}`);
38
+ }
39
+ // Load and validate token
40
+ const token = await getValidToken(url.origin);
41
+ return {
42
+ type: 'remote',
43
+ baseUrl: url.origin,
44
+ repo: match[1],
45
+ token,
46
+ };
47
+ }
48
+ return { type: 'local', path: resolveRepo(arg) };
49
+ }
50
+ /**
51
+ * Parse a repository location (synchronous, no auth).
52
+ *
53
+ * Use this only for operations that don't need authentication (e.g., local repos).
54
+ * For remote repos, use parseRepoLocation() instead.
55
+ */
56
+ export function parseRepoLocationSync(arg) {
57
+ if (arg.startsWith('https://') || arg.startsWith('http://')) {
58
+ const url = new URL(arg);
59
+ const match = url.pathname.match(/^\/repos\/([^/]+)/);
60
+ if (!match) {
61
+ throw new Error(`Invalid remote URL: expected /repos/{repo} in path, got ${url.pathname}`);
62
+ }
63
+ return {
64
+ type: 'remote',
65
+ baseUrl: url.origin,
66
+ repo: match[1],
67
+ };
68
+ }
69
+ return { type: 'local', path: resolveRepo(arg) };
70
+ }
13
71
  /**
14
72
  * Resolve repository path from CLI argument.
15
73
  * Supports `.` for current directory and relative/absolute paths.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtE,4BAA4B;AAC5B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,4BAA4B;AAC5B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAS7C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,mDAAmD;QACnD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,2DAA2D,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE9C,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,KAAK;SACN,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACnD,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,2DAA2D,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;SACf,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elaraai/e3-cli",
3
- "version": "0.0.2-beta.11",
3
+ "version": "0.0.2-beta.13",
4
4
  "type": "module",
5
5
  "description": "East Execution Engine CLI - Command-line tool for managing e3 repositories and tasks",
6
6
  "main": "dist/src/index.js",
@@ -34,14 +34,15 @@
34
34
  "directory": "packages/e3-cli"
35
35
  },
36
36
  "dependencies": {
37
- "@elaraai/e3": "^0.0.2-beta.11",
38
- "@elaraai/e3-core": "^0.0.2-beta.11",
39
- "@elaraai/e3-types": "^0.0.2-beta.11",
37
+ "@elaraai/e3": "^0.0.2-beta.13",
38
+ "@elaraai/e3-api-client": "^",
39
+ "@elaraai/e3-core": "^0.0.2-beta.13",
40
+ "@elaraai/e3-types": "^0.0.2-beta.13",
40
41
  "commander": "^12.0.0",
41
- "esbuild": "^0.24.0"
42
+ "esbuild": "^0.27.2"
42
43
  },
43
44
  "peerDependencies": {
44
- "@elaraai/east": "^0.0.1-beta.27"
45
+ "@elaraai/east": "^0.0.1-beta.29"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@types/node": "^22.0.0",
@@ -1,12 +0,0 @@
1
- /**
2
- * Copyright (c) 2025 Elara AI Pty Ltd
3
- * Licensed under BSL 1.1. See LICENSE for details.
4
- */
5
- /**
6
- * Run garbage collection.
7
- */
8
- export declare function gcCommand(repoArg: string, options: {
9
- dryRun?: boolean;
10
- minAge?: string;
11
- }): Promise<void>;
12
- //# sourceMappingURL=gc.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../../../src/commands/gc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -1,44 +0,0 @@
1
- /**
2
- * Copyright (c) 2025 Elara AI Pty Ltd
3
- * Licensed under BSL 1.1. See LICENSE for details.
4
- */
5
- /**
6
- * e3 gc command - Garbage collection
7
- *
8
- * Usage:
9
- * e3 gc .
10
- * e3 gc . --dry-run
11
- */
12
- import { repoGc } from '@elaraai/e3-core';
13
- import { resolveRepo, formatError, exitError } from '../utils.js';
14
- /**
15
- * Run garbage collection.
16
- */
17
- export async function gcCommand(repoArg, options) {
18
- try {
19
- const repoPath = resolveRepo(repoArg);
20
- const minAge = options.minAge ? parseInt(options.minAge, 10) : 60000;
21
- if (options.dryRun) {
22
- console.log('Dry run - no files will be deleted');
23
- }
24
- console.log(`Minimum age: ${minAge}ms`);
25
- console.log('');
26
- const result = await repoGc(repoPath, {
27
- dryRun: options.dryRun,
28
- minAge,
29
- });
30
- console.log('Garbage collection complete:');
31
- console.log(` Objects retained: ${result.retainedObjects}`);
32
- console.log(` Objects deleted: ${result.deletedObjects}`);
33
- console.log(` Partials deleted: ${result.deletedPartials}`);
34
- console.log(` Skipped (young): ${result.skippedYoung}`);
35
- if (result.bytesFreed > 0) {
36
- const mb = (result.bytesFreed / 1024 / 1024).toFixed(2);
37
- console.log(` Space reclaimed: ${mb} MB`);
38
- }
39
- }
40
- catch (err) {
41
- exitError(formatError(err));
42
- }
43
- }
44
- //# sourceMappingURL=gc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gc.js","sourceRoot":"","sources":["../../../src/commands/gc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,OAA8C;IAE9C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAErE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM;SACP,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAE1D,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Copyright (c) 2025 Elara AI Pty Ltd
3
- * Licensed under BSL 1.1. See LICENSE for details.
4
- */
5
- /**
6
- * Initialize a new e3 repository.
7
- */
8
- export declare function initCommand(repoArg: string): void;
9
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBjD"}
@@ -1,33 +0,0 @@
1
- /**
2
- * Copyright (c) 2025 Elara AI Pty Ltd
3
- * Licensed under BSL 1.1. See LICENSE for details.
4
- */
5
- /**
6
- * e3 init command - Initialize a new e3 repository
7
- */
8
- import { resolve } from 'path';
9
- import { repoInit } from '@elaraai/e3-core';
10
- import { formatError, exitError } from '../utils.js';
11
- /**
12
- * Initialize a new e3 repository.
13
- */
14
- export function initCommand(repoArg) {
15
- const absolutePath = resolve(repoArg);
16
- const result = repoInit(absolutePath);
17
- if (!result.success) {
18
- if (result.alreadyExists) {
19
- exitError(`e3 repository already exists at ${result.e3Dir}`);
20
- }
21
- else {
22
- exitError(`Failed to create repository: ${formatError(result.error)}`);
23
- }
24
- }
25
- console.log(`Initialized e3 repository at ${result.e3Dir}`);
26
- console.log('');
27
- console.log('Created:');
28
- console.log(' objects/ Content-addressable storage');
29
- console.log(' packages/ Package references');
30
- console.log(' workspaces/ Workspace state');
31
- console.log(' executions/ Task execution cache');
32
- }
33
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,SAAS,CAAC,mCAAmC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,gCAAgC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AACtD,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Copyright (c) 2025 Elara AI Pty Ltd
3
- * Licensed under BSL 1.1. See LICENSE for details.
4
- */
5
- /**
6
- * Show repository or workspace status.
7
- */
8
- export declare function statusCommand(repoArg: string, workspace?: string): Promise<void>;
9
- //# sourceMappingURL=status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF"}