@soulcraft/sdk 1.6.0 → 1.6.2
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/modules/billing/portal-provider.d.ts +35 -5
- package/dist/modules/billing/portal-provider.d.ts.map +1 -1
- package/dist/modules/billing/portal-provider.js +116 -24
- package/dist/modules/billing/portal-provider.js.map +1 -1
- package/dist/modules/billing/types.d.ts +2 -0
- package/dist/modules/billing/types.d.ts.map +1 -1
- package/dist/modules/billing/usage-buffer.d.ts.map +1 -1
- package/dist/modules/billing/usage-buffer.js +7 -1
- package/dist/modules/billing/usage-buffer.js.map +1 -1
- package/dist/modules/skills/types.d.ts +1 -1
- package/dist/modules/skills/types.js +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/ADR-001-sdk-design.md +2 -2
- package/docs/IMPLEMENTATION-PLAN.md +6 -6
- package/docs/KIT-APP-GUIDE.md +2 -2
- package/package.json +1 -1
|
@@ -18,10 +18,16 @@
|
|
|
18
18
|
*
|
|
19
19
|
* All requests carry `X-Portal-Credit-Secret: <PORTAL_CREDIT_SECRET>`.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
21
|
+
* **Caching:** `checkLimit` results are cached per-user for 30 seconds with
|
|
22
|
+
* singleflight deduplication for concurrent callers. The cache is invalidated
|
|
23
|
+
* automatically when `UsageBuffer` flushes usage to Portal. Worst-case
|
|
24
|
+
* over-grant is ~3–5 messages past exhaustion (acceptable given `recordUsage`
|
|
25
|
+
* is itself 5s-delayed).
|
|
26
|
+
*
|
|
27
|
+
* The `credits/check` response also carries `monthlyIncluded`, `monthlyUsed`,
|
|
28
|
+
* `plan`, and `periodEnd` fields (added Portal-side in P2). These are cached
|
|
29
|
+
* alongside the limit result and used to populate `getUsageStatus()` and
|
|
30
|
+
* `getSubscription()` without additional API calls.
|
|
25
31
|
*
|
|
26
32
|
* @example
|
|
27
33
|
* ```typescript
|
|
@@ -41,6 +47,10 @@ import type { BillingProvider, UsageData, SubscriptionData, LimitCheckResult, Us
|
|
|
41
47
|
* Calls the Portal credit API for all gate checks and usage recording.
|
|
42
48
|
* All requests are authenticated with the `X-Portal-Credit-Secret` header.
|
|
43
49
|
*
|
|
50
|
+
* `checkLimit` responses are cached per-user for 30 seconds with singleflight
|
|
51
|
+
* deduplication. The cache is cleared via `invalidateCache()` when `UsageBuffer`
|
|
52
|
+
* successfully flushes usage — tightening the feedback loop after each batch write.
|
|
53
|
+
*
|
|
44
54
|
* The `userId` parameter on all methods must be the user's **email address** —
|
|
45
55
|
* the same identifier Portal uses to look up the license document.
|
|
46
56
|
*/
|
|
@@ -54,14 +64,34 @@ export declare class PortalBillingProvider implements BillingProvider {
|
|
|
54
64
|
* @param product - The product name sent with consume/batch calls (`'workshop'`, `'venue'`, `'academy'`).
|
|
55
65
|
*/
|
|
56
66
|
constructor(baseUrl: string, secret: string, product: string);
|
|
67
|
+
/** Cached limit check results, keyed by userId (email). */
|
|
68
|
+
private readonly _cache;
|
|
69
|
+
/** Rich Portal response fields cached alongside the limit result. */
|
|
70
|
+
private readonly _richCache;
|
|
71
|
+
/** In-flight `checkLimit` promises, keyed by userId — singleflight deduplication. */
|
|
72
|
+
private readonly _inflight;
|
|
73
|
+
/** Per-user cache TTL for `checkLimit` results. */
|
|
74
|
+
private static readonly CACHE_TTL_MS;
|
|
57
75
|
private _headers;
|
|
58
76
|
private _post;
|
|
59
77
|
checkLimit(userId: string, hasPersonalKey: boolean): Promise<LimitCheckResult>;
|
|
78
|
+
/**
|
|
79
|
+
* Clear the cached limit check result for a user.
|
|
80
|
+
*
|
|
81
|
+
* Called by `UsageBuffer` after a successful batch flush so the next
|
|
82
|
+
* `checkLimit` call fetches fresh data from Portal rather than serving
|
|
83
|
+
* a stale credit balance.
|
|
84
|
+
*
|
|
85
|
+
* @param userId - The user's email address (same key used in `checkLimit`).
|
|
86
|
+
*/
|
|
87
|
+
invalidateCache(userId: string): void;
|
|
88
|
+
/** Perform the actual Portal HTTP call and populate both caches. */
|
|
89
|
+
private _fetchLimit;
|
|
60
90
|
getUsage(userId: string): Promise<UsageData>;
|
|
61
91
|
getUsageStatus(userId: string, hasPersonalKey: boolean): Promise<UsageStatus>;
|
|
62
92
|
incrementUsage(userId: string, inputTokens: number, outputTokens: number, model: string, _useTopUp: boolean): Promise<void>;
|
|
63
93
|
batchIncrementUsage(userId: string, batch: BatchIncrementData): Promise<void>;
|
|
64
|
-
getSubscription(
|
|
94
|
+
getSubscription(userId: string): Promise<SubscriptionData | undefined>;
|
|
65
95
|
hasActiveSubscription(userId: string): Promise<boolean>;
|
|
66
96
|
getTopUpBalance(userId: string): Promise<number>;
|
|
67
97
|
canAccessPaidFeature(userId: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal-provider.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"portal-provider.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAmCnB;;;;;;;;;;;;GAYG;AACH,qBAAa,qBAAsB,YAAW,eAAe;IAOzD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B;;;;OAIG;gBAEgB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM;IAKlC,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqE;IAE5F,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IAEjE,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;IAEzE,mDAAmD;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAS;IAI7C,OAAO,CAAC,QAAQ;YAOF,KAAK;IAeb,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0BpF;;;;;;;;OAQG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKrC,oEAAoE;YACtD,WAAW;IA0CnB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAkB5C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAmD7E,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAeV,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAgBtE,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7D"}
|
|
@@ -18,10 +18,16 @@
|
|
|
18
18
|
*
|
|
19
19
|
* All requests carry `X-Portal-Credit-Secret: <PORTAL_CREDIT_SECRET>`.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
21
|
+
* **Caching:** `checkLimit` results are cached per-user for 30 seconds with
|
|
22
|
+
* singleflight deduplication for concurrent callers. The cache is invalidated
|
|
23
|
+
* automatically when `UsageBuffer` flushes usage to Portal. Worst-case
|
|
24
|
+
* over-grant is ~3–5 messages past exhaustion (acceptable given `recordUsage`
|
|
25
|
+
* is itself 5s-delayed).
|
|
26
|
+
*
|
|
27
|
+
* The `credits/check` response also carries `monthlyIncluded`, `monthlyUsed`,
|
|
28
|
+
* `plan`, and `periodEnd` fields (added Portal-side in P2). These are cached
|
|
29
|
+
* alongside the limit result and used to populate `getUsageStatus()` and
|
|
30
|
+
* `getSubscription()` without additional API calls.
|
|
25
31
|
*
|
|
26
32
|
* @example
|
|
27
33
|
* ```typescript
|
|
@@ -53,6 +59,10 @@ function _thirtyDaysFromNow() {
|
|
|
53
59
|
* Calls the Portal credit API for all gate checks and usage recording.
|
|
54
60
|
* All requests are authenticated with the `X-Portal-Credit-Secret` header.
|
|
55
61
|
*
|
|
62
|
+
* `checkLimit` responses are cached per-user for 30 seconds with singleflight
|
|
63
|
+
* deduplication. The cache is cleared via `invalidateCache()` when `UsageBuffer`
|
|
64
|
+
* successfully flushes usage — tightening the feedback loop after each batch write.
|
|
65
|
+
*
|
|
56
66
|
* The `userId` parameter on all methods must be the user's **email address** —
|
|
57
67
|
* the same identifier Portal uses to look up the license document.
|
|
58
68
|
*/
|
|
@@ -70,6 +80,15 @@ export class PortalBillingProvider {
|
|
|
70
80
|
this.secret = secret;
|
|
71
81
|
this.product = product;
|
|
72
82
|
}
|
|
83
|
+
// ── Cache + singleflight ──────────────────────────────────────────────────
|
|
84
|
+
/** Cached limit check results, keyed by userId (email). */
|
|
85
|
+
_cache = new Map();
|
|
86
|
+
/** Rich Portal response fields cached alongside the limit result. */
|
|
87
|
+
_richCache = new Map();
|
|
88
|
+
/** In-flight `checkLimit` promises, keyed by userId — singleflight deduplication. */
|
|
89
|
+
_inflight = new Map();
|
|
90
|
+
/** Per-user cache TTL for `checkLimit` results. */
|
|
91
|
+
static CACHE_TTL_MS = 30_000;
|
|
73
92
|
// ── Internal helpers ──────────────────────────────────────────────────────
|
|
74
93
|
_headers() {
|
|
75
94
|
return {
|
|
@@ -91,12 +110,47 @@ export class PortalBillingProvider {
|
|
|
91
110
|
}
|
|
92
111
|
// ── BillingProvider interface ─────────────────────────────────────────────
|
|
93
112
|
async checkLimit(userId, hasPersonalKey) {
|
|
113
|
+
// BYOK users are always allowed — no Portal call needed.
|
|
94
114
|
if (hasPersonalKey) {
|
|
95
115
|
return { ok: true, remaining: Infinity, topUpBalance: 0, totalAvailable: Infinity, useTopUp: false, tier: 'byok' };
|
|
96
116
|
}
|
|
117
|
+
// Return cached result if still fresh.
|
|
118
|
+
const cached = this._cache.get(userId);
|
|
119
|
+
if (cached && Date.now() < cached.expiresAt) {
|
|
120
|
+
return cached.result;
|
|
121
|
+
}
|
|
122
|
+
// Singleflight: if a request is already in flight for this user, join it.
|
|
123
|
+
const existing = this._inflight.get(userId);
|
|
124
|
+
if (existing)
|
|
125
|
+
return existing;
|
|
126
|
+
// Issue a new Portal request and register it as the in-flight promise.
|
|
127
|
+
const promise = this._fetchLimit(userId);
|
|
128
|
+
this._inflight.set(userId, promise);
|
|
129
|
+
try {
|
|
130
|
+
return await promise;
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
this._inflight.delete(userId);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Clear the cached limit check result for a user.
|
|
138
|
+
*
|
|
139
|
+
* Called by `UsageBuffer` after a successful batch flush so the next
|
|
140
|
+
* `checkLimit` call fetches fresh data from Portal rather than serving
|
|
141
|
+
* a stale credit balance.
|
|
142
|
+
*
|
|
143
|
+
* @param userId - The user's email address (same key used in `checkLimit`).
|
|
144
|
+
*/
|
|
145
|
+
invalidateCache(userId) {
|
|
146
|
+
this._cache.delete(userId);
|
|
147
|
+
this._richCache.delete(userId);
|
|
148
|
+
}
|
|
149
|
+
/** Perform the actual Portal HTTP call and populate both caches. */
|
|
150
|
+
async _fetchLimit(userId) {
|
|
97
151
|
try {
|
|
98
152
|
const result = await this._post('/api/credits/check', { userEmail: userId, product: this.product });
|
|
99
|
-
|
|
153
|
+
const limitResult = {
|
|
100
154
|
ok: result.ok,
|
|
101
155
|
remaining: result.remaining ?? 0,
|
|
102
156
|
topUpBalance: result.topUpBalance ?? 0,
|
|
@@ -105,30 +159,52 @@ export class PortalBillingProvider {
|
|
|
105
159
|
tier: result.tier === 'free' ? 'free' : 'standard',
|
|
106
160
|
...(!result.ok && result.reason ? { reason: result.reason === 'no_subscription' ? 'no_subscription' : 'limit_reached' } : {}),
|
|
107
161
|
};
|
|
162
|
+
const expiresAt = Date.now() + PortalBillingProvider.CACHE_TTL_MS;
|
|
163
|
+
this._cache.set(userId, { result: limitResult, expiresAt });
|
|
164
|
+
this._richCache.set(userId, {
|
|
165
|
+
monthlyIncluded: result.monthlyIncluded ?? null,
|
|
166
|
+
monthlyUsed: result.monthlyUsed ?? 0,
|
|
167
|
+
plan: result.tier === 'free' ? 'free' : 'standard',
|
|
168
|
+
periodEnd: result.periodEnd ?? null,
|
|
169
|
+
});
|
|
170
|
+
return limitResult;
|
|
108
171
|
}
|
|
109
172
|
catch {
|
|
110
173
|
// Network failure — fail open to avoid blocking AI calls due to Portal downtime.
|
|
174
|
+
// Do not cache failure results so the next call retries immediately.
|
|
111
175
|
return { ok: true, remaining: 1, topUpBalance: 0, totalAvailable: 1, useTopUp: false, tier: 'standard' };
|
|
112
176
|
}
|
|
113
177
|
}
|
|
114
178
|
async getUsage(userId) {
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
179
|
+
// Trigger a limit check to populate the rich cache if not already warm.
|
|
180
|
+
await this.checkLimit(userId, false);
|
|
181
|
+
const rich = this._richCache.get(userId);
|
|
182
|
+
const periodEnd = rich?.periodEnd ?? _thirtyDaysFromNow();
|
|
183
|
+
const now = new Date();
|
|
119
184
|
return {
|
|
120
|
-
currentPeriod:
|
|
121
|
-
periodEnd
|
|
122
|
-
messagesUsed: 0,
|
|
185
|
+
currentPeriod: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`,
|
|
186
|
+
periodEnd,
|
|
187
|
+
messagesUsed: rich?.monthlyUsed ?? 0,
|
|
123
188
|
inputTokens: 0,
|
|
124
189
|
outputTokens: 0,
|
|
125
190
|
byModel: {},
|
|
126
|
-
lastUpdated:
|
|
191
|
+
lastUpdated: now.toISOString(),
|
|
127
192
|
};
|
|
128
193
|
}
|
|
129
194
|
async getUsageStatus(userId, hasPersonalKey) {
|
|
130
195
|
const check = await this.checkLimit(userId, hasPersonalKey);
|
|
131
|
-
const
|
|
196
|
+
const rich = this._richCache.get(userId);
|
|
197
|
+
const periodEnd = rich?.periodEnd ?? _thirtyDaysFromNow();
|
|
198
|
+
const now = new Date();
|
|
199
|
+
const usage = {
|
|
200
|
+
currentPeriod: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`,
|
|
201
|
+
periodEnd,
|
|
202
|
+
messagesUsed: rich?.monthlyUsed ?? 0,
|
|
203
|
+
inputTokens: 0,
|
|
204
|
+
outputTokens: 0,
|
|
205
|
+
byModel: {},
|
|
206
|
+
lastUpdated: now.toISOString(),
|
|
207
|
+
};
|
|
132
208
|
if (hasPersonalKey) {
|
|
133
209
|
return {
|
|
134
210
|
mode: 'byok',
|
|
@@ -138,21 +214,26 @@ export class PortalBillingProvider {
|
|
|
138
214
|
topUpBalance: 0,
|
|
139
215
|
totalAvailable: null,
|
|
140
216
|
percentUsed: null,
|
|
141
|
-
resetsAt:
|
|
217
|
+
resetsAt: periodEnd,
|
|
142
218
|
estimatedCostUSD: 0,
|
|
143
219
|
};
|
|
144
220
|
}
|
|
221
|
+
const limit = rich?.monthlyIncluded ?? null;
|
|
222
|
+
const remaining = check.remaining === Infinity ? null : check.remaining;
|
|
223
|
+
const percentUsed = limit !== null && remaining !== null
|
|
224
|
+
? Math.min(100, Math.round(((limit - remaining) / limit) * 100))
|
|
225
|
+
: null;
|
|
145
226
|
return {
|
|
146
|
-
mode: check.
|
|
227
|
+
mode: check.tier === 'free' ? 'free' : 'included',
|
|
147
228
|
usage,
|
|
148
|
-
limit
|
|
149
|
-
remaining
|
|
229
|
+
limit,
|
|
230
|
+
remaining,
|
|
150
231
|
topUpBalance: check.topUpBalance,
|
|
151
232
|
totalAvailable: check.totalAvailable === Infinity ? null : check.totalAvailable,
|
|
152
|
-
percentUsed
|
|
153
|
-
resetsAt:
|
|
233
|
+
percentUsed,
|
|
234
|
+
resetsAt: periodEnd,
|
|
154
235
|
estimatedCostUSD: 0,
|
|
155
|
-
isFreeUser:
|
|
236
|
+
isFreeUser: check.tier === 'free',
|
|
156
237
|
};
|
|
157
238
|
}
|
|
158
239
|
async incrementUsage(userId, inputTokens, outputTokens, model, _useTopUp) {
|
|
@@ -185,9 +266,20 @@ export class PortalBillingProvider {
|
|
|
185
266
|
console.error('[SDK/billing] Portal batch flush failed — usage may be under-counted');
|
|
186
267
|
}
|
|
187
268
|
}
|
|
188
|
-
async getSubscription(
|
|
189
|
-
//
|
|
190
|
-
|
|
269
|
+
async getSubscription(userId) {
|
|
270
|
+
// Trigger a limit check to warm the rich cache if needed.
|
|
271
|
+
const check = await this.checkLimit(userId, false);
|
|
272
|
+
const rich = this._richCache.get(userId);
|
|
273
|
+
if (!rich)
|
|
274
|
+
return undefined;
|
|
275
|
+
// Derive a SubscriptionData from the plan tier and period info.
|
|
276
|
+
// Full Stripe subscription details are not available via the credit API —
|
|
277
|
+
// products that need them should call Portal's management API directly.
|
|
278
|
+
return {
|
|
279
|
+
plan: check.tier === 'byok' ? 'byok' : rich.plan,
|
|
280
|
+
status: rich.plan === 'standard' ? 'active' : 'canceled',
|
|
281
|
+
...(rich.periodEnd ? { currentPeriodEnd: rich.periodEnd } : {}),
|
|
282
|
+
};
|
|
191
283
|
}
|
|
192
284
|
async hasActiveSubscription(userId) {
|
|
193
285
|
const check = await this.checkLimit(userId, false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal-provider.js","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"portal-provider.js","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -185,6 +185,8 @@ export interface BillingProvider {
|
|
|
185
185
|
hasActiveSubscription(userId: string): Promise<boolean>;
|
|
186
186
|
getTopUpBalance(userId: string): Promise<number>;
|
|
187
187
|
canAccessPaidFeature(userId: string): Promise<boolean>;
|
|
188
|
+
/** Clear cached limit data for a user. Called by `UsageBuffer` after a successful flush. */
|
|
189
|
+
invalidateCache?(userId: string): void;
|
|
188
190
|
}
|
|
189
191
|
/**
|
|
190
192
|
* Accumulated usage data for a batch flush.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-buffer.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/usage-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,YAAY,CAAA;AAcrE;;;;;;GAMG;AACH,qBAAa,WAAW;IAOV,OAAO,CAAC,QAAQ,CAAC,QAAQ;IANrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,MAAM,CAA4C;IAE1D;;OAEG;gBAC0B,QAAQ,EAAE,eAAe;IAItD;;;;;;;;;;;OAWG;IACH,SAAS,CACP,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,GAChB,IAAI;IAmBP;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"usage-buffer.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/usage-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,YAAY,CAAA;AAcrE;;;;;;GAMG;AACH,qBAAa,WAAW;IAOV,OAAO,CAAC,QAAQ,CAAC,QAAQ;IANrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,MAAM,CAA4C;IAE1D;;OAEG;gBAC0B,QAAQ,EAAE,eAAe;IAItD;;;;;;;;;;;OAWG;IACH,SAAS,CACP,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,GAChB,IAAI;IAmBP;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC5B;;;OAGG;IACH,IAAI,IAAI,IAAI;IASZ,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,QAAQ;CAgBjB"}
|
|
@@ -94,7 +94,13 @@ export class UsageBuffer {
|
|
|
94
94
|
topUpUsed: acc.topUpUsed,
|
|
95
95
|
byModel: acc.byModel,
|
|
96
96
|
};
|
|
97
|
-
promises.push(this.provider.batchIncrementUsage(userId, batch)
|
|
97
|
+
promises.push(this.provider.batchIncrementUsage(userId, batch)
|
|
98
|
+
.then(() => {
|
|
99
|
+
// Invalidate cached limit data so the next checkLimit fetches a fresh
|
|
100
|
+
// credit balance from Portal rather than serving a stale count.
|
|
101
|
+
this.provider.invalidateCache?.(userId);
|
|
102
|
+
})
|
|
103
|
+
.catch((err) => {
|
|
98
104
|
console.error(`[SDK/billing] Usage flush failed for user ${userId}:`, err);
|
|
99
105
|
// Re-enqueue the failed batch so it is retried on the next flush.
|
|
100
106
|
this._requeue(userId, acc);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-buffer.js","sourceRoot":"","sources":["../../../src/modules/billing/usage-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,sCAAsC;AACtC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AAW/B;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IAOO;IANZ,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAA;IACrD,MAAM,CAA4C;IAE1D;;OAEG;IACH,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;QACpD,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED;;;;;;;;;;;OAWG;IACH,SAAS,CACP,MAAc,EACd,WAAmB,EACnB,YAAoB,EACpB,KAAa,EACb,QAAiB;QAEjB,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;YACrF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC/B,CAAC;QAED,GAAG,CAAC,YAAY,IAAI,CAAC,CAAA;QACrB,GAAG,CAAC,WAAW,IAAI,WAAW,CAAA;QAC9B,GAAG,CAAC,YAAY,IAAI,YAAY,CAAA;QAChC,IAAI,QAAQ;YAAE,GAAG,CAAC,SAAS,IAAI,CAAC,CAAA;QAEhC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;QAC9D,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,WAAW;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,YAAY;SACvC,CAAA;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAM;QAEnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAEpB,MAAM,QAAQ,GAAoB,EAAE,CAAA;QACpC,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;YACrC,MAAM,KAAK,GAAuB;gBAChC,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAA;YACD,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"usage-buffer.js","sourceRoot":"","sources":["../../../src/modules/billing/usage-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Skills are Markdown files (SKILL.md convention) that define an AI persona,
|
|
6
6
|
* capabilities, glossary, and workflow steps for a specific domain. They drive
|
|
7
|
-
*
|
|
7
|
+
* Brainy AI system prompt construction and define what Claude knows how to do
|
|
8
8
|
* within a kit's context.
|
|
9
9
|
*
|
|
10
10
|
* ## Skill sources (in priority order)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Skills are Markdown files (SKILL.md convention) that define an AI persona,
|
|
6
6
|
* capabilities, glossary, and workflow steps for a specific domain. They drive
|
|
7
|
-
*
|
|
7
|
+
* Brainy AI system prompt construction and define what Claude knows how to do
|
|
8
8
|
* within a kit's context.
|
|
9
9
|
*
|
|
10
10
|
* ## Skill sources (in priority order)
|
package/dist/types.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ export interface SoulcraftSDK {
|
|
|
26
26
|
readonly auth: AuthModule;
|
|
27
27
|
/** Licensing — Cortex activation, plan info, AI credits, BYOK. */
|
|
28
28
|
readonly license: LicenseModule;
|
|
29
|
-
/** AI — Claude model tiers, delegator,
|
|
29
|
+
/** AI — Claude model tiers, delegator, Brainy AI companion API, tool definitions. */
|
|
30
30
|
readonly ai: AiModule;
|
|
31
31
|
/** Platform event bus — emit and subscribe to VFS, entity, and AI activity events. */
|
|
32
32
|
readonly events: EventsModule;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE1E,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,CAAA;AAEtE,uDAAuD;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,CAAA;AAEvD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;IACvB,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -174,7 +174,7 @@ set in all production and staging environments. It is never set in local dev.
|
|
|
174
174
|
- `sdk.versions.*` — version history
|
|
175
175
|
- `sdk.auth.*` — auth + sessions + capability tokens
|
|
176
176
|
- `sdk.license.*` — Cortex activation + plans + credits + BYOK
|
|
177
|
-
- `sdk.ai.*` — Claude model tiers, delegator, tool definitions,
|
|
177
|
+
- `sdk.ai.*` — Claude model tiers, delegator, tool definitions, Brainy AI companion API
|
|
178
178
|
- `sdk.events.*` — platform event bus (30+ event types)
|
|
179
179
|
- `sdk.skills.*` — VFS-backed skill system
|
|
180
180
|
- `sdk.kits.*` — kit loader and initialization
|
|
@@ -240,7 +240,7 @@ consistent everywhere.
|
|
|
240
240
|
- [x]Tests: auth middleware, capability token create/verify, license exchange
|
|
241
241
|
|
|
242
242
|
### Phase 4 — AI + Events + Skills + Kits + Formats
|
|
243
|
-
- [x]`src/modules/ai/` — model tiers, delegator,
|
|
243
|
+
- [x]`src/modules/ai/` — model tiers, delegator, Brainy AI API, tool definition types,
|
|
244
244
|
KitAIContext, UI action registry
|
|
245
245
|
- [x]`src/modules/events/` — platform event bus (DataChangeEmitter, all 30+ event types)
|
|
246
246
|
- [x]`src/modules/skills/` — skill loading, bundled skills, user-invocable registry
|
|
@@ -24,7 +24,7 @@ A new session MUST read the source file(s) before implementing each module.
|
|
|
24
24
|
| `server/instance-pool` | Workshop singleton + Venue cache | `/media/dpsifr/storage/home/Projects/workshop/brainy/brainy-singleton.ts` + `/home/dpsifr/Projects/venue/apps/web/server.ts` |
|
|
25
25
|
| `modules/auth` | `@soulcraft/auth` + Workshop auth | `/media/dpsifr/storage/home/Projects/auth/packages/auth/src/` + `/media/dpsifr/storage/home/Projects/workshop/auth/better-auth.ts` |
|
|
26
26
|
| `modules/license` | Workshop usage + billing | `/media/dpsifr/storage/home/Projects/workshop/brainy/usage-tracking.ts` + `brainy/config-service.ts` |
|
|
27
|
-
| `modules/ai` | Workshop chat | `/media/dpsifr/storage/home/Projects/workshop/chat/` (models.ts, delegator.ts, executor.ts, planner.ts, tools.ts, ui-actions.ts) + `routes/
|
|
27
|
+
| `modules/ai` | Workshop chat | `/media/dpsifr/storage/home/Projects/workshop/chat/` (models.ts, delegator.ts, executor.ts, planner.ts, tools.ts, ui-actions.ts) + `routes/ai.ts` |
|
|
28
28
|
| `modules/events` | Workshop data-change-emitter | `/media/dpsifr/storage/home/Projects/workshop/events/data-change-emitter.ts` |
|
|
29
29
|
| `modules/skills` | Workshop skill service | `/media/dpsifr/storage/home/Projects/workshop/brainy/skill-service.ts` + `brainy/bundled-skills.ts` |
|
|
30
30
|
| `modules/kits` | Workshop kit loader | `/media/dpsifr/storage/home/Projects/workshop/src/lib/templates/loader.ts` |
|
|
@@ -425,11 +425,11 @@ From `chat/ui-actions.ts`:
|
|
|
425
425
|
- `isUIAction(name)`, `getUIAction(name)` helpers
|
|
426
426
|
- `UIAction`, `UIActionParam` types
|
|
427
427
|
|
|
428
|
-
#### `src/modules/ai/
|
|
429
|
-
From `routes/
|
|
430
|
-
- `
|
|
431
|
-
- `
|
|
432
|
-
- `
|
|
428
|
+
#### `src/modules/ai/companion.ts`
|
|
429
|
+
From `routes/ai.ts`:
|
|
430
|
+
- `AiPersona` type — name, description, systemPrompt, voice, etc.
|
|
431
|
+
- `createAiHandler(options)` — Hono route handler factory for `/api/ai/*`
|
|
432
|
+
- `AiGenerateRequest`, `AiChatRequest`, `AiChatResponse` types
|
|
433
433
|
- Max tokens: 1024 default, 2048 ceiling
|
|
434
434
|
- Stateless generate + session-based chat endpoints
|
|
435
435
|
|
package/docs/KIT-APP-GUIDE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Kit App Guide — @soulcraft/sdk
|
|
2
2
|
|
|
3
3
|
> **This guide lives at `/docs/KIT-APP-GUIDE.md` in your workspace VFS.**
|
|
4
|
-
> It is here for you (the developer) AND for
|
|
4
|
+
> It is here for you (the developer) AND for Brainy (the AI assistant).
|
|
5
5
|
> Reference it any time you need to know what the SDK can do or how to use it.
|
|
6
6
|
|
|
7
7
|
---
|
|
@@ -888,7 +888,7 @@ export default {
|
|
|
888
888
|
|
|
889
889
|
---
|
|
890
890
|
|
|
891
|
-
## For
|
|
891
|
+
## For Brainy (AI Assistant)
|
|
892
892
|
|
|
893
893
|
When generating kit app code, always:
|
|
894
894
|
|