@nocoo/otter 1.0.1 → 1.0.3

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/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA2cA,eAAO,MAAM,IAAI,qDAef,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA4cA,eAAO,MAAM,IAAI,qDAef,CAAC"}
package/dist/cli.js CHANGED
@@ -6,16 +6,26 @@ import { join } from "node:path";
6
6
  import { createDefaultCollectors } from "./collectors/index.js";
7
7
  import { executeScan } from "./commands/scan.js";
8
8
  import { executeConfig } from "./commands/config.js";
9
- import { executeLogin } from "./commands/login.js";
9
+ import { executeLogin, resolveHost, buildWebhookUrl } from "./commands/login.js";
10
10
  import { formatSnapshotList, formatSnapshotDetail, diffSnapshots, formatSnapshotDiff } from "./commands/snapshot.js";
11
11
  import { ConfigManager } from "./config/manager.js";
12
12
  import { SnapshotStore } from "./storage/local.js";
13
13
  import { uploadSnapshot } from "./uploader/webhook.js";
14
- import { uploadIcons } from "./uploader/icons.js";
14
+ import { uploadIconsToServer } from "./uploader/icons-server.js";
15
15
  import { exportIcons } from "./utils/icons.js";
16
16
  const otterConfigDir = join(homedir(), ".config", "otter");
17
- const configManager = new ConfigManager(otterConfigDir);
18
17
  const snapshotStore = new SnapshotStore(join(otterConfigDir, "snapshots"));
18
+ /**
19
+ * Detect whether --dev is set from process.argv.
20
+ * citty doesn't provide a global args mechanism, so we parse manually.
21
+ */
22
+ function isDevMode() {
23
+ return process.argv.includes("--dev");
24
+ }
25
+ /** Lazily create ConfigManager based on dev flag. */
26
+ function getConfigManager() {
27
+ return new ConfigManager(otterConfigDir, isDevMode());
28
+ }
19
29
  const scanCommand = defineCommand({
20
30
  meta: {
21
31
  name: "scan",
@@ -78,6 +88,11 @@ const backupCommand = defineCommand({
78
88
  description: "Scan, build snapshot, and upload to webhook",
79
89
  },
80
90
  args: {
91
+ dev: {
92
+ type: "boolean",
93
+ description: "Use the dev host (otter.dev.hexly.ai)",
94
+ default: false,
95
+ },
81
96
  slim: {
82
97
  type: "boolean",
83
98
  description: "Exclude behavior data (history.jsonl, session summaries) for a smaller snapshot",
@@ -85,14 +100,17 @@ const backupCommand = defineCommand({
85
100
  },
86
101
  },
87
102
  async run({ args }) {
103
+ const configManager = getConfigManager();
88
104
  const config = await configManager.load();
89
- if (!config.webhookUrl) {
90
- consola.error("No webhook URL configured. Run " +
91
- pc.bold("otter config set webhookUrl <url>") +
105
+ if (!config.token) {
106
+ consola.error("Not logged in. Run " +
107
+ pc.bold("otter login") +
92
108
  " first.");
93
109
  process.exitCode = 1;
94
110
  return;
95
111
  }
112
+ const host = resolveHost({ dev: args.dev });
113
+ const webhookUrl = buildWebhookUrl(host, config.token);
96
114
  consola.start("Scanning your Mac environment...\n");
97
115
  const collectors = createDefaultCollectors(homedir(), {
98
116
  slim: args.slim,
@@ -104,15 +122,40 @@ const backupCommand = defineCommand({
104
122
  },
105
123
  });
106
124
  consola.start("\nUploading snapshot...");
107
- const uploadResult = await uploadSnapshot(snapshot, {
108
- webhookUrl: config.webhookUrl,
109
- });
125
+ const uploadResult = await uploadSnapshot(snapshot, { webhookUrl });
110
126
  if (uploadResult.success) {
111
127
  consola.success(`Backup uploaded successfully ${pc.dim(`(${uploadResult.durationMs}ms)`)}`);
112
128
  // Auto-save locally after successful upload
113
129
  const filename = await snapshotStore.save(snapshot);
114
130
  consola.success(`Snapshot saved locally: ${pc.dim(filename)}`);
115
131
  consola.info(`Snapshot ID: ${pc.dim(snapshot.id)}`);
132
+ // Export and upload app icons via server endpoint
133
+ consola.start("\nExporting app icons...");
134
+ const iconDir = join(otterConfigDir, "icons");
135
+ const iconResults = await exportIcons({ outputDir: iconDir, size: 128 });
136
+ const exported = iconResults.filter((r) => r.success && r.outputPath);
137
+ if (exported.length > 0) {
138
+ consola.success(`Exported ${pc.bold(String(exported.length))} icons`);
139
+ const iconsUrl = `${webhookUrl}/icons`;
140
+ const icons = exported.map((r) => ({
141
+ appName: r.appName,
142
+ pngPath: r.outputPath,
143
+ }));
144
+ consola.start("Uploading icons to server...");
145
+ const iconUpload = await uploadIconsToServer(icons, { iconsUrl });
146
+ if (iconUpload.success) {
147
+ consola.success(`Icons uploaded: ${pc.bold(String(iconUpload.stored))} stored ${pc.dim(`(${iconUpload.durationMs}ms)`)}`);
148
+ }
149
+ else {
150
+ consola.warn(`Icon upload issue: ${iconUpload.error ?? "partial failure"}` +
151
+ (iconUpload.stored > 0
152
+ ? ` (${iconUpload.stored}/${iconUpload.total} stored)`
153
+ : ""));
154
+ }
155
+ }
156
+ else {
157
+ consola.info("No app icons found to upload");
158
+ }
116
159
  }
117
160
  else {
118
161
  consola.error(`Upload failed: ${uploadResult.error}`);
@@ -133,7 +176,7 @@ const configCommand = defineCommand({
133
176
  },
134
177
  key: {
135
178
  type: "positional",
136
- description: "Config key (e.g., webhookUrl)",
179
+ description: "Config key (e.g., token)",
137
180
  required: false,
138
181
  },
139
182
  value: {
@@ -143,6 +186,7 @@ const configCommand = defineCommand({
143
186
  },
144
187
  },
145
188
  async run({ args }) {
189
+ const configManager = getConfigManager();
146
190
  const action = args.action || "show";
147
191
  if (action === "show") {
148
192
  const result = await executeConfig(configManager, { action: "show" });
@@ -282,12 +326,6 @@ const exportIconsCommand = defineCommand({
282
326
  alias: "s",
283
327
  required: false,
284
328
  },
285
- upload: {
286
- type: "boolean",
287
- description: "Upload icons to R2 after export",
288
- alias: "u",
289
- required: false,
290
- },
291
329
  },
292
330
  async run({ args }) {
293
331
  const outputDir = args.output || join(homedir(), ".otter", "icons");
@@ -310,43 +348,6 @@ const exportIconsCommand = defineCommand({
310
348
  consola.success(`\nExported ${pc.bold(String(succeeded))} icons` +
311
349
  (failed > 0 ? ` (${pc.yellow(String(failed))} skipped)` : ""));
312
350
  consola.info(`Output: ${pc.dim(outputDir)}`);
313
- // Upload to R2 if requested
314
- if (args.upload) {
315
- const config = await configManager.load();
316
- const r2Endpoint = config.iconR2Endpoint;
317
- const r2AccessKeyId = config.iconR2AccessKeyId;
318
- const r2SecretAccessKey = config.iconR2SecretAccessKey;
319
- const r2Bucket = config.iconR2Bucket;
320
- const r2PublicDomain = config.iconR2PublicDomain;
321
- if (!r2Endpoint || !r2AccessKeyId || !r2SecretAccessKey || !r2Bucket || !r2PublicDomain) {
322
- consola.error("R2 icon upload config not set. Run:\n" +
323
- ` otter config set iconR2Endpoint <endpoint>\n` +
324
- ` otter config set iconR2AccessKeyId <key>\n` +
325
- ` otter config set iconR2SecretAccessKey <secret>\n` +
326
- ` otter config set iconR2Bucket <bucket>\n` +
327
- ` otter config set iconR2PublicDomain <domain>`);
328
- process.exit(1);
329
- }
330
- const uploadConfig = {
331
- r2Endpoint,
332
- r2AccessKeyId,
333
- r2SecretAccessKey,
334
- r2Bucket,
335
- r2PublicDomain,
336
- };
337
- const exportedIcons = results
338
- .filter((r) => r.success && r.outputPath)
339
- .map((r) => ({ appName: r.appName, pngPath: r.outputPath }));
340
- consola.start(`\nUploading ${pc.bold(String(exportedIcons.length))} icons to R2...\n`);
341
- const uploadResults = await uploadIcons(exportedIcons, uploadConfig, (result) => {
342
- const status = result.uploaded ? pc.green("↑") : pc.dim("=");
343
- consola.log(` ${status} ${result.appName} ${pc.dim(result.publicUrl)}`);
344
- });
345
- const uploaded = uploadResults.filter((r) => r.uploaded).length;
346
- const skipped = uploadResults.filter((r) => !r.uploaded).length;
347
- consola.success(`Uploaded ${pc.bold(String(uploaded))} icons` +
348
- (skipped > 0 ? ` (${pc.dim(String(skipped))} unchanged)` : ""));
349
- }
350
351
  },
351
352
  });
352
353
  const loginCommand = defineCommand({
@@ -362,6 +363,7 @@ const loginCommand = defineCommand({
362
363
  },
363
364
  },
364
365
  async run({ args }) {
366
+ const configManager = getConfigManager();
365
367
  consola.start("Starting login flow...\n");
366
368
  const result = await executeLogin(configManager, { dev: args.dev }, {
367
369
  onPortReady: (port) => {
@@ -371,9 +373,9 @@ const loginCommand = defineCommand({
371
373
  consola.info(`Opening browser: ${pc.dim(url)}`);
372
374
  consola.info(pc.dim("Waiting for you to connect in the browser (30s timeout)..."));
373
375
  },
374
- onSuccess: (webhookUrl) => {
375
- consola.success(`\nConnected! Webhook URL saved.`);
376
- consola.info(`Webhook: ${pc.dim(webhookUrl)}`);
376
+ onSuccess: (token) => {
377
+ consola.success(`\nConnected! Token saved.`);
378
+ consola.info(`Token: ${pc.dim(token.slice(0, 8))}...`);
377
379
  consola.info(`\nRun ${pc.bold("otter backup")} to create your first backup.`);
378
380
  },
379
381
  onError: (error) => {
@@ -391,7 +393,7 @@ const loginCommand = defineCommand({
391
393
  export const main = defineCommand({
392
394
  meta: {
393
395
  name: "otter",
394
- version: "1.0.1",
396
+ version: "1.0.3",
395
397
  description: "Backup and restore your Mac development environment configuration",
396
398
  },
397
399
  subCommands: {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACrH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAC3D,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;AAE3E;;;GAGG;AACH,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,qDAAqD;AACrD,SAAS,gBAAgB;IACvB,OAAO,IAAI,aAAa,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,WAAW,GAAG,aAAa,CAAC;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,2DAA2D;KACzE;IACD,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,mCAAmC;YAChD,OAAO,EAAE,KAAK;SACf;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EACT,iFAAiF;YACnF,OAAO,EAAE,KAAK;SACf;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,0CAA0C;YACvD,OAAO,EAAE,KAAK;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,6DAA6D;QAC7D,0CAA0C;QAC1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC1C,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,EAAE,EAAE;YACpD,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE;YAC7C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;gBACtC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;gBACtC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBACxC,MAAM,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CACT,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,WAAW,SAAS,cACpE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,UAAU,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAC9D,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CACzC,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpD,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAC3C,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAChC,CAAC,CACF,CAAC;YACF,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAC3C,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAChC,CAAC,CACF,CAAC;YACF,OAAO,CAAC,OAAO,CACb,oBAAoB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,aAAa,CAClK,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,aAAa,CAAC;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,6CAA6C;KAC3D;IACD,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,uCAAuC;YACpD,OAAO,EAAE,KAAK;SACf;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EACT,iFAAiF;YACnF,OAAO,EAAE,KAAK;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CACX,qBAAqB;gBACnB,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC;gBACtB,SAAS,CACZ,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvD,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,EAAE,EAAE;YACpD,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE;YAC7C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC1B,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CACT,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAC7E,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAEpE,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,OAAO,CACb,gCAAgC,EAAE,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,UAAU,KAAK,CAAC,EAAE,CAC3E,CAAC;YAEF,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpD,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAE/D,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAEpD,kDAAkD;YAClD,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;YACtE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,OAAO,CACb,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CACrD,CAAC;gBAEF,MAAM,QAAQ,GAAG,GAAG,UAAU,QAAQ,CAAC;gBACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACjC,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,OAAO,EAAE,CAAC,CAAC,UAAW;iBACvB,CAAC,CAAC,CAAC;gBAEJ,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAClE,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,OAAO,CAAC,OAAO,CACb,mBAAmB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,CACzG,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,sBAAsB,UAAU,CAAC,KAAK,IAAI,iBAAiB,EAAE;wBAC3D,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;4BACpB,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,UAAU;4BACtD,CAAC,CAAC,EAAE,CAAC,CACV,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,kBAAkB,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,aAAa,CAAC;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0BAA0B;KACxC;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,KAAK;SAChB;QACD,GAAG,EAAE;YACH,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,0BAA0B;YACvC,QAAQ,EAAE,KAAK;SAChB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,KAAK;SAChB;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAI,IAAI,CAAC,MAAiB,IAAI,MAAM,CAAC;QAEjD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE;gBAChD,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,IAAI,CAAC,GAAc;aACzB,CAAC,CAAC;YACH,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,MAAgB,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,aAAa,CAAC,aAAa,EAAE;gBACjC,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,IAAI,CAAC,GAAc;gBACxB,KAAK,EAAE,IAAI,CAAC,KAAe;aAC5B,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAa,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,mBAAmB,MAAM,0BAA0B,CAAC,CAAC;QACnE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,8BAA8B;KAC5C;IACD,KAAK,CAAC,GAAG;QACP,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kCAAkC;KAChD;IACD,IAAI,EAAE;QACJ,EAAE,EAAE;YACF,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,uDAAuD;YACpE,QAAQ,EAAE,IAAI;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAY,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,2CAA2C;KACzD;IACD,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,gCAAgC;YAC7C,QAAQ,EAAE,IAAI;SACf;QACD,GAAG,EAAE;YACH,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,gCAAgC;YAC7C,QAAQ,EAAE,IAAI;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAa,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAa,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAa,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAa,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,aAAa,CAAC;IACpC,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,gCAAgC;KAC9C;IACD,WAAW,EAAE;QACX,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,mBAAmB;KAC1B;CACF,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,uCAAuC;KACrD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gCAAgC;YAC7C,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,KAAK;SAChB;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,oCAAoC;YACjD,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,KAAK;SAChB;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,SAAS,GACZ,IAAI,CAAC,MAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,QAAQ,CAAE,IAAI,CAAC,IAAe,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QAE1D,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;YAChC,SAAS;YACT,IAAI;YACJ,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;gBACrB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,EAAE,CACpF,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QACxD,OAAO,CAAC,OAAO,CACb,cAAc,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ;YAC9C,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAChE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,aAAa,CAAC;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,WAAW,EACT,iEAAiE;KACpE;IACD,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,uCAAuC;YACpD,OAAO,EAAE,KAAK;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;YAClE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;gBACpB,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CACV,EAAE,CAAC,GAAG,CAAC,4DAA4D,CAAC,CACrE,CAAC;YACJ,CAAC;YACD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnB,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CACV,SAAS,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,+BAA+B,CAChE,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,OAAO,CAAC,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC7D,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAC;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,WAAW,EACT,mEAAmE;KACtE;IACD,WAAW,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,QAAQ,EAAE,eAAe;QACzB,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAC"}
@@ -1,5 +1,6 @@
1
- import type { OtterConfig } from "@otter/core";
2
1
  import type { ConfigManager } from "../config/manager.js";
2
+ export declare const DEFAULT_HOST = "https://otter.hexly.ai";
3
+ export declare const DEV_HOST = "https://otter.dev.hexly.ai";
3
4
  export interface LoginOptions {
4
5
  /** Use the dev host instead of production */
5
6
  dev?: boolean;
@@ -8,8 +9,8 @@ export interface LoginResult {
8
9
  success: boolean;
9
10
  /** The host that was used */
10
11
  host?: string;
11
- /** The webhook URL that was configured */
12
- webhookUrl?: string;
12
+ /** The token obtained from the dashboard */
13
+ token?: string;
13
14
  /** Error message if failed */
14
15
  error?: string;
15
16
  }
@@ -24,29 +25,33 @@ export declare function checkPortAvailable(port: number): Promise<boolean>;
24
25
  export declare function findAvailablePort(): Promise<number>;
25
26
  /**
26
27
  * Parse callback query parameters from the URL.
27
- * Expected: /callback?token=<uuid>&webhookUrl=<encoded-url>
28
+ * Expected: /callback?token=<uuid>
28
29
  */
29
30
  export declare function parseCallbackParams(url: string): {
30
31
  token: string;
31
- webhookUrl: string;
32
32
  } | {
33
33
  error: string;
34
34
  };
35
35
  /**
36
- * Determine the host URL based on options and existing config.
36
+ * Determine the host URL based on the --dev flag.
37
+ * No longer reads from config — host is purely determined at runtime.
37
38
  */
38
- export declare function resolveHost(config: OtterConfig, options: LoginOptions): string;
39
+ export declare function resolveHost(options: LoginOptions): string;
40
+ /**
41
+ * Build a webhook URL from host and token.
42
+ */
43
+ export declare function buildWebhookUrl(host: string, token: string): string;
39
44
  /**
40
45
  * Execute the login flow:
41
46
  * 1. Start local HTTP server on a random available port
42
47
  * 2. Open browser to the connect page
43
- * 3. Wait for callback with token + webhookUrl
44
- * 4. Save config and close server
48
+ * 3. Wait for callback with token
49
+ * 4. Save token to config and close server
45
50
  */
46
51
  export declare function executeLogin(configManager: ConfigManager, options: LoginOptions, callbacks?: {
47
52
  onPortReady?: (port: number) => void;
48
53
  onBrowserOpen?: (url: string) => void;
49
- onSuccess?: (webhookUrl: string) => void;
54
+ onSuccess?: (token: string) => void;
50
55
  onError?: (error: string) => void;
51
56
  onTimeout?: () => void;
52
57
  openBrowser?: (url: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYjE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAUzD;AASD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAiB3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,YAAY,GACpB,MAAM,CAIR;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE;IACV,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GACA,OAAO,CAAC,WAAW,CAAC,CAoFtB"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,eAAO,MAAM,YAAY,2BAA2B,CAAC;AACrD,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AAKrD,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYjE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAUzD;AASD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAgBvC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE;IACV,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GACA,OAAO,CAAC,WAAW,CAAC,CAkFtB"}
@@ -1,8 +1,8 @@
1
1
  import { createServer } from "node:http";
2
2
  import { exec } from "node:child_process";
3
3
  import { createConnection } from "node:net";
4
- const DEFAULT_HOST = "https://otter.hexly.ai";
5
- const DEV_HOST = "https://otter.dev.hexly.ai";
4
+ export const DEFAULT_HOST = "https://otter.hexly.ai";
5
+ export const DEV_HOST = "https://otter.dev.hexly.ai";
6
6
  const TIMEOUT_MS = 30_000;
7
7
  const PORT_RANGE_START = 49152;
8
8
  const PORT_RANGE_END = 65535;
@@ -44,46 +44,47 @@ function openBrowser(url) {
44
44
  }
45
45
  /**
46
46
  * Parse callback query parameters from the URL.
47
- * Expected: /callback?token=<uuid>&webhookUrl=<encoded-url>
47
+ * Expected: /callback?token=<uuid>
48
48
  */
49
49
  export function parseCallbackParams(url) {
50
50
  try {
51
51
  const parsed = new URL(url, "http://localhost");
52
52
  const token = parsed.searchParams.get("token");
53
- const webhookUrl = parsed.searchParams.get("webhookUrl");
54
53
  const error = parsed.searchParams.get("error");
55
54
  if (error) {
56
55
  return { error };
57
56
  }
58
- if (!token || !webhookUrl) {
59
- return { error: "Missing token or webhookUrl in callback" };
57
+ if (!token) {
58
+ return { error: "Missing token in callback" };
60
59
  }
61
- return { token, webhookUrl };
60
+ return { token };
62
61
  }
63
62
  catch {
64
63
  return { error: `Invalid callback URL: ${url}` };
65
64
  }
66
65
  }
67
66
  /**
68
- * Determine the host URL based on options and existing config.
67
+ * Determine the host URL based on the --dev flag.
68
+ * No longer reads from config — host is purely determined at runtime.
69
69
  */
70
- export function resolveHost(config, options) {
71
- if (options.dev)
72
- return DEV_HOST;
73
- if (config.host)
74
- return config.host;
75
- return DEFAULT_HOST;
70
+ export function resolveHost(options) {
71
+ return options.dev ? DEV_HOST : DEFAULT_HOST;
72
+ }
73
+ /**
74
+ * Build a webhook URL from host and token.
75
+ */
76
+ export function buildWebhookUrl(host, token) {
77
+ return `${host}/api/webhook/${token}`;
76
78
  }
77
79
  /**
78
80
  * Execute the login flow:
79
81
  * 1. Start local HTTP server on a random available port
80
82
  * 2. Open browser to the connect page
81
- * 3. Wait for callback with token + webhookUrl
82
- * 4. Save config and close server
83
+ * 3. Wait for callback with token
84
+ * 4. Save token to config and close server
83
85
  */
84
86
  export async function executeLogin(configManager, options, callbacks) {
85
- const config = await configManager.load();
86
- const host = resolveHost(config, options);
87
+ const host = resolveHost(options);
87
88
  const port = await findAvailablePort();
88
89
  const callbackBase = `http://localhost:${port}`;
89
90
  callbacks?.onPortReady?.(port);
@@ -110,22 +111,21 @@ export async function executeLogin(configManager, options, callbacks) {
110
111
  }
111
112
  return;
112
113
  }
113
- // Save the webhook URL and host to config
114
+ // Save the token to config
114
115
  const updatedConfig = await configManager.load();
115
- updatedConfig.webhookUrl = params.webhookUrl;
116
- updatedConfig.host = host;
116
+ updatedConfig.token = params.token;
117
117
  await configManager.save(updatedConfig);
118
118
  // Return success page
119
119
  res.writeHead(200, { "Content-Type": "text/html" });
120
120
  res.end(successHtml());
121
121
  if (!settled) {
122
122
  settled = true;
123
- callbacks?.onSuccess?.(params.webhookUrl);
123
+ callbacks?.onSuccess?.(params.token);
124
124
  server.close();
125
125
  resolve({
126
126
  success: true,
127
127
  host,
128
- webhookUrl: params.webhookUrl,
128
+ token: params.token,
129
129
  });
130
130
  }
131
131
  });
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import type { OtterConfig } from "@otter/core";
2
2
  /**
3
- * Manages the CLI configuration file at ~/.config/otter/config.json
3
+ * Manages the CLI configuration file.
4
+ * - Production: ~/.config/otter/config.json
5
+ * - Dev: ~/.config/otter/config.dev.json
4
6
  */
5
7
  export declare class ConfigManager {
6
8
  readonly configPath: string;
7
- constructor(configDir: string);
9
+ constructor(configDir: string, dev?: boolean);
8
10
  /** Load config from disk. Returns empty config if file doesn't exist or is corrupted. */
9
11
  load(): Promise<OtterConfig>;
10
12
  /** Save config to disk, creating the directory if needed. */
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,SAAS,EAAE,MAAM;IAI7B,yFAAyF;IACnF,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IASlC,6DAA6D;IACvD,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK/C"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C;;;;GAIG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,SAAS,EAAE,MAAM,EAAE,GAAG,UAAQ;IAK1C,yFAAyF;IACnF,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IASlC,6DAA6D;IACvD,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK/C"}
@@ -1,12 +1,17 @@
1
1
  import { readFile, writeFile, mkdir } from "node:fs/promises";
2
2
  import { join, dirname } from "node:path";
3
+ const PROD_CONFIG = "config.json";
4
+ const DEV_CONFIG = "config.dev.json";
3
5
  /**
4
- * Manages the CLI configuration file at ~/.config/otter/config.json
6
+ * Manages the CLI configuration file.
7
+ * - Production: ~/.config/otter/config.json
8
+ * - Dev: ~/.config/otter/config.dev.json
5
9
  */
6
10
  export class ConfigManager {
7
11
  configPath;
8
- constructor(configDir) {
9
- this.configPath = join(configDir, "config.json");
12
+ constructor(configDir, dev = false) {
13
+ const filename = dev ? DEV_CONFIG : PROD_CONFIG;
14
+ this.configPath = join(configDir, filename);
10
15
  }
11
16
  /** Load config from disk. Returns empty config if file doesn't exist or is corrupted. */
12
17
  async load() {
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C;;GAEG;AACH,MAAM,OAAO,aAAa;IACf,UAAU,CAAS;IAE5B,YAAY,SAAiB;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3E,CAAC;CACF"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACf,UAAU,CAAS;IAE5B,YAAY,SAAiB,EAAE,GAAG,GAAG,KAAK;QACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3E,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ /** Configuration for server-side icon upload */
2
+ export interface IconUploadConfig {
3
+ /** Full URL to the icon upload endpoint, e.g. https://otter.hexly.ai/api/webhook/{token}/icons */
4
+ iconsUrl: string;
5
+ /** Optional timeout in milliseconds (default: 60000) */
6
+ timeoutMs?: number;
7
+ }
8
+ /** Result of an icon upload batch */
9
+ export interface IconUploadResult {
10
+ success: boolean;
11
+ /** Number of icons stored by server */
12
+ stored: number;
13
+ /** Total icons sent */
14
+ total: number;
15
+ /** Duration in milliseconds */
16
+ durationMs: number;
17
+ /** Error message if failed */
18
+ error?: string;
19
+ /** Hashes of icons that failed server-side */
20
+ errors?: string[];
21
+ }
22
+ /** A single icon to upload */
23
+ export interface IconEntry {
24
+ appName: string;
25
+ pngPath: string;
26
+ }
27
+ /**
28
+ * Generate a deterministic hash from an app name.
29
+ * Returns the first 12 hex chars of SHA-256(appName).
30
+ */
31
+ export declare function hashAppName(appName: string): string;
32
+ /**
33
+ * Upload app icons to the server endpoint.
34
+ * Reads each PNG file, base64-encodes it, and POSTs
35
+ * the batch to /api/webhook/[token]/icons.
36
+ */
37
+ export declare function uploadIconsToServer(icons: IconEntry[], config: IconUploadConfig): Promise<IconUploadResult>;
38
+ //# sourceMappingURL=icons-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons-server.d.ts","sourceRoot":"","sources":["../../src/uploader/icons-server.ts"],"names":[],"mappings":"AAGA,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAsE3B"}
@@ -0,0 +1,76 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ const DEFAULT_TIMEOUT_MS = 60_000;
4
+ /**
5
+ * Generate a deterministic hash from an app name.
6
+ * Returns the first 12 hex chars of SHA-256(appName).
7
+ */
8
+ export function hashAppName(appName) {
9
+ return createHash("sha256").update(appName).digest("hex").slice(0, 12);
10
+ }
11
+ /**
12
+ * Upload app icons to the server endpoint.
13
+ * Reads each PNG file, base64-encodes it, and POSTs
14
+ * the batch to /api/webhook/[token]/icons.
15
+ */
16
+ export async function uploadIconsToServer(icons, config) {
17
+ if (icons.length === 0) {
18
+ return { success: true, stored: 0, total: 0, durationMs: 0 };
19
+ }
20
+ const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
21
+ const controller = new AbortController();
22
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
23
+ const start = performance.now();
24
+ try {
25
+ // Read and encode all icons
26
+ const payload = [];
27
+ for (const icon of icons) {
28
+ const buffer = await readFile(icon.pngPath);
29
+ payload.push({
30
+ hash: hashAppName(icon.appName),
31
+ data: buffer.toString("base64"),
32
+ });
33
+ }
34
+ const response = await fetch(config.iconsUrl, {
35
+ method: "POST",
36
+ headers: { "Content-Type": "application/json" },
37
+ body: JSON.stringify({ icons: payload }),
38
+ signal: controller.signal,
39
+ });
40
+ const durationMs = Math.round(performance.now() - start);
41
+ const body = (await response.json());
42
+ if (response.ok || response.status === 207) {
43
+ return {
44
+ success: response.ok,
45
+ stored: body.stored ?? 0,
46
+ total: icons.length,
47
+ durationMs,
48
+ ...(body.errors ? { errors: body.errors } : {}),
49
+ };
50
+ }
51
+ return {
52
+ success: false,
53
+ stored: 0,
54
+ total: icons.length,
55
+ error: body.error ?? `Server returned ${response.status}`,
56
+ durationMs,
57
+ };
58
+ }
59
+ catch (err) {
60
+ const durationMs = Math.round(performance.now() - start);
61
+ const message = err instanceof DOMException && err.name === "AbortError"
62
+ ? `Icon upload timed out after ${timeoutMs}ms`
63
+ : err.message;
64
+ return {
65
+ success: false,
66
+ stored: 0,
67
+ total: icons.length,
68
+ error: message,
69
+ durationMs,
70
+ };
71
+ }
72
+ finally {
73
+ clearTimeout(timer);
74
+ }
75
+ }
76
+ //# sourceMappingURL=icons-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons-server.js","sourceRoot":"","sources":["../../src/uploader/icons-server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocoo/otter",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Backup and restore your Mac development environment configuration",
5
5
  "type": "module",
6
6
  "bin": {
@@ -33,7 +33,6 @@
33
33
  ],
34
34
  "license": "MIT",
35
35
  "dependencies": {
36
- "@aws-sdk/client-s3": "^3.1004.0",
37
36
  "citty": "^0.1.0",
38
37
  "consola": "^3.4.0",
39
38
  "picocolors": "^1.1.0"
@@ -1,41 +0,0 @@
1
- /** Configuration for icon uploads to R2 */
2
- export interface IconUploadConfig {
3
- r2Endpoint: string;
4
- r2AccessKeyId: string;
5
- r2SecretAccessKey: string;
6
- r2Bucket: string;
7
- /** Public domain for the R2 bucket (e.g. "https://s.zhe.to") */
8
- r2PublicDomain: string;
9
- /** R2 key prefix (default: "apps/otter") */
10
- prefix?: string;
11
- }
12
- /** Result of uploading a single icon */
13
- export interface IconUploadResult {
14
- appName: string;
15
- key: string;
16
- publicUrl: string;
17
- /** Whether the file was actually uploaded (false = already existed) */
18
- uploaded: boolean;
19
- }
20
- /**
21
- * Generate a deterministic hash from an app name.
22
- * Returns the first 12 hex chars of SHA-256(appName).
23
- */
24
- export declare function hashAppName(appName: string): string;
25
- /** Reset the cached S3 client (for testing). */
26
- export declare function resetIconUploadClient(): void;
27
- /**
28
- * Upload a single icon PNG to R2.
29
- * Key format: {prefix}/{hash}.png
30
- * Skips upload if the object already exists (same app name = same key).
31
- */
32
- export declare function uploadIcon(pngPath: string, appName: string, config: IconUploadConfig): Promise<IconUploadResult>;
33
- /**
34
- * Upload multiple icon PNGs to R2 in sequence.
35
- * Returns results for all successful exports.
36
- */
37
- export declare function uploadIcons(icons: Array<{
38
- appName: string;
39
- pngPath: string;
40
- }>, config: IconUploadConfig, onProgress?: (result: IconUploadResult) => void): Promise<IconUploadResult[]>;
41
- //# sourceMappingURL=icons.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/uploader/icons.ts"],"names":[],"mappings":"AAIA,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAiBD,gDAAgD;AAChD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAkBD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA2B3B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,MAAM,EAAE,gBAAgB,EACxB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAC9C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAU7B"}
@@ -1,80 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import { readFile } from "node:fs/promises";
3
- import { S3Client, PutObjectCommand, HeadObjectCommand } from "@aws-sdk/client-s3";
4
- /**
5
- * Generate a deterministic hash from an app name.
6
- * Returns the first 12 hex chars of SHA-256(appName).
7
- */
8
- export function hashAppName(appName) {
9
- return createHash("sha256").update(appName).digest("hex").slice(0, 12);
10
- }
11
- let _client = null;
12
- function getClient(config) {
13
- if (_client)
14
- return _client;
15
- _client = new S3Client({
16
- region: "auto",
17
- endpoint: config.r2Endpoint,
18
- credentials: {
19
- accessKeyId: config.r2AccessKeyId,
20
- secretAccessKey: config.r2SecretAccessKey,
21
- },
22
- });
23
- return _client;
24
- }
25
- /** Reset the cached S3 client (for testing). */
26
- export function resetIconUploadClient() {
27
- _client = null;
28
- }
29
- /**
30
- * Check if an object already exists in R2.
31
- */
32
- async function objectExists(client, bucket, key) {
33
- try {
34
- await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));
35
- return true;
36
- }
37
- catch {
38
- return false;
39
- }
40
- }
41
- /**
42
- * Upload a single icon PNG to R2.
43
- * Key format: {prefix}/{hash}.png
44
- * Skips upload if the object already exists (same app name = same key).
45
- */
46
- export async function uploadIcon(pngPath, appName, config) {
47
- const prefix = config.prefix ?? "apps/otter";
48
- const hash = hashAppName(appName);
49
- const key = `${prefix}/${hash}.png`;
50
- const publicUrl = `${config.r2PublicDomain}/${key}`;
51
- const client = getClient(config);
52
- // Skip if already uploaded (same app name = same hash = same key)
53
- const exists = await objectExists(client, config.r2Bucket, key);
54
- if (exists) {
55
- return { appName, key, publicUrl, uploaded: false };
56
- }
57
- const body = await readFile(pngPath);
58
- await client.send(new PutObjectCommand({
59
- Bucket: config.r2Bucket,
60
- Key: key,
61
- Body: body,
62
- ContentType: "image/png",
63
- CacheControl: "public, max-age=31536000, immutable",
64
- }));
65
- return { appName, key, publicUrl, uploaded: true };
66
- }
67
- /**
68
- * Upload multiple icon PNGs to R2 in sequence.
69
- * Returns results for all successful exports.
70
- */
71
- export async function uploadIcons(icons, config, onProgress) {
72
- const results = [];
73
- for (const { appName, pngPath } of icons) {
74
- const result = await uploadIcon(pngPath, appName, config);
75
- results.push(result);
76
- onProgress?.(result);
77
- }
78
- return results;
79
- }
80
- //# sourceMappingURL=icons.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/uploader/icons.ts"],"names":[],"mappings":"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"}