@kb-labs/rest-api-contracts 1.0.0 → 1.2.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/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
- import { StudioRegistry } from '@kb-labs/studio-contracts';
3
- export { ActionConfirm, ActionHandler, ActionHandlerType, AlertData, AlertOptions, BreadcrumbData, BreadcrumbOptions, COMPOSITE_WIDGET_KINDS, CardData, CardListData, CardListOptions, CardOptions, ChartAreaData, ChartAreaOptions, ChartBarData, ChartBarOptions, ChartLineData, ChartLineOptions, ChartPieData, ChartPieOptions, CheckboxGroupData, CheckboxGroupOptions, CompositeWidgetDecl, CompositeWidgetKind, ConfirmData, ConfirmOptions, DataSource, DatePickerData, DatePickerOptions, DiffData, DiffOptions, EmitActionHandler, FlattenedRegistry, FormData, FormOptions, GridLayoutConfig, GridOptions, InputData, InputOptions, JsonData, JsonOptions, LayoutConfig, LayoutHint, LayoutKind, LeafWidgetDecl, LeafWidgetKind, LogsData, LogsOptions, MenuData, MenuOptions, MetricData, MetricGroupData, MetricGroupOptions, MetricOptions, MockDataSource, ModalData, ModalOptions, NavigateActionHandler, RestActionHandler, RestDataSource, STANDARD_EVENTS, STUDIO_SCHEMA_VERSION, STUDIO_SCHEMA_VERSION_NUMBER, SchemaRef, SectionOptions, SelectData, SelectOptions, StackLayoutConfig, StackOptions, StandardEventName, StaticDataSource, StepperData, StepperOptions, StudioConfig, StudioLayoutDecl, StudioMenuDecl, StudioPluginEntry, StudioRegistry, StudioWidgetDecl, StudioWidgetKind, SwitchData, SwitchOptions, TableColumn, TableData, TableOptions, TabsOptions, TimelineData, TimelineOptions, TreeData, TreeOptions, UserContext, VisibilityRule, WIDGET_CATEGORIES, WidgetAction, WidgetCategory, WidgetData, WidgetDataMap, WidgetEvent, WidgetEventConfig, WidgetOptionsMap, createEmptyRegistry, flattenRegistry, isCompositeKind, isCompositeWidget, isEmitActionHandler, isGridConfig, isLeafWidget, isMockDataSource, isNavigateActionHandler, isRestActionHandler, isRestDataSource, isStackConfig, isStaticDataSource, matchesVisibility, needsMigration, validateSchemaVersion } from '@kb-labs/studio-contracts';
2
+ import * as _kb_labs_plugin_contracts from '@kb-labs/plugin-contracts';
3
+ export { StudioConfig, StudioMenuEntry, StudioPageEntry } from '@kb-labs/plugin-contracts';
4
4
 
5
5
  /**
6
6
  * Standardized error codes shared across CLI, REST and Studio.
@@ -82,61 +82,13 @@ declare const errorEnvelopeSchema: z.ZodObject<{
82
82
  details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
83
83
  cause: z.ZodOptional<z.ZodUnknown>;
84
84
  traceId: z.ZodOptional<z.ZodString>;
85
- }, "strip", z.ZodTypeAny, {
86
- code: string;
87
- message: string;
88
- details?: Record<string, unknown> | undefined;
89
- cause?: unknown;
90
- traceId?: string | undefined;
91
- }, {
92
- code: string;
93
- message: string;
94
- details?: Record<string, unknown> | undefined;
95
- cause?: unknown;
96
- traceId?: string | undefined;
97
- }>;
85
+ }, z.core.$strip>;
98
86
  meta: z.ZodObject<{
99
87
  requestId: z.ZodString;
100
88
  durationMs: z.ZodNumber;
101
89
  apiVersion: z.ZodString;
102
- }, "strip", z.ZodTypeAny, {
103
- requestId: string;
104
- durationMs: number;
105
- apiVersion: string;
106
- }, {
107
- requestId: string;
108
- durationMs: number;
109
- apiVersion: string;
110
- }>;
111
- }, "strip", z.ZodTypeAny, {
112
- ok: false;
113
- error: {
114
- code: string;
115
- message: string;
116
- details?: Record<string, unknown> | undefined;
117
- cause?: unknown;
118
- traceId?: string | undefined;
119
- };
120
- meta: {
121
- requestId: string;
122
- durationMs: number;
123
- apiVersion: string;
124
- };
125
- }, {
126
- ok: false;
127
- error: {
128
- code: string;
129
- message: string;
130
- details?: Record<string, unknown> | undefined;
131
- cause?: unknown;
132
- traceId?: string | undefined;
133
- };
134
- meta: {
135
- requestId: string;
136
- durationMs: number;
137
- apiVersion: string;
138
- };
139
- }>;
90
+ }, z.core.$strip>;
91
+ }, z.core.$strip>;
140
92
  /**
141
93
  * Structured error produced by the plugin runtime.
142
94
  */
@@ -159,6 +111,19 @@ interface PluginErrorEnvelope {
159
111
  };
160
112
  }
161
113
 
114
+ /**
115
+ * Payload returned by the hello service.
116
+ */
117
+ interface HelloPayload {
118
+ schema: 'kb.hello/1';
119
+ message: string;
120
+ ts: string;
121
+ }
122
+ /**
123
+ * Response envelope for GET /hello
124
+ */
125
+ type HelloResponse = SuccessEnvelope<HelloPayload>;
126
+
162
127
  interface SystemHealthSnapshot {
163
128
  schema: 'kb.health/1';
164
129
  ts: string;
@@ -235,7 +200,7 @@ interface ReadyComponents {
235
200
  stale: boolean;
236
201
  };
237
202
  plugins: {
238
- mounted: number;
203
+ mounted: boolean;
239
204
  inProgress: boolean;
240
205
  routeCount: number;
241
206
  errors: number;
@@ -268,56 +233,28 @@ type NotReadyResponse = ReadyResponseBase & {
268
233
  };
269
234
 
270
235
  /**
271
- * @module @kb-labs/rest-api-contracts/studio
272
- * Re-exports from @kb-labs/studio-contracts + REST-specific types.
273
- *
274
- * Studio should ONLY import from this package - no server-side dependencies.
275
- *
276
- * @example
277
- * ```typescript
278
- * // Preferred: Import directly from studio-contracts
279
- * import { StudioWidgetDecl, StudioConfig } from '@kb-labs/studio-contracts';
280
- *
281
- * // Still works: Import via rest-api-contracts (re-export)
282
- * import { StudioWidgetDecl, StudioConfig } from '@kb-labs/rest-api-contracts';
283
- * ```
284
- */
285
-
286
- /**
287
- * GET /studio/registry response
288
- * Extends StudioRegistry with REST-specific metadata
289
- */
290
- type StudioRegistryResponse = StudioRegistry;
291
- /**
292
- * Batch data request for multiple widgets
236
+ * Studio plugin entry in the registry.
293
237
  */
294
- interface BatchDataRequest {
295
- widgetIds: string[];
238
+ interface StudioPluginEntryV2 {
239
+ pluginId: string;
240
+ displayName?: string;
241
+ pluginVersion?: string;
242
+ remoteName: string;
243
+ /** Browser URL for loading remoteEntry.js (relative, proxied through gateway) */
244
+ remoteEntryUrl: string;
245
+ /** Absolute filesystem path to dist/widgets/ directory (server-side only, used by gateway) */
246
+ widgetBundleDir: string;
247
+ pages: _kb_labs_plugin_contracts.StudioPageEntry[];
248
+ menus: _kb_labs_plugin_contracts.StudioMenuEntry[];
296
249
  }
297
250
  /**
298
- * Batch data response
251
+ * GET /api/v1/studio/registry response.
299
252
  */
300
- interface BatchDataResponse {
301
- /** widgetId -> data mapping */
302
- data: Record<string, unknown>;
303
- /** widgetId -> error message for failed widgets */
304
- errors?: Record<string, string>;
305
- }
306
- /**
307
- * Action execution request
308
- */
309
- interface ActionRequest {
310
- widgetId: string;
311
- actionId: string;
312
- payload?: unknown;
313
- }
314
- /**
315
- * Action execution response
316
- */
317
- interface ActionResponse {
318
- success: boolean;
319
- data?: unknown;
320
- error?: string;
253
+ interface StudioRegistryV2 {
254
+ schema: 'kb.studio/2';
255
+ schemaVersion: 2;
256
+ generatedAt: string;
257
+ plugins: StudioPluginEntryV2[];
321
258
  }
322
259
 
323
260
  /**
@@ -499,4 +436,129 @@ interface PlatformConfigPayload {
499
436
  }
500
437
  type PlatformConfigResponse = SuccessEnvelope<PlatformConfigPayload>;
501
438
 
502
- export { type ActionRequest, type ActionResponse, type AdapterValue, type BatchDataRequest, type BatchDataResponse, type CapabilitiesResponse, type ConfigResponse, type DevKitHealthPayload, type DevKitHealthSnapshot, type EnvelopeMeta, ErrorCode, type ErrorEnvelope, type HeatmapCell, type HistoricalDataPoint, type InfoResponse, type MetricsHeatmapPayload, type MetricsHistoryPayload, type NamespaceStats, type NotReadyResponse, type PermissionDiff, type PermissionSummary, type PlatformConfigPayload, type PlatformConfigResponse, type PluginErrorEnvelope, type ReadyComponents, type ReadyResponse, type StateBrokerStats, type StateBrokerStatsPayload, type StudioRegistryResponse, type SuccessEnvelope, type SystemCapabilitiesPayload, type SystemConfigPayload, type SystemHealthSnapshot, type SystemInfoPayload, type TenantStats, errorEnvelopeSchema };
439
+ /**
440
+ * @module @kb-labs/rest-api-contracts/route-schemas
441
+ * Zod schemas for REST API route-level body/query/response.
442
+ * Used with fastify-type-provider-zod so route schemas are fully typed.
443
+ */
444
+
445
+ declare const ErrorResponseSchema: z.ZodObject<{
446
+ ok: z.ZodLiteral<false>;
447
+ message: z.ZodOptional<z.ZodString>;
448
+ error: z.ZodObject<{
449
+ code: z.ZodString;
450
+ message: z.ZodString;
451
+ }, z.core.$strip>;
452
+ }, z.core.$strip>;
453
+ declare const OkResponseSchema: z.ZodObject<{
454
+ ok: z.ZodLiteral<true>;
455
+ }, z.core.$strip>;
456
+ declare const ListJobsQuerySchema: z.ZodObject<{
457
+ status: z.ZodOptional<z.ZodEnum<{
458
+ active: "active";
459
+ paused: "paused";
460
+ }>>;
461
+ }, z.core.$strip>;
462
+ declare const JobSchema: z.ZodObject<{
463
+ id: z.ZodString;
464
+ name: z.ZodOptional<z.ZodString>;
465
+ status: z.ZodOptional<z.ZodEnum<{
466
+ active: "active";
467
+ paused: "paused";
468
+ }>>;
469
+ schedule: z.ZodOptional<z.ZodString>;
470
+ }, z.core.$loose>;
471
+ declare const JobsListResponseSchema: z.ZodObject<{
472
+ jobs: z.ZodArray<z.ZodObject<{
473
+ id: z.ZodString;
474
+ name: z.ZodOptional<z.ZodString>;
475
+ status: z.ZodOptional<z.ZodEnum<{
476
+ active: "active";
477
+ paused: "paused";
478
+ }>>;
479
+ schedule: z.ZodOptional<z.ZodString>;
480
+ }, z.core.$loose>>;
481
+ }, z.core.$strip>;
482
+ declare const JobResponseSchema: z.ZodObject<{
483
+ job: z.ZodObject<{
484
+ id: z.ZodString;
485
+ name: z.ZodOptional<z.ZodString>;
486
+ status: z.ZodOptional<z.ZodEnum<{
487
+ active: "active";
488
+ paused: "paused";
489
+ }>>;
490
+ schedule: z.ZodOptional<z.ZodString>;
491
+ }, z.core.$loose>;
492
+ }, z.core.$strip>;
493
+ declare const JobStatsResponseSchema: z.ZodObject<{
494
+ stats: z.ZodObject<{
495
+ total: z.ZodNumber;
496
+ jobs: z.ZodArray<z.ZodObject<{
497
+ id: z.ZodString;
498
+ name: z.ZodOptional<z.ZodString>;
499
+ status: z.ZodOptional<z.ZodEnum<{
500
+ active: "active";
501
+ paused: "paused";
502
+ }>>;
503
+ schedule: z.ZodOptional<z.ZodString>;
504
+ }, z.core.$loose>>;
505
+ }, z.core.$strip>;
506
+ }, z.core.$strip>;
507
+ declare const JobActionResponseSchema: z.ZodObject<{
508
+ success: z.ZodLiteral<true>;
509
+ message: z.ZodString;
510
+ }, z.core.$strip>;
511
+ declare const ListWorkflowsQuerySchema: z.ZodObject<{
512
+ source: z.ZodOptional<z.ZodEnum<{
513
+ manifest: "manifest";
514
+ standalone: "standalone";
515
+ }>>;
516
+ status: z.ZodOptional<z.ZodEnum<{
517
+ active: "active";
518
+ paused: "paused";
519
+ disabled: "disabled";
520
+ }>>;
521
+ tags: z.ZodOptional<z.ZodString>;
522
+ search: z.ZodOptional<z.ZodString>;
523
+ }, z.core.$strip>;
524
+ declare const WorkflowSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
525
+ declare const WorkflowsListResponseSchema: z.ZodObject<{
526
+ workflows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
527
+ total: z.ZodNumber;
528
+ }, z.core.$strip>;
529
+ declare const WorkflowResponseSchema: z.ZodObject<{
530
+ workflow: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
531
+ }, z.core.$strip>;
532
+ declare const CreateWorkflowBodySchema: z.ZodObject<{
533
+ spec: z.ZodRecord<z.ZodString, z.ZodUnknown>;
534
+ }, z.core.$strip>;
535
+ declare const UpdateWorkflowBodySchema: z.ZodObject<{
536
+ spec: z.ZodOptional<z.ZodObject<{
537
+ name: z.ZodOptional<z.ZodString>;
538
+ version: z.ZodOptional<z.ZodString>;
539
+ description: z.ZodOptional<z.ZodString>;
540
+ on: z.ZodOptional<z.ZodAny>;
541
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
542
+ secrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
543
+ jobs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
544
+ }, z.core.$strip>>;
545
+ status: z.ZodOptional<z.ZodEnum<{
546
+ active: "active";
547
+ paused: "paused";
548
+ disabled: "disabled";
549
+ }>>;
550
+ }, z.core.$strip>;
551
+ declare const ScheduleConfigBodySchema: z.ZodObject<{
552
+ cron: z.ZodString;
553
+ enabled: z.ZodBoolean;
554
+ timezone: z.ZodOptional<z.ZodString>;
555
+ }, z.core.$strip>;
556
+ declare const ValidateWorkflowBodySchema: z.ZodObject<{
557
+ spec: z.ZodAny;
558
+ }, z.core.$strip>;
559
+ declare const HandlersListResponseSchema: z.ZodObject<{
560
+ handlers: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
561
+ total: z.ZodNumber;
562
+ }, z.core.$strip>;
563
+
564
+ export { type AdapterValue, type CapabilitiesResponse, type ConfigResponse, CreateWorkflowBodySchema, type DevKitHealthPayload, type DevKitHealthSnapshot, type EnvelopeMeta, ErrorCode, type ErrorEnvelope, ErrorResponseSchema, HandlersListResponseSchema, type HeatmapCell, type HelloPayload, type HelloResponse, type HistoricalDataPoint, type InfoResponse, JobActionResponseSchema, JobResponseSchema, JobSchema, JobStatsResponseSchema, JobsListResponseSchema, ListJobsQuerySchema, ListWorkflowsQuerySchema, type MetricsHeatmapPayload, type MetricsHistoryPayload, type NamespaceStats, type NotReadyResponse, OkResponseSchema, type PermissionDiff, type PermissionSummary, type PlatformConfigPayload, type PlatformConfigResponse, type PluginErrorEnvelope, type ReadyComponents, type ReadyResponse, ScheduleConfigBodySchema, type StateBrokerStats, type StateBrokerStatsPayload, type StudioPluginEntryV2, type StudioRegistryV2, type SuccessEnvelope, type SystemCapabilitiesPayload, type SystemConfigPayload, type SystemHealthSnapshot, type SystemInfoPayload, type TenantStats, UpdateWorkflowBodySchema, ValidateWorkflowBodySchema, WorkflowResponseSchema, WorkflowSchema, WorkflowsListResponseSchema, errorEnvelopeSchema };
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import { z } from 'zod';
2
- export { COMPOSITE_WIDGET_KINDS, STANDARD_EVENTS, STUDIO_SCHEMA_VERSION, STUDIO_SCHEMA_VERSION_NUMBER, WIDGET_CATEGORIES, createEmptyRegistry, flattenRegistry, isCompositeKind, isCompositeWidget, isEmitActionHandler, isGridConfig, isLeafWidget, isMockDataSource, isNavigateActionHandler, isRestActionHandler, isRestDataSource, isStackConfig, isStaticDataSource, matchesVisibility, needsMigration, validateSchemaVersion } from '@kb-labs/studio-contracts';
3
2
 
4
3
  // src/error-code.ts
5
4
  var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
@@ -31,7 +30,83 @@ var errorEnvelopeSchema = z.object({
31
30
  apiVersion: z.string()
32
31
  })
33
32
  });
33
+ var ErrorResponseSchema = z.object({
34
+ ok: z.literal(false),
35
+ message: z.string().optional(),
36
+ error: z.object({
37
+ code: z.string(),
38
+ message: z.string()
39
+ })
40
+ });
41
+ var OkResponseSchema = z.object({ ok: z.literal(true) });
42
+ var AnyRecord = z.record(z.string(), z.unknown());
43
+ var ListJobsQuerySchema = z.object({
44
+ status: z.enum(["active", "paused"]).optional()
45
+ });
46
+ var JobSchema = z.object({
47
+ id: z.string(),
48
+ name: z.string().optional(),
49
+ status: z.enum(["active", "paused"]).optional(),
50
+ schedule: z.string().optional()
51
+ }).passthrough();
52
+ var JobsListResponseSchema = z.object({
53
+ jobs: z.array(JobSchema)
54
+ });
55
+ var JobResponseSchema = z.object({
56
+ job: JobSchema
57
+ });
58
+ var JobStatsResponseSchema = z.object({
59
+ stats: z.object({
60
+ total: z.number(),
61
+ jobs: z.array(JobSchema)
62
+ })
63
+ });
64
+ var JobActionResponseSchema = z.object({
65
+ success: z.literal(true),
66
+ message: z.string()
67
+ });
68
+ var ListWorkflowsQuerySchema = z.object({
69
+ source: z.enum(["manifest", "standalone"]).optional(),
70
+ status: z.enum(["active", "paused", "disabled"]).optional(),
71
+ tags: z.string().optional(),
72
+ search: z.string().optional()
73
+ });
74
+ var WorkflowSchema = AnyRecord;
75
+ var WorkflowsListResponseSchema = z.object({
76
+ workflows: z.array(AnyRecord),
77
+ total: z.number()
78
+ });
79
+ var WorkflowResponseSchema = z.object({
80
+ workflow: AnyRecord.nullable()
81
+ });
82
+ var CreateWorkflowBodySchema = z.object({
83
+ spec: AnyRecord
84
+ });
85
+ var UpdateWorkflowBodySchema = z.object({
86
+ spec: z.object({
87
+ name: z.string().min(1).optional(),
88
+ version: z.string().min(1).optional(),
89
+ description: z.string().optional(),
90
+ on: z.any().optional(),
91
+ env: z.record(z.string(), z.string()).optional(),
92
+ secrets: z.array(z.string().min(1)).optional(),
93
+ jobs: z.record(z.string().min(1), z.any()).optional()
94
+ }).optional(),
95
+ status: z.enum(["active", "paused", "disabled"]).optional()
96
+ });
97
+ var ScheduleConfigBodySchema = z.object({
98
+ cron: z.string().min(1),
99
+ enabled: z.boolean(),
100
+ timezone: z.string().optional()
101
+ });
102
+ var ValidateWorkflowBodySchema = z.object({
103
+ spec: z.any()
104
+ });
105
+ var HandlersListResponseSchema = z.object({
106
+ handlers: z.array(AnyRecord),
107
+ total: z.number()
108
+ });
34
109
 
35
- export { ErrorCode, errorEnvelopeSchema };
110
+ export { CreateWorkflowBodySchema, ErrorCode, ErrorResponseSchema, HandlersListResponseSchema, JobActionResponseSchema, JobResponseSchema, JobSchema, JobStatsResponseSchema, JobsListResponseSchema, ListJobsQuerySchema, ListWorkflowsQuerySchema, OkResponseSchema, ScheduleConfigBodySchema, UpdateWorkflowBodySchema, ValidateWorkflowBodySchema, WorkflowResponseSchema, WorkflowSchema, WorkflowsListResponseSchema, errorEnvelopeSchema };
36
111
  //# sourceMappingURL=index.js.map
37
112
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/error-code.ts","../src/envelopes.ts"],"names":["ErrorCode"],"mappings":";;;;AAKO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AACL,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,0BAAA,CAAA,GAA2B,0BAAA;AAC3B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAC5B,EAAAA,WAAA,0BAAA,CAAA,GAA2B,0BAAA;AAC3B,EAAAA,WAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,WAAA,iCAAA,CAAA,GAAkC,iCAAA;AAClC,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AAXD,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;ACuBL,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC1C,EAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACnB,KAAA,EAAO,EAAE,MAAA,CAAO;AAAA,IACd,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,IAClB,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,IACpD,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,IAC5B,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC9B,CAAA;AAAA,EACD,IAAA,EAAM,EAAE,MAAA,CAAO;AAAA,IACb,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,IACrB,UAAA,EAAY,EAAE,MAAA;AAAO,GACtB;AACH,CAAC","file":"index.js","sourcesContent":["/**\n * Standardized error codes shared across CLI, REST and Studio.\n * These values intentionally line up with the codes used by the\n * plugin runtime so adapters can map them to HTTP status codes.\n */\nexport enum ErrorCode {\n INTERNAL = 'INTERNAL',\n PLUGIN_PERMISSION_DENIED = 'PLUGIN_PERMISSION_DENIED',\n PLUGIN_CAPABILITY_MISSING = 'PLUGIN_CAPABILITY_MISSING',\n PLUGIN_HANDLER_NOT_FOUND = 'PLUGIN_HANDLER_NOT_FOUND',\n PLUGIN_TIMEOUT = 'PLUGIN_TIMEOUT',\n PLUGIN_SCHEMA_VALIDATION_FAILED = 'PLUGIN_SCHEMA_VALIDATION_FAILED',\n PLUGIN_ARTIFACT_FAILED = 'PLUGIN_ARTIFACT_FAILED',\n PLUGIN_QUOTA_EXCEEDED = 'PLUGIN_QUOTA_EXCEEDED',\n ARTIFACT_READ_DENIED = 'ARTIFACT_READ_DENIED',\n ARTIFACT_WRITE_DENIED = 'ARTIFACT_WRITE_DENIED',\n CONFLICT = 'CONFLICT',\n}\n\n/**\n * Helper describing a compact permission summary.\n */\nexport interface PermissionSummary {\n fs?: {\n mode?: string;\n allowCount?: number;\n denyCount?: number;\n };\n net?: 'none' | { allowHostsCount?: number; denyHostsCount?: number };\n env?: { allowCount?: number };\n quotas?: {\n timeoutMs?: number;\n memoryMb?: number;\n cpuMs?: number;\n };\n capabilities?: string[];\n}\n\n/**\n * Permissions diff emitted when the runtime compares required\n * vs granted permissions for a failing invocation.\n */\nexport interface PermissionDiff {\n required?: string[];\n granted?: string[];\n}\n\n","import { z } from 'zod';\nimport type { PermissionDiff, PermissionSummary } from './error-code';\n\nexport interface EnvelopeMeta {\n requestId: string;\n durationMs: number;\n apiVersion: string;\n [key: string]: unknown;\n}\n\nexport type SuccessEnvelope<T = unknown> = {\n ok: true;\n data: T;\n meta?: EnvelopeMeta;\n};\n\nexport type ErrorEnvelope = {\n ok: false;\n error: {\n code: string;\n message: string;\n details?: Record<string, unknown>;\n cause?: unknown;\n traceId?: string;\n };\n meta: EnvelopeMeta;\n};\n\nexport const errorEnvelopeSchema = z.object({\n ok: z.literal(false),\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.record(z.string(), z.unknown()).optional(),\n cause: z.unknown().optional(),\n traceId: z.string().optional(),\n }),\n meta: z.object({\n requestId: z.string(),\n durationMs: z.number(),\n apiVersion: z.string(),\n }),\n});\n\n/**\n * Structured error produced by the plugin runtime.\n */\nexport interface PluginErrorEnvelope {\n status: 'error';\n http: number;\n code: string;\n message: string;\n details?: Record<string, unknown>;\n trace?: string;\n meta: {\n requestId: string;\n pluginId: string;\n pluginVersion: string;\n routeOrCommand: string;\n timeMs: number;\n cpuMs?: number;\n memMb?: number;\n perms?: PermissionSummary | PermissionDiff | Record<string, unknown>;\n };\n}\n\n\n"]}
1
+ {"version":3,"sources":["../src/error-code.ts","../src/envelopes.ts","../src/route-schemas.ts"],"names":["ErrorCode","z"],"mappings":";;;AAKO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AACL,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,0BAAA,CAAA,GAA2B,0BAAA;AAC3B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAC5B,EAAAA,WAAA,0BAAA,CAAA,GAA2B,0BAAA;AAC3B,EAAAA,WAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,WAAA,iCAAA,CAAA,GAAkC,iCAAA;AAClC,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AAXD,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;ACuBL,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC1C,EAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACnB,KAAA,EAAO,EAAE,MAAA,CAAO;AAAA,IACd,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,IAClB,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,IACpD,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,IAC5B,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC9B,CAAA;AAAA,EACD,IAAA,EAAM,EAAE,MAAA,CAAO;AAAA,IACb,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,IACrB,UAAA,EAAY,EAAE,MAAA;AAAO,GACtB;AACH,CAAC;AChCM,IAAM,mBAAA,GAAsBC,EAAE,MAAA,CAAO;AAAA,EAC1C,EAAA,EAAIA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACnB,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,KAAA,EAAOA,EAAE,MAAA,CAAO;AAAA,IACd,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,IACf,OAAA,EAASA,EAAE,MAAA;AAAO,GACnB;AACH,CAAC;AAEM,IAAM,gBAAA,GAAmBA,EAAE,MAAA,CAAO,EAAE,IAAIA,CAAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,EAAG;AAEhE,IAAM,SAAA,GAAYA,EAAE,MAAA,CAAOA,CAAAA,CAAE,QAAO,EAAGA,CAAAA,CAAE,SAAS,CAAA;AAI3C,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,QAAA;AACvC,CAAC;AAEM,IAAM,SAAA,GAAYA,EAAE,MAAA,CAAO;AAAA,EAChC,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,QAAA,EAAS;AAAA,EAC9C,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC,EAAE,WAAA;AAEI,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAM,SAAS;AACzB,CAAC;AAEM,IAAM,iBAAA,GAAoBA,EAAE,MAAA,CAAO;AAAA,EACxC,GAAA,EAAK;AACP,CAAC;AAEM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,KAAA,EAAOA,EAAE,MAAA,CAAO;AAAA,IACd,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,IAChB,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAM,SAAS;AAAA,GACxB;AACH,CAAC;AAEM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,OAAA,EAASA,CAAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvB,OAAA,EAASA,EAAE,MAAA;AACb,CAAC;AAIM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA,EAC/C,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,YAAY,YAAY,CAAC,EAAE,QAAA,EAAS;AAAA,EACpD,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,UAAU,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC1D,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC;AAEM,IAAM,cAAA,GAAiB;AAEvB,IAAM,2BAAA,GAA8BA,EAAE,MAAA,CAAO;AAAA,EAClD,SAAA,EAAWA,CAAAA,CAAE,KAAA,CAAM,SAAS,CAAA;AAAA,EAC5B,KAAA,EAAOA,EAAE,MAAA;AACX,CAAC;AAEM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,QAAA,EAAU,UAAU,QAAA;AACtB,CAAC;AAEM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAM;AACR,CAAC;AAEM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAMA,EAAE,MAAA,CAAO;AAAA,IACb,MAAMA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,IACjC,SAASA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,IACpC,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACjC,EAAA,EAAIA,CAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,IACrB,GAAA,EAAKA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,IAC/C,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,IAC7C,IAAA,EAAMA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,EAAGA,CAAAA,CAAE,GAAA,EAAK,EAAE,QAAA;AAAS,GACrD,EAAE,QAAA,EAAS;AAAA,EACZ,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,UAAU,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,QAAA;AACnD,CAAC;AAEM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,EACnB,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC;AAEM,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EACjD,IAAA,EAAMA,EAAE,GAAA;AACV,CAAC;AAEM,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EACjD,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAM,SAAS,CAAA;AAAA,EAC3B,KAAA,EAAOA,EAAE,MAAA;AACX,CAAC","file":"index.js","sourcesContent":["/**\n * Standardized error codes shared across CLI, REST and Studio.\n * These values intentionally line up with the codes used by the\n * plugin runtime so adapters can map them to HTTP status codes.\n */\nexport enum ErrorCode {\n INTERNAL = 'INTERNAL',\n PLUGIN_PERMISSION_DENIED = 'PLUGIN_PERMISSION_DENIED',\n PLUGIN_CAPABILITY_MISSING = 'PLUGIN_CAPABILITY_MISSING',\n PLUGIN_HANDLER_NOT_FOUND = 'PLUGIN_HANDLER_NOT_FOUND',\n PLUGIN_TIMEOUT = 'PLUGIN_TIMEOUT',\n PLUGIN_SCHEMA_VALIDATION_FAILED = 'PLUGIN_SCHEMA_VALIDATION_FAILED',\n PLUGIN_ARTIFACT_FAILED = 'PLUGIN_ARTIFACT_FAILED',\n PLUGIN_QUOTA_EXCEEDED = 'PLUGIN_QUOTA_EXCEEDED',\n ARTIFACT_READ_DENIED = 'ARTIFACT_READ_DENIED',\n ARTIFACT_WRITE_DENIED = 'ARTIFACT_WRITE_DENIED',\n CONFLICT = 'CONFLICT',\n}\n\n/**\n * Helper describing a compact permission summary.\n */\nexport interface PermissionSummary {\n fs?: {\n mode?: string;\n allowCount?: number;\n denyCount?: number;\n };\n net?: 'none' | { allowHostsCount?: number; denyHostsCount?: number };\n env?: { allowCount?: number };\n quotas?: {\n timeoutMs?: number;\n memoryMb?: number;\n cpuMs?: number;\n };\n capabilities?: string[];\n}\n\n/**\n * Permissions diff emitted when the runtime compares required\n * vs granted permissions for a failing invocation.\n */\nexport interface PermissionDiff {\n required?: string[];\n granted?: string[];\n}\n\n","import { z } from 'zod';\nimport type { PermissionDiff, PermissionSummary } from './error-code';\n\nexport interface EnvelopeMeta {\n requestId: string;\n durationMs: number;\n apiVersion: string;\n [key: string]: unknown;\n}\n\nexport type SuccessEnvelope<T = unknown> = {\n ok: true;\n data: T;\n meta?: EnvelopeMeta;\n};\n\nexport type ErrorEnvelope = {\n ok: false;\n error: {\n code: string;\n message: string;\n details?: Record<string, unknown>;\n cause?: unknown;\n traceId?: string;\n };\n meta: EnvelopeMeta;\n};\n\nexport const errorEnvelopeSchema = z.object({\n ok: z.literal(false),\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.record(z.string(), z.unknown()).optional(),\n cause: z.unknown().optional(),\n traceId: z.string().optional(),\n }),\n meta: z.object({\n requestId: z.string(),\n durationMs: z.number(),\n apiVersion: z.string(),\n }),\n});\n\n/**\n * Structured error produced by the plugin runtime.\n */\nexport interface PluginErrorEnvelope {\n status: 'error';\n http: number;\n code: string;\n message: string;\n details?: Record<string, unknown>;\n trace?: string;\n meta: {\n requestId: string;\n pluginId: string;\n pluginVersion: string;\n routeOrCommand: string;\n timeMs: number;\n cpuMs?: number;\n memMb?: number;\n perms?: PermissionSummary | PermissionDiff | Record<string, unknown>;\n };\n}\n\n\n","/**\n * @module @kb-labs/rest-api-contracts/route-schemas\n * Zod schemas for REST API route-level body/query/response.\n * Used with fastify-type-provider-zod so route schemas are fully typed.\n */\n\nimport { z } from 'zod';\n\n// ── Shared ────────────────────────────────────────────────────────────────────\n\nexport const ErrorResponseSchema = z.object({\n ok: z.literal(false),\n message: z.string().optional(),\n error: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const OkResponseSchema = z.object({ ok: z.literal(true) });\n\nconst AnyRecord = z.record(z.string(), z.unknown());\n\n// ── Jobs ──────────────────────────────────────────────────────────────────────\n\nexport const ListJobsQuerySchema = z.object({\n status: z.enum(['active', 'paused']).optional(),\n});\n\nexport const JobSchema = z.object({\n id: z.string(),\n name: z.string().optional(),\n status: z.enum(['active', 'paused']).optional(),\n schedule: z.string().optional(),\n}).passthrough();\n\nexport const JobsListResponseSchema = z.object({\n jobs: z.array(JobSchema),\n});\n\nexport const JobResponseSchema = z.object({\n job: JobSchema,\n});\n\nexport const JobStatsResponseSchema = z.object({\n stats: z.object({\n total: z.number(),\n jobs: z.array(JobSchema),\n }),\n});\n\nexport const JobActionResponseSchema = z.object({\n success: z.literal(true),\n message: z.string(),\n});\n\n// ── Workflows ─────────────────────────────────────────────────────────────────\n\nexport const ListWorkflowsQuerySchema = z.object({\n source: z.enum(['manifest', 'standalone']).optional(),\n status: z.enum(['active', 'paused', 'disabled']).optional(),\n tags: z.string().optional(),\n search: z.string().optional(),\n});\n\nexport const WorkflowSchema = AnyRecord;\n\nexport const WorkflowsListResponseSchema = z.object({\n workflows: z.array(AnyRecord),\n total: z.number(),\n});\n\nexport const WorkflowResponseSchema = z.object({\n workflow: AnyRecord.nullable(),\n});\n\nexport const CreateWorkflowBodySchema = z.object({\n spec: AnyRecord,\n});\n\nexport const UpdateWorkflowBodySchema = z.object({\n spec: z.object({\n name: z.string().min(1).optional(),\n version: z.string().min(1).optional(),\n description: z.string().optional(),\n on: z.any().optional(),\n env: z.record(z.string(), z.string()).optional(),\n secrets: z.array(z.string().min(1)).optional(),\n jobs: z.record(z.string().min(1), z.any()).optional(),\n }).optional(),\n status: z.enum(['active', 'paused', 'disabled']).optional(),\n});\n\nexport const ScheduleConfigBodySchema = z.object({\n cron: z.string().min(1),\n enabled: z.boolean(),\n timezone: z.string().optional(),\n});\n\nexport const ValidateWorkflowBodySchema = z.object({\n spec: z.any(),\n});\n\nexport const HandlersListResponseSchema = z.object({\n handlers: z.array(AnyRecord),\n total: z.number(),\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kb-labs/rest-api-contracts",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Shared API contracts for KB Labs REST/CLI/Studio surfaces",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,12 +15,22 @@
15
15
  "dist",
16
16
  "README.md"
17
17
  ],
18
+ "scripts": {
19
+ "build": "tsup --config tsup.config.ts",
20
+ "dev": "tsup --config tsup.config.ts --watch",
21
+ "clean": "rimraf dist",
22
+ "lint": "eslint src",
23
+ "test": "vitest run --passWithNoTests",
24
+ "lint:fix": "eslint . --fix",
25
+ "type-check": "tsc --noEmit",
26
+ "test:watch": "vitest"
27
+ },
18
28
  "dependencies": {
19
- "@kb-labs/studio-contracts": "link:../../../kb-labs-studio/packages/studio-contracts",
20
- "zod": "^3.23.8"
29
+ "@kb-labs/plugin-contracts": "^1.2.0",
30
+ "zod": "^4.0.0"
21
31
  },
22
32
  "devDependencies": {
23
- "@kb-labs/devkit": "link:../../../kb-labs-devkit",
33
+ "@kb-labs/devkit": "link:../../../../infra/kb-labs-devkit",
24
34
  "@types/node": "^24.3.3",
25
35
  "rimraf": "^6.0.1",
26
36
  "tsup": "^8.5.0",
@@ -33,15 +43,5 @@
33
43
  },
34
44
  "publishConfig": {
35
45
  "access": "public"
36
- },
37
- "scripts": {
38
- "build": "tsup --config tsup.config.ts",
39
- "dev": "tsup --config tsup.config.ts --watch",
40
- "clean": "rimraf dist",
41
- "lint": "eslint src",
42
- "test": "vitest run --passWithNoTests",
43
- "lint:fix": "eslint . --fix",
44
- "type-check": "tsc --noEmit",
45
- "test:watch": "vitest"
46
46
  }
47
- }
47
+ }