reactive-fsm 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/loop-shield.d.ts +1 -0
- package/dist/core/loop-shield.d.ts.map +1 -1
- package/dist/core/loop-shield.js.map +1 -1
- package/dist/core/machine.d.ts +8 -8
- package/dist/core/machine.d.ts.map +1 -1
- package/dist/core/machine.js +15 -1
- package/dist/core/machine.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-shield.d.ts","sourceRoot":"","sources":["../../src/core/loop-shield.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"loop-shield.d.ts","sourceRoot":"","sources":["../../src/core/loop-shield.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,IAAI,IAAI,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC;IACrB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,kBAAkB,CAkB7E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-shield.js","sourceRoot":"","sources":["../../src/core/loop-shield.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loop-shield.js","sourceRoot":"","sources":["../../src/core/loop-shield.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAE7B,OAAO;QACL,gBAAgB;YACd,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YAC5B,oBAAoB,EAAE,CAAC;QACzB,CAAC;QAED,SAAS;YACP,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAClC,OAAO,oBAAoB,IAAI,MAAM,CAAC,mBAAmB,CAAC;QAC5D,CAAC;QAED,KAAK;YACH,oBAAoB,GAAG,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/core/machine.d.ts
CHANGED
|
@@ -2,14 +2,14 @@ import { type LoopShieldConfig } from './loop-shield';
|
|
|
2
2
|
export interface FSMSnapshot {
|
|
3
3
|
state: string;
|
|
4
4
|
}
|
|
5
|
-
export interface FSMConfig {
|
|
6
|
-
initialState:
|
|
7
|
-
states:
|
|
8
|
-
tools: Record<
|
|
5
|
+
export interface FSMConfig<S extends string = string> {
|
|
6
|
+
initialState: S;
|
|
7
|
+
states: readonly S[];
|
|
8
|
+
tools: Partial<Record<S, string[]>>;
|
|
9
9
|
loopShield?: LoopShieldConfig;
|
|
10
|
-
onTransition?: (from:
|
|
11
|
-
guard?: (from:
|
|
12
|
-
prompts?: Record<
|
|
10
|
+
onTransition?: (from: S, to: S) => void;
|
|
11
|
+
guard?: (from: S, to: S, context: Record<string, unknown>) => boolean;
|
|
12
|
+
prompts?: Partial<Record<S, string>>;
|
|
13
13
|
snapshot?: FSMSnapshot;
|
|
14
14
|
context?: Record<string, unknown>;
|
|
15
15
|
}
|
|
@@ -27,5 +27,5 @@ export interface FSMInstance extends FSMPublic {
|
|
|
27
27
|
_resetLoopShield(): void;
|
|
28
28
|
_setState(state: string): void;
|
|
29
29
|
}
|
|
30
|
-
export declare function createFSM(config: FSMConfig): FSMInstance;
|
|
30
|
+
export declare function createFSM<const S extends string = string>(config: FSMConfig<S>): FSMInstance;
|
|
31
31
|
//# sourceMappingURL=machine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../../src/core/machine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;
|
|
1
|
+
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../../src/core/machine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAClD,YAAY,EAAE,CAAC,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,IAAI,WAAW,CAAC;IACxB,SAAS,IAAI,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,iBAAiB,IAAI,IAAI,CAAC;IAC1B,gBAAgB,IAAI,IAAI,CAAC;IACzB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,SAAS,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EACvD,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GACnB,WAAW,CAuGb"}
|
package/dist/core/machine.js
CHANGED
|
@@ -7,6 +7,9 @@ export function createFSM(config) {
|
|
|
7
7
|
if (config.snapshot && !validStates.has(config.snapshot.state)) {
|
|
8
8
|
throw new Error(`Snapshot state "${config.snapshot.state}" is not in the states list`);
|
|
9
9
|
}
|
|
10
|
+
if (config.loopShield?.fallbackState && !validStates.has(config.loopShield.fallbackState)) {
|
|
11
|
+
throw new Error(`Loop shield fallbackState "${config.loopShield.fallbackState}" is not in the states list`);
|
|
12
|
+
}
|
|
10
13
|
let _currentState = config.snapshot?.state ?? config.initialState;
|
|
11
14
|
const _context = config.context ? { ...config.context } : {};
|
|
12
15
|
const shield = createLoopShield(config.loopShield ?? { enabled: false, maxConsecutiveTools: 3 });
|
|
@@ -15,12 +18,17 @@ export function createFSM(config) {
|
|
|
15
18
|
}
|
|
16
19
|
function doTransition(state) {
|
|
17
20
|
const from = _currentState;
|
|
18
|
-
if (config.guard && !config.guard(from, state)) {
|
|
21
|
+
if (config.guard && !config.guard(from, state, _context)) {
|
|
19
22
|
throw new Error(`Guard blocked transition from "${from}" to "${state}"`);
|
|
20
23
|
}
|
|
21
24
|
_currentState = state;
|
|
22
25
|
config.onTransition?.(from, state);
|
|
23
26
|
}
|
|
27
|
+
function doFallback(state) {
|
|
28
|
+
const from = _currentState;
|
|
29
|
+
_currentState = state;
|
|
30
|
+
config.onTransition?.(from, state);
|
|
31
|
+
}
|
|
24
32
|
return {
|
|
25
33
|
get currentState() {
|
|
26
34
|
return _currentState;
|
|
@@ -39,6 +47,12 @@ export function createFSM(config) {
|
|
|
39
47
|
},
|
|
40
48
|
_registerToolCall() {
|
|
41
49
|
shield.registerToolCall();
|
|
50
|
+
if (shield.isLooping() && config.loopShield?.fallbackState) {
|
|
51
|
+
const fb = config.loopShield.fallbackState;
|
|
52
|
+
if (validStates.has(fb) && _currentState !== fb) {
|
|
53
|
+
doFallback(fb);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
42
56
|
},
|
|
43
57
|
_resetLoopShield() {
|
|
44
58
|
shield.reset();
|
package/dist/core/machine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine.js","sourceRoot":"","sources":["../../src/core/machine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAyB,MAAM,eAAe,CAAC;AAkCxE,MAAM,UAAU,SAAS,
|
|
1
|
+
{"version":3,"file":"machine.js","sourceRoot":"","sources":["../../src/core/machine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAyB,MAAM,eAAe,CAAC;AAkCxE,MAAM,UAAU,SAAS,CACvB,MAAoB;IAEpB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,CAAC;IAEnD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,YAAY,6BAA6B,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,KAAK,6BAA6B,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,aAAa,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,UAAU,CAAC,aAAa,6BAA6B,CAAC,CAAC;IAC9G,CAAC;IAED,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC;IAElE,MAAM,QAAQ,GAA4B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtF,MAAM,MAAM,GAAG,gBAAgB,CAC7B,MAAM,CAAC,UAAU,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAChE,CAAC;IAEF,SAAS,eAAe;QACtB,OAAQ,MAAM,CAAC,KAAkC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACzE,CAAC;IAED,SAAS,YAAY,CAAC,KAAa;QACjC,MAAM,IAAI,GAAG,aAAa,CAAC;QAC3B,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAS,EAAE,KAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,aAAa,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,YAAY,EAAE,CAAC,IAAS,EAAE,KAAU,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS,UAAU,CAAC,KAAa;QAC/B,MAAM,IAAI,GAAG,aAAa,CAAC;QAC3B,aAAa,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,YAAY,EAAE,CAAC,IAAS,EAAE,KAAU,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,IAAI,YAAY;YACd,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,YAAY;YACd,OAAO,eAAe,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,SAAS;YACX,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;QAC5B,CAAC;QAED,YAAY,CAAC,KAAa;YACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,oBAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,iBAAiB;YACf,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;gBAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC;gBAC3C,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAa,KAAK,EAAE,EAAE,CAAC;oBAChD,UAAU,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QAED,gBAAgB;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,SAAS,CAAC,KAAa;YACrB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,oBAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,QAAQ;YACN,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAClC,CAAC;QAED,SAAS;YACP,MAAM,KAAK,GAAa,CAAC,iBAAiB,CAAC,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC7D,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,EAAE,QAAQ;KAClB,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reactive-fsm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Reactive Finite State Machine for AI agent orchestration — zero dependencies core, conditional tool gating, loop shield, adapters for Vercel AI SDK, OpenAI, Anthropic, LangChain, and Google Gemini",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|