@makinbakin/sdk 0.0.1-rc.6 → 0.0.1-rc.9

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 CHANGED
@@ -86,6 +86,7 @@ component for a slot via `registerPlugin({ slots: { 'slot-name': Component } })`
86
86
  | `task-assets` | Task drawer, asset attachments section |
87
87
  | `task-sidebar` | Task drawer sidebar (custom panels for a plugin's tasks) |
88
88
  | `home-widget` | Dashboard home widget grid |
89
+ | `nav-badge-providers` | Background hook runners (render `null`) that drive `setNavBadge` |
89
90
  | `page:/<route>` | Full-page mount at `<route>` |
90
91
 
91
92
  ## Sub-path imports
@@ -15,6 +15,7 @@ interface ContentStore extends ContentState {
15
15
  activityEvents: ActivityEvent[];
16
16
  sseConnected: boolean;
17
17
  taskboardVersion: number;
18
+ doctorVersion: number;
18
19
  debug: boolean;
19
20
  reindexProgress: Record<string, ReindexProgressEntry>;
20
21
  setFiles: (files: Record<string, string>) => void;
@@ -26,6 +27,7 @@ interface ContentStore extends ContentState {
26
27
  setActivityEvents: (events: ActivityEvent[]) => void;
27
28
  setSseConnected: (connected: boolean) => void;
28
29
  bumpTaskboard: () => void;
30
+ bumpDoctor: () => void;
29
31
  setDebug: (debug: boolean) => void;
30
32
  toggleDebug: () => void;
31
33
  setReindexProgress: (table: string, indexed: number, done: boolean) => void;
@@ -0,0 +1,13 @@
1
+ import { type NavBadge } from '@makinbakin/sdk';
2
+ /**
3
+ * Sync a nav item's badge to the value passed each render. Calls
4
+ * `setNavBadge(pluginId, navItemId, badge)` only when the badge's value
5
+ * actually changes — the effect is keyed on a serialization of `count` +
6
+ * `tone`, not the object identity (which a parent recreates every render).
7
+ *
8
+ * This is the recommended glue for a badge provider: keep your own summary
9
+ * hook (fetch + refresh) per plugin, derive a `NavBadge | null`, and pass it
10
+ * here. Teardown is handled by `unregisterPlugin`, so this does not clear on
11
+ * unmount (which would flicker on dev hot-reload).
12
+ */
13
+ export declare function useNavBadge(pluginId: string, navItemId: string, badge: NavBadge | null): void;
@@ -56,48 +56,6 @@ export interface ProjectMeta {
56
56
  status?: string;
57
57
  content: string;
58
58
  }
59
- export interface AssetVariantMeta {
60
- role: 'thumbnail' | 'optimized' | 'webp';
61
- path: string;
62
- filename: string;
63
- size: number;
64
- mimeType: string;
65
- }
66
- export interface AssetMeta {
67
- path: string;
68
- filename: string;
69
- type: 'text' | 'images' | 'video' | 'audio' | 'plans' | 'research' | 'pdf' | 'data' | 'other';
70
- mimeType: string;
71
- size: number;
72
- mtimeMs?: number;
73
- metadata: {
74
- agent: string;
75
- taskId: string | null;
76
- created: string;
77
- tool?: string;
78
- description?: string;
79
- tags?: string[];
80
- originalFilename?: string;
81
- };
82
- variants?: AssetVariantMeta[];
83
- }
84
- export interface TrashedAssetMeta {
85
- filename: string;
86
- originalFilename: string;
87
- type: string;
88
- mimeType: string;
89
- size: number;
90
- deletedAt: string;
91
- expiresAt: string;
92
- metadata: {
93
- agent: string;
94
- taskId: string | null;
95
- created: string;
96
- tool?: string;
97
- description?: string;
98
- tags?: string[];
99
- } | null;
100
- }
101
59
  export interface OfficeData {
102
60
  asciiMap: string;
103
61
  statusTable: {
@@ -308,6 +308,94 @@ export interface RuntimeAvailableModel {
308
308
  tags?: string[];
309
309
  metadata?: RuntimeMetadata;
310
310
  }
311
+ export type RuntimeImageOutputFormat = 'png' | 'jpeg' | 'jpg' | 'webp';
312
+ export type RuntimeImageBackground = 'transparent' | 'opaque' | 'auto';
313
+ /**
314
+ * Image capability is intentionally all-optional. A thin runtime that exposes a
315
+ * single image tool maps on by filling minimal fields (e.g. one synthesized
316
+ * provider with a defaultModel); a rich runtime fills more. Consumers MUST
317
+ * treat a sparse capability as normal and never require a field a thin runtime
318
+ * cannot provide — gaps are filled below, in the adapter/shim, not pushed up
319
+ * into plugins. See .claude/specs/media-generation-adapter-architecture.md.
320
+ */
321
+ export interface RuntimeImageProviderCapabilities {
322
+ generate?: {
323
+ maxCount?: number;
324
+ supportsSize?: boolean;
325
+ supportsAspectRatio?: boolean;
326
+ supportsResolution?: boolean;
327
+ };
328
+ edit?: {
329
+ enabled?: boolean;
330
+ maxCount?: number;
331
+ maxInputImages?: number;
332
+ supportsSize?: boolean;
333
+ supportsAspectRatio?: boolean;
334
+ supportsResolution?: boolean;
335
+ };
336
+ geometry?: {
337
+ sizes?: string[];
338
+ aspectRatios?: string[];
339
+ resolutions?: string[];
340
+ };
341
+ output?: {
342
+ formats?: string[];
343
+ qualities?: string[];
344
+ backgrounds?: string[];
345
+ };
346
+ metadata?: RuntimeMetadata;
347
+ }
348
+ export interface RuntimeImageProvider {
349
+ id: string;
350
+ label?: string;
351
+ defaultModel?: string;
352
+ models?: string[];
353
+ available?: boolean;
354
+ configured?: boolean;
355
+ selected?: boolean;
356
+ capabilities?: RuntimeImageProviderCapabilities;
357
+ metadata?: RuntimeMetadata;
358
+ }
359
+ export interface RuntimeImageGenerateInput {
360
+ prompt: string;
361
+ provider?: string;
362
+ model?: string;
363
+ count?: number;
364
+ width?: number;
365
+ height?: number;
366
+ size?: string;
367
+ aspectRatio?: string;
368
+ resolution?: string;
369
+ outputFormat?: RuntimeImageOutputFormat;
370
+ background?: RuntimeImageBackground;
371
+ timeoutMs?: number;
372
+ metadata?: RuntimeMetadata;
373
+ }
374
+ export interface RuntimeImageEditInput extends RuntimeImageGenerateInput {
375
+ files: string[];
376
+ }
377
+ export interface RuntimeImageFile {
378
+ filePath: string;
379
+ mimeType?: string;
380
+ width?: number;
381
+ height?: number;
382
+ provider?: string;
383
+ model?: string;
384
+ url?: string;
385
+ metadata?: RuntimeMetadata;
386
+ }
387
+ export interface RuntimeImageGenerationResult {
388
+ images: RuntimeImageFile[];
389
+ provider?: string;
390
+ model?: string;
391
+ providerText?: string;
392
+ metadata?: RuntimeMetadata;
393
+ }
394
+ export interface RuntimeImagesAccess {
395
+ providers(): Promise<RuntimeImageProvider[]>;
396
+ generate(input: RuntimeImageGenerateInput): Promise<RuntimeImageGenerationResult>;
397
+ edit(input: RuntimeImageEditInput): Promise<RuntimeImageGenerationResult>;
398
+ }
311
399
  export interface TaskDispatchArgs {
312
400
  bakinTaskId: string;
313
401
  agentId?: string;
@@ -464,6 +552,7 @@ export interface AgentRuntimeAdapter {
464
552
  includeUnavailable?: boolean;
465
553
  }): Promise<RuntimeAvailableModel[]>;
466
554
  };
555
+ images?: RuntimeImagesAccess;
467
556
  tasks: {
468
557
  dispatch(args: TaskDispatchArgs): Promise<TaskDispatchResult>;
469
558
  getExecutionStatus(flowId: string): Promise<TaskExecutionStatus>;
@@ -2,4 +2,4 @@ export type { AdapterAuditEvent, AdapterHealthCheckDefinition, AdapterHealthChec
2
2
  export type { ChannelCapability } from './capabilities';
3
3
  export { hasChannelCapability } from './capabilities';
4
4
  export { getRuntimeMainAgent, getRuntimeMainAgentId, getRuntimeMainAgentName, selectRuntimeMainAgent, } from './helpers';
5
- export type { AgentRuntimeAdapter, ApprovalDelivery, ApprovalOption, ApprovalPatch, ApprovalRenderRef, ApprovalRenderResult, ApprovalResolveEvent, ApprovalResponse, CancelApprovalArgs, ChannelInfo, ChannelInteractionEvent, ChannelMessageArgs, ChannelMessageEvent, ChatChunk, ContentDeliveryArgs, CreateApprovalArgs, CreateCronJobInput, CreateRuntimeAgentInput, CronJob, CronRun, DeliveryResult, DurableApprovalRecord, EditApprovalArgs, ListExecutionsOpts, MessageArgs, MessageResult, NotificationArgs, ResolveApprovalArgs, RuntimeAgent, RuntimeAllowlistPatch, RuntimeToolActivity, RuntimeAvailableModel, RuntimeConfigAccess, RuntimeMemoryEntry, RuntimeMemoryEntryStat, RuntimeMemoryPathMatch, RuntimeMemoryReadRange, RuntimeMemorySearchResult, RuntimeMemoryTier, RuntimeMessageToolPolicy, RuntimeMessageToolsMode, RuntimeMetadata, RuntimePermissionPatch, RawCronSnapshot, RuntimeSession, RuntimeSkill, TaskDispatchArgs, TaskDispatchResult, TaskExecutionEvent, TaskExecutionStatus, ToolDefinition, ToolResult, UpdateCronJobInput, UpdateRuntimeAgentInput, WorkspaceFile, } from './concepts';
5
+ export type { AgentRuntimeAdapter, ApprovalDelivery, ApprovalOption, ApprovalPatch, ApprovalRenderRef, ApprovalRenderResult, ApprovalResolveEvent, ApprovalResponse, CancelApprovalArgs, ChannelInfo, ChannelInteractionEvent, ChannelMessageArgs, ChannelMessageEvent, ChatChunk, ContentDeliveryArgs, CreateApprovalArgs, CreateCronJobInput, CreateRuntimeAgentInput, CronJob, CronRun, DeliveryResult, DurableApprovalRecord, EditApprovalArgs, ListExecutionsOpts, MessageArgs, MessageResult, NotificationArgs, ResolveApprovalArgs, RuntimeAgent, RuntimeAllowlistPatch, RuntimeToolActivity, RuntimeAvailableModel, RuntimeConfigAccess, RuntimeImageBackground, RuntimeImageEditInput, RuntimeImageFile, RuntimeImageGenerateInput, RuntimeImageGenerationResult, RuntimeImageOutputFormat, RuntimeImageProvider, RuntimeImageProviderCapabilities, RuntimeImagesAccess, RuntimeMemoryEntry, RuntimeMemoryEntryStat, RuntimeMemoryPathMatch, RuntimeMemoryReadRange, RuntimeMemorySearchResult, RuntimeMemoryTier, RuntimeMessageToolPolicy, RuntimeMessageToolsMode, RuntimeMetadata, RuntimePermissionPatch, RawCronSnapshot, RuntimeSession, RuntimeSkill, TaskDispatchArgs, TaskDispatchResult, TaskExecutionEvent, TaskExecutionStatus, ToolDefinition, ToolResult, UpdateCronJobInput, UpdateRuntimeAgentInput, WorkspaceFile, } from './concepts';
@@ -441,44 +441,93 @@ export interface PluginTaskService {
441
441
  }): Promise<PluginTask[]>;
442
442
  appendLog(id: string, entry: TaskLogEntry): Promise<void>;
443
443
  }
444
- export interface AssetVariantMeta {
445
- role: 'thumbnail' | 'optimized' | 'webp';
446
- path: string;
447
- filename: string;
448
- size: number;
444
+ /** The asset type taxonomy (mirrors ASSET_TYPES in the assets plugin). */
445
+ export type AssetTypeName = 'text' | 'images' | 'video' | 'audio' | 'plans' | 'research' | 'pdf' | 'data' | 'other';
446
+ /** Per-version generation provenance (matches the manifest's `generation` block). */
447
+ export interface AssetGenerationInfo {
448
+ provider: string;
449
+ model: string;
450
+ surface: string;
451
+ quality: string;
452
+ routeSource: string;
453
+ routeReason?: string;
454
+ }
455
+ /** Create a new versioned asset (v1) from a source file. */
456
+ export interface AssetCreateInput {
457
+ sourceFilePath: string;
458
+ type: AssetTypeName;
459
+ agent: string;
460
+ taskId: string | null;
461
+ slug?: string;
462
+ op?: 'generate' | 'upload' | 'import';
463
+ tool?: string | null;
464
+ prompt?: string | null;
465
+ promptHash?: string | null;
466
+ description?: string;
467
+ tags?: string[];
468
+ source?: {
469
+ kind: 'generated' | 'upload' | 'import' | 'clipboard' | 'workspace-file';
470
+ path: string | null;
471
+ };
472
+ generation?: AssetGenerationInfo | null;
473
+ }
474
+ /** Append a new version to an existing asset. */
475
+ export interface AssetVersionCreateInput {
476
+ sourceFilePath: string;
477
+ op?: 'edit' | 'generate' | 'upload' | 'import';
478
+ tool?: string | null;
479
+ prompt?: string | null;
480
+ promptHash?: string | null;
481
+ description?: string;
482
+ tags?: string[];
483
+ generation?: AssetGenerationInfo | null;
484
+ }
485
+ /** Render a derived export of a version (keyed/idempotent by surface). */
486
+ export interface AssetExportRequest {
487
+ fromVersion?: number;
488
+ surface: string;
489
+ format: 'jpg' | 'png' | 'webp';
490
+ width: number;
491
+ height: number;
492
+ quality?: number;
493
+ }
494
+ export interface VersionedAssetRef {
495
+ assetId: string;
496
+ version: number;
497
+ }
498
+ export interface AssetVersionFileRef {
499
+ absPath: string;
449
500
  mimeType: string;
501
+ version: number;
450
502
  }
451
- export interface AssetMeta {
452
- path: string;
453
- filename: string;
454
- type: 'text' | 'images' | 'video' | 'audio' | 'plans' | 'research' | 'pdf' | 'data' | 'other';
503
+ /** Current-version summary of an asset, addressed by id. */
504
+ export interface AssetSummary {
505
+ assetId: string;
506
+ type: AssetTypeName;
507
+ agent: string;
508
+ taskId: string | null;
509
+ created: string;
510
+ updated: string;
511
+ currentVersion: number;
512
+ versionCount: number;
513
+ description: string;
514
+ tags: string[];
455
515
  mimeType: string;
516
+ width: number | null;
517
+ height: number | null;
456
518
  size: number;
457
- mtimeMs?: number;
458
- metadata: {
459
- agent: string;
460
- taskId: string | null;
461
- created: string;
462
- tool?: string;
463
- description?: string;
464
- tags?: string[];
465
- originalFilename?: string;
466
- };
467
- variants?: AssetVariantMeta[];
468
- }
469
- export interface AssetFileRef {
470
- kind: 'asset';
471
- filename: string;
472
- mimeType?: string;
519
+ hasThumb: boolean;
473
520
  }
474
521
  export interface AssetsAPI {
475
- getByFilename(filename: string): Promise<AssetMeta | null>;
476
- list(filter?: {
477
- type?: AssetMeta['type'];
478
- taskId?: string | null;
479
- }): Promise<AssetMeta[]>;
480
- exists(filename: string): Promise<boolean>;
481
- fileRef(filename: string): Promise<AssetFileRef>;
522
+ createAsset(input: AssetCreateInput): Promise<VersionedAssetRef>;
523
+ /** Read an asset's current-version summary by id (metadata: type/description/tags/etc.), or null. */
524
+ getAsset(assetId: string): Promise<AssetSummary | null>;
525
+ addVersion(assetId: string, input: AssetVersionCreateInput): Promise<VersionedAssetRef>;
526
+ addExport(assetId: string, input: AssetExportRequest): Promise<{
527
+ name: string;
528
+ file: string;
529
+ }>;
530
+ resolveVersionFile(assetId: string, version?: number): Promise<AssetVersionFileRef | null>;
482
531
  }
483
532
  /** Field type for search content type schemas */
484
533
  export interface SearchSchemaField {
@@ -607,6 +656,8 @@ export interface SearchResult {
607
656
  fields: Record<string, unknown>;
608
657
  /** Cross-encoder reranker score (present when a reranker was used). */
609
658
  rerankScore?: number;
659
+ /** Per-index score breakdown (e.g. { full_text_index_v0, assets_text, assets_visual }). */
660
+ indexScores?: Record<string, number>;
610
661
  }
611
662
  /** Search response from a query */
612
663
  export interface SearchResponse {
@@ -6,29 +6,64 @@
6
6
  * not include layout chrome (sidebar, header, toaster) — those are Bakin's
7
7
  * shell, not plugin-author territory.
8
8
  */
9
+ /** Round avatar image for an agent, falls back to initials. */
9
10
  export { AgentAvatar } from '../_internal/app/components/agent-avatar';
11
+ /** Multi-select facet filter scoped to agents. */
10
12
  export { AgentFilter } from '../_internal/app/components/agent-filter';
13
+ /** Single-agent picker dropdown for form fields. */
11
14
  export { AgentSelect } from '../_internal/app/components/agent-select';
12
- export { AgentDot, AgentStatus } from '../_internal/app/components/agent-status';
15
+ /** Small status dot showing an agent's online/offline state. */
16
+ export { AgentDot } from '../_internal/app/components/agent-status';
17
+ /** Compound agent status (dot + label + last-seen timestamp). */
18
+ export { AgentStatus } from '../_internal/app/components/agent-status';
19
+ /** Right-side slide-out drawer with backdrop and focus trap. */
13
20
  export { BakinDrawer } from '../_internal/app/components/bakin-drawer';
21
+ /** Color picker swatch grid for tag/agent color assignment. */
14
22
  export { ColorPicker } from '../_internal/app/components/color-picker';
23
+ /** Centered empty-state component with icon, title, and CTA. */
15
24
  export { EmptyState } from '../_internal/app/components/empty-state';
25
+ /** Inline error banner with dismiss + retry actions. */
16
26
  export { ErrorBanner } from '../_internal/app/components/error-banner';
27
+ /** Full-page error state with title, description, and retry button. */
17
28
  export { ErrorState } from '../_internal/app/components/error-state';
29
+ /** Popover multi-select facet filter (column, owner, tag, etc.). */
18
30
  export { FacetFilter } from '../_internal/app/components/facet-filter';
19
31
  export type { FacetOption } from '../_internal/app/components/facet-filter';
32
+ /** Chat + plan-proposal review panel for brainstorm sessions. */
20
33
  export { IntegratedBrainstorm } from '../_internal/app/components/integrated-brainstorm';
21
34
  export type { BrainstormMessage, IntegratedBrainstormProps, BrainstormOnSend, SendContext, AssistantTransformed, BrainstormActivityInput, BrainstormActivityStorageInput, BrainstormActivityStorageRecord, BrainstormTimelineActivityInput, BrainstormTimelineMessageInput, } from '../_internal/app/components/integrated-brainstorm';
22
- export { brainstormActivityMessageFromCustom, brainstormThreadId, normalizeBrainstormActivityForStorage, normalizeBrainstormActivityMessageForStorage, readBrainstormSseResponse, runtimeChunkToBrainstormActivity, toBrainstormTimeline, } from '../_internal/app/components/integrated-brainstorm';
35
+ /** Convert a custom activity message back into a brainstorm activity. */
36
+ export { brainstormActivityMessageFromCustom } from '../_internal/app/components/integrated-brainstorm';
37
+ /** Compute the canonical thread ID for a brainstorm session. */
38
+ export { brainstormThreadId } from '../_internal/app/components/integrated-brainstorm';
39
+ /** Normalize a brainstorm activity payload for persistence. */
40
+ export { normalizeBrainstormActivityForStorage } from '../_internal/app/components/integrated-brainstorm';
41
+ /** Normalize a single brainstorm message for persistence. */
42
+ export { normalizeBrainstormActivityMessageForStorage } from '../_internal/app/components/integrated-brainstorm';
43
+ /** Read an SSE response stream into brainstorm activity events. */
44
+ export { readBrainstormSseResponse } from '../_internal/app/components/integrated-brainstorm';
45
+ /** Convert a runtime chat chunk to a brainstorm activity event. */
46
+ export { runtimeChunkToBrainstormActivity } from '../_internal/app/components/integrated-brainstorm';
47
+ /** Fold a brainstorm session's events into a renderable timeline. */
48
+ export { toBrainstormTimeline } from '../_internal/app/components/integrated-brainstorm';
49
+ /** Render markdown content with syntax highlighting and link handling. */
23
50
  export { MarkdownContent } from '../_internal/app/components/markdown-content';
51
+ /** Editable markdown text area with preview toggle. */
24
52
  export { MarkdownEditor } from '../_internal/app/components/markdown-editor';
53
+ /** Model picker dropdown listing available models from the catalog. */
25
54
  export { ModelSelect } from '../_internal/app/components/model-select';
55
+ /** Standard plugin page wrapper with header, content area, and toaster. */
26
56
  export { PageLayout } from '../_internal/app/components/page-layout';
57
+ /** Plugin page header with title, count badge, search, and action buttons. */
27
58
  export { PluginHeader } from '../_internal/app/components/plugin-header';
59
+ /** Render a settings form from a PluginSettingsSchema definition. */
28
60
  export { PluginSettingsRenderer } from '../_internal/app/components/plugin-settings-renderer';
29
61
  export type { PluginSettingsSchema } from '../_internal/app/components/plugin-settings-renderer';
62
+ /** Sortable table column header with ascending/descending indicator. */
30
63
  export { SortableHead } from '../_internal/app/components/sortable-head';
31
64
  export type { SortDir } from '../_internal/app/components/sortable-head';
65
+ /** Tab list with animated underline indicator. */
32
66
  export { UnderlineTabs } from '../_internal/app/components/underline-tabs';
33
67
  export type { UnderlineTab } from '../_internal/app/components/underline-tabs';
68
+ /** Icon component for a notification channel (Discord, Slack, email, etc.). */
34
69
  export { ChannelIcon } from '../_internal/plugins/workflows/hooks/channel-icon';