sproutkit-code 0.1.0 → 0.1.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 (2) hide show
  1. package/dist/index.js +135 -36
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -24950,7 +24950,7 @@ var require_has_flag = __commonJS({
24950
24950
  var require_supports_color = __commonJS({
24951
24951
  "../../node_modules/supports-color/index.js"(exports2, module2) {
24952
24952
  "use strict";
24953
- var os = require("os");
24953
+ var os2 = require("os");
24954
24954
  var tty = require("tty");
24955
24955
  var hasFlag = require_has_flag();
24956
24956
  var { env } = process;
@@ -24998,7 +24998,7 @@ var require_supports_color = __commonJS({
24998
24998
  return min;
24999
24999
  }
25000
25000
  if (process.platform === "win32") {
25001
- const osRelease = os.release().split(".");
25001
+ const osRelease = os2.release().split(".");
25002
25002
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
25003
25003
  return Number(osRelease[2]) >= 14931 ? 3 : 2;
25004
25004
  }
@@ -35997,7 +35997,7 @@ var require_signal_exit = __commonJS({
35997
35997
  var require_kill = __commonJS({
35998
35998
  "../../node_modules/execa/lib/kill.js"(exports2, module2) {
35999
35999
  "use strict";
36000
- var os = require("os");
36000
+ var os2 = require("os");
36001
36001
  var onExit = require_signal_exit();
36002
36002
  var DEFAULT_FORCE_KILL_TIMEOUT = 1e3 * 5;
36003
36003
  var spawnedKill = (kill, signal = "SIGTERM", options = {}) => {
@@ -36021,7 +36021,7 @@ var require_kill = __commonJS({
36021
36021
  return isSigterm(signal) && forceKillAfterTimeout !== false && killResult;
36022
36022
  };
36023
36023
  var isSigterm = (signal) => {
36024
- return signal === os.constants.signals.SIGTERM || typeof signal === "string" && signal.toUpperCase() === "SIGTERM";
36024
+ return signal === os2.constants.signals.SIGTERM || typeof signal === "string" && signal.toUpperCase() === "SIGTERM";
36025
36025
  };
36026
36026
  var getForceKillAfterTimeout = ({ forceKillAfterTimeout = true }) => {
36027
36027
  if (forceKillAfterTimeout === true) {
@@ -51006,7 +51006,7 @@ var require_schemas2 = __commonJS({
51006
51006
  exports2.function = _function;
51007
51007
  exports2._function = _function;
51008
51008
  exports2.function = _function;
51009
- exports2.check = check;
51009
+ exports2.check = check2;
51010
51010
  exports2.custom = custom;
51011
51011
  exports2.refine = refine;
51012
51012
  exports2.superRefine = superRefine;
@@ -51050,7 +51050,7 @@ var require_schemas2 = __commonJS({
51050
51050
  inst.safeDecode = (data, params) => parse.safeDecode(inst, data, params);
51051
51051
  inst.safeEncodeAsync = async (data, params) => parse.safeEncodeAsync(inst, data, params);
51052
51052
  inst.safeDecodeAsync = async (data, params) => parse.safeDecodeAsync(inst, data, params);
51053
- inst.refine = (check2, params) => inst.check(refine(check2, params));
51053
+ inst.refine = (check3, params) => inst.check(refine(check3, params));
51054
51054
  inst.superRefine = (refinement) => inst.check(superRefine(refinement));
51055
51055
  inst.overwrite = (fn) => inst.check(checks.overwrite(fn));
51056
51056
  inst.optional = () => optional(inst);
@@ -51942,7 +51942,7 @@ var require_schemas2 = __commonJS({
51942
51942
  core.$ZodCustom.init(inst, def);
51943
51943
  exports2.ZodType.init(inst, def);
51944
51944
  });
51945
- function check(fn) {
51945
+ function check2(fn) {
51946
51946
  const ch = new core.$ZodCheck({
51947
51947
  check: "custom"
51948
51948
  // ...util.normalizeParams(params),
@@ -52357,7 +52357,7 @@ var require_schema = __commonJS({
52357
52357
  var require_lib5 = __commonJS({
52358
52358
  "../../node_modules/os-paths/src/lib/index.js"(exports2, module2) {
52359
52359
  "use strict";
52360
- var os = require("os");
52360
+ var os2 = require("os");
52361
52361
  var paths = require("path");
52362
52362
  var isWinOS = /^win/i.test(process.platform);
52363
52363
  function normalize_path(path) {
@@ -52366,18 +52366,18 @@ var require_lib5 = __commonJS({
52366
52366
  var base = () => {
52367
52367
  const { env } = process;
52368
52368
  const object = {};
52369
- object.home = () => normalize_path(os.homedir ? os.homedir() : env.HOME);
52370
- object.temp = () => normalize_path(os.tmpdir ? os.tmpdir() : env.TMPDIR || env.TEMP || env.TMP);
52369
+ object.home = () => normalize_path(os2.homedir ? os2.homedir() : env.HOME);
52370
+ object.temp = () => normalize_path(os2.tmpdir ? os2.tmpdir() : env.TMPDIR || env.TEMP || env.TMP);
52371
52371
  return object;
52372
52372
  };
52373
52373
  var windows = () => {
52374
52374
  const { env } = process;
52375
52375
  const object = {};
52376
52376
  object.home = () => normalize_path(
52377
- os.homedir ? os.homedir() : env.USERPROFILE || paths.join(env.HOMEDRIVE, env.HOMEPATH) || env.HOME
52377
+ os2.homedir ? os2.homedir() : env.USERPROFILE || paths.join(env.HOMEDRIVE, env.HOMEPATH) || env.HOME
52378
52378
  );
52379
52379
  object.temp = () => normalize_path(
52380
- os.tmpdir ? os.tmpdir() : env.TEMP || env.TMP || paths.join(env.LOCALAPPDATA || env.SystemRoot || env.windir, "Temp")
52380
+ os2.tmpdir ? os2.tmpdir() : env.TEMP || env.TMP || paths.join(env.LOCALAPPDATA || env.SystemRoot || env.windir, "Temp")
52381
52381
  );
52382
52382
  return object;
52383
52383
  };
@@ -52890,7 +52890,7 @@ var require_token_io = __commonJS({
52890
52890
  module2.exports = __toCommonJS(token_io_exports);
52891
52891
  var import_path = __toESM2(require("path"));
52892
52892
  var import_fs = __toESM2(require("fs"));
52893
- var import_os = __toESM2(require("os"));
52893
+ var import_os2 = __toESM2(require("os"));
52894
52894
  var import_token_error = require_token_error();
52895
52895
  function findRootDir() {
52896
52896
  try {
@@ -52913,11 +52913,11 @@ var require_token_io = __commonJS({
52913
52913
  if (process.env.XDG_DATA_HOME) {
52914
52914
  return process.env.XDG_DATA_HOME;
52915
52915
  }
52916
- switch (import_os.default.platform()) {
52916
+ switch (import_os2.default.platform()) {
52917
52917
  case "darwin":
52918
- return import_path.default.join(import_os.default.homedir(), "Library/Application Support");
52918
+ return import_path.default.join(import_os2.default.homedir(), "Library/Application Support");
52919
52919
  case "linux":
52920
- return import_path.default.join(import_os.default.homedir(), ".local/share");
52920
+ return import_path.default.join(import_os2.default.homedir(), ".local/share");
52921
52921
  case "win32":
52922
52922
  if (process.env.LOCALAPPDATA) {
52923
52923
  return process.env.LOCALAPPDATA;
@@ -52957,10 +52957,10 @@ var require_oauth = __commonJS({
52957
52957
  refreshTokenRequest: () => refreshTokenRequest
52958
52958
  });
52959
52959
  module2.exports = __toCommonJS(oauth_exports);
52960
- var import_os = require("os");
52960
+ var import_os2 = require("os");
52961
52961
  var VERCEL_ISSUER = "https://vercel.com";
52962
52962
  var VERCEL_CLI_CLIENT_ID = "cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp";
52963
- var userAgent = `@vercel/oidc node-${process.version} ${(0, import_os.platform)()} (${(0, import_os.arch)()}) ${(0, import_os.hostname)()}`;
52963
+ var userAgent = `@vercel/oidc node-${process.version} ${(0, import_os2.platform)()} (${(0, import_os2.arch)()}) ${(0, import_os2.hostname)()}`;
52964
52964
  var _tokenEndpoint = null;
52965
52965
  async function getTokenEndpoint() {
52966
52966
  if (_tokenEndpoint) {
@@ -57019,7 +57019,7 @@ var require_thumbprint = __commonJS({
57019
57019
  var errors_js_1 = require_errors4();
57020
57020
  var buffer_utils_js_1 = require_buffer_utils();
57021
57021
  var is_object_js_1 = require_is_object();
57022
- var check = (value, description) => {
57022
+ var check2 = (value, description) => {
57023
57023
  if (typeof value !== "string" || !value) {
57024
57024
  throw new errors_js_1.JWKInvalid(`${description} missing or invalid`);
57025
57025
  }
@@ -57035,23 +57035,23 @@ var require_thumbprint = __commonJS({
57035
57035
  let components;
57036
57036
  switch (jwk.kty) {
57037
57037
  case "EC":
57038
- check(jwk.crv, '"crv" (Curve) Parameter');
57039
- check(jwk.x, '"x" (X Coordinate) Parameter');
57040
- check(jwk.y, '"y" (Y Coordinate) Parameter');
57038
+ check2(jwk.crv, '"crv" (Curve) Parameter');
57039
+ check2(jwk.x, '"x" (X Coordinate) Parameter');
57040
+ check2(jwk.y, '"y" (Y Coordinate) Parameter');
57041
57041
  components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };
57042
57042
  break;
57043
57043
  case "OKP":
57044
- check(jwk.crv, '"crv" (Subtype of Key Pair) Parameter');
57045
- check(jwk.x, '"x" (Public Key) Parameter');
57044
+ check2(jwk.crv, '"crv" (Subtype of Key Pair) Parameter');
57045
+ check2(jwk.x, '"x" (Public Key) Parameter');
57046
57046
  components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
57047
57047
  break;
57048
57048
  case "RSA":
57049
- check(jwk.e, '"e" (Exponent) Parameter');
57050
- check(jwk.n, '"n" (Modulus) Parameter');
57049
+ check2(jwk.e, '"e" (Exponent) Parameter');
57050
+ check2(jwk.n, '"n" (Modulus) Parameter');
57051
57051
  components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
57052
57052
  break;
57053
57053
  case "oct":
57054
- check(jwk.k, '"k" (Key Value) Parameter');
57054
+ check2(jwk.k, '"k" (Key Value) Parameter');
57055
57055
  components = { k: jwk.k, kty: jwk.kty };
57056
57056
  break;
57057
57057
  default:
@@ -63264,12 +63264,12 @@ var require_formdata_parser = __commonJS({
63264
63264
  return "failure";
63265
63265
  }
63266
63266
  if (bufferStartsWith(input, filenameBuffer, position)) {
63267
- let check = position.position + filenameBuffer.length;
63268
- if (input[check] === 42) {
63267
+ let check2 = position.position + filenameBuffer.length;
63268
+ if (input[check2] === 42) {
63269
63269
  position.position += 1;
63270
- check += 1;
63270
+ check2 += 1;
63271
63271
  }
63272
- if (input[check] !== 61 || input[check + 1] !== 34) {
63272
+ if (input[check2] !== 61 || input[check2 + 1] !== 34) {
63273
63273
  return "failure";
63274
63274
  }
63275
63275
  position.position += 12;
@@ -81429,14 +81429,14 @@ var require_auto_mode = __commonJS({
81429
81429
  this.broadcast();
81430
81430
  await this.tick();
81431
81431
  return new Promise((resolve) => {
81432
- const check = () => {
81432
+ const check2 = () => {
81433
81433
  if (this.finishedAt !== null) {
81434
81434
  resolve(this.snapshot());
81435
81435
  } else {
81436
81436
  this.resolveIdle = () => resolve(this.snapshot());
81437
81437
  }
81438
81438
  };
81439
- check();
81439
+ check2();
81440
81440
  });
81441
81441
  }
81442
81442
  async tick() {
@@ -82082,6 +82082,65 @@ function missingRequiredKeys() {
82082
82082
  }));
82083
82083
  }
82084
82084
 
82085
+ // src/license.ts
82086
+ var import_os = __toESM(require("os"));
82087
+ var import_crypto = require("crypto");
82088
+ var GRACE_MS = 7 * 24 * 60 * 60 * 1e3;
82089
+ function apiBase() {
82090
+ return process.env.SPROUTKIT_API_BASE_URL ?? "https://sproutkit.app";
82091
+ }
82092
+ function deviceId() {
82093
+ const macs = Object.values(import_os.default.networkInterfaces()).flat().filter((i) => !!i && !i.internal).map((i) => i.mac).filter((m) => m && m !== "00:00:00:00:00:00");
82094
+ return (0, import_crypto.createHash)("sha256").update(`${macs[0] ?? "unknown"}|${import_os.default.hostname()}`).digest("hex").slice(0, 32);
82095
+ }
82096
+ async function callValidate(key) {
82097
+ try {
82098
+ const r = await fetch(`${apiBase()}/api/licenses/validate`, {
82099
+ method: "POST",
82100
+ headers: { "Content-Type": "application/json" },
82101
+ body: JSON.stringify({ key, deviceId: deviceId() }),
82102
+ signal: AbortSignal.timeout(8e3)
82103
+ });
82104
+ if (!r.ok) return null;
82105
+ return await r.json();
82106
+ } catch {
82107
+ return null;
82108
+ }
82109
+ }
82110
+ async function activate(key) {
82111
+ const trimmed = key.trim();
82112
+ const result = await callValidate(trimmed);
82113
+ if (!result) return { status: "missing" };
82114
+ if (!result.valid) {
82115
+ return {
82116
+ status: result.reason === "revoked" ? "revoked" : result.reason === "refunded" ? "refunded" : "missing",
82117
+ email: result.email
82118
+ };
82119
+ }
82120
+ setSetting("license_key", trimmed);
82121
+ setSetting("license_email", result.email ?? "");
82122
+ setSetting("license_validated_at", String(Date.now()));
82123
+ return { status: "active", email: result.email };
82124
+ }
82125
+ async function check() {
82126
+ const key = getSetting("license_key");
82127
+ if (!key) return { status: "missing" };
82128
+ const result = await callValidate(key);
82129
+ if (result) {
82130
+ if (result.valid) {
82131
+ setSetting("license_validated_at", String(Date.now()));
82132
+ return { status: "active", email: result.email };
82133
+ }
82134
+ return {
82135
+ status: result.reason === "revoked" ? "revoked" : result.reason === "refunded" ? "refunded" : "missing",
82136
+ email: result.email
82137
+ };
82138
+ }
82139
+ const last = Number(getSetting("license_validated_at") ?? 0);
82140
+ if (Date.now() - last < GRACE_MS) return { status: "active" };
82141
+ return { status: "offline_grace_expired" };
82142
+ }
82143
+
82085
82144
  // src/tty.ts
82086
82145
  var import_readline = __toESM(require("readline"));
82087
82146
  var useColor = process.stdout.isTTY && !process.env.NO_COLOR;
@@ -82135,14 +82194,42 @@ function say(msg = "") {
82135
82194
  }
82136
82195
 
82137
82196
  // src/onboarding.ts
82197
+ async function onboardLicense(force) {
82198
+ if (!force) {
82199
+ const state = await check();
82200
+ if (state.status === "active") return true;
82201
+ }
82202
+ say(` ${c.bold("Licence key")}`);
82203
+ say(` ${c.dim("From your Sproutkit purchase \u2014 the same key the desktop app uses.")}`);
82204
+ while (true) {
82205
+ const key = await askSecret(c.green(" \u203A "));
82206
+ if (!key) {
82207
+ say(c.amber(" A licence is required to use Sproutkit. Get one at https://sproutkit.app"));
82208
+ say();
82209
+ return false;
82210
+ }
82211
+ say(c.dim(" \u2026 validating"));
82212
+ const state = await activate(key);
82213
+ if (state.status === "active") {
82214
+ say(c.green(` \u2713 Licence active${state.email ? ` (${state.email})` : ""}.`));
82215
+ say();
82216
+ return true;
82217
+ }
82218
+ const msg = state.status === "revoked" ? "That licence has been revoked." : state.status === "refunded" ? "That licence was refunded." : "Couldn't validate that key (check it, or your connection).";
82219
+ say(c.red(` ${msg} Try again, or press Enter to quit.`));
82220
+ }
82221
+ }
82138
82222
  async function runOnboarding(force = false) {
82139
82223
  const missing = missingRequiredKeys();
82140
- if (!force && missing.length === 0) return;
82224
+ const licensed = (await check()).status === "active";
82225
+ if (!force && missing.length === 0 && licensed) return true;
82141
82226
  say();
82142
82227
  say(c.greenBold(" Welcome to Sproutkit Code"));
82143
- say(c.dim(" Let's connect your accounts. Keys are stored locally in ~/.sproutkit and never leave your machine."));
82228
+ say(c.dim(" Let's get you set up. Keys are stored locally in ~/.sproutkit and never leave your machine."));
82144
82229
  say(c.dim(" You can re-run this anytime with: sproutkit setup"));
82145
82230
  say();
82231
+ const ok = await onboardLicense(force);
82232
+ if (!ok) return false;
82146
82233
  for (const k of REQUIRED_KEYS) {
82147
82234
  const existing = getSetting(k.key);
82148
82235
  if (existing && !force) continue;
@@ -82164,6 +82251,7 @@ async function runOnboarding(force = false) {
82164
82251
  say(c.green(" \u2713 All set. Type a message to get going \u2014 try \u201Cfind barber shops in Shoreditch\u201D."));
82165
82252
  say();
82166
82253
  }
82254
+ return true;
82167
82255
  }
82168
82256
 
82169
82257
  // src/invoke-ipc.ts
@@ -82385,7 +82473,18 @@ async function main() {
82385
82473
  closeTty();
82386
82474
  return;
82387
82475
  }
82388
- await runOnboarding(false);
82476
+ const ready = await runOnboarding(false);
82477
+ if (!ready) {
82478
+ closeTty();
82479
+ return;
82480
+ }
82481
+ const lic = await check();
82482
+ if (lic.status !== "active") {
82483
+ const why = lic.status === "revoked" ? "Your licence has been revoked." : lic.status === "refunded" ? "Your licence was refunded." : lic.status === "offline_grace_expired" ? "Can't reach the licence server and your offline grace period has expired. Reconnect and try again." : "No active licence. Run 'sproutkit setup' to enter your key, or buy one at https://sproutkit.app";
82484
+ say(c.red(` ${why}`));
82485
+ closeTty();
82486
+ return;
82487
+ }
82389
82488
  const oneShot = process.argv.slice(2).join(" ").trim();
82390
82489
  if (oneShot) {
82391
82490
  await runTurn(oneShot);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sproutkit-code",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Sproutkit in your terminal — find leads, build sites, run outreach, all via chat.",
5
5
  "bin": {
6
6
  "sproutkit": "./dist/index.js"