sproutkit-code 0.10.0 → 0.11.0

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 +65 -5
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -82505,12 +82505,53 @@ Return this exact shape:
82505
82505
  }
82506
82506
  });
82507
82507
 
82508
+ // ../desktop/dist/main/lib/vercel-store.js
82509
+ var require_vercel_store = __commonJS({
82510
+ "../desktop/dist/main/lib/vercel-store.js"(exports2) {
82511
+ "use strict";
82512
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
82513
+ return mod && mod.__esModule ? mod : { "default": mod };
82514
+ };
82515
+ Object.defineProperty(exports2, "__esModule", { value: true });
82516
+ exports2.createBlobStore = createBlobStore2;
82517
+ var axios_1 = __importDefault(require_axios());
82518
+ async function createBlobStore2(args) {
82519
+ const name = (args.name || "sproutkit").slice(0, 70);
82520
+ const url = "https://api.vercel.com/storage/stores/blob" + (args.teamId ? `?teamId=${encodeURIComponent(args.teamId)}` : "");
82521
+ try {
82522
+ const res = await axios_1.default.post(url, { name }, {
82523
+ headers: {
82524
+ Authorization: `Bearer ${args.vercelToken}`,
82525
+ "Content-Type": "application/json"
82526
+ },
82527
+ timeout: 3e4
82528
+ });
82529
+ const store = res.data?.store ?? {};
82530
+ const storeId = store.id || store.storeId;
82531
+ return {
82532
+ ok: true,
82533
+ storeId,
82534
+ dashboardUrl: "https://vercel.com/dashboard/stores"
82535
+ };
82536
+ } catch (e) {
82537
+ const err = e;
82538
+ const status = err.response?.status;
82539
+ const msg = err.response?.data?.error?.message ?? err.message;
82540
+ if (status === 409 || /already|exists|conflict/i.test(msg)) {
82541
+ return { ok: false, alreadyExists: true, error: msg };
82542
+ }
82543
+ return { ok: false, error: msg };
82544
+ }
82545
+ }
82546
+ }
82547
+ });
82548
+
82508
82549
  // package.json
82509
82550
  var require_package = __commonJS({
82510
82551
  "package.json"(exports2, module2) {
82511
82552
  module2.exports = {
82512
82553
  name: "sproutkit-code",
82513
- version: "0.10.0",
82554
+ version: "0.11.0",
82514
82555
  description: "Sproutkit in your terminal \u2014 find leads, build sites, run outreach, all via chat.",
82515
82556
  bin: {
82516
82557
  sproutkit: "./dist/index.js"
@@ -82557,6 +82598,7 @@ var autoMode = require_auto_mode();
82557
82598
  var cms = require_cms_provision();
82558
82599
  var bookingPreset = require_booking_preset();
82559
82600
  var builder = require_builder();
82601
+ var vercelStore = require_vercel_store();
82560
82602
  var models = require_models();
82561
82603
  var llm = require_llm();
82562
82604
  var initDatabase = db.initDatabase;
@@ -82568,6 +82610,7 @@ var provisionCmsForLead = cms.provisionCmsForLead;
82568
82610
  var generatePreset = bookingPreset.generatePreset;
82569
82611
  var deployBookingOnly = builder.deployBookingOnly;
82570
82612
  var deployStandaloneBooking = builder.deployStandaloneBooking;
82613
+ var createBlobStore = vercelStore.createBlobStore;
82571
82614
  var refreshModels = models.refreshModels;
82572
82615
  var refreshIfStale = models.refreshIfStale;
82573
82616
  var listCachedModels = models.listCachedModels;
@@ -83029,6 +83072,25 @@ async function runOnboarding(force = false) {
83029
83072
  }
83030
83073
 
83031
83074
  // src/invoke-ipc.ts
83075
+ async function requireBlobToken(vercelToken, emit, leadId) {
83076
+ const existing = getSetting("blob_token");
83077
+ if (existing) return existing;
83078
+ emit("bookings:progress", { leadId, msg: "No Blob token yet \u2014 creating a Blob store for you\u2026" });
83079
+ const created = await createBlobStore({ vercelToken, name: "sproutkit" });
83080
+ if (created.ok) {
83081
+ throw new Error(
83082
+ "Created a Vercel Blob store for you \u2713 \u2014 one last one-time step: open " + (created.dashboardUrl || "https://vercel.com/dashboard/stores") + " , open the 'sproutkit' store, copy its BLOB_READ_WRITE_TOKEN, then run 'sproutkit setup' and paste it. You only do this once \u2014 it's reused for every booking site."
83083
+ );
83084
+ }
83085
+ if (created.alreadyExists) {
83086
+ throw new Error(
83087
+ "You already have a Blob store. Open https://vercel.com/dashboard/stores , copy its BLOB_READ_WRITE_TOKEN, and run 'sproutkit setup' to paste it (one-time \u2014 reused for all sites)."
83088
+ );
83089
+ }
83090
+ throw new Error(
83091
+ `Booking needs a Vercel Blob token and I couldn't auto-create a store (${created.error ?? "unknown"}). Create one at https://vercel.com/dashboard/stores (Create \u2192 Blob), copy BLOB_READ_WRITE_TOKEN, then 'sproutkit setup'.`
83092
+ );
83093
+ }
83032
83094
  function makeInvokeIpc(emit) {
83033
83095
  return async (channel, payload) => {
83034
83096
  if (channel === "auto:build:start") {
@@ -83080,11 +83142,10 @@ function makeInvokeIpc(emit) {
83080
83142
  if (!lead) throw new Error("Lead not found");
83081
83143
  const anthropicKey = getSetting("anthropic_key");
83082
83144
  const vercelToken = getSetting("vercel_token");
83083
- const blobToken = getSetting("blob_token");
83084
83145
  const resendKey = getSetting("resend_key");
83085
83146
  if (!anthropicKey) throw new Error("Anthropic API key not set");
83086
83147
  if (!vercelToken) throw new Error("Vercel token not set");
83087
- if (!blobToken) throw new Error("Booking sites need a Vercel Blob token (stores the form config & submissions). Add one with 'sproutkit setup' \u2014 create a Blob store at vercel.com, copy its read-write token.");
83148
+ const blobToken = await requireBlobToken(vercelToken, emit, p.leadId);
83088
83149
  emit("bookings:progress", { leadId: p.leadId, msg: "Designing the booking form\u2026" });
83089
83150
  const leadInfo = lead;
83090
83151
  const config = await generatePreset({
@@ -83122,10 +83183,9 @@ function makeInvokeIpc(emit) {
83122
83183
  const lead = db2.get("SELECT * FROM leads WHERE id = ?", [p.leadId]);
83123
83184
  if (!lead) throw new Error("Lead not found");
83124
83185
  const vercelToken = getSetting("vercel_token");
83125
- const blobToken = getSetting("blob_token");
83126
83186
  const resendKey = getSetting("resend_key");
83127
83187
  if (!vercelToken) throw new Error("Vercel token not set");
83128
- if (!blobToken) throw new Error("Booking sites need a Vercel Blob token (stores the form config & submissions). Add one with 'sproutkit setup' \u2014 create a Blob store at vercel.com, copy its read-write token.");
83188
+ const blobToken = await requireBlobToken(vercelToken, emit, p.leadId);
83129
83189
  emit("bookings:progress", { leadId: p.leadId, msg: "Designing the booking form\u2026" });
83130
83190
  const leadInfo = lead;
83131
83191
  const config = await generatePreset({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sproutkit-code",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
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"