@obinexusltd/obix-sdk-core 0.1.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.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * OBIX Core - Runtime engine for Heart/Soul UI/UX SDK
3
+ * Data-oriented component lifecycle management with intelligent state halting
4
+ */
5
+ export type { StateHaltConfig, LifecycleHandler, PolicyResult, Policy, Action, RenderFn, ComponentDefinition, ComponentLogic, ComponentInstance, HaltRecommendation } from "./types.js";
6
+ export { LifecycleHook } from "./types.js";
7
+ export { ObixRuntime } from "./runtime.js";
8
+ export { StateHaltEngine } from "./state-halting.js";
9
+ export { PolicyEngine } from "./policy.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,MAAM,EACN,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * OBIX Core - Runtime engine for Heart/Soul UI/UX SDK
3
+ * Data-oriented component lifecycle management with intelligent state halting
4
+ */
5
+ export { LifecycleHook } from "./types.js";
6
+ export { ObixRuntime } from "./runtime.js";
7
+ export { StateHaltEngine } from "./state-halting.js";
8
+ export { PolicyEngine } from "./policy.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Policy Engine
3
+ * Enforces policies on component instances
4
+ * Built-in policies prevent invalid component configurations
5
+ */
6
+ import { ComponentInstance, Policy, PolicyResult } from "./types.js";
7
+ /**
8
+ * PolicyEngine manages and enforces policies
9
+ */
10
+ export declare class PolicyEngine {
11
+ private policies;
12
+ constructor();
13
+ /**
14
+ * Register a custom policy
15
+ */
16
+ register<S = any>(policy: Policy<S>): void;
17
+ /**
18
+ * Enforce all applicable policies on an instance
19
+ */
20
+ enforce<S = any>(instance: ComponentInstance<S>): PolicyResult;
21
+ /**
22
+ * Register built-in policies
23
+ */
24
+ private registerBuiltInPolicies;
25
+ /**
26
+ * Calculate maximum depth of an object
27
+ */
28
+ private getObjectDepth;
29
+ }
30
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,MAAM,EACN,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAkC;;IAOlD;;OAEG;IACH,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAI1C;;OAEG;IACH,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,YAAY;IAgB9D;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8D/B;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB"}
package/dist/policy.js ADDED
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Policy Engine
3
+ * Enforces policies on component instances
4
+ * Built-in policies prevent invalid component configurations
5
+ */
6
+ /**
7
+ * PolicyEngine manages and enforces policies
8
+ */
9
+ export class PolicyEngine {
10
+ policies = new Map();
11
+ constructor() {
12
+ // Register built-in policies
13
+ this.registerBuiltInPolicies();
14
+ }
15
+ /**
16
+ * Register a custom policy
17
+ */
18
+ register(policy) {
19
+ this.policies.set(policy.name, policy);
20
+ }
21
+ /**
22
+ * Enforce all applicable policies on an instance
23
+ */
24
+ enforce(instance) {
25
+ const violations = [];
26
+ for (const [, policy] of this.policies) {
27
+ const result = policy.enforce(instance);
28
+ if (!result.passed) {
29
+ violations.push(...result.violations);
30
+ }
31
+ }
32
+ return {
33
+ passed: violations.length === 0,
34
+ violations
35
+ };
36
+ }
37
+ /**
38
+ * Register built-in policies
39
+ */
40
+ registerBuiltInPolicies() {
41
+ // Require component to have a render function
42
+ this.register({
43
+ name: "RequireRender",
44
+ enforce: (instance) => {
45
+ const hasFn = typeof instance.definition.render === "function";
46
+ return {
47
+ passed: hasFn,
48
+ violations: hasFn
49
+ ? []
50
+ : [
51
+ {
52
+ policy: "RequireRender",
53
+ message: "Component must define a render function"
54
+ }
55
+ ]
56
+ };
57
+ }
58
+ });
59
+ // Require component to have a name
60
+ this.register({
61
+ name: "RequireName",
62
+ enforce: (instance) => {
63
+ const hasName = typeof instance.definition.name === "string" && instance.definition.name.length > 0;
64
+ return {
65
+ passed: hasName,
66
+ violations: hasName
67
+ ? []
68
+ : [
69
+ {
70
+ policy: "RequireName",
71
+ message: "Component must define a non-empty name"
72
+ }
73
+ ]
74
+ };
75
+ }
76
+ });
77
+ // Limit state object depth to prevent circular references
78
+ this.register({
79
+ name: "MaxStateDepth",
80
+ enforce: (instance) => {
81
+ const maxDepth = 10;
82
+ const depth = this.getObjectDepth(instance.currentState);
83
+ const passed = depth <= maxDepth;
84
+ return {
85
+ passed,
86
+ violations: passed
87
+ ? []
88
+ : [
89
+ {
90
+ policy: "MaxStateDepth",
91
+ message: `State depth ${depth} exceeds maximum ${maxDepth}`
92
+ }
93
+ ]
94
+ };
95
+ }
96
+ });
97
+ }
98
+ /**
99
+ * Calculate maximum depth of an object
100
+ */
101
+ getObjectDepth(obj, visited = new WeakSet()) {
102
+ if (obj === null || typeof obj !== "object") {
103
+ return 0;
104
+ }
105
+ if (visited.has(obj)) {
106
+ return 0; // Circular reference
107
+ }
108
+ visited.add(obj);
109
+ let maxDepth = 0;
110
+ for (const key in obj) {
111
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
112
+ const childDepth = 1 + this.getObjectDepth(obj[key], visited);
113
+ maxDepth = Math.max(maxDepth, childDepth);
114
+ }
115
+ }
116
+ return maxDepth;
117
+ }
118
+ }
119
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * OBIX Runtime Engine
3
+ * Manages component lifecycle, state updates, and halting
4
+ * Data-oriented: accepts pure objects, not class instances
5
+ */
6
+ import { ComponentDefinition, ComponentInstance, LifecycleHandler, StateHaltConfig, Policy } from "./types.js";
7
+ /**
8
+ * ObixRuntime - Core runtime engine for OBIX components
9
+ */
10
+ export declare class ObixRuntime {
11
+ private registry;
12
+ private instances;
13
+ private lifecycleHandlers;
14
+ private stateHaltEngine;
15
+ private policyEngine;
16
+ private haltConfig;
17
+ private nextInstanceId;
18
+ constructor(haltConfig?: Partial<StateHaltConfig>, initialPolicies?: Policy[]);
19
+ /**
20
+ * Register a component definition
21
+ */
22
+ register<S = any>(definition: ComponentDefinition<S>): void;
23
+ /**
24
+ * Create an instance of a registered component
25
+ */
26
+ create<S = any>(componentName: string, initialState?: Partial<S>): ComponentInstance<S>;
27
+ /**
28
+ * Update instance state by applying an action
29
+ */
30
+ update<S = any, A extends any[] = any[]>(instanceId: string, actionName: string, ...args: A): ComponentInstance<S> | null;
31
+ /**
32
+ * Manually halt a component
33
+ */
34
+ halt(instanceId: string, reason?: string): ComponentInstance<any> | null;
35
+ /**
36
+ * Resume a halted component
37
+ */
38
+ resume(instanceId: string): ComponentInstance<any> | null;
39
+ /**
40
+ * Destroy a component instance
41
+ */
42
+ destroy(instanceId: string): void;
43
+ /**
44
+ * Subscribe to lifecycle events
45
+ */
46
+ onLifecycle(handler: LifecycleHandler): void;
47
+ /**
48
+ * Get an instance by ID
49
+ */
50
+ getInstance<S = any>(instanceId: string): ComponentInstance<S> | null;
51
+ /**
52
+ * Get all active instances
53
+ */
54
+ getInstances<S = any>(): ComponentInstance<S>[];
55
+ /**
56
+ * Get all registered components
57
+ */
58
+ getRegistered(): ComponentDefinition<any>[];
59
+ /**
60
+ * Check if instance state has stabilized and halt if needed
61
+ */
62
+ private checkStateStability;
63
+ /**
64
+ * Fire lifecycle hook to all subscribers
65
+ */
66
+ private fireLifecycleHook;
67
+ }
68
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAEjB,gBAAgB,EAChB,eAAe,EACf,MAAM,EACP,MAAM,YAAY,CAAC;AAapB;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAoD;IACpE,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,cAAc,CAAa;gBAGjC,UAAU,GAAE,OAAO,CAAC,eAAe,CAAM,EACzC,eAAe,GAAE,MAAM,EAAO;IAehC;;OAEG;IACH,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAO3D;;OAEG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EACZ,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GACxB,iBAAiB,CAAC,CAAC,CAAC;IA0CvB;;OAEG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,GAAG,IAAI,EAAE,CAAC,GACT,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAiD9B;;OAEG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAsB,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI;IAavF;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI;IAazD;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWjC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAI5C;;OAEG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAKrE;;OAEG;IACH,YAAY,CAAC,CAAC,GAAG,GAAG,KAAK,iBAAiB,CAAC,CAAC,CAAC,EAAE;IAI/C;;OAEG;IACH,aAAa,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE;IAI3C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAoB1B"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * OBIX Runtime Engine
3
+ * Manages component lifecycle, state updates, and halting
4
+ * Data-oriented: accepts pure objects, not class instances
5
+ */
6
+ import { LifecycleHook } from "./types.js";
7
+ import { StateHaltEngine } from "./state-halting.js";
8
+ import { PolicyEngine } from "./policy.js";
9
+ /**
10
+ * Default state halt configuration
11
+ */
12
+ const DEFAULT_HALT_CONFIG = {
13
+ maxRevisions: 100,
14
+ stabilityThreshold: 3,
15
+ haltOnPolicyViolation: true
16
+ };
17
+ /**
18
+ * ObixRuntime - Core runtime engine for OBIX components
19
+ */
20
+ export class ObixRuntime {
21
+ registry = new Map();
22
+ instances = new Map();
23
+ lifecycleHandlers = [];
24
+ stateHaltEngine;
25
+ policyEngine;
26
+ haltConfig;
27
+ nextInstanceId = 0;
28
+ constructor(haltConfig = {}, initialPolicies = []) {
29
+ this.haltConfig = { ...DEFAULT_HALT_CONFIG, ...haltConfig };
30
+ this.stateHaltEngine = new StateHaltEngine(this.haltConfig.maxRevisions, this.haltConfig.stabilityThreshold);
31
+ this.policyEngine = new PolicyEngine();
32
+ // Register custom policies
33
+ for (const policy of initialPolicies) {
34
+ this.policyEngine.register(policy);
35
+ }
36
+ }
37
+ /**
38
+ * Register a component definition
39
+ */
40
+ register(definition) {
41
+ if (!definition.name) {
42
+ throw new Error("Component definition must have a name");
43
+ }
44
+ this.registry.set(definition.name, definition);
45
+ }
46
+ /**
47
+ * Create an instance of a registered component
48
+ */
49
+ create(componentName, initialState) {
50
+ const definition = this.registry.get(componentName);
51
+ if (!definition) {
52
+ throw new Error(`Component '${componentName}' not registered`);
53
+ }
54
+ const instanceId = `${componentName}-${++this.nextInstanceId}`;
55
+ // Merge initial state with definition state
56
+ const currentState = {
57
+ ...definition.state,
58
+ ...(initialState || {})
59
+ };
60
+ const instance = {
61
+ id: instanceId,
62
+ definition,
63
+ currentState,
64
+ halted: false,
65
+ revision: 0,
66
+ createdAt: Date.now(),
67
+ lastUpdatedAt: Date.now()
68
+ };
69
+ this.instances.set(instanceId, instance);
70
+ this.stateHaltEngine.record(instanceId, currentState, 0);
71
+ // Enforce policies and fire lifecycle hook
72
+ const policyResult = this.policyEngine.enforce(instance);
73
+ if (!policyResult.passed) {
74
+ instance.policyViolations = policyResult.violations;
75
+ if (this.haltConfig.haltOnPolicyViolation) {
76
+ instance.halted = true;
77
+ instance.haltReason = "Policy violations on creation";
78
+ }
79
+ }
80
+ this.fireLifecycleHook(LifecycleHook.CREATED, instanceId, instance);
81
+ return instance;
82
+ }
83
+ /**
84
+ * Update instance state by applying an action
85
+ */
86
+ update(instanceId, actionName, ...args) {
87
+ const instance = this.instances.get(instanceId);
88
+ if (!instance) {
89
+ throw new Error(`Instance '${instanceId}' not found`);
90
+ }
91
+ if (instance.halted) {
92
+ console.warn(`Instance '${instanceId}' is halted, skipping update`);
93
+ return instance;
94
+ }
95
+ const action = instance.definition.actions[actionName];
96
+ if (!action) {
97
+ throw new Error(`Action '${actionName}' not found on component`);
98
+ }
99
+ // Apply action to get state delta
100
+ const stateDelta = action(...args);
101
+ const newState = {
102
+ ...instance.currentState,
103
+ ...stateDelta
104
+ };
105
+ // Update instance
106
+ instance.currentState = newState;
107
+ instance.revision++;
108
+ instance.lastUpdatedAt = Date.now();
109
+ // Record state for halting detection
110
+ this.stateHaltEngine.record(instanceId, newState, instance.revision);
111
+ // Check for state stability and halt if needed
112
+ this.checkStateStability(instanceId);
113
+ // Enforce policies
114
+ const policyResult = this.policyEngine.enforce(instance);
115
+ instance.policyViolations = policyResult.violations;
116
+ if (!policyResult.passed && this.haltConfig.haltOnPolicyViolation) {
117
+ instance.halted = true;
118
+ instance.haltReason = "Policy violation detected";
119
+ this.fireLifecycleHook(LifecycleHook.HALTED, instanceId, instance);
120
+ }
121
+ else {
122
+ this.fireLifecycleHook(LifecycleHook.UPDATED, instanceId, instance);
123
+ }
124
+ return instance;
125
+ }
126
+ /**
127
+ * Manually halt a component
128
+ */
129
+ halt(instanceId, reason = "Manual halt") {
130
+ const instance = this.instances.get(instanceId);
131
+ if (!instance) {
132
+ throw new Error(`Instance '${instanceId}' not found`);
133
+ }
134
+ instance.halted = true;
135
+ instance.haltReason = reason;
136
+ this.fireLifecycleHook(LifecycleHook.HALTED, instanceId, instance);
137
+ return instance;
138
+ }
139
+ /**
140
+ * Resume a halted component
141
+ */
142
+ resume(instanceId) {
143
+ const instance = this.instances.get(instanceId);
144
+ if (!instance) {
145
+ throw new Error(`Instance '${instanceId}' not found`);
146
+ }
147
+ instance.halted = false;
148
+ instance.haltReason = undefined;
149
+ this.stateHaltEngine.clear(instanceId);
150
+ return instance;
151
+ }
152
+ /**
153
+ * Destroy a component instance
154
+ */
155
+ destroy(instanceId) {
156
+ const instance = this.instances.get(instanceId);
157
+ if (!instance) {
158
+ throw new Error(`Instance '${instanceId}' not found`);
159
+ }
160
+ this.fireLifecycleHook(LifecycleHook.DESTROYED, instanceId, instance);
161
+ this.instances.delete(instanceId);
162
+ this.stateHaltEngine.clear(instanceId);
163
+ }
164
+ /**
165
+ * Subscribe to lifecycle events
166
+ */
167
+ onLifecycle(handler) {
168
+ this.lifecycleHandlers.push(handler);
169
+ }
170
+ /**
171
+ * Get an instance by ID
172
+ */
173
+ getInstance(instanceId) {
174
+ const instance = this.instances.get(instanceId);
175
+ return instance ? instance : null;
176
+ }
177
+ /**
178
+ * Get all active instances
179
+ */
180
+ getInstances() {
181
+ return Array.from(this.instances.values());
182
+ }
183
+ /**
184
+ * Get all registered components
185
+ */
186
+ getRegistered() {
187
+ return Array.from(this.registry.values());
188
+ }
189
+ /**
190
+ * Check if instance state has stabilized and halt if needed
191
+ */
192
+ checkStateStability(instanceId) {
193
+ const instance = this.instances.get(instanceId);
194
+ if (!instance || instance.halted)
195
+ return;
196
+ const recommendation = this.stateHaltEngine.getHaltRecommendation(instanceId);
197
+ if (recommendation.shouldHalt) {
198
+ instance.halted = true;
199
+ instance.haltReason = recommendation.reason;
200
+ this.fireLifecycleHook(LifecycleHook.HALTED, instanceId, instance);
201
+ }
202
+ }
203
+ /**
204
+ * Fire lifecycle hook to all subscribers
205
+ */
206
+ fireLifecycleHook(hook, instanceId, instance) {
207
+ const timestamp = Date.now();
208
+ for (const handler of this.lifecycleHandlers) {
209
+ try {
210
+ handler({
211
+ hook,
212
+ instanceId,
213
+ instance,
214
+ timestamp
215
+ });
216
+ }
217
+ catch (error) {
218
+ console.error(`Error in lifecycle handler for ${hook}:`, error);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * State Halting Engine
3
+ * Implements intelligent caching through state stability detection
4
+ * Stops processing when component state is stable enough
5
+ */
6
+ import { HaltRecommendation } from "./types.js";
7
+ /**
8
+ * StateHaltEngine tracks state history and determines stability
9
+ */
10
+ export declare class StateHaltEngine {
11
+ private stateHistory;
12
+ private readonly maxHistoryDepth;
13
+ private readonly stabilityThreshold;
14
+ constructor(maxHistoryDepth?: number, stabilityThreshold?: number);
15
+ /**
16
+ * Record a state snapshot for an instance
17
+ */
18
+ record<S>(instanceId: string, state: S, revision: number): void;
19
+ /**
20
+ * Check if state has stabilized for an instance
21
+ */
22
+ isStable<S>(instanceId: string): boolean;
23
+ /**
24
+ * Get halt recommendation for an instance
25
+ */
26
+ getHaltRecommendation(instanceId: string): HaltRecommendation;
27
+ /**
28
+ * Clear history for an instance
29
+ */
30
+ clear(instanceId: string): void;
31
+ /**
32
+ * Clear all history
33
+ */
34
+ clearAll(): void;
35
+ /**
36
+ * Deep equality check for state objects
37
+ */
38
+ private deepEqual;
39
+ /**
40
+ * Deep clone state object
41
+ */
42
+ private deepClone;
43
+ }
44
+ //# sourceMappingURL=state-halting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-halting.d.ts","sourceRoot":"","sources":["../src/state-halting.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQhD;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,eAAe,GAAE,MAAW,EAAE,kBAAkB,GAAE,MAAU;IAKxE;;OAEG;IACH,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAkB/D;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAexC;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB;IAiC7D;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,OAAO,CAAC,SAAS;IAoBjB;;OAEG;IACH,OAAO,CAAC,SAAS;CAYlB"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * State Halting Engine
3
+ * Implements intelligent caching through state stability detection
4
+ * Stops processing when component state is stable enough
5
+ */
6
+ /**
7
+ * StateHaltEngine tracks state history and determines stability
8
+ */
9
+ export class StateHaltEngine {
10
+ stateHistory = new Map();
11
+ maxHistoryDepth;
12
+ stabilityThreshold;
13
+ constructor(maxHistoryDepth = 10, stabilityThreshold = 3) {
14
+ this.maxHistoryDepth = maxHistoryDepth;
15
+ this.stabilityThreshold = stabilityThreshold;
16
+ }
17
+ /**
18
+ * Record a state snapshot for an instance
19
+ */
20
+ record(instanceId, state, revision) {
21
+ if (!this.stateHistory.has(instanceId)) {
22
+ this.stateHistory.set(instanceId, []);
23
+ }
24
+ const history = this.stateHistory.get(instanceId);
25
+ history.push({
26
+ state: this.deepClone(state),
27
+ revision,
28
+ timestamp: Date.now()
29
+ });
30
+ // Keep history within max depth
31
+ if (history.length > this.maxHistoryDepth) {
32
+ history.shift();
33
+ }
34
+ }
35
+ /**
36
+ * Check if state has stabilized for an instance
37
+ */
38
+ isStable(instanceId) {
39
+ const history = this.stateHistory.get(instanceId);
40
+ if (!history || history.length < this.stabilityThreshold) {
41
+ return false;
42
+ }
43
+ // Check last N states are identical (deep compare)
44
+ const recentStates = history.slice(-this.stabilityThreshold);
45
+ const firstState = recentStates[0].state;
46
+ return recentStates.every(snapshot => this.deepEqual(snapshot.state, firstState));
47
+ }
48
+ /**
49
+ * Get halt recommendation for an instance
50
+ */
51
+ getHaltRecommendation(instanceId) {
52
+ const history = this.stateHistory.get(instanceId);
53
+ if (!history || history.length === 0) {
54
+ return {
55
+ shouldHalt: false,
56
+ stableForRevisions: 0
57
+ };
58
+ }
59
+ if (this.isStable(instanceId)) {
60
+ // Count how many revisions are stable
61
+ const firstStableIndex = history.length - 1;
62
+ for (let i = history.length - 1; i >= 0; i--) {
63
+ if (!this.deepEqual(history[i].state, history[history.length - 1].state)) {
64
+ break;
65
+ }
66
+ }
67
+ const stableCount = history.length > 0 ? history.length : 0;
68
+ return {
69
+ shouldHalt: true,
70
+ reason: "State has stabilized - no changes detected",
71
+ stableForRevisions: stableCount
72
+ };
73
+ }
74
+ return {
75
+ shouldHalt: false,
76
+ stableForRevisions: 0
77
+ };
78
+ }
79
+ /**
80
+ * Clear history for an instance
81
+ */
82
+ clear(instanceId) {
83
+ this.stateHistory.delete(instanceId);
84
+ }
85
+ /**
86
+ * Clear all history
87
+ */
88
+ clearAll() {
89
+ this.stateHistory.clear();
90
+ }
91
+ /**
92
+ * Deep equality check for state objects
93
+ */
94
+ deepEqual(a, b) {
95
+ if (a === b)
96
+ return true;
97
+ if (a == null || b == null)
98
+ return a === b;
99
+ if (typeof a !== typeof b)
100
+ return false;
101
+ if (typeof a !== "object")
102
+ return a === b;
103
+ const keysA = Object.keys(a);
104
+ const keysB = Object.keys(b);
105
+ if (keysA.length !== keysB.length)
106
+ return false;
107
+ for (const key of keysA) {
108
+ if (!keysB.includes(key))
109
+ return false;
110
+ if (!this.deepEqual(a[key], b[key]))
111
+ return false;
112
+ }
113
+ return true;
114
+ }
115
+ /**
116
+ * Deep clone state object
117
+ */
118
+ deepClone(obj) {
119
+ if (obj === null || typeof obj !== "object")
120
+ return obj;
121
+ if (Array.isArray(obj))
122
+ return obj.map(item => this.deepClone(item));
123
+ const cloned = {};
124
+ for (const key in obj) {
125
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
126
+ cloned[key] = this.deepClone(obj[key]);
127
+ }
128
+ }
129
+ return cloned;
130
+ }
131
+ }
132
+ //# sourceMappingURL=state-halting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-halting.js","sourceRoot":"","sources":["../src/state-halting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Core type definitions for OBIX runtime engine
3
+ * Implements data-oriented component lifecycle management
4
+ */
5
+ /**
6
+ * Configuration for state halting behavior
7
+ */
8
+ export interface StateHaltConfig {
9
+ /** Maximum number of revisions to track before mandatory halt */
10
+ maxRevisions: number;
11
+ /** Number of identical states needed to determine stability (deep compare) */
12
+ stabilityThreshold: number;
13
+ /** Whether to halt component if policy enforcement fails */
14
+ haltOnPolicyViolation: boolean;
15
+ }
16
+ /**
17
+ * Lifecycle event types
18
+ */
19
+ export declare enum LifecycleHook {
20
+ CREATED = "CREATED",
21
+ MOUNTED = "MOUNTED",
22
+ UPDATED = "UPDATED",
23
+ HALTED = "HALTED",
24
+ DESTROYED = "DESTROYED"
25
+ }
26
+ /**
27
+ * Lifecycle event handler callback
28
+ */
29
+ export type LifecycleHandler<S = any> = (event: {
30
+ hook: LifecycleHook;
31
+ instanceId: string;
32
+ instance?: ComponentInstance<S>;
33
+ timestamp: number;
34
+ }) => void | Promise<void>;
35
+ /**
36
+ * Policy enforcement result
37
+ */
38
+ export interface PolicyResult {
39
+ passed: boolean;
40
+ violations: Array<{
41
+ policy: string;
42
+ message: string;
43
+ }>;
44
+ }
45
+ /**
46
+ * Named policy that can be enforced on component instances
47
+ */
48
+ export interface Policy<S = any> {
49
+ name: string;
50
+ enforce: (instance: ComponentInstance<S>) => PolicyResult;
51
+ }
52
+ /**
53
+ * Plain object action that modifies component state
54
+ */
55
+ export interface Action<S = any, A extends any[] = any[]> {
56
+ (...args: A): Partial<S>;
57
+ }
58
+ /**
59
+ * Render function for component UI representation
60
+ */
61
+ export type RenderFn<S = any> = (state: S) => any;
62
+ /**
63
+ * Component definition - plain data object describing component structure
64
+ * Data-oriented: no classes, pure configuration
65
+ */
66
+ export interface ComponentDefinition<S = any> {
67
+ name: string;
68
+ state: S;
69
+ actions: Record<string, Action<S, any>>;
70
+ render: RenderFn<S>;
71
+ policies?: Policy<S>[];
72
+ }
73
+ /**
74
+ * Active instance of a component with runtime state
75
+ */
76
+ export interface ComponentInstance<S = any> {
77
+ id: string;
78
+ definition: ComponentDefinition<S>;
79
+ currentState: S;
80
+ halted: boolean;
81
+ haltReason?: string;
82
+ revision: number;
83
+ createdAt: number;
84
+ lastUpdatedAt: number;
85
+ policyViolations?: Array<{
86
+ policy: string;
87
+ message: string;
88
+ }>;
89
+ }
90
+ /**
91
+ * Component logic - alias for ComponentDefinition used in adapter/component contexts
92
+ * Represents the pure data description of a component's behavior
93
+ */
94
+ export type ComponentLogic<S = any> = ComponentDefinition<S>;
95
+ /**
96
+ * State stability recommendation from state halt engine
97
+ */
98
+ export interface HaltRecommendation {
99
+ shouldHalt: boolean;
100
+ reason?: string;
101
+ stableForRevisions: number;
102
+ }
103
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,kBAAkB,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,KAAK,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE;IACtD,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,GAAG;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACnC,YAAY,EAAE,CAAC,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,KAAK,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
package/dist/types.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Core type definitions for OBIX runtime engine
3
+ * Implements data-oriented component lifecycle management
4
+ */
5
+ /**
6
+ * Lifecycle event types
7
+ */
8
+ export var LifecycleHook;
9
+ (function (LifecycleHook) {
10
+ LifecycleHook["CREATED"] = "CREATED";
11
+ LifecycleHook["MOUNTED"] = "MOUNTED";
12
+ LifecycleHook["UPDATED"] = "UPDATED";
13
+ LifecycleHook["HALTED"] = "HALTED";
14
+ LifecycleHook["DESTROYED"] = "DESTROYED";
15
+ })(LifecycleHook || (LifecycleHook = {}));
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;GAEG;AACH,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,kCAAiB,CAAA;IACjB,wCAAuB,CAAA;AACzB,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@obinexusltd/obix-sdk-core",
3
+ "version": "0.1.0",
4
+ "description": "OBIX Heart/Soul UI/UX runtime engine - component lifecycle, state halting, data-oriented architecture",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "test": "vitest run",
11
+ "test:watch": "vitest"
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/index.js",
19
+ "types": "./dist/index.d.ts"
20
+ }
21
+ },
22
+ "license": "MIT",
23
+ "author": "OBINexus <okpalan@protonmail.com>",
24
+ "publishConfig": {
25
+ "access": "public"
26
+ }
27
+ }