@orcalang/orca-runtime-ts 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/bus.d.ts +46 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/bus.js +148 -0
- package/dist/bus.js.map +1 -0
- package/dist/effects.d.ts +13 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +33 -0
- package/dist/effects.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +46 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +59 -0
- package/dist/logging.js.map +1 -0
- package/dist/machine.d.ts +119 -0
- package/dist/machine.d.ts.map +1 -0
- package/dist/machine.js +785 -0
- package/dist/machine.js.map +1 -0
- package/dist/parser.d.ts +25 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +737 -0
- package/dist/parser.js.map +1 -0
- package/dist/persistence.d.ts +20 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +34 -0
- package/dist/persistence.js.map +1 -0
- package/dist/types.d.ts +138 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +95 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
package/dist/bus.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async event bus with pub/sub and request/response patterns.
|
|
3
|
+
*/
|
|
4
|
+
import type { Effect, EffectResult } from "./types.js";
|
|
5
|
+
import type { EffectHandler } from "./effects.js";
|
|
6
|
+
export declare const EventType: {
|
|
7
|
+
readonly STATE_CHANGED: "orca.state.changed";
|
|
8
|
+
readonly TRANSITION_STARTED: "orca.transition.started";
|
|
9
|
+
readonly TRANSITION_COMPLETED: "orca.transition.completed";
|
|
10
|
+
readonly EFFECT_EXECUTING: "orca.effect.executing";
|
|
11
|
+
readonly EFFECT_COMPLETED: "orca.effect.completed";
|
|
12
|
+
readonly EFFECT_FAILED: "orca.effect.failed";
|
|
13
|
+
readonly MACHINE_STARTED: "orca.machine.started";
|
|
14
|
+
readonly MACHINE_STOPPED: "orca.machine.stopped";
|
|
15
|
+
readonly WORKFLOW_STATE_CHANGED: "workflow.state.changed";
|
|
16
|
+
readonly AGENT_TASK_ASSIGNED: "agent.task.assigned";
|
|
17
|
+
readonly AGENT_TASK_COMPLETED: "agent.task.completed";
|
|
18
|
+
readonly SCHEDULING_QUERY: "scheduling.query";
|
|
19
|
+
readonly SCHEDULING_QUERY_RESPONSE: "scheduling.query_response";
|
|
20
|
+
};
|
|
21
|
+
export type EventType = (typeof EventType)[keyof typeof EventType];
|
|
22
|
+
export interface Event {
|
|
23
|
+
type: EventType;
|
|
24
|
+
source: string;
|
|
25
|
+
eventName?: string;
|
|
26
|
+
correlationId?: string;
|
|
27
|
+
timestamp: Date;
|
|
28
|
+
payload: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export type EventHandler = (event: Event) => Promise<void>;
|
|
31
|
+
export declare class EventBus {
|
|
32
|
+
private subscribers;
|
|
33
|
+
private effectHandlers;
|
|
34
|
+
private responseQueues;
|
|
35
|
+
subscribe(eventType: EventType, handler: EventHandler): void;
|
|
36
|
+
unsubscribe(eventType: EventType, handler: EventHandler): void;
|
|
37
|
+
publish(event: Event): Promise<void>;
|
|
38
|
+
registerEffectHandler(effectType: string, handler: EffectHandler): void;
|
|
39
|
+
unregisterEffectHandler(effectType: string): void;
|
|
40
|
+
executeEffect(effect: Effect): Promise<EffectResult>;
|
|
41
|
+
requestResponse<T = unknown>(requestType: EventType, requestPayload: Record<string, unknown>, responseType: EventType, correlationId?: string, timeout?: number, source?: string): Promise<T>;
|
|
42
|
+
get effectHandlerTypes(): string[];
|
|
43
|
+
}
|
|
44
|
+
export declare function getEventBus(): EventBus;
|
|
45
|
+
export declare function resetEventBus(): void;
|
|
46
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;CAcZ,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3D,qBAAa,QAAQ;IACnB,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,cAAc,CAAwC;IAE9D,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAO5D,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAOxD,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1C,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAIvE,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI3C,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmBpD,eAAe,CAAC,CAAC,GAAG,OAAO,EAC/B,WAAW,EAAE,SAAS,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,YAAY,EAAE,SAAS,EACvB,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,SAAO,EACd,MAAM,SAAS,GACd,OAAO,CAAC,CAAC,CAAC;IAkCb,IAAI,kBAAkB,IAAI,MAAM,EAAE,CAEjC;CACF;AA2CD,wBAAgB,WAAW,IAAI,QAAQ,CAKtC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
package/dist/bus.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async event bus with pub/sub and request/response patterns.
|
|
3
|
+
*/
|
|
4
|
+
export const EventType = {
|
|
5
|
+
STATE_CHANGED: "orca.state.changed",
|
|
6
|
+
TRANSITION_STARTED: "orca.transition.started",
|
|
7
|
+
TRANSITION_COMPLETED: "orca.transition.completed",
|
|
8
|
+
EFFECT_EXECUTING: "orca.effect.executing",
|
|
9
|
+
EFFECT_COMPLETED: "orca.effect.completed",
|
|
10
|
+
EFFECT_FAILED: "orca.effect.failed",
|
|
11
|
+
MACHINE_STARTED: "orca.machine.started",
|
|
12
|
+
MACHINE_STOPPED: "orca.machine.stopped",
|
|
13
|
+
WORKFLOW_STATE_CHANGED: "workflow.state.changed",
|
|
14
|
+
AGENT_TASK_ASSIGNED: "agent.task.assigned",
|
|
15
|
+
AGENT_TASK_COMPLETED: "agent.task.completed",
|
|
16
|
+
SCHEDULING_QUERY: "scheduling.query",
|
|
17
|
+
SCHEDULING_QUERY_RESPONSE: "scheduling.query_response",
|
|
18
|
+
};
|
|
19
|
+
export class EventBus {
|
|
20
|
+
subscribers = new Map();
|
|
21
|
+
effectHandlers = new Map();
|
|
22
|
+
responseQueues = new Map();
|
|
23
|
+
subscribe(eventType, handler) {
|
|
24
|
+
if (!this.subscribers.has(eventType)) {
|
|
25
|
+
this.subscribers.set(eventType, new Set());
|
|
26
|
+
}
|
|
27
|
+
this.subscribers.get(eventType).add(handler);
|
|
28
|
+
}
|
|
29
|
+
unsubscribe(eventType, handler) {
|
|
30
|
+
const handlers = this.subscribers.get(eventType);
|
|
31
|
+
if (handlers) {
|
|
32
|
+
handlers.delete(handler);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async publish(event) {
|
|
36
|
+
const handlers = this.subscribers.get(event.type);
|
|
37
|
+
if (!handlers || handlers.size === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const promises = [];
|
|
41
|
+
for (const handler of handlers) {
|
|
42
|
+
promises.push(handler(event).catch(() => { }));
|
|
43
|
+
}
|
|
44
|
+
await Promise.all(promises);
|
|
45
|
+
}
|
|
46
|
+
registerEffectHandler(effectType, handler) {
|
|
47
|
+
this.effectHandlers.set(effectType, handler);
|
|
48
|
+
}
|
|
49
|
+
unregisterEffectHandler(effectType) {
|
|
50
|
+
this.effectHandlers.delete(effectType);
|
|
51
|
+
}
|
|
52
|
+
async executeEffect(effect) {
|
|
53
|
+
const handler = this.effectHandlers.get(effect.type);
|
|
54
|
+
if (!handler) {
|
|
55
|
+
return {
|
|
56
|
+
status: "failure",
|
|
57
|
+
error: `No handler registered for effect type: ${effect.type}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
return await handler(effect);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return {
|
|
65
|
+
status: "failure",
|
|
66
|
+
error: error instanceof Error ? error.message : String(error),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async requestResponse(requestType, requestPayload, responseType, correlationId, timeout = 5000, source = "orca") {
|
|
71
|
+
const corrId = correlationId ?? crypto.randomUUID();
|
|
72
|
+
const responseQueue = new AsyncQueue();
|
|
73
|
+
this.responseQueues.set(corrId, responseQueue);
|
|
74
|
+
const responseHandler = async (event) => {
|
|
75
|
+
if (event.correlationId === corrId) {
|
|
76
|
+
responseQueue.push(event);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
this.subscribe(responseType, responseHandler);
|
|
80
|
+
try {
|
|
81
|
+
await this.publish({
|
|
82
|
+
type: requestType,
|
|
83
|
+
source,
|
|
84
|
+
correlationId: corrId,
|
|
85
|
+
timestamp: new Date(),
|
|
86
|
+
payload: requestPayload,
|
|
87
|
+
});
|
|
88
|
+
const event = await responseQueue.pop(timeout);
|
|
89
|
+
return event.payload;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
throw new Error(`Request ${corrId} timed out after ${timeout}ms`);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
this.unsubscribe(responseType, responseHandler);
|
|
96
|
+
this.responseQueues.delete(corrId);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
get effectHandlerTypes() {
|
|
100
|
+
return Array.from(this.effectHandlers.keys());
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Simple async queue for event bus request/response.
|
|
105
|
+
*/
|
|
106
|
+
class AsyncQueue {
|
|
107
|
+
queue = [];
|
|
108
|
+
resolvers = [];
|
|
109
|
+
push(value) {
|
|
110
|
+
if (this.resolvers.length > 0) {
|
|
111
|
+
const resolve = this.resolvers.shift();
|
|
112
|
+
resolve(value);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
this.queue.push(value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async pop(timeout) {
|
|
119
|
+
if (this.queue.length > 0) {
|
|
120
|
+
return this.queue.shift();
|
|
121
|
+
}
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
const timer = setTimeout(() => {
|
|
124
|
+
const index = this.resolvers.indexOf(resolve);
|
|
125
|
+
if (index !== -1) {
|
|
126
|
+
this.resolvers.splice(index, 1);
|
|
127
|
+
}
|
|
128
|
+
reject(new Error("Timeout"));
|
|
129
|
+
}, timeout);
|
|
130
|
+
this.resolvers.push((value) => {
|
|
131
|
+
clearTimeout(timer);
|
|
132
|
+
resolve(value);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Global event bus instance
|
|
138
|
+
let globalBus = null;
|
|
139
|
+
export function getEventBus() {
|
|
140
|
+
if (!globalBus) {
|
|
141
|
+
globalBus = new EventBus();
|
|
142
|
+
}
|
|
143
|
+
return globalBus;
|
|
144
|
+
}
|
|
145
|
+
export function resetEventBus() {
|
|
146
|
+
globalBus = null;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=bus.js.map
|
package/dist/bus.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect types for Orca runtime.
|
|
3
|
+
*/
|
|
4
|
+
import type { Effect, EffectResult } from "./types.js";
|
|
5
|
+
export type { Effect, EffectResult } from "./types.js";
|
|
6
|
+
export type EffectHandler = (effect: Effect) => Promise<EffectResult>;
|
|
7
|
+
export interface EffectRouter {
|
|
8
|
+
route(effect: Effect): Promise<EffectResult>;
|
|
9
|
+
registerHandler(effectType: string, handler: EffectHandler): void;
|
|
10
|
+
unregisterHandler(effectType: string): void;
|
|
11
|
+
}
|
|
12
|
+
export declare function createEffectRouter(): EffectRouter;
|
|
13
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CA+BjD"}
|
package/dist/effects.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect types for Orca runtime.
|
|
3
|
+
*/
|
|
4
|
+
export function createEffectRouter() {
|
|
5
|
+
const handlers = new Map();
|
|
6
|
+
return {
|
|
7
|
+
async route(effect) {
|
|
8
|
+
const handler = handlers.get(effect.type);
|
|
9
|
+
if (!handler) {
|
|
10
|
+
return {
|
|
11
|
+
status: "failure",
|
|
12
|
+
error: `No handler registered for effect type: ${effect.type}`,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
return await handler(effect);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return {
|
|
20
|
+
status: "failure",
|
|
21
|
+
error: error instanceof Error ? error.message : String(error),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
registerHandler(effectType, handler) {
|
|
26
|
+
handlers.set(effectType, handler);
|
|
27
|
+
},
|
|
28
|
+
unregisterHandler(effectType) {
|
|
29
|
+
handlers.delete(effectType);
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAElD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,MAAc;YACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,0CAA0C,MAAM,CAAC,IAAI,EAAE;iBAC/D,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,eAAe,CAAC,UAAkB,EAAE,OAAsB;YACxD,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,iBAAiB,CAAC,UAAkB;YAClC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orca Runtime TypeScript
|
|
3
|
+
*
|
|
4
|
+
* A first-class TypeScript async runtime for Orca state machines.
|
|
5
|
+
*/
|
|
6
|
+
export type { Context, StateDef, Transition, GuardDef, ActionSignature, MachineDef, GuardExpression, Effect, EffectResult, EffectStatus, EffectDef, } from "./types.js";
|
|
7
|
+
export { StateValue } from "./types.js";
|
|
8
|
+
export { EventBus, getEventBus, resetEventBus, EventType } from "./bus.js";
|
|
9
|
+
export type { Event, EventHandler } from "./bus.js";
|
|
10
|
+
export type { EffectHandler, EffectRouter } from "./effects.js";
|
|
11
|
+
export { createEffectRouter } from "./effects.js";
|
|
12
|
+
export { OrcaMachine } from "./machine.js";
|
|
13
|
+
export type { TransitionCallback, TransitionResult, ActionHandler } from "./machine.js";
|
|
14
|
+
export { parseOrcaMd, parseOrcaAuto, ParseError } from "./parser.js";
|
|
15
|
+
export type { PersistenceAdapter } from "./persistence.js";
|
|
16
|
+
export { FilePersistence } from "./persistence.js";
|
|
17
|
+
export type { LogSink, LogEntry } from "./logging.js";
|
|
18
|
+
export { FileSink, ConsoleSink, MultiSink, makeEntry } from "./logging.js";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,eAAe,EACf,UAAU,EACV,eAAe,EACf,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC3E,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGpD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGxF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGrE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orca Runtime TypeScript
|
|
3
|
+
*
|
|
4
|
+
* A first-class TypeScript async runtime for Orca state machines.
|
|
5
|
+
*/
|
|
6
|
+
export { StateValue } from "./types.js";
|
|
7
|
+
// Event Bus
|
|
8
|
+
export { EventBus, getEventBus, resetEventBus, EventType } from "./bus.js";
|
|
9
|
+
export { createEffectRouter } from "./effects.js";
|
|
10
|
+
// Machine
|
|
11
|
+
export { OrcaMachine } from "./machine.js";
|
|
12
|
+
// Parser
|
|
13
|
+
export { parseOrcaMd, parseOrcaAuto, ParseError } from "./parser.js";
|
|
14
|
+
export { FilePersistence } from "./persistence.js";
|
|
15
|
+
export { FileSink, ConsoleSink, MultiSink, makeEntry } from "./logging.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIrE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured audit logging for Orca machine transitions.
|
|
3
|
+
*
|
|
4
|
+
* LogSink protocol with three implementations:
|
|
5
|
+
* FileSink — JSONL append, one entry per transition
|
|
6
|
+
* ConsoleSink — human-readable [HH:MM:SS] Machine from → to (EVENT) key=val
|
|
7
|
+
* MultiSink — fan-out to multiple sinks simultaneously
|
|
8
|
+
*/
|
|
9
|
+
export interface LogEntry {
|
|
10
|
+
ts: string;
|
|
11
|
+
run_id: string;
|
|
12
|
+
machine: string;
|
|
13
|
+
event: string;
|
|
14
|
+
from: string;
|
|
15
|
+
to: string;
|
|
16
|
+
context_delta: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface LogSink {
|
|
19
|
+
write(entry: LogEntry): void;
|
|
20
|
+
close(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class FileSink implements LogSink {
|
|
23
|
+
private readonly path;
|
|
24
|
+
constructor(path: string);
|
|
25
|
+
write(entry: LogEntry): void;
|
|
26
|
+
close(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare class ConsoleSink implements LogSink {
|
|
29
|
+
write(entry: LogEntry): void;
|
|
30
|
+
close(): void;
|
|
31
|
+
}
|
|
32
|
+
export declare class MultiSink implements LogSink {
|
|
33
|
+
private readonly sinks;
|
|
34
|
+
constructor(...sinks: LogSink[]);
|
|
35
|
+
write(entry: LogEntry): void;
|
|
36
|
+
close(): void;
|
|
37
|
+
}
|
|
38
|
+
export declare function makeEntry(options: {
|
|
39
|
+
runId: string;
|
|
40
|
+
machine: string;
|
|
41
|
+
event: string;
|
|
42
|
+
from: string;
|
|
43
|
+
to: string;
|
|
44
|
+
contextDelta: Record<string, unknown>;
|
|
45
|
+
}): LogEntry;
|
|
46
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,qBAAa,QAAS,YAAW,OAAO;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAIzC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI5B,KAAK,IAAI,IAAI;CACd;AAED,qBAAa,WAAY,YAAW,OAAO;IACzC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAU5B,KAAK,IAAI,IAAI;CACd;AAED,qBAAa,SAAU,YAAW,OAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,GAAG,KAAK,EAAE,OAAO,EAAE;IAI/B,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI5B,KAAK,IAAI,IAAI;CAGd;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,GAAG,QAAQ,CAUX"}
|
package/dist/logging.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured audit logging for Orca machine transitions.
|
|
3
|
+
*
|
|
4
|
+
* LogSink protocol with three implementations:
|
|
5
|
+
* FileSink — JSONL append, one entry per transition
|
|
6
|
+
* ConsoleSink — human-readable [HH:MM:SS] Machine from → to (EVENT) key=val
|
|
7
|
+
* MultiSink — fan-out to multiple sinks simultaneously
|
|
8
|
+
*/
|
|
9
|
+
import { appendFileSync, mkdirSync } from "fs";
|
|
10
|
+
import { dirname } from "path";
|
|
11
|
+
export class FileSink {
|
|
12
|
+
path;
|
|
13
|
+
constructor(path) {
|
|
14
|
+
this.path = path;
|
|
15
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
write(entry) {
|
|
18
|
+
appendFileSync(this.path, JSON.stringify(entry) + "\n", "utf-8");
|
|
19
|
+
}
|
|
20
|
+
close() { }
|
|
21
|
+
}
|
|
22
|
+
export class ConsoleSink {
|
|
23
|
+
write(entry) {
|
|
24
|
+
const timePart = entry.ts.slice(11, 19);
|
|
25
|
+
const machine = entry.machine.padEnd(14);
|
|
26
|
+
const deltaStr = Object.keys(entry.context_delta).length > 0
|
|
27
|
+
? " " + Object.entries(entry.context_delta).map(([k, v]) => `${k}=${v}`).join(" ")
|
|
28
|
+
: "";
|
|
29
|
+
const eventStr = entry.event ? ` (${entry.event})` : "";
|
|
30
|
+
console.log(`[${timePart}] ${machine} ${entry.from} → ${entry.to}${eventStr}${deltaStr}`);
|
|
31
|
+
}
|
|
32
|
+
close() { }
|
|
33
|
+
}
|
|
34
|
+
export class MultiSink {
|
|
35
|
+
sinks;
|
|
36
|
+
constructor(...sinks) {
|
|
37
|
+
this.sinks = sinks;
|
|
38
|
+
}
|
|
39
|
+
write(entry) {
|
|
40
|
+
for (const sink of this.sinks)
|
|
41
|
+
sink.write(entry);
|
|
42
|
+
}
|
|
43
|
+
close() {
|
|
44
|
+
for (const sink of this.sinks)
|
|
45
|
+
sink.close();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function makeEntry(options) {
|
|
49
|
+
return {
|
|
50
|
+
ts: new Date().toISOString(),
|
|
51
|
+
run_id: options.runId,
|
|
52
|
+
machine: options.machine,
|
|
53
|
+
event: options.event,
|
|
54
|
+
from: options.from,
|
|
55
|
+
to: options.to,
|
|
56
|
+
context_delta: options.contextDelta,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAiB/B,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACvC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAe;QACnB,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,KAAU,CAAC;CACjB;AAED,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,KAAe;QACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC;YAC1D,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACpF,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,KAAU,CAAC;CACjB;AAED,MAAM,OAAO,SAAS;IACH,KAAK,CAAY;IAElC,YAAY,GAAG,KAAgB;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAe;QACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,KAAK;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,OAOzB;IACC,OAAO;QACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,MAAM,EAAE,OAAO,CAAC,KAAK;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,aAAa,EAAE,OAAO,CAAC,YAAY;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orca state machine runtime.
|
|
3
|
+
*
|
|
4
|
+
* Async state machine that executes Orca machine definitions,
|
|
5
|
+
* publishing state changes to an event bus and executing effects
|
|
6
|
+
* via registered handlers.
|
|
7
|
+
*/
|
|
8
|
+
import type { MachineDef } from "./types.js";
|
|
9
|
+
import { StateValue } from "./types.js";
|
|
10
|
+
import type { EventBus, Event } from "./bus.js";
|
|
11
|
+
export type TransitionCallback = (fromState: StateValue, toState: StateValue) => Promise<void>;
|
|
12
|
+
export type ActionHandler = (context: Record<string, unknown>, event?: Record<string, unknown>) => Promise<Record<string, unknown> | void> | Record<string, unknown> | void;
|
|
13
|
+
export interface TransitionResult {
|
|
14
|
+
taken: boolean;
|
|
15
|
+
fromState: string;
|
|
16
|
+
toState?: string;
|
|
17
|
+
guardFailed?: boolean;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class OrcaMachine {
|
|
21
|
+
private definition;
|
|
22
|
+
private eventBus;
|
|
23
|
+
private context;
|
|
24
|
+
private onTransition?;
|
|
25
|
+
private state;
|
|
26
|
+
private active;
|
|
27
|
+
private actionHandlers;
|
|
28
|
+
private timeoutTimer;
|
|
29
|
+
private childMachines;
|
|
30
|
+
private siblingMachines?;
|
|
31
|
+
constructor(definition: MachineDef, eventBus?: EventBus, context?: Record<string, unknown>, onTransition?: TransitionCallback);
|
|
32
|
+
/**
|
|
33
|
+
* Register sibling machines available for invocation.
|
|
34
|
+
* Call this before start() when using multi-machine files.
|
|
35
|
+
*/
|
|
36
|
+
registerMachines(machines: Map<string, MachineDef>): void;
|
|
37
|
+
registerAction(name: string, handler: ActionHandler): void;
|
|
38
|
+
unregisterAction(name: string): void;
|
|
39
|
+
private getInitialState;
|
|
40
|
+
get currentState(): StateValue;
|
|
41
|
+
get isActive(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Capture the current machine state as a serializable snapshot.
|
|
44
|
+
* The snapshot includes state value, context, timestamp, and child machine snapshots.
|
|
45
|
+
* Action handlers are NOT included — re-register them after restore.
|
|
46
|
+
*/
|
|
47
|
+
snapshot(): {
|
|
48
|
+
state: string | Record<string, unknown>;
|
|
49
|
+
context: Record<string, unknown>;
|
|
50
|
+
children?: Record<string, ReturnType<OrcaMachine['snapshot']>>;
|
|
51
|
+
timestamp: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Restore machine state from a previously captured snapshot.
|
|
55
|
+
* The machine must be stopped before restoring. After restore,
|
|
56
|
+
* call start() to resume. Action handlers must be re-registered.
|
|
57
|
+
*/
|
|
58
|
+
restore(snap: {
|
|
59
|
+
state: string | Record<string, unknown>;
|
|
60
|
+
context: Record<string, unknown>;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Cold-boot from a snapshot without re-running on_entry handlers.
|
|
64
|
+
* Use this to resume a previously persisted run.
|
|
65
|
+
* Distinct from restore() which operates on a live machine.
|
|
66
|
+
*/
|
|
67
|
+
resume(snap: {
|
|
68
|
+
state: string | Record<string, unknown>;
|
|
69
|
+
context: Record<string, unknown>;
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
start(): Promise<void>;
|
|
72
|
+
stop(): Promise<void>;
|
|
73
|
+
send(event: string | Event, payload?: Record<string, unknown>): Promise<TransitionResult>;
|
|
74
|
+
private findEventType;
|
|
75
|
+
private findTransition;
|
|
76
|
+
private getParentState;
|
|
77
|
+
private isCompoundState;
|
|
78
|
+
private isParallelState;
|
|
79
|
+
private getInitialChild;
|
|
80
|
+
/** Search all states including nested and parallel region states */
|
|
81
|
+
private findStateDefDeep;
|
|
82
|
+
/** Build the StateValue for entering a parallel state */
|
|
83
|
+
private buildParallelStateValue;
|
|
84
|
+
/** Check if all regions of a parallel state have reached their final states */
|
|
85
|
+
private allRegionsFinal;
|
|
86
|
+
/** Check if any region of a parallel state has reached a final state */
|
|
87
|
+
private anyRegionFinal;
|
|
88
|
+
/**
|
|
89
|
+
* When transitioning to a state inside a parallel region,
|
|
90
|
+
* update only that region's sub-state in the current StateValue.
|
|
91
|
+
*/
|
|
92
|
+
private tryUpdateParallelRegion;
|
|
93
|
+
/** Check if any parallel state's sync condition is met and transition via onDone */
|
|
94
|
+
private checkParallelSync;
|
|
95
|
+
private evaluateGuard;
|
|
96
|
+
private evalGuard;
|
|
97
|
+
private resolveVariable;
|
|
98
|
+
private resolveValue;
|
|
99
|
+
private evalCompare;
|
|
100
|
+
private evalNullcheck;
|
|
101
|
+
private executeEntryActions;
|
|
102
|
+
private executeExitActions;
|
|
103
|
+
private executeAction;
|
|
104
|
+
private startTimeoutForState;
|
|
105
|
+
private cancelTimeout;
|
|
106
|
+
private executeTimeoutTransition;
|
|
107
|
+
/**
|
|
108
|
+
* Start a child machine when entering an invoke state.
|
|
109
|
+
*/
|
|
110
|
+
private startChildMachine;
|
|
111
|
+
/**
|
|
112
|
+
* Stop a child machine when exiting an invoke state.
|
|
113
|
+
*/
|
|
114
|
+
private stopChildMachine;
|
|
115
|
+
private findStateDef;
|
|
116
|
+
private isEventIgnored;
|
|
117
|
+
private findActionDef;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../src/machine.ts"],"names":[],"mappings":"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"}
|