@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.
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/policy.d.ts +30 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +119 -0
- package/dist/policy.js.map +1 -0
- package/dist/runtime.d.ts +68 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +223 -0
- package/dist/runtime.js.map +1 -0
- package/dist/state-halting.d.ts +44 -0
- package/dist/state-halting.d.ts.map +1 -0
- package/dist/state-halting.js +132 -0
- package/dist/state-halting.js.map +1 -0
- package/dist/types.d.ts +103 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +27 -0
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/policy.d.ts
ADDED
|
@@ -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"}
|
package/dist/runtime.js
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
+
}
|