spine-framework 0.1.44 → 0.1.45
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/.framework/functions/_shared/index.ts +9 -0
- package/.framework/functions/_shared/resolve-ids.ts +106 -0
- package/dist/functions/_shared/index.d.ts +1 -0
- package/dist/functions/_shared/index.d.ts.map +1 -1
- package/dist/functions/_shared/resolve-ids.d.ts +10 -0
- package/dist/functions/_shared/resolve-ids.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -380,3 +380,12 @@ export {
|
|
|
380
380
|
expectErrorResponse
|
|
381
381
|
} from './testing'
|
|
382
382
|
export type { TestContext, TestPrincipal, TestLogger } from './testing'
|
|
383
|
+
|
|
384
|
+
export {
|
|
385
|
+
resolveTypeIds,
|
|
386
|
+
resolveTypeId,
|
|
387
|
+
resolveLinkTypeIds,
|
|
388
|
+
resolveAccountId,
|
|
389
|
+
resolveAgentId,
|
|
390
|
+
resolvePromptConfigId
|
|
391
|
+
} from './resolve-ids'
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Slug-based ID resolution utilities
|
|
2
|
+
// Custom app code must never hardcode UUIDs — IDs differ on every fresh install.
|
|
3
|
+
// All functions that need entity IDs must call resolveIds() at request time.
|
|
4
|
+
|
|
5
|
+
import { adminDb } from './db'
|
|
6
|
+
|
|
7
|
+
interface ResolvedIds {
|
|
8
|
+
types: Record<string, string>
|
|
9
|
+
linkTypes: Record<string, string>
|
|
10
|
+
accounts: Record<string, string>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Resolve type IDs by (kind, slug) pairs
|
|
14
|
+
export async function resolveTypeIds(
|
|
15
|
+
pairs: Array<{ kind: string; slug: string }>
|
|
16
|
+
): Promise<Record<string, string>> {
|
|
17
|
+
if (pairs.length === 0) return {}
|
|
18
|
+
|
|
19
|
+
const { data, error } = await adminDb
|
|
20
|
+
.from('types')
|
|
21
|
+
.select('id, kind, slug')
|
|
22
|
+
.in('slug', pairs.map(p => p.slug))
|
|
23
|
+
.in('kind', [...new Set(pairs.map(p => p.kind))])
|
|
24
|
+
|
|
25
|
+
if (error) throw new Error(`resolveTypeIds failed: ${error.message}`)
|
|
26
|
+
|
|
27
|
+
const result: Record<string, string> = {}
|
|
28
|
+
for (const row of data || []) {
|
|
29
|
+
const key = `${row.kind}/${row.slug}`
|
|
30
|
+
result[key] = row.id
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const pair of pairs) {
|
|
34
|
+
const key = `${pair.kind}/${pair.slug}`
|
|
35
|
+
if (!result[key]) throw new Error(`Type not found: ${key}`)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return result
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Resolve a single type ID — throws if not found
|
|
42
|
+
export async function resolveTypeId(kind: string, slug: string): Promise<string> {
|
|
43
|
+
const ids = await resolveTypeIds([{ kind, slug }])
|
|
44
|
+
return ids[`${kind}/${slug}`]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Resolve link type IDs by slug
|
|
48
|
+
export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string, string>> {
|
|
49
|
+
if (slugs.length === 0) return {}
|
|
50
|
+
|
|
51
|
+
const { data, error } = await adminDb
|
|
52
|
+
.from('link_types')
|
|
53
|
+
.select('id, slug')
|
|
54
|
+
.in('slug', slugs)
|
|
55
|
+
|
|
56
|
+
if (error) throw new Error(`resolveLinkTypeIds failed: ${error.message}`)
|
|
57
|
+
|
|
58
|
+
const result: Record<string, string> = {}
|
|
59
|
+
for (const row of data || []) {
|
|
60
|
+
result[row.slug] = row.id
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
for (const slug of slugs) {
|
|
64
|
+
if (!result[slug]) throw new Error(`Link type not found: ${slug}`)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return result
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Resolve account ID by slug
|
|
71
|
+
export async function resolveAccountId(slug: string): Promise<string> {
|
|
72
|
+
const { data, error } = await adminDb
|
|
73
|
+
.from('accounts')
|
|
74
|
+
.select('id')
|
|
75
|
+
.eq('slug', slug)
|
|
76
|
+
.single()
|
|
77
|
+
|
|
78
|
+
if (error || !data) throw new Error(`Account not found: ${slug}`)
|
|
79
|
+
return data.id
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Resolve AI agent ID by name
|
|
83
|
+
export async function resolveAgentId(name: string): Promise<string> {
|
|
84
|
+
const { data, error } = await adminDb
|
|
85
|
+
.from('ai_agents')
|
|
86
|
+
.select('id')
|
|
87
|
+
.eq('name', name)
|
|
88
|
+
.eq('is_active', true)
|
|
89
|
+
.single()
|
|
90
|
+
|
|
91
|
+
if (error || !data) throw new Error(`AI agent not found: ${name}`)
|
|
92
|
+
return data.id
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Resolve prompt config ID by slug
|
|
96
|
+
export async function resolvePromptConfigId(slug: string): Promise<string> {
|
|
97
|
+
const { data, error } = await adminDb
|
|
98
|
+
.from('prompt_configs')
|
|
99
|
+
.select('id')
|
|
100
|
+
.eq('slug', slug)
|
|
101
|
+
.eq('is_active', true)
|
|
102
|
+
.single()
|
|
103
|
+
|
|
104
|
+
if (error || !data) throw new Error(`Prompt config not found: ${slug}`)
|
|
105
|
+
return data.id
|
|
106
|
+
}
|
|
@@ -295,4 +295,5 @@ export type { AppManifest, NavItem } from './app-manifest';
|
|
|
295
295
|
*/
|
|
296
296
|
export { makeTestContext, mockPrincipal, mockLogger, mockEvent, mockNetlifyContext, cleanup, setupTests, expectSuccessResponse, expectErrorResponse } from './testing';
|
|
297
297
|
export type { TestContext, TestPrincipal, TestLogger } from './testing';
|
|
298
|
+
export { resolveTypeIds, resolveTypeId, resolveLinkTypeIds, resolveAccountId, resolveAgentId, resolvePromptConfigId } from './resolve-ids';
|
|
298
299
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../.framework/functions/_shared/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAMH;;;;;;;;;;;;;GAaG;AACH,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C;;;GAGG;AACH,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAElF;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,IAAI,EAAE,KAAK,IAAI,aAAa,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMnI;;GAEG;AACH,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE3D;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAErD;;GAEG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAM9C;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAE5B,YAAY,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAMpC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAMrE;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACnH,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAMjD;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC7D,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAMxF;;;;;;;;GAQG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGrD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAM9F;;;GAGG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAMtD;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAMnC;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC9G,YAAY,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAMxE;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvG,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAM1D;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,OAAO,EACP,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../.framework/functions/_shared/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAMH;;;;;;;;;;;;;GAaG;AACH,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C;;;GAGG;AACH,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAElF;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,IAAI,EAAE,KAAK,IAAI,aAAa,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMnI;;GAEG;AACH,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE3D;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAErD;;GAEG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAM9C;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAE5B,YAAY,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAMpC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAMrE;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACnH,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAMjD;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC7D,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAMxF;;;;;;;;GAQG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGrD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAM9F;;;GAGG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAMtD;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAMnC;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC9G,YAAY,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAMxE;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvG,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAM1D;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,OAAO,EACP,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEvE,OAAO,EACL,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACtB,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function resolveTypeIds(pairs: Array<{
|
|
2
|
+
kind: string;
|
|
3
|
+
slug: string;
|
|
4
|
+
}>): Promise<Record<string, string>>;
|
|
5
|
+
export declare function resolveTypeId(kind: string, slug: string): Promise<string>;
|
|
6
|
+
export declare function resolveLinkTypeIds(slugs: string[]): Promise<Record<string, string>>;
|
|
7
|
+
export declare function resolveAccountId(slug: string): Promise<string>;
|
|
8
|
+
export declare function resolveAgentId(name: string): Promise<string>;
|
|
9
|
+
export declare function resolvePromptConfigId(slug: string): Promise<string>;
|
|
10
|
+
//# sourceMappingURL=resolve-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-ids.d.ts","sourceRoot":"","sources":["../../../.framework/functions/_shared/resolve-ids.ts"],"names":[],"mappings":"AAaA,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuBjC;AAGD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/E;AAGD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoBzF;AAGD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpE;AAGD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlE;AAGD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUzE"}
|