@ramme-io/kernel 1.3.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.
Files changed (124) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/LICENSE +21 -0
  3. package/dist/components/AutoForm.d.ts +24 -0
  4. package/dist/components/AutoForm.d.ts.map +1 -0
  5. package/dist/components/AutoForm.js +78 -0
  6. package/dist/components/AutoForm.js.map +1 -0
  7. package/dist/components/SmartTable.d.ts +14 -0
  8. package/dist/components/SmartTable.d.ts.map +1 -0
  9. package/dist/components/SmartTable.js +128 -0
  10. package/dist/components/SmartTable.js.map +1 -0
  11. package/dist/config/app.manifest.d.ts +7 -0
  12. package/dist/config/app.manifest.d.ts.map +1 -0
  13. package/dist/config/app.manifest.js +8 -0
  14. package/dist/config/app.manifest.js.map +1 -0
  15. package/dist/engine/renderers/DynamicBlock.d.ts +9 -0
  16. package/dist/engine/renderers/DynamicBlock.d.ts.map +1 -0
  17. package/dist/engine/renderers/DynamicBlock.js +67 -0
  18. package/dist/engine/renderers/DynamicBlock.js.map +1 -0
  19. package/dist/engine/renderers/DynamicPage.d.ts +11 -0
  20. package/dist/engine/renderers/DynamicPage.d.ts.map +1 -0
  21. package/dist/engine/renderers/DynamicPage.js +91 -0
  22. package/dist/engine/renderers/DynamicPage.js.map +1 -0
  23. package/dist/engine/renderers/route-generator.d.ts +16 -0
  24. package/dist/engine/renderers/route-generator.d.ts.map +1 -0
  25. package/dist/engine/renderers/route-generator.js +30 -0
  26. package/dist/engine/renderers/route-generator.js.map +1 -0
  27. package/dist/engine/renderers/sitemap-entry.d.ts +7 -0
  28. package/dist/engine/renderers/sitemap-entry.d.ts.map +1 -0
  29. package/dist/engine/renderers/sitemap-entry.js +2 -0
  30. package/dist/engine/renderers/sitemap-entry.js.map +1 -0
  31. package/dist/engine/runtime/ManifestContext.d.ts +115 -0
  32. package/dist/engine/runtime/ManifestContext.d.ts.map +1 -0
  33. package/dist/engine/runtime/ManifestContext.js +56 -0
  34. package/dist/engine/runtime/ManifestContext.js.map +1 -0
  35. package/dist/engine/runtime/MqttContext.d.ts +14 -0
  36. package/dist/engine/runtime/MqttContext.d.ts.map +1 -0
  37. package/dist/engine/runtime/MqttContext.js +70 -0
  38. package/dist/engine/runtime/MqttContext.js.map +1 -0
  39. package/dist/engine/runtime/SitemapContext.d.ts +31 -0
  40. package/dist/engine/runtime/SitemapContext.d.ts.map +1 -0
  41. package/dist/engine/runtime/SitemapContext.js +54 -0
  42. package/dist/engine/runtime/SitemapContext.js.map +1 -0
  43. package/dist/engine/runtime/data-seeder.d.ts +10 -0
  44. package/dist/engine/runtime/data-seeder.d.ts.map +1 -0
  45. package/dist/engine/runtime/data-seeder.js +35 -0
  46. package/dist/engine/runtime/data-seeder.js.map +1 -0
  47. package/dist/engine/runtime/useAction.d.ts +4 -0
  48. package/dist/engine/runtime/useAction.d.ts.map +1 -0
  49. package/dist/engine/runtime/useAction.js +55 -0
  50. package/dist/engine/runtime/useAction.js.map +1 -0
  51. package/dist/engine/runtime/useCrudLocalStorage.d.ts +19 -0
  52. package/dist/engine/runtime/useCrudLocalStorage.d.ts.map +1 -0
  53. package/dist/engine/runtime/useCrudLocalStorage.js +73 -0
  54. package/dist/engine/runtime/useCrudLocalStorage.js.map +1 -0
  55. package/dist/engine/runtime/useDataQuery.d.ts +39 -0
  56. package/dist/engine/runtime/useDataQuery.d.ts.map +1 -0
  57. package/dist/engine/runtime/useDataQuery.js +50 -0
  58. package/dist/engine/runtime/useDataQuery.js.map +1 -0
  59. package/dist/engine/runtime/useDynamicSitemap.d.ts +9 -0
  60. package/dist/engine/runtime/useDynamicSitemap.d.ts.map +1 -0
  61. package/dist/engine/runtime/useDynamicSitemap.js +38 -0
  62. package/dist/engine/runtime/useDynamicSitemap.js.map +1 -0
  63. package/dist/engine/runtime/useJustInTimeSeeder.d.ts +11 -0
  64. package/dist/engine/runtime/useJustInTimeSeeder.d.ts.map +1 -0
  65. package/dist/engine/runtime/useJustInTimeSeeder.js +88 -0
  66. package/dist/engine/runtime/useJustInTimeSeeder.js.map +1 -0
  67. package/dist/engine/runtime/useLiveBridge.d.ts +109 -0
  68. package/dist/engine/runtime/useLiveBridge.d.ts.map +1 -0
  69. package/dist/engine/runtime/useLiveBridge.js +21 -0
  70. package/dist/engine/runtime/useLiveBridge.js.map +1 -0
  71. package/dist/engine/runtime/useSignal.d.ts +11 -0
  72. package/dist/engine/runtime/useSignal.d.ts.map +1 -0
  73. package/dist/engine/runtime/useSignal.js +26 -0
  74. package/dist/engine/runtime/useSignal.js.map +1 -0
  75. package/dist/engine/runtime/useSignalStore.d.ts +31 -0
  76. package/dist/engine/runtime/useSignalStore.d.ts.map +1 -0
  77. package/dist/engine/runtime/useSignalStore.js +60 -0
  78. package/dist/engine/runtime/useSignalStore.js.map +1 -0
  79. package/dist/engine/runtime/useWorkflowEngine.d.ts +4 -0
  80. package/dist/engine/runtime/useWorkflowEngine.d.ts.map +1 -0
  81. package/dist/engine/runtime/useWorkflowEngine.js +85 -0
  82. package/dist/engine/runtime/useWorkflowEngine.js.map +1 -0
  83. package/dist/engine/types/manifest-types.d.ts +38 -0
  84. package/dist/engine/types/manifest-types.d.ts.map +1 -0
  85. package/dist/engine/types/manifest-types.js +5 -0
  86. package/dist/engine/types/manifest-types.js.map +1 -0
  87. package/dist/engine/types/sitemap-entry.d.ts +58 -0
  88. package/dist/engine/types/sitemap-entry.d.ts.map +1 -0
  89. package/dist/engine/types/sitemap-entry.js +19 -0
  90. package/dist/engine/types/sitemap-entry.js.map +1 -0
  91. package/dist/engine/validation/schema.d.ts +383 -0
  92. package/dist/engine/validation/schema.d.ts.map +1 -0
  93. package/dist/engine/validation/schema.js +156 -0
  94. package/dist/engine/validation/schema.js.map +1 -0
  95. package/dist/index.d.ts +22 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +24 -0
  98. package/dist/index.js.map +1 -0
  99. package/package.json +36 -0
  100. package/src/components/AutoForm.tsx +141 -0
  101. package/src/components/SmartTable.tsx +316 -0
  102. package/src/config/app.manifest.ts +7 -0
  103. package/src/engine/renderers/DynamicBlock.tsx +84 -0
  104. package/src/engine/renderers/DynamicPage.tsx +196 -0
  105. package/src/engine/renderers/route-generator.tsx +47 -0
  106. package/src/engine/renderers/sitemap-entry.ts +6 -0
  107. package/src/engine/runtime/ManifestContext.tsx +81 -0
  108. package/src/engine/runtime/MqttContext.tsx +94 -0
  109. package/src/engine/runtime/SitemapContext.tsx +61 -0
  110. package/src/engine/runtime/data-seeder.ts +39 -0
  111. package/src/engine/runtime/useAction.ts +64 -0
  112. package/src/engine/runtime/useCrudLocalStorage.ts +82 -0
  113. package/src/engine/runtime/useDataQuery.ts +98 -0
  114. package/src/engine/runtime/useDynamicSitemap.tsx +43 -0
  115. package/src/engine/runtime/useJustInTimeSeeder.ts +101 -0
  116. package/src/engine/runtime/useLiveBridge.ts +24 -0
  117. package/src/engine/runtime/useSignal.ts +40 -0
  118. package/src/engine/runtime/useSignalStore.ts +94 -0
  119. package/src/engine/runtime/useWorkflowEngine.ts +89 -0
  120. package/src/engine/types/manifest-types.ts +45 -0
  121. package/src/engine/types/sitemap-entry.ts +66 -0
  122. package/src/engine/validation/schema.ts +189 -0
  123. package/src/index.ts +27 -0
  124. package/tsconfig.json +28 -0
@@ -0,0 +1,85 @@
1
+ import { useEffect } from 'react';
2
+ import { useToast } from '@ramme-io/ui';
3
+ import { useGeneratedSignals, useSimulation } from './useSignalStore';
4
+ // ❌ REMOVED: import { appManifest } from '../../config/app.manifest';
5
+ // ✅ ADDED: Live Context
6
+ import { useManifest } from './ManifestContext';
7
+ export const useWorkflowEngine = () => {
8
+ const signals = useGeneratedSignals();
9
+ const { addToast } = useToast();
10
+ // ✅ 1. Consume Live Manifest
11
+ const appManifest = useManifest();
12
+ // 2. Activate Simulation (Responsive to toggle)
13
+ useSimulation(appManifest.config.mockMode);
14
+ const executeAction = async (action, context) => {
15
+ // ... (Same execution logic as before) ...
16
+ console.log(`[Engine] Executing: ${action.type}`, action);
17
+ switch (action.type) {
18
+ case 'send_notification':
19
+ addToast(action.config.message || 'Notification Sent', 'info');
20
+ break;
21
+ case 'update_resource':
22
+ addToast(`Updating Resource: ${JSON.stringify(action.config)}`, 'success');
23
+ break;
24
+ case 'navigate':
25
+ window.location.href = action.config.path;
26
+ break;
27
+ case 'agent_task':
28
+ addToast('AI Agent Analyzing...', 'info');
29
+ setTimeout(() => addToast('🤖 Agent: "System Nominal"', 'success', 3000), 1500);
30
+ break;
31
+ }
32
+ };
33
+ // 3. Watch Signals & Trigger Workflows (Live)
34
+ useEffect(() => {
35
+ if (!appManifest.domain?.workflows)
36
+ return;
37
+ appManifest.domain.workflows.forEach((flow) => {
38
+ if (!flow.active)
39
+ return;
40
+ if (flow.trigger.type === 'signal_change') {
41
+ const signalId = flow.trigger.config.signalId;
42
+ const condition = flow.trigger.config.condition;
43
+ // @ts-ignore
44
+ const signal = signals[signalId];
45
+ if (signal) {
46
+ const val = signal.value;
47
+ try {
48
+ const isMet = checkCondition(val, condition);
49
+ if (isMet) {
50
+ console.log(`[Engine] Trigger Fired: ${flow.name}`);
51
+ flow.actions.forEach(action => executeAction(action, { signal: val }));
52
+ }
53
+ }
54
+ catch (e) { }
55
+ }
56
+ }
57
+ });
58
+ }, [signals, addToast, appManifest.domain.workflows]); // Added dependency
59
+ return {
60
+ triggerWorkflow: (workflowId) => {
61
+ // ✅ 4. Manual Triggers now find new workflows instantly
62
+ const flow = appManifest.domain?.workflows?.find(w => w.id === workflowId);
63
+ if (flow) {
64
+ // @ts-ignore
65
+ flow.actions.forEach(action => executeAction(action, { manual: true }));
66
+ }
67
+ }
68
+ };
69
+ };
70
+ const checkCondition = (value, condition) => {
71
+ if (!condition)
72
+ return false;
73
+ const parts = condition.trim().split(' ');
74
+ const operator = parts[0];
75
+ const target = parseFloat(parts[1]);
76
+ switch (operator) {
77
+ case '>': return value > target;
78
+ case '<': return value < target;
79
+ case '>=': return value >= target;
80
+ case '<=': return value <= target;
81
+ case '==': return value === target;
82
+ default: return false;
83
+ }
84
+ };
85
+ //# sourceMappingURL=useWorkflowEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWorkflowEngine.js","sourceRoot":"","sources":["../../../src/engine/runtime/useWorkflowEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type IconName } from '@ramme-io/ui';
2
+ /**
3
+ * Defines a simple navigation link structure used in menus.
4
+ */
5
+ export interface ManifestLink {
6
+ id: string;
7
+ title: string;
8
+ path: string;
9
+ icon?: IconName;
10
+ }
11
+ /**
12
+ * The fundamental unit of the UI.
13
+ * Corresponds to a specific React component in the registry.
14
+ */
15
+ export interface Block {
16
+ id: string;
17
+ type: string;
18
+ props: Record<string, any>;
19
+ layout?: {
20
+ colSpan?: number;
21
+ rowSpan?: number;
22
+ };
23
+ }
24
+ /**
25
+ * A horizontal container that groups blocks together.
26
+ * Maps to a CSS Grid or Flex container.
27
+ */
28
+ export interface PageSection {
29
+ id: string;
30
+ title?: string;
31
+ description?: string;
32
+ layout?: {
33
+ columns?: number;
34
+ variant?: 'grid' | 'stack';
35
+ };
36
+ blocks: Block[];
37
+ }
38
+ //# sourceMappingURL=manifest-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-types.d.ts","sourceRoot":"","sources":["../../../src/engine/types/manifest-types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KAC5B,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB"}
@@ -0,0 +1,5 @@
1
+ // src/core/manifest-types.ts
2
+ export {};
3
+ // Note: PageDefinition and AppSpecification are exported from schema.ts
4
+ // These types are kept here for backward compatibility but should use schema.ts types instead
5
+ //# sourceMappingURL=manifest-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-types.js","sourceRoot":"","sources":["../../../src/engine/types/manifest-types.ts"],"names":[],"mappings":"AAAA,6BAA6B;;AA2C7B,wEAAwE;AACxE,8FAA8F"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @file sitemap-entry.ts
3
+ * @repository ramme-app-starter
4
+ * @description This file defines the canonical TypeScript interface for a single
5
+ * sitemap entry. It is the "schema" or "contract" that governs the entire
6
+ * Sitemap-Driven Architecture.
7
+ *
8
+ * STRATEGIC IMPORTANCE:
9
+ * 1. Designer DX: It provides strict type-safety and autocompletion for any
10
+ * designer editing a `sitemap.ts` file, dramatically lowering the risk of errors.
11
+ * 2. Repo-Linking: It directly imports `IconName` from `@ramme-io/ui`, creating
12
+ * a type-safe link between our starter kit and our component library.
13
+ * 3. AI-Ready: This interface is the precise data structure that the AI Assistant
14
+ * in the (private) `ramme-app-builder` will be trained to generate.
15
+ * The "Architect" phase of the A.D.A.P.T. Framework will result in the
16
+ * AI creating an array of these objects.
17
+ */
18
+ import { type IconName } from '@ramme-io/ui';
19
+ /**
20
+ * Defines the required shape for a single entry in any `sitemap.ts` file.
21
+ */
22
+ export interface SitemapEntry {
23
+ /**
24
+ * A unique string identifier.
25
+ * Used by React as the `key` prop during route generation.
26
+ * e.g., 'dashboard.home'
27
+ */
28
+ id: string;
29
+ /**
30
+ * The URL path segment for this route.
31
+ * e.g., 'home', 'users', 'settings'
32
+ */
33
+ path: string;
34
+ /**
35
+ * The human-readable name for the route.
36
+ * Used to populate navigation links, breadcrumbs, and page titles.
37
+ * e.g., 'Home', 'User Management'
38
+ */
39
+ title: string;
40
+ /**
41
+ * (Optional) The name of the icon to display in the navigation.
42
+ * This MUST be a valid `IconName` from the `@ramme-io/ui` library.
43
+ * e.g., 'home', 'users', 'settings'
44
+ */
45
+ icon?: IconName;
46
+ /**
47
+ * The actual React component to render when this route is active.
48
+ * e.g., DashboardPage, SettingsPage
49
+ */
50
+ component: React.ComponentType;
51
+ /**
52
+ * (Optional) An array of nested `SitemapEntry` objects.
53
+ * This is the property that enables recursive, nested navigation
54
+ * (e.g., /settings/profile, /settings/billing).
55
+ */
56
+ children?: SitemapEntry[];
57
+ }
58
+ //# sourceMappingURL=sitemap-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-entry.d.ts","sourceRoot":"","sources":["../../../src/engine/types/sitemap-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB;;;OAGG;IACH,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;IAE/B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @file sitemap-entry.ts
3
+ * @repository ramme-app-starter
4
+ * @description This file defines the canonical TypeScript interface for a single
5
+ * sitemap entry. It is the "schema" or "contract" that governs the entire
6
+ * Sitemap-Driven Architecture.
7
+ *
8
+ * STRATEGIC IMPORTANCE:
9
+ * 1. Designer DX: It provides strict type-safety and autocompletion for any
10
+ * designer editing a `sitemap.ts` file, dramatically lowering the risk of errors.
11
+ * 2. Repo-Linking: It directly imports `IconName` from `@ramme-io/ui`, creating
12
+ * a type-safe link between our starter kit and our component library.
13
+ * 3. AI-Ready: This interface is the precise data structure that the AI Assistant
14
+ * in the (private) `ramme-app-builder` will be trained to generate.
15
+ * The "Architect" phase of the A.D.A.P.T. Framework will result in the
16
+ * AI creating an array of these objects.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=sitemap-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-entry.js","sourceRoot":"","sources":["../../../src/engine/types/sitemap-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,383 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * @file schema.ts
4
+ * @description The "Application Constitution".
5
+ *
6
+ * ARCHITECTURAL ROLE:
7
+ * This file uses Zod to define the strict runtime validation rules for the
8
+ * App Manifest. While `manifest-types.ts` handles compile-time TypeScript checks,
9
+ * this file handles runtime validation, ensuring that any JSON loaded into the
10
+ * engine (whether from a file, API, or user input) is structurally sound.
11
+ *
12
+ * LAYERS DEFINED:
13
+ * 1. **SaaS Layer:** Data resources, fields, and tables.
14
+ * 2. **Physical Layer:** IoT signals, sensors, and entities.
15
+ * 3. **Logic Layer:** Workflows, triggers, and automated actions.
16
+ * 4. **Presentation Layer:** Pages, sections, and UI blocks.
17
+ */
18
+ export declare const FieldSchema: z.ZodObject<{
19
+ key: z.ZodString;
20
+ label: z.ZodString;
21
+ type: z.ZodEnum<{
22
+ number: "number";
23
+ boolean: "boolean";
24
+ text: "text";
25
+ currency: "currency";
26
+ date: "date";
27
+ status: "status";
28
+ email: "email";
29
+ image: "image";
30
+ textarea: "textarea";
31
+ }>;
32
+ required: z.ZodOptional<z.ZodBoolean>;
33
+ description: z.ZodOptional<z.ZodString>;
34
+ defaultValue: z.ZodOptional<z.ZodAny>;
35
+ }, z.core.$strip>;
36
+ export type FieldDefinition = z.infer<typeof FieldSchema>;
37
+ export declare const ResourceSchema: z.ZodObject<{
38
+ id: z.ZodString;
39
+ name: z.ZodString;
40
+ fields: z.ZodArray<z.ZodObject<{
41
+ key: z.ZodString;
42
+ label: z.ZodString;
43
+ type: z.ZodEnum<{
44
+ number: "number";
45
+ boolean: "boolean";
46
+ text: "text";
47
+ currency: "currency";
48
+ date: "date";
49
+ status: "status";
50
+ email: "email";
51
+ image: "image";
52
+ textarea: "textarea";
53
+ }>;
54
+ required: z.ZodOptional<z.ZodBoolean>;
55
+ description: z.ZodOptional<z.ZodString>;
56
+ defaultValue: z.ZodOptional<z.ZodAny>;
57
+ }, z.core.$strip>>;
58
+ defaultView: z.ZodOptional<z.ZodEnum<{
59
+ table: "table";
60
+ grid: "grid";
61
+ list: "list";
62
+ }>>;
63
+ features: z.ZodOptional<z.ZodObject<{
64
+ searchable: z.ZodOptional<z.ZodBoolean>;
65
+ creatable: z.ZodOptional<z.ZodBoolean>;
66
+ editable: z.ZodOptional<z.ZodBoolean>;
67
+ deletable: z.ZodOptional<z.ZodBoolean>;
68
+ exportable: z.ZodOptional<z.ZodBoolean>;
69
+ }, z.core.$strip>>;
70
+ }, z.core.$strip>;
71
+ export type ResourceDefinition = z.infer<typeof ResourceSchema>;
72
+ export declare const SignalSchema: z.ZodObject<{
73
+ id: z.ZodString;
74
+ label: z.ZodString;
75
+ description: z.ZodOptional<z.ZodString>;
76
+ kind: z.ZodEnum<{
77
+ status: "status";
78
+ sensor: "sensor";
79
+ actuator: "actuator";
80
+ setpoint: "setpoint";
81
+ metric: "metric";
82
+ kpi: "kpi";
83
+ }>;
84
+ source: z.ZodEnum<{
85
+ mock: "mock";
86
+ mqtt: "mqtt";
87
+ http: "http";
88
+ derived: "derived";
89
+ local: "local";
90
+ }>;
91
+ topic: z.ZodOptional<z.ZodString>;
92
+ endpoint: z.ZodOptional<z.ZodString>;
93
+ jsonPath: z.ZodOptional<z.ZodString>;
94
+ refreshRate: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
95
+ defaultValue: z.ZodOptional<z.ZodAny>;
96
+ unit: z.ZodOptional<z.ZodString>;
97
+ min: z.ZodOptional<z.ZodNumber>;
98
+ max: z.ZodOptional<z.ZodNumber>;
99
+ }, z.core.$strip>;
100
+ export type SignalDefinition = z.infer<typeof SignalSchema>;
101
+ export declare const EntitySchema: z.ZodObject<{
102
+ id: z.ZodString;
103
+ name: z.ZodString;
104
+ description: z.ZodOptional<z.ZodString>;
105
+ type: z.ZodString;
106
+ category: z.ZodDefault<z.ZodString>;
107
+ signals: z.ZodArray<z.ZodString>;
108
+ ui: z.ZodOptional<z.ZodObject<{
109
+ icon: z.ZodOptional<z.ZodString>;
110
+ color: z.ZodOptional<z.ZodString>;
111
+ dashboardComponent: z.ZodOptional<z.ZodString>;
112
+ }, z.core.$strip>>;
113
+ }, z.core.$strip>;
114
+ export type EntityDefinition = z.infer<typeof EntitySchema>;
115
+ export declare const TriggerSchema: z.ZodObject<{
116
+ id: z.ZodString;
117
+ type: z.ZodEnum<{
118
+ signal_change: "signal_change";
119
+ manual_action: "manual_action";
120
+ schedule: "schedule";
121
+ webhook: "webhook";
122
+ }>;
123
+ config: z.ZodRecord<z.ZodString, z.ZodAny>;
124
+ }, z.core.$strip>;
125
+ export declare const ActionSchema: z.ZodObject<{
126
+ id: z.ZodString;
127
+ type: z.ZodEnum<{
128
+ update_resource: "update_resource";
129
+ send_notification: "send_notification";
130
+ mqtt_publish: "mqtt_publish";
131
+ api_call: "api_call";
132
+ navigate: "navigate";
133
+ agent_task: "agent_task";
134
+ }>;
135
+ config: z.ZodRecord<z.ZodString, z.ZodAny>;
136
+ }, z.core.$strip>;
137
+ export declare const WorkflowSchema: z.ZodObject<{
138
+ id: z.ZodString;
139
+ name: z.ZodString;
140
+ active: z.ZodDefault<z.ZodBoolean>;
141
+ trigger: z.ZodObject<{
142
+ id: z.ZodString;
143
+ type: z.ZodEnum<{
144
+ signal_change: "signal_change";
145
+ manual_action: "manual_action";
146
+ schedule: "schedule";
147
+ webhook: "webhook";
148
+ }>;
149
+ config: z.ZodRecord<z.ZodString, z.ZodAny>;
150
+ }, z.core.$strip>;
151
+ actions: z.ZodArray<z.ZodObject<{
152
+ id: z.ZodString;
153
+ type: z.ZodEnum<{
154
+ update_resource: "update_resource";
155
+ send_notification: "send_notification";
156
+ mqtt_publish: "mqtt_publish";
157
+ api_call: "api_call";
158
+ navigate: "navigate";
159
+ agent_task: "agent_task";
160
+ }>;
161
+ config: z.ZodRecord<z.ZodString, z.ZodAny>;
162
+ }, z.core.$strip>>;
163
+ }, z.core.$strip>;
164
+ export type WorkflowDefinition = z.infer<typeof WorkflowSchema>;
165
+ export type ActionDefinition = z.infer<typeof ActionSchema>;
166
+ export declare const BlockSchema: z.ZodObject<{
167
+ id: z.ZodString;
168
+ type: z.ZodString;
169
+ props: z.ZodRecord<z.ZodString, z.ZodAny>;
170
+ layout: z.ZodOptional<z.ZodObject<{
171
+ colSpan: z.ZodOptional<z.ZodNumber>;
172
+ rowSpan: z.ZodOptional<z.ZodNumber>;
173
+ }, z.core.$strip>>;
174
+ }, z.core.$strip>;
175
+ export declare const PageSectionSchema: z.ZodObject<{
176
+ id: z.ZodString;
177
+ title: z.ZodOptional<z.ZodString>;
178
+ description: z.ZodOptional<z.ZodString>;
179
+ layout: z.ZodOptional<z.ZodObject<{
180
+ columns: z.ZodOptional<z.ZodNumber>;
181
+ variant: z.ZodOptional<z.ZodEnum<{
182
+ grid: "grid";
183
+ stack: "stack";
184
+ split: "split";
185
+ }>>;
186
+ }, z.core.$strip>>;
187
+ blocks: z.ZodArray<z.ZodObject<{
188
+ id: z.ZodString;
189
+ type: z.ZodString;
190
+ props: z.ZodRecord<z.ZodString, z.ZodAny>;
191
+ layout: z.ZodOptional<z.ZodObject<{
192
+ colSpan: z.ZodOptional<z.ZodNumber>;
193
+ rowSpan: z.ZodOptional<z.ZodNumber>;
194
+ }, z.core.$strip>>;
195
+ }, z.core.$strip>>;
196
+ }, z.core.$strip>;
197
+ export declare const PageSchema: z.ZodObject<{
198
+ id: z.ZodString;
199
+ slug: z.ZodString;
200
+ title: z.ZodString;
201
+ description: z.ZodOptional<z.ZodString>;
202
+ icon: z.ZodOptional<z.ZodString>;
203
+ sections: z.ZodArray<z.ZodObject<{
204
+ id: z.ZodString;
205
+ title: z.ZodOptional<z.ZodString>;
206
+ description: z.ZodOptional<z.ZodString>;
207
+ layout: z.ZodOptional<z.ZodObject<{
208
+ columns: z.ZodOptional<z.ZodNumber>;
209
+ variant: z.ZodOptional<z.ZodEnum<{
210
+ grid: "grid";
211
+ stack: "stack";
212
+ split: "split";
213
+ }>>;
214
+ }, z.core.$strip>>;
215
+ blocks: z.ZodArray<z.ZodObject<{
216
+ id: z.ZodString;
217
+ type: z.ZodString;
218
+ props: z.ZodRecord<z.ZodString, z.ZodAny>;
219
+ layout: z.ZodOptional<z.ZodObject<{
220
+ colSpan: z.ZodOptional<z.ZodNumber>;
221
+ rowSpan: z.ZodOptional<z.ZodNumber>;
222
+ }, z.core.$strip>>;
223
+ }, z.core.$strip>>;
224
+ }, z.core.$strip>>;
225
+ }, z.core.$strip>;
226
+ export type PageDefinition = z.infer<typeof PageSchema>;
227
+ export declare const AppSpecificationSchema: z.ZodObject<{
228
+ meta: z.ZodObject<{
229
+ name: z.ZodString;
230
+ version: z.ZodString;
231
+ description: z.ZodOptional<z.ZodString>;
232
+ author: z.ZodOptional<z.ZodString>;
233
+ createdAt: z.ZodOptional<z.ZodString>;
234
+ }, z.core.$strip>;
235
+ config: z.ZodObject<{
236
+ theme: z.ZodDefault<z.ZodEnum<{
237
+ light: "light";
238
+ dark: "dark";
239
+ system: "system";
240
+ corporate: "corporate";
241
+ midnight: "midnight";
242
+ blueprint: "blueprint";
243
+ }>>;
244
+ mockMode: z.ZodDefault<z.ZodBoolean>;
245
+ brokerUrl: z.ZodOptional<z.ZodString>;
246
+ }, z.core.$strip>;
247
+ modules: z.ZodOptional<z.ZodArray<z.ZodString>>;
248
+ resources: z.ZodOptional<z.ZodArray<z.ZodObject<{
249
+ id: z.ZodString;
250
+ name: z.ZodString;
251
+ fields: z.ZodArray<z.ZodObject<{
252
+ key: z.ZodString;
253
+ label: z.ZodString;
254
+ type: z.ZodEnum<{
255
+ number: "number";
256
+ boolean: "boolean";
257
+ text: "text";
258
+ currency: "currency";
259
+ date: "date";
260
+ status: "status";
261
+ email: "email";
262
+ image: "image";
263
+ textarea: "textarea";
264
+ }>;
265
+ required: z.ZodOptional<z.ZodBoolean>;
266
+ description: z.ZodOptional<z.ZodString>;
267
+ defaultValue: z.ZodOptional<z.ZodAny>;
268
+ }, z.core.$strip>>;
269
+ defaultView: z.ZodOptional<z.ZodEnum<{
270
+ table: "table";
271
+ grid: "grid";
272
+ list: "list";
273
+ }>>;
274
+ features: z.ZodOptional<z.ZodObject<{
275
+ searchable: z.ZodOptional<z.ZodBoolean>;
276
+ creatable: z.ZodOptional<z.ZodBoolean>;
277
+ editable: z.ZodOptional<z.ZodBoolean>;
278
+ deletable: z.ZodOptional<z.ZodBoolean>;
279
+ exportable: z.ZodOptional<z.ZodBoolean>;
280
+ }, z.core.$strip>>;
281
+ }, z.core.$strip>>>;
282
+ domain: z.ZodObject<{
283
+ signals: z.ZodArray<z.ZodObject<{
284
+ id: z.ZodString;
285
+ label: z.ZodString;
286
+ description: z.ZodOptional<z.ZodString>;
287
+ kind: z.ZodEnum<{
288
+ status: "status";
289
+ sensor: "sensor";
290
+ actuator: "actuator";
291
+ setpoint: "setpoint";
292
+ metric: "metric";
293
+ kpi: "kpi";
294
+ }>;
295
+ source: z.ZodEnum<{
296
+ mock: "mock";
297
+ mqtt: "mqtt";
298
+ http: "http";
299
+ derived: "derived";
300
+ local: "local";
301
+ }>;
302
+ topic: z.ZodOptional<z.ZodString>;
303
+ endpoint: z.ZodOptional<z.ZodString>;
304
+ jsonPath: z.ZodOptional<z.ZodString>;
305
+ refreshRate: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
306
+ defaultValue: z.ZodOptional<z.ZodAny>;
307
+ unit: z.ZodOptional<z.ZodString>;
308
+ min: z.ZodOptional<z.ZodNumber>;
309
+ max: z.ZodOptional<z.ZodNumber>;
310
+ }, z.core.$strip>>;
311
+ entities: z.ZodArray<z.ZodObject<{
312
+ id: z.ZodString;
313
+ name: z.ZodString;
314
+ description: z.ZodOptional<z.ZodString>;
315
+ type: z.ZodString;
316
+ category: z.ZodDefault<z.ZodString>;
317
+ signals: z.ZodArray<z.ZodString>;
318
+ ui: z.ZodOptional<z.ZodObject<{
319
+ icon: z.ZodOptional<z.ZodString>;
320
+ color: z.ZodOptional<z.ZodString>;
321
+ dashboardComponent: z.ZodOptional<z.ZodString>;
322
+ }, z.core.$strip>>;
323
+ }, z.core.$strip>>;
324
+ workflows: z.ZodOptional<z.ZodArray<z.ZodObject<{
325
+ id: z.ZodString;
326
+ name: z.ZodString;
327
+ active: z.ZodDefault<z.ZodBoolean>;
328
+ trigger: z.ZodObject<{
329
+ id: z.ZodString;
330
+ type: z.ZodEnum<{
331
+ signal_change: "signal_change";
332
+ manual_action: "manual_action";
333
+ schedule: "schedule";
334
+ webhook: "webhook";
335
+ }>;
336
+ config: z.ZodRecord<z.ZodString, z.ZodAny>;
337
+ }, z.core.$strip>;
338
+ actions: z.ZodArray<z.ZodObject<{
339
+ id: z.ZodString;
340
+ type: z.ZodEnum<{
341
+ update_resource: "update_resource";
342
+ send_notification: "send_notification";
343
+ mqtt_publish: "mqtt_publish";
344
+ api_call: "api_call";
345
+ navigate: "navigate";
346
+ agent_task: "agent_task";
347
+ }>;
348
+ config: z.ZodRecord<z.ZodString, z.ZodAny>;
349
+ }, z.core.$strip>>;
350
+ }, z.core.$strip>>>;
351
+ }, z.core.$strip>;
352
+ pages: z.ZodOptional<z.ZodArray<z.ZodObject<{
353
+ id: z.ZodString;
354
+ slug: z.ZodString;
355
+ title: z.ZodString;
356
+ description: z.ZodOptional<z.ZodString>;
357
+ icon: z.ZodOptional<z.ZodString>;
358
+ sections: z.ZodArray<z.ZodObject<{
359
+ id: z.ZodString;
360
+ title: z.ZodOptional<z.ZodString>;
361
+ description: z.ZodOptional<z.ZodString>;
362
+ layout: z.ZodOptional<z.ZodObject<{
363
+ columns: z.ZodOptional<z.ZodNumber>;
364
+ variant: z.ZodOptional<z.ZodEnum<{
365
+ grid: "grid";
366
+ stack: "stack";
367
+ split: "split";
368
+ }>>;
369
+ }, z.core.$strip>>;
370
+ blocks: z.ZodArray<z.ZodObject<{
371
+ id: z.ZodString;
372
+ type: z.ZodString;
373
+ props: z.ZodRecord<z.ZodString, z.ZodAny>;
374
+ layout: z.ZodOptional<z.ZodObject<{
375
+ colSpan: z.ZodOptional<z.ZodNumber>;
376
+ rowSpan: z.ZodOptional<z.ZodNumber>;
377
+ }, z.core.$strip>>;
378
+ }, z.core.$strip>>;
379
+ }, z.core.$strip>>;
380
+ }, z.core.$strip>>>;
381
+ }, z.core.$strip>;
382
+ export type AppSpecification = z.infer<typeof AppSpecificationSchema>;
383
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/engine/validation/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;GAeG;AAMH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;iBAOtB,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAYzB,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAOhE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBvB,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAE5D,eAAO,MAAM,YAAY;;;;;;;;;;;;iBAYvB,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAM5D,eAAO,MAAM,aAAa;;;;;;;;;iBAIxB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;iBAWvB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMzB,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAO5D,eAAO,MAAM,WAAW;;;;;;;;iBAQtB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;iBAS5B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAOrB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAIxD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}