@makinbakin/sdk 0.0.1-rc.2 → 0.0.1-rc.21
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 +1 -0
- package/_internal/app/components/agent-select.d.ts +16 -2
- package/_internal/app/components/asset-picker.d.ts +25 -0
- package/_internal/app/components/charts/bar-chart.d.ts +16 -0
- package/_internal/app/components/charts/chart-data-table.d.ts +31 -0
- package/_internal/app/components/charts/chart-explainer.d.ts +9 -0
- package/_internal/app/components/charts/chart-tooltip.d.ts +8 -0
- package/_internal/app/components/charts/line-chart.d.ts +13 -0
- package/_internal/app/components/charts/palette.d.ts +24 -0
- package/_internal/app/components/charts/sparkline.d.ts +12 -0
- package/_internal/app/components/charts/stacked-column-chart.d.ts +40 -0
- package/_internal/app/components/confirm-dialog.d.ts +54 -0
- package/_internal/app/components/conversation/activity-group.d.ts +15 -0
- package/_internal/app/components/conversation/agent-turn.d.ts +36 -0
- package/_internal/app/components/conversation/attention.d.ts +56 -0
- package/_internal/app/components/conversation/composer.d.ts +35 -0
- package/_internal/app/components/conversation/conversation-empty-state.d.ts +8 -0
- package/_internal/app/components/conversation/conversation-panel.d.ts +33 -0
- package/_internal/app/components/conversation/conversation.d.ts +14 -0
- package/_internal/app/components/conversation/fold.d.ts +129 -0
- package/_internal/app/components/conversation/notification-sound.d.ts +8 -0
- package/_internal/app/components/conversation/relative-time.d.ts +8 -0
- package/_internal/app/components/conversation/reply-toast.d.ts +15 -0
- package/_internal/app/components/conversation/thread-id.d.ts +8 -0
- package/_internal/app/components/conversation/tool-call-drawer.d.ts +7 -0
- package/_internal/app/components/conversation/turn-recorder.d.ts +37 -0
- package/_internal/app/components/conversation/use-conversation-attention.d.ts +64 -0
- package/_internal/app/components/conversation/use-conversation-thread.d.ts +55 -0
- package/_internal/app/components/conversation/user-message.d.ts +11 -0
- package/_internal/app/components/danger-zone.d.ts +28 -0
- package/_internal/app/components/empty-state.d.ts +18 -6
- package/_internal/app/components/plugin-header.d.ts +4 -3
- package/_internal/app/components/save-bar.d.ts +32 -0
- package/_internal/app/components/score-overlay.d.ts +33 -0
- package/_internal/app/components/search-degraded-chip.d.ts +4 -0
- package/_internal/app/components/search-partial-chip.d.ts +13 -0
- package/_internal/app/components/search-unavailable.d.ts +12 -0
- package/_internal/app/components/section-card.d.ts +22 -0
- package/_internal/app/components/segmented-control.d.ts +28 -0
- package/_internal/app/components/stat-tile.d.ts +26 -0
- package/_internal/app/components/status-badge.d.ts +19 -0
- package/_internal/app/components/turn-output-view.d.ts +57 -0
- package/_internal/app/components/ui/badge.d.ts +1 -1
- package/_internal/app/components/ui/button.d.ts +1 -1
- package/_internal/app/components/underline-tabs.d.ts +6 -2
- package/_internal/app/components/unsaved-changes-guard.d.ts +34 -0
- package/_internal/app/core/conversation-turns.d.ts +148 -0
- package/_internal/app/core/logger.d.ts +1 -0
- package/_internal/app/hooks/use-available-models.d.ts +5 -0
- package/_internal/app/hooks/use-content-store.d.ts +0 -9
- package/_internal/app/hooks/use-file-drop.d.ts +25 -0
- package/_internal/app/hooks/use-history-back.d.ts +1 -0
- package/_internal/app/hooks/use-horizontal-resize.d.ts +22 -0
- package/_internal/app/hooks/use-json-fetch.d.ts +26 -0
- package/_internal/app/hooks/use-nav-badge.d.ts +13 -0
- package/_internal/app/hooks/use-plugin-event.d.ts +19 -0
- package/_internal/app/hooks/use-query-state.d.ts +2 -0
- package/_internal/app/hooks/use-resizable-pane.d.ts +35 -0
- package/_internal/app/hooks/use-schedule.d.ts +47 -1
- package/_internal/app/hooks/use-search.d.ts +27 -8
- package/_internal/app/hooks/use-task-run-history.d.ts +26 -0
- package/_internal/app/hooks/use-toast.d.ts +3 -3
- package/_internal/app/hooks/use-vertical-resize.d.ts +6 -7
- package/_internal/app/lib/browser-notify.d.ts +12 -1
- package/_internal/app/types/index.d.ts +1 -105
- package/_internal/core/adapters/runtime/concepts.d.ts +671 -99
- package/_internal/core/adapters/runtime/errors.d.ts +98 -0
- package/_internal/core/adapters/runtime/helpers.d.ts +19 -0
- package/_internal/core/adapters/runtime/index.d.ts +7 -2
- package/_internal/core/adapters/runtime/testing.d.ts +79 -0
- package/_internal/core/adapters/runtime/turn-activity.d.ts +23 -0
- package/_internal/core/adapters/shared.d.ts +122 -12
- package/_internal/core/content-dir.d.ts +9 -0
- package/_internal/core/docs/route.d.ts +1 -1
- package/_internal/core/format/structured.d.ts +44 -0
- package/_internal/core/format.d.ts +13 -0
- package/_internal/core/media/downscale.d.ts +18 -0
- package/_internal/core/media/sharp-loader.d.ts +36 -0
- package/_internal/core/plugin-types.d.ts +216 -499
- package/_internal/core/routing/define.d.ts +26 -3
- package/_internal/core/routing/dispatcher.d.ts +15 -6
- package/_internal/core/routing/index.d.ts +1 -1
- package/_internal/core/routing/types.d.ts +13 -70
- package/_internal/core/storage/atomic-write.d.ts +11 -0
- package/_internal/core/tasks/store.d.ts +129 -0
- package/_internal/core/tasks/testing.d.ts +2 -0
- package/_internal/{plugins/workflows/lib → core/workflows}/notification-channel-registry.d.ts +1 -1
- package/_internal/plugins/team/types.d.ts +61 -4
- package/_internal/plugins/workflows/hooks/use-notification-channels.d.ts +1 -1
- package/components/index.d.ts +111 -5
- package/components/index.js +61815 -30060
- package/hooks/index.d.ts +90 -9
- package/hooks/index.js +15181 -685
- package/hooks/router.d.ts +20 -4
- package/index.d.ts +20 -3
- package/index.js +297 -259
- package/internal/index.d.ts +70 -0
- package/internal/index.js +409 -0
- package/metadata/index.d.ts +14 -1
- package/package.json +9 -2
- package/register.d.ts +63 -9
- package/routing/index.d.ts +6 -1
- package/routing/index.js +187 -147
- package/slots/index.d.ts +16 -24
- package/slots/index.js +215 -30
- package/testing/index.d.ts +122 -0
- package/testing/index.js +21874 -0
- package/types/index.d.ts +19 -919
- package/types/index.js +16 -0
- package/ui/index.js +2 -1
- package/utils/index.d.ts +46 -6
- package/utils/index.js +322 -249
- package/_internal/app/components/integrated-brainstorm/activity.d.ts +0 -23
- package/_internal/app/components/integrated-brainstorm/collapsed-header.d.ts +0 -14
- package/_internal/app/components/integrated-brainstorm/empty-state.d.ts +0 -5
- package/_internal/app/components/integrated-brainstorm/index.d.ts +0 -8
- package/_internal/app/components/integrated-brainstorm/input-row.d.ts +0 -16
- package/_internal/app/components/integrated-brainstorm/message-list.d.ts +0 -8
- package/_internal/app/components/integrated-brainstorm/session.d.ts +0 -16
- package/_internal/app/components/integrated-brainstorm/sse.d.ts +0 -8
- package/_internal/app/components/integrated-brainstorm/thinking-indicator.d.ts +0 -19
- package/_internal/app/components/integrated-brainstorm/types.d.ts +0 -63
- package/_internal/app/components/integrated-brainstorm/use-auto-grow.d.ts +0 -6
- package/_internal/app/components/integrated-brainstorm/use-brainstorm-state.d.ts +0 -21
- package/_internal/app/hooks/use-assets.d.ts +0 -25
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* from the schemas in the route literal.
|
|
9
9
|
*/
|
|
10
10
|
import type { APIRoute, CoreContext, PluginContextLite } from './types';
|
|
11
|
+
import type { ContentFile, NavItem, PluginSettingsSchema } from '../plugin-types';
|
|
11
12
|
/**
|
|
12
13
|
* Declare a plugin route. Handler `ctx` is bound to `PluginContextLite`. The
|
|
13
14
|
* three generics (P/Q/B) are inferred from `params`, `query`, and `body`
|
|
@@ -19,16 +20,38 @@ export declare function defineRoute<P = undefined, Q = undefined, B = undefined>
|
|
|
19
20
|
* Declare a core (host) route. Handler `ctx` is bound to `CoreContext`.
|
|
20
21
|
*/
|
|
21
22
|
export declare function defineCoreRoute<P = undefined, Q = undefined, B = undefined>(route: APIRoute<CoreContext, P, Q, B>): APIRoute<CoreContext, P, Q, B>;
|
|
22
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* The exact shape a plugin definition may carry — the full `BakinPlugin`
|
|
25
|
+
* lifecycle surface plus declarative `routes`. Deliberately CLOSED (no index
|
|
26
|
+
* signature): a typo'd key (`settingSchema`, `onReadey`, …) fails typecheck
|
|
27
|
+
* at the `definePlugin` call site instead of silently doing nothing at
|
|
28
|
+
* runtime (audit 2026-07 H3).
|
|
29
|
+
*/
|
|
23
30
|
export interface DefinePluginInput {
|
|
24
31
|
id: string;
|
|
25
32
|
name: string;
|
|
26
33
|
version: string;
|
|
27
34
|
routes?: ReadonlyArray<APIRoute<PluginContextLite, any, any, any>>;
|
|
28
|
-
|
|
35
|
+
activate(ctx: any): void | Promise<void>;
|
|
36
|
+
onReady?(): void | Promise<void>;
|
|
37
|
+
onShutdown?(): void | Promise<void>;
|
|
38
|
+
onSettingsChange?(settings: Record<string, unknown>): void | Promise<void>;
|
|
39
|
+
onUninstall?(ctx: any): void | Promise<void>;
|
|
40
|
+
settingsSchema?: PluginSettingsSchema;
|
|
41
|
+
navItems?: NavItem[];
|
|
42
|
+
contentFiles?: ContentFile[];
|
|
29
43
|
}
|
|
30
44
|
/**
|
|
31
45
|
* Declare a plugin. Returns the input unchanged. Use this instead of a bare
|
|
32
46
|
* `BakinPlugin` annotation so `routes` keeps per-element inference.
|
|
47
|
+
*
|
|
48
|
+
* The `& { [K in Exclude<...>]: never }` intersection is the exactness
|
|
49
|
+
* enforcement: `T extends DefinePluginInput` alone would structurally admit
|
|
50
|
+
* excess keys, so a typo'd `settingSchema` would compile and silently do
|
|
51
|
+
* nothing. With the intersection, any key outside `DefinePluginInput` must
|
|
52
|
+
* be `never` — which no real value satisfies — so typos fail at the call
|
|
53
|
+
* site (audit 2026-07 H3).
|
|
33
54
|
*/
|
|
34
|
-
export declare function definePlugin<const T extends DefinePluginInput>(plugin: T
|
|
55
|
+
export declare function definePlugin<const T extends DefinePluginInput>(plugin: T & {
|
|
56
|
+
[K in Exclude<keyof T, keyof DefinePluginInput>]: never;
|
|
57
|
+
}): T;
|
|
@@ -11,10 +11,11 @@
|
|
|
11
11
|
* - In dev / test, validate the response body against `responses[status]`
|
|
12
12
|
* and surface mismatches (test → throw, dev → console.warn).
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
* and legacy `APIRoute
|
|
16
|
-
* routes
|
|
17
|
-
*
|
|
14
|
+
* There is no legacy `input`/`output` adapter mapping here: `ctx.registerRoute`
|
|
15
|
+
* and the legacy `APIRoute` shape were deleted (T19) — declarative routes and
|
|
16
|
+
* core routes are the only producers, and both speak `body`/`responses`.
|
|
17
|
+
* (The OpenAPI builder keeps a read-side mapping for historical doc callers;
|
|
18
|
+
* see packages/core/src/openapi/operation.ts.)
|
|
18
19
|
*/
|
|
19
20
|
import { z } from 'zod';
|
|
20
21
|
import type { BodySpec, ResponseSpec } from './types';
|
|
@@ -32,8 +33,6 @@ export interface DispatchableRoute {
|
|
|
32
33
|
body?: BodySpec<unknown>;
|
|
33
34
|
responses?: Partial<Record<string | number, ResponseSpec>>;
|
|
34
35
|
handler: (req: Request, ctx: any, parsed?: any) => Response | Promise<Response>;
|
|
35
|
-
input?: z.ZodType<unknown>;
|
|
36
|
-
output?: z.ZodType<unknown>;
|
|
37
36
|
}
|
|
38
37
|
export interface DispatchInput {
|
|
39
38
|
req: Request;
|
|
@@ -42,3 +41,13 @@ export interface DispatchInput {
|
|
|
42
41
|
params: Record<string, string>;
|
|
43
42
|
}
|
|
44
43
|
export declare function dispatchRoute(input: DispatchInput): Promise<Response>;
|
|
44
|
+
/**
|
|
45
|
+
* Loudly reject malformed `body` specs. A typo'd contentType (`'json'`)
|
|
46
|
+
* previously fell through parseBodySpec as a silent pass-through with an
|
|
47
|
+
* undefined parsed body — the handler then read `parsed.body.title` off
|
|
48
|
+
* undefined at request time with no hint why. Definition/registration time
|
|
49
|
+
* is the right place to fail: defineRoute/defineCoreRoute call this at
|
|
50
|
+
* module eval, and the plugin registry calls it for bare-literal routes at
|
|
51
|
+
* activation. `label` names the route in the error (e.g. `POST /items`).
|
|
52
|
+
*/
|
|
53
|
+
export declare function assertValidBodySpec(body: unknown, label: string): void;
|
|
@@ -10,6 +10,6 @@ export type { DefinePluginInput } from './define';
|
|
|
10
10
|
export { RouteRegistry } from './registry';
|
|
11
11
|
export type { RouteScope, RegisteredRoute, RouteMatch } from './registry';
|
|
12
12
|
export { operationIdFor } from './operation-id';
|
|
13
|
-
export { dispatchRoute } from './dispatcher';
|
|
13
|
+
export { assertValidBodySpec, dispatchRoute } from './dispatcher';
|
|
14
14
|
export type { DispatchInput } from './dispatcher';
|
|
15
15
|
export { searchRoute } from './search-route';
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* Routing primitives — typed route contracts that drive runtime dispatch and
|
|
3
3
|
* OpenAPI emission from a single source.
|
|
4
4
|
*
|
|
5
|
-
* The
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
5
|
+
* The pure, context-free declarations (the generic `APIRoute`, body/response
|
|
6
|
+
* specs, `ParsedInput`) are DECLARED in `@makinbakin/sdk/types` (api-route.ts
|
|
7
|
+
* — a leaf module) and re-exported here bound to the core-tier
|
|
8
|
+
* `RouteContext`. That direction keeps the package DAG acyclic: core imports
|
|
9
|
+
* SDK types (as `plugin-types.ts` always has); the SDK never imports core
|
|
10
|
+
* from its types layer. Only the tier-specific route CONTEXTS live here.
|
|
9
11
|
*/
|
|
10
|
-
import type {
|
|
11
|
-
import type { ContractStability, ContractVisibility, DocsExample, SourceLocation } from '../docs';
|
|
12
|
+
import type { APIRoute as SdkAPIRoute } from '@makinbakin/sdk/types';
|
|
12
13
|
import type { AgentRuntimeAdapter } from '../adapters/runtime';
|
|
13
14
|
import type { StorageAdapter, EventBus, SearchAPI, ActivityAPI, HookAPI, AssetsAPI, PluginTaskService } from '../plugin-types';
|
|
14
|
-
export type HttpMethod
|
|
15
|
-
export type HttpStatus = 200 | 201 | 202 | 204 | 301 | 302 | 304 | 400 | 401 | 403 | 404 | 409 | 410 | 415 | 422 | 429 | 500 | 502 | 503 | 504;
|
|
15
|
+
export type { HttpMethod, HttpStatus, JsonBodySpec, MultipartBodySpec, RawBodySpec, NoBodySpec, BodySpec, JsonResponseSpec, NoContentResponseSpec, NonJsonResponseSpec, ResponseSpec, ParsedInput, } from '@makinbakin/sdk/types';
|
|
16
16
|
/**
|
|
17
17
|
* Common surface every route handler can rely on, regardless of origin.
|
|
18
18
|
* `PluginContext` and `CoreContext` extend this with their own additions.
|
|
@@ -46,69 +46,13 @@ export interface PluginContextLite extends RouteContext {
|
|
|
46
46
|
* `packages/host/src/core-routes/`.
|
|
47
47
|
*/
|
|
48
48
|
export type CoreContext = RouteContext;
|
|
49
|
-
export interface JsonBodySpec<B = unknown> {
|
|
50
|
-
contentType: 'application/json';
|
|
51
|
-
schema: z.ZodType<B>;
|
|
52
|
-
}
|
|
53
|
-
export interface MultipartBodySpec<B = unknown> {
|
|
54
|
-
contentType: 'multipart/form-data';
|
|
55
|
-
schema?: z.ZodType<B>;
|
|
56
|
-
}
|
|
57
|
-
export interface RawBodySpec<B = unknown> {
|
|
58
|
-
contentType: '*/*';
|
|
59
|
-
schema?: z.ZodType<B>;
|
|
60
|
-
}
|
|
61
|
-
export interface NoBodySpec {
|
|
62
|
-
contentType: 'none';
|
|
63
|
-
}
|
|
64
49
|
/**
|
|
65
|
-
* `
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* - none → dispatcher rejects non-empty bodies with 415.
|
|
70
|
-
*
|
|
71
|
-
* Omit the field entirely on routes that don't consume a body.
|
|
50
|
+
* Same declaration as `@makinbakin/sdk/types`' `APIRoute`, with the core-tier
|
|
51
|
+
* `RouteContext` as the default context. An alias (not a copy): the two are
|
|
52
|
+
* mutually assignable by construction — pinned in
|
|
53
|
+
* tests/core/plugin-type-contract.test.ts.
|
|
72
54
|
*/
|
|
73
|
-
export type
|
|
74
|
-
export interface JsonResponseSpec {
|
|
75
|
-
contentType: 'application/json';
|
|
76
|
-
schema: z.ZodType;
|
|
77
|
-
}
|
|
78
|
-
export interface NoContentResponseSpec {
|
|
79
|
-
contentType: 'none';
|
|
80
|
-
}
|
|
81
|
-
export interface NonJsonResponseSpec {
|
|
82
|
-
contentType: 'text/event-stream' | 'text/html' | 'text/plain' | 'application/octet-stream' | 'image/png' | 'image/jpeg' | 'image/svg+xml' | (string & Record<never, never>);
|
|
83
|
-
schema?: z.ZodType;
|
|
84
|
-
}
|
|
85
|
-
export type ResponseSpec = z.ZodType | JsonResponseSpec | NoContentResponseSpec | NonJsonResponseSpec;
|
|
86
|
-
/** Helper: `{ body: B }` if B is declared (non-undefined), else no fields. */
|
|
87
|
-
type Field<K extends string, T> = [T] extends [undefined] ? unknown : {
|
|
88
|
-
[P in K]: T;
|
|
89
|
-
};
|
|
90
|
-
type Normalize<T> = {
|
|
91
|
-
[K in keyof T]: T[K];
|
|
92
|
-
};
|
|
93
|
-
export type ParsedInput<P, Q, B> = Normalize<Field<'params', P> & Field<'query', Q> & Field<'body', B>>;
|
|
94
|
-
export interface APIRoute<C extends RouteContext = RouteContext, P = undefined, Q = undefined, B = undefined> {
|
|
95
|
-
path: string;
|
|
96
|
-
method: HttpMethod;
|
|
97
|
-
summary?: string;
|
|
98
|
-
description?: string;
|
|
99
|
-
params?: z.ZodType<P>;
|
|
100
|
-
query?: z.ZodType<Q>;
|
|
101
|
-
body?: P extends never ? never : BodySpec<B>;
|
|
102
|
-
responses?: Partial<Record<HttpStatus, ResponseSpec>>;
|
|
103
|
-
visibility?: ContractVisibility;
|
|
104
|
-
stability?: ContractStability;
|
|
105
|
-
permissions?: string[];
|
|
106
|
-
examples?: DocsExample[];
|
|
107
|
-
operationId?: string;
|
|
108
|
-
tags?: string[];
|
|
109
|
-
source?: SourceLocation;
|
|
110
|
-
handler: (req: Request, ctx: C, parsed: ParsedInput<P, Q, B>) => Response | Promise<Response>;
|
|
111
|
-
}
|
|
55
|
+
export type APIRoute<C extends RouteContext = RouteContext, P = undefined, Q = undefined, B = undefined> = SdkAPIRoute<C, P, Q, B>;
|
|
112
56
|
/**
|
|
113
57
|
* Subset of plugin metadata `definePlugin` cares about. The full `BakinPlugin`
|
|
114
58
|
* interface lives in `../plugin-types.ts`; this declares the new fields the
|
|
@@ -120,4 +64,3 @@ export interface PluginWithRoutes {
|
|
|
120
64
|
version: string;
|
|
121
65
|
routes?: ReadonlyArray<APIRoute<PluginContextLite, any, any, any>>;
|
|
122
66
|
}
|
|
123
|
-
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface AtomicWriteOptions {
|
|
2
|
+
/** Append a trailing newline. Default true (pretty JSON convention). */
|
|
3
|
+
trailingNewline?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/** Atomically write `text` to `path` (temp file + rename), creating parent dirs. */
|
|
6
|
+
export declare function atomicWriteText(path: string, text: string): void;
|
|
7
|
+
/**
|
|
8
|
+
* Atomically write `value` as pretty-printed JSON. Adds a trailing newline by
|
|
9
|
+
* default; pass `{ trailingNewline: false }` to match callers that wrote none.
|
|
10
|
+
*/
|
|
11
|
+
export declare function atomicWriteJson(path: string, value: unknown, opts?: AtomicWriteOptions): void;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { TaskLogEntry } from '@makinbakin/sdk/types';
|
|
2
|
+
import type { Unsubscribe } from '../adapters/shared';
|
|
3
|
+
export type { TaskLogEntry } from '@makinbakin/sdk/types';
|
|
4
|
+
export interface BakinTask {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
agent?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Requested team assignment (#189). `team` alone = unresolved team task
|
|
11
|
+
* (the dispatch resolver picks a member); `team` + `agent` = resolved —
|
|
12
|
+
* team is retained so the record explains requested vs resolved.
|
|
13
|
+
* Exclusion semantics live in the app facade (src/core/task-store.ts).
|
|
14
|
+
*/
|
|
15
|
+
team?: string;
|
|
16
|
+
createdBy?: string;
|
|
17
|
+
column: string;
|
|
18
|
+
order: number;
|
|
19
|
+
tags: string[];
|
|
20
|
+
workflowId?: string;
|
|
21
|
+
scheduleJobId?: string;
|
|
22
|
+
projectId?: string;
|
|
23
|
+
/** Brand link (#419) — resolved lazily at dispatch, mirrors projectId. */
|
|
24
|
+
brandId?: string;
|
|
25
|
+
/** Repo binding override (same-agent-concurrency D6): dispatch worktree target; project binding via projects.getRepo otherwise. */
|
|
26
|
+
repoPath?: string;
|
|
27
|
+
parentId?: string | null;
|
|
28
|
+
dependsOn?: string;
|
|
29
|
+
availableAt?: string;
|
|
30
|
+
dueAt?: string;
|
|
31
|
+
source?: TaskSource;
|
|
32
|
+
date?: string;
|
|
33
|
+
blockedReason?: string;
|
|
34
|
+
blockedBy: string[];
|
|
35
|
+
blocking: string[];
|
|
36
|
+
comments: TaskComment[];
|
|
37
|
+
pendingDelete: boolean;
|
|
38
|
+
log: TaskLogEntry[];
|
|
39
|
+
createdAt: string;
|
|
40
|
+
updatedAt: string;
|
|
41
|
+
/**
|
|
42
|
+
* Optimistic concurrency counter — bumped on every write. Absent on
|
|
43
|
+
* pre-upgrade tasks (treated as 0; lazy-stamped on the next write).
|
|
44
|
+
* API mutations may send expectedVersion and get a 409 when stale.
|
|
45
|
+
*/
|
|
46
|
+
version?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface TaskSource {
|
|
49
|
+
pluginId?: string;
|
|
50
|
+
entityType?: string;
|
|
51
|
+
entityId?: string;
|
|
52
|
+
purpose?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface CreateBakinTaskInput {
|
|
55
|
+
id?: string;
|
|
56
|
+
title: string;
|
|
57
|
+
description?: string;
|
|
58
|
+
agent?: string;
|
|
59
|
+
team?: string;
|
|
60
|
+
createdBy?: string;
|
|
61
|
+
column?: string;
|
|
62
|
+
order?: number;
|
|
63
|
+
tags?: string[];
|
|
64
|
+
workflowId?: string;
|
|
65
|
+
scheduleJobId?: string;
|
|
66
|
+
projectId?: string;
|
|
67
|
+
brandId?: string;
|
|
68
|
+
/** Repo binding override (same-agent-concurrency D6): dispatch worktree target; project binding via projects.getRepo otherwise. */
|
|
69
|
+
repoPath?: string;
|
|
70
|
+
parentId?: string | null;
|
|
71
|
+
dependsOn?: string;
|
|
72
|
+
availableAt?: string;
|
|
73
|
+
dueAt?: string;
|
|
74
|
+
source?: TaskSource;
|
|
75
|
+
}
|
|
76
|
+
export type BakinTaskPatch = Partial<Pick<BakinTask, 'title' | 'description' | 'agent' | 'team' | 'createdBy' | 'column' | 'order' | 'tags' | 'workflowId' | 'scheduleJobId' | 'projectId' | 'brandId' | 'repoPath' | 'parentId' | 'dependsOn' | 'availableAt' | 'dueAt' | 'source' | 'date' | 'blockedReason' | 'blockedBy' | 'blocking' | 'pendingDelete'>>;
|
|
77
|
+
export interface TaskListOpts {
|
|
78
|
+
column?: string;
|
|
79
|
+
agent?: string;
|
|
80
|
+
projectId?: string;
|
|
81
|
+
brandId?: string;
|
|
82
|
+
/** Repo binding override (same-agent-concurrency D6): dispatch worktree target; project binding via projects.getRepo otherwise. */
|
|
83
|
+
repoPath?: string;
|
|
84
|
+
includePendingDelete?: boolean;
|
|
85
|
+
}
|
|
86
|
+
export interface TaskComment {
|
|
87
|
+
id: string;
|
|
88
|
+
author: string;
|
|
89
|
+
body: string;
|
|
90
|
+
createdAt: string;
|
|
91
|
+
}
|
|
92
|
+
export interface TaskDependencyPatch {
|
|
93
|
+
blockedBy?: string[];
|
|
94
|
+
blocking?: string[];
|
|
95
|
+
}
|
|
96
|
+
export interface BakinTaskStoreEvent {
|
|
97
|
+
type: 'created' | 'updated' | 'deleted';
|
|
98
|
+
taskId: string;
|
|
99
|
+
task?: BakinTask;
|
|
100
|
+
}
|
|
101
|
+
export interface BakinTaskStore {
|
|
102
|
+
create(input: CreateBakinTaskInput): Promise<BakinTask>;
|
|
103
|
+
get(id: string): Promise<BakinTask | null>;
|
|
104
|
+
list(opts?: TaskListOpts): Promise<BakinTask[]>;
|
|
105
|
+
update(id: string, patch: BakinTaskPatch): Promise<BakinTask>;
|
|
106
|
+
move(id: string, column: string, order?: number): Promise<BakinTask>;
|
|
107
|
+
remove(id: string): Promise<void>;
|
|
108
|
+
appendLog(id: string, entry: TaskLogEntry): Promise<void>;
|
|
109
|
+
addComment(id: string, comment: TaskComment): Promise<void>;
|
|
110
|
+
setDependencies(id: string, deps: TaskDependencyPatch): Promise<BakinTask>;
|
|
111
|
+
markPendingDelete(id: string, pending: boolean): Promise<BakinTask>;
|
|
112
|
+
subscribe(handler: (event: BakinTaskStoreEvent) => void): Unsubscribe;
|
|
113
|
+
}
|
|
114
|
+
export interface SyncBakinTaskStore extends BakinTaskStore {
|
|
115
|
+
createSync(input: CreateBakinTaskInput): BakinTask;
|
|
116
|
+
getSync(id: string): BakinTask | null;
|
|
117
|
+
findSync(identifier: string): BakinTask | null;
|
|
118
|
+
listSync(opts?: TaskListOpts): BakinTask[];
|
|
119
|
+
updateSync(id: string, patch: BakinTaskPatch): BakinTask;
|
|
120
|
+
removeSync(id: string): void;
|
|
121
|
+
appendLogSync(id: string, entry: TaskLogEntry): void;
|
|
122
|
+
addCommentSync(id: string, comment: TaskComment): void;
|
|
123
|
+
setDependenciesSync(id: string, deps: TaskDependencyPatch): BakinTask;
|
|
124
|
+
markPendingDeleteSync(id: string, pending: boolean): BakinTask;
|
|
125
|
+
/** Index-backed column count (excludes pendingDelete, matching listSync). Zero file reads. */
|
|
126
|
+
countByColumnSync(column: string): number;
|
|
127
|
+
}
|
|
128
|
+
export declare function createEmptyBakinTask(input: CreateBakinTaskInput, now?: string): BakinTask;
|
|
129
|
+
export declare function createFileBakinTaskStore(root: string): SyncBakinTaskStore;
|
package/_internal/{plugins/workflows/lib → core/workflows}/notification-channel-registry.d.ts
RENAMED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* here. Plugin ids are auto-namespaced as `{pluginId}.{id}` to avoid
|
|
9
9
|
* cross-plugin collisions with the shared builtin ids.
|
|
10
10
|
*/
|
|
11
|
-
import type { NotificationChannelDef, PluginNotificationChannelInput } from '
|
|
11
|
+
import type { NotificationChannelDef, PluginNotificationChannelInput } from '../plugin-types';
|
|
12
12
|
export type { NotificationChannelDef, PluginNotificationChannelInput };
|
|
13
13
|
export declare function registerNotificationChannel(def: NotificationChannelDef): void;
|
|
14
14
|
export declare function getNotificationChannel(id: string): NotificationChannelDef | undefined;
|
|
@@ -66,13 +66,14 @@ export interface SkillSummary {
|
|
|
66
66
|
* the server-side `AgentStateInfo` shape but stays self-contained so the
|
|
67
67
|
* client doesn't reach across the package boundary for types.
|
|
68
68
|
*
|
|
69
|
-
* The server today returns
|
|
70
|
-
* `drifted` and `update-available` are
|
|
71
|
-
*
|
|
69
|
+
* The server today returns 3 states (`absent | unmanaged | managed`).
|
|
70
|
+
* `drifted` and `update-available` are display states layered on top of the
|
|
71
|
+
* server row when diagnostics or update checks report additional status.
|
|
72
72
|
*/
|
|
73
73
|
export interface PackageStateRow {
|
|
74
74
|
agentId: string;
|
|
75
|
-
state: 'absent' | 'unmanaged' | '
|
|
75
|
+
state: 'absent' | 'unmanaged' | 'managed' | 'drifted' | 'update-available';
|
|
76
|
+
version?: string;
|
|
76
77
|
packageId?: string;
|
|
77
78
|
entry?: {
|
|
78
79
|
source: string;
|
|
@@ -82,6 +83,15 @@ export interface PackageStateRow {
|
|
|
82
83
|
version?: string;
|
|
83
84
|
dependencies?: string[];
|
|
84
85
|
};
|
|
86
|
+
updateStatus?: {
|
|
87
|
+
currentVersion: string;
|
|
88
|
+
latestVersion: string | null;
|
|
89
|
+
currentCommitSha: string;
|
|
90
|
+
latestCommitSha: string | null;
|
|
91
|
+
upgradeAvailable: boolean;
|
|
92
|
+
checkedAt: string;
|
|
93
|
+
error?: string;
|
|
94
|
+
};
|
|
85
95
|
}
|
|
86
96
|
/**
|
|
87
97
|
* Single message from a runtime session JSONL. Used by the Active Context
|
|
@@ -129,3 +139,50 @@ export interface HeartbeatRaw {
|
|
|
129
139
|
content: string;
|
|
130
140
|
lastUpdated: string | null;
|
|
131
141
|
}
|
|
142
|
+
/** Client mirror of a sync-scanner finding (GET /api/agent-packages/{id}/scan). */
|
|
143
|
+
export interface ScanFinding {
|
|
144
|
+
type: string;
|
|
145
|
+
severity: 'warn' | 'error';
|
|
146
|
+
autoFixable: boolean;
|
|
147
|
+
message: string;
|
|
148
|
+
agentId?: string;
|
|
149
|
+
packageId?: string;
|
|
150
|
+
file?: string;
|
|
151
|
+
target?: string;
|
|
152
|
+
staleInputs?: string[];
|
|
153
|
+
hint?: string;
|
|
154
|
+
}
|
|
155
|
+
/** Client mirror of one timeline event (GET /:agentId/timeline). */
|
|
156
|
+
export type TimelineEventView = {
|
|
157
|
+
type: 'run';
|
|
158
|
+
ts: number;
|
|
159
|
+
runId: string;
|
|
160
|
+
taskId: string;
|
|
161
|
+
taskTitle: string | null;
|
|
162
|
+
seq: number;
|
|
163
|
+
status: 'running' | 'settled' | 'superseded' | 'lost';
|
|
164
|
+
settleReason: string | null;
|
|
165
|
+
startedAt: number;
|
|
166
|
+
settledAt: number | null;
|
|
167
|
+
durationMs: number | null;
|
|
168
|
+
model: string | null;
|
|
169
|
+
inputTokens: number | null;
|
|
170
|
+
outputTokens: number | null;
|
|
171
|
+
totalTokens: number | null;
|
|
172
|
+
costUsdMicros: number | null;
|
|
173
|
+
/** Route receipt (null = pre-migration rows). */
|
|
174
|
+
workClass: string | null;
|
|
175
|
+
routeSource: string | null;
|
|
176
|
+
logs: Array<{
|
|
177
|
+
ts: string;
|
|
178
|
+
message: string;
|
|
179
|
+
}>;
|
|
180
|
+
logsTruncated: boolean;
|
|
181
|
+
} | {
|
|
182
|
+
type: 'event';
|
|
183
|
+
ts: number;
|
|
184
|
+
event: string;
|
|
185
|
+
severity: 'info' | 'warn';
|
|
186
|
+
message: string;
|
|
187
|
+
taskId: string | null;
|
|
188
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NotificationChannelDef } from '
|
|
1
|
+
import type { NotificationChannelDef } from '../../../core/workflows/notification-channel-registry';
|
|
2
2
|
export declare function useNotificationChannels(): NotificationChannelDef[];
|
|
3
3
|
export declare function getChannelLabel(id: string, channels: NotificationChannelDef[]): string;
|
|
4
4
|
/**
|
package/components/index.d.ts
CHANGED
|
@@ -6,29 +6,135 @@
|
|
|
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';
|
|
11
|
-
|
|
12
|
-
export {
|
|
13
|
+
/** Single-agent (or team, #189) picker dropdown for form fields. */
|
|
14
|
+
export { AgentSelect, TEAM_VALUE_PREFIX, isTeamValue, teamIdFromValue } from '../_internal/app/components/agent-select';
|
|
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
|
+
/** Modal asset chooser (thumbnail grid + search + upload-new) over the assets plugin — never a raw id select. */
|
|
20
|
+
export { AssetPicker } from '../_internal/app/components/asset-picker';
|
|
21
|
+
export type { AssetPickerProps, AssetPickerAsset } from '../_internal/app/components/asset-picker';
|
|
22
|
+
/** Right-side slide-out drawer with backdrop and focus trap. */
|
|
13
23
|
export { BakinDrawer } from '../_internal/app/components/bakin-drawer';
|
|
24
|
+
/** Color picker swatch grid for tag/agent color assignment. */
|
|
14
25
|
export { ColorPicker } from '../_internal/app/components/color-picker';
|
|
26
|
+
/** Controlled confirmation dialog for destructive actions (busy/error aware; optional typed confirmation via `confirmValue`). */
|
|
27
|
+
export { ConfirmDialog } from '../_internal/app/components/confirm-dialog';
|
|
28
|
+
export type { ConfirmDialogProps } from '../_internal/app/components/confirm-dialog';
|
|
29
|
+
/** Red-bordered destructive settings section with typed-confirmation delete — bottom of every settings surface. */
|
|
30
|
+
export { DangerZone } from '../_internal/app/components/danger-zone';
|
|
31
|
+
export type { DangerZoneProps } from '../_internal/app/components/danger-zone';
|
|
32
|
+
/** Centered empty-state component with icon, title, and CTA. */
|
|
15
33
|
export { EmptyState } from '../_internal/app/components/empty-state';
|
|
34
|
+
/** Sticky save/discard bar for staged-draft pages (THE dirty-state pattern) + `useUnsavedGuard`. */
|
|
35
|
+
export { SaveBar, useUnsavedGuard } from '../_internal/app/components/save-bar';
|
|
36
|
+
export type { SaveBarProps } from '../_internal/app/components/save-bar';
|
|
37
|
+
/** Full navigation guard for dirty surfaces: beforeunload + TanStack history block + anchor interception + exit dialog. */
|
|
38
|
+
export { useUnsavedChangesGuard } from '../_internal/app/components/unsaved-changes-guard';
|
|
39
|
+
export type { UnsavedChangesGuardOptions } from '../_internal/app/components/unsaved-changes-guard';
|
|
40
|
+
/** Titled card with icon + a one-line "why this matters" description — the standard section wrapper. */
|
|
41
|
+
export { SectionCard } from '../_internal/app/components/section-card';
|
|
42
|
+
export type { SectionCardProps } from '../_internal/app/components/section-card';
|
|
43
|
+
/** THE segmented control / mode toggle (Edit|Preview, Board|Log, time windows) — tablist semantics, neutral active segment. */
|
|
44
|
+
export { SegmentedControl } from '../_internal/app/components/segmented-control';
|
|
45
|
+
export type { SegmentedControlProps, SegmentedControlOption } from '../_internal/app/components/segmented-control';
|
|
46
|
+
/** THE metric tile — icon + uppercase micro-label + tabular big number, optional sub/meter. */
|
|
47
|
+
export { StatTile } from '../_internal/app/components/stat-tile';
|
|
48
|
+
export type { StatTileProps } from '../_internal/app/components/stat-tile';
|
|
49
|
+
/** THE status chip — one tone scale (neutral/success/warning/destructive/accent) for every state badge. */
|
|
50
|
+
export { StatusBadge } from '../_internal/app/components/status-badge';
|
|
51
|
+
export type { StatusBadgeProps, StatusTone } from '../_internal/app/components/status-badge';
|
|
52
|
+
export { SearchUnavailable } from '../_internal/app/components/search-unavailable';
|
|
53
|
+
export { ScoreOverlay, computeMatchedFields } from '../_internal/app/components/score-overlay';
|
|
54
|
+
export { SearchPartialChip } from '../_internal/app/components/search-partial-chip';
|
|
55
|
+
export type { SearchPartialMeta } from '../_internal/app/components/search-partial-chip';
|
|
56
|
+
/** Amber "search down — basic text matching" chip for surfaces with a substring fallback. */
|
|
57
|
+
export { SearchDegradedChip } from '../_internal/app/components/search-degraded-chip';
|
|
58
|
+
export type { ScoreOverlayInfo } from '../_internal/app/components/score-overlay';
|
|
59
|
+
/** Inline error banner with dismiss + retry actions. */
|
|
16
60
|
export { ErrorBanner } from '../_internal/app/components/error-banner';
|
|
61
|
+
/** Full-page error state with title, description, and retry button. */
|
|
17
62
|
export { ErrorState } from '../_internal/app/components/error-state';
|
|
63
|
+
/** Popover multi-select facet filter (column, owner, tag, etc.). */
|
|
18
64
|
export { FacetFilter } from '../_internal/app/components/facet-filter';
|
|
19
65
|
export type { FacetOption } from '../_internal/app/components/facet-filter';
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export { brainstormActivityMessageFromCustom, brainstormThreadId, normalizeBrainstormActivityForStorage, normalizeBrainstormActivityMessageForStorage, readBrainstormSseResponse, runtimeChunkToBrainstormActivity, toBrainstormTimeline, } from '../_internal/app/components/integrated-brainstorm';
|
|
66
|
+
/** Chat + plan-proposal review panel for brainstorm sessions. */
|
|
67
|
+
/** Render markdown content with syntax highlighting and link handling. */
|
|
23
68
|
export { MarkdownContent } from '../_internal/app/components/markdown-content';
|
|
69
|
+
/** Editable markdown text area with preview toggle. */
|
|
24
70
|
export { MarkdownEditor } from '../_internal/app/components/markdown-editor';
|
|
71
|
+
/** Model picker dropdown listing available models from the catalog. */
|
|
25
72
|
export { ModelSelect } from '../_internal/app/components/model-select';
|
|
73
|
+
/** Standard plugin page wrapper with header, content area, and toaster. */
|
|
26
74
|
export { PageLayout } from '../_internal/app/components/page-layout';
|
|
75
|
+
/** Client-side link for runtime-registered plugin and cross-plugin routes. */
|
|
76
|
+
export { PluginLink } from './plugin-link/index';
|
|
77
|
+
export type { PluginLinkProps } from './plugin-link/index';
|
|
78
|
+
/** Plugin page header with title, count badge, search, and action buttons. */
|
|
27
79
|
export { PluginHeader } from '../_internal/app/components/plugin-header';
|
|
80
|
+
export type { PluginHeaderProps } from '../_internal/app/components/plugin-header';
|
|
81
|
+
/** Render a settings form from a PluginSettingsSchema definition. */
|
|
28
82
|
export { PluginSettingsRenderer } from '../_internal/app/components/plugin-settings-renderer';
|
|
29
83
|
export type { PluginSettingsSchema } from '../_internal/app/components/plugin-settings-renderer';
|
|
84
|
+
/** Sortable table column header with ascending/descending indicator. */
|
|
30
85
|
export { SortableHead } from '../_internal/app/components/sortable-head';
|
|
31
86
|
export type { SortDir } from '../_internal/app/components/sortable-head';
|
|
87
|
+
/** Tab list with animated underline indicator. */
|
|
32
88
|
export { UnderlineTabs } from '../_internal/app/components/underline-tabs';
|
|
33
89
|
export type { UnderlineTab } from '../_internal/app/components/underline-tabs';
|
|
90
|
+
/** THE single renderer for normalized turn chunks (text/tool/status/error) — turn-output surfaces consume this, never hand-rolled format heuristics. */
|
|
91
|
+
export { TurnOutputView, TurnToolChip, foldTurnChunks } from '../_internal/app/components/turn-output-view';
|
|
92
|
+
export type { TurnOutputViewProps, TurnToolChipState, TurnTextSegment, FoldedTurnOutput } from '../_internal/app/components/turn-output-view';
|
|
93
|
+
export { foldConversation } from '../_internal/app/components/conversation/fold';
|
|
94
|
+
export type { ConversationMessage, ConversationTurn, ConversationToolCall, TurnItem, TurnStatus, DisplayAttachment, FoldOptions, } from '../_internal/app/components/conversation/fold';
|
|
95
|
+
export { Conversation } from '../_internal/app/components/conversation/conversation';
|
|
96
|
+
export type { ConversationProps } from '../_internal/app/components/conversation/conversation';
|
|
97
|
+
export { AgentTurn, ThinkingIndicator, CopyButton, TurnTimestamp } from '../_internal/app/components/conversation/agent-turn';
|
|
98
|
+
export type { AgentTurnProps } from '../_internal/app/components/conversation/agent-turn';
|
|
99
|
+
export { UserMessage } from '../_internal/app/components/conversation/user-message';
|
|
100
|
+
export type { UserMessageProps } from '../_internal/app/components/conversation/user-message';
|
|
101
|
+
export { ActivityGroup, ToolCallRow, formatDuration, humanizeActivity } from '../_internal/app/components/conversation/activity-group';
|
|
102
|
+
export type { ActivityGroupProps } from '../_internal/app/components/conversation/activity-group';
|
|
103
|
+
export { ToolCallDrawer } from '../_internal/app/components/conversation/tool-call-drawer';
|
|
104
|
+
export type { ToolCallDrawerProps } from '../_internal/app/components/conversation/tool-call-drawer';
|
|
105
|
+
export { Composer } from '../_internal/app/components/conversation/composer';
|
|
106
|
+
export type { ComposerProps, ComposerAttachments, ComposerAttachmentItem } from '../_internal/app/components/conversation/composer';
|
|
107
|
+
export { ConversationPanel } from '../_internal/app/components/conversation/conversation-panel';
|
|
108
|
+
export type { ConversationPanelProps } from '../_internal/app/components/conversation/conversation-panel';
|
|
109
|
+
export { useConversationThread } from '../_internal/app/components/conversation/use-conversation-thread';
|
|
110
|
+
export type { ConversationThread, ConversationThreadLoad, ConversationThreadOptions, } from '../_internal/app/components/conversation/use-conversation-thread';
|
|
111
|
+
export { attentionForDone, badgeFor, visibleIdFromLocation, withUnreadPrefix, } from '../_internal/app/components/conversation/attention';
|
|
112
|
+
export type { AttentionActions, ConversationAttentionContext, ConversationDonePayload, } from '../_internal/app/components/conversation/attention';
|
|
113
|
+
export { playReplyChime } from '../_internal/app/components/conversation/notification-sound';
|
|
114
|
+
export { ConversationReplyToast } from '../_internal/app/components/conversation/reply-toast';
|
|
115
|
+
export { useConversationAttention } from '../_internal/app/components/conversation/use-conversation-attention';
|
|
116
|
+
export type { ConversationAttentionConfig, ConversationAttentionTotals, } from '../_internal/app/components/conversation/use-conversation-attention';
|
|
117
|
+
export { ConversationEmptyState } from '../_internal/app/components/conversation/conversation-empty-state';
|
|
118
|
+
export type { ConversationEmptyStateProps } from '../_internal/app/components/conversation/conversation-empty-state';
|
|
119
|
+
export { formatRelativeTime, formatAbsoluteTime } from '../_internal/app/components/conversation/relative-time';
|
|
120
|
+
/** Icon component for a notification channel (Discord, Slack, email, etc.). */
|
|
34
121
|
export { ChannelIcon } from '../_internal/plugins/workflows/hooks/channel-icon';
|
|
122
|
+
/** Exact table/disclosure shared by visual chart summaries. */
|
|
123
|
+
export { ChartDataTable } from '../_internal/app/components/charts/chart-data-table';
|
|
124
|
+
export type { ChartDataTableProps, ChartDatum, ChartSeries } from '../_internal/app/components/charts/chart-data-table';
|
|
125
|
+
/** Multi-series SVG line chart with keyboard-equivalent marks. */
|
|
126
|
+
export { LineChart } from '../_internal/app/components/charts/line-chart';
|
|
127
|
+
export type { LineChartProps } from '../_internal/app/components/charts/line-chart';
|
|
128
|
+
/** Grouped or stacked SVG bar chart with keyboard-equivalent marks. */
|
|
129
|
+
export { BarChart } from '../_internal/app/components/charts/bar-chart';
|
|
130
|
+
export type { BarChartProps } from '../_internal/app/components/charts/bar-chart';
|
|
131
|
+
/** Stacked column chart with legend toggle + per-column pointer/keyboard breakdown. */
|
|
132
|
+
export { StackedColumnChart } from '../_internal/app/components/charts/stacked-column-chart';
|
|
133
|
+
export type { StackedColumnChartProps, StackedColumnDatum } from '../_internal/app/components/charts/stacked-column-chart';
|
|
134
|
+
/** Tiny inline SVG trend line for embedding beside a stat. */
|
|
135
|
+
export { Sparkline } from '../_internal/app/components/charts/sparkline';
|
|
136
|
+
export type { SparklineProps } from '../_internal/app/components/charts/sparkline';
|
|
137
|
+
/** One-line "what am I looking at / when to worry" chart footer. */
|
|
138
|
+
export { ChartExplainer } from '../_internal/app/components/charts/chart-explainer';
|
|
139
|
+
/** CVD-validated series palette + deterministic entity→color assignment. */
|
|
140
|
+
export { CHART_SERIES_COLORS, CHART_OTHER_COLOR, CHART_MAX_SERIES, assignSeriesColors } from '../_internal/app/components/charts/palette';
|