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.
- package/dist/index.js +135 -36
- 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
|
|
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 =
|
|
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
|
|
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 ===
|
|
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 =
|
|
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 = (
|
|
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
|
|
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
|
|
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(
|
|
52370
|
-
object.temp = () => normalize_path(
|
|
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
|
-
|
|
52377
|
+
os2.homedir ? os2.homedir() : env.USERPROFILE || paths.join(env.HOMEDRIVE, env.HOMEPATH) || env.HOME
|
|
52378
52378
|
);
|
|
52379
52379
|
object.temp = () => normalize_path(
|
|
52380
|
-
|
|
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
|
|
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 (
|
|
52916
|
+
switch (import_os2.default.platform()) {
|
|
52917
52917
|
case "darwin":
|
|
52918
|
-
return import_path.default.join(
|
|
52918
|
+
return import_path.default.join(import_os2.default.homedir(), "Library/Application Support");
|
|
52919
52919
|
case "linux":
|
|
52920
|
-
return import_path.default.join(
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
|
|
57039
|
-
|
|
57040
|
-
|
|
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
|
-
|
|
57045
|
-
|
|
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
|
-
|
|
57050
|
-
|
|
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
|
-
|
|
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
|
|
63268
|
-
if (input[
|
|
63267
|
+
let check2 = position.position + filenameBuffer.length;
|
|
63268
|
+
if (input[check2] === 42) {
|
|
63269
63269
|
position.position += 1;
|
|
63270
|
-
|
|
63270
|
+
check2 += 1;
|
|
63271
63271
|
}
|
|
63272
|
-
if (input[
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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);
|