@apart-tech/intelligence-core 1.11.4 → 1.11.6
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/auth/ability.d.ts +148 -0
- package/dist/auth/ability.d.ts.map +1 -0
- package/dist/auth/ability.js +291 -0
- package/dist/auth/ability.js.map +1 -0
- package/dist/auth/ability.test.d.ts +2 -0
- package/dist/auth/ability.test.d.ts.map +1 -0
- package/dist/auth/ability.test.js +693 -0
- package/dist/auth/ability.test.js.map +1 -0
- package/dist/auth/delegation-jwt.d.ts +167 -0
- package/dist/auth/delegation-jwt.d.ts.map +1 -0
- package/dist/auth/delegation-jwt.js +237 -0
- package/dist/auth/delegation-jwt.js.map +1 -0
- package/dist/auth/delegation-jwt.test.d.ts +2 -0
- package/dist/auth/delegation-jwt.test.d.ts.map +1 -0
- package/dist/auth/delegation-jwt.test.js +283 -0
- package/dist/auth/delegation-jwt.test.js.map +1 -0
- package/dist/auth/principal.d.ts +94 -0
- package/dist/auth/principal.d.ts.map +1 -0
- package/dist/auth/principal.js +33 -0
- package/dist/auth/principal.js.map +1 -0
- package/dist/config/config.test.d.ts +2 -0
- package/dist/config/config.test.d.ts.map +1 -0
- package/dist/config/config.test.js +57 -0
- package/dist/config/config.test.js.map +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +22 -1
- package/dist/config/index.js.map +1 -1
- package/dist/db/tenant.d.ts.map +1 -1
- package/dist/db/tenant.js +8 -0
- package/dist/db/tenant.js.map +1 -1
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/jwt.test.d.ts +2 -0
- package/dist/lib/__tests__/jwt.test.d.ts.map +1 -0
- package/dist/lib/__tests__/jwt.test.js +97 -0
- package/dist/lib/__tests__/jwt.test.js.map +1 -0
- package/dist/lib/jwt.d.ts +20 -0
- package/dist/lib/jwt.d.ts.map +1 -1
- package/dist/lib/jwt.js +56 -3
- package/dist/lib/jwt.js.map +1 -1
- package/dist/services/__tests__/chunk-service.test.d.ts +2 -0
- package/dist/services/__tests__/chunk-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/chunk-service.test.js +111 -0
- package/dist/services/__tests__/chunk-service.test.js.map +1 -0
- package/dist/services/__tests__/chunker.test.d.ts +2 -0
- package/dist/services/__tests__/chunker.test.d.ts.map +1 -0
- package/dist/services/__tests__/chunker.test.js +113 -0
- package/dist/services/__tests__/chunker.test.js.map +1 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.d.ts +2 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.js +211 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.js.map +1 -0
- package/dist/services/__tests__/node-service.test.d.ts +2 -0
- package/dist/services/__tests__/node-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/node-service.test.js +207 -0
- package/dist/services/__tests__/node-service.test.js.map +1 -0
- package/dist/services/__tests__/pii-detector-service.test.js +51 -0
- package/dist/services/__tests__/pii-detector-service.test.js.map +1 -1
- package/dist/services/__tests__/pii-encryption-service.test.js +37 -0
- package/dist/services/__tests__/pii-encryption-service.test.js.map +1 -1
- package/dist/services/__tests__/search-service.test.d.ts +2 -0
- package/dist/services/__tests__/search-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/search-service.test.js +163 -0
- package/dist/services/__tests__/search-service.test.js.map +1 -0
- package/dist/services/agent-run-service.d.ts +44 -7
- package/dist/services/agent-run-service.d.ts.map +1 -1
- package/dist/services/agent-run-service.js +14 -0
- package/dist/services/agent-run-service.js.map +1 -1
- package/dist/services/agent-schedule-service.d.ts +21 -0
- package/dist/services/agent-schedule-service.d.ts.map +1 -1
- package/dist/services/agent-schedule-service.js +12 -0
- package/dist/services/agent-schedule-service.js.map +1 -1
- package/dist/services/audit-event-service.d.ts +76 -0
- package/dist/services/audit-event-service.d.ts.map +1 -0
- package/dist/services/audit-event-service.js +48 -0
- package/dist/services/audit-event-service.js.map +1 -0
- package/dist/services/backfill-chunks.d.ts +30 -0
- package/dist/services/backfill-chunks.d.ts.map +1 -0
- package/dist/services/backfill-chunks.js +55 -0
- package/dist/services/backfill-chunks.js.map +1 -0
- package/dist/services/chunk-service.d.ts +45 -0
- package/dist/services/chunk-service.d.ts.map +1 -0
- package/dist/services/chunk-service.js +111 -0
- package/dist/services/chunk-service.js.map +1 -0
- package/dist/services/chunker.d.ts +32 -0
- package/dist/services/chunker.d.ts.map +1 -0
- package/dist/services/chunker.js +289 -0
- package/dist/services/chunker.js.map +1 -0
- package/dist/services/context-service.d.ts +3 -1
- package/dist/services/context-service.d.ts.map +1 -1
- package/dist/services/context-service.js +17 -1
- package/dist/services/context-service.js.map +1 -1
- package/dist/services/delegation-cleanup-service.d.ts +133 -0
- package/dist/services/delegation-cleanup-service.d.ts.map +1 -0
- package/dist/services/delegation-cleanup-service.js +111 -0
- package/dist/services/delegation-cleanup-service.js.map +1 -0
- package/dist/services/edge-service.d.ts.map +1 -1
- package/dist/services/edge-service.js +3 -0
- package/dist/services/edge-service.js.map +1 -1
- package/dist/services/node-service.d.ts +12 -1
- package/dist/services/node-service.d.ts.map +1 -1
- package/dist/services/node-service.js +54 -11
- package/dist/services/node-service.js.map +1 -1
- package/dist/services/org-agent-type-service.d.ts +15 -0
- package/dist/services/org-agent-type-service.d.ts.map +1 -1
- package/dist/services/org-agent-type-service.js +2 -0
- package/dist/services/org-agent-type-service.js.map +1 -1
- package/dist/services/pii-detector-service.d.ts +1 -0
- package/dist/services/pii-detector-service.d.ts.map +1 -1
- package/dist/services/pii-detector-service.js +95 -2
- package/dist/services/pii-detector-service.js.map +1 -1
- package/dist/services/pii-encryption-service.d.ts +10 -0
- package/dist/services/pii-encryption-service.d.ts.map +1 -1
- package/dist/services/pii-encryption-service.js +32 -0
- package/dist/services/pii-encryption-service.js.map +1 -1
- package/dist/services/search-service.d.ts +30 -1
- package/dist/services/search-service.d.ts.map +1 -1
- package/dist/services/search-service.js +262 -45
- package/dist/services/search-service.js.map +1 -1
- package/dist/services/tag-service.d.ts +78 -0
- package/dist/services/tag-service.d.ts.map +1 -0
- package/dist/services/tag-service.js +639 -0
- package/dist/services/tag-service.js.map +1 -0
- package/dist/services/tag-service.test.d.ts +2 -0
- package/dist/services/tag-service.test.d.ts.map +1 -0
- package/dist/services/tag-service.test.js +448 -0
- package/dist/services/tag-service.test.js.map +1 -0
- package/dist/services/usage-service.d.ts +48 -0
- package/dist/services/usage-service.d.ts.map +1 -0
- package/dist/services/usage-service.js +116 -0
- package/dist/services/usage-service.js.map +1 -0
- package/dist/services/user-service.d.ts.map +1 -1
- package/dist/services/user-service.js +24 -6
- package/dist/services/user-service.js.map +1 -1
- package/dist/services/user-service.test.d.ts +2 -0
- package/dist/services/user-service.test.d.ts.map +1 -0
- package/dist/services/user-service.test.js +86 -0
- package/dist/services/user-service.test.js.map +1 -0
- package/dist/services/workspace-service.d.ts +2 -0
- package/dist/services/workspace-service.d.ts.map +1 -1
- package/dist/services/workspace-service.js +7 -1
- package/dist/services/workspace-service.js.map +1 -1
- package/dist/types/index.d.ts +80 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -2
- package/prisma/schema.prisma +335 -82
- package/dist/db/schema.d.ts +0 -507
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -77
- package/dist/db/schema.js.map +0 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
const PLAN_LIMITS = {
|
|
2
|
+
free: {
|
|
3
|
+
maxNodes: 500,
|
|
4
|
+
maxApiCallsPerMonth: 1_000,
|
|
5
|
+
maxMembers: 3,
|
|
6
|
+
},
|
|
7
|
+
pro: {
|
|
8
|
+
maxNodes: Infinity,
|
|
9
|
+
maxApiCallsPerMonth: 50_000,
|
|
10
|
+
maxMembers: Infinity,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Service for tracking and querying organization usage.
|
|
15
|
+
*
|
|
16
|
+
* Node and member counts are live queries against the existing tables.
|
|
17
|
+
* API call counts use a dedicated usage_records table with upsert-based
|
|
18
|
+
* incrementing (one row per org per metric per month).
|
|
19
|
+
*/
|
|
20
|
+
export class UsageService {
|
|
21
|
+
db;
|
|
22
|
+
constructor(db) {
|
|
23
|
+
this.db = db;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the full usage snapshot for an organization.
|
|
27
|
+
*/
|
|
28
|
+
async getUsage(organizationId) {
|
|
29
|
+
const [org, nodeCount, memberCount, apiCalls] = await Promise.all([
|
|
30
|
+
this.db.organization.findUnique({
|
|
31
|
+
where: { id: organizationId },
|
|
32
|
+
select: { plan: true, stripeCustomerId: true, stripeSubscriptionId: true, currentPeriodEnd: true },
|
|
33
|
+
}),
|
|
34
|
+
this.db.node.count({ where: { organizationId } }),
|
|
35
|
+
this.db.membership.count({ where: { organizationId } }),
|
|
36
|
+
this.getApiCallCount(organizationId),
|
|
37
|
+
]);
|
|
38
|
+
const plan = org?.plan ?? "free";
|
|
39
|
+
const limits = PLAN_LIMITS[plan] ?? PLAN_LIMITS.free;
|
|
40
|
+
return {
|
|
41
|
+
plan,
|
|
42
|
+
limits,
|
|
43
|
+
usage: {
|
|
44
|
+
nodes: nodeCount,
|
|
45
|
+
apiCalls,
|
|
46
|
+
members: memberCount,
|
|
47
|
+
},
|
|
48
|
+
stripeCustomerId: org?.stripeCustomerId ?? null,
|
|
49
|
+
stripeSubscriptionId: org?.stripeSubscriptionId ?? null,
|
|
50
|
+
currentPeriodEnd: org?.currentPeriodEnd ?? null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Increment the API call counter for the current month.
|
|
55
|
+
* Uses upsert to create or increment atomically.
|
|
56
|
+
*/
|
|
57
|
+
async incrementApiCalls(organizationId, count = 1) {
|
|
58
|
+
const periodStart = this.currentPeriodStart();
|
|
59
|
+
await this.db.usageRecord.upsert({
|
|
60
|
+
where: {
|
|
61
|
+
organizationId_metric_periodStart: {
|
|
62
|
+
organizationId,
|
|
63
|
+
metric: "api_calls",
|
|
64
|
+
periodStart,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
create: {
|
|
68
|
+
organizationId,
|
|
69
|
+
metric: "api_calls",
|
|
70
|
+
periodStart,
|
|
71
|
+
count,
|
|
72
|
+
},
|
|
73
|
+
update: {
|
|
74
|
+
count: { increment: count },
|
|
75
|
+
updatedAt: new Date(),
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check whether an organization has exceeded a specific limit.
|
|
81
|
+
*/
|
|
82
|
+
async isOverLimit(organizationId, metric) {
|
|
83
|
+
const snapshot = await this.getUsage(organizationId);
|
|
84
|
+
const limits = snapshot.limits;
|
|
85
|
+
switch (metric) {
|
|
86
|
+
case "nodes":
|
|
87
|
+
return snapshot.usage.nodes >= limits.maxNodes;
|
|
88
|
+
case "apiCalls":
|
|
89
|
+
return snapshot.usage.apiCalls >= limits.maxApiCallsPerMonth;
|
|
90
|
+
case "members":
|
|
91
|
+
return snapshot.usage.members >= limits.maxMembers;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async getApiCallCount(organizationId) {
|
|
95
|
+
const periodStart = this.currentPeriodStart();
|
|
96
|
+
const record = await this.db.usageRecord.findUnique({
|
|
97
|
+
where: {
|
|
98
|
+
organizationId_metric_periodStart: {
|
|
99
|
+
organizationId,
|
|
100
|
+
metric: "api_calls",
|
|
101
|
+
periodStart,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
select: { count: true },
|
|
105
|
+
});
|
|
106
|
+
return record?.count ?? 0;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* First day of the current month at midnight UTC.
|
|
110
|
+
*/
|
|
111
|
+
currentPeriodStart() {
|
|
112
|
+
const now = new Date();
|
|
113
|
+
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=usage-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-service.js","sourceRoot":"","sources":["../../src/services/usage-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-service.d.ts","sourceRoot":"","sources":["../../src/services/user-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInF,YAAY,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,CAAC;AAE5E,qBAAa,WAAW;IACV,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAE9B,sBAAsB,CAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"user-service.d.ts","sourceRoot":"","sources":["../../src/services/user-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInF,YAAY,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,CAAC;AAE5E,qBAAa,WAAW;IACV,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAE9B,sBAAsB,CAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAyCV,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIzC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIrD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO5D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAStD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS5D,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAU7D,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMxD;AAID,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAChD"}
|
|
@@ -6,12 +6,12 @@ export class UserService {
|
|
|
6
6
|
this.db = db;
|
|
7
7
|
}
|
|
8
8
|
async findOrCreateByAuth0Sub(auth0Sub, email, name) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (
|
|
9
|
+
// Fast path: exact auth0Sub match (covers 99% of requests)
|
|
10
|
+
const bySubject = await this.db.user.findUnique({ where: { auth0Sub } });
|
|
11
|
+
if (bySubject) {
|
|
12
|
+
if (bySubject.email !== email || (name && bySubject.name !== name)) {
|
|
13
13
|
return this.db.user.update({
|
|
14
|
-
where: { id:
|
|
14
|
+
where: { id: bySubject.id },
|
|
15
15
|
data: {
|
|
16
16
|
email,
|
|
17
17
|
...(name ? { name } : {}),
|
|
@@ -19,7 +19,25 @@ export class UserService {
|
|
|
19
19
|
},
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
-
return
|
|
22
|
+
return bySubject;
|
|
23
|
+
}
|
|
24
|
+
// Email fallback: handles Auth0 tenant migration (Phase 1g).
|
|
25
|
+
// When a user authenticates from a new Auth0 tenant (e.g., cutover
|
|
26
|
+
// from apart.eu.auth0.com to apart-next-prod), their auth0Sub
|
|
27
|
+
// changes but their verified email stays the same. Rather than
|
|
28
|
+
// creating a duplicate user row, find the existing row by email
|
|
29
|
+
// and update its auth0Sub to the new value. The caller
|
|
30
|
+
// (resolveAuth0UserInfo) guarantees the email is verified.
|
|
31
|
+
const byEmail = await this.db.user.findFirst({ where: { email } });
|
|
32
|
+
if (byEmail) {
|
|
33
|
+
return this.db.user.update({
|
|
34
|
+
where: { id: byEmail.id },
|
|
35
|
+
data: {
|
|
36
|
+
auth0Sub,
|
|
37
|
+
...(name ? { name } : {}),
|
|
38
|
+
updatedAt: new Date(),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
23
41
|
}
|
|
24
42
|
return this.db.user.create({
|
|
25
43
|
data: { auth0Sub, email, name },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-service.js","sourceRoot":"","sources":["../../src/services/user-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAM9D,MAAM,OAAO,WAAW;IACF;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAG,CAAC;IAExC,KAAK,CAAC,sBAAsB,CAC1B,QAAgB,EAChB,KAAa,EACb,IAAa;QAEb,MAAM,
|
|
1
|
+
{"version":3,"file":"user-service.js","sourceRoot":"","sources":["../../src/services/user-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-service.test.d.ts","sourceRoot":"","sources":["../../src/services/user-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { UserService } from "./user-service.js";
|
|
3
|
+
/**
|
|
4
|
+
* Minimal mock of the Prisma user delegate — just enough for
|
|
5
|
+
* findOrCreateByAuth0Sub's three code paths.
|
|
6
|
+
*/
|
|
7
|
+
function makeMockDb(existingUsers) {
|
|
8
|
+
const store = [...existingUsers];
|
|
9
|
+
return {
|
|
10
|
+
user: {
|
|
11
|
+
findUnique: vi.fn(async ({ where }) => {
|
|
12
|
+
if (where.auth0Sub)
|
|
13
|
+
return store.find((u) => u.auth0Sub === where.auth0Sub) ?? null;
|
|
14
|
+
if (where.id)
|
|
15
|
+
return store.find((u) => u.id === where.id) ?? null;
|
|
16
|
+
return null;
|
|
17
|
+
}),
|
|
18
|
+
findFirst: vi.fn(async ({ where }) => {
|
|
19
|
+
return store.find((u) => u.email === where.email) ?? null;
|
|
20
|
+
}),
|
|
21
|
+
create: vi.fn(async ({ data }) => {
|
|
22
|
+
const user = { id: `new-${store.length}`, ...data, name: data.name ?? null };
|
|
23
|
+
store.push(user);
|
|
24
|
+
return user;
|
|
25
|
+
}),
|
|
26
|
+
update: vi.fn(async ({ where, data }) => {
|
|
27
|
+
const user = store.find((u) => u.id === where.id);
|
|
28
|
+
if (!user)
|
|
29
|
+
throw new Error(`User not found: ${where.id}`);
|
|
30
|
+
Object.assign(user, data);
|
|
31
|
+
return user;
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
describe("UserService.findOrCreateByAuth0Sub", () => {
|
|
37
|
+
it("returns existing user when auth0Sub matches (fast path)", async () => {
|
|
38
|
+
const db = makeMockDb([
|
|
39
|
+
{ id: "u-1", auth0Sub: "auth0|aaa", email: "alice@example.com", name: "Alice" },
|
|
40
|
+
]);
|
|
41
|
+
const svc = new UserService(db);
|
|
42
|
+
const result = await svc.findOrCreateByAuth0Sub("auth0|aaa", "alice@example.com", "Alice");
|
|
43
|
+
expect(result.id).toBe("u-1");
|
|
44
|
+
expect(result.auth0Sub).toBe("auth0|aaa");
|
|
45
|
+
expect(db.user.findFirst).not.toHaveBeenCalled(); // email fallback not reached
|
|
46
|
+
});
|
|
47
|
+
it("updates email/name on auth0Sub match when they changed", async () => {
|
|
48
|
+
const db = makeMockDb([
|
|
49
|
+
{ id: "u-1", auth0Sub: "auth0|aaa", email: "old@example.com", name: "Old Name" },
|
|
50
|
+
]);
|
|
51
|
+
const svc = new UserService(db);
|
|
52
|
+
const result = await svc.findOrCreateByAuth0Sub("auth0|aaa", "new@example.com", "New Name");
|
|
53
|
+
expect(result.id).toBe("u-1");
|
|
54
|
+
expect(result.email).toBe("new@example.com");
|
|
55
|
+
expect(db.user.update).toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
it("finds existing user by email when auth0Sub is new (tenant migration)", async () => {
|
|
58
|
+
const db = makeMockDb([
|
|
59
|
+
{ id: "u-1", auth0Sub: "auth0|old-tenant-sub", email: "alice@example.com", name: "Alice" },
|
|
60
|
+
]);
|
|
61
|
+
const svc = new UserService(db);
|
|
62
|
+
const result = await svc.findOrCreateByAuth0Sub("auth0|new-tenant-sub", "alice@example.com", "Alice");
|
|
63
|
+
expect(result.id).toBe("u-1"); // same user row, not a new one
|
|
64
|
+
expect(result.auth0Sub).toBe("auth0|new-tenant-sub"); // sub updated
|
|
65
|
+
expect(db.user.create).not.toHaveBeenCalled(); // no duplicate created
|
|
66
|
+
});
|
|
67
|
+
it("creates a new user when neither auth0Sub nor email matches", async () => {
|
|
68
|
+
const db = makeMockDb([
|
|
69
|
+
{ id: "u-1", auth0Sub: "auth0|existing", email: "existing@example.com", name: "Existing" },
|
|
70
|
+
]);
|
|
71
|
+
const svc = new UserService(db);
|
|
72
|
+
const result = await svc.findOrCreateByAuth0Sub("auth0|brand-new", "brand-new@example.com", "New Person");
|
|
73
|
+
expect(result.auth0Sub).toBe("auth0|brand-new");
|
|
74
|
+
expect(result.email).toBe("brand-new@example.com");
|
|
75
|
+
expect(db.user.create).toHaveBeenCalled();
|
|
76
|
+
});
|
|
77
|
+
it("email fallback is not reached when auth0Sub matches", async () => {
|
|
78
|
+
const db = makeMockDb([
|
|
79
|
+
{ id: "u-1", auth0Sub: "auth0|match", email: "alice@example.com", name: "Alice" },
|
|
80
|
+
]);
|
|
81
|
+
const svc = new UserService(db);
|
|
82
|
+
await svc.findOrCreateByAuth0Sub("auth0|match", "alice@example.com");
|
|
83
|
+
expect(db.user.findFirst).not.toHaveBeenCalled();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=user-service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-service.test.js","sourceRoot":"","sources":["../../src/services/user-service.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,SAAS,UAAU,CAAC,aAA0F;IAC5G,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;IAEjC,OAAO;QACL,IAAI,EAAE;YACJ,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAiD,EAAE,EAAE;gBACnF,IAAI,KAAK,CAAC,QAAQ;oBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;gBACpF,IAAI,KAAK,CAAC,EAAE;oBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YACF,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAgC,EAAE,EAAE;gBACjE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;YAC5D,CAAC,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAgE,EAAE,EAAE;gBAC7F,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,OAAO,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;gBAC7E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAA4D,EAAE,EAAE;gBAChG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;SACH;KACF,CAAC;AACJ,CAAC;AAKD,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE;SAChF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAW,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAE3F,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAE,EAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,6BAA6B;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE;SACjF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAW,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAE5F,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7C,MAAM,CAAE,EAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE;SAC3F,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAW,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAC7C,sBAAsB,EACtB,mBAAmB,EACnB,OAAO,CACR,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,+BAA+B;QAC9D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,cAAc;QACpE,MAAM,CAAE,EAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,uBAAuB;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE;SAC3F,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAW,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAC7C,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACnD,MAAM,CAAE,EAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE;SAClF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAW,CAAC,CAAC;QAEzC,MAAM,GAAG,CAAC,sBAAsB,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QAErE,MAAM,CAAE,EAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { PrismaClient, Workspace } from "@prisma/client";
|
|
2
2
|
import { type TenantContext } from "../db/tenant.js";
|
|
3
|
+
import type { TagFilter } from "../types/index.js";
|
|
3
4
|
export interface WorkspaceFilter {
|
|
4
5
|
domainIds?: string[];
|
|
5
6
|
types?: string[];
|
|
6
7
|
tags?: string[];
|
|
8
|
+
tagFilters?: TagFilter[];
|
|
7
9
|
maxDepth?: number;
|
|
8
10
|
maxNodes?: number;
|
|
9
11
|
includeDrafts?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-service.d.ts","sourceRoot":"","sources":["../../src/services/workspace-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-service.d.ts","sourceRoot":"","sources":["../../src/services/workspace-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,EAAE;IAHZ,OAAO,CAAC,KAAK,CAAS;gBAGZ,EAAE,EAAE,YAAY,EACxB,SAAS,CAAC,EAAE,aAAa;IAKrB,MAAM,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC;IAmBvD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAmB1E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAMlD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAI9C,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAOlC;;;OAGG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GACrD,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA0BlC;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA0B7D"}
|
|
@@ -80,10 +80,16 @@ export class WorkspaceService {
|
|
|
80
80
|
const domainIds = domainSlugs.length > 0
|
|
81
81
|
? await domainSlugToId(domainSlugs)
|
|
82
82
|
: undefined;
|
|
83
|
+
// Convert old-style tags (string[]) to TagFilter presence checks
|
|
84
|
+
const oldTags = (ws.tags || []);
|
|
85
|
+
const tagFilters = oldTags.length > 0
|
|
86
|
+
? oldTags.map((tagName) => ({ tagName, op: "exists" }))
|
|
87
|
+
: undefined;
|
|
83
88
|
return {
|
|
84
89
|
domainIds: domainIds && domainIds.length > 0 ? domainIds : undefined,
|
|
85
90
|
types: (ws.nodeTypes || []).length > 0 ? ws.nodeTypes : undefined,
|
|
86
|
-
tags:
|
|
91
|
+
tags: oldTags.length > 0 ? oldTags : undefined,
|
|
92
|
+
tagFilters,
|
|
87
93
|
maxDepth: ws.maxDepth ?? undefined,
|
|
88
94
|
maxNodes: ws.maxNodes ?? undefined,
|
|
89
95
|
includeDrafts: ws.includeDrafts,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-service.js","sourceRoot":"","sources":["../../src/services/workspace-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAsB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-service.js","sourceRoot":"","sources":["../../src/services/workspace-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAsB,MAAM,iBAAiB,CAAC;AAuC3E,MAAM,OAAO,gBAAgB;IAIjB;IAHF,KAAK,CAAS;IAEtB,YACU,EAAgB,EACxB,SAAyB;QADjB,OAAE,GAAF,EAAE,CAAc;QAGxB,IAAI,CAAC,KAAK,GAAG,SAAS,EAAE,cAAc,IAAI,oBAAoB,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAA2B;QACtC,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;YAC9B,IAAI,EAAE;gBACJ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;gBACpC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;gBACpC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;gBAChC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,KAAK;gBAC3C,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;gBACtC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,cAAc,EAAE,IAAI,CAAC,KAAK;aAC3B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAA2B;QAClD,2DAA2D;QAC3D,MAAM,IAAI,GAA4B,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAChE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACrD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1E,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1E,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACpE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACrD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjE,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAChF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAE7E,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,EAAE,EAAE,EAAE;YACb,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC;YAClC,KAAK,EAAE,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC;YAChC,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE;YACrC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,IAAY,EACZ,cAAsD;QAEtD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAErB,MAAM,WAAW,GAAI,EAAE,CAAC,WAAwB,IAAI,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;YACtC,CAAC,CAAC,MAAM,cAAc,CAAC,WAAW,CAAC;YACnC,CAAC,CAAC,SAAS,CAAC;QAEd,iEAAiE;QACjE,MAAM,OAAO,GAAG,CAAE,EAAE,CAAC,IAAiB,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,UAAU,GAA4B,OAAO,CAAC,MAAM,GAAG,CAAC;YAC5D,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAiB,EAAE,CAAC,CAAC;YAChE,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO;YACL,SAAS,EAAE,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACpE,KAAK,EAAE,CAAE,EAAE,CAAC,SAAsB,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,SAAsB,CAAC,CAAC,CAAC,SAAS;YAC7F,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YAC9C,UAAU;YACV,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,SAAS;YAClC,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,SAAS;YAClC,aAAa,EAAE,EAAE,CAAC,aAAa;SAChC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAErB,MAAM,WAAW,GAAI,EAAE,CAAC,WAAwB,IAAI,EAAE,CAAC;QACvD,MAAM,SAAS,GAAI,EAAE,CAAC,SAAsB,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAI,EAAE,CAAC,IAAiB,IAAI,EAAE,CAAC;QAEzC,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC;QAC5B,IAAI,EAAE,CAAC,WAAW;YAAE,EAAE,IAAI,GAAG,EAAE,CAAC,WAAW,MAAM,CAAC;QAClD,IAAI,EAAE,CAAC,YAAY;YAAE,EAAE,IAAI,iBAAiB,EAAE,CAAC,YAAY,MAAM,CAAC;QAElE,EAAE,IAAI,wBAAwB,CAAC;QAC/B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,EAAE,IAAI,kBAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,EAAE,IAAI,qBAAqB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9E,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,EAAE,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9D,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,EAAE,IAAI,gCAAgC,CAAC;QAErG,EAAE,IAAI,gBAAgB,CAAC;QACvB,EAAE,IAAI,cAAc,CAAC;QACrB,EAAE,IAAI,kCAAkC,EAAE,CAAC,IAAI,IAAI,CAAC;QACpD,EAAE,IAAI,iCAAiC,EAAE,CAAC,IAAI,IAAI,CAAC;QACnD,EAAE,IAAI,UAAU,CAAC;QAEjB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,60 @@
|
|
|
1
|
-
import type { Node as PrismaNode, Edge as PrismaEdge, Domain as PrismaDomain, Workspace as PrismaWorkspace } from "@prisma/client";
|
|
1
|
+
import type { Node as PrismaNode, Edge as PrismaEdge, Domain as PrismaDomain, Workspace as PrismaWorkspace, NodeChunk as PrismaNodeChunk, TagDefinition as PrismaTagDefinition, NodeTag as PrismaNodeTag, NodeTagHistory as PrismaNodeTagHistory, NodeTagAudit as PrismaNodeTagAudit } from "@prisma/client";
|
|
2
2
|
export type Node = PrismaNode;
|
|
3
3
|
export type Domain = PrismaDomain;
|
|
4
4
|
export type Workspace = PrismaWorkspace;
|
|
5
|
+
export type NodeChunk = PrismaNodeChunk;
|
|
6
|
+
export type TagDefinition = PrismaTagDefinition;
|
|
7
|
+
export type NodeTag = PrismaNodeTag;
|
|
8
|
+
export type NodeTagHistory = PrismaNodeTagHistory;
|
|
9
|
+
export type NodeTagAudit = PrismaNodeTagAudit;
|
|
10
|
+
export type TagType = "text" | "number" | "date" | "enum" | "ref";
|
|
11
|
+
export type TagCardinality = "singleton" | "multi";
|
|
12
|
+
export type TagSource = "extracted" | "computed" | "declared";
|
|
13
|
+
export type VerificationStatus = "unverified" | "auto-accepted" | "human-verified" | "contested";
|
|
14
|
+
export type TagDefinitionStatus = "active" | "deprecated" | "retired";
|
|
15
|
+
export interface ApplyTagInput {
|
|
16
|
+
tagName: string;
|
|
17
|
+
valueText?: string;
|
|
18
|
+
valueNum?: number;
|
|
19
|
+
valueCurrency?: string;
|
|
20
|
+
valueUnit?: string;
|
|
21
|
+
valueDate?: string;
|
|
22
|
+
valueRef?: string;
|
|
23
|
+
textSpan?: string;
|
|
24
|
+
offsetStart?: number;
|
|
25
|
+
offsetEnd?: number;
|
|
26
|
+
contentVersion?: number;
|
|
27
|
+
attrs?: Record<string, unknown>;
|
|
28
|
+
confidence?: number;
|
|
29
|
+
modelId?: string;
|
|
30
|
+
modelVersion?: string;
|
|
31
|
+
}
|
|
32
|
+
export type TagFilterOp = "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "between" | "in" | "contains" | "exists";
|
|
33
|
+
export interface TagFilter {
|
|
34
|
+
tagName: string;
|
|
35
|
+
op: TagFilterOp;
|
|
36
|
+
value?: string | number | boolean | string[] | number[];
|
|
37
|
+
valueTo?: string | number;
|
|
38
|
+
}
|
|
39
|
+
export interface TagQuery {
|
|
40
|
+
filters: TagFilter[];
|
|
41
|
+
groupBy?: string[];
|
|
42
|
+
aggregations?: Array<{
|
|
43
|
+
fn: "count" | "sum" | "avg" | "min" | "max";
|
|
44
|
+
tagName: string;
|
|
45
|
+
}>;
|
|
46
|
+
limit?: number;
|
|
47
|
+
offset?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface TagQueryResult {
|
|
50
|
+
rows: Record<string, unknown>[];
|
|
51
|
+
total: number;
|
|
52
|
+
}
|
|
53
|
+
export interface BatchError {
|
|
54
|
+
index: number;
|
|
55
|
+
tagName: string;
|
|
56
|
+
error: string;
|
|
57
|
+
}
|
|
5
58
|
export type NewNode = Omit<Node, "id" | "createdAt" | "updatedAt" | "embedding" | "searchVector"> & {
|
|
6
59
|
embedding?: unknown;
|
|
7
60
|
searchVector?: unknown;
|
|
@@ -16,11 +69,14 @@ export interface SearchOptions {
|
|
|
16
69
|
statuses?: NodeStatus[];
|
|
17
70
|
includeDrafts?: boolean;
|
|
18
71
|
domainIds?: string[];
|
|
72
|
+
tagFilters?: TagFilter[];
|
|
19
73
|
}
|
|
20
74
|
export interface SearchResult {
|
|
21
75
|
node: Node;
|
|
22
76
|
score: number;
|
|
23
|
-
matchType: "semantic" | "keyword" | "hybrid";
|
|
77
|
+
matchType: "semantic" | "keyword" | "substring" | "trigram" | "hybrid";
|
|
78
|
+
snippet?: string;
|
|
79
|
+
snippetChunkIndex?: number;
|
|
24
80
|
}
|
|
25
81
|
export interface ContextOptions {
|
|
26
82
|
query: string;
|
|
@@ -43,6 +99,7 @@ export interface ContextPackage {
|
|
|
43
99
|
slug: string;
|
|
44
100
|
description: string;
|
|
45
101
|
};
|
|
102
|
+
chunks?: Record<string, string[]>;
|
|
46
103
|
}
|
|
47
104
|
export interface EmbedBatchOptions {
|
|
48
105
|
onProgress?: (progress: EmbeddingProgress) => void;
|
|
@@ -62,6 +119,10 @@ export interface EmbeddingProvider {
|
|
|
62
119
|
export interface OrgMetadata {
|
|
63
120
|
search?: {
|
|
64
121
|
semanticWeight?: number;
|
|
122
|
+
keywordWeight?: number;
|
|
123
|
+
substringWeight?: number;
|
|
124
|
+
trigramWeight?: number;
|
|
125
|
+
trigramThreshold?: number;
|
|
65
126
|
defaultLimit?: number;
|
|
66
127
|
includeDrafts?: boolean;
|
|
67
128
|
};
|
|
@@ -73,7 +134,20 @@ export interface OrgMetadata {
|
|
|
73
134
|
}
|
|
74
135
|
/** @deprecated Use ApartConfig instead */
|
|
75
136
|
export type CollectiveConfig = ApartConfig;
|
|
137
|
+
/**
|
|
138
|
+
* Runtime deployment tier.
|
|
139
|
+
*
|
|
140
|
+
* - `local`: a developer's machine (default when `ENVIRONMENT` is unset).
|
|
141
|
+
* - `dev`: a shared non-production environment backed by `apart-next-dev`
|
|
142
|
+
* Auth0 and the dev PDP project. No environment currently deploys here,
|
|
143
|
+
* but the tier is reserved for a future pre-staging preview.
|
|
144
|
+
* - `staging`: the `intelligence-api-staging` Cloud Run service.
|
|
145
|
+
* Populated from GitHub Actions in Phase 6.
|
|
146
|
+
* - `prod`: the `intelligence-api-prod` Cloud Run service.
|
|
147
|
+
*/
|
|
148
|
+
export type Environment = "local" | "dev" | "staging" | "prod";
|
|
76
149
|
export interface ApartConfig {
|
|
150
|
+
environment: Environment;
|
|
77
151
|
database: {
|
|
78
152
|
url: string;
|
|
79
153
|
};
|
|
@@ -92,6 +166,10 @@ export interface ApartConfig {
|
|
|
92
166
|
};
|
|
93
167
|
search: {
|
|
94
168
|
semanticWeight: number;
|
|
169
|
+
keywordWeight: number;
|
|
170
|
+
substringWeight: number;
|
|
171
|
+
trigramWeight: number;
|
|
172
|
+
trigramThreshold: number;
|
|
95
173
|
defaultLimit: number;
|
|
96
174
|
includeDrafts: boolean;
|
|
97
175
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,IAAI,UAAU,EAClB,IAAI,IAAI,UAAU,EAClB,MAAM,IAAI,YAAY,EACtB,SAAS,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apart-tech/intelligence-core",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.6",
|
|
4
4
|
"description": "Core library: database, services, and providers for Apart Intelligence",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
+
"@casl/ability": "^6.8.0",
|
|
22
23
|
"@cdssnc/sanitize-pii": "^2.1.2",
|
|
23
24
|
"@prisma/client": "^6.6.0",
|
|
24
25
|
"@prisma/extension-accelerate": "^3.0.1",
|
|
@@ -40,6 +41,6 @@
|
|
|
40
41
|
"test": "vitest run",
|
|
41
42
|
"db:generate": "prisma generate",
|
|
42
43
|
"db:migrate": "prisma migrate dev",
|
|
43
|
-
"db:push": "prisma db push"
|
|
44
|
+
"db:push:local": "prisma db push"
|
|
44
45
|
}
|
|
45
46
|
}
|