@brokr/sdk 1.0.0 → 2.1.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.
- package/dist/account.js +34 -0
- package/dist/account.mjs +7 -0
- package/dist/auth.js +628 -114
- package/dist/auth.mjs +611 -111
- package/dist/chat.js +34 -0
- package/dist/chat.mjs +7 -0
- package/dist/events.js +64 -0
- package/dist/events.mjs +37 -0
- package/dist/feature.js +6304 -0
- package/dist/feature.mjs +6278 -0
- package/dist/files.js +428 -0
- package/dist/files.mjs +408 -0
- package/dist/index.d.ts +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4069 -454
- package/dist/index.mjs +4040 -448
- package/dist/logs.js +148 -0
- package/dist/logs.mjs +124 -0
- package/dist/management.js +14 -13
- package/dist/management.mjs +14 -13
- package/dist/next.js +2725 -0
- package/dist/next.mjs +2710 -0
- package/dist/notifications.js +140 -0
- package/dist/notifications.mjs +110 -0
- package/dist/payments.js +32 -0
- package/dist/payments.mjs +7 -0
- package/dist/react-notifications.js +299 -0
- package/dist/react-notifications.mjs +267 -0
- package/dist/react-styles.js +2756 -0
- package/dist/react-styles.mjs +2720 -0
- package/dist/react-theme.js +4196 -0
- package/dist/react-theme.mjs +4172 -0
- package/dist/react.js +8591 -209
- package/dist/react.mjs +8571 -183
- package/dist/runtime.js +2113 -385
- package/dist/runtime.mjs +2085 -397
- package/dist/src/account/config.d.ts +42 -0
- package/dist/src/account/config.d.ts.map +1 -0
- package/dist/src/account/index.d.ts +3 -0
- package/dist/src/account/index.d.ts.map +1 -0
- package/dist/src/ai/client.d.ts +58 -0
- package/dist/src/ai/client.d.ts.map +1 -0
- package/dist/src/ai/conversation-title.d.ts +13 -0
- package/dist/src/ai/conversation-title.d.ts.map +1 -0
- package/dist/src/ai/types.d.ts +81 -0
- package/dist/src/ai/types.d.ts.map +1 -0
- package/dist/src/auth.d.ts +133 -20
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/chat/config.d.ts +61 -0
- package/dist/src/chat/config.d.ts.map +1 -0
- package/dist/src/chat/index.d.ts +3 -0
- package/dist/src/chat/index.d.ts.map +1 -0
- package/dist/src/chat/sse-parser.d.ts +44 -0
- package/dist/src/chat/sse-parser.d.ts.map +1 -0
- package/dist/src/dev-console.d.ts +18 -0
- package/dist/src/dev-console.d.ts.map +1 -0
- package/dist/src/email/client.d.ts +33 -0
- package/dist/src/email/client.d.ts.map +1 -0
- package/dist/src/email/templates.d.ts +15 -0
- package/dist/src/email/templates.d.ts.map +1 -0
- package/dist/src/email/types.d.ts +35 -0
- package/dist/src/email/types.d.ts.map +1 -0
- package/dist/src/env-detect.d.ts +25 -0
- package/dist/src/env-detect.d.ts.map +1 -0
- package/dist/src/errors.d.ts +53 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/events/client.d.ts +25 -0
- package/dist/src/events/client.d.ts.map +1 -0
- package/dist/src/events/index.d.ts +9 -0
- package/dist/src/events/index.d.ts.map +1 -0
- package/dist/src/events/types.d.ts +10 -0
- package/dist/src/events/types.d.ts.map +1 -0
- package/dist/src/feature/canonical.d.ts +33 -0
- package/dist/src/feature/canonical.d.ts.map +1 -0
- package/dist/src/feature/create-feature.d.ts +33 -0
- package/dist/src/feature/create-feature.d.ts.map +1 -0
- package/dist/src/feature/db.d.ts +16 -0
- package/dist/src/feature/db.d.ts.map +1 -0
- package/dist/src/feature/handlers.d.ts +28 -0
- package/dist/src/feature/handlers.d.ts.map +1 -0
- package/dist/src/feature/index.d.ts +21 -0
- package/dist/src/feature/index.d.ts.map +1 -0
- package/dist/src/feature/manifest.d.ts +173 -0
- package/dist/src/feature/manifest.d.ts.map +1 -0
- package/dist/src/feature/mapping.d.ts +18 -0
- package/dist/src/feature/mapping.d.ts.map +1 -0
- package/dist/src/feature/runtime.d.ts +45 -0
- package/dist/src/feature/runtime.d.ts.map +1 -0
- package/dist/src/feature/types.d.ts +65 -0
- package/dist/src/feature/types.d.ts.map +1 -0
- package/dist/src/files/client.d.ts +28 -0
- package/dist/src/files/client.d.ts.map +1 -0
- package/dist/src/files/types.d.ts +28 -0
- package/dist/src/files/types.d.ts.map +1 -0
- package/dist/src/fix-registry.d.ts +8 -0
- package/dist/src/fix-registry.d.ts.map +1 -0
- package/dist/src/gateway.d.ts +32 -0
- package/dist/src/gateway.d.ts.map +1 -0
- package/dist/src/logs/capture.d.ts +56 -0
- package/dist/src/logs/capture.d.ts.map +1 -0
- package/dist/src/logs/index.d.ts +2 -0
- package/dist/src/logs/index.d.ts.map +1 -0
- package/dist/src/management.d.ts +1 -1
- package/dist/src/management.d.ts.map +1 -1
- package/dist/src/models.d.ts +32 -0
- package/dist/src/models.d.ts.map +1 -0
- package/dist/src/next/auth.d.ts +54 -0
- package/dist/src/next/auth.d.ts.map +1 -0
- package/dist/src/next/chat.d.ts +31 -0
- package/dist/src/next/chat.d.ts.map +1 -0
- package/dist/src/next/index.d.ts +14 -0
- package/dist/src/next/index.d.ts.map +1 -0
- package/dist/src/next/notifications.d.ts +67 -0
- package/dist/src/next/notifications.d.ts.map +1 -0
- package/dist/src/notifications/built-ins.d.ts +9 -0
- package/dist/src/notifications/built-ins.d.ts.map +1 -0
- package/dist/src/notifications/client.d.ts +38 -0
- package/dist/src/notifications/client.d.ts.map +1 -0
- package/dist/src/notifications/config.d.ts +71 -0
- package/dist/src/notifications/config.d.ts.map +1 -0
- package/dist/src/notifications/index.d.ts +6 -0
- package/dist/src/notifications/index.d.ts.map +1 -0
- package/dist/src/notifications/registry.d.ts +67 -0
- package/dist/src/notifications/registry.d.ts.map +1 -0
- package/dist/src/notifications/types.d.ts +48 -0
- package/dist/src/notifications/types.d.ts.map +1 -0
- package/dist/src/payments/client.d.ts +64 -0
- package/dist/src/payments/client.d.ts.map +1 -0
- package/dist/src/payments/config.d.ts +46 -0
- package/dist/src/payments/config.d.ts.map +1 -0
- package/dist/src/payments/entitlements.d.ts +48 -0
- package/dist/src/payments/entitlements.d.ts.map +1 -0
- package/dist/src/payments/types.d.ts +135 -0
- package/dist/src/payments/types.d.ts.map +1 -0
- package/dist/src/react/BrokrErrorBoundary.d.ts +23 -0
- package/dist/src/react/BrokrErrorBoundary.d.ts.map +1 -0
- package/dist/src/react/account/AccountPanel.d.ts +12 -0
- package/dist/src/react/account/AccountPanel.d.ts.map +1 -0
- package/dist/src/react/account/Avatar.d.ts +11 -0
- package/dist/src/react/account/Avatar.d.ts.map +1 -0
- package/dist/src/react/account/ProfilePhotoButton.d.ts +7 -0
- package/dist/src/react/account/ProfilePhotoButton.d.ts.map +1 -0
- package/dist/src/react/account/UserButton.d.ts +7 -0
- package/dist/src/react/account/UserButton.d.ts.map +1 -0
- package/dist/src/react/auth-pages/AuthPageShell.d.ts +9 -0
- package/dist/src/react/auth-pages/AuthPageShell.d.ts.map +1 -0
- package/dist/src/react/auth-pages/SignInPage.d.ts +9 -0
- package/dist/src/react/auth-pages/SignInPage.d.ts.map +1 -0
- package/dist/src/react/auth-pages/SignUpPage.d.ts +8 -0
- package/dist/src/react/auth-pages/SignUpPage.d.ts.map +1 -0
- package/dist/src/react/auth.d.ts +1 -49
- package/dist/src/react/auth.d.ts.map +1 -1
- package/dist/src/react/chat/AIChat.d.ts +4 -0
- package/dist/src/react/chat/AIChat.d.ts.map +1 -0
- package/dist/src/react/chat/ChatContext.d.ts +76 -0
- package/dist/src/react/chat/ChatContext.d.ts.map +1 -0
- package/dist/src/react/chat/ChatInput.d.ts +3 -0
- package/dist/src/react/chat/ChatInput.d.ts.map +1 -0
- package/dist/src/react/chat/MarkdownRenderer.d.ts +5 -0
- package/dist/src/react/chat/MarkdownRenderer.d.ts.map +1 -0
- package/dist/src/react/chat/MessageBubble.d.ts +14 -0
- package/dist/src/react/chat/MessageBubble.d.ts.map +1 -0
- package/dist/src/react/chat/MessagePane.d.ts +10 -0
- package/dist/src/react/chat/MessagePane.d.ts.map +1 -0
- package/dist/src/react/chat/ModelSelector.d.ts +13 -0
- package/dist/src/react/chat/ModelSelector.d.ts.map +1 -0
- package/dist/src/react/chat/ThreadSidebar.d.ts +3 -0
- package/dist/src/react/chat/ThreadSidebar.d.ts.map +1 -0
- package/dist/src/react/chat/index.d.ts +5 -0
- package/dist/src/react/chat/index.d.ts.map +1 -0
- package/dist/src/react/chat/token-limit.d.ts +14 -0
- package/dist/src/react/chat/token-limit.d.ts.map +1 -0
- package/dist/src/react/chat/types.d.ts +65 -0
- package/dist/src/react/chat/types.d.ts.map +1 -0
- package/dist/src/react/chat/useChat.d.ts +57 -0
- package/dist/src/react/chat/useChat.d.ts.map +1 -0
- package/dist/src/react/composites/FabAI.d.ts +15 -0
- package/dist/src/react/composites/FabAI.d.ts.map +1 -0
- package/dist/src/react/composites/FeedbackWidget.d.ts +10 -0
- package/dist/src/react/composites/FeedbackWidget.d.ts.map +1 -0
- package/dist/src/react/composites/SmartUpload.d.ts +12 -0
- package/dist/src/react/composites/SmartUpload.d.ts.map +1 -0
- package/dist/src/react/config.d.ts +23 -0
- package/dist/src/react/config.d.ts.map +1 -0
- package/dist/src/react/context.d.ts +4 -0
- package/dist/src/react/context.d.ts.map +1 -0
- package/dist/src/react/css/account.d.ts +2 -0
- package/dist/src/react/css/account.d.ts.map +1 -0
- package/dist/src/react/css/animations.d.ts +2 -0
- package/dist/src/react/css/animations.d.ts.map +1 -0
- package/dist/src/react/css/auth.d.ts +2 -0
- package/dist/src/react/css/auth.d.ts.map +1 -0
- package/dist/src/react/css/chat-extras.d.ts +2 -0
- package/dist/src/react/css/chat-extras.d.ts.map +1 -0
- package/dist/src/react/css/chat.d.ts +2 -0
- package/dist/src/react/css/chat.d.ts.map +1 -0
- package/dist/src/react/css/composites.d.ts +2 -0
- package/dist/src/react/css/composites.d.ts.map +1 -0
- package/dist/src/react/css/gates.d.ts +2 -0
- package/dist/src/react/css/gates.d.ts.map +1 -0
- package/dist/src/react/css/index.d.ts +3 -0
- package/dist/src/react/css/index.d.ts.map +1 -0
- package/dist/src/react/css/markdown.d.ts +2 -0
- package/dist/src/react/css/markdown.d.ts.map +1 -0
- package/dist/src/react/css/notifications.d.ts +2 -0
- package/dist/src/react/css/notifications.d.ts.map +1 -0
- package/dist/src/react/css/primitives.d.ts +2 -0
- package/dist/src/react/css/primitives.d.ts.map +1 -0
- package/dist/src/react/css/reset.d.ts +2 -0
- package/dist/src/react/css/reset.d.ts.map +1 -0
- package/dist/src/react/css/responsive.d.ts +2 -0
- package/dist/src/react/css/responsive.d.ts.map +1 -0
- package/dist/src/react/css/skeleton.d.ts +2 -0
- package/dist/src/react/css/skeleton.d.ts.map +1 -0
- package/dist/src/react/css/tokens.d.ts +2 -0
- package/dist/src/react/css/tokens.d.ts.map +1 -0
- package/dist/src/react/gates/AuthWall.d.ts +7 -0
- package/dist/src/react/gates/AuthWall.d.ts.map +1 -0
- package/dist/src/react/gates/BillingBoundary.d.ts +4 -0
- package/dist/src/react/gates/BillingBoundary.d.ts.map +1 -0
- package/dist/src/react/gates/Gate.d.ts +9 -0
- package/dist/src/react/gates/Gate.d.ts.map +1 -0
- package/dist/src/react/gates/RequirePlan.d.ts +4 -0
- package/dist/src/react/gates/RequirePlan.d.ts.map +1 -0
- package/dist/src/react/gates/RequireUser.d.ts +4 -0
- package/dist/src/react/gates/RequireUser.d.ts.map +1 -0
- package/dist/src/react/gates/UsageGate.d.ts +4 -0
- package/dist/src/react/gates/UsageGate.d.ts.map +1 -0
- package/dist/src/react/helpers.d.ts +7 -0
- package/dist/src/react/helpers.d.ts.map +1 -0
- package/dist/src/react/hooks/use-theme.d.ts +15 -0
- package/dist/src/react/hooks/use-theme.d.ts.map +1 -0
- package/dist/src/react/hooks/use-user.d.ts +12 -0
- package/dist/src/react/hooks/use-user.d.ts.map +1 -0
- package/dist/src/react/icons.d.ts +26 -0
- package/dist/src/react/icons.d.ts.map +1 -0
- package/dist/src/react/index.d.ts +48 -0
- package/dist/src/react/index.d.ts.map +1 -0
- package/dist/src/react/notifications/NotificationBell.d.ts +7 -0
- package/dist/src/react/notifications/NotificationBell.d.ts.map +1 -0
- package/dist/src/react/notifications/NotificationList.d.ts +7 -0
- package/dist/src/react/notifications/NotificationList.d.ts.map +1 -0
- package/dist/src/react/notifications/Toast.d.ts +13 -0
- package/dist/src/react/notifications/Toast.d.ts.map +1 -0
- package/dist/src/react/notifications/index.d.ts +8 -0
- package/dist/src/react/notifications/index.d.ts.map +1 -0
- package/dist/src/react/notifications/provider.d.ts +14 -0
- package/dist/src/react/notifications/provider.d.ts.map +1 -0
- package/dist/src/react/notifications/use-notifications.d.ts +24 -0
- package/dist/src/react/notifications/use-notifications.d.ts.map +1 -0
- package/dist/src/react/payments/AutoReloadToggle.d.ts +6 -0
- package/dist/src/react/payments/AutoReloadToggle.d.ts.map +1 -0
- package/dist/src/react/payments/Balance.d.ts +8 -0
- package/dist/src/react/payments/Balance.d.ts.map +1 -0
- package/dist/src/react/payments/CancelSubscription.d.ts +6 -0
- package/dist/src/react/payments/CancelSubscription.d.ts.map +1 -0
- package/dist/src/react/payments/CheckoutButton.d.ts +7 -0
- package/dist/src/react/payments/CheckoutButton.d.ts.map +1 -0
- package/dist/src/react/payments/CustomerPortalButton.d.ts +6 -0
- package/dist/src/react/payments/CustomerPortalButton.d.ts.map +1 -0
- package/dist/src/react/payments/FeatureMeter.d.ts +6 -0
- package/dist/src/react/payments/FeatureMeter.d.ts.map +1 -0
- package/dist/src/react/payments/Plans.d.ts +8 -0
- package/dist/src/react/payments/Plans.d.ts.map +1 -0
- package/dist/src/react/payments/TopUpButton.d.ts +8 -0
- package/dist/src/react/payments/TopUpButton.d.ts.map +1 -0
- package/dist/src/react/payments/UpdateBilling.d.ts +3 -0
- package/dist/src/react/payments/UpdateBilling.d.ts.map +1 -0
- package/dist/src/react/payments/UpgradePrompt.d.ts +8 -0
- package/dist/src/react/payments/UpgradePrompt.d.ts.map +1 -0
- package/dist/src/react/primitives/Skeleton.d.ts +15 -0
- package/dist/src/react/primitives/Skeleton.d.ts.map +1 -0
- package/dist/src/react/provider.d.ts +21 -0
- package/dist/src/react/provider.d.ts.map +1 -0
- package/dist/src/react/request.d.ts +2 -0
- package/dist/src/react/request.d.ts.map +1 -0
- package/dist/src/react/styles-entry.d.ts +4 -0
- package/dist/src/react/styles-entry.d.ts.map +1 -0
- package/dist/src/react/styles.d.ts +2 -0
- package/dist/src/react/styles.d.ts.map +1 -0
- package/dist/src/react/theme-entry.d.ts +3 -0
- package/dist/src/react/theme-entry.d.ts.map +1 -0
- package/dist/src/react/theme.d.ts +6 -0
- package/dist/src/react/theme.d.ts.map +1 -0
- package/dist/src/react/types.d.ts +191 -0
- package/dist/src/react/types.d.ts.map +1 -0
- package/dist/src/react/use-brokr-theme.d.ts +6 -0
- package/dist/src/react/use-brokr-theme.d.ts.map +1 -0
- package/dist/src/runtime.d.ts +69 -180
- package/dist/src/runtime.d.ts.map +1 -1
- package/dist/src/storage/client.d.ts +113 -0
- package/dist/src/storage/client.d.ts.map +1 -0
- package/dist/src/storage/types.d.ts +60 -0
- package/dist/src/storage/types.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +70 -9
package/dist/files.js
ADDED
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/files/client.ts
|
|
21
|
+
var client_exports = {};
|
|
22
|
+
__export(client_exports, {
|
|
23
|
+
BrokrFilesClient: () => BrokrFilesClient
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(client_exports);
|
|
26
|
+
|
|
27
|
+
// src/fix-registry.ts
|
|
28
|
+
var FIX_REGISTRY = {
|
|
29
|
+
AUTH_TOKEN_INVALID: [
|
|
30
|
+
"\u2192 Run `brokr env pull --stack <name>` to refresh your token",
|
|
31
|
+
"\u2192 Or run `brokr link account` to re-authenticate"
|
|
32
|
+
].join("\n"),
|
|
33
|
+
AUTH_SESSION_EXPIRED: [
|
|
34
|
+
"\u2192 Run `brokr link account` to re-authenticate"
|
|
35
|
+
].join("\n"),
|
|
36
|
+
BROKR_TOKEN_MISSING: [
|
|
37
|
+
"\u2192 Run `brokr env pull --stack <name>` to sync your environment",
|
|
38
|
+
"\u2192 Or add BROKR_TOKEN to your .env.local manually"
|
|
39
|
+
].join("\n"),
|
|
40
|
+
DATABASE_PROVISION_FAILED: [
|
|
41
|
+
"\u2192 Run `brokr status <stack>` to check current state",
|
|
42
|
+
"\u2192 Run `brokr retry <stack>` to re-trigger provisioning"
|
|
43
|
+
].join("\n"),
|
|
44
|
+
DATABASE_QUOTA_REACHED: [
|
|
45
|
+
"\u2192 Upgrade your plan or delete unused databases",
|
|
46
|
+
"\u2192 Check usage at brokr.sh/billing"
|
|
47
|
+
].join("\n"),
|
|
48
|
+
DATABASE_HEALTH_TIMEOUT: [
|
|
49
|
+
"\u2192 Run `brokr status <stack>` to check database state",
|
|
50
|
+
"\u2192 If persistent, check provider status page"
|
|
51
|
+
].join("\n"),
|
|
52
|
+
DEPLOYMENT_FAILED: [
|
|
53
|
+
"\u2192 Run `brokr logs --stack <name>` to see build logs",
|
|
54
|
+
"\u2192 Fix the build error and run `brokr deploy`"
|
|
55
|
+
].join("\n"),
|
|
56
|
+
DEPLOYMENT_RATE_LIMITED: [
|
|
57
|
+
"\u2192 Wait a minute and retry",
|
|
58
|
+
"\u2192 Vercel rate limits apply per project"
|
|
59
|
+
].join("\n"),
|
|
60
|
+
REPO_ALREADY_EXISTS: [
|
|
61
|
+
"\u2192 Use a different stack name",
|
|
62
|
+
"\u2192 Or run `brokr status <stack>` to check the existing stack"
|
|
63
|
+
].join("\n"),
|
|
64
|
+
REPO_CREATE_FAILED: [
|
|
65
|
+
"\u2192 Check your GitHub connection: `brokr link account`",
|
|
66
|
+
"\u2192 Ensure the Brokr GitHub App is installed"
|
|
67
|
+
].join("\n"),
|
|
68
|
+
EMAIL_DOMAIN_FAILED: [
|
|
69
|
+
"\u2192 Check DNS records are propagated",
|
|
70
|
+
"\u2192 Run `brokr status <stack>` for details"
|
|
71
|
+
].join("\n"),
|
|
72
|
+
DNS_RECORD_FAILED: [
|
|
73
|
+
"\u2192 Check Cloudflare dashboard for zone status",
|
|
74
|
+
"\u2192 Retry with `brokr retry <stack>`"
|
|
75
|
+
].join("\n"),
|
|
76
|
+
INSUFFICIENT_CREDITS: [
|
|
77
|
+
"\u2192 Top up credits at brokr.sh/billing",
|
|
78
|
+
"\u2192 Or run `brokr billing topup`"
|
|
79
|
+
].join("\n"),
|
|
80
|
+
AI_BUDGET_EXCEEDED: [
|
|
81
|
+
"\u2192 Top up credits at brokr.sh/billing",
|
|
82
|
+
"\u2192 Or run `brokr billing topup`"
|
|
83
|
+
].join("\n"),
|
|
84
|
+
AI_PROVIDER_UNAVAILABLE: [
|
|
85
|
+
"\u2192 The AI provider is temporarily down",
|
|
86
|
+
"\u2192 Retry in a few seconds \u2014 this is usually transient"
|
|
87
|
+
].join("\n"),
|
|
88
|
+
AI_MODEL_NOT_FOUND: [
|
|
89
|
+
"\u2192 Check the model name in your configuration",
|
|
90
|
+
"\u2192 See available models at brokr.sh/docs/ai-models"
|
|
91
|
+
].join("\n"),
|
|
92
|
+
ENV_VAR_MISSING: [
|
|
93
|
+
"\u2192 Run `brokr env pull --stack <name>` to sync environment",
|
|
94
|
+
"\u2192 Check required vars in your template README"
|
|
95
|
+
].join("\n"),
|
|
96
|
+
STACK_LIMIT_REACHED: [
|
|
97
|
+
"\u2192 Delete unused stacks with `brokr delete <stack>`",
|
|
98
|
+
"\u2192 Or upgrade your plan at brokr.sh/billing"
|
|
99
|
+
].join("\n"),
|
|
100
|
+
STACK_NOT_FOUND: [
|
|
101
|
+
"\u2192 Check the stack name: `brokr list`",
|
|
102
|
+
"\u2192 Create a new stack: `brokr create --name <name>`"
|
|
103
|
+
].join("\n"),
|
|
104
|
+
RATE_LIMITED: [
|
|
105
|
+
"\u2192 Wait a moment and retry",
|
|
106
|
+
"\u2192 If persistent, check brokr.sh/status"
|
|
107
|
+
].join("\n"),
|
|
108
|
+
GATEWAY_AUTH_FAILED: [
|
|
109
|
+
"\u2192 Your BROKR_TOKEN may be expired",
|
|
110
|
+
"\u2192 Run `brokr env pull --stack <name>` to refresh"
|
|
111
|
+
].join("\n"),
|
|
112
|
+
BROKR_TOKEN_INVALID: [
|
|
113
|
+
"\u2192 Your BROKR_TOKEN has expired or been revoked",
|
|
114
|
+
"\u2192 Run `brokr env pull --stack <name>` to get a fresh token"
|
|
115
|
+
].join("\n"),
|
|
116
|
+
AI_STREAM_ERROR: [
|
|
117
|
+
"\u2192 The AI stream was interrupted",
|
|
118
|
+
"\u2192 Retry the request \u2014 this is usually transient"
|
|
119
|
+
].join("\n"),
|
|
120
|
+
EMAIL_SEND_FAILED: [
|
|
121
|
+
"\u2192 Email delivery failed",
|
|
122
|
+
"\u2192 Check that your domain DNS is verified: `brokr status <stack>`"
|
|
123
|
+
].join("\n"),
|
|
124
|
+
EMAIL_NOT_CONFIGURED: [
|
|
125
|
+
"\u2192 Email is not set up for this stack",
|
|
126
|
+
"\u2192 Add email capability: `brokr add email --stack <name>`"
|
|
127
|
+
].join("\n"),
|
|
128
|
+
EMAIL_INVALID_FROM: [
|
|
129
|
+
"\u2192 The from address must match your verified domain",
|
|
130
|
+
"\u2192 Check your domain: `brokr status <stack>`"
|
|
131
|
+
].join("\n"),
|
|
132
|
+
STORAGE_UPLOAD_FAILED: [
|
|
133
|
+
"\u2192 File upload failed",
|
|
134
|
+
"\u2192 Check file size limits and retry"
|
|
135
|
+
].join("\n"),
|
|
136
|
+
STORAGE_NOT_FOUND: [
|
|
137
|
+
"\u2192 The requested file does not exist",
|
|
138
|
+
"\u2192 Check the key and try again"
|
|
139
|
+
].join("\n"),
|
|
140
|
+
PAYMENTS_NOT_CONFIGURED: [
|
|
141
|
+
"\u2192 Payments are not set up for this stack",
|
|
142
|
+
"\u2192 Run `brokr payments sync` to configure Stripe"
|
|
143
|
+
].join("\n"),
|
|
144
|
+
PAYMENTS_FAILED: [
|
|
145
|
+
"\u2192 Payment processing failed",
|
|
146
|
+
"\u2192 Check your Stripe dashboard for details"
|
|
147
|
+
].join("\n"),
|
|
148
|
+
GATEWAY_INTERNAL: [
|
|
149
|
+
"\u2192 The Brokr gateway encountered an internal error",
|
|
150
|
+
"\u2192 Check brokr.sh/status for service health"
|
|
151
|
+
].join("\n"),
|
|
152
|
+
UPSTREAM_ERROR: [
|
|
153
|
+
"\u2192 An upstream service is temporarily unavailable",
|
|
154
|
+
"\u2192 Retry in a few seconds \u2014 this is usually transient"
|
|
155
|
+
].join("\n"),
|
|
156
|
+
NETWORK_ERROR: [
|
|
157
|
+
"\u2192 Could not reach the Brokr gateway",
|
|
158
|
+
"\u2192 Check your internet connection",
|
|
159
|
+
"\u2192 Check brokr.sh/status for service health"
|
|
160
|
+
].join("\n"),
|
|
161
|
+
TIMEOUT: [
|
|
162
|
+
"\u2192 Request timed out",
|
|
163
|
+
"\u2192 Retry \u2014 if persistent, check brokr.sh/status"
|
|
164
|
+
].join("\n")
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// src/errors.ts
|
|
168
|
+
var BrokrError = class extends Error {
|
|
169
|
+
constructor(message, code, capability, retryable = false, errorCode, requestId, hint) {
|
|
170
|
+
super(message);
|
|
171
|
+
this.code = code;
|
|
172
|
+
this.capability = capability;
|
|
173
|
+
this.retryable = retryable;
|
|
174
|
+
this.errorCode = errorCode;
|
|
175
|
+
this.requestId = requestId;
|
|
176
|
+
this.hint = hint;
|
|
177
|
+
this.name = "BrokrError";
|
|
178
|
+
}
|
|
179
|
+
/** Multi-line terminal fix block — looked up from error code. */
|
|
180
|
+
get fix() {
|
|
181
|
+
if (!this.errorCode) return void 0;
|
|
182
|
+
return FIX_REGISTRY[this.errorCode];
|
|
183
|
+
}
|
|
184
|
+
/** Documentation URL for this error code. */
|
|
185
|
+
get docsUrl() {
|
|
186
|
+
if (!this.errorCode) return void 0;
|
|
187
|
+
return `https://brokr.sh/errors/${this.errorCode.toLowerCase().replace(/_/g, "-")}`;
|
|
188
|
+
}
|
|
189
|
+
/** Safe message for end users — zero technical language. */
|
|
190
|
+
toUserMessage() {
|
|
191
|
+
switch (this.code) {
|
|
192
|
+
case "RATE_LIMITED":
|
|
193
|
+
return "Please wait a moment and try again.";
|
|
194
|
+
case "TIMEOUT":
|
|
195
|
+
return "The request took too long. Please try again.";
|
|
196
|
+
case "NETWORK_ERROR":
|
|
197
|
+
return "Connection issue. Check your internet and try again.";
|
|
198
|
+
case "BROKR_TOKEN_MISSING":
|
|
199
|
+
return "App is not connected to Brokr. Contact the developer.";
|
|
200
|
+
case "BROKR_TOKEN_INVALID":
|
|
201
|
+
return "Session expired. Please refresh.";
|
|
202
|
+
case "AI_BUDGET_EXCEEDED":
|
|
203
|
+
return "AI usage limit reached. The developer needs to add credits.";
|
|
204
|
+
case "AI_PROVIDER_UNAVAILABLE":
|
|
205
|
+
return "AI service is temporarily down. Please retry shortly.";
|
|
206
|
+
case "AI_PROVIDER_RATE_LIMITED":
|
|
207
|
+
return "Too many AI requests. Please wait a moment.";
|
|
208
|
+
case "INSUFFICIENT_CREDITS":
|
|
209
|
+
return "Not enough credits. Please top up your balance.";
|
|
210
|
+
case "STORAGE_UPLOAD_FAILED":
|
|
211
|
+
return "File upload failed. Please try again.";
|
|
212
|
+
case "STORAGE_NOT_FOUND":
|
|
213
|
+
return "File not found.";
|
|
214
|
+
case "EMAIL_SEND_FAILED":
|
|
215
|
+
return "Email could not be sent. Please try again.";
|
|
216
|
+
case "EMAIL_NOT_CONFIGURED":
|
|
217
|
+
return "Email is not set up for this app.";
|
|
218
|
+
case "PAYMENTS_NOT_CONFIGURED":
|
|
219
|
+
return "Payments are not configured. Contact the developer.";
|
|
220
|
+
case "PAYMENTS_FAILED":
|
|
221
|
+
return "Payment processing failed. Please try again.";
|
|
222
|
+
case "NOT_FOUND":
|
|
223
|
+
return "The requested resource was not found.";
|
|
224
|
+
case "VALIDATION_ERROR":
|
|
225
|
+
return "Invalid input. Please check your data and try again.";
|
|
226
|
+
default:
|
|
227
|
+
return "Something went wrong. We're looking into it.";
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
toString() {
|
|
231
|
+
return `${this.name} [${this.errorCode ?? this.code}]: ${this.message}`;
|
|
232
|
+
}
|
|
233
|
+
toJSON() {
|
|
234
|
+
return {
|
|
235
|
+
name: this.name,
|
|
236
|
+
code: this.code,
|
|
237
|
+
errorCode: this.errorCode,
|
|
238
|
+
message: this.message,
|
|
239
|
+
capability: this.capability,
|
|
240
|
+
retryable: this.retryable,
|
|
241
|
+
requestId: this.requestId,
|
|
242
|
+
hint: this.hint,
|
|
243
|
+
component: this.component
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
var BrokrAuthError = class extends BrokrError {
|
|
248
|
+
constructor(message, code) {
|
|
249
|
+
super(message, code, "auth", false);
|
|
250
|
+
this.name = "BrokrAuthError";
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
var BrokrRateLimitError = class extends BrokrError {
|
|
254
|
+
constructor(message, retryAfter, capability) {
|
|
255
|
+
super(message, "RATE_LIMITED", capability, true);
|
|
256
|
+
this.retryAfter = retryAfter;
|
|
257
|
+
this.name = "BrokrRateLimitError";
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
var BrokrNetworkError = class extends BrokrError {
|
|
261
|
+
constructor(message, capability) {
|
|
262
|
+
super(message, "NETWORK_ERROR", capability, true);
|
|
263
|
+
this.name = "BrokrNetworkError";
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
var BrokrTimeoutError = class extends BrokrError {
|
|
267
|
+
constructor(message, capability) {
|
|
268
|
+
super(message, "TIMEOUT", capability, true);
|
|
269
|
+
this.name = "BrokrTimeoutError";
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
// src/gateway.ts
|
|
274
|
+
var FETCH_TIMEOUT_MS = 3e4;
|
|
275
|
+
function requireToken(token, capability) {
|
|
276
|
+
if (!token) {
|
|
277
|
+
let hint = "brokr env pull --stack <name>";
|
|
278
|
+
try {
|
|
279
|
+
if (typeof process !== "undefined") {
|
|
280
|
+
const fs = require("fs");
|
|
281
|
+
const path = require("path");
|
|
282
|
+
const brokrFile = path.join(process.cwd(), ".brokr");
|
|
283
|
+
if (fs.existsSync(brokrFile)) {
|
|
284
|
+
const data = JSON.parse(fs.readFileSync(brokrFile, "utf8"));
|
|
285
|
+
if (data?.stackName) hint = `brokr env pull --stack ${data.stackName}`;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
} catch {
|
|
289
|
+
}
|
|
290
|
+
throw new BrokrAuthError(
|
|
291
|
+
`BROKR_TOKEN is not set. Run: ${hint}`,
|
|
292
|
+
"BROKR_TOKEN_MISSING"
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async function gatewayFetch(gatewayUrl, token, path, body, capability) {
|
|
297
|
+
const controller = new AbortController();
|
|
298
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
299
|
+
let res;
|
|
300
|
+
try {
|
|
301
|
+
res = await fetch(`${gatewayUrl}${path}`, {
|
|
302
|
+
method: "POST",
|
|
303
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
|
|
304
|
+
body: JSON.stringify(body),
|
|
305
|
+
signal: controller.signal
|
|
306
|
+
});
|
|
307
|
+
} catch (err) {
|
|
308
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
309
|
+
throw new BrokrTimeoutError(
|
|
310
|
+
`Request timed out after ${FETCH_TIMEOUT_MS / 1e3}s`,
|
|
311
|
+
capability
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
throw new BrokrNetworkError(
|
|
315
|
+
"Could not reach Brokr gateway. Check your network.",
|
|
316
|
+
capability
|
|
317
|
+
);
|
|
318
|
+
} finally {
|
|
319
|
+
clearTimeout(timeout);
|
|
320
|
+
}
|
|
321
|
+
if (res.status === 429) {
|
|
322
|
+
const rawRetryAfter = parseInt(res.headers.get("Retry-After") ?? "60", 10);
|
|
323
|
+
const retryAfter = Number.isFinite(rawRetryAfter) ? rawRetryAfter : 60;
|
|
324
|
+
const data = await res.json().catch(() => ({}));
|
|
325
|
+
const errorMsg = typeof data.error === "string" ? data.error : `Rate limited (retry after ${retryAfter}s)`;
|
|
326
|
+
throw new BrokrRateLimitError(
|
|
327
|
+
errorMsg,
|
|
328
|
+
retryAfter,
|
|
329
|
+
capability
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
if (res.status === 401) {
|
|
333
|
+
throw new BrokrAuthError("Invalid or expired BROKR_TOKEN.", "BROKR_TOKEN_INVALID");
|
|
334
|
+
}
|
|
335
|
+
if (!res.ok) {
|
|
336
|
+
const body2 = await res.json().catch(() => ({}));
|
|
337
|
+
const errObj = typeof body2.error === "object" && body2.error !== null ? body2.error : void 0;
|
|
338
|
+
const errorData = body2.data ?? errObj?.data ?? body2;
|
|
339
|
+
const errorCode = errorData.errorCode ?? body2.code;
|
|
340
|
+
const hint = errorData.hint;
|
|
341
|
+
const requestId = errorData.requestId ?? res.headers.get("x-request-id");
|
|
342
|
+
const retryable = errorData.retryable;
|
|
343
|
+
const errorStr = typeof body2.error === "string" ? body2.error : void 0;
|
|
344
|
+
const message = body2.message ?? errObj?.message ?? errorStr ?? `${capability} request failed (HTTP ${res.status})`;
|
|
345
|
+
throw new BrokrError(
|
|
346
|
+
message,
|
|
347
|
+
errorCode ?? `${capability.toUpperCase()}_FAILED`,
|
|
348
|
+
capability,
|
|
349
|
+
retryable ?? false,
|
|
350
|
+
errorCode ?? void 0,
|
|
351
|
+
requestId ?? void 0,
|
|
352
|
+
hint ?? void 0
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
return await res.json();
|
|
357
|
+
} catch {
|
|
358
|
+
throw new BrokrError(
|
|
359
|
+
`${capability} returned invalid response (expected JSON).`,
|
|
360
|
+
`${capability.toUpperCase()}_INVALID_RESPONSE`,
|
|
361
|
+
capability,
|
|
362
|
+
true
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// src/files/client.ts
|
|
368
|
+
var BrokrFilesClient = class {
|
|
369
|
+
constructor(_token, _gatewayUrl, _storage) {
|
|
370
|
+
this._token = _token;
|
|
371
|
+
this._gatewayUrl = _gatewayUrl;
|
|
372
|
+
this._storage = _storage;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Upload a file and trigger server-side AI processing.
|
|
376
|
+
* Returns the storage key plus any extracted description/text.
|
|
377
|
+
*/
|
|
378
|
+
async process(params) {
|
|
379
|
+
requireToken(this._token, "files");
|
|
380
|
+
const uploaded = await this._storage.upload({
|
|
381
|
+
file: params.file,
|
|
382
|
+
path: params.fileName,
|
|
383
|
+
contentType: params.purpose === "text-extraction" ? "application/pdf" : void 0
|
|
384
|
+
});
|
|
385
|
+
const result = await gatewayFetch(
|
|
386
|
+
this._gatewayUrl,
|
|
387
|
+
this._token,
|
|
388
|
+
"/v1/files/process",
|
|
389
|
+
{ key: uploaded.key, purpose: params.purpose ?? "general" },
|
|
390
|
+
"files"
|
|
391
|
+
);
|
|
392
|
+
return {
|
|
393
|
+
key: uploaded.key,
|
|
394
|
+
description: result.description,
|
|
395
|
+
text: result.text
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Get an AI-generated description of an already-uploaded file.
|
|
400
|
+
*/
|
|
401
|
+
async describe(key) {
|
|
402
|
+
requireToken(this._token, "files");
|
|
403
|
+
return gatewayFetch(
|
|
404
|
+
this._gatewayUrl,
|
|
405
|
+
this._token,
|
|
406
|
+
"/v1/files/describe",
|
|
407
|
+
{ key },
|
|
408
|
+
"files"
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Extract text from a PDF or image (OCR).
|
|
413
|
+
*/
|
|
414
|
+
async getText(key) {
|
|
415
|
+
requireToken(this._token, "files");
|
|
416
|
+
return gatewayFetch(
|
|
417
|
+
this._gatewayUrl,
|
|
418
|
+
this._token,
|
|
419
|
+
"/v1/files/text",
|
|
420
|
+
{ key },
|
|
421
|
+
"files"
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
};
|
|
425
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
426
|
+
0 && (module.exports = {
|
|
427
|
+
BrokrFilesClient
|
|
428
|
+
});
|