@vibes.diy/api-svc 14.3.178 → 14.3.181

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 (50) hide show
  1. package/intern/attempt-backend-fetch.d.ts +2 -1
  2. package/intern/attempt-backend-fetch.js +7 -0
  3. package/intern/attempt-backend-fetch.js.map +1 -1
  4. package/intern/attempt-backend-onchange.d.ts +2 -1
  5. package/intern/attempt-backend-onchange.js +9 -2
  6. package/intern/attempt-backend-onchange.js.map +1 -1
  7. package/intern/attempt-backend-scheduled.d.ts +2 -1
  8. package/intern/attempt-backend-scheduled.js +7 -0
  9. package/intern/attempt-backend-scheduled.js.map +1 -1
  10. package/intern/backend-connections-callback.d.ts +2 -0
  11. package/intern/backend-connections-callback.js +5 -1
  12. package/intern/backend-connections-callback.js.map +1 -1
  13. package/intern/backend-do-addr.d.ts +3 -0
  14. package/intern/backend-do-addr.js +2 -0
  15. package/intern/backend-do-addr.js.map +1 -1
  16. package/intern/backend-stripe-callback.d.ts +13 -0
  17. package/intern/backend-stripe-callback.js +124 -0
  18. package/intern/backend-stripe-callback.js.map +1 -0
  19. package/intern/backend-stripe-op.d.ts +1 -0
  20. package/intern/backend-stripe-op.js +2 -0
  21. package/intern/backend-stripe-op.js.map +1 -0
  22. package/intern/connections-providers.d.ts +1 -0
  23. package/intern/connections-providers.js +22 -5
  24. package/intern/connections-providers.js.map +1 -1
  25. package/intern/stripe-connect-client.d.ts +34 -0
  26. package/intern/stripe-connect-client.js +79 -0
  27. package/intern/stripe-connect-client.js.map +1 -0
  28. package/intern/stripe-connect-policy.d.ts +21 -0
  29. package/intern/stripe-connect-policy.js +79 -0
  30. package/intern/stripe-connect-policy.js.map +1 -0
  31. package/intern/stripe-connect-store.d.ts +43 -0
  32. package/intern/stripe-connect-store.js +94 -0
  33. package/intern/stripe-connect-store.js.map +1 -0
  34. package/package.json +13 -13
  35. package/public/connection-availability.d.ts +1 -0
  36. package/public/connection-availability.js +1 -1
  37. package/public/connection-availability.js.map +1 -1
  38. package/public/connections-account-switch.d.ts +16 -0
  39. package/public/connections-account-switch.js +37 -0
  40. package/public/connections-account-switch.js.map +1 -0
  41. package/public/connections-callback.d.ts +4 -0
  42. package/public/connections-callback.js +48 -6
  43. package/public/connections-callback.js.map +1 -1
  44. package/public/connections-instagram-hint.html +18 -0
  45. package/public/connections-instagram-switch.html +32 -0
  46. package/public/github-templates.d.ts +1 -1
  47. package/public/github-templates.js.map +1 -1
  48. package/public/stripe-connect.d.ts +17 -0
  49. package/public/stripe-connect.js +207 -0
  50. package/public/stripe-connect.js.map +1 -0
@@ -0,0 +1,34 @@
1
+ export type StripeClientResult<T> = {
2
+ readonly ok: true;
3
+ readonly value: T;
4
+ } | {
5
+ readonly ok: false;
6
+ readonly status: number;
7
+ readonly message: string;
8
+ };
9
+ export declare function createConnectedAccount(input: {
10
+ readonly fetchImpl: typeof fetch;
11
+ readonly key: string;
12
+ readonly userId: string;
13
+ readonly mode: "test" | "live";
14
+ readonly replaces?: string;
15
+ }): Promise<StripeClientResult<{
16
+ readonly id: string;
17
+ }>>;
18
+ export declare function createOnboardingLink(input: {
19
+ readonly fetchImpl: typeof fetch;
20
+ readonly key: string;
21
+ readonly stripeAccountId: string;
22
+ readonly returnUrl: string;
23
+ readonly refreshUrl: string;
24
+ }): Promise<StripeClientResult<{
25
+ readonly url: string;
26
+ }>>;
27
+ export declare function readConnectedAccount(input: {
28
+ readonly fetchImpl: typeof fetch;
29
+ readonly key: string;
30
+ readonly stripeAccountId: string;
31
+ }): Promise<StripeClientResult<{
32
+ readonly id: string;
33
+ readonly chargesEnabled: boolean;
34
+ }>>;
@@ -0,0 +1,79 @@
1
+ import { exception2Result } from "@adviser/cement";
2
+ import { type } from "arktype";
3
+ import { lazyType } from "@vibes.diy/api-types/lazy-type";
4
+ import { STRIPE_ACCOUNTS_V2_VERSION, STRIPE_API_ORIGIN } from "./stripe-connect-policy.js";
5
+ const StripeError = lazyType(() => type({ "error?": { "message?": "string", "code?": "string" } }));
6
+ const CreatedAccount = lazyType(() => type({ id: "string" }));
7
+ const AccountLink = lazyType(() => type({ url: "string" }));
8
+ const AccountRead = lazyType(() => type({
9
+ id: "string",
10
+ "configuration?": {
11
+ "merchant?": {
12
+ "capabilities?": {
13
+ "card_payments?": { "status?": "string" },
14
+ },
15
+ },
16
+ },
17
+ }));
18
+ async function call(fetchImpl, key, method, path, body, idempotencyKey) {
19
+ const headers = {
20
+ authorization: `Bearer ${key}`,
21
+ "stripe-version": STRIPE_ACCOUNTS_V2_VERSION,
22
+ };
23
+ if (body !== undefined)
24
+ headers["content-type"] = "application/json";
25
+ if (idempotencyKey !== undefined)
26
+ headers["idempotency-key"] = idempotencyKey;
27
+ const rRes = await exception2Result(() => fetchImpl(`${STRIPE_API_ORIGIN}${path}`, { method, headers, body: body === undefined ? undefined : JSON.stringify(body) }));
28
+ if (rRes.isErr())
29
+ return { ok: false, status: 0, message: "stripe unreachable" };
30
+ const res = rRes.Ok();
31
+ const rJson = await exception2Result(() => res.json());
32
+ const json = rJson.isOk() ? rJson.Ok() : undefined;
33
+ if (res.ok === false) {
34
+ const parsed = StripeError(json);
35
+ const message = parsed instanceof type.errors ? `HTTP ${res.status}` : (parsed.error?.message ?? `HTTP ${res.status}`);
36
+ return { ok: false, status: res.status, message };
37
+ }
38
+ return { ok: true, value: json };
39
+ }
40
+ function narrow(r, validator) {
41
+ if (r.ok === false)
42
+ return r;
43
+ const v = validator(r.value);
44
+ if (v instanceof type.errors)
45
+ return { ok: false, status: 502, message: "unexpected stripe response" };
46
+ return { ok: true, value: v };
47
+ }
48
+ export async function createConnectedAccount(input) {
49
+ const r = await call(input.fetchImpl, input.key, "POST", "/v2/core/accounts", {
50
+ dashboard: "full",
51
+ defaults: { responsibilities: { fees_collector: "stripe", losses_collector: "stripe" } },
52
+ configuration: { merchant: { capabilities: { card_payments: { requested: true } } } },
53
+ metadata: { vibes_user_id: input.userId },
54
+ include: ["configuration.merchant"],
55
+ }, input.replaces === undefined
56
+ ? `vibes-connect-account:${input.userId}:${input.mode}`
57
+ : `vibes-connect-account:${input.userId}:${input.mode}:after:${input.replaces}`);
58
+ return narrow(r, (v) => CreatedAccount(v));
59
+ }
60
+ export async function createOnboardingLink(input) {
61
+ const r = await call(input.fetchImpl, input.key, "POST", "/v2/core/account_links", {
62
+ account: input.stripeAccountId,
63
+ use_case: {
64
+ type: "account_onboarding",
65
+ account_onboarding: { configurations: ["merchant"], return_url: input.returnUrl, refresh_url: input.refreshUrl },
66
+ },
67
+ }, undefined);
68
+ return narrow(r, (v) => AccountLink(v));
69
+ }
70
+ export async function readConnectedAccount(input) {
71
+ const r = await call(input.fetchImpl, input.key, "GET", `/v2/core/accounts/${encodeURIComponent(input.stripeAccountId)}?${new URLSearchParams([["include[]", "configuration.merchant"]]).toString()}`, undefined, undefined);
72
+ return narrow(r, (v) => {
73
+ const a = AccountRead(v);
74
+ if (a instanceof type.errors)
75
+ return a;
76
+ return { id: a.id, chargesEnabled: a.configuration?.merchant?.capabilities?.card_payments?.status === "active" };
77
+ });
78
+ }
79
+ //# sourceMappingURL=stripe-connect-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-connect-client.js","sourceRoot":"","sources":["../../jsr/intern/stripe-connect-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { CFEnv } from "@vibes.diy/api-types";
2
+ export type StripeConnectMode = "test" | "live";
3
+ export declare const STRIPE_CONNECT_MODES: readonly StripeConnectMode[];
4
+ export declare function isStripeConnectMode(v: unknown): v is StripeConnectMode;
5
+ export declare const STRIPE_API_ORIGIN = "https://api.stripe.com";
6
+ export declare const STRIPE_ACCOUNTS_V2_VERSION = "2026-09-30.endive";
7
+ export declare function stripeConnectKey(env: CFEnv, mode: StripeConnectMode): string | undefined;
8
+ export declare function stripeConnectAvailable(env: CFEnv, mode: StripeConnectMode): boolean;
9
+ interface StripeEndpoint {
10
+ readonly method: string;
11
+ readonly pattern: RegExp;
12
+ readonly probe: string;
13
+ }
14
+ export declare const STRIPE_CONNECT_ENDPOINTS: readonly StripeEndpoint[];
15
+ export declare function stripeConnectEndpointAllowed(pathname: string, method: string): boolean;
16
+ export declare function stripeBodyRoutesMoney(body: string | undefined): boolean;
17
+ export declare function stripeAccountAccessLost(status: number, body: string): boolean;
18
+ export declare const STRIPE_SAFE_RESPONSE_HEADERS: readonly string[];
19
+ export declare function stripePlatformKeyRefused(status: number): boolean;
20
+ export declare function stripeCallNeedsCharges(pathname: string, method: string): boolean;
21
+ export {};
@@ -0,0 +1,79 @@
1
+ import { publicRouteUrl } from "../public/connections-callback.js";
2
+ import { providerIsDisabled } from "../public/connection-availability.js";
3
+ export const STRIPE_CONNECT_MODES = ["test", "live"];
4
+ export function isStripeConnectMode(v) {
5
+ return v === "test" || v === "live";
6
+ }
7
+ const KEY_PREFIX = Object.freeze({
8
+ test: ["sk_test_", "rk_test_"],
9
+ live: ["sk_live_", "rk_live_"],
10
+ });
11
+ export const STRIPE_API_ORIGIN = "https://api.stripe.com";
12
+ export const STRIPE_ACCOUNTS_V2_VERSION = "2026-09-30.endive";
13
+ function stripeDisabled(env) {
14
+ return providerIsDisabled(env, "stripe");
15
+ }
16
+ function keySlot(env, mode) {
17
+ return (mode === "test" ? env.VIBES_STRIPE_CONNECT_SECRET_KEY_TEST : env.VIBES_STRIPE_CONNECT_SECRET_KEY_LIVE) ?? "";
18
+ }
19
+ export function stripeConnectKey(env, mode) {
20
+ const key = keySlot(env, mode).trim();
21
+ if (key.length === 0)
22
+ return undefined;
23
+ if (!KEY_PREFIX[mode].some((p) => key.startsWith(p)))
24
+ return undefined;
25
+ return key;
26
+ }
27
+ export function stripeConnectAvailable(env, mode) {
28
+ if (stripeDisabled(env))
29
+ return false;
30
+ if (stripeConnectKey(env, mode) === undefined)
31
+ return false;
32
+ return publicRouteUrl(env, "/stripe-connect/return") !== undefined;
33
+ }
34
+ const SESSION_ID = "cs_(?:test|live)_[A-Za-z0-9]{1,250}";
35
+ const SUBSCRIPTION_ID = "sub_[A-Za-z0-9]{1,250}";
36
+ export const STRIPE_CONNECT_ENDPOINTS = Object.freeze([
37
+ { method: "POST", pattern: /^\/v1\/checkout\/sessions$/, probe: "/v1/checkout/sessions" },
38
+ { method: "GET", pattern: new RegExp(`^/v1/checkout/sessions/${SESSION_ID}$`), probe: "/v1/checkout/sessions/cs_test_a1" },
39
+ {
40
+ method: "POST",
41
+ pattern: new RegExp(`^/v1/checkout/sessions/${SESSION_ID}/expire$`),
42
+ probe: "/v1/checkout/sessions/cs_test_a1/expire",
43
+ },
44
+ { method: "GET", pattern: new RegExp(`^/v1/subscriptions/${SUBSCRIPTION_ID}$`), probe: "/v1/subscriptions/sub_1MowQV" },
45
+ { method: "GET", pattern: /^\/v1\/billing_portal\/configurations$/, probe: "/v1/billing_portal/configurations" },
46
+ { method: "POST", pattern: /^\/v1\/billing_portal\/sessions$/, probe: "/v1/billing_portal/sessions" },
47
+ ]);
48
+ export function stripeConnectEndpointAllowed(pathname, method) {
49
+ return STRIPE_CONNECT_ENDPOINTS.some((e) => e.method === method && e.pattern.test(pathname));
50
+ }
51
+ const MONEY_ROUTING_FIELDS = [/application_fee/, /transfer_data/, /^(.*\[)?on_behalf_of\]?$/, /transfer_group/];
52
+ export function stripeBodyRoutesMoney(body) {
53
+ if (body === undefined || body.length === 0)
54
+ return false;
55
+ const params = new URLSearchParams(body);
56
+ for (const name of params.keys()) {
57
+ if (MONEY_ROUTING_FIELDS.some((r) => r.test(name)))
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+ export function stripeAccountAccessLost(status, body) {
63
+ if (status !== 403)
64
+ return false;
65
+ return /"code"\s*:\s*"account_invalid"/.test(body) || /does not have access to account/i.test(body);
66
+ }
67
+ export const STRIPE_SAFE_RESPONSE_HEADERS = Object.freeze([
68
+ "content-type",
69
+ "request-id",
70
+ "idempotency-key",
71
+ "stripe-version",
72
+ ]);
73
+ export function stripePlatformKeyRefused(status) {
74
+ return status === 401;
75
+ }
76
+ export function stripeCallNeedsCharges(pathname, method) {
77
+ return method === "POST" && pathname === "/v1/checkout/sessions";
78
+ }
79
+ //# sourceMappingURL=stripe-connect-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-connect-policy.js","sourceRoot":"","sources":["../../jsr/intern/stripe-connect-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { VibesApiSQLCtx } from "../types.js";
2
+ import type { StripeConnectMode } from "./stripe-connect-policy.js";
3
+ export type StripeConnectSql = Pick<VibesApiSQLCtx["sql"], "db" | "tables">;
4
+ export type StripeConnectAccountStatus = "onboarding" | "ready" | "disconnected";
5
+ export interface StripeConnectAccountRow {
6
+ readonly userId: string;
7
+ readonly mode: StripeConnectMode;
8
+ readonly stripeAccountId: string;
9
+ readonly chargesEnabled: boolean;
10
+ readonly status: StripeConnectAccountStatus;
11
+ readonly updatedMs: number;
12
+ }
13
+ export declare function readStripeConnectAccount(sql: StripeConnectSql, userId: string, mode: StripeConnectMode): Promise<StripeConnectAccountRow | undefined>;
14
+ export declare function replaceStripeConnectAccount(sql: StripeConnectSql, input: {
15
+ readonly userId: string;
16
+ readonly mode: StripeConnectMode;
17
+ readonly previousAccountId: string;
18
+ readonly stripeAccountId: string;
19
+ readonly nowMs: number;
20
+ }): Promise<void>;
21
+ export declare const STRIPE_ONBOARDING_RECHECK_MS: number;
22
+ export declare function reconcileOnboardingRow(sql: StripeConnectSql, row: StripeConnectAccountRow, input: {
23
+ readonly key: string;
24
+ readonly fetchImpl: typeof fetch;
25
+ readonly nowMs: number;
26
+ readonly force?: boolean;
27
+ }): Promise<StripeConnectAccountRow>;
28
+ export declare function insertStripeConnectAccount(sql: StripeConnectSql, input: {
29
+ readonly userId: string;
30
+ readonly mode: StripeConnectMode;
31
+ readonly stripeAccountId: string;
32
+ readonly nowMs: number;
33
+ }): Promise<void>;
34
+ export declare function updateStripeConnectAccountState(sql: StripeConnectSql, input: {
35
+ readonly userId: string;
36
+ readonly mode: StripeConnectMode;
37
+ readonly stripeAccountId: string;
38
+ readonly chargesEnabled: boolean;
39
+ readonly status: StripeConnectAccountStatus;
40
+ readonly nowMs: number;
41
+ readonly expectedStatus?: StripeConnectAccountStatus;
42
+ }): Promise<void>;
43
+ export declare function userIdForHandle(sql: StripeConnectSql, handle: string): Promise<string | undefined>;
@@ -0,0 +1,94 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { readConnectedAccount } from "./stripe-connect-client.js";
3
+ function toStatus(v) {
4
+ return v === "ready" || v === "disconnected" ? v : "onboarding";
5
+ }
6
+ export async function readStripeConnectAccount(sql, userId, mode) {
7
+ const t = sql.tables.stripeConnectAccounts;
8
+ const row = await sql.db
9
+ .select({ stripeAccountId: t.stripeAccountId, chargesEnabled: t.chargesEnabled, status: t.status, updated: t.updated })
10
+ .from(t)
11
+ .where(and(eq(t.userId, userId), eq(t.mode, mode)))
12
+ .limit(1)
13
+ .then((rows) => rows[0]);
14
+ if (row === undefined)
15
+ return undefined;
16
+ return {
17
+ userId,
18
+ mode,
19
+ stripeAccountId: row.stripeAccountId,
20
+ chargesEnabled: row.chargesEnabled === 1,
21
+ status: toStatus(row.status),
22
+ updatedMs: Number.isNaN(Date.parse(row.updated)) ? 0 : Date.parse(row.updated),
23
+ };
24
+ }
25
+ export async function replaceStripeConnectAccount(sql, input) {
26
+ const t = sql.tables.stripeConnectAccounts;
27
+ await sql.db
28
+ .update(t)
29
+ .set({
30
+ stripeAccountId: input.stripeAccountId,
31
+ chargesEnabled: 0,
32
+ status: "onboarding",
33
+ updated: new Date(input.nowMs).toISOString(),
34
+ })
35
+ .where(and(eq(t.userId, input.userId), eq(t.mode, input.mode), eq(t.stripeAccountId, input.previousAccountId), eq(t.status, "disconnected")));
36
+ }
37
+ export const STRIPE_ONBOARDING_RECHECK_MS = 60 * 1000;
38
+ export async function reconcileOnboardingRow(sql, row, input) {
39
+ if (row.status !== "onboarding")
40
+ return row;
41
+ if (input.force !== true && input.nowMs - row.updatedMs < STRIPE_ONBOARDING_RECHECK_MS)
42
+ return row;
43
+ const read = await readConnectedAccount({ fetchImpl: input.fetchImpl, key: input.key, stripeAccountId: row.stripeAccountId });
44
+ if (read.ok === false)
45
+ return row;
46
+ const status = read.value.chargesEnabled ? "ready" : "onboarding";
47
+ await updateStripeConnectAccountState(sql, {
48
+ userId: row.userId,
49
+ mode: row.mode,
50
+ stripeAccountId: row.stripeAccountId,
51
+ chargesEnabled: read.value.chargesEnabled,
52
+ status,
53
+ nowMs: input.nowMs,
54
+ expectedStatus: "onboarding",
55
+ });
56
+ return (await readStripeConnectAccount(sql, row.userId, row.mode)) ?? row;
57
+ }
58
+ export async function insertStripeConnectAccount(sql, input) {
59
+ const t = sql.tables.stripeConnectAccounts;
60
+ const now = new Date(input.nowMs).toISOString();
61
+ await sql.db
62
+ .insert(t)
63
+ .values({
64
+ userId: input.userId,
65
+ mode: input.mode,
66
+ stripeAccountId: input.stripeAccountId,
67
+ chargesEnabled: 0,
68
+ status: "onboarding",
69
+ created: now,
70
+ updated: now,
71
+ })
72
+ .onConflictDoNothing();
73
+ }
74
+ export async function updateStripeConnectAccountState(sql, input) {
75
+ const t = sql.tables.stripeConnectAccounts;
76
+ const match = and(eq(t.userId, input.userId), eq(t.mode, input.mode), eq(t.stripeAccountId, input.stripeAccountId));
77
+ await sql.db
78
+ .update(t)
79
+ .set({ chargesEnabled: input.chargesEnabled ? 1 : 0, status: input.status, updated: new Date(input.nowMs).toISOString() })
80
+ .where(input.expectedStatus === undefined ? match : and(match, eq(t.status, input.expectedStatus)));
81
+ }
82
+ export async function userIdForHandle(sql, handle) {
83
+ if (handle.length === 0)
84
+ return undefined;
85
+ const t_hb = sql.tables.handleBinding;
86
+ const row = await sql.db
87
+ .select({ userId: t_hb.userId })
88
+ .from(t_hb)
89
+ .where(eq(t_hb.handle, handle))
90
+ .limit(1)
91
+ .then((rows) => rows[0]);
92
+ return row?.userId;
93
+ }
94
+ //# sourceMappingURL=stripe-connect-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-connect-store.js","sourceRoot":"","sources":["../../jsr/intern/stripe-connect-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibes.diy/api-svc",
3
- "version": "14.3.178",
3
+ "version": "14.3.181",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -41,21 +41,21 @@
41
41
  "@neondatabase/serverless": "~1.2.0",
42
42
  "@noble/hashes": "~2.4.0",
43
43
  "@shadcn/lint": "~0.2.0",
44
- "@vibes.diy/api-pkg": "14.3.178",
45
- "@vibes.diy/api-sql": "14.3.178",
46
- "@vibes.diy/api-types": "14.3.178",
47
- "@vibes.diy/call-ai-v2": "14.3.178",
48
- "@vibes.diy/identity": "14.3.178",
49
- "@vibes.diy/look": "14.3.178",
50
- "@vibes.diy/pouf": "14.3.178",
51
- "@vibes.diy/prompts": "14.3.178",
52
- "@vibes.diy/vibe-db-explorer": "14.3.178",
53
- "@vibes.diy/vibe-runtime": "14.3.178",
54
- "@vibes.diy/vibe-types": "14.3.178",
44
+ "@vibes.diy/api-pkg": "14.3.181",
45
+ "@vibes.diy/api-sql": "14.3.181",
46
+ "@vibes.diy/api-types": "14.3.181",
47
+ "@vibes.diy/call-ai-v2": "14.3.181",
48
+ "@vibes.diy/identity": "14.3.181",
49
+ "@vibes.diy/look": "14.3.181",
50
+ "@vibes.diy/pouf": "14.3.181",
51
+ "@vibes.diy/prompts": "14.3.181",
52
+ "@vibes.diy/vibe-db-explorer": "14.3.181",
53
+ "@vibes.diy/vibe-runtime": "14.3.181",
54
+ "@vibes.diy/vibe-types": "14.3.181",
55
55
  "acorn": "~8.19.0",
56
56
  "acorn-jsx": "~5.3.2",
57
57
  "arktype": "~2.2.8",
58
- "call-ai": "14.3.178",
58
+ "call-ai": "14.3.181",
59
59
  "charwise": "~3.0.1",
60
60
  "cookie": "~2.0.1",
61
61
  "csv-parse": "~7.0.3",
@@ -1,2 +1,3 @@
1
1
  import { CFEnv } from "@vibes.diy/api-types";
2
+ export declare function providerIsDisabled(env: CFEnv, provider: string): boolean;
2
3
  export declare function connectionProviderAvailable(env: CFEnv, provider: string): boolean;
@@ -5,7 +5,7 @@ const DISABLED_PROVIDERS_ENV_VAR = "CONNECTIONS_DISABLED_PROVIDERS";
5
5
  function envValue(env, name) {
6
6
  return env[name] ?? "";
7
7
  }
8
- function providerIsDisabled(env, provider) {
8
+ export function providerIsDisabled(env, provider) {
9
9
  const raw = envValue(env, DISABLED_PROVIDERS_ENV_VAR);
10
10
  if (raw.length === 0)
11
11
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"connection-availability.js","sourceRoot":"","sources":["../../jsr/public/connection-availability.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAoB/D,MAAM,0BAA0B,GAAG,gCAAgC,CAAC;AAEpE,SAAS,QAAQ,CAAC,GAAU,EAAE,IAAY;IACxC,OAAQ,GAAqD,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5E,CAAC;AAWD,SAAS,kBAAkB,CAAC,GAAU,EAAE,QAAgB;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAC1C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACnC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAkBD,MAAM,UAAU,2BAA2B,CAAC,GAAU,EAAE,QAAgB;IACtE,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1E,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"connection-availability.js","sourceRoot":"","sources":["../../jsr/public/connection-availability.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAoB/D,MAAM,0BAA0B,GAAG,gCAAgC,CAAC;AAEpE,SAAS,QAAQ,CAAC,GAAU,EAAE,IAAY;IACxC,OAAQ,GAAqD,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5E,CAAC;AAWD,MAAM,UAAU,kBAAkB,CAAC,GAAU,EAAE,QAAgB;IAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAC1C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACnC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAkBD,MAAM,UAAU,2BAA2B,CAAC,GAAU,EAAE,QAAgB;IACtE,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1E,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type GithubInstallTemplateLoader } from "./github-templates.js";
2
+ export declare function isPersonalAccountType(accountType: string | undefined): boolean;
3
+ export declare function accountSwitchPage(input: {
4
+ readonly provider: string;
5
+ readonly owner: string;
6
+ readonly slug: string;
7
+ readonly status: number;
8
+ readonly templates: GithubInstallTemplateLoader | undefined;
9
+ }): Promise<Response>;
10
+ export declare function refusalWithAccountHint(input: {
11
+ readonly provider: string;
12
+ readonly title: string;
13
+ readonly message: string;
14
+ readonly status: number;
15
+ readonly templates: GithubInstallTemplateLoader | undefined;
16
+ }): Promise<Response>;
@@ -0,0 +1,37 @@
1
+ import { CONNECTION_PROVIDER_VOCABULARY } from "@vibes.diy/vibe-runtime/connection-providers.js";
2
+ import { htmlPage, templatePage } from "./github-templates.js";
3
+ const ACCOUNT_SWITCH_PAGES = Object.freeze({
4
+ instagram: Object.freeze({
5
+ switchPage: "connections-instagram-switch.html",
6
+ hintPage: "connections-instagram-hint.html",
7
+ }),
8
+ });
9
+ function pagesFor(provider) {
10
+ return Object.prototype.hasOwnProperty.call(ACCOUNT_SWITCH_PAGES, provider) ? ACCOUNT_SWITCH_PAGES[provider] : undefined;
11
+ }
12
+ export function isPersonalAccountType(accountType) {
13
+ return typeof accountType === "string" && accountType.trim().toUpperCase() === "PERSONAL";
14
+ }
15
+ function howToUrl(provider) {
16
+ return CONNECTION_PROVIDER_VOCABULARY[provider]?.accountRequirement?.howToUrl ?? "https://good.vibes.diy/docs/";
17
+ }
18
+ export async function accountSwitchPage(input) {
19
+ const pages = pagesFor(input.provider);
20
+ const label = CONNECTION_PROVIDER_VOCABULARY[input.provider]?.label ?? input.provider;
21
+ if (pages === undefined || input.templates === undefined) {
22
+ return htmlPage(`Connect ${label} with a Creator account`, `${label} connects Creator and Business accounts. Switch yours for free in the ${label} app under Settings, then ` +
23
+ "press the app's Connect button again.", input.status);
24
+ }
25
+ return templatePage(input.templates, { name: pages.switchPage, status: input.status }, {
26
+ vibe: `${input.owner}/${input.slug}`,
27
+ vibeHref: `/vibe/${encodeURIComponent(input.owner)}/${encodeURIComponent(input.slug)}`,
28
+ howToUrl: howToUrl(input.provider),
29
+ });
30
+ }
31
+ export async function refusalWithAccountHint(input) {
32
+ const pages = pagesFor(input.provider);
33
+ if (pages === undefined || input.templates === undefined)
34
+ return htmlPage(input.title, input.message, input.status);
35
+ return templatePage(input.templates, { name: pages.hintPage, status: input.status }, { title: input.title, message: input.message, howToUrl: howToUrl(input.provider) });
36
+ }
37
+ //# sourceMappingURL=connections-account-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections-account-switch.js","sourceRoot":"","sources":["../../jsr/public/connections-account-switch.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EAAgE,QAAQ,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAU7H,MAAM,oBAAoB,GAAiE,MAAM,CAAC,MAAM,CAAC;IACvG,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;QACvB,UAAU,EAAE,mCAAmC;QAC/C,QAAQ,EAAE,iCAAiC;KAC5C,CAAC;CACH,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,QAAgB;IAChC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3H,CAAC;AAWD,MAAM,UAAU,qBAAqB,CAAC,WAA+B;IACnE,OAAO,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC;AAC5F,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAChC,OAAO,8BAA8B,CAAC,QAAQ,CAAC,EAAE,kBAAkB,EAAE,QAAQ,IAAI,8BAA8B,CAAC;AAClH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAMvC;IACC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,8BAA8B,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC;IACtF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,QAAQ,CACb,WAAW,KAAK,yBAAyB,EACzC,GAAG,KAAK,yEAAyE,KAAK,4BAA4B;YAChH,uCAAuC,EACzC,KAAK,CAAC,MAAM,CACb,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CACjB,KAAK,CAAC,SAAS,EACf,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAChD;QACE,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;QACpC,QAAQ,EAAE,SAAS,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACtF,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;KACnC,CACF,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAM5C;IACC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpH,OAAO,YAAY,CACjB,KAAK,CAAC,SAAS,EACf,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAC9C,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CACnF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { CFEnv } from "@vibes.diy/api-types";
2
2
  import { ConnectionProvider } from "../intern/connections-providers.js";
3
+ import type { GithubInstallTemplateLoader } from "./github-templates.js";
3
4
  import { GithubSetupSql, type VerifySessionToken } from "./github-setup.js";
4
5
  export interface ConnectExchangeResult {
5
6
  readonly accessToken: string;
@@ -9,6 +10,7 @@ export interface ConnectExchangeResult {
9
10
  export interface ConnectIdentity {
10
11
  readonly accountLabel: string;
11
12
  readonly accountId: string;
13
+ readonly accountType?: string;
12
14
  }
13
15
  export declare function connectCallbackUrl(env: CFEnv, provider: ConnectionProvider): string | undefined;
14
16
  export declare function publicRouteUrl(env: CFEnv, pathname: string): string | undefined;
@@ -16,6 +18,7 @@ export declare function runConnectCallback(input: {
16
18
  readonly env: CFEnv;
17
19
  readonly deps: {
18
20
  readonly sql?: GithubSetupSql;
21
+ readonly templates?: GithubInstallTemplateLoader;
19
22
  };
20
23
  readonly state: string;
21
24
  readonly code: string;
@@ -26,6 +29,7 @@ export declare function runConnectCallback(input: {
26
29
  export interface ConnectionsCallbackDeps {
27
30
  readonly verifySessionToken: VerifySessionToken;
28
31
  readonly sql?: GithubSetupSql;
32
+ readonly templates?: GithubInstallTemplateLoader;
29
33
  readonly fetchImpl?: typeof fetch;
30
34
  readonly nowMs?: number;
31
35
  }