@varveai/adit-cli 0.2.1

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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/dist/commands/cloud.d.ts +51 -0
  3. package/dist/commands/cloud.d.ts.map +1 -0
  4. package/dist/commands/cloud.js +430 -0
  5. package/dist/commands/cloud.js.map +1 -0
  6. package/dist/commands/config.d.ts +8 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +30 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/db.d.ts +17 -0
  11. package/dist/commands/db.d.ts.map +1 -0
  12. package/dist/commands/db.js +48 -0
  13. package/dist/commands/db.js.map +1 -0
  14. package/dist/commands/diff.d.ts +30 -0
  15. package/dist/commands/diff.d.ts.map +1 -0
  16. package/dist/commands/diff.js +265 -0
  17. package/dist/commands/diff.js.map +1 -0
  18. package/dist/commands/doctor.d.ts +15 -0
  19. package/dist/commands/doctor.d.ts.map +1 -0
  20. package/dist/commands/doctor.js +265 -0
  21. package/dist/commands/doctor.js.map +1 -0
  22. package/dist/commands/export.d.ts +24 -0
  23. package/dist/commands/export.d.ts.map +1 -0
  24. package/dist/commands/export.js +219 -0
  25. package/dist/commands/export.js.map +1 -0
  26. package/dist/commands/init.d.ts +12 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +137 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/list.d.ts +20 -0
  31. package/dist/commands/list.d.ts.map +1 -0
  32. package/dist/commands/list.js +110 -0
  33. package/dist/commands/list.js.map +1 -0
  34. package/dist/commands/perf.d.ts +19 -0
  35. package/dist/commands/perf.d.ts.map +1 -0
  36. package/dist/commands/perf.js +102 -0
  37. package/dist/commands/perf.js.map +1 -0
  38. package/dist/commands/plugin.d.ts +28 -0
  39. package/dist/commands/plugin.d.ts.map +1 -0
  40. package/dist/commands/plugin.js +516 -0
  41. package/dist/commands/plugin.js.map +1 -0
  42. package/dist/commands/project-link.d.ts +16 -0
  43. package/dist/commands/project-link.d.ts.map +1 -0
  44. package/dist/commands/project-link.js +143 -0
  45. package/dist/commands/project-link.js.map +1 -0
  46. package/dist/commands/resume.d.ts +28 -0
  47. package/dist/commands/resume.d.ts.map +1 -0
  48. package/dist/commands/resume.js +229 -0
  49. package/dist/commands/resume.js.map +1 -0
  50. package/dist/commands/revert.d.ts +30 -0
  51. package/dist/commands/revert.d.ts.map +1 -0
  52. package/dist/commands/revert.js +271 -0
  53. package/dist/commands/revert.js.map +1 -0
  54. package/dist/commands/search.d.ts +16 -0
  55. package/dist/commands/search.d.ts.map +1 -0
  56. package/dist/commands/search.js +72 -0
  57. package/dist/commands/search.js.map +1 -0
  58. package/dist/commands/self-update.d.ts +12 -0
  59. package/dist/commands/self-update.d.ts.map +1 -0
  60. package/dist/commands/self-update.js +161 -0
  61. package/dist/commands/self-update.js.map +1 -0
  62. package/dist/commands/show.d.ts +5 -0
  63. package/dist/commands/show.d.ts.map +1 -0
  64. package/dist/commands/show.js +86 -0
  65. package/dist/commands/show.js.map +1 -0
  66. package/dist/commands/status.d.ts +11 -0
  67. package/dist/commands/status.d.ts.map +1 -0
  68. package/dist/commands/status.js +237 -0
  69. package/dist/commands/status.js.map +1 -0
  70. package/dist/commands/task.d.ts +18 -0
  71. package/dist/commands/task.d.ts.map +1 -0
  72. package/dist/commands/task.js +131 -0
  73. package/dist/commands/task.js.map +1 -0
  74. package/dist/commands/transcript.d.ts +40 -0
  75. package/dist/commands/transcript.d.ts.map +1 -0
  76. package/dist/commands/transcript.js +275 -0
  77. package/dist/commands/transcript.js.map +1 -0
  78. package/dist/index.d.ts +9 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +385 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/tui/App.d.ts +8 -0
  83. package/dist/tui/App.d.ts.map +1 -0
  84. package/dist/tui/App.js +132 -0
  85. package/dist/tui/App.js.map +1 -0
  86. package/dist/tui/components/DiffView.d.ts +11 -0
  87. package/dist/tui/components/DiffView.d.ts.map +1 -0
  88. package/dist/tui/components/DiffView.js +29 -0
  89. package/dist/tui/components/DiffView.js.map +1 -0
  90. package/dist/tui/components/EventDetail.d.ts +11 -0
  91. package/dist/tui/components/EventDetail.d.ts.map +1 -0
  92. package/dist/tui/components/EventDetail.js +36 -0
  93. package/dist/tui/components/EventDetail.js.map +1 -0
  94. package/dist/tui/components/EventList.d.ts +15 -0
  95. package/dist/tui/components/EventList.d.ts.map +1 -0
  96. package/dist/tui/components/EventList.js +77 -0
  97. package/dist/tui/components/EventList.js.map +1 -0
  98. package/dist/tui/components/FilterBar.d.ts +12 -0
  99. package/dist/tui/components/FilterBar.d.ts.map +1 -0
  100. package/dist/tui/components/FilterBar.js +20 -0
  101. package/dist/tui/components/FilterBar.js.map +1 -0
  102. package/dist/tui/components/StatusBar.d.ts +16 -0
  103. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  104. package/dist/tui/components/StatusBar.js +13 -0
  105. package/dist/tui/components/StatusBar.js.map +1 -0
  106. package/dist/tui/hooks/useKeyboard.d.ts +22 -0
  107. package/dist/tui/hooks/useKeyboard.d.ts.map +1 -0
  108. package/dist/tui/hooks/useKeyboard.js +64 -0
  109. package/dist/tui/hooks/useKeyboard.js.map +1 -0
  110. package/dist/tui/hooks/useTimeline.d.ts +31 -0
  111. package/dist/tui/hooks/useTimeline.d.ts.map +1 -0
  112. package/dist/tui/hooks/useTimeline.js +136 -0
  113. package/dist/tui/hooks/useTimeline.js.map +1 -0
  114. package/dist/tui/index.d.ts +5 -0
  115. package/dist/tui/index.d.ts.map +1 -0
  116. package/dist/tui/index.js +10 -0
  117. package/dist/tui/index.js.map +1 -0
  118. package/dist/tui/screens/DiffScreen.d.ts +12 -0
  119. package/dist/tui/screens/DiffScreen.d.ts.map +1 -0
  120. package/dist/tui/screens/DiffScreen.js +25 -0
  121. package/dist/tui/screens/DiffScreen.js.map +1 -0
  122. package/dist/tui/screens/EnvScreen.d.ts +11 -0
  123. package/dist/tui/screens/EnvScreen.d.ts.map +1 -0
  124. package/dist/tui/screens/EnvScreen.js +25 -0
  125. package/dist/tui/screens/EnvScreen.js.map +1 -0
  126. package/dist/tui/screens/SearchScreen.d.ts +13 -0
  127. package/dist/tui/screens/SearchScreen.d.ts.map +1 -0
  128. package/dist/tui/screens/SearchScreen.js +56 -0
  129. package/dist/tui/screens/SearchScreen.js.map +1 -0
  130. package/dist/tui/screens/TimelineScreen.d.ts +19 -0
  131. package/dist/tui/screens/TimelineScreen.d.ts.map +1 -0
  132. package/dist/tui/screens/TimelineScreen.js +10 -0
  133. package/dist/tui/screens/TimelineScreen.js.map +1 -0
  134. package/dist/utils/format.d.ts +23 -0
  135. package/dist/utils/format.d.ts.map +1 -0
  136. package/dist/utils/format.js +65 -0
  137. package/dist/utils/format.js.map +1 -0
  138. package/dist/utils/summary.d.ts +26 -0
  139. package/dist/utils/summary.d.ts.map +1 -0
  140. package/dist/utils/summary.js +87 -0
  141. package/dist/utils/summary.js.map +1 -0
  142. package/dist/version.d.ts +8 -0
  143. package/dist/version.d.ts.map +1 -0
  144. package/dist/version.js +11 -0
  145. package/dist/version.js.map +1 -0
  146. package/package.json +48 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 vkenliu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,51 @@
1
+ /**
2
+ * `adit cloud` — Cloud sync commands.
3
+ *
4
+ * Subcommands:
5
+ * login — Authenticate via device code flow
6
+ * logout — Clear stored credentials
7
+ * sync — Push unsynced records to cloud
8
+ * status — Show sync state and unsynced count
9
+ * reset-credentials — Force-clear all credentials and sync state
10
+ */
11
+ /**
12
+ * `adit cloud login` — Interactive device authorization flow.
13
+ */
14
+ export declare function cloudLoginCommand(opts?: {
15
+ server?: string;
16
+ }): Promise<void>;
17
+ /**
18
+ * `adit cloud logout` — Clear stored credentials.
19
+ */
20
+ export declare function cloudLogoutCommand(): Promise<void>;
21
+ /**
22
+ * `adit cloud sync` — Push unsynced records to cloud.
23
+ */
24
+ export declare function cloudSyncCommand(opts?: {
25
+ json?: boolean;
26
+ }): Promise<void>;
27
+ /**
28
+ * `adit cloud status` — Show sync state and unsynced record count.
29
+ */
30
+ export declare function cloudStatusCommand(opts?: {
31
+ json?: boolean;
32
+ }): Promise<void>;
33
+ /**
34
+ * `adit cloud auth-token <token>` — Authenticate with a static JWT token.
35
+ *
36
+ * Server URL: ADIT_CLOUD_URL env > DEFAULT_SERVER_URL.
37
+ * If device-code (login) credentials already exist, rejects —
38
+ * login credentials take priority.
39
+ */
40
+ export declare function cloudAuthTokenCommand(token: string): Promise<void>;
41
+ /**
42
+ * `adit cloud reset-credentials` — Force-clear all credentials and sync state.
43
+ *
44
+ * Unlike logout, this does not attempt to revoke the token on the server.
45
+ * It simply wipes all local credential and sync state, allowing the client
46
+ * to connect to any cloud server again.
47
+ */
48
+ export declare function cloudResetCredentialsCommand(opts?: {
49
+ yes?: boolean;
50
+ }): Promise<void>;
51
+ //# sourceMappingURL=cloud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0BH;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFhB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCxD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEhB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,CAAC,EAAE;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6LhB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DxE;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,IAAI,CAAC,EAAE;IACxD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChB"}
@@ -0,0 +1,430 @@
1
+ /**
2
+ * `adit cloud` — Cloud sync commands.
3
+ *
4
+ * Subcommands:
5
+ * login — Authenticate via device code flow
6
+ * logout — Clear stored credentials
7
+ * sync — Push unsynced records to cloud
8
+ * status — Show sync state and unsynced count
9
+ * reset-credentials — Force-clear all credentials and sync state
10
+ */
11
+ import { loadConfig, openDatabase, closeDatabase } from "@varveai/adit-core";
12
+ import { loadCloudConfig, loadCredentials, saveCredentials, clearCredentials, isTokenExpired, requestDeviceCode, pollForToken, CloudClient, SyncEngine, countUnsyncedRecords, CloudAuthError, CloudNetworkError, CloudApiError, clearSyncErrors, isSyncDisabled, DEFAULT_SERVER_URL, } from "@varveai/adit-cloud";
13
+ import { createHash } from "node:crypto";
14
+ import { hostname } from "node:os";
15
+ import { CLI_VERSION } from "../version.js";
16
+ /**
17
+ * `adit cloud login` — Interactive device authorization flow.
18
+ */
19
+ export async function cloudLoginCommand(opts) {
20
+ const serverUrl = opts?.server ?? process.env.ADIT_CLOUD_URL ?? DEFAULT_SERVER_URL;
21
+ const config = loadConfig();
22
+ // Single-server binding: reject login if already bound to a different server
23
+ const existingCredentials = loadCredentials();
24
+ if (existingCredentials && existingCredentials.serverUrl !== serverUrl) {
25
+ console.error(`Already authenticated with ${existingCredentials.serverUrl}.`);
26
+ console.error("A client can only be connected to one cloud server at a time.");
27
+ console.error("Run 'adit cloud reset-credentials' first to disconnect, then try again.");
28
+ process.exitCode = 1;
29
+ return;
30
+ }
31
+ console.log(`Connecting to ${serverUrl}...`);
32
+ console.log();
33
+ // Build machine identifier (deterministic per-machine)
34
+ const machineId = createHash("sha256")
35
+ .update(`${hostname()}-${config.clientId}`)
36
+ .digest("hex")
37
+ .substring(0, 32);
38
+ const authOptions = {
39
+ machineId,
40
+ platform: `${process.platform}-${process.arch}`,
41
+ aditVersion: CLI_VERSION,
42
+ displayName: hostname(),
43
+ };
44
+ try {
45
+ // Step 1: Request device code
46
+ const deviceCode = await requestDeviceCode(serverUrl, authOptions);
47
+ console.log("To authenticate, open this URL in your browser:");
48
+ console.log(` ${deviceCode.verificationUrl}`);
49
+ console.log();
50
+ console.log(`Then enter this code: ${deviceCode.userCode}`);
51
+ console.log();
52
+ console.log("Waiting for approval... (press Ctrl+C to cancel)");
53
+ // Step 2: Poll for approval
54
+ const tokenResponse = await pollForToken(serverUrl, deviceCode.deviceCode);
55
+ // Step 3: Save credentials
56
+ const expiresAt = new Date(Date.now() + 60 * 60 * 1000).toISOString();
57
+ saveCredentials({
58
+ accessToken: tokenResponse.accessToken,
59
+ refreshToken: tokenResponse.refreshToken,
60
+ clientId: tokenResponse.clientId,
61
+ expiresAt: tokenResponse.expiresAt ?? expiresAt,
62
+ serverUrl,
63
+ });
64
+ // Reset any error state from previous sync failures
65
+ clearSyncErrors();
66
+ console.log();
67
+ console.log("Authenticated successfully.");
68
+ console.log(`Client ID: ${tokenResponse.clientId}`);
69
+ console.log("Credentials saved to ~/.adit/cloud-credentials.json");
70
+ }
71
+ catch (error) {
72
+ if (error instanceof CloudApiError) {
73
+ console.error(`Login failed: ${error.message}`);
74
+ }
75
+ else if (error instanceof CloudNetworkError) {
76
+ console.error(`Cannot reach ${serverUrl}: ${error.message}`);
77
+ }
78
+ else {
79
+ console.error(`Login failed: ${error instanceof Error ? error.message : String(error)}`);
80
+ }
81
+ process.exitCode = 1;
82
+ }
83
+ }
84
+ /**
85
+ * `adit cloud logout` — Clear stored credentials.
86
+ */
87
+ export async function cloudLogoutCommand() {
88
+ const credentials = loadCredentials();
89
+ if (!credentials) {
90
+ console.log("Not logged in to any cloud server.");
91
+ return;
92
+ }
93
+ // Try to revoke the refresh token on the server
94
+ try {
95
+ const client = new CloudClient(credentials.serverUrl, credentials);
96
+ await client.post("/api/auth/token/revoke", {
97
+ refreshToken: credentials.refreshToken,
98
+ });
99
+ }
100
+ catch {
101
+ // Best-effort revocation — don't block logout on network errors
102
+ }
103
+ // Clear local sync state
104
+ const config = loadConfig();
105
+ try {
106
+ const db = openDatabase(config.dbPath);
107
+ try {
108
+ const { clearSyncState } = await import("@varveai/adit-core");
109
+ clearSyncState(db, credentials.serverUrl);
110
+ }
111
+ finally {
112
+ closeDatabase(db);
113
+ }
114
+ }
115
+ catch {
116
+ // Database may not exist
117
+ }
118
+ clearCredentials();
119
+ console.log("Logged out. Credentials cleared.");
120
+ }
121
+ /**
122
+ * `adit cloud sync` — Push unsynced records to cloud.
123
+ */
124
+ export async function cloudSyncCommand(opts) {
125
+ const cloudConfig = loadCloudConfig();
126
+ const credentials = loadCredentials();
127
+ if (!credentials) {
128
+ const msg = "Not logged in. Run 'adit cloud login' or 'adit cloud auth-token <jwt>' first.";
129
+ if (opts?.json) {
130
+ console.log(JSON.stringify({ error: msg }));
131
+ }
132
+ else {
133
+ console.error(msg);
134
+ }
135
+ process.exitCode = 1;
136
+ return;
137
+ }
138
+ // Re-enable sync if circuit breaker was tripped (manual sync = user intent)
139
+ if (isSyncDisabled()) {
140
+ clearSyncErrors();
141
+ }
142
+ const serverUrl = cloudConfig.serverUrl ?? credentials.serverUrl;
143
+ const config = loadConfig();
144
+ if (!opts?.json) {
145
+ console.log(`Syncing with ${serverUrl}...`);
146
+ }
147
+ const db = openDatabase(config.dbPath);
148
+ try {
149
+ const client = new CloudClient(serverUrl, credentials);
150
+ const engine = new SyncEngine(db, client, {
151
+ projectId: config.projectId,
152
+ batchSize: cloudConfig.batchSize,
153
+ serverUrl,
154
+ cloudClientId: credentials.clientId,
155
+ });
156
+ const result = await engine.sync();
157
+ if (opts?.json) {
158
+ console.log(JSON.stringify(result, null, 2));
159
+ }
160
+ else {
161
+ if (result.batches === 0) {
162
+ console.log("Already up to date. No records to sync.");
163
+ }
164
+ else {
165
+ console.log(`Sync complete: ${result.accepted} accepted, ${result.duplicates} duplicates, ${result.conflicts.length} conflicts (${result.batches} batch${result.batches !== 1 ? "es" : ""})`);
166
+ }
167
+ }
168
+ }
169
+ catch (error) {
170
+ const msg = error instanceof CloudAuthError
171
+ ? `Authentication failed: ${error.message}. Run 'adit cloud login' to re-authenticate.`
172
+ : error instanceof CloudNetworkError
173
+ ? `Network error: ${error.message}`
174
+ : `Sync failed: ${error instanceof Error ? error.message : String(error)}`;
175
+ if (opts?.json) {
176
+ console.log(JSON.stringify({ error: msg }));
177
+ }
178
+ else {
179
+ console.error(msg);
180
+ }
181
+ process.exitCode = 1;
182
+ }
183
+ finally {
184
+ closeDatabase(db);
185
+ }
186
+ }
187
+ /**
188
+ * `adit cloud status` — Show sync state and unsynced record count.
189
+ */
190
+ export async function cloudStatusCommand(opts) {
191
+ const cloudConfig = loadCloudConfig();
192
+ const credentials = loadCredentials();
193
+ const config = loadConfig();
194
+ // Reset circuit breaker on manual status check
195
+ clearSyncErrors();
196
+ const status = {
197
+ serverUrl: cloudConfig.serverUrl,
198
+ enabled: cloudConfig.enabled,
199
+ autoSync: cloudConfig.autoSync,
200
+ loggedIn: credentials !== null,
201
+ };
202
+ if (credentials) {
203
+ status.authType = credentials.authType ?? "device";
204
+ status.clientId = credentials.clientId;
205
+ status.tokenExpired = isTokenExpired(credentials);
206
+ }
207
+ // Check server reachability
208
+ const serverUrl = cloudConfig.serverUrl ?? credentials?.serverUrl;
209
+ if (serverUrl && credentials) {
210
+ try {
211
+ const client = new CloudClient(serverUrl, credentials);
212
+ const params = new URLSearchParams();
213
+ if (config.projectId)
214
+ params.set("projectId", config.projectId);
215
+ const statusPath = params.toString()
216
+ ? `/api/sync/status?${params.toString()}`
217
+ : "/api/sync/status";
218
+ const remoteStatus = await client.get(statusPath);
219
+ status.serverOnline = true;
220
+ status.remoteStatus = remoteStatus;
221
+ }
222
+ catch (error) {
223
+ status.serverOnline = false;
224
+ status.serverError =
225
+ error instanceof CloudNetworkError
226
+ ? `unreachable — ${error.cause?.message ?? error.message}`
227
+ : error instanceof CloudAuthError
228
+ ? `auth failed — ${error.message}`
229
+ : error instanceof CloudApiError
230
+ ? `server error — ${error.status} ${error.message}`
231
+ : `error — ${error instanceof Error ? error.message : String(error)}`;
232
+ }
233
+ }
234
+ // Count unsynced records
235
+ try {
236
+ const db = openDatabase(config.dbPath);
237
+ try {
238
+ const { getSyncState } = await import("@varveai/adit-core");
239
+ const syncState = getSyncState(db, cloudConfig.serverUrl ?? credentials?.serverUrl ?? "");
240
+ status.syncState = syncState
241
+ ? {
242
+ lastSyncedEventId: syncState.lastSyncedEventId,
243
+ lastSyncedAt: syncState.lastSyncedAt,
244
+ syncVersion: syncState.syncVersion,
245
+ }
246
+ : null;
247
+ const unsyncedCount = countUnsyncedRecords(db, syncState?.lastSyncedEventId ?? null, syncState?.lastSyncedAt ?? null, config.projectId);
248
+ status.unsyncedRecords = unsyncedCount;
249
+ }
250
+ finally {
251
+ closeDatabase(db);
252
+ }
253
+ }
254
+ catch {
255
+ status.unsyncedRecords = "unknown";
256
+ }
257
+ if (opts?.json) {
258
+ console.log(JSON.stringify(status, null, 2));
259
+ return;
260
+ }
261
+ console.log("Cloud Sync Status");
262
+ console.log("==================");
263
+ console.log();
264
+ const effectiveServerUrl = cloudConfig.serverUrl ?? credentials?.serverUrl ?? null;
265
+ console.log(`Server: ${effectiveServerUrl ?? "(not configured)"}`);
266
+ console.log(`Enabled: ${cloudConfig.enabled ? "yes" : "no"}`);
267
+ console.log(`Auto-sync: ${cloudConfig.autoSync ? "yes" : "no"}`);
268
+ console.log(`Logged in: ${credentials ? "yes" : "no"}`);
269
+ if (credentials) {
270
+ const authType = credentials.authType ?? "device";
271
+ console.log(`Auth type: ${authType}`);
272
+ console.log(`Client ID: ${credentials.clientId}`);
273
+ if (authType === "token") {
274
+ console.log("Token: static (never expires)");
275
+ }
276
+ else {
277
+ console.log(`Token: ${isTokenExpired(credentials) ? "expired" : "valid"}`);
278
+ }
279
+ }
280
+ // Server reachability
281
+ if (status.serverOnline === true) {
282
+ console.log(`Server: \x1b[32monline\x1b[0m`);
283
+ }
284
+ else if (status.serverOnline === false) {
285
+ console.log(`Server: \x1b[31moffline\x1b[0m (${status.serverError})`);
286
+ }
287
+ const syncState = status.syncState;
288
+ if (syncState) {
289
+ console.log(`Last sync: ${syncState.lastSyncedAt ?? "never"}`);
290
+ console.log(`Cursor: ${syncState.lastSyncedEventId ?? "none"}`);
291
+ console.log(`Sync version: ${syncState.syncVersion}`);
292
+ }
293
+ else {
294
+ console.log("Last sync: never");
295
+ }
296
+ // Show remote cursor comparison when server is online
297
+ const remoteStatus = status.remoteStatus;
298
+ if (remoteStatus) {
299
+ const localCursor = syncState?.lastSyncedEventId ?? null;
300
+ // Prefer per-project cursor when available
301
+ const projectEntry = config.projectId
302
+ ? remoteStatus.projectCursors?.[config.projectId]
303
+ : undefined;
304
+ const remoteCursor = projectEntry !== undefined
305
+ ? projectEntry.lastSyncedEventId
306
+ : remoteStatus.lastSyncedEventId;
307
+ const cursorSource = projectEntry !== undefined ? "project" : "global";
308
+ if (localCursor !== remoteCursor) {
309
+ console.log(`Remote cursor: ${remoteCursor ?? "none"} (${cursorSource}, differs from local)`);
310
+ }
311
+ if (projectEntry !== undefined) {
312
+ console.log(`Project: ${config.projectId}`);
313
+ }
314
+ }
315
+ console.log(`Unsynced: ${status.unsyncedRecords} records`);
316
+ // Actionable hints
317
+ if (status.serverOnline === false) {
318
+ console.log();
319
+ console.log("The cloud server is not reachable. Auto-sync will resume when the server is back online.");
320
+ console.log("To retry manually: adit cloud sync");
321
+ }
322
+ else if (status.serverOnline === true &&
323
+ typeof status.unsyncedRecords === "number" &&
324
+ status.unsyncedRecords > 0) {
325
+ console.log();
326
+ console.log(`${status.unsyncedRecords} records pending. Run 'adit cloud sync' to push now.`);
327
+ }
328
+ }
329
+ /**
330
+ * `adit cloud auth-token <token>` — Authenticate with a static JWT token.
331
+ *
332
+ * Server URL: ADIT_CLOUD_URL env > DEFAULT_SERVER_URL.
333
+ * If device-code (login) credentials already exist, rejects —
334
+ * login credentials take priority.
335
+ */
336
+ export async function cloudAuthTokenCommand(token) {
337
+ const serverUrl = process.env.ADIT_CLOUD_URL ?? DEFAULT_SERVER_URL;
338
+ const config = loadConfig();
339
+ // If device (login) credentials already exist, warn but allow override
340
+ const existingCredentials = loadCredentials();
341
+ if (existingCredentials && existingCredentials.authType !== "token") {
342
+ console.log("Replacing existing login credentials with static token.");
343
+ }
344
+ // Save credentials with local clientId initially
345
+ const credentials = {
346
+ authType: "token",
347
+ accessToken: token,
348
+ refreshToken: "",
349
+ clientId: config.clientId,
350
+ expiresAt: "",
351
+ serverUrl,
352
+ };
353
+ saveCredentials(credentials);
354
+ // Verify token against the server and retrieve server-assigned clientId
355
+ try {
356
+ const client = new CloudClient(serverUrl, credentials);
357
+ const status = await client.get("/api/sync/status");
358
+ if (status.clientId && status.clientId !== config.clientId) {
359
+ // Update with server-assigned clientId
360
+ saveCredentials({ ...credentials, clientId: status.clientId });
361
+ console.log("Token verified successfully.");
362
+ console.log(`Server: ${serverUrl}`);
363
+ console.log(`Client ID: ${status.clientId} (server-assigned)`);
364
+ }
365
+ else {
366
+ console.log("Token verified successfully.");
367
+ console.log(`Server: ${serverUrl}`);
368
+ console.log(`Client ID: ${config.clientId}`);
369
+ }
370
+ }
371
+ catch (error) {
372
+ // Token saved but verification failed — still usable, warn user
373
+ if (error instanceof CloudAuthError) {
374
+ console.warn(`Warning: Token verification failed (${error.message}). The token may be invalid.`);
375
+ }
376
+ else if (error instanceof CloudNetworkError) {
377
+ console.warn(`Warning: Could not reach ${serverUrl} to verify token. Token saved anyway.`);
378
+ }
379
+ else {
380
+ console.warn(`Warning: Token verification failed. Token saved anyway.`);
381
+ }
382
+ console.log(`Server: ${serverUrl}`);
383
+ console.log(`Client ID: ${config.clientId}`);
384
+ }
385
+ // Reset any error state from previous sync failures
386
+ clearSyncErrors();
387
+ console.log("Credentials saved to ~/.adit/cloud-credentials.json");
388
+ }
389
+ /**
390
+ * `adit cloud reset-credentials` — Force-clear all credentials and sync state.
391
+ *
392
+ * Unlike logout, this does not attempt to revoke the token on the server.
393
+ * It simply wipes all local credential and sync state, allowing the client
394
+ * to connect to any cloud server again.
395
+ */
396
+ export async function cloudResetCredentialsCommand(opts) {
397
+ const credentials = loadCredentials();
398
+ if (!credentials) {
399
+ console.log("No credentials stored. Nothing to reset.");
400
+ return;
401
+ }
402
+ if (!opts?.yes) {
403
+ console.log(`This will remove all stored credentials for ${credentials.serverUrl}.`);
404
+ console.log("Local sync state will also be cleared.");
405
+ console.log("You will need to run 'adit cloud login' to reconnect to any server.");
406
+ console.log();
407
+ console.log("Run with --yes to confirm.");
408
+ process.exitCode = 1;
409
+ return;
410
+ }
411
+ // Clear local sync state
412
+ const config = loadConfig();
413
+ try {
414
+ const db = openDatabase(config.dbPath);
415
+ try {
416
+ const { clearSyncState } = await import("@varveai/adit-core");
417
+ clearSyncState(db, credentials.serverUrl);
418
+ }
419
+ finally {
420
+ closeDatabase(db);
421
+ }
422
+ }
423
+ catch {
424
+ // Database may not exist yet
425
+ }
426
+ clearCredentials();
427
+ console.log("Credentials and sync state cleared.");
428
+ console.log("You can now connect to any cloud server with 'adit cloud login'.");
429
+ }
430
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `adit config` — View and manage ADIT configuration.
3
+ */
4
+ /** `adit config` — show current config */
5
+ export declare function configCommand(opts?: {
6
+ json?: boolean;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,0CAA0C;AAC1C,wBAAsB,aAAa,CACjC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `adit config` — View and manage ADIT configuration.
3
+ */
4
+ import { loadConfig } from "@varveai/adit-core";
5
+ /** `adit config` — show current config */
6
+ export async function configCommand(opts) {
7
+ const config = loadConfig();
8
+ if (opts?.json) {
9
+ console.log(JSON.stringify(configToPlain(config), null, 2));
10
+ return;
11
+ }
12
+ console.log("ADIT Configuration\n");
13
+ console.log(` Project root: ${config.projectRoot}`);
14
+ console.log(` Data directory: ${config.dataDir}`);
15
+ console.log(` Database: ${config.dbPath}`);
16
+ console.log(` Project ID: ${config.projectId}`);
17
+ console.log(` Client ID: ${config.clientId}`);
18
+ console.log(` Capture env: ${config.captureEnv}`);
19
+ }
20
+ function configToPlain(config) {
21
+ return {
22
+ projectRoot: config.projectRoot,
23
+ dataDir: config.dataDir,
24
+ dbPath: config.dbPath,
25
+ projectId: config.projectId,
26
+ clientId: config.clientId,
27
+ captureEnv: config.captureEnv,
28
+ };
29
+ }
30
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AAEjE,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAyB;IAEzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB;IACvC,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `adit db` — Database management commands.
3
+ *
4
+ * Subcommands:
5
+ * clear-events — Delete all events, sessions, diffs, and env snapshots
6
+ */
7
+ /**
8
+ * `adit db clear-events` — Clear all local events and related data.
9
+ *
10
+ * Deletes events, diffs, env snapshots, sessions, and resets sync cursors
11
+ * for the current project. This is irreversible.
12
+ */
13
+ export declare function dbClearEventsCommand(opts?: {
14
+ yes?: boolean;
15
+ json?: boolean;
16
+ }): Promise<void>;
17
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAChD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqChB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `adit db` — Database management commands.
3
+ *
4
+ * Subcommands:
5
+ * clear-events — Delete all events, sessions, diffs, and env snapshots
6
+ */
7
+ import { loadConfig, openDatabase, closeDatabase, clearEvents, countEvents } from "@varveai/adit-core";
8
+ /**
9
+ * `adit db clear-events` — Clear all local events and related data.
10
+ *
11
+ * Deletes events, diffs, env snapshots, sessions, and resets sync cursors
12
+ * for the current project. This is irreversible.
13
+ */
14
+ export async function dbClearEventsCommand(opts) {
15
+ const config = loadConfig();
16
+ const db = openDatabase(config.dbPath);
17
+ try {
18
+ const eventCount = countEvents(db, config.projectId);
19
+ if (eventCount === 0) {
20
+ if (opts?.json) {
21
+ console.log(JSON.stringify({ deleted: 0, message: "No events to clear." }));
22
+ }
23
+ else {
24
+ console.log("No events to clear.");
25
+ }
26
+ return;
27
+ }
28
+ if (!opts?.yes) {
29
+ console.log(`This will permanently delete ${eventCount} events and all associated data (diffs, sessions, env snapshots).`);
30
+ console.log("Sync cursors will also be reset.");
31
+ console.log();
32
+ console.log("Run with --yes to confirm, or pass --json for scripted use.");
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ const deleted = clearEvents(db, config.projectId);
37
+ if (opts?.json) {
38
+ console.log(JSON.stringify({ deleted, message: "Events cleared." }));
39
+ }
40
+ else {
41
+ console.log(`Cleared ${deleted} events and all associated data.`);
42
+ }
43
+ }
44
+ finally {
45
+ closeDatabase(db);
46
+ }
47
+ }
48
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEvG;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAG1C;IACC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAErD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,gCAAgC,UAAU,mEAAmE,CAC9G,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAElD,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,kCAAkC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}