@makinbakin/sdk 0.0.0-bootstrap.0
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/README.md +107 -0
- package/_internal/app/components/agent-avatar.d.ts +11 -0
- package/_internal/app/components/agent-filter.d.ts +8 -0
- package/_internal/app/components/agent-select.d.ts +15 -0
- package/_internal/app/components/agent-status.d.ts +8 -0
- package/_internal/app/components/bakin-drawer.d.ts +23 -0
- package/_internal/app/components/color-picker.d.ts +7 -0
- package/_internal/app/components/empty-state.d.ts +10 -0
- package/_internal/app/components/error-banner.d.ts +6 -0
- package/_internal/app/components/error-state.d.ts +8 -0
- package/_internal/app/components/facet-filter.d.ts +17 -0
- package/_internal/app/components/integrated-brainstorm/collapsed-header.d.ts +14 -0
- package/_internal/app/components/integrated-brainstorm/empty-state.d.ts +5 -0
- package/_internal/app/components/integrated-brainstorm/index.d.ts +3 -0
- package/_internal/app/components/integrated-brainstorm/input-row.d.ts +16 -0
- package/_internal/app/components/integrated-brainstorm/message-list.d.ts +8 -0
- package/_internal/app/components/integrated-brainstorm/thinking-indicator.d.ts +19 -0
- package/_internal/app/components/integrated-brainstorm/types.d.ts +61 -0
- package/_internal/app/components/integrated-brainstorm/use-auto-grow.d.ts +6 -0
- package/_internal/app/components/integrated-brainstorm/use-brainstorm-state.d.ts +21 -0
- package/_internal/app/components/markdown-content.d.ts +3 -0
- package/_internal/app/components/markdown-editor.d.ts +11 -0
- package/_internal/app/components/model-select.d.ts +9 -0
- package/_internal/app/components/page-layout.d.ts +9 -0
- package/_internal/app/components/plugin-header.d.ts +16 -0
- package/_internal/app/components/plugin-settings-renderer.d.ts +9 -0
- package/_internal/app/components/sortable-head.d.ts +13 -0
- package/_internal/app/components/ui/alert.d.ts +10 -0
- package/_internal/app/components/ui/avatar.d.ts +11 -0
- package/_internal/app/components/ui/badge.d.ts +7 -0
- package/_internal/app/components/ui/button.d.ts +8 -0
- package/_internal/app/components/ui/card.d.ts +11 -0
- package/_internal/app/components/ui/checkbox.d.ts +3 -0
- package/_internal/app/components/ui/collapsible.d.ts +5 -0
- package/_internal/app/components/ui/command.d.ts +19 -0
- package/_internal/app/components/ui/dialog.d.ts +17 -0
- package/_internal/app/components/ui/dropdown-menu.d.ts +29 -0
- package/_internal/app/components/ui/form.d.ts +23 -0
- package/_internal/app/components/ui/input-group.d.ts +18 -0
- package/_internal/app/components/ui/input.d.ts +3 -0
- package/_internal/app/components/ui/label.d.ts +3 -0
- package/_internal/app/components/ui/popover.d.ts +9 -0
- package/_internal/app/components/ui/progress.d.ts +7 -0
- package/_internal/app/components/ui/select.d.ts +15 -0
- package/_internal/app/components/ui/separator.d.ts +3 -0
- package/_internal/app/components/ui/sheet.d.ts +14 -0
- package/_internal/app/components/ui/skeleton.d.ts +2 -0
- package/_internal/app/components/ui/switch.d.ts +5 -0
- package/_internal/app/components/ui/table.d.ts +10 -0
- package/_internal/app/components/ui/tabs.d.ts +10 -0
- package/_internal/app/components/ui/textarea.d.ts +3 -0
- package/_internal/app/components/ui/tooltip.d.ts +6 -0
- package/_internal/app/components/underline-tabs.d.ts +15 -0
- package/_internal/app/hooks/use-assets.d.ts +25 -0
- package/_internal/app/hooks/use-content-store.d.ts +36 -0
- package/_internal/app/hooks/use-debug.d.ts +1 -0
- package/_internal/app/hooks/use-form-guard.d.ts +5 -0
- package/_internal/app/hooks/use-query-state.d.ts +14 -0
- package/_internal/app/hooks/use-runtime-status.d.ts +12 -0
- package/_internal/app/hooks/use-schedule.d.ts +63 -0
- package/_internal/app/hooks/use-search.d.ts +65 -0
- package/_internal/app/hooks/use-sidebar.d.ts +4 -0
- package/_internal/app/hooks/use-sse.d.ts +1 -0
- package/_internal/app/hooks/use-toast.d.ts +16 -0
- package/_internal/app/hooks/use-vertical-resize.d.ts +22 -0
- package/_internal/app/lib/browser-notify.d.ts +5 -0
- package/_internal/app/lib/map-audit-message.d.ts +7 -0
- package/_internal/app/lib/utils.d.ts +2 -0
- package/_internal/app/types/index.d.ts +126 -0
- package/_internal/core/adapters/runtime/capabilities.d.ts +2 -0
- package/_internal/core/adapters/runtime/concepts.d.ts +458 -0
- package/_internal/core/adapters/runtime/helpers.d.ts +5 -0
- package/_internal/core/adapters/runtime/index.d.ts +5 -0
- package/_internal/core/adapters/shared.d.ts +37 -0
- package/_internal/core/docs/index.d.ts +2 -0
- package/_internal/core/docs/metadata.d.ts +92 -0
- package/_internal/core/docs/route.d.ts +9 -0
- package/_internal/core/format.d.ts +6 -0
- package/_internal/core/openapi/errors.d.ts +29 -0
- package/_internal/core/openapi/zod-to-openapi.d.ts +14 -0
- package/_internal/core/plugin-types.d.ts +849 -0
- package/_internal/core/routing/define.d.ts +34 -0
- package/_internal/core/routing/dispatcher.d.ts +44 -0
- package/_internal/core/routing/index.d.ts +15 -0
- package/_internal/core/routing/operation-id.d.ts +9 -0
- package/_internal/core/routing/registry.d.ts +52 -0
- package/_internal/core/routing/search-route.d.ts +26 -0
- package/_internal/core/routing/types.d.ts +123 -0
- package/_internal/plugins/team/hooks/use-agent-store.d.ts +49 -0
- package/_internal/plugins/team/types.d.ts +131 -0
- package/_internal/plugins/workflows/hooks/channel-icon.d.ts +6 -0
- package/_internal/plugins/workflows/hooks/use-notification-channels.d.ts +13 -0
- package/_internal/plugins/workflows/lib/notification-channel-registry.d.ts +26 -0
- package/components/index.d.ts +33 -0
- package/components/index.js +39522 -0
- package/hooks/index.d.ts +25 -0
- package/hooks/index.js +1738 -0
- package/hooks/router.d.ts +38 -0
- package/index.d.ts +27 -0
- package/index.js +13917 -0
- package/metadata/index.d.ts +16 -0
- package/metadata/index.js +31 -0
- package/package.json +88 -0
- package/register.d.ts +103 -0
- package/routing/index.d.ts +11 -0
- package/routing/index.js +13721 -0
- package/slots/index.d.ts +55 -0
- package/slots/index.js +92 -0
- package/types/index.d.ts +840 -0
- package/types/index.js +1 -0
- package/ui/index.d.ts +34 -0
- package/ui/index.js +28713 -0
- package/utils/index.d.ts +9 -0
- package/utils/index.js +1832 -0
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,840 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public Bakin plugin contract types.
|
|
3
|
+
*
|
|
4
|
+
* This module is intentionally self-contained. External plugins must be able
|
|
5
|
+
* to typecheck against `@bakin/sdk/types` without resolving `@bakin/core`,
|
|
6
|
+
* Bakin source aliases, adapter packages, or another plugin's internals.
|
|
7
|
+
*/
|
|
8
|
+
import type { ComponentType } from 'react';
|
|
9
|
+
import type { ZodRawShape } from 'zod';
|
|
10
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
11
|
+
export type ContractVisibility = 'public' | 'internal' | 'experimental';
|
|
12
|
+
export type ContractStability = 'stable' | 'beta' | 'experimental' | 'deprecated';
|
|
13
|
+
export interface SchemaLike<T = unknown> {
|
|
14
|
+
parse(data: unknown): T;
|
|
15
|
+
safeParse?(data: unknown): {
|
|
16
|
+
success: true;
|
|
17
|
+
data: T;
|
|
18
|
+
} | {
|
|
19
|
+
success: false;
|
|
20
|
+
error: unknown;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface SourceLocation {
|
|
24
|
+
file: string;
|
|
25
|
+
symbol?: string;
|
|
26
|
+
line?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface DocsExample {
|
|
29
|
+
title: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
code?: string;
|
|
32
|
+
request?: unknown;
|
|
33
|
+
response?: unknown;
|
|
34
|
+
test?: 'automated' | 'schema' | 'illustrative';
|
|
35
|
+
reason?: string;
|
|
36
|
+
}
|
|
37
|
+
export type PluginPermission = 'storage.read' | 'storage.write' | 'events.emit' | 'runtime.read' | 'runtime.agents' | 'runtime.messaging' | 'runtime.channels' | 'runtime.cron' | 'runtime.skills' | 'runtime.models' | 'tasks.read' | 'tasks.write' | 'search.read' | 'search.write' | 'assets.read';
|
|
38
|
+
export type RuntimeCapability = 'agents' | 'messaging' | 'channels.message' | 'channels.rich-content' | 'channels.interactive-approval' | 'channels.threaded-replies' | 'cron' | 'skills' | 'models' | 'tasks' | 'search';
|
|
39
|
+
export interface PluginEntryPoints {
|
|
40
|
+
server: string;
|
|
41
|
+
client?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ApiRouteContribution {
|
|
44
|
+
method: HttpMethod;
|
|
45
|
+
/** Plugin-relative path. Exposed as `/api/plugins/{pluginId}{path}`. */
|
|
46
|
+
path: string;
|
|
47
|
+
summary: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
operationId?: string;
|
|
50
|
+
tags?: string[];
|
|
51
|
+
visibility?: 'public' | 'internal' | 'experimental';
|
|
52
|
+
stability?: 'stable' | 'beta' | 'experimental' | 'deprecated';
|
|
53
|
+
parameters?: ApiParameterContribution[];
|
|
54
|
+
requestBody?: ApiRequestBodyContribution;
|
|
55
|
+
responses?: Record<string, ApiResponseContribution>;
|
|
56
|
+
permissions?: PluginPermission[];
|
|
57
|
+
}
|
|
58
|
+
export type JsonSchemaContribution = Record<string, unknown>;
|
|
59
|
+
export interface ApiParameterContribution {
|
|
60
|
+
name: string;
|
|
61
|
+
in: 'path' | 'query' | 'header' | 'cookie';
|
|
62
|
+
required?: boolean;
|
|
63
|
+
description?: string;
|
|
64
|
+
schema?: JsonSchemaContribution;
|
|
65
|
+
example?: unknown;
|
|
66
|
+
}
|
|
67
|
+
export interface ApiRequestBodyContribution {
|
|
68
|
+
description?: string;
|
|
69
|
+
required?: boolean;
|
|
70
|
+
contentType?: string;
|
|
71
|
+
schema?: JsonSchemaContribution;
|
|
72
|
+
example?: unknown;
|
|
73
|
+
}
|
|
74
|
+
export interface ApiResponseContribution {
|
|
75
|
+
description: string;
|
|
76
|
+
contentType?: string;
|
|
77
|
+
schema?: JsonSchemaContribution;
|
|
78
|
+
example?: unknown;
|
|
79
|
+
}
|
|
80
|
+
export interface ClientRouteContribution {
|
|
81
|
+
/** Absolute app route, e.g. `/messaging/calendar`. */
|
|
82
|
+
path: string;
|
|
83
|
+
summary: string;
|
|
84
|
+
slot?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface ExecToolContribution {
|
|
87
|
+
name: string;
|
|
88
|
+
summary: string;
|
|
89
|
+
description?: string;
|
|
90
|
+
permissions?: PluginPermission[];
|
|
91
|
+
}
|
|
92
|
+
export interface CliCommandContribution {
|
|
93
|
+
name: string;
|
|
94
|
+
usage: string;
|
|
95
|
+
summary: string;
|
|
96
|
+
description?: string;
|
|
97
|
+
aliases?: string[];
|
|
98
|
+
/** Optional. When present, the manifest-driven CLI dispatcher routes the
|
|
99
|
+
* command through either the named exec-tool or the given API route.
|
|
100
|
+
* When absent, the command is documentation-only — its real
|
|
101
|
+
* implementation lives in `cli/bakin.ts`'s imperative switch. */
|
|
102
|
+
dispatch?: {
|
|
103
|
+
type: 'apiRoute';
|
|
104
|
+
method: HttpMethod;
|
|
105
|
+
path: string;
|
|
106
|
+
} | {
|
|
107
|
+
type: 'execTool';
|
|
108
|
+
name: string;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export interface SettingsContribution {
|
|
112
|
+
key: string;
|
|
113
|
+
summary: string;
|
|
114
|
+
}
|
|
115
|
+
export interface DocsContribution {
|
|
116
|
+
slug: string;
|
|
117
|
+
}
|
|
118
|
+
export interface PluginContributions {
|
|
119
|
+
apiRoutes?: ApiRouteContribution[];
|
|
120
|
+
clientRoutes?: ClientRouteContribution[];
|
|
121
|
+
execTools?: ExecToolContribution[];
|
|
122
|
+
cliCommands?: CliCommandContribution[];
|
|
123
|
+
settings?: SettingsContribution[];
|
|
124
|
+
docs?: DocsContribution;
|
|
125
|
+
}
|
|
126
|
+
export interface PluginManifestSignature {
|
|
127
|
+
algorithm: 'ed25519';
|
|
128
|
+
/** Human-readable signer label. Trust is bound to publicKey/fingerprint, not this label. */
|
|
129
|
+
signer: string;
|
|
130
|
+
/** Base64-encoded Ed25519 SPKI DER public key. */
|
|
131
|
+
publicKey: string;
|
|
132
|
+
/** Base64-encoded signature over the canonical manifest without this signature block. */
|
|
133
|
+
signature: string;
|
|
134
|
+
}
|
|
135
|
+
export interface PluginManifest {
|
|
136
|
+
id: string;
|
|
137
|
+
name: string;
|
|
138
|
+
version: string;
|
|
139
|
+
bakin: string;
|
|
140
|
+
description: string;
|
|
141
|
+
entry: PluginEntryPoints;
|
|
142
|
+
contentFiles?: string[];
|
|
143
|
+
secrets?: string[];
|
|
144
|
+
tests?: string;
|
|
145
|
+
dependencies?: string[];
|
|
146
|
+
permissions?: PluginPermission[];
|
|
147
|
+
runtimeCapabilities?: RuntimeCapability[];
|
|
148
|
+
contributes?: PluginContributions;
|
|
149
|
+
devWatch?: string[];
|
|
150
|
+
signature?: PluginManifestSignature;
|
|
151
|
+
}
|
|
152
|
+
export interface StorageStat {
|
|
153
|
+
path: string;
|
|
154
|
+
size: number;
|
|
155
|
+
mtimeMs: number;
|
|
156
|
+
isFile: boolean;
|
|
157
|
+
isDirectory: boolean;
|
|
158
|
+
}
|
|
159
|
+
export interface StorageAdapter {
|
|
160
|
+
read(path: string): string | null;
|
|
161
|
+
write(path: string, content: string): void;
|
|
162
|
+
append(path: string, content: string): void;
|
|
163
|
+
exists(path: string): boolean;
|
|
164
|
+
readAll(): Record<string, string>;
|
|
165
|
+
list?(path?: string): string[];
|
|
166
|
+
remove?(path: string): void;
|
|
167
|
+
rename?(from: string, to: string): void;
|
|
168
|
+
stat?(path: string): StorageStat | null;
|
|
169
|
+
readJson?<T = unknown>(path: string): T | null;
|
|
170
|
+
writeJson?(path: string, value: unknown): void;
|
|
171
|
+
searchPath?(path: string): string;
|
|
172
|
+
}
|
|
173
|
+
export interface EventBus {
|
|
174
|
+
emit(event: string, data?: Record<string, unknown>): void;
|
|
175
|
+
on(pattern: string, handler: (event: string, data: Record<string, unknown>) => void): () => void;
|
|
176
|
+
once(pattern: string, handler: (event: string, data: Record<string, unknown>) => void): () => void;
|
|
177
|
+
}
|
|
178
|
+
export interface ActivityAPI {
|
|
179
|
+
log(agent: string, message: string, opts?: {
|
|
180
|
+
taskId?: string;
|
|
181
|
+
category?: string;
|
|
182
|
+
}): void;
|
|
183
|
+
audit(event: string, agent: string, data?: Record<string, unknown>): void;
|
|
184
|
+
}
|
|
185
|
+
export interface HookAPI {
|
|
186
|
+
register(name: string, handler: (data: unknown) => unknown, metadata?: HookRegistrationMetadata): () => void;
|
|
187
|
+
call<T>(name: string, data: T): Promise<T>;
|
|
188
|
+
callAll(name: string, data: Record<string, unknown>): Promise<void>;
|
|
189
|
+
has(name: string): boolean;
|
|
190
|
+
invoke<R>(name: string, data: unknown): Promise<R | undefined>;
|
|
191
|
+
}
|
|
192
|
+
export interface HookRegistrationMetadata {
|
|
193
|
+
label?: string;
|
|
194
|
+
summary: string;
|
|
195
|
+
description?: string;
|
|
196
|
+
hookKind?: HookKind;
|
|
197
|
+
input?: SchemaLike;
|
|
198
|
+
output?: SchemaLike;
|
|
199
|
+
visibility?: ContractVisibility;
|
|
200
|
+
stability?: ContractStability;
|
|
201
|
+
examples?: DocsExample[];
|
|
202
|
+
}
|
|
203
|
+
export type HookKind = 'rpc' | 'event' | 'waterfall';
|
|
204
|
+
export interface NavItem {
|
|
205
|
+
id: string;
|
|
206
|
+
label: string;
|
|
207
|
+
icon: string;
|
|
208
|
+
href: string;
|
|
209
|
+
order?: number;
|
|
210
|
+
children?: NavItem[];
|
|
211
|
+
alwaysExpanded?: boolean;
|
|
212
|
+
}
|
|
213
|
+
export interface APIRoute {
|
|
214
|
+
path: string;
|
|
215
|
+
method: HttpMethod;
|
|
216
|
+
handler: (req: Request, ctx: PluginContext) => Response | Promise<Response>;
|
|
217
|
+
summary?: string;
|
|
218
|
+
description?: string;
|
|
219
|
+
params?: string;
|
|
220
|
+
input?: SchemaLike;
|
|
221
|
+
output?: SchemaLike;
|
|
222
|
+
visibility?: ContractVisibility;
|
|
223
|
+
stability?: ContractStability;
|
|
224
|
+
examples?: DocsExample[];
|
|
225
|
+
source?: SourceLocation;
|
|
226
|
+
permissions?: string[];
|
|
227
|
+
}
|
|
228
|
+
export interface UISlotRegistration {
|
|
229
|
+
slot: string;
|
|
230
|
+
component: ComponentType<Record<string, unknown>>;
|
|
231
|
+
order?: number;
|
|
232
|
+
}
|
|
233
|
+
export interface ContentFile {
|
|
234
|
+
path: string;
|
|
235
|
+
}
|
|
236
|
+
export interface RuntimeAgent {
|
|
237
|
+
id: string;
|
|
238
|
+
name: string;
|
|
239
|
+
role?: string;
|
|
240
|
+
model?: string;
|
|
241
|
+
status?: 'active' | 'inactive' | 'unknown';
|
|
242
|
+
metadata?: Record<string, unknown>;
|
|
243
|
+
}
|
|
244
|
+
export interface RuntimeChannel {
|
|
245
|
+
id: string;
|
|
246
|
+
platform: string;
|
|
247
|
+
label: string;
|
|
248
|
+
capabilities: string[];
|
|
249
|
+
metadata?: Record<string, unknown>;
|
|
250
|
+
}
|
|
251
|
+
export interface RuntimeMessageArgs {
|
|
252
|
+
agentId: string;
|
|
253
|
+
content: string;
|
|
254
|
+
threadId?: string;
|
|
255
|
+
metadata?: Record<string, unknown>;
|
|
256
|
+
}
|
|
257
|
+
export interface RuntimeMessageResult {
|
|
258
|
+
id: string;
|
|
259
|
+
content?: string;
|
|
260
|
+
metadata?: Record<string, unknown>;
|
|
261
|
+
}
|
|
262
|
+
export interface RuntimeChatChunk {
|
|
263
|
+
type: 'text' | 'tool' | 'status' | 'done' | 'error';
|
|
264
|
+
content?: string;
|
|
265
|
+
data?: unknown;
|
|
266
|
+
}
|
|
267
|
+
export interface CronJob {
|
|
268
|
+
id: string;
|
|
269
|
+
name: string;
|
|
270
|
+
schedule: string;
|
|
271
|
+
command: string;
|
|
272
|
+
enabled: boolean;
|
|
273
|
+
toolsAllow?: string[];
|
|
274
|
+
metadata?: Record<string, unknown>;
|
|
275
|
+
}
|
|
276
|
+
export interface CronRun {
|
|
277
|
+
id: string;
|
|
278
|
+
jobId: string;
|
|
279
|
+
status: 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled';
|
|
280
|
+
startedAt?: string;
|
|
281
|
+
endedAt?: string;
|
|
282
|
+
output?: string;
|
|
283
|
+
error?: string;
|
|
284
|
+
}
|
|
285
|
+
export interface RuntimeSkill {
|
|
286
|
+
name: string;
|
|
287
|
+
description?: string;
|
|
288
|
+
}
|
|
289
|
+
export interface WorkspaceFile {
|
|
290
|
+
path: string;
|
|
291
|
+
content?: string;
|
|
292
|
+
}
|
|
293
|
+
export interface AgentRuntimeAdapter {
|
|
294
|
+
agents: {
|
|
295
|
+
list(): Promise<RuntimeAgent[]>;
|
|
296
|
+
get(agentId: string): Promise<RuntimeAgent | null>;
|
|
297
|
+
};
|
|
298
|
+
messaging: {
|
|
299
|
+
send(input: RuntimeMessageArgs): Promise<RuntimeMessageResult>;
|
|
300
|
+
stream(input: RuntimeMessageArgs): AsyncIterable<RuntimeChatChunk>;
|
|
301
|
+
};
|
|
302
|
+
channels: {
|
|
303
|
+
list(): Promise<RuntimeChannel[]>;
|
|
304
|
+
sendMessage(input: {
|
|
305
|
+
channels: string[];
|
|
306
|
+
message: {
|
|
307
|
+
body: string;
|
|
308
|
+
title?: string;
|
|
309
|
+
threadId?: string;
|
|
310
|
+
metadata?: Record<string, unknown>;
|
|
311
|
+
};
|
|
312
|
+
}): Promise<{
|
|
313
|
+
deliveries: Array<{
|
|
314
|
+
channelId: string;
|
|
315
|
+
ref: string;
|
|
316
|
+
renderedAt: string;
|
|
317
|
+
}>;
|
|
318
|
+
}>;
|
|
319
|
+
deliverContent(input: {
|
|
320
|
+
channels: string[];
|
|
321
|
+
content: {
|
|
322
|
+
title: string;
|
|
323
|
+
body?: string;
|
|
324
|
+
url?: string;
|
|
325
|
+
files?: AssetFileRef[];
|
|
326
|
+
metadata?: Record<string, unknown>;
|
|
327
|
+
};
|
|
328
|
+
}): Promise<{
|
|
329
|
+
deliveries: Array<{
|
|
330
|
+
channelId: string;
|
|
331
|
+
ref: string;
|
|
332
|
+
renderedAt: string;
|
|
333
|
+
}>;
|
|
334
|
+
}>;
|
|
335
|
+
};
|
|
336
|
+
cron: {
|
|
337
|
+
list(): Promise<CronJob[]>;
|
|
338
|
+
get(id: string): Promise<CronJob | null>;
|
|
339
|
+
create(input: {
|
|
340
|
+
id?: string;
|
|
341
|
+
name: string;
|
|
342
|
+
schedule: string;
|
|
343
|
+
command: string;
|
|
344
|
+
enabled?: boolean;
|
|
345
|
+
toolsAllow?: string[];
|
|
346
|
+
metadata?: Record<string, unknown>;
|
|
347
|
+
}): Promise<CronJob>;
|
|
348
|
+
update(id: string, patch: Partial<Omit<CronJob, 'id' | 'toolsAllow'>> & {
|
|
349
|
+
toolsAllow?: string[] | null;
|
|
350
|
+
}): Promise<CronJob>;
|
|
351
|
+
remove(id: string): Promise<void>;
|
|
352
|
+
runNow(id: string): Promise<CronRun>;
|
|
353
|
+
listRuns(jobId: string): Promise<CronRun[]>;
|
|
354
|
+
getRaw(id: string, reason: string): Promise<unknown | null>;
|
|
355
|
+
restoreRaw(id: string, snapshot: unknown, reason: string): Promise<CronJob>;
|
|
356
|
+
};
|
|
357
|
+
skills?: {
|
|
358
|
+
list(): Promise<RuntimeSkill[]>;
|
|
359
|
+
};
|
|
360
|
+
models?: {
|
|
361
|
+
listAvailable(opts?: {
|
|
362
|
+
includeUnavailable?: boolean;
|
|
363
|
+
}): Promise<AvailableModel[]>;
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
export interface TaskLogEntry {
|
|
367
|
+
timestamp: string;
|
|
368
|
+
author: string;
|
|
369
|
+
message: string;
|
|
370
|
+
data?: Record<string, unknown>;
|
|
371
|
+
}
|
|
372
|
+
export interface Task {
|
|
373
|
+
id: string;
|
|
374
|
+
title: string;
|
|
375
|
+
agent?: string;
|
|
376
|
+
createdBy?: string;
|
|
377
|
+
checked: boolean;
|
|
378
|
+
column: ColumnId;
|
|
379
|
+
date?: string;
|
|
380
|
+
blockedReason?: string;
|
|
381
|
+
description?: string;
|
|
382
|
+
log?: TaskLogEntry[];
|
|
383
|
+
dependsOn?: string;
|
|
384
|
+
parentId?: string | null;
|
|
385
|
+
workflowId?: string;
|
|
386
|
+
scheduleJobId?: string;
|
|
387
|
+
projectId?: string;
|
|
388
|
+
order?: number;
|
|
389
|
+
createdAt?: string;
|
|
390
|
+
updatedAt?: string;
|
|
391
|
+
}
|
|
392
|
+
export interface TaskColumns {
|
|
393
|
+
backlog: Task[];
|
|
394
|
+
inProgress: Task[];
|
|
395
|
+
todo: Task[];
|
|
396
|
+
review: Task[];
|
|
397
|
+
done: Task[];
|
|
398
|
+
blocked: Task[];
|
|
399
|
+
archived: Task[];
|
|
400
|
+
}
|
|
401
|
+
export interface TaskBoard {
|
|
402
|
+
columns: TaskColumns;
|
|
403
|
+
timestamp?: string;
|
|
404
|
+
}
|
|
405
|
+
export type ColumnId = keyof TaskColumns;
|
|
406
|
+
export interface TaskCreateInput {
|
|
407
|
+
id?: string;
|
|
408
|
+
title: string;
|
|
409
|
+
description?: string;
|
|
410
|
+
agent?: string;
|
|
411
|
+
createdBy?: string;
|
|
412
|
+
column?: ColumnId;
|
|
413
|
+
date?: string;
|
|
414
|
+
workflowId?: string;
|
|
415
|
+
projectId?: string;
|
|
416
|
+
parentId?: string | null;
|
|
417
|
+
skipWorkflowReason?: string;
|
|
418
|
+
}
|
|
419
|
+
export interface TaskUpdateInput {
|
|
420
|
+
title?: string;
|
|
421
|
+
description?: string;
|
|
422
|
+
agent?: string;
|
|
423
|
+
createdBy?: string;
|
|
424
|
+
checked?: boolean;
|
|
425
|
+
column?: ColumnId;
|
|
426
|
+
date?: string;
|
|
427
|
+
blockedReason?: string;
|
|
428
|
+
workflowId?: string;
|
|
429
|
+
scheduleJobId?: string;
|
|
430
|
+
projectId?: string;
|
|
431
|
+
parentId?: string | null;
|
|
432
|
+
}
|
|
433
|
+
export interface TaskService {
|
|
434
|
+
create(input: TaskCreateInput): Promise<Task>;
|
|
435
|
+
update(id: string, patch: TaskUpdateInput): Promise<Task>;
|
|
436
|
+
move(id: string, column: ColumnId): Promise<Task>;
|
|
437
|
+
remove(id: string): Promise<void>;
|
|
438
|
+
get(id: string): Promise<Task | null>;
|
|
439
|
+
list(filter?: {
|
|
440
|
+
column?: ColumnId;
|
|
441
|
+
agent?: string;
|
|
442
|
+
projectId?: string;
|
|
443
|
+
}): Promise<Task[]>;
|
|
444
|
+
appendLog(id: string, entry: TaskLogEntry): Promise<void>;
|
|
445
|
+
}
|
|
446
|
+
export interface SearchSchemaField {
|
|
447
|
+
type: 'text' | 'keyword' | 'number' | 'boolean' | 'datetime' | 'array';
|
|
448
|
+
}
|
|
449
|
+
export interface SearchIndexDefinition {
|
|
450
|
+
name: string;
|
|
451
|
+
embedderRef: string;
|
|
452
|
+
embeddingTemplate?: string;
|
|
453
|
+
mediaUrlField?: string;
|
|
454
|
+
chunker?: {
|
|
455
|
+
enabled: boolean;
|
|
456
|
+
targetTokens?: number;
|
|
457
|
+
overlapTokens?: number;
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
export interface SearchContentTypeDefinition {
|
|
461
|
+
table: string;
|
|
462
|
+
schema: Record<string, SearchSchemaField>;
|
|
463
|
+
searchableFields: string[];
|
|
464
|
+
embeddingTemplate: string;
|
|
465
|
+
indexes?: SearchIndexDefinition[];
|
|
466
|
+
facets?: string[];
|
|
467
|
+
rerankField?: string;
|
|
468
|
+
ttl?: string;
|
|
469
|
+
ttlField?: string;
|
|
470
|
+
chunker?: {
|
|
471
|
+
enabled: boolean;
|
|
472
|
+
targetTokens?: number;
|
|
473
|
+
overlapTokens?: number;
|
|
474
|
+
};
|
|
475
|
+
reindex: () => AsyncGenerator<{
|
|
476
|
+
key: string;
|
|
477
|
+
doc: Record<string, unknown>;
|
|
478
|
+
}>;
|
|
479
|
+
verifyExists: (key: string) => Promise<boolean>;
|
|
480
|
+
}
|
|
481
|
+
export interface FilePatternMapper {
|
|
482
|
+
pattern: string;
|
|
483
|
+
fileToId: (relPath: string) => string | null;
|
|
484
|
+
fileToDoc: (relPath: string, content: string) => Promise<Record<string, unknown> | null>;
|
|
485
|
+
}
|
|
486
|
+
export interface FileBackedContentTypeDefinition extends SearchContentTypeDefinition {
|
|
487
|
+
filePatterns: FilePatternMapper[];
|
|
488
|
+
excludePatterns?: string[];
|
|
489
|
+
onSync?: (relPath: string, content: string) => Promise<void>;
|
|
490
|
+
onUnlink?: (relPath: string) => Promise<void>;
|
|
491
|
+
buildOnStartup?: boolean;
|
|
492
|
+
}
|
|
493
|
+
export interface SearchQueryParams {
|
|
494
|
+
q: string;
|
|
495
|
+
filters?: Record<string, string | boolean | number>;
|
|
496
|
+
facets?: string[];
|
|
497
|
+
limit?: number;
|
|
498
|
+
offset?: number;
|
|
499
|
+
rerank?: boolean;
|
|
500
|
+
aggregations?: Record<string, unknown>;
|
|
501
|
+
strategy?: 'rrf' | 'semantic_only' | 'full_text_only';
|
|
502
|
+
}
|
|
503
|
+
export interface SearchResult {
|
|
504
|
+
id: string;
|
|
505
|
+
table: string;
|
|
506
|
+
score: number;
|
|
507
|
+
fields: Record<string, unknown>;
|
|
508
|
+
rerankScore?: number;
|
|
509
|
+
}
|
|
510
|
+
export interface SearchResponse {
|
|
511
|
+
results: SearchResult[];
|
|
512
|
+
aggregations?: Record<string, Array<{
|
|
513
|
+
value: string;
|
|
514
|
+
count: number;
|
|
515
|
+
}>>;
|
|
516
|
+
rawAggregations?: Record<string, unknown>;
|
|
517
|
+
meta: {
|
|
518
|
+
query: string;
|
|
519
|
+
total: number;
|
|
520
|
+
took_ms: number;
|
|
521
|
+
source: 'search' | 'fallback';
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
export interface SearchHealthSnapshot {
|
|
525
|
+
enabled: boolean;
|
|
526
|
+
tables: Array<{
|
|
527
|
+
table: string;
|
|
528
|
+
pluginId: string;
|
|
529
|
+
stats: Record<string, unknown> | null;
|
|
530
|
+
healthy: boolean;
|
|
531
|
+
}>;
|
|
532
|
+
}
|
|
533
|
+
export interface SearchTransformOp {
|
|
534
|
+
op: '$set' | '$inc' | '$push';
|
|
535
|
+
field?: string;
|
|
536
|
+
value: unknown;
|
|
537
|
+
}
|
|
538
|
+
export interface SearchAPI {
|
|
539
|
+
registerContentType(def: SearchContentTypeDefinition): void;
|
|
540
|
+
registerFileBackedContentType(def: FileBackedContentTypeDefinition): void;
|
|
541
|
+
index(key: string, doc: Record<string, unknown>): Promise<void>;
|
|
542
|
+
remove(key: string): Promise<void>;
|
|
543
|
+
transform(key: string, operations: SearchTransformOp[]): Promise<void>;
|
|
544
|
+
query(params: SearchQueryParams): Promise<SearchResponse>;
|
|
545
|
+
health?(): Promise<SearchHealthSnapshot>;
|
|
546
|
+
}
|
|
547
|
+
export interface AssetVariantMeta {
|
|
548
|
+
role: 'thumbnail' | 'optimized' | 'webp';
|
|
549
|
+
path: string;
|
|
550
|
+
filename: string;
|
|
551
|
+
size: number;
|
|
552
|
+
mimeType: string;
|
|
553
|
+
}
|
|
554
|
+
export interface AssetMeta {
|
|
555
|
+
path: string;
|
|
556
|
+
filename: string;
|
|
557
|
+
type: 'text' | 'images' | 'video' | 'audio' | 'plans' | 'research' | 'pdf' | 'data' | 'other';
|
|
558
|
+
mimeType: string;
|
|
559
|
+
size: number;
|
|
560
|
+
mtimeMs?: number;
|
|
561
|
+
metadata: {
|
|
562
|
+
agent: string;
|
|
563
|
+
taskId: string | null;
|
|
564
|
+
created: string;
|
|
565
|
+
tool?: string;
|
|
566
|
+
description?: string;
|
|
567
|
+
tags?: string[];
|
|
568
|
+
originalFilename?: string;
|
|
569
|
+
};
|
|
570
|
+
variants?: AssetVariantMeta[];
|
|
571
|
+
}
|
|
572
|
+
export interface TrashedAssetMeta {
|
|
573
|
+
filename: string;
|
|
574
|
+
originalFilename: string;
|
|
575
|
+
type: string;
|
|
576
|
+
mimeType: string;
|
|
577
|
+
size: number;
|
|
578
|
+
deletedAt: string;
|
|
579
|
+
expiresAt: string;
|
|
580
|
+
metadata: AssetMeta['metadata'] | null;
|
|
581
|
+
}
|
|
582
|
+
export interface AssetFileRef {
|
|
583
|
+
kind: 'asset';
|
|
584
|
+
filename: string;
|
|
585
|
+
mimeType?: string;
|
|
586
|
+
}
|
|
587
|
+
export interface AssetsAPI {
|
|
588
|
+
getByFilename(filename: string): Promise<AssetMeta | null>;
|
|
589
|
+
list(filter?: {
|
|
590
|
+
type?: AssetMeta['type'];
|
|
591
|
+
taskId?: string | null;
|
|
592
|
+
}): Promise<AssetMeta[]>;
|
|
593
|
+
exists(filename: string): Promise<boolean>;
|
|
594
|
+
fileRef(filename: string): Promise<AssetFileRef>;
|
|
595
|
+
}
|
|
596
|
+
export interface ExecToolResult {
|
|
597
|
+
ok: boolean;
|
|
598
|
+
error?: string;
|
|
599
|
+
details?: unknown;
|
|
600
|
+
[key: string]: unknown;
|
|
601
|
+
}
|
|
602
|
+
export interface PluginToolContext {
|
|
603
|
+
storage: StorageAdapter;
|
|
604
|
+
events: EventBus;
|
|
605
|
+
pluginId: string;
|
|
606
|
+
runtime: AgentRuntimeAdapter;
|
|
607
|
+
tasks: TaskService;
|
|
608
|
+
search: SearchAPI;
|
|
609
|
+
assets: AssetsAPI;
|
|
610
|
+
hooks: HookAPI;
|
|
611
|
+
activity: ActivityAPI;
|
|
612
|
+
getSettings<T = Record<string, unknown>>(): T;
|
|
613
|
+
}
|
|
614
|
+
export interface ExecToolDefinition {
|
|
615
|
+
name: string;
|
|
616
|
+
description: string;
|
|
617
|
+
label?: string;
|
|
618
|
+
activityDuplicate?: boolean;
|
|
619
|
+
parameters: ZodRawShape;
|
|
620
|
+
handler: (params: Record<string, unknown>, agent: string, ctx?: PluginToolContext) => Promise<ExecToolResult>;
|
|
621
|
+
source?: string;
|
|
622
|
+
}
|
|
623
|
+
export interface SkillDefinition {
|
|
624
|
+
name: string;
|
|
625
|
+
instructions: string;
|
|
626
|
+
output_schema?: Record<string, unknown>;
|
|
627
|
+
source?: string;
|
|
628
|
+
}
|
|
629
|
+
export interface WorkflowDefinitionInput {
|
|
630
|
+
id?: string;
|
|
631
|
+
name: string;
|
|
632
|
+
description: string;
|
|
633
|
+
version: number;
|
|
634
|
+
inputs?: Record<string, unknown>;
|
|
635
|
+
steps: unknown[];
|
|
636
|
+
}
|
|
637
|
+
export type FormFieldType = 'string' | 'text' | 'number' | 'boolean' | 'select' | 'agent' | 'skill' | 'list';
|
|
638
|
+
export interface FormField {
|
|
639
|
+
name: string;
|
|
640
|
+
type: FormFieldType;
|
|
641
|
+
required?: boolean;
|
|
642
|
+
description?: string;
|
|
643
|
+
options?: {
|
|
644
|
+
value: string;
|
|
645
|
+
label: string;
|
|
646
|
+
}[];
|
|
647
|
+
}
|
|
648
|
+
export interface EdgeRules {
|
|
649
|
+
maxInbound?: number;
|
|
650
|
+
maxOutbound?: number;
|
|
651
|
+
}
|
|
652
|
+
export interface PluginNodeTypeInput<T = unknown> {
|
|
653
|
+
kind: string;
|
|
654
|
+
zodSchema: SchemaLike<T>;
|
|
655
|
+
formFields: FormField[];
|
|
656
|
+
edgeRules?: EdgeRules;
|
|
657
|
+
}
|
|
658
|
+
export interface PluginNotificationChannelInput {
|
|
659
|
+
id: string;
|
|
660
|
+
label: string;
|
|
661
|
+
initials?: string;
|
|
662
|
+
icon?: string;
|
|
663
|
+
}
|
|
664
|
+
export interface HealthCheckResult {
|
|
665
|
+
check: string;
|
|
666
|
+
status: 'ok' | 'warn' | 'error' | 'fixed';
|
|
667
|
+
message: string;
|
|
668
|
+
autoFixable: boolean;
|
|
669
|
+
}
|
|
670
|
+
export interface PluginHealthCheckInput {
|
|
671
|
+
id: string;
|
|
672
|
+
name: string;
|
|
673
|
+
run: () => Promise<HealthCheckResult[]>;
|
|
674
|
+
autoFix?: boolean;
|
|
675
|
+
}
|
|
676
|
+
interface BaseSettingsField {
|
|
677
|
+
key: string;
|
|
678
|
+
label: string;
|
|
679
|
+
description?: string;
|
|
680
|
+
required?: boolean;
|
|
681
|
+
}
|
|
682
|
+
export interface StringSettingsField extends BaseSettingsField {
|
|
683
|
+
type: 'string';
|
|
684
|
+
default?: string;
|
|
685
|
+
}
|
|
686
|
+
export interface NumberSettingsField extends BaseSettingsField {
|
|
687
|
+
type: 'number';
|
|
688
|
+
default?: number;
|
|
689
|
+
}
|
|
690
|
+
export interface BooleanSettingsField extends BaseSettingsField {
|
|
691
|
+
type: 'boolean';
|
|
692
|
+
default?: boolean;
|
|
693
|
+
}
|
|
694
|
+
export interface SelectSettingsField extends BaseSettingsField {
|
|
695
|
+
type: 'select';
|
|
696
|
+
options: {
|
|
697
|
+
value: string;
|
|
698
|
+
label: string;
|
|
699
|
+
}[];
|
|
700
|
+
default?: string;
|
|
701
|
+
}
|
|
702
|
+
export interface ListSettingsField extends BaseSettingsField {
|
|
703
|
+
type: 'list';
|
|
704
|
+
itemShape: Record<string, StringSettingsField | NumberSettingsField | BooleanSettingsField | SelectSettingsField>;
|
|
705
|
+
default?: unknown[];
|
|
706
|
+
addLabel?: string;
|
|
707
|
+
minItems?: number;
|
|
708
|
+
maxItems?: number;
|
|
709
|
+
uniqueField?: string;
|
|
710
|
+
}
|
|
711
|
+
export type SettingsField = StringSettingsField | NumberSettingsField | BooleanSettingsField | SelectSettingsField | ListSettingsField;
|
|
712
|
+
export interface PluginSettingsSchema {
|
|
713
|
+
fields: SettingsField[];
|
|
714
|
+
}
|
|
715
|
+
export interface PluginContext {
|
|
716
|
+
storage: StorageAdapter;
|
|
717
|
+
events: EventBus;
|
|
718
|
+
pluginId: string;
|
|
719
|
+
runtime: AgentRuntimeAdapter;
|
|
720
|
+
tasks: TaskService;
|
|
721
|
+
assets: AssetsAPI;
|
|
722
|
+
registerNav(items: NavItem[]): void;
|
|
723
|
+
registerRoute(route: APIRoute): void;
|
|
724
|
+
registerSlot(registration: UISlotRegistration): void;
|
|
725
|
+
registerExecTool(tool: ExecToolDefinition): void;
|
|
726
|
+
registerSkill(skill: SkillDefinition): void;
|
|
727
|
+
registerWorkflow(definition: WorkflowDefinitionInput, opts?: {
|
|
728
|
+
readOnly?: boolean;
|
|
729
|
+
}): void;
|
|
730
|
+
registerNodeType<T = unknown>(def: PluginNodeTypeInput<T>): string;
|
|
731
|
+
registerNotificationChannel(def: PluginNotificationChannelInput): string;
|
|
732
|
+
registerHealthCheck(def: PluginHealthCheckInput): string;
|
|
733
|
+
watchFiles(patterns: string[]): void;
|
|
734
|
+
getSettings<T = Record<string, unknown>>(): T;
|
|
735
|
+
updateSettings(patch: Record<string, unknown>): void;
|
|
736
|
+
activity: ActivityAPI;
|
|
737
|
+
hooks: HookAPI;
|
|
738
|
+
search: SearchAPI;
|
|
739
|
+
}
|
|
740
|
+
export interface BakinPlugin {
|
|
741
|
+
id: string;
|
|
742
|
+
name: string;
|
|
743
|
+
version: string;
|
|
744
|
+
activate(ctx: PluginContext): void | Promise<void>;
|
|
745
|
+
onReady?(): void | Promise<void>;
|
|
746
|
+
onShutdown?(): void | Promise<void>;
|
|
747
|
+
onSettingsChange?(settings: Record<string, unknown>): void | Promise<void>;
|
|
748
|
+
onUninstall?(ctx: PluginContext): void | Promise<void>;
|
|
749
|
+
settingsSchema?: PluginSettingsSchema;
|
|
750
|
+
navItems?: NavItem[];
|
|
751
|
+
contentFiles?: ContentFile[];
|
|
752
|
+
}
|
|
753
|
+
export interface CalendarEvent {
|
|
754
|
+
time?: string;
|
|
755
|
+
text: string;
|
|
756
|
+
}
|
|
757
|
+
export interface CalendarDay {
|
|
758
|
+
date: string;
|
|
759
|
+
label?: string;
|
|
760
|
+
events: CalendarEvent[];
|
|
761
|
+
}
|
|
762
|
+
export interface RecurringEvent {
|
|
763
|
+
schedule: string;
|
|
764
|
+
text: string;
|
|
765
|
+
}
|
|
766
|
+
export interface MemoryEntry {
|
|
767
|
+
type: 'decision' | 'learned' | 'note';
|
|
768
|
+
text: string;
|
|
769
|
+
}
|
|
770
|
+
export interface MemoryDay {
|
|
771
|
+
date: string;
|
|
772
|
+
entries: MemoryEntry[];
|
|
773
|
+
}
|
|
774
|
+
export interface Heartbeat {
|
|
775
|
+
status: 'working' | 'idle' | 'down';
|
|
776
|
+
currentTask?: string;
|
|
777
|
+
timestamp: string;
|
|
778
|
+
}
|
|
779
|
+
export interface ProjectMeta {
|
|
780
|
+
filename: string;
|
|
781
|
+
title: string;
|
|
782
|
+
status?: string;
|
|
783
|
+
content: string;
|
|
784
|
+
}
|
|
785
|
+
export interface AvailableModel {
|
|
786
|
+
id: string;
|
|
787
|
+
name?: string;
|
|
788
|
+
provider?: string;
|
|
789
|
+
source?: string;
|
|
790
|
+
tier?: 'budget' | 'standard' | 'premium';
|
|
791
|
+
input?: string;
|
|
792
|
+
contextWindow?: number;
|
|
793
|
+
local?: boolean;
|
|
794
|
+
available?: boolean;
|
|
795
|
+
tags?: string[];
|
|
796
|
+
configured?: boolean;
|
|
797
|
+
isDefault?: boolean;
|
|
798
|
+
fallbackIndex?: number | null;
|
|
799
|
+
description?: string;
|
|
800
|
+
bestFor?: string;
|
|
801
|
+
costRange?: string;
|
|
802
|
+
contextWindowDisplay?: string;
|
|
803
|
+
kind?: 'llm' | 'image' | 'video';
|
|
804
|
+
brandIconSlug?: string;
|
|
805
|
+
providerLabel?: string;
|
|
806
|
+
providerBrandIconSlug?: string;
|
|
807
|
+
providerBrandColor?: string;
|
|
808
|
+
}
|
|
809
|
+
export interface WorkflowDefinition {
|
|
810
|
+
id?: string;
|
|
811
|
+
name: string;
|
|
812
|
+
description?: string;
|
|
813
|
+
version?: number;
|
|
814
|
+
steps: unknown[];
|
|
815
|
+
[key: string]: unknown;
|
|
816
|
+
}
|
|
817
|
+
export interface WorkflowInstance {
|
|
818
|
+
id: string;
|
|
819
|
+
taskId?: string;
|
|
820
|
+
status?: string;
|
|
821
|
+
[key: string]: unknown;
|
|
822
|
+
}
|
|
823
|
+
export interface WorkflowStep {
|
|
824
|
+
id: string;
|
|
825
|
+
type: string;
|
|
826
|
+
[key: string]: unknown;
|
|
827
|
+
}
|
|
828
|
+
export type WorkflowTemplate = WorkflowDefinition;
|
|
829
|
+
export interface BakinConfig {
|
|
830
|
+
plugins: PluginEntry[];
|
|
831
|
+
theme?: Record<string, string>;
|
|
832
|
+
storage?: {
|
|
833
|
+
contentDir?: string;
|
|
834
|
+
};
|
|
835
|
+
}
|
|
836
|
+
export interface PluginEntry {
|
|
837
|
+
path: string;
|
|
838
|
+
enabled?: boolean;
|
|
839
|
+
}
|
|
840
|
+
export {};
|