@fayz-ai/core 0.1.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/app/render.d.ts +16 -0
- package/dist/app/render.d.ts.map +1 -0
- package/dist/blocks/index.d.ts +25 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/chunk-2NTHNWEH.cjs +32 -0
- package/dist/chunk-2NTHNWEH.cjs.map +1 -0
- package/dist/chunk-5EAZOMVP.js +1609 -0
- package/dist/chunk-5EAZOMVP.js.map +1 -0
- package/dist/chunk-5TKIZVVJ.cjs +16 -0
- package/dist/chunk-5TKIZVVJ.cjs.map +1 -0
- package/dist/chunk-7RTUHSKY.js +3 -0
- package/dist/chunk-7RTUHSKY.js.map +1 -0
- package/dist/chunk-AXTWKF5X.cjs +38 -0
- package/dist/chunk-AXTWKF5X.cjs.map +1 -0
- package/dist/chunk-EGWWQ7AT.cjs +355 -0
- package/dist/chunk-EGWWQ7AT.cjs.map +1 -0
- package/dist/chunk-KAYQFSR6.js +298 -0
- package/dist/chunk-KAYQFSR6.js.map +1 -0
- package/dist/chunk-LSVBDYFQ.cjs +1639 -0
- package/dist/chunk-LSVBDYFQ.cjs.map +1 -0
- package/dist/chunk-SNQW6TRF.cjs +658 -0
- package/dist/chunk-SNQW6TRF.cjs.map +1 -0
- package/dist/chunk-WKZVSKEU.js +26 -0
- package/dist/chunk-WKZVSKEU.js.map +1 -0
- package/dist/chunk-Y2C2FBQP.js +35 -0
- package/dist/chunk-Y2C2FBQP.js.map +1 -0
- package/dist/chunk-YSBXGHAM.js +643 -0
- package/dist/chunk-YSBXGHAM.js.map +1 -0
- package/dist/data/archetype.d.ts +13 -0
- package/dist/data/archetype.d.ts.map +1 -0
- package/dist/data/cached.d.ts +19 -0
- package/dist/data/cached.d.ts.map +1 -0
- package/dist/data/fayz-api.d.ts +19 -0
- package/dist/data/fayz-api.d.ts.map +1 -0
- package/dist/data/index.cjs +32 -0
- package/dist/data/index.cjs.map +1 -0
- package/dist/data/index.d.ts +9 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +3 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/mock.d.ts +7 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/resolve.d.ts +22 -0
- package/dist/data/resolve.d.ts.map +1 -0
- package/dist/data/supabase.d.ts +18 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/types.d.ts +23 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/entity/index.cjs +28 -0
- package/dist/entity/index.cjs.map +1 -0
- package/dist/entity/index.d.ts +3 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +3 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/registry.d.ts +20 -0
- package/dist/entity/registry.d.ts.map +1 -0
- package/dist/events/index.d.ts +16 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/i18n/index.cjs +44 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/index.d.ts +21 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/shell-translations.d.ts +2 -0
- package/dist/i18n/shell-translations.d.ts.map +1 -0
- package/dist/index.cjs +911 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +596 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cache.d.ts +21 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/csv.d.ts +14 -0
- package/dist/lib/csv.d.ts.map +1 -0
- package/dist/lib/format.d.ts +7 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/manifest/index.d.ts +80 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/plugin/createSafeDataProvider.d.ts +14 -0
- package/dist/plugin/createSafeDataProvider.d.ts.map +1 -0
- package/dist/plugin/index.cjs +32 -0
- package/dist/plugin/index.cjs.map +1 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +3 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/runtime.d.ts +31 -0
- package/dist/plugin/runtime.d.ts.map +1 -0
- package/dist/registry/index.d.ts +88 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/router/index.cjs +16 -0
- package/dist/router/index.cjs.map +1 -0
- package/dist/router/index.d.ts +8 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +3 -0
- package/dist/router/index.js.map +1 -0
- package/dist/runtime/index.cjs +16 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/oauth.d.ts +96 -0
- package/dist/runtime/oauth.d.ts.map +1 -0
- package/dist/tenant/index.d.ts +3 -0
- package/dist/tenant/index.d.ts.map +1 -0
- package/dist/types/auth.d.ts +27 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/billing.d.ts +17 -0
- package/dist/types/billing.d.ts.map +1 -0
- package/dist/types/crud.d.ts +107 -0
- package/dist/types/crud.d.ts.map +1 -0
- package/dist/types/entities.d.ts +134 -0
- package/dist/types/entities.d.ts.map +1 -0
- package/dist/types/i18n.d.ts +8 -0
- package/dist/types/i18n.d.ts.map +1 -0
- package/dist/types/index.cjs +4 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/org.d.ts +96 -0
- package/dist/types/org.d.ts.map +1 -0
- package/dist/types/permissions.d.ts +25 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/plugins.d.ts +314 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/theme.d.ts +16 -0
- package/dist/types/theme.d.ts.map +1 -0
- package/package.json +98 -0
- package/src/app/render.tsx +69 -0
- package/src/blocks/index.tsx +68 -0
- package/src/data/archetype.ts +210 -0
- package/src/data/cached.ts +55 -0
- package/src/data/fayz-api.ts +200 -0
- package/src/data/index.ts +8 -0
- package/src/data/mock.ts +84 -0
- package/src/data/resolve.ts +108 -0
- package/src/data/supabase.ts +169 -0
- package/src/data/types.ts +20 -0
- package/src/entity/index.ts +2 -0
- package/src/entity/registry.ts +42 -0
- package/src/events/index.tsx +82 -0
- package/src/i18n/index.ts +250 -0
- package/src/i18n/shell-translations.ts +1391 -0
- package/src/index.ts +132 -0
- package/src/lib/cache.ts +118 -0
- package/src/lib/csv.ts +54 -0
- package/src/lib/format.ts +58 -0
- package/src/manifest/app-manifest.schema.json +103 -0
- package/src/manifest/index.ts +394 -0
- package/src/plugin/createSafeDataProvider.ts +30 -0
- package/src/plugin/index.ts +1 -0
- package/src/plugin/runtime.ts +313 -0
- package/src/registry/index.ts +163 -0
- package/src/router/index.ts +29 -0
- package/src/runtime/index.ts +15 -0
- package/src/runtime/oauth.ts +219 -0
- package/src/tenant/index.ts +18 -0
- package/src/types/auth.ts +26 -0
- package/src/types/billing.ts +17 -0
- package/src/types/crud.ts +108 -0
- package/src/types/entities.ts +142 -0
- package/src/types/i18n.ts +7 -0
- package/src/types/index.ts +10 -0
- package/src/types/org.ts +94 -0
- package/src/types/permissions.ts +32 -0
- package/src/types/plugins.ts +363 -0
- package/src/types/theme.ts +17 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import type React from 'react'
|
|
2
|
+
import type { EntityDef } from './crud'
|
|
3
|
+
import type { FeatureDeclaration, PermissionAction } from './permissions'
|
|
4
|
+
|
|
5
|
+
export type VerticalId = 'beauty' | 'food' | 'health' | 'services' | 'retail' | 'education' | (string & {})
|
|
6
|
+
export type PluginScope = 'core' | 'vertical' | 'universal' | 'addon' | 'tenant'
|
|
7
|
+
export type PluginStatus = 'pending_setup' | 'active' | 'disabled' | 'removed'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Scaffold type this plugin targets.
|
|
11
|
+
* Plugins can declare which scaffolds they work with.
|
|
12
|
+
* If omitted, the plugin works with all scaffold types.
|
|
13
|
+
*/
|
|
14
|
+
export type ScaffoldType = 'saas' | 'ecommerce' | 'landing_page' | 'website' | (string & {})
|
|
15
|
+
|
|
16
|
+
export interface PluginPermissionRequirement {
|
|
17
|
+
feature: string
|
|
18
|
+
action: PermissionAction
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface PluginNavigationEntry {
|
|
22
|
+
id?: string
|
|
23
|
+
section: 'main' | 'secondary' | 'settings'
|
|
24
|
+
position: number
|
|
25
|
+
label: string
|
|
26
|
+
route: string
|
|
27
|
+
icon?: string
|
|
28
|
+
badge?: string | number
|
|
29
|
+
permission?: PluginPermissionRequirement
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface PluginSettingsTab {
|
|
33
|
+
id: string
|
|
34
|
+
label: string
|
|
35
|
+
icon?: string
|
|
36
|
+
/** Provide the component directly, or reference a registered component by id
|
|
37
|
+
* (resolvePluginComponent resolves componentId → the component registry).
|
|
38
|
+
* Exactly one is required. */
|
|
39
|
+
component?: React.ComponentType<unknown>
|
|
40
|
+
componentId?: string
|
|
41
|
+
pluginId?: string
|
|
42
|
+
order?: number
|
|
43
|
+
permission?: PluginPermissionRequirement
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface PluginRouteDefinition {
|
|
47
|
+
path: string
|
|
48
|
+
/** Component or a registered component id — exactly one is required. */
|
|
49
|
+
component?: React.ComponentType<unknown>
|
|
50
|
+
componentId?: string
|
|
51
|
+
guard?: 'authenticated' | 'role' | 'public' | 'share-token'
|
|
52
|
+
roles?: string[]
|
|
53
|
+
permission?: PluginPermissionRequirement
|
|
54
|
+
/** Render edge-to-edge with no page padding/animation wrapper (chat, kanban, canvas). */
|
|
55
|
+
fullBleed?: boolean
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type PluginWidgetZone =
|
|
59
|
+
| 'shell.sidebar.before-nav'
|
|
60
|
+
| 'shell.sidebar.footer'
|
|
61
|
+
| 'shell.topbar.start'
|
|
62
|
+
| 'shell.topbar.end'
|
|
63
|
+
| 'page.before'
|
|
64
|
+
| 'page.after'
|
|
65
|
+
| 'settings.before'
|
|
66
|
+
| 'settings.after'
|
|
67
|
+
| 'shell.floating'
|
|
68
|
+
| (string & {})
|
|
69
|
+
|
|
70
|
+
export const WidgetZone = {
|
|
71
|
+
SIDEBAR_BEFORE_NAV: 'shell.sidebar.before-nav',
|
|
72
|
+
SIDEBAR_FOOTER: 'shell.sidebar.footer',
|
|
73
|
+
TOPBAR_START: 'shell.topbar.start',
|
|
74
|
+
TOPBAR_END: 'shell.topbar.end',
|
|
75
|
+
PAGE_BEFORE: 'page.before',
|
|
76
|
+
PAGE_AFTER: 'page.after',
|
|
77
|
+
SETTINGS_BEFORE: 'settings.before',
|
|
78
|
+
SETTINGS_AFTER: 'settings.after',
|
|
79
|
+
FLOATING: 'shell.floating',
|
|
80
|
+
} as const
|
|
81
|
+
|
|
82
|
+
export interface PluginRuntimeTenant {
|
|
83
|
+
id?: string
|
|
84
|
+
slug?: string
|
|
85
|
+
verticalId?: string
|
|
86
|
+
plan?: string
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface PluginRuntimeUser {
|
|
90
|
+
id?: string
|
|
91
|
+
role?: string
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface PluginWidgetVisibility {
|
|
95
|
+
routes?: string[]
|
|
96
|
+
excludeRoutes?: string[]
|
|
97
|
+
layouts?: string[]
|
|
98
|
+
roles?: string[]
|
|
99
|
+
plans?: string[]
|
|
100
|
+
permissions?: PluginPermissionRequirement[]
|
|
101
|
+
when?: (context: PluginRuntimeContext) => boolean
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface PluginRuntimeContext {
|
|
105
|
+
tenant: PluginRuntimeTenant | null
|
|
106
|
+
user: PluginRuntimeUser | null
|
|
107
|
+
currentPath: string
|
|
108
|
+
matchedPath?: string
|
|
109
|
+
layout: string
|
|
110
|
+
hasPermission?: (req: PluginPermissionRequirement) => boolean
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface PluginWidgetDefinition<TConfig extends Record<string, unknown> = Record<string, unknown>> {
|
|
114
|
+
id: string
|
|
115
|
+
zone: PluginWidgetZone
|
|
116
|
+
/** Component or a registered component id — exactly one is required. */
|
|
117
|
+
component?: React.ComponentType<unknown>
|
|
118
|
+
componentId?: string
|
|
119
|
+
title?: string
|
|
120
|
+
order?: number
|
|
121
|
+
permission?: PluginPermissionRequirement
|
|
122
|
+
visibility?: PluginWidgetVisibility
|
|
123
|
+
props?: TConfig
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Dashboard widgets — first-class units a plugin contributes to the dashboard
|
|
128
|
+
// registry. Rendered both on the plugin's own home and on the global app home.
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
|
|
131
|
+
export type DashboardWidgetKind = 'kpi' | 'chart' | 'table' | 'onboarding' | 'custom'
|
|
132
|
+
|
|
133
|
+
/** Surfaces a widget can appear on. 'home' = global app home; 'plugin-home' =
|
|
134
|
+
* the owning plugin's own overview page. */
|
|
135
|
+
export type DashboardSurface = 'home' | 'plugin-home'
|
|
136
|
+
|
|
137
|
+
export interface DashboardWidgetDef<TProps extends Record<string, unknown> = Record<string, unknown>> {
|
|
138
|
+
/** Globally unique id, e.g. 'crm.kpi.total-leads'. */
|
|
139
|
+
id: string
|
|
140
|
+
/** i18n key or plain label. */
|
|
141
|
+
title: string
|
|
142
|
+
description?: string
|
|
143
|
+
icon?: string
|
|
144
|
+
/** Owning domain used to scope plugin-home vs global home. Defaults to plugin.id. */
|
|
145
|
+
domain?: string
|
|
146
|
+
kind: DashboardWidgetKind
|
|
147
|
+
/** Column span on the 4-col grid. Defaults by kind (kpi→1, chart→2, table→4). */
|
|
148
|
+
span?: 1 | 2 | 3 | 4
|
|
149
|
+
/** Visible before any app/user customization. Default: true. */
|
|
150
|
+
defaultVisible?: boolean
|
|
151
|
+
/** Default order within the surface (lower = first). */
|
|
152
|
+
defaultOrder?: number
|
|
153
|
+
/** Surfaces this widget appears on. Default: both. */
|
|
154
|
+
surfaces?: DashboardSurface[]
|
|
155
|
+
verticalId?: VerticalId
|
|
156
|
+
permission?: PluginPermissionRequirement
|
|
157
|
+
/** Component or a registered component id — exactly one is required. */
|
|
158
|
+
component?: React.ComponentType<unknown>
|
|
159
|
+
componentId?: string
|
|
160
|
+
props?: TProps
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** App- or user-level overrides applied on top of the registered defaults. */
|
|
164
|
+
export interface DashboardLayoutConfig {
|
|
165
|
+
widgets?: Array<{ id: string; visible?: boolean; order?: number; span?: number }>
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export interface ResolvedDashboardWidget extends DashboardWidgetDef {
|
|
169
|
+
/** Resolved owning domain (plugin.id when not explicitly set). */
|
|
170
|
+
domain: string
|
|
171
|
+
order: number
|
|
172
|
+
plugin: ResolvedPluginManifest
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** An event a plugin emits onto the event bus — declared for platform
|
|
176
|
+
* introspection and so the AppManifest can bind event→action as data. */
|
|
177
|
+
export interface PluginEventDefinition {
|
|
178
|
+
/** Namespaced event name, e.g. 'agenda.booking.confirmed'. */
|
|
179
|
+
name: string
|
|
180
|
+
description?: string
|
|
181
|
+
/** JSON Schema for the payload (editor / AI / validation). */
|
|
182
|
+
payloadSchema?: Record<string, unknown>
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export interface PluginCapability {
|
|
186
|
+
id: string
|
|
187
|
+
label: string
|
|
188
|
+
description?: string
|
|
189
|
+
kind?: 'page' | 'widget' | 'data' | 'integration'
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export interface PluginQuickAction {
|
|
193
|
+
id: string
|
|
194
|
+
label: string
|
|
195
|
+
icon?: string
|
|
196
|
+
description?: string
|
|
197
|
+
/** Action handler — typically navigates to a view. */
|
|
198
|
+
action: () => void
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export type AIToolMode = 'read' | 'persist'
|
|
202
|
+
|
|
203
|
+
export interface AIToolParameterProperty {
|
|
204
|
+
type: 'string' | 'number' | 'boolean' | 'array' | 'object'
|
|
205
|
+
description?: string
|
|
206
|
+
enum?: string[]
|
|
207
|
+
items?: AIToolParameterProperty
|
|
208
|
+
default?: unknown
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export interface AIToolParameters {
|
|
212
|
+
type: 'object'
|
|
213
|
+
properties: Record<string, AIToolParameterProperty>
|
|
214
|
+
required?: string[]
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface AIToolSuggestion {
|
|
218
|
+
label: string
|
|
219
|
+
prompt?: string
|
|
220
|
+
icon?: string
|
|
221
|
+
verticalId?: VerticalId
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface PluginAITool {
|
|
225
|
+
id: string
|
|
226
|
+
name: string
|
|
227
|
+
description: string
|
|
228
|
+
icon?: string
|
|
229
|
+
mode: AIToolMode
|
|
230
|
+
parameters?: AIToolParameters
|
|
231
|
+
permission?: PluginPermissionRequirement
|
|
232
|
+
suggestions?: AIToolSuggestion[]
|
|
233
|
+
category?: string
|
|
234
|
+
tags?: string[]
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export interface PluginRegistryDef {
|
|
238
|
+
id: string
|
|
239
|
+
entity: EntityDef
|
|
240
|
+
icon?: string
|
|
241
|
+
description?: string
|
|
242
|
+
display?: 'table' | 'cards' | 'tree'
|
|
243
|
+
seedData?: Record<string, unknown>[]
|
|
244
|
+
mockData?: Record<string, unknown>[]
|
|
245
|
+
readOnly?: boolean
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export interface PluginMigration {
|
|
249
|
+
id: string
|
|
250
|
+
version: string
|
|
251
|
+
sql: string
|
|
252
|
+
description?: string
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export interface PluginOnboarding {
|
|
256
|
+
/** Component or a registered component id — exactly one is required. */
|
|
257
|
+
component?: React.ComponentType<{ onComplete: () => void }>
|
|
258
|
+
componentId?: string
|
|
259
|
+
title?: string
|
|
260
|
+
description?: string
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export interface PluginManifest {
|
|
264
|
+
id: string
|
|
265
|
+
name: string
|
|
266
|
+
icon: string
|
|
267
|
+
version: string
|
|
268
|
+
/** Plugin contract version. The runtime refuses plugins built for a newer
|
|
269
|
+
* contract than it supports (see PLUGIN_API_VERSION). Omit = legacy/compatible. */
|
|
270
|
+
apiVersion?: number
|
|
271
|
+
description?: string
|
|
272
|
+
scope?: PluginScope
|
|
273
|
+
verticalId?: VerticalId
|
|
274
|
+
/** Events this plugin emits onto the bus (declared for introspection/automation). */
|
|
275
|
+
events?: PluginEventDefinition[]
|
|
276
|
+
/** Which scaffold types this plugin targets. Omit for universal plugins. */
|
|
277
|
+
scaffolds?: ScaffoldType[]
|
|
278
|
+
tenantId?: string
|
|
279
|
+
defaultEnabled?: boolean
|
|
280
|
+
schema?: string
|
|
281
|
+
dependencies?: string[]
|
|
282
|
+
navigation: PluginNavigationEntry[]
|
|
283
|
+
settings?: PluginSettingsTab[]
|
|
284
|
+
routes: PluginRouteDefinition[]
|
|
285
|
+
widgets?: PluginWidgetDefinition[]
|
|
286
|
+
/** Dashboard widgets this plugin contributes to the dashboard registry. */
|
|
287
|
+
dashboardWidgets?: DashboardWidgetDef[]
|
|
288
|
+
capabilities?: PluginCapability[]
|
|
289
|
+
aiTools?: PluginAITool[]
|
|
290
|
+
entities?: string[]
|
|
291
|
+
permissions?: string[]
|
|
292
|
+
declaredFeatures?: FeatureDeclaration[]
|
|
293
|
+
registries?: PluginRegistryDef[]
|
|
294
|
+
migrations?: PluginMigration[]
|
|
295
|
+
onboarding?: PluginOnboarding
|
|
296
|
+
locales?: Record<string, Record<string, string>>
|
|
297
|
+
/** Marketplace metadata for npm discovery */
|
|
298
|
+
marketplace?: {
|
|
299
|
+
category: string
|
|
300
|
+
tags: string[]
|
|
301
|
+
author: string
|
|
302
|
+
license: string
|
|
303
|
+
repository?: string
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export interface TenantPluginBinding {
|
|
308
|
+
pluginId: string
|
|
309
|
+
status: PluginStatus
|
|
310
|
+
tenantId?: string
|
|
311
|
+
config?: Record<string, unknown>
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export interface PluginRuntimeIssue {
|
|
315
|
+
type:
|
|
316
|
+
| 'duplicate_plugin'
|
|
317
|
+
| 'missing_dependency'
|
|
318
|
+
| 'circular_dependency'
|
|
319
|
+
| 'vertical_mismatch'
|
|
320
|
+
| 'incompatible_api_version'
|
|
321
|
+
pluginId: string
|
|
322
|
+
dependencyId?: string
|
|
323
|
+
message: string
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export interface ResolvedPluginManifest extends PluginManifest {
|
|
327
|
+
status: PluginStatus
|
|
328
|
+
isActive: boolean
|
|
329
|
+
activationReason: 'default' | 'tenant' | 'dependency' | 'inactive'
|
|
330
|
+
config: Record<string, unknown>
|
|
331
|
+
missingDependencies: string[]
|
|
332
|
+
settingsTabs: PluginSettingsTab[]
|
|
333
|
+
widgets: PluginWidgetDefinition[]
|
|
334
|
+
resolvedRegistries: PluginRegistryDef[]
|
|
335
|
+
resolvedAITools: PluginAITool[]
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export interface ResolvedPluginWidget<TConfig extends Record<string, unknown> = Record<string, unknown>>
|
|
339
|
+
extends PluginWidgetDefinition<TConfig> {
|
|
340
|
+
order: number
|
|
341
|
+
config: TConfig
|
|
342
|
+
plugin: ResolvedPluginManifest
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export interface PluginRuntimeRoute extends PluginRouteDefinition {
|
|
346
|
+
plugin: ResolvedPluginManifest
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
export interface PluginRuntime {
|
|
350
|
+
context: PluginRuntimeContext
|
|
351
|
+
plugins: ResolvedPluginManifest[]
|
|
352
|
+
activePlugins: ResolvedPluginManifest[]
|
|
353
|
+
routes: PluginRuntimeRoute[]
|
|
354
|
+
navigation: PluginNavigationEntry[]
|
|
355
|
+
settingsTabs: PluginSettingsTab[]
|
|
356
|
+
widgets: ResolvedPluginWidget[]
|
|
357
|
+
dashboardWidgets: ResolvedDashboardWidget[]
|
|
358
|
+
capabilities: PluginCapability[]
|
|
359
|
+
aiTools: PluginAITool[]
|
|
360
|
+
issues: PluginRuntimeIssue[]
|
|
361
|
+
registries: Map<string, PluginRegistryDef[]>
|
|
362
|
+
pluginFeatures: FeatureDeclaration[]
|
|
363
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ThemeBrand = 'blue' | 'violet' | 'green' | 'orange' | 'red' | 'pink' | 'teal' | (string & {})
|
|
2
|
+
export type ThemeRadius = 'none' | 'sm' | 'md' | 'lg' | 'full'
|
|
3
|
+
export type ThemeMode = 'light' | 'dark' | 'system'
|
|
4
|
+
|
|
5
|
+
export interface SaasTheme {
|
|
6
|
+
brand?: ThemeBrand
|
|
7
|
+
radius?: ThemeRadius
|
|
8
|
+
/** Custom primary color as HSL string, e.g. '220 70% 50%' */
|
|
9
|
+
primaryHsl?: string
|
|
10
|
+
/** Custom secondary color as HSL string */
|
|
11
|
+
secondaryHsl?: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ThemeConfig {
|
|
15
|
+
theme?: SaasTheme
|
|
16
|
+
defaultMode?: ThemeMode
|
|
17
|
+
}
|