@intelligo-dev/core 1.0.0-beta.13 → 1.0.0-beta.15
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/db/schema/billing.d.ts +207 -2
- package/dist/db/schema/billing.d.ts.map +1 -1
- package/dist/db/schema/billing.js +32 -3
- package/dist/db/schema/billing.js.map +1 -1
- package/dist/db/schema/usage.d.ts +20 -2
- package/dist/db/schema/usage.d.ts.map +1 -1
- package/dist/db/schema/usage.js +17 -9
- package/dist/db/schema/usage.js.map +1 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +7 -1
- package/dist/env.js.map +1 -1
- package/dist/identity/index.d.ts +4 -3
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +3 -2
- package/dist/identity/index.js.map +1 -1
- package/dist/identity/service.d.ts +20 -4
- package/dist/identity/service.d.ts.map +1 -1
- package/dist/identity/service.js +78 -3
- package/dist/identity/service.js.map +1 -1
- package/dist/identity/types.d.ts +28 -1
- package/dist/identity/types.d.ts.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/types.d.ts +8 -1
- package/dist/notifications/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/db/migrations/0003_local_payments.sql +18 -0
- package/src/db/migrations/0004_usage_subjects.sql +5 -0
- package/src/db/migrations/README.md +31 -2
- package/src/db/migrations/legacy-chain.json +13 -4
- package/src/db/migrations/meta/0003_snapshot.json +4501 -0
- package/src/db/migrations/meta/0004_snapshot.json +4504 -0
- package/src/db/migrations/meta/_journal.json +14 -0
- package/src/db/schema/billing.ts +39 -3
- package/src/db/schema/usage.ts +17 -9
- package/src/env.ts +10 -3
- package/src/identity/index.ts +4 -1
- package/src/identity/service.ts +106 -5
- package/src/identity/types.ts +30 -0
- package/src/notifications/index.ts +5 -1
- package/src/notifications/types.ts +9 -1
package/dist/identity/service.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Server-only reads and mutations over the user identity graph: fact
|
|
3
|
-
* listing and deletion, a full data export,
|
|
3
|
+
* listing and deletion, the profile snapshot's write, a full data export,
|
|
4
|
+
* and the memory-audit trail.
|
|
4
5
|
*
|
|
5
6
|
* `deleteFact` does not touch the cached profile snapshot; profile synthesis
|
|
6
|
-
* is the product's AI code, so a caller that owns it re-triggers it
|
|
7
|
+
* is the product's AI code, so a caller that owns it re-triggers it and
|
|
8
|
+
* stores the result with `saveProfileSnapshot`.
|
|
7
9
|
*
|
|
8
10
|
* Callers pass a resolved actor (workspaceId, userId); core cannot depend on
|
|
9
11
|
* `@intelligo-dev/auth`. Every query filters by both ids. Every mutation
|
|
10
12
|
* writes a `user_memory_audit` row. Failures throw `IdentityServiceError`.
|
|
11
13
|
*/
|
|
12
|
-
import { and, desc, eq } from "drizzle-orm";
|
|
14
|
+
import { and, desc, eq, sql } from "drizzle-orm";
|
|
13
15
|
import { db } from "../db/index.js";
|
|
14
16
|
import { userFacts, userMemories, userProfileSnapshots, userMemoryAudit, } from "../db/schema/index.js";
|
|
15
17
|
import { recordMemoryAudit } from "./audit.js";
|
|
@@ -129,4 +131,77 @@ export async function exportIdentity(actor) {
|
|
|
129
131
|
audit,
|
|
130
132
|
};
|
|
131
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Store the actor's synthesized profile — one row per user per workspace,
|
|
136
|
+
* inserted on the first synthesis and replaced on every later one. The
|
|
137
|
+
* version is bumped in the same statement (`ON CONFLICT … version + 1`),
|
|
138
|
+
* so two syntheses racing each other get two versions rather than one
|
|
139
|
+
* overwriting the other's number; it starts at 1.
|
|
140
|
+
*
|
|
141
|
+
* A field left `undefined` keeps what the row holds (null on insert); an
|
|
142
|
+
* explicit `null` clears it. `synthesizedAt` defaults to now. Records an
|
|
143
|
+
* audit row (`snapshot`, `create` or `update`) in the same transaction,
|
|
144
|
+
* attributed to `input.actorKind` — `system_job` unless the caller says
|
|
145
|
+
* otherwise. Throws `invalid_input` for an empty summary.
|
|
146
|
+
*/
|
|
147
|
+
export async function saveProfileSnapshot(actor, input) {
|
|
148
|
+
if (!input.summary || input.summary.trim().length === 0) {
|
|
149
|
+
throw new IdentityServiceError("invalid_input", "summary is required");
|
|
150
|
+
}
|
|
151
|
+
if (input.factsDigest === undefined || input.factsDigest === null) {
|
|
152
|
+
throw new IdentityServiceError("invalid_input", "factsDigest is required");
|
|
153
|
+
}
|
|
154
|
+
const replaced = {
|
|
155
|
+
summary: input.summary,
|
|
156
|
+
factsDigest: input.factsDigest,
|
|
157
|
+
synthesizedAt: input.synthesizedAt ?? new Date(),
|
|
158
|
+
...definedOnly({
|
|
159
|
+
summaryEn: input.summaryEn,
|
|
160
|
+
summaryMn: input.summaryMn,
|
|
161
|
+
activeGoals: input.activeGoals,
|
|
162
|
+
personalitySignals: input.personalitySignals,
|
|
163
|
+
relationshipNotes: input.relationshipNotes,
|
|
164
|
+
synthesizedByModel: input.synthesizedByModel,
|
|
165
|
+
nextSynthesisAt: input.nextSynthesisAt,
|
|
166
|
+
triggerReason: input.triggerReason,
|
|
167
|
+
}),
|
|
168
|
+
};
|
|
169
|
+
return db.transaction(async (tx) => {
|
|
170
|
+
const [row] = await tx
|
|
171
|
+
.insert(userProfileSnapshots)
|
|
172
|
+
.values({
|
|
173
|
+
userId: actor.userId,
|
|
174
|
+
workspaceId: actor.workspaceId,
|
|
175
|
+
version: 1,
|
|
176
|
+
...replaced,
|
|
177
|
+
})
|
|
178
|
+
.onConflictDoUpdate({
|
|
179
|
+
target: [userProfileSnapshots.userId, userProfileSnapshots.workspaceId],
|
|
180
|
+
set: {
|
|
181
|
+
...replaced,
|
|
182
|
+
version: sql `${userProfileSnapshots.version} + 1`,
|
|
183
|
+
},
|
|
184
|
+
})
|
|
185
|
+
.returning();
|
|
186
|
+
if (!row) {
|
|
187
|
+
throw new IdentityServiceError("database_error", "Failed to save profile snapshot");
|
|
188
|
+
}
|
|
189
|
+
await recordMemoryAudit({
|
|
190
|
+
userId: actor.userId,
|
|
191
|
+
workspaceId: actor.workspaceId,
|
|
192
|
+
targetKind: "snapshot",
|
|
193
|
+
targetId: actor.userId,
|
|
194
|
+
action: row.version === 1 ? "create" : "update",
|
|
195
|
+
actorKind: input.actorKind ?? "system_job",
|
|
196
|
+
actorId: input.actorId,
|
|
197
|
+
afterValue: { version: row.version, triggerReason: row.triggerReason },
|
|
198
|
+
reason: input.reason,
|
|
199
|
+
}, tx);
|
|
200
|
+
return row;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/** The entries whose value is not `undefined` — `null` is kept, to clear. */
|
|
204
|
+
function definedOnly(fields) {
|
|
205
|
+
return Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined));
|
|
206
|
+
}
|
|
132
207
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/identity/service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/identity/service.ts"],"names":[],"mappings":"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"}
|
package/dist/identity/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { UserFact, UserMemory, UserProfileSnapshot, UserMemoryAuditRow } from "../db/schema/index.js";
|
|
1
|
+
import type { AuditActorKind, SynthesisTriggerReason, UserFact, UserMemory, UserProfileSnapshot, UserMemoryAuditRow } from "../db/schema/index.js";
|
|
2
2
|
export type { UserFact, UserMemory, UserProfileSnapshot, UserMemoryAuditRow };
|
|
3
3
|
/** Resolved actor identity — every query is scoped to this pair. */
|
|
4
4
|
export type IdentityActor = {
|
|
@@ -21,4 +21,31 @@ export type IdentityExport = {
|
|
|
21
21
|
snapshot: UserProfileSnapshot | null;
|
|
22
22
|
audit: UserMemoryAuditRow[];
|
|
23
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* A synthesized profile, as `saveProfileSnapshot` stores it. The actor
|
|
26
|
+
* supplies the tenancy; the version is the store's.
|
|
27
|
+
*/
|
|
28
|
+
export type SaveProfileSnapshotInput = {
|
|
29
|
+
/** The summary a prompt hydrates from, in the product's primary language. */
|
|
30
|
+
summary: string;
|
|
31
|
+
summaryEn?: string | null;
|
|
32
|
+
summaryMn?: string | null;
|
|
33
|
+
/** The structured digest the summary was written from. */
|
|
34
|
+
factsDigest: unknown;
|
|
35
|
+
activeGoals?: unknown;
|
|
36
|
+
personalitySignals?: unknown;
|
|
37
|
+
relationshipNotes?: unknown;
|
|
38
|
+
/** The model that wrote it, or a label for a deterministic synthesis. */
|
|
39
|
+
synthesizedByModel?: string | null;
|
|
40
|
+
/** Default: now. */
|
|
41
|
+
synthesizedAt?: Date;
|
|
42
|
+
/** When a scheduled re-synthesis may next pick this user up. */
|
|
43
|
+
nextSynthesisAt?: Date | null;
|
|
44
|
+
triggerReason?: SynthesisTriggerReason | null;
|
|
45
|
+
/** Who the audit row names. Default `"system_job"`. */
|
|
46
|
+
actorKind?: AuditActorKind;
|
|
47
|
+
actorId?: string;
|
|
48
|
+
/** Recorded on the audit row. */
|
|
49
|
+
reason?: string;
|
|
50
|
+
};
|
|
24
51
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/identity/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;AAE9E,oEAAoE;AACpE,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/identity/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;AAE9E,oEAAoE;AACpE,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0DAA0D;IAC1D,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,oBAAoB;IACpB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,gEAAgE;IAChE,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC9C,uDAAuD;IACvD,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* their notifications from every workspace.
|
|
4
4
|
*/
|
|
5
5
|
import type { CreateNotificationParams } from "./types.js";
|
|
6
|
-
export type { NotificationType, CreateNotificationParams } from "./types.js";
|
|
6
|
+
export type { BuiltInNotificationType, NotificationType, CreateNotificationParams, } from "./types.js";
|
|
7
7
|
export { triggerQuotaNotification, triggerTrialNotification, triggerPaymentFailedNotification, triggerTeamMemberJoinedNotification, } from "./triggers.js";
|
|
8
8
|
/** Creates a notification; `metadata` is stored as a JSON string. */
|
|
9
9
|
export declare function createNotification(params: CreateNotificationParams): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD,YAAY,EACV,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,gCAAgC,EAChC,mCAAmC,GACpC,MAAM,YAAY,CAAC;AAEpB,qEAAqE;AACrE,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB;;;;;;;;;;eAcxE;AAED,qDAAqD;AACrD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW;;;;;;;;;;;cA6DD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;MAjDhD;AAED,qDAAqD;AACrD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;;;;;;;;;;;cA8CtD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;MArChD;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1E;AAED,mEAAmE;AACnE,wBAAsB,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAUtE;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,iBAOjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AASnD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,gCAAgC,EAChC,mCAAmC,GACpC,MAAM,YAAY,CAAC;AAEpB,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAgC;IACvE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,EAAE;SAC5B,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC;QACN,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;KACnE,CAAC;SACD,SAAS,EAAE,CAAC;IAEf,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,QAAgB,EAAE;IAElB,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,EAAE;SACR,IAAI,CAAC,aAAa,CAAC;SACnB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CACvE;SACA,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SACtC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhB,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,QAAgB,EAAE;IACvE,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,EAAE;SACR,IAAI,CAAC,aAAa,CAAC;SACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACvC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SACtC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhB,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc;IACvD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;SACtB,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;SAC1B,IAAI,CAAC,aAAa,CAAC;SACnB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CACvE,CAAC;IAEJ,OAAO,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,cAAsB,EAAE,MAAc;IACrE,MAAM,EAAE;SACL,MAAM,CAAC,aAAa,CAAC;SACrB,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACrB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,cAAc,CAAC,EACpC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CACjC,CACF,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,MAAM,EAAE;SACL,MAAM,CAAC,aAAa,CAAC;SACrB,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACrB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CACvE,CAAC;AACN,CAAC;AAED,SAAS,aAAa,CACpB,YAAe;IAEf,OAAO;QACL,GAAG,YAAY;QACf,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC7B,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAA6B;YAChE,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/** The notification types the framework itself creates. */
|
|
2
|
+
export type BuiltInNotificationType = "quota_warning_80" | "quota_warning_100" | "trial_warning_20" | "trial_depleted" | "payment_failed" | "team_member_joined" | "subscription_confirmed" | "workspace_invitation";
|
|
3
|
+
/**
|
|
4
|
+
* A notification's `type`: one of the built-in types, or any string a
|
|
5
|
+
* product defines for its own notifications. `(string & {})` keeps the
|
|
6
|
+
* built-in names offered by autocompletion.
|
|
7
|
+
*/
|
|
8
|
+
export type NotificationType = BuiltInNotificationType | (string & {});
|
|
2
9
|
export interface CreateNotificationParams {
|
|
3
10
|
userId: string;
|
|
4
11
|
workspaceId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/notifications/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/notifications/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,GACpB,wBAAwB,GACxB,sBAAsB,CAAC;AAE3B;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
CREATE TABLE "payments" (
|
|
2
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
3
|
+
"provider" text NOT NULL,
|
|
4
|
+
"invoice_id" text NOT NULL,
|
|
5
|
+
"workspace_id" text NOT NULL,
|
|
6
|
+
"user_id" text,
|
|
7
|
+
"reference" text NOT NULL,
|
|
8
|
+
"amount_minor" integer NOT NULL,
|
|
9
|
+
"currency" text NOT NULL,
|
|
10
|
+
"status" text DEFAULT 'pending' NOT NULL,
|
|
11
|
+
"fulfilled_at" timestamp,
|
|
12
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
13
|
+
CONSTRAINT "payments_invoice_id_unique" UNIQUE("invoice_id")
|
|
14
|
+
);
|
|
15
|
+
--> statement-breakpoint
|
|
16
|
+
ALTER TABLE "payments" ADD CONSTRAINT "payments_workspace_id_organization_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
17
|
+
ALTER TABLE "payments" ADD CONSTRAINT "payments_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
18
|
+
CREATE INDEX "payments_workspace_id_idx" ON "payments" USING btree ("workspace_id");
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
ALTER TABLE "rate_limit_entries" DROP CONSTRAINT "rate_limit_entries_workspace_id_organization_id_fk";
|
|
2
|
+
--> statement-breakpoint
|
|
3
|
+
ALTER TABLE "usage_records" ALTER COLUMN "user_id" DROP NOT NULL;--> statement-breakpoint
|
|
4
|
+
ALTER TABLE "rate_limit_entries" ADD COLUMN "window_seconds" integer DEFAULT 60 NOT NULL;--> statement-breakpoint
|
|
5
|
+
ALTER TABLE "executions" ADD COLUMN "price_micros" bigint;
|
|
@@ -63,8 +63,37 @@ the few places where the old chain and the schema disagreed into line
|
|
|
63
63
|
created that the framework no longer defines are left untouched; a
|
|
64
64
|
product that still uses them keeps them in its own migrations.
|
|
65
65
|
|
|
66
|
-
A database that ran only part of the old chain is refused
|
|
67
|
-
|
|
66
|
+
A database that ran only part of the old chain is refused, and
|
|
67
|
+
`intelligo migrate --check` names the migrations it has not run
|
|
68
|
+
(`legacyMissing` in `--json`). No published version finishes the old
|
|
69
|
+
chain: `@intelligo-dev/core@1.0.0-beta.6`, the last one on npm before the
|
|
70
|
+
baseline, ships it through `0042_sessions_active_organization_id`, and
|
|
71
|
+
the versions that carried `0043_attachments`, `0044_money_micros`,
|
|
72
|
+
`0045_drop_legacy_money_columns` and `0046_user_quotas_per_workspace`
|
|
73
|
+
never reached npm. Their SQL is not in the public repository either:
|
|
74
|
+
its last revision before the baseline, `fdc6c3d`, lists all 48 in the
|
|
75
|
+
journal but carries no `.sql` files. That leaves three ways forward;
|
|
76
|
+
try each on a restored copy first.
|
|
77
|
+
|
|
78
|
+
1. **You have the missing SQL** — a source checkout of the pre-1.0
|
|
79
|
+
framework that contains the files. Apply each missing migration in
|
|
80
|
+
chain order and record it in `drizzle.__drizzle_migrations`: `hash`
|
|
81
|
+
is the sha256 of the file's contents, which must be the one
|
|
82
|
+
`legacy-chain.json` lists, and `created_at` its journal `when`. Once
|
|
83
|
+
the database holds the whole chain, `intelligo migrate` adopts it.
|
|
84
|
+
2. **You do not** — bring the schema to the baseline by hand, then
|
|
85
|
+
record the baseline as applied the way a push-provisioned database is
|
|
86
|
+
(next section). Create an empty database, run `intelligo migrate`
|
|
87
|
+
there, and compare the two schemas (`pg_dump --schema-only`); what
|
|
88
|
+
differs is what `0043`–`0046` would have done. Mind the data, not
|
|
89
|
+
only the columns: `0044` backfilled every money amount into
|
|
90
|
+
`*_micros` columns (MNT at ×1,000,000) with a currency, and `0045`
|
|
91
|
+
dropped the old `*_mnt` and cents columns only after that copy.
|
|
92
|
+
Clear the old chain's rows from `drizzle.__drizzle_migrations` and
|
|
93
|
+
insert the current chain's before the first `intelligo migrate`.
|
|
94
|
+
3. **Start over** — create the database from the baseline and move the
|
|
95
|
+
rows you keep across. For a deployment whose data is disposable this
|
|
96
|
+
is the shortest path.
|
|
68
97
|
|
|
69
98
|
## Baselining a push-provisioned database
|
|
70
99
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$comment": "The framework's migration chain before the 1.0 baseline: every entry's tag and the sha256 of its .sql file, as drizzle recorded it in drizzle.__drizzle_migrations. `intelligo migrate` reads it to adopt a database that ran the whole old chain \u2014 it records 0000_baseline as applied without running it. The SQL itself is not shipped.",
|
|
2
|
+
"$comment": "The framework's migration chain before the 1.0 baseline: every entry's tag and the sha256 of its .sql file, as drizzle recorded it in drizzle.__drizzle_migrations. `intelligo migrate` reads it to adopt a database that ran the whole old chain \u2014 it records 0000_baseline as applied without running it. The SQL itself is not shipped. `alternates`: other hashes the same migration was recorded under \u2014 the SQL npm shipped in 1.0.0-beta.6 differs from the repository's for three of them.",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
5
|
"tag": "0000_sharp_night_nurse",
|
|
@@ -151,7 +151,10 @@
|
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
153
|
"tag": "0036_executions_audit_jobs",
|
|
154
|
-
"hash": "8665606757ec96bbd48eaab2b2ebb1ee5b5a86d58ba73635b3229ff94c40e572"
|
|
154
|
+
"hash": "8665606757ec96bbd48eaab2b2ebb1ee5b5a86d58ba73635b3229ff94c40e572",
|
|
155
|
+
"alternates": [
|
|
156
|
+
"c93a93db58737ef13f25138b107711a86f4f21efb48d1c83c18f2ffa07831c3d"
|
|
157
|
+
]
|
|
155
158
|
},
|
|
156
159
|
{
|
|
157
160
|
"tag": "0037_rate_limit_minute_bucket",
|
|
@@ -159,7 +162,10 @@
|
|
|
159
162
|
},
|
|
160
163
|
{
|
|
161
164
|
"tag": "0038_user_quotas_generic_usage",
|
|
162
|
-
"hash": "658b6f64424522d955f2aa4d2ce1fe32b52f0e5adbdba14af75c1678389d7754"
|
|
165
|
+
"hash": "658b6f64424522d955f2aa4d2ce1fe32b52f0e5adbdba14af75c1678389d7754",
|
|
166
|
+
"alternates": [
|
|
167
|
+
"822df887955ddfdb138146ae47612dd0c37c5419b67223b6309b82253efc1c53"
|
|
168
|
+
]
|
|
163
169
|
},
|
|
164
170
|
{
|
|
165
171
|
"tag": "0039_platform_admin_impersonation",
|
|
@@ -167,7 +173,10 @@
|
|
|
167
173
|
},
|
|
168
174
|
{
|
|
169
175
|
"tag": "0040_ee_audit_chain",
|
|
170
|
-
"hash": "16b01fa704f75e13fe85cee307a2dd287e3cbd93e77fd58ce0eb18cc32e178e6"
|
|
176
|
+
"hash": "16b01fa704f75e13fe85cee307a2dd287e3cbd93e77fd58ce0eb18cc32e178e6",
|
|
177
|
+
"alternates": [
|
|
178
|
+
"3a432628f1dcf4c4efbda0421901421fdaaa99c498abdb22ee21c6baef24a005"
|
|
179
|
+
]
|
|
171
180
|
},
|
|
172
181
|
{
|
|
173
182
|
"tag": "0041_audit_events_append_only",
|