posipaki 0.11.0 → 0.12.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/README.md CHANGED
@@ -40,6 +40,8 @@ const counter = defineActor({
40
40
  const proc = counter.spawn(null);
41
41
  await proc.ready();
42
42
  proc.send({ type: "POKE" });
43
+ ```
44
+
43
45
 
44
46
  A process can do everything a promise, a stream, or a store can do —
45
47
  but it can also fork children, pause/resume, and exit on its own terms.
@@ -88,6 +90,29 @@ proc.send({ type: "POKE" });
88
90
  await proc.wait();
89
91
  ```
90
92
 
93
+
94
+ ## Okay, but what do I use it for?
95
+
96
+ To call the `/chat_complete` endpoint and emit effects (tool calls)
97
+ that the pure function (LLM) produces.
98
+
99
+ Use it on the frontend for things like file upload progress or anything
100
+ that has to be more interactive than a promise but not static enough
101
+ to afford to be a store with the lifetime tied to the app.
102
+
103
+ You can also use it to define components on the server side that have life
104
+ time bounded by incoming request or some kind of a transient state.
105
+
106
+ ## How are the messages processed?
107
+
108
+ Actors are loops iterating over the messages you send to their queue (inbox).
109
+ Get the new message, process it, maybe emit something, wait for the next message.
110
+
111
+ This means when you send three messages to a process -- they will be processed serially
112
+ and their results will not produce a race. You can also ask the process to exit
113
+ and it will not produce any messages once it does. This also cascades to their children.
114
+
115
+
91
116
  ## Features
92
117
 
93
118
  - **Processes** — sync or async, same API
@@ -0,0 +1,48 @@
1
+ import { a as ProcessCtx, r as Message, s as SenderInfo } from "./types-Bau9O_vk.js";
2
+
3
+ //#region src/hooks.d.ts
4
+ /** Returned by onMessage hooks to prevent further dispatch. */
5
+ declare const STOP_SENTINEL: unique symbol;
6
+ /** Type-safe sentinel for short-circuiting onMessage hooks. */
7
+ declare const stopPropagation: () => typeof STOP_SENTINEL;
8
+ /** Return type of onMessage hooks: void (continue) or sentinel (stop). */
9
+ type HookResult = void | typeof STOP_SENTINEL;
10
+ type OnStartHook<State> = (state: State) => void | Promise<void>;
11
+ type OnMessageHook<InMsg extends Message> = (msg: InMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;
12
+ type OnEmitHook<OutMsg extends Message> = (msg: OutMsg) => void;
13
+ type OnChildExitHook = (name: string) => void | Promise<void>;
14
+ type OnStopRequestedHook = () => void | Promise<void>;
15
+ type OnEndHook = (reason: unknown) => void | Promise<void>;
16
+ type OnErrorHook = (err: unknown) => void;
17
+ declare class HookRegistry<State, InMsg extends Message, OutMsg extends Message> {
18
+ onStart: Array<OnStartHook<State>>;
19
+ onMessage: Array<OnMessageHook<InMsg>>;
20
+ onEmit: Array<OnEmitHook<OutMsg>>;
21
+ onChildExit: Array<OnChildExitHook>;
22
+ onStopRequested: Array<OnStopRequestedHook>;
23
+ onEnd: Array<OnEndHook>;
24
+ onError: Array<OnErrorHook>;
25
+ }
26
+ /** A reusable unit of actor behaviour, installed at fork time. */
27
+ interface ActorPlugin<InMsg extends Message = Message, OutMsg extends Message = Message, State = unknown> {
28
+ name: string;
29
+ install(ctx: ProcessCtx<unknown, State, InMsg, OutMsg>): void | Promise<void>;
30
+ }
31
+ /** Transform parent plugins into child plugins. */
32
+ type PluginTransform = (parentPlugins: ActorPlugin[]) => ActorPlugin[];
33
+ /**
34
+ * Interface that plugins can augment via declaration merging.
35
+ * Plugins ship a .d.ts that adds properties to this interface,
36
+ * making them available on `this` in handlers and methods.
37
+ *
38
+ * Example (in a plugin's .d.ts):
39
+ * declare module 'posipaki' {
40
+ * interface ActorDecorated {
41
+ * log: Logger;
42
+ * }
43
+ * }
44
+ */
45
+ interface ActorDecorated {}
46
+ //#endregion
47
+ export { ActorDecorated, ActorPlugin, HookRegistry, HookResult, OnChildExitHook, OnEmitHook, OnEndHook, OnErrorHook, OnMessageHook, OnStartHook, OnStopRequestedHook, PluginTransform, STOP_SENTINEL, stopPropagation };
48
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","names":[],"sources":["../src/hooks.ts"],"mappings":";;;;cAWa,aAAA;AAAb;AAAA,cAGa,eAAA,eAA6B,aAA8B;;KAG5D,UAAA,iBAA2B,aAAa;AAAA,KAIxC,WAAA,WAAsB,KAAA,EAAO,KAAA,YAAiB,OAAO;AAAA,KACrD,aAAA,eAA4B,OAAA,KAAY,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,KAAe,UAAA,GAAa,OAAA,CAAQ,UAAA;AAAA,KAChG,UAAA,gBAA0B,OAAA,KAAY,GAAA,EAAK,MAAM;AAAA,KACjD,eAAA,IAAmB,IAAA,oBAAwB,OAAO;AAAA,KAClD,mBAAA,gBAAmC,OAAO;AAAA,KAC1C,SAAA,IAAa,MAAA,qBAA2B,OAAO;AAAA,KAC/C,WAAA,IAAe,GAAY;AAAA,cAI1B,YAAA,sBAAkC,OAAA,iBAAwB,OAAA;EACrE,OAAA,EAAS,KAAA,CAAM,WAAA,CAAY,KAAA;EAC3B,SAAA,EAAW,KAAA,CAAM,aAAA,CAAc,KAAA;EAC/B,MAAA,EAAQ,KAAA,CAAM,UAAA,CAAW,MAAA;EACzB,WAAA,EAAa,KAAA,CAAM,eAAA;EACnB,eAAA,EAAiB,KAAA,CAAM,mBAAA;EACvB,KAAA,EAAO,KAAA,CAAM,SAAA;EACb,OAAA,EAAS,KAAA,CAAM,WAAA;AAAA;;UAOA,WAAA,eACD,OAAA,GAAU,OAAA,iBACT,OAAA,GAAU,OAAA;EAGzB,IAAA;EACA,OAAA,CAAQ,GAAA,EAAK,UAAA,UAAoB,KAAA,EAAO,KAAA,EAAO,MAAA,WAAiB,OAAA;AAAA;AA7BlE;AAAA,KAiCY,eAAA,IAAmB,aAAA,EAAe,WAAA,OAAkB,WAAW;;;;;;;;;;;;;UAgB1D,cAAA"}
package/dist/hooks.js ADDED
@@ -0,0 +1,20 @@
1
+ //#region src/hooks.ts
2
+ /** Returned by onMessage hooks to prevent further dispatch. */
3
+ const STOP_SENTINEL = Symbol("posipaki.stopPropagation");
4
+ /** Type-safe sentinel for short-circuiting onMessage hooks. */
5
+ const stopPropagation = () => STOP_SENTINEL;
6
+ var HookRegistry = class {
7
+ constructor() {
8
+ this.onStart = [];
9
+ this.onMessage = [];
10
+ this.onEmit = [];
11
+ this.onChildExit = [];
12
+ this.onStopRequested = [];
13
+ this.onEnd = [];
14
+ this.onError = [];
15
+ }
16
+ };
17
+ //#endregion
18
+ export { HookRegistry, STOP_SENTINEL, stopPropagation };
19
+
20
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","names":[],"sources":["../src/hooks.ts"],"sourcesContent":["// ── Lifecycle Hooks ──────────────────────────────────────────────────────\n//\n// Extends ProcessCtx and defineActor with observable lifecycle hooks.\n// Hooks are additive — multiple callbacks can register for the same hook\n// point, and they fire in registration order.\n\nimport type { Message, SenderInfo, ProcessCtx } from './types.js';\n\n// ── stop propagation sentinel ────────────────────────────────────────────\n\n/** Returned by onMessage hooks to prevent further dispatch. */\nexport const STOP_SENTINEL = Symbol('posipaki.stopPropagation');\n\n/** Type-safe sentinel for short-circuiting onMessage hooks. */\nexport const stopPropagation = (): typeof STOP_SENTINEL => STOP_SENTINEL;\n\n/** Return type of onMessage hooks: void (continue) or sentinel (stop). */\nexport type HookResult = void | typeof STOP_SENTINEL;\n\n// ── hook function types ──────────────────────────────────────────────────\n\nexport type OnStartHook<State> = (state: State) => void | Promise<void>;\nexport type OnMessageHook<InMsg extends Message> = (msg: InMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;\nexport type OnEmitHook<OutMsg extends Message> = (msg: OutMsg) => void;\nexport type OnChildExitHook = (name: string) => void | Promise<void>;\nexport type OnStopRequestedHook = () => void | Promise<void>;\nexport type OnEndHook = (reason: unknown) => void | Promise<void>;\nexport type OnErrorHook = (err: unknown) => void;\n\n// ── hook registry ────────────────────────────────────────────────────────\n\nexport class HookRegistry<State, InMsg extends Message, OutMsg extends Message> {\n onStart: Array<OnStartHook<State>> = [];\n onMessage: Array<OnMessageHook<InMsg>> = [];\n onEmit: Array<OnEmitHook<OutMsg>> = [];\n onChildExit: Array<OnChildExitHook> = [];\n onStopRequested: Array<OnStopRequestedHook> = [];\n onEnd: Array<OnEndHook> = [];\n onError: Array<OnErrorHook> = [];\n}\n\n// ── plugin types ─────────────────────────────────────────────────────────\n\n\n/** A reusable unit of actor behaviour, installed at fork time. */\nexport interface ActorPlugin<\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n State = unknown,\n> {\n name: string;\n install(ctx: ProcessCtx<unknown, State, InMsg, OutMsg>): void | Promise<void>;\n}\n\n/** Transform parent plugins into child plugins. */\nexport type PluginTransform = (parentPlugins: ActorPlugin[]) => ActorPlugin[];\n\n// ── type augmentation (Fastify-style) ────────────────────────────────────\n\n/**\n * Interface that plugins can augment via declaration merging.\n * Plugins ship a .d.ts that adds properties to this interface,\n * making them available on `this` in handlers and methods.\n *\n * Example (in a plugin's .d.ts):\n * declare module 'posipaki' {\n * interface ActorDecorated {\n * log: Logger;\n * }\n * }\n */\nexport interface ActorDecorated {}\n"],"mappings":";;AAWA,MAAa,gBAAgB,OAAO,0BAA0B;;AAG9D,MAAa,wBAA8C;AAiB3D,IAAa,eAAb,MAAgF;;iBACzC,CAAC;mBACG,CAAC;gBACN,CAAC;qBACC,CAAC;yBACO,CAAC;eACrB,CAAC;iBACG,CAAC;;AACjC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- import { _ as WithSender, a as runDispatchAsync, c as ExitMessage, d as ProcessCtx, f as ProcessFn, g as SupervisorState, h as StopMessage, i as AsyncProcess, l as Message, m as SenderOrigin, n as spawn, o as spawnAsync, p as SenderInfo, r as runDispatch, s as AsyncProcessFn, t as Process, u as PipeState, v as WithoutSender } from "./process-BiX7Ena4.js";
1
+ import { a as ProcessCtx, c as SenderOrigin, d as WithSender, f as WithoutSender, h as spawnAsync, i as PipeState, l as StopMessage, m as runDispatchAsync, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message, s as SenderInfo, t as AsyncProcessFn, u as SupervisorState } from "./types-Bau9O_vk.js";
2
+ import { ActorDecorated as ActorDecorated$1, ActorPlugin as ActorPlugin$1, HookRegistry, HookResult as HookResult$1, OnChildExitHook, OnEmitHook, OnEndHook, OnErrorHook, OnMessageHook, OnStartHook as OnStartHook$1, OnStopRequestedHook, PluginTransform as PluginTransform$1, stopPropagation } from "./hooks.js";
3
+ import { n as spawn, r as runDispatch, t as Process } from "./process-B1vevrTc.js";
2
4
 
3
5
  //#region src/adapters.d.ts
4
6
  declare function asyncify<A, S, IM extends Message, OM extends Message>(fn: ProcessFn<A, S, IM, OM>): AsyncProcessFn<A, S, IM, OM>;
@@ -17,14 +19,32 @@ type HandlerOptions<InMsg extends Message> = Omit<{ [K in InMsg["type"]]: Handle
17
19
  interface ActorDefinition<Args, ExposedState, InMsg extends Message, OutMsg extends Message, Handlers extends HandlerOptions<InMsg>> {
18
20
  fn: AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>;
19
21
  config: ActorConfig<Args, any, ExposedState, InMsg, OutMsg, {}, Handlers>;
22
+ /** Preferred process name (from config.name). */
23
+ name?: string;
24
+ /** Raw plugin config (array or transform). Resolved at fork time. @internal */
25
+ _pluginsRaw?: ActorPlugin[] | PluginTransform;
20
26
  /** Spawn this actor as a standalone process. */
21
27
  spawn(args: Args): AsyncProcess<Args, ExposedState, InMsg, OutMsg>;
22
28
  /** Spawn this actor as a child of the calling process. */
23
- spawnAsChild(ctx: ProcessCtx<any, any, any, any>, name: string, args: Args): AsyncProcess<Args, ExposedState, InMsg, OutMsg>;
29
+ spawnAsChild(ctx: ProcessCtx<any, any, any, any>, args: Args, name?: string): AsyncProcess<Args, ExposedState, InMsg, OutMsg>;
30
+ }
31
+ interface ActorHooksConfig<Args, InternalState, ExposedState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> {
32
+ onStart?: OnStartHook<ExposedState>;
33
+ onMessage?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, msg: InMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;
34
+ onEmit?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, msg: OutMsg) => void;
35
+ onChildExit?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, name: string) => void | Promise<void>;
36
+ onStopRequested?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>) => void | Promise<void>;
37
+ onEnd?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, reason: unknown) => void | Promise<void>;
38
+ onError?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, err: unknown) => void;
24
39
  }
25
40
  interface ActorConfig<Args, InternalState, ExposedState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> {
26
41
  initialState: InternalState | ((this: void, args: Args, ctx: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>["ctx"]) => InternalState);
27
42
  expose?: (internalState: InternalState) => ExposedState;
43
+ /** Preferred process name. Used by ctx.fork() when no explicit name is given. */
44
+ name?: string;
45
+ hooks?: ActorHooksConfig<Args, InternalState, InMsg, OutMsg, Methods, Handlers>;
46
+ /** Plugins installed at fork time. Array = replace, function = transform parent chain. */
47
+ plugins?: ActorPlugin[] | PluginTransform;
28
48
  outMessages?: ActorMessages<OutMsg>;
29
49
  inMessages?: ActorMessages<InMsg>;
30
50
  onStart?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, args: Args) => void | Promise<void>;
@@ -35,7 +55,7 @@ interface ActorConfig<Args, InternalState, ExposedState, InMsg extends Message,
35
55
  onUnhandled?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, msg: InMsg, sender: SenderInfo) => void | Promise<void>;
36
56
  onChildExit?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, name: string, reason: ExitMessage) => void | Promise<void>;
37
57
  }
38
- type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> = Methods & {
58
+ type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> = Methods & ActorDecorated & {
39
59
  state: InternalState;
40
60
  name: string;
41
61
  id: symbol;
@@ -43,7 +63,7 @@ type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Mes
43
63
  agreeToStop: () => void;
44
64
  exit: (reason?: unknown) => void;
45
65
  $child: Record<string, AsyncProcess<unknown, unknown, Message, Message>>;
46
- fork<A, S, IM extends Message, OM extends Message, H extends HandlerOptions<IM>>(fn: AsyncProcessFn<A, S, IM, OM> | ActorDefinition<A, S, IM, OM, H>, name: string, args?: A): AsyncProcess<A, S, IM, OM>;
66
+ fork<A, S, IM extends Message, OM extends Message, H extends HandlerOptions<IM>>(fn: AsyncProcessFn<A, S, IM, OM> | ActorDefinition<A, S, IM, OM, H>, name?: string, args?: A): AsyncProcess<A, S, IM, OM>;
47
67
  ctx: ProcessCtx<Args, InternalState, InMsg, OutMsg>;
48
68
  };
49
69
  //#endregion
@@ -51,5 +71,5 @@ type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Mes
51
71
  declare function defineMessages<OutMsg extends Message = Message>(): ActorMessages<OutMsg>;
52
72
  declare function defineActor<Args, InternalState, ExposedState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>>(config: ActorConfig<Args, InternalState, ExposedState, InMsg, OutMsg, Methods, Handlers>): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers>;
53
73
  //#endregion
54
- export { type ActorConfig, type ActorContext, type ActorDefinition, AsyncProcess, type AsyncProcessFn, type ExitMessage, type HandlerFn, type HandlerOptions, type Message, type MethodOptions, type PipeState, Process, type ProcessCtx, type ProcessFn, type SenderInfo, type SenderOrigin, type StopMessage, type SupervisorState, type WithSender, type WithoutSender, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync };
74
+ export { type ActorConfig, type ActorContext, type ActorDecorated$1 as ActorDecorated, type ActorDefinition, type ActorPlugin$1 as ActorPlugin, AsyncProcess, type AsyncProcessFn, type ExitMessage, type HandlerFn, type HandlerOptions, HookRegistry, type HookResult$1 as HookResult, type Message, type MethodOptions, type OnChildExitHook, type OnEmitHook, type OnEndHook, type OnErrorHook, type OnMessageHook, type OnStartHook$1 as OnStartHook, type OnStopRequestedHook, type PipeState, type PluginTransform$1 as PluginTransform, Process, type ProcessCtx, type ProcessFn, type SenderInfo, type SenderOrigin, type StopMessage, type SupervisorState, type WithSender, type WithoutSender, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync, stopPropagation };
55
75
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/actor-types.ts","../src/define-actor.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/actor-types.ts","../src/define-actor.ts"],"mappings":";;;;;iBAEgB,QAAA,kBAA0B,OAAA,aAAoB,OAAA,EAC5D,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,IACvB,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;;;KCahB,aAAA,WAAwB,OAAA;EAClC,cAAA,EAAgB,CAAC;AAAA;AAAA,UAEF,aAAA;EAAA,CACd,GAAA,WAAc,QAAQ;AAAA;AAAA,KAEb,SAAA,eAAwB,OAAA,KAClC,GAAA,EAAK,KAAA,EACL,MAAA,EAAQ,UAAA,YACE,OAAA;AAAA,KACA,cAAA,eAA6B,OAAA,IAAW,IAAA,SAE1C,KAAA,WAAgB,SAAA,CAAU,OAAA,CAAQ,KAAA;EAAS,IAAA,EAAM,CAAA;AAAA;AAAA,UAK1C,eAAA,mCAGD,OAAA,iBACC,OAAA,mBACE,cAAA,CAAe,KAAA;EAEhC,EAAA,EAAI,cAAA,CAAe,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAA;EAC9C,MAAA,EAAQ,WAAA,CAAY,IAAA,OAAW,YAAA,EAAc,KAAA,EAAO,MAAA,MAAY,QAAA;EDtC1C;ECwCtB,IAAA;EDxCC;EC0CD,WAAA,GAAc,WAAA,KAAgB,eAAA;ED1Cf;EC4Cf,KAAA,CAAM,IAAA,EAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAA;ED9CjC;ECgD1B,YAAA,CACE,GAAA,EAAK,UAAA,sBACL,IAAA,EAAM,IAAA,EACN,IAAA,YACC,YAAA,CAAa,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAA;AAAA;AAAA,UAG5B,gBAAA,kDAID,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA;EAEhC,OAAA,GAAU,WAAA,CAAY,YAAA;EACtB,SAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,GAAA,EAAK,KAAA,EACL,MAAA,EAAQ,UAAA,KACL,UAAA,GAAa,OAAA,CAAQ,UAAA;EAC1B,MAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,GAAA,EAAK,MAAA;EAEP,WAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,IAAA,oBACU,OAAA;EACZ,eAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,aACtD,OAAA;EACZ,KAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,MAAA,qBACU,OAAA;EACZ,OAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,GAAA;AAAA;AAAA,UAIa,WAAA,kDAID,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA;EAEhC,YAAA,EACI,aAAA,KAEE,IAAA,QACA,IAAA,EAAM,IAAA,EAIN,GAAA,EAAK,YAAA,CACH,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,aAEC,aAAA;EACT,MAAA,IAAU,aAAA,EAAe,aAAA,KAAkB,YAAA;EDnHjB;ECqH1B,IAAA;EACA,KAAA,GAAQ,gBAAA,CAAiB,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA;;EAEtE,OAAA,GAAU,WAAA,KAAgB,eAAA;EAC1B,WAAA,GAAc,aAAA,CAAc,MAAA;EAC5B,UAAA,GAAa,aAAA,CAAc,KAAA;EAE3B,OAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,IAAA,EAAM,IAAA,YACI,OAAA;EAEZ,eAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,aACtD,OAAA;EAEZ,KAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,MAAA,sBACU,OAAA;EAEZ,QAAA,EAAU,QAAA,GACR,QAAA,CACE,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA;EAG9D,OAAA,GAAU,OAAA,GACR,QAAA,CACE,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA;EAG9D,WAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,GAAA,EAAK,KAAA,EACL,MAAA,EAAQ,UAAA,YACE,OAAA;EAEZ,WAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,GAChE,IAAA,UACA,MAAA,EAAQ,WAAA,YACE,OAAA;AAAA;AAAA,KAGF,YAAA,oCAGI,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA,KAC9B,OAAA,GAAU,cAAA;EACZ,KAAA,EAAO,aAAA;EACP,IAAA;EACA,EAAA;EAEA,IAAA,GAAO,GAAA,EAAK,MAAA;EACZ,WAAA;EACA,IAAA,GAAO,MAAA;EAEP,MAAA,EAAQ,MAAA,SAAe,YAAA,mBAA+B,OAAA,EAAS,OAAA;EAE/D,IAAA,kBAGa,OAAA,aACA,OAAA,YACD,cAAA,CAAe,EAAA,GAEzB,EAAA,EAAI,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,IAAM,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,CAAA,GACjE,IAAA,WACA,IAAA,GAAO,CAAA,GACN,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;EAE1B,GAAA,EAAK,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA;AAAA;;;iBCjK9B,cAAA,gBACC,OAAA,GAAU,OAAA,KACtB,aAAA,CAAc,MAAA;AAAA,iBAIH,WAAA,kDAIA,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA,GAEhC,MAAA,EAAQ,WAAA,CACN,IAAA,EACA,aAAA,EACA,YAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,IAED,eAAA,CAAgB,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,QAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { i as runDispatch, n as defer, r as makeWaiter, t as debugLog } from "./util-Cw64MseZ.js";
2
+ import { HookRegistry, STOP_SENTINEL, stopPropagation } from "./hooks.js";
2
3
  //#region src/adapters.ts
3
4
  function asyncify(fn) {
4
5
  return async function* (ctx, args) {
@@ -100,7 +101,9 @@ var AsyncProcess = class AsyncProcess {
100
101
  }
101
102
  fork(fn, pname) {
102
103
  return (args) => {
103
- const child = new AsyncProcess(fn, pname, this.fromChild.bind(this));
104
+ const fnConfig = fn.config;
105
+ const baseName = pname ?? fnConfig?.name ?? `child-${this.children.length}`;
106
+ const child = new AsyncProcess(fn, `${this.pname}:${baseName}`, this.fromChild.bind(this));
104
107
  this.children.push(child);
105
108
  child.start(args);
106
109
  return child;
@@ -259,18 +262,31 @@ var Process = class extends AsyncProcess {
259
262
  //#region src/define-actor.ts
260
263
  function defineMessages() {}
261
264
  function defineActor(config) {
265
+ /** Extract __resolvedPlugins from an async process function
266
+ * (set by the parent's fork() for plugin inheritance). */
267
+ const getResolvedPlugins = (f) => {
268
+ return f.__resolvedPlugins;
269
+ };
270
+ /** Stash resolved plugins on a function for the child to read. */
271
+ const stashPlugins = (f, plugs) => {
272
+ f.__resolvedPlugins = plugs;
273
+ };
262
274
  const fn = async function* (ctx, args) {
263
275
  let done = false;
264
276
  let exitReason;
265
277
  let stopRequested = false;
266
278
  const rawState = typeof config.initialState === "function" ? config.initialState(args, ctx) : config.initialState;
267
279
  const exposedState = config.expose ? config.expose(rawState) : rawState;
280
+ const _hooks = new HookRegistry();
268
281
  const self = {
269
282
  ...config.methods || {},
270
283
  state: rawState,
271
284
  name: ctx.pname,
272
285
  id: ctx.id,
273
286
  emit(msg) {
287
+ for (const fn of _hooks.onEmit) try {
288
+ fn(msg);
289
+ } catch {}
274
290
  ctx.toParent(msg);
275
291
  },
276
292
  agreeToStop() {
@@ -282,19 +298,91 @@ function defineActor(config) {
282
298
  done = true;
283
299
  },
284
300
  $child: {},
301
+ onMessage: (fn) => {
302
+ _hooks.onMessage.push(fn);
303
+ },
304
+ onEmit: (fn) => {
305
+ _hooks.onEmit.push(fn);
306
+ },
307
+ onChildExit: (fn) => {
308
+ _hooks.onChildExit.push(fn);
309
+ },
310
+ onStopRequested: (fn) => {
311
+ _hooks.onStopRequested.push(fn);
312
+ },
313
+ onError: (fn) => {
314
+ _hooks.onError.push(fn);
315
+ },
285
316
  fork(childFn, name, childArgs) {
286
317
  const resolved = typeof childFn === "function" ? childFn : childFn.fn;
287
- const child = ctx.fork(resolved, name)(childArgs);
288
- self.$child[name] = child;
318
+ const childDef = typeof childFn === "object" ? childFn : null;
319
+ const childName = name ?? (childDef?.name ? childDef.name : void 0);
320
+ const parentPlugs = config.plugins ? typeof config.plugins === "function" ? config.plugins([]) : config.plugins : [];
321
+ const childRaw = childDef?._pluginsRaw;
322
+ let childPlugs;
323
+ if (!childRaw) childPlugs = [...parentPlugs];
324
+ else if (Array.isArray(childRaw)) childPlugs = [...childRaw];
325
+ else childPlugs = childRaw(parentPlugs);
326
+ stashPlugins(resolved, childPlugs);
327
+ const child = ctx.fork(resolved, childName)(childArgs);
328
+ self.$child[child.pname] = child;
289
329
  return child;
290
330
  },
291
331
  ctx
292
332
  };
333
+ const ctxAny = ctx;
334
+ ctxAny.onMessage = (fn) => {
335
+ _hooks.onMessage.push(fn);
336
+ };
337
+ ctxAny.onEmit = (fn) => {
338
+ _hooks.onEmit.push(fn);
339
+ };
340
+ ctxAny.onChildExit = (fn) => {
341
+ _hooks.onChildExit.push(fn);
342
+ };
343
+ ctxAny.onStart = (fn) => {
344
+ _hooks.onStart.push(fn);
345
+ };
346
+ ctxAny.onStopRequested = (fn) => {
347
+ _hooks.onStopRequested.push(fn);
348
+ };
349
+ ctxAny.onError = (fn) => {
350
+ _hooks.onError.push(fn);
351
+ };
352
+ ctxAny.onEnd = (fn) => {
353
+ _hooks.onEnd.push(fn);
354
+ };
355
+ const resolvedPlugs = getResolvedPlugins(fn) ?? (config.plugins ? typeof config.plugins === "function" ? config.plugins([]) : config.plugins : []);
356
+ for (const p of resolvedPlugs) {
357
+ let _err = null;
358
+ try {
359
+ await p.install(ctx);
360
+ } catch (e) {
361
+ _err = e;
362
+ }
363
+ if (_err) console.error(`[${ctx.pname}] plugin "${p.name}" install failed:`, _err);
364
+ }
365
+ if (config.hooks) {
366
+ const h = config.hooks;
367
+ if (h.onStart) _hooks.onStart.push((state) => h.onStart.call(self, state));
368
+ if (h.onMessage) _hooks.onMessage.push((msg, sender) => h.onMessage.call(self, msg, sender));
369
+ if (h.onEmit) _hooks.onEmit.push((msg) => h.onEmit.call(self, msg));
370
+ if (h.onChildExit) _hooks.onChildExit.push((name) => h.onChildExit.call(self, name));
371
+ if (h.onStopRequested) _hooks.onStopRequested.push(() => h.onStopRequested.call(self));
372
+ if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd.call(self, reason));
373
+ if (h.onError) _hooks.onError.push((err) => h.onError.call(self, err));
374
+ }
293
375
  yield exposedState;
294
376
  if (config.onStart) await config.onStart.call(self, args);
377
+ for (const fn of _hooks.onStart) try {
378
+ await fn(exposedState);
379
+ } catch (e) {}
295
380
  yield* runDispatchAsync(ctx.pname, async (stamped) => {
296
381
  const [msg, sender] = stamped;
297
382
  if (msg.type === "STOP") {
383
+ for (const fn of _hooks.onStopRequested) try {
384
+ await fn();
385
+ } catch {}
298
386
  if (config.onStopRequested) {
299
387
  await config.onStopRequested.call(self);
300
388
  if (!done) stopRequested = true;
@@ -313,25 +401,58 @@ function defineActor(config) {
313
401
  if (msg.type === "EXIT") {
314
402
  const childName = sender.fromName;
315
403
  if (childName && self.$child[childName]) delete self.$child[childName];
404
+ for (const fn of _hooks.onChildExit) try {
405
+ await fn(childName);
406
+ } catch {}
316
407
  if (config.onChildExit) await config.onChildExit.call(self, childName, msg);
317
408
  }
318
- if (msg.type !== "STOP") {
409
+ let hookStopped = false;
410
+ if (msg.type !== "STOP" && msg.type !== "EXIT") for (const fn of _hooks.onMessage) try {
411
+ if (await fn(msg, sender) === STOP_SENTINEL) {
412
+ hookStopped = true;
413
+ break;
414
+ }
415
+ } catch (e) {
416
+ for (const errFn of _hooks.onError) try {
417
+ errFn(e);
418
+ } catch {}
419
+ }
420
+ if (msg.type !== "STOP" && !hookStopped) {
319
421
  const handler = config.handlers[msg.type];
320
- if (handler) await handler.call(self, msg, sender);
321
- else if (config.onUnhandled) await config.onUnhandled.call(self, msg, sender);
422
+ if (handler) try {
423
+ await handler.call(self, msg, sender);
424
+ } catch (e) {
425
+ for (const fn of _hooks.onError) try {
426
+ fn(e);
427
+ } catch {}
428
+ throw e;
429
+ }
430
+ else if (config.onUnhandled) try {
431
+ await config.onUnhandled.call(self, msg, sender);
432
+ } catch (e) {
433
+ for (const fn of _hooks.onError) try {
434
+ fn(e);
435
+ } catch {}
436
+ throw e;
437
+ }
322
438
  }
323
439
  if (done) return;
324
440
  }, () => done);
441
+ for (const fn of _hooks.onEnd) try {
442
+ await fn(exitReason ?? "done");
443
+ } catch {}
325
444
  if (config.onEnd) await config.onEnd.call(self, exitReason ?? "done");
326
445
  };
327
446
  return {
328
447
  fn,
448
+ name: config.name,
449
+ _pluginsRaw: config.plugins,
329
450
  config,
330
451
  spawn(args) {
331
- return spawnAsync(fn, "actor")(args);
452
+ return spawnAsync(fn, config.name ?? "actor")(args);
332
453
  },
333
- spawnAsChild(ctx, name, args) {
334
- return ctx.fork(fn, name)(args);
454
+ spawnAsChild(ctx, args, name) {
455
+ return ctx.fork(fn, name ?? config.name)(args);
335
456
  }
336
457
  };
337
458
  }
@@ -345,6 +466,6 @@ function defineActor(config) {
345
466
  * @module
346
467
  */
347
468
  //#endregion
348
- export { AsyncProcess, Process, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync };
469
+ export { AsyncProcess, HookRegistry, Process, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync, stopPropagation };
349
470
 
350
471
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/adapters.ts","../src/process.async.ts","../src/process.ts","../src/define-actor.ts","../src/index.ts"],"sourcesContent":["import type { ProcessFn, AsyncProcessFn, Message } from \"./types.js\"\n\nexport function asyncify<A, S, IM extends Message, OM extends Message>(\n fn: ProcessFn<A, S, IM, OM>,\n): AsyncProcessFn<A, S, IM, OM> {\n return async function* (ctx, args) {\n yield* fn(ctx, args) as any\n }\n}\n","import { defer, makeWaiter, debugLog } from \"./util.js\";\nimport type { DeferredCall, Waiter } from \"./util.js\";\nimport type {\n Message,\n WithSender,\n SenderInfo,\n ExitMessage,\n ProcessCtx,\n AsyncProcessFn,\n ProcessFn,\n Fork,\n} from \"./types.js\";\nimport { asyncify } from \"./adapters.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** An async iterator over process state. Receives `WithSender<InMessage>`. */\ntype AsyncProcessGenerator<ProcessState, InMessage extends Message> =\n AsyncGenerator<ProcessState | null, void, WithSender<InMessage>>;\n\ntype NotifyFn = () => void;\n\n// ---- runDispatchAsync -------------------------------------------------------\n\ntype AsyncReducer<M> = (msg: M) => Promise<void>;\ntype ReadyFn = () => boolean;\n\n/**\n * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding\n * each incoming message to an `async` reducer. Exits when `readyFn()`\n * returns true.\n */\nexport async function* runDispatchAsync<M>(\n name: string,\n fn: AsyncReducer<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): AsyncGenerator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n await fn(msg);\n }\n}\n\n// ---- AsyncProcess -----------------------------------------------------------\n\ntype ProcessMessageCb<M> = (msg: M) => void;\n\nconst noop = () => null;\n\n/**\n * A process driven by an async generator. Functionally identical to\n * {@link Process} but supports `await` inside reducers.\n *\n * Messages are processed **one at a time** — if a tick is already\n * in-flight, new messages are buffered and processed when the current\n * tick completes.\n */\nexport class AsyncProcess<\n Args,\n State,\n InMessage extends Message,\n OutMessage extends Message,\n> {\n pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;\n pname: string;\n /** Called for every message sent via `ctx.toParent`. Receives `WithSender<OutMessage>`. */\n toParent: ProcessMessageCb<WithSender<OutMessage>>;\n id: symbol;\n state: State | null;\n\n private current: AsyncProcessGenerator<State, InMessage> | null = null;\n /** Every buffered message carries sender provenance. */\n private buffer: Array<WithSender<InMessage>> = [];\n private nextTick: DeferredCall | null = null;\n private children: Array<AsyncProcess<unknown, unknown, Message, Message>> =\n [];\n private subscribers: Array<NotifyFn> = [];\n private exitWaiter: Waiter;\n private _isPaused: boolean = false;\n private _tickInProgress: boolean = false;\n private _exitReject: ((e: unknown) => void) | null = null;\n private _ready!: Waiter;\n private _resolveReady!: () => void;\n\n constructor(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent: ProcessMessageCb<WithSender<OutMessage>> | undefined,\n ) {\n this.pgenerator = fn;\n this.pname = pname;\n this.toParent = toParent || (noop as ProcessMessageCb<WithSender<OutMessage>>);\n this.id = Symbol(pname);\n this.state = null;\n this.exitWaiter = makeWaiter();\n this._ready = makeWaiter();\n this._resolveReady = this._ready.resolve;\n }\n\n /** Promise that resolves once the initial state is available. */\n ready(): Promise<void> {\n return this._ready.promise;\n }\n\n // ---- lifecycle ------------------------------------------------------------\n\n /**\n * Kick off the async generator. The first `yield` sets the initial\n * state; for async generators this happens in a microtask.\n */\n start(arg0: Args) {\n const selfCtx: SenderInfo = { fromName: this.pname, fromId: this.id };\n\n const ctx: ProcessCtx<Args, State, InMessage, OutMessage> = {\n pname: this.pname,\n id: this.id,\n fork: this.fork.bind(this),\n forkSync: this.forkSync.bind(this),\n sendSelf: (msg) => {\n this.send([msg, selfCtx]);\n },\n toParent: (msg) => {\n this.toParent([msg, selfCtx] as WithSender<OutMessage>);\n },\n };\n\n this.current = this._watchExit(ctx, arg0);\n void this.current.next().then((ret: IteratorResult<State | null, void>) => {\n this.state = ret.value ?? null;\n this._resolveReady();\n if (ret.done) {\n this.exitWaiter.resolve();\n return;\n }\n // Advance past the initial yield so the _watchExit generator\n // runs its finally block (EXIT/STOP) and the inner generator\n // enters its dispatch loop.\n const advance: WithSender<InMessage> = [\n { type: \"__ADVANCE__\" } as InMessage,\n { fromName: \"__internal__\", fromId: Symbol(\"__internal__\") } as SenderInfo,\n ];\n this._eatResult(this.current!.next(advance));\n });\n return this;\n }\n\n /** Wrap the user's generator so EXIT/STOP logic fires on completion. */\n private async *_watchExit(\n ctx: ProcessCtx<Args, State, InMessage, OutMessage>,\n arg0: Args,\n ): AsyncProcessGenerator<State, InMessage> {\n try {\n yield* this.pgenerator(ctx, arg0);\n } finally {\n this.toAllChildren({ type: \"STOP\" });\n // ctx.toParent stamps sender info into a WithSender tuple\n ctx.toParent({ type: \"EXIT\" } as unknown as OutMessage);\n }\n }\n\n // ---- fork -----------------------------------------------------------------\n\n fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(\n fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM> {\n return (args: ChildArgs) => {\n const child = new AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>(\n fn,\n pname,\n this.fromChild.bind(this) as unknown as ProcessMessageCb<\n WithSender<ChildOM>\n >,\n );\n this.children.push(\n child as unknown as AsyncProcess<unknown, unknown, Message, Message>,\n );\n child.start(args);\n return child;\n };\n }\n\n forkSync<\n ChildArgs,\n ChildState,\n ChildIM extends Message,\n ChildOM extends Message,\n >(\n fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM> {\n return this.fork(asyncify(fn), pname);\n }\n\n // ---- message processing ---------------------------------------------------\n\n protected async _tick(): Promise<void> {\n if (!this.current || this._tickInProgress) return;\n\n this._tickInProgress = true;\n try {\n let msgAndSender: WithSender<InMessage> | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msgAndSender = this.buffer.shift()) !== undefined) {\n ret = await this._safeNext(msgAndSender);\n if (!ret || ret.done) break;\n }\n this.notify();\n this._eatResult(ret);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n } finally {\n this._tickInProgress = false;\n }\n }\n\n /** Call `.next()` and redirect unhandled rejections. */\n private async _safeNext(\n msgAndSender: WithSender<InMessage>,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msgAndSender);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n return { done: true, value: undefined };\n }\n }\n\n private _eatResult(\n ret:\n | IteratorResult<State | null, void>\n | Promise<IteratorResult<State | null, void>>\n | null,\n ): void {\n if (!ret) return;\n Promise.resolve(ret).then((r) => {\n if (r.done) {\n this.exitWaiter.resolve();\n }\n });\n }\n\n /** Broadcast a message to all children. */\n toAllChildren(msg: Message): void {\n const stamp: SenderInfo = { fromName: this.pname, fromId: this.id };\n this.children.forEach((p) => p.send([msg, stamp] as WithSender<Message>));\n }\n\n /** Stamp and enqueue a message from a named sender (external API). */\n send(msg: InMessage, from: SenderInfo): void;\n /** Enqueue a pre-stamped message (internal: fromChild, toAllChildren). */\n send(msgAndSender: WithSender<InMessage>): void;\n send(msgOrTuple: InMessage | WithSender<InMessage>, from?: SenderInfo): void {\n if (from !== undefined) {\n this.buffer.push([msgOrTuple as InMessage, from]);\n } else {\n this.buffer.push(msgOrTuple as WithSender<InMessage>);\n }\n this._scheduleTick();\n }\n\n /**\n * Synchronously flush the buffer. For sync processes use {@link Process.tick};\n * for async processes this is **not guaranteed** to process everything\n * immediately if reducers contain `await`. Prefer `send()` + `await proc.wait()`.\n */\n tick(): void {\n this.nextTick?.flush();\n this.nextTick = null;\n }\n\n private _scheduleTick(): void {\n if (this._isPaused) return;\n\n this.nextTick?.cancel();\n this.nextTick = defer(() => {\n this.nextTick = null;\n void this._tick();\n });\n }\n\n // ---- subscribers ----------------------------------------------------------\n\n notify(): void {\n this.subscribers.forEach((f) => f());\n }\n\n get isListenedTo(): boolean {\n return this.subscribers.length > 0;\n }\n\n subscribe(f: NotifyFn): () => void {\n this.subscribers.push(f);\n return () => {\n const idx = this.subscribers.indexOf(f);\n if (idx < 0) return;\n this.subscribers.splice(idx, 1);\n };\n }\n\n // ---- pause / resume -------------------------------------------------------\n\n pause(): void {\n this.nextTick?.cancel();\n this.nextTick = null;\n this._isPaused = true;\n }\n\n resume(): void {\n this._isPaused = false;\n this._scheduleTick();\n }\n\n // ---- waiting --------------------------------------------------------------\n\n /**\n * Returns a promise that resolves when the generator completes, or\n * rejects if an unhandled error occurs during message processing.\n */\n wait(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this._exitReject = reject;\n\n this.exitWaiter.promise.then(\n () => {\n this._exitReject = null;\n resolve();\n },\n (e) => {\n this._exitReject = null;\n reject(e);\n },\n );\n });\n }\n\n // ---- child messages -------------------------------------------------------\n\n /** Relays a child's message to this process. The message already carries\n * sender provenance (stamped by the child's `ctx.toParent` wrapper). */\n private fromChild(msgAndSender: WithSender<InMessage>): void {\n const [msg, sender] = msgAndSender;\n if (msg.type === \"EXIT\") {\n // sender.fromId === child's id (set by child's ctx.toParent wrapper)\n this.children = this.children.filter((p) => p.id !== sender.fromId);\n }\n this.send(msgAndSender);\n }\n}\n\n// ---- spawnAsync -------------------------------------------------------------\n\n/**\n * Spawn a new async process. Accepts both sync and async process\n * functions — sync ones are automatically wrapped with {@link asyncify}.\n */\nexport function spawnAsync<\n Args,\n State,\n InMessage extends Message = Message,\n OutMessage extends Message = ExitMessage,\n>(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent?: ProcessMessageCb<WithSender<OutMessage>>,\n): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage> {\n return (args: Args) => {\n const proc = new AsyncProcess<Args, State, InMessage, OutMessage>(\n fn,\n pname,\n toParent,\n );\n proc.start(args);\n return proc;\n };\n}\n","import { AsyncProcess } from \"./process.async.js\";\nimport { asyncify } from \"./adapters.js\";\nimport type { Message, WithSender, ExitMessage, ProcessFn } from \"./types.js\";\n\nexport type { Message, ProcessFn, ProcessCtx } from \"./types.js\";\nexport { runDispatch } from \"./util.js\";\n\n/** @deprecated Use {@link spawnAsync} instead. */\nexport function spawn<\n A,\n S,\n IM extends Message = Message,\n OM extends Message = ExitMessage,\n>(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n): (a: A) => Process<A, S, IM, OM> {\n return (a: A) => new Process(fn, pname, tp).start(a) as Process<A, S, IM, OM>;\n}\n\n/** @deprecated Use {@link AsyncProcess} instead. Sync processes are\n * wrapped via asyncify internally; spawnAsync handles both. */\nclass Process<\n A,\n S,\n IM extends Message,\n OM extends Message,\n> extends AsyncProcess<A, S, IM, OM> {\n constructor(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n ) {\n super(asyncify(fn), pname, tp);\n }\n\n start(a: A) {\n super.start(a);\n return this;\n }\n tick(): Promise<void> {\n return super._tick();\n }\n}\n\nexport { Process };\n","// ── defineActor — high-level actor wrapper ───────────────────────────────────\n//\n// Compiles a declarative config into an AsyncProcessFn. Built on top of\n// the existing runDispatchAsync / spawnAsync primitives.\n//\n// See docs/proposals/define-actor-proposal.md for the full design.\n\nimport { runDispatchAsync, spawnAsync } from \"./process.async.js\";\nimport type {\n SenderInfo,\n WithSender,\n AsyncProcessFn,\n Message,\n ExitMessage,\n ProcessCtx,\n} from \"./types.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n ActorMessages,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Implementation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport function defineMessages<\n OutMsg extends Message = Message,\n>(): ActorMessages<OutMsg> {\n return undefined as unknown as ActorMessages<OutMsg>;\n}\n\nexport function defineActor<\n Args,\n InternalState,\n ExposedState,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n>(\n config: ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n >,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers> {\n // Internal generator receives WithSender<InMsg> so sender identity\n // is directly accessible in the dispatch loop with zero casts.\n const fn = async function* (\n ctx: ProcessCtx<Args, ExposedState, InMsg, OutMsg>,\n args: Args,\n ): AsyncGenerator<ExposedState | null, void, WithSender<InMsg>> {\n let done = false;\n let exitReason: unknown;\n let stopRequested = false;\n\n // Resolve internal state — literal or function of args.\n const rawState: InternalState =\n typeof config.initialState === \"function\"\n ? (\n config.initialState as (\n args: Args,\n ictx: typeof ctx,\n ) => InternalState\n )(args, ctx)\n : config.initialState;\n\n // Apply expose if provided, otherwise identity.\n const exposedState: ExposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n\n // Build the actor context.\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n > = {\n ...((config.methods || {}) as Methods),\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n emit(msg) {\n ctx.toParent(msg);\n },\n agreeToStop() {\n exitReason = \"stopped\";\n done = true;\n },\n exit(reason) {\n exitReason = reason;\n done = true;\n },\n $child: {},\n fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, pass to ctx.fork.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const child = ctx.fork(resolved, name)(childArgs!);\n self.$child[name] = child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message\n >;\n return child;\n },\n ctx,\n };\n\n // Yield the exposed state — external consumers see this.\n yield exposedState;\n\n // Call onStart with args.\n if (config.onStart) {\n await config.onStart.call(self, args);\n }\n\n // Dispatch loop..\n yield* runDispatchAsync<WithSender<InMsg | ExitMessage>>(\n ctx.pname,\n async (stamped) => {\n const [msg, sender] = stamped;\n\n // ── Built-in STOP handling ──────────────────────────────────\n if (msg.type === \"STOP\") {\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n } else {\n // Default: agree immediately.\n exitReason = \"stopped\";\n done = true;\n }\n return;\n }\n\n // ── Re-offer deferred STOP ──────────────────────────────────\n if (stopRequested && !done) {\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n }\n }\n\n // ── Built-in EXIT handling ──────────────────────────────────\n if (msg.type === \"EXIT\") {\n const childName = sender.fromName;\n\n if (childName && self.$child[childName]) {\n // Recognized child — consume EXIT here.\n delete self.$child[childName];\n }\n if (config.onChildExit) {\n await config.onChildExit.call(self, childName, msg as ExitMessage);\n }\n // Unrecognized EXIT — fall through to handlers/onUnhandled.\n }\n\n // ── Named handlers ──────────────────────────────────────────\n if (msg.type !== \"STOP\") {\n const handler = config.handlers[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>;\n if (handler) {\n await handler.call(self, msg as InMsg, sender);\n } else if (config.onUnhandled) {\n await config.onUnhandled.call(self, msg as InMsg, sender);\n }\n // No onUnhandled: silently drop.\n }\n\n if (done) return;\n },\n () => done,\n );\n\n // Call onEnd.\n if (config.onEnd) {\n await config.onEnd.call(self, exitReason ?? \"done\");\n }\n };\n\n return {\n fn: fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n config: config as unknown as ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n {},\n Handlers\n >,\n spawn(args: Args) {\n return spawnAsync(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n \"actor\",\n )(args);\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n name: string,\n args: Args,\n ) {\n return ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name,\n )(args);\n },\n };\n}\n","/**\n * Posipaki — Erlang-inspired lightweight actor processes built on\n * generator functions. Processes communicate via message-passing,\n * can fork children, and expose their state reactively.\n *\n * @module\n */\n\nimport { Process, spawn } from \"./process\";\nimport { runDispatch } from \"./util\";\nimport { AsyncProcess, spawnAsync, runDispatchAsync } from \"./process.async\";\nimport { asyncify } from \"./adapters\";\n\nexport { Process, spawn, runDispatch };\nexport { AsyncProcess, spawnAsync, runDispatchAsync, asyncify };\n\nexport type {\n Message,\n WithSender,\n WithoutSender,\n ExitMessage,\n StopMessage,\n ProcessFn,\n ProcessCtx,\n AsyncProcessFn,\n PipeState,\n SupervisorState,\n SenderOrigin,\n SenderInfo,\n} from \"./types\";\n\nexport { defineActor, defineMessages } from \"./define-actor.js\";\nexport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["fnWithConfig","withPlugins"],"sources":["../src/adapters.ts","../src/process.async.ts","../src/process.ts","../src/define-actor.ts","../src/index.ts"],"sourcesContent":["import type { ProcessFn, AsyncProcessFn, Message } from \"./types.js\"\n\nexport function asyncify<A, S, IM extends Message, OM extends Message>(\n fn: ProcessFn<A, S, IM, OM>,\n): AsyncProcessFn<A, S, IM, OM> {\n return async function* (ctx, args) {\n yield* fn(ctx, args) as any\n }\n}\n","import { defer, makeWaiter, debugLog } from \"./util.js\";\nimport type { DeferredCall, Waiter } from \"./util.js\";\nimport type {\n Message,\n WithSender,\n SenderInfo,\n ExitMessage,\n ProcessCtx,\n AsyncProcessFn,\n ProcessFn,\n Fork,\n} from \"./types.js\";\nimport { asyncify } from \"./adapters.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** An async iterator over process state. Receives `WithSender<InMessage>`. */\ntype AsyncProcessGenerator<ProcessState, InMessage extends Message> =\n AsyncGenerator<ProcessState | null, void, WithSender<InMessage>>;\n\ntype NotifyFn = () => void;\n\n// ---- runDispatchAsync -------------------------------------------------------\n\ntype AsyncReducer<M> = (msg: M) => Promise<void>;\ntype ReadyFn = () => boolean;\n\n/**\n * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding\n * each incoming message to an `async` reducer. Exits when `readyFn()`\n * returns true.\n */\nexport async function* runDispatchAsync<M>(\n name: string,\n fn: AsyncReducer<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): AsyncGenerator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n await fn(msg);\n }\n}\n\n// ---- AsyncProcess -----------------------------------------------------------\n\ntype ProcessMessageCb<M> = (msg: M) => void;\n\nconst noop = () => null;\n\n/**\n * A process driven by an async generator. Functionally identical to\n * {@link Process} but supports `await` inside reducers.\n *\n * Messages are processed **one at a time** — if a tick is already\n * in-flight, new messages are buffered and processed when the current\n * tick completes.\n */\nexport class AsyncProcess<\n Args,\n State,\n InMessage extends Message,\n OutMessage extends Message,\n> {\n pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;\n pname: string;\n /** Called for every message sent via `ctx.toParent`. Receives `WithSender<OutMessage>`. */\n toParent: ProcessMessageCb<WithSender<OutMessage>>;\n id: symbol;\n state: State | null;\n\n private current: AsyncProcessGenerator<State, InMessage> | null = null;\n /** Every buffered message carries sender provenance. */\n private buffer: Array<WithSender<InMessage>> = [];\n private nextTick: DeferredCall | null = null;\n private children: Array<AsyncProcess<unknown, unknown, Message, Message>> =\n [];\n private subscribers: Array<NotifyFn> = [];\n private exitWaiter: Waiter;\n private _isPaused: boolean = false;\n private _tickInProgress: boolean = false;\n private _exitReject: ((e: unknown) => void) | null = null;\n private _ready!: Waiter;\n private _resolveReady!: () => void;\n\n constructor(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent: ProcessMessageCb<WithSender<OutMessage>> | undefined,\n ) {\n this.pgenerator = fn;\n this.pname = pname;\n this.toParent = toParent || (noop as ProcessMessageCb<WithSender<OutMessage>>);\n this.id = Symbol(pname);\n this.state = null;\n this.exitWaiter = makeWaiter();\n this._ready = makeWaiter();\n this._resolveReady = this._ready.resolve;\n }\n\n /** Promise that resolves once the initial state is available. */\n ready(): Promise<void> {\n return this._ready.promise;\n }\n\n // ---- lifecycle ------------------------------------------------------------\n\n /**\n * Kick off the async generator. The first `yield` sets the initial\n * state; for async generators this happens in a microtask.\n */\n start(arg0: Args) {\n const selfCtx: SenderInfo = { fromName: this.pname, fromId: this.id };\n\n const ctx: ProcessCtx<Args, State, InMessage, OutMessage> = {\n pname: this.pname,\n id: this.id,\n fork: this.fork.bind(this),\n forkSync: this.forkSync.bind(this),\n sendSelf: (msg) => {\n this.send([msg, selfCtx]);\n },\n toParent: (msg) => {\n this.toParent([msg, selfCtx] as WithSender<OutMessage>);\n },\n };\n\n this.current = this._watchExit(ctx, arg0);\n void this.current.next().then((ret: IteratorResult<State | null, void>) => {\n this.state = ret.value ?? null;\n this._resolveReady();\n if (ret.done) {\n this.exitWaiter.resolve();\n return;\n }\n // Advance past the initial yield so the _watchExit generator\n // runs its finally block (EXIT/STOP) and the inner generator\n // enters its dispatch loop.\n const advance: WithSender<InMessage> = [\n { type: \"__ADVANCE__\" } as InMessage,\n { fromName: \"__internal__\", fromId: Symbol(\"__internal__\") } as SenderInfo,\n ];\n this._eatResult(this.current!.next(advance));\n });\n return this;\n }\n\n /** Wrap the user's generator so EXIT/STOP logic fires on completion. */\n private async *_watchExit(\n ctx: ProcessCtx<Args, State, InMessage, OutMessage>,\n arg0: Args,\n ): AsyncProcessGenerator<State, InMessage> {\n try {\n yield* this.pgenerator(ctx, arg0);\n } finally {\n this.toAllChildren({ type: \"STOP\" });\n // ctx.toParent stamps sender info into a WithSender tuple\n ctx.toParent({ type: \"EXIT\" } as unknown as OutMessage);\n }\n }\n\n // ---- fork -----------------------------------------------------------------\n\n fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(\n fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname?: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM> {\n return (args: ChildArgs) => {\n // Resolve child name: explicit > fn.config.name > fallback\n // Access config.name from an ActorDefinition if present.\n const fnWithConfig = fn as { config?: { name?: string } };\n const fnConfig = fnWithConfig.config;\n const baseName = pname ?? fnConfig?.name ?? `child-${this.children.length}`;\n const childName = `${this.pname}:${baseName}`;\n const child = new AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>(\n fn,\n childName,\n this.fromChild.bind(this) as unknown as ProcessMessageCb<\n WithSender<ChildOM>\n >,\n );\n this.children.push(\n child as unknown as AsyncProcess<unknown, unknown, Message, Message>,\n );\n child.start(args);\n return child;\n };\n }\n\n forkSync<\n ChildArgs,\n ChildState,\n ChildIM extends Message,\n ChildOM extends Message,\n >(\n fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname?: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM> {\n return this.fork(asyncify(fn), pname);\n }\n\n // ---- message processing ---------------------------------------------------\n\n protected async _tick(): Promise<void> {\n if (!this.current || this._tickInProgress) return;\n\n this._tickInProgress = true;\n try {\n let msgAndSender: WithSender<InMessage> | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msgAndSender = this.buffer.shift()) !== undefined) {\n ret = await this._safeNext(msgAndSender);\n if (!ret || ret.done) break;\n }\n this.notify();\n this._eatResult(ret);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n } finally {\n this._tickInProgress = false;\n }\n }\n\n /** Call `.next()` and redirect unhandled rejections. */\n private async _safeNext(\n msgAndSender: WithSender<InMessage>,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msgAndSender);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n return { done: true, value: undefined };\n }\n }\n\n private _eatResult(\n ret:\n | IteratorResult<State | null, void>\n | Promise<IteratorResult<State | null, void>>\n | null,\n ): void {\n if (!ret) return;\n Promise.resolve(ret).then((r) => {\n if (r.done) {\n this.exitWaiter.resolve();\n }\n });\n }\n\n /** Broadcast a message to all children. */\n toAllChildren(msg: Message): void {\n const stamp: SenderInfo = { fromName: this.pname, fromId: this.id };\n this.children.forEach((p) => p.send([msg, stamp] as WithSender<Message>));\n }\n\n /** Stamp and enqueue a message from a named sender (external API). */\n send(msg: InMessage, from: SenderInfo): void;\n /** Enqueue a pre-stamped message (internal: fromChild, toAllChildren). */\n send(msgAndSender: WithSender<InMessage>): void;\n send(msgOrTuple: InMessage | WithSender<InMessage>, from?: SenderInfo): void {\n if (from !== undefined) {\n this.buffer.push([msgOrTuple as InMessage, from]);\n } else {\n this.buffer.push(msgOrTuple as WithSender<InMessage>);\n }\n this._scheduleTick();\n }\n\n /**\n * Synchronously flush the buffer. For sync processes use {@link Process.tick};\n * for async processes this is **not guaranteed** to process everything\n * immediately if reducers contain `await`. Prefer `send()` + `await proc.wait()`.\n */\n tick(): void {\n this.nextTick?.flush();\n this.nextTick = null;\n }\n\n private _scheduleTick(): void {\n if (this._isPaused) return;\n\n this.nextTick?.cancel();\n this.nextTick = defer(() => {\n this.nextTick = null;\n void this._tick();\n });\n }\n\n // ---- subscribers ----------------------------------------------------------\n\n notify(): void {\n this.subscribers.forEach((f) => f());\n }\n\n get isListenedTo(): boolean {\n return this.subscribers.length > 0;\n }\n\n subscribe(f: NotifyFn): () => void {\n this.subscribers.push(f);\n return () => {\n const idx = this.subscribers.indexOf(f);\n if (idx < 0) return;\n this.subscribers.splice(idx, 1);\n };\n }\n\n // ---- pause / resume -------------------------------------------------------\n\n pause(): void {\n this.nextTick?.cancel();\n this.nextTick = null;\n this._isPaused = true;\n }\n\n resume(): void {\n this._isPaused = false;\n this._scheduleTick();\n }\n\n // ---- waiting --------------------------------------------------------------\n\n /**\n * Returns a promise that resolves when the generator completes, or\n * rejects if an unhandled error occurs during message processing.\n */\n wait(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this._exitReject = reject;\n\n this.exitWaiter.promise.then(\n () => {\n this._exitReject = null;\n resolve();\n },\n (e) => {\n this._exitReject = null;\n reject(e);\n },\n );\n });\n }\n\n // ---- child messages -------------------------------------------------------\n\n /** Relays a child's message to this process. The message already carries\n * sender provenance (stamped by the child's `ctx.toParent` wrapper). */\n private fromChild(msgAndSender: WithSender<InMessage>): void {\n const [msg, sender] = msgAndSender;\n if (msg.type === \"EXIT\") {\n // sender.fromId === child's id (set by child's ctx.toParent wrapper)\n this.children = this.children.filter((p) => p.id !== sender.fromId);\n }\n this.send(msgAndSender);\n }\n}\n\n// ---- spawnAsync -------------------------------------------------------------\n\n/**\n * Spawn a new async process. Accepts both sync and async process\n * functions — sync ones are automatically wrapped with {@link asyncify}.\n */\nexport function spawnAsync<\n Args,\n State,\n InMessage extends Message = Message,\n OutMessage extends Message = ExitMessage,\n>(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent?: ProcessMessageCb<WithSender<OutMessage>>,\n): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage> {\n return (args: Args) => {\n const proc = new AsyncProcess<Args, State, InMessage, OutMessage>(\n fn,\n pname,\n toParent,\n );\n proc.start(args);\n return proc;\n };\n}\n","import { AsyncProcess } from \"./process.async.js\";\nimport { asyncify } from \"./adapters.js\";\nimport type { Message, WithSender, ExitMessage, ProcessFn } from \"./types.js\";\n\nexport type { Message, ProcessFn, ProcessCtx } from \"./types.js\";\nexport { runDispatch } from \"./util.js\";\n\n/** @deprecated Use {@link spawnAsync} instead. */\nexport function spawn<\n A,\n S,\n IM extends Message = Message,\n OM extends Message = ExitMessage,\n>(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n): (a: A) => Process<A, S, IM, OM> {\n return (a: A) => new Process(fn, pname, tp).start(a) as Process<A, S, IM, OM>;\n}\n\n/** @deprecated Use {@link AsyncProcess} instead. Sync processes are\n * wrapped via asyncify internally; spawnAsync handles both. */\nclass Process<\n A,\n S,\n IM extends Message,\n OM extends Message,\n> extends AsyncProcess<A, S, IM, OM> {\n constructor(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n ) {\n super(asyncify(fn), pname, tp);\n }\n\n start(a: A) {\n super.start(a);\n return this;\n }\n tick(): Promise<void> {\n return super._tick();\n }\n}\n\nexport { Process };\n","// ── defineActor — high-level actor wrapper ───────────────────────────────────\n//\n// Compiles a declarative config into an AsyncProcessFn. Built on top of\n// the existing runDispatchAsync / spawnAsync primitives.\n//\n// See docs/proposals/define-actor-proposal.md for the full design.\n\nimport { runDispatchAsync, spawnAsync } from \"./process.async.js\";\nimport type {\n SenderInfo,\n WithSender,\n AsyncProcessFn,\n Message,\n ExitMessage,\n ProcessCtx,\n} from \"./types.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n ActorMessages,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\nimport { HookRegistry, stopPropagation, STOP_SENTINEL } from \"./hooks.js\";\nimport type { ActorPlugin, PluginTransform } from \"./hooks.js\";\nimport type { HookResult, OnMessageHook, OnEmitHook, OnChildExitHook, OnStartHook, OnStopRequestedHook, OnEndHook, OnErrorHook } from \"./hooks.js\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Implementation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport function defineMessages<\n OutMsg extends Message = Message,\n>(): ActorMessages<OutMsg> {\n return undefined as unknown as ActorMessages<OutMsg>;\n}\n\nexport function defineActor<\n Args,\n InternalState,\n ExposedState,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n>(\n config: ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n >,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers> {\n // ── internal helpers ──────────────────────────────────────────────\n\n /** Extract __resolvedPlugins from an async process function\n * (set by the parent's fork() for plugin inheritance). */\n const getResolvedPlugins = (f: unknown): ActorPlugin[] | undefined => {\n const withPlugins = f as { __resolvedPlugins?: ActorPlugin[] };\n return withPlugins.__resolvedPlugins;\n };\n\n /** Stash resolved plugins on a function for the child to read. */\n const stashPlugins = (f: unknown, plugs: ActorPlugin[]): void => {\n (f as { __resolvedPlugins?: ActorPlugin[] }).__resolvedPlugins = plugs;\n };\n\n // Internal generator receives WithSender<InMsg> so sender identity\n // is directly accessible in the dispatch loop with zero casts.\n const fn = async function* (\n ctx: ProcessCtx<Args, ExposedState, InMsg, OutMsg>,\n args: Args,\n ): AsyncGenerator<ExposedState | null, void, WithSender<InMsg>> {\n let done = false;\n let exitReason: unknown;\n let stopRequested = false;\n\n // Resolve internal state — literal or function of args.\n const rawState: InternalState =\n typeof config.initialState === \"function\"\n ? (\n config.initialState as (\n args: Args,\n ictx: typeof ctx,\n ) => InternalState\n )(args, ctx)\n : config.initialState;\n\n // Apply expose if provided, otherwise identity.\n const exposedState: ExposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n\n // ── hooks ──────────────────────────────────────────────────────────\n const _hooks = new HookRegistry<any, any, any>();\n\n // Build the actor context.\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n > = {\n ...((config.methods || {}) as Methods),\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n emit(msg) {\n // Fire onEmit hooks before the actual emit.\n for (const fn of _hooks.onEmit) {\n try { fn(msg); } catch { /* ignore — errors bubble through onError */ }\n }\n ctx.toParent(msg);\n },\n agreeToStop() {\n exitReason = \"stopped\";\n done = true;\n },\n exit(reason) {\n exitReason = reason;\n done = true;\n },\n $child: {},\n // ── hook registration ─────────────────────────────────────\n onMessage: (fn: OnMessageHook<any>) => { _hooks.onMessage.push(fn); },\n onEmit: (fn: OnEmitHook<any>) => { _hooks.onEmit.push(fn); },\n onChildExit: (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); },\n onStopRequested: (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); },\n onError: (fn: OnErrorHook) => { _hooks.onError.push(fn); },\n fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, derive name.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const childDef: ActorDefinition<unknown, unknown, Message, Message, HandlerOptions<Message>> | null =\n typeof childFn === \"object\" ? childFn : null;\n const childName = name\n ?? (childDef?.name ? childDef.name : undefined);\n\n // ── plugin inheritance ───────────────────────────────────────\n // Resolve parent's installed plugins.\n const parentPlugs: ActorPlugin[] = config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : [];\n\n // Merge with child's raw config.\n const childRaw: ActorPlugin[] | PluginTransform | undefined = (childDef as { _pluginsRaw?: ActorPlugin[] | PluginTransform })?._pluginsRaw;\n let childPlugs: ActorPlugin[];\n if (!childRaw) {\n // No child config → inherit all parent plugins.\n childPlugs = [...parentPlugs];\n } else if (Array.isArray(childRaw)) {\n // Array → use exactly these (no inheritance).\n childPlugs = [...childRaw];\n } else {\n // Function → transform parent chain.\n childPlugs = childRaw(parentPlugs);\n }\n\n // Stash resolved list on the child's config before fork.\n stashPlugins(resolved, childPlugs);\n\n const child = ctx.fork(resolved, childName)(childArgs!);\n // Store under the resolved name for $child lookup and EXIT matching.\n self.$child[child.pname] = child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message\n >;\n return child;\n },\n ctx,\n };\n\n\n // ── wire hook registration onto ctx (for plugin install) ──────\n const ctxAny = ctx as Record<string, unknown>;\n ctxAny.onMessage = (fn: OnMessageHook<InMsg>) => { _hooks.onMessage.push(fn); };\n ctxAny.onEmit = (fn: OnEmitHook<OutMsg>) => { _hooks.onEmit.push(fn); };\n ctxAny.onChildExit = (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); };\n ctxAny.onStart = (fn: OnStartHook<ExposedState>) => { _hooks.onStart.push(fn); };\n ctxAny.onStopRequested = (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); };\n ctxAny.onError = (fn: OnErrorHook) => { _hooks.onError.push(fn); };\n ctxAny.onEnd = (fn: OnEndHook) => { _hooks.onEnd.push(fn); };\n\n // ── install plugins ──────────────────────────────────────────────\n // On child actors, __resolvedPlugins is set by the parent's fork().\n // On root actors, use config.plugins directly.\n const resolvedPlugs = getResolvedPlugins(fn)\n ?? (config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : []);\n\n for (const p of resolvedPlugs) {\n let _err: unknown = null;\n try {\n await p.install(ctx);\n } catch (e) {\n _err = e;\n }\n // Also catch sync throws from non-async install functions.\n if (_err) {\n console.error(`[${ctx.pname}] plugin \"${p.name}\" install failed:`, _err);\n }\n }\n\n // ── register config.hooks (after plugins, so plugins fire first) ─\n if (config.hooks) {\n const h = config.hooks;\n if (h.onStart) _hooks.onStart.push((state) => h.onStart!.call(self, state));\n if (h.onMessage) _hooks.onMessage.push((msg, sender) => h.onMessage!.call(self, msg, sender));\n if (h.onEmit) _hooks.onEmit.push((msg) => h.onEmit!.call(self, msg));\n if (h.onChildExit) _hooks.onChildExit.push((name) => h.onChildExit!.call(self, name));\n if (h.onStopRequested) _hooks.onStopRequested.push(() => h.onStopRequested!.call(self));\n if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd!.call(self, reason));\n if (h.onError) _hooks.onError.push((err) => h.onError!.call(self, err));\n }\n\n // Yield the exposed state — external consumers see this.\n yield exposedState;\n\n // Call onStart with args.\n if (config.onStart) {\n await config.onStart.call(self, args);\n }\n\n // Fire hooks.onStart after the actor's own onStart.\n for (const fn of _hooks.onStart) {\n try { await fn(exposedState); } catch (e) { /* error handled by onStart body */ }\n }\n\n // Dispatch loop..\n yield* runDispatchAsync<WithSender<InMsg | ExitMessage>>(\n ctx.pname,\n async (stamped) => {\n const [msg, sender] = stamped;\n\n // ── Built-in STOP handling ──────────────────────────────────\n if (msg.type === \"STOP\") {\n for (const fn of _hooks.onStopRequested) {\n try { await fn(); } catch {}\n }\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n } else {\n // Default: agree immediately.\n exitReason = \"stopped\";\n done = true;\n }\n return;\n }\n\n // ── Re-offer deferred STOP ──────────────────────────────────\n if (stopRequested && !done) {\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n }\n }\n\n // ── Built-in EXIT handling ──────────────────────────────────\n if (msg.type === \"EXIT\") {\n const childName = sender.fromName;\n\n if (childName && self.$child[childName]) {\n // Recognized child — consume EXIT here.\n delete self.$child[childName];\n }\n for (const fn of _hooks.onChildExit) {\n try { await fn(childName); } catch {}\n }\n if (config.onChildExit) {\n await config.onChildExit.call(self, childName, msg as ExitMessage);\n }\n // Unrecognized EXIT — fall through to handlers/onUnhandled.\n }\n\n // ── onMessage hooks ────────────────────────────────────────\n let hookStopped = false;\n if (msg.type !== \"STOP\" && msg.type !== \"EXIT\") {\n for (const fn of _hooks.onMessage) {\n try {\n const result: HookResult = await fn(msg, sender);\n if (result === STOP_SENTINEL) { hookStopped = true; break; }\n } catch (e) {\n // Error in hook: fire onError hooks, then continue.\n for (const errFn of _hooks.onError) {\n try { errFn(e); } catch {}\n }\n }\n }\n }\n\n // ── Named handlers ──────────────────────────────────────────\n if (msg.type !== \"STOP\" && !hookStopped) {\n const handler = config.handlers[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>;\n if (handler) {\n try {\n await handler.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n } else if (config.onUnhandled) {\n try {\n await config.onUnhandled.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n }\n // No onUnhandled: silently drop.\n }\n\n if (done) return;\n },\n () => done,\n );\n\n // Fire hooks.onEnd before the actor's onEnd.\n for (const fn of _hooks.onEnd) {\n try { await fn(exitReason ?? \"done\"); } catch {}\n }\n\n // Call onEnd.\n if (config.onEnd) {\n await config.onEnd.call(self, exitReason ?? \"done\");\n }\n };\n\n return {\n fn: fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name: config.name,\n _pluginsRaw: config.plugins,\n config: config as unknown as ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n {},\n Handlers\n >,\n spawn(args: Args) {\n return spawnAsync(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n config.name ?? \"actor\",\n )(args);\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n args: Args,\n name?: string,\n ) {\n return ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name ?? config.name,\n )(args);\n },\n };\n}\n","/**\n * Posipaki — Erlang-inspired lightweight actor processes built on\n * generator functions. Processes communicate via message-passing,\n * can fork children, and expose their state reactively.\n *\n * @module\n */\n\nimport { Process, spawn } from \"./process\";\nimport { runDispatch } from \"./util\";\nimport { AsyncProcess, spawnAsync, runDispatchAsync } from \"./process.async\";\nimport { asyncify } from \"./adapters\";\n\nexport { Process, spawn, runDispatch };\nexport { AsyncProcess, spawnAsync, runDispatchAsync, asyncify };\n\nexport type {\n Message,\n WithSender,\n WithoutSender,\n ExitMessage,\n StopMessage,\n ProcessFn,\n ProcessCtx,\n AsyncProcessFn,\n PipeState,\n SupervisorState,\n SenderOrigin,\n SenderInfo,\n} from \"./types\";\n\nexport { defineActor, defineMessages } from \"./define-actor.js\";\nexport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n\n// ── hooks ─────────────────────────────────────────────────────────────────\n\nexport { stopPropagation, HookRegistry } from \"./hooks.js\";\nexport type {\n HookResult,\n OnStartHook,\n OnMessageHook,\n OnEmitHook,\n OnChildExitHook,\n OnStopRequestedHook,\n OnEndHook,\n OnErrorHook,\n ActorPlugin,\n ActorDecorated,\n PluginTransform,\n} from \"./hooks.js\";\n"],"mappings":"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"}
package/dist/pipe.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { c as ExitMessage, f as ProcessFn, l as Message } from "./process-BiX7Ena4.js";
1
+ import { n as ExitMessage, o as ProcessFn, r as Message } from "./types-Bau9O_vk.js";
2
2
 
3
3
  //#region src/pipe.d.ts
4
4
  /**
@@ -0,0 +1,11 @@
1
+ import { ActorPlugin } from "../hooks.js";
2
+
3
+ //#region src/plugins/debug-logger.d.ts
4
+ interface DebugLoggerOpts {
5
+ level?: 'debug' | 'info';
6
+ skipHeartbeats?: boolean;
7
+ }
8
+ declare function debugLogger(opts?: DebugLoggerOpts): ActorPlugin;
9
+ //#endregion
10
+ export { DebugLoggerOpts, debugLogger };
11
+ //# sourceMappingURL=debug-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-logger.d.ts","names":[],"sources":["../../src/plugins/debug-logger.ts"],"mappings":";;;UAUiB,eAAA;EACf,KAAA;EACA,cAAc;AAAA;AAAA,iBAGA,WAAA,CAAY,IAAA,GAAO,eAAA,GAAkB,WAAW"}
@@ -0,0 +1,34 @@
1
+ //#region src/plugins/debug-logger.ts
2
+ function debugLogger(opts) {
3
+ const level = opts?.level ?? "debug";
4
+ const skipHbs = opts?.skipHeartbeats ?? true;
5
+ return {
6
+ name: "debugLogger",
7
+ install(ctx) {
8
+ const name = ctx.pname;
9
+ ctx.onMessage?.((msg, sender) => {
10
+ if (skipHbs && msg.type === "HEARTBEAT") return;
11
+ const via = sender ? ` from ${sender.fromName}` : "";
12
+ log(level, `${name} ← ${msg.type}${via}`);
13
+ });
14
+ ctx.onEmit?.((msg) => {
15
+ log(level, `${name} → ${msg.type}`);
16
+ });
17
+ ctx.onChildExit?.((childName) => {
18
+ log(level, `${name}: child ${childName} exited`);
19
+ });
20
+ ctx.onError?.((err) => {
21
+ console.error(`[${name}] error:`, err.message ?? err);
22
+ });
23
+ }
24
+ };
25
+ }
26
+ function log(level, msg) {
27
+ const line = `[${(/* @__PURE__ */ new Date()).toISOString().slice(11, 23)}] ${msg}`;
28
+ if (level === "info") console.info(line);
29
+ else console.debug(line);
30
+ }
31
+ //#endregion
32
+ export { debugLogger };
33
+
34
+ //# sourceMappingURL=debug-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-logger.js","names":[],"sources":["../../src/plugins/debug-logger.ts"],"sourcesContent":["// ── debugLogger Plugin ───────────────────────────────────────────────────\n//\n// Example plugin: logs every message entering and leaving the actor.\n//\n// Usage:\n// import { debugLogger } from 'posipaki/plugins/debug-logger';\n// const MyActor = defineActor({ plugins: [debugLogger()], ... });\n\nimport type { ActorPlugin } from '../hooks.js';\n\nexport interface DebugLoggerOpts {\n level?: 'debug' | 'info';\n skipHeartbeats?: boolean;\n}\n\nexport function debugLogger(opts?: DebugLoggerOpts): ActorPlugin {\n const level = opts?.level ?? 'debug';\n const skipHbs = opts?.skipHeartbeats ?? true;\n\n return {\n name: 'debugLogger',\n install(ctx: any) {\n const name = ctx.pname;\n\n ctx.onMessage?.((msg: any, sender: any) => {\n if (skipHbs && msg.type === 'HEARTBEAT') return;\n const via = sender ? ` from ${sender.fromName}` : '';\n log(level, `${name} ← ${msg.type}${via}`);\n });\n\n ctx.onEmit?.((msg: any) => {\n log(level, `${name} → ${msg.type}`);\n });\n\n ctx.onChildExit?.((childName: string) => {\n log(level, `${name}: child ${childName} exited`);\n });\n\n ctx.onError?.((err: unknown) => {\n console.error(`[${name}] error:`, (err as Error).message ?? err);\n });\n },\n };\n}\n\nfunction log(level: string, msg: string): void {\n const ts = new Date().toISOString().slice(11, 23);\n const line = `[${ts}] ${msg}`;\n if (level === 'info') console.info(line);\n else console.debug(line);\n}\n"],"mappings":";AAeA,SAAgB,YAAY,MAAqC;CAC/D,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,UAAU,MAAM,kBAAkB;CAExC,OAAO;EACL,MAAM;EACN,QAAQ,KAAU;GAChB,MAAM,OAAO,IAAI;GAEjB,IAAI,aAAa,KAAU,WAAgB;IACzC,IAAI,WAAW,IAAI,SAAS,aAAa;IACzC,MAAM,MAAM,SAAS,SAAS,OAAO,aAAa;IAClD,IAAI,OAAO,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK;GAC1C,CAAC;GAED,IAAI,UAAU,QAAa;IACzB,IAAI,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM;GACpC,CAAC;GAED,IAAI,eAAe,cAAsB;IACvC,IAAI,OAAO,GAAG,KAAK,UAAU,UAAU,QAAQ;GACjD,CAAC;GAED,IAAI,WAAW,QAAiB;IAC9B,QAAQ,MAAM,IAAI,KAAK,WAAY,IAAc,WAAW,GAAG;GACjE,CAAC;EACH;CACF;AACF;AAEA,SAAS,IAAI,OAAe,KAAmB;CAE7C,MAAM,OAAO,qBADF,IAAI,KAAK,GAAE,YAAY,EAAE,MAAM,IAAI,EAC5B,EAAE,IAAI;CACxB,IAAI,UAAU,QAAQ,QAAQ,KAAK,IAAI;MAClC,QAAQ,MAAM,IAAI;AACzB"}
@@ -0,0 +1,10 @@
1
+ import { ActorPlugin } from "../hooks.js";
2
+
3
+ //#region src/plugins/rbac.d.ts
4
+ interface RbacOpts {
5
+ allow: string[];
6
+ }
7
+ declare function rbac(opts: RbacOpts): ActorPlugin;
8
+ //#endregion
9
+ export { RbacOpts, rbac };
10
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","names":[],"sources":["../../src/plugins/rbac.ts"],"mappings":";;;UAYiB,QAAA;EACf,KAAK;AAAA;AAAA,iBAGS,IAAA,CAAK,IAAA,EAAM,QAAA,GAAW,WAAW"}
@@ -0,0 +1,21 @@
1
+ import { stopPropagation } from "../hooks.js";
2
+ //#region src/plugins/rbac.ts
3
+ function rbac(opts) {
4
+ const allowed = new Set(opts.allow);
5
+ return {
6
+ name: "rbac",
7
+ install(ctx) {
8
+ ctx.onMessage?.((msg) => {
9
+ const toolName = msg.toolCall?.function?.name ?? msg.type === "TOOL_EXECUTE" ? msg.toolCall?.function?.name : null;
10
+ if (toolName && !allowed.has(toolName)) {
11
+ console.warn(`[${ctx.pname}] blocked tool: ${toolName}`);
12
+ return stopPropagation();
13
+ }
14
+ });
15
+ }
16
+ };
17
+ }
18
+ //#endregion
19
+ export { rbac };
20
+
21
+ //# sourceMappingURL=rbac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.js","names":[],"sources":["../../src/plugins/rbac.ts"],"sourcesContent":["// ── rbac Plugin ──────────────────────────────────────────────────────────\n//\n// Blocks tool execution for tools not in the allowed list.\n// Uses stopPropagation() to prevent handlers from running.\n//\n// Usage:\n// import { rbac } from 'posipaki/plugins/rbac';\n// const MyActor = defineActor({ plugins: [rbac({ allow: ['get_time'] })], ... });\n\nimport type { ActorPlugin } from '../hooks.js';\nimport { stopPropagation } from '../hooks.js';\n\nexport interface RbacOpts {\n allow: string[];\n}\n\nexport function rbac(opts: RbacOpts): ActorPlugin {\n const allowed = new Set(opts.allow);\n\n return {\n name: 'rbac',\n install(ctx: any) {\n ctx.onMessage?.((msg: any) => {\n const toolName = msg.toolCall?.function?.name\n ?? msg.type === 'TOOL_EXECUTE' ? (msg as any).toolCall?.function?.name\n : null;\n\n if (toolName && !allowed.has(toolName)) {\n console.warn(`[${ctx.pname}] blocked tool: ${toolName}`);\n return stopPropagation();\n }\n });\n },\n };\n}\n"],"mappings":";;AAgBA,SAAgB,KAAK,MAA6B;CAChD,MAAM,UAAU,IAAI,IAAI,KAAK,KAAK;CAElC,OAAO;EACL,MAAM;EACN,QAAQ,KAAU;GAChB,IAAI,aAAa,QAAa;IAC5B,MAAM,WAAW,IAAI,UAAU,UAAU,QACpC,IAAI,SAAS,iBAAkB,IAAY,UAAU,UAAU,OAChE;IAEJ,IAAI,YAAY,CAAC,QAAQ,IAAI,QAAQ,GAAG;KACtC,QAAQ,KAAK,IAAI,IAAI,MAAM,kBAAkB,UAAU;KACvD,OAAO,gBAAgB;IACzB;GACF,CAAC;EACH;CACF;AACF"}
@@ -0,0 +1,10 @@
1
+ import { ActorPlugin } from "../hooks.js";
2
+
3
+ //#region src/plugins/timeout-guard.d.ts
4
+ interface TimeoutGuardOpts {
5
+ ms: number;
6
+ }
7
+ declare function timeoutGuard(opts: TimeoutGuardOpts): ActorPlugin;
8
+ //#endregion
9
+ export { TimeoutGuardOpts, timeoutGuard };
10
+ //# sourceMappingURL=timeout-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-guard.d.ts","names":[],"sources":["../../src/plugins/timeout-guard.ts"],"mappings":";;;UAUiB,gBAAA;EACf,EAAE;AAAA;AAAA,iBAGY,YAAA,CAAa,IAAA,EAAM,gBAAA,GAAmB,WAAW"}
@@ -0,0 +1,24 @@
1
+ //#region src/plugins/timeout-guard.ts
2
+ function timeoutGuard(opts) {
3
+ return {
4
+ name: "timeoutGuard",
5
+ install(ctx) {
6
+ let timer = null;
7
+ const reset = () => {
8
+ if (timer) clearTimeout(timer);
9
+ timer = setTimeout(() => {
10
+ console.error(`[${ctx.pname}] timeout after ${opts.ms}ms — exiting`);
11
+ try {
12
+ process.exit(1);
13
+ } catch {}
14
+ }, opts.ms);
15
+ };
16
+ ctx.onMessage?.(() => reset());
17
+ ctx.onStart?.(() => reset());
18
+ }
19
+ };
20
+ }
21
+ //#endregion
22
+ export { timeoutGuard };
23
+
24
+ //# sourceMappingURL=timeout-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-guard.js","names":[],"sources":["../../src/plugins/timeout-guard.ts"],"sourcesContent":["// ── timeoutGuard Plugin ──────────────────────────────────────────────────\n//\n// Kills the actor if no message is received within `ms` milliseconds.\n//\n// Usage:\n// import { timeoutGuard } from 'posipaki/plugins/timeout-guard';\n// const MyActor = defineActor({ plugins: [timeoutGuard({ ms: 30_000 })], ... });\n\nimport type { ActorPlugin } from '../hooks.js';\n\nexport interface TimeoutGuardOpts {\n ms: number;\n}\n\nexport function timeoutGuard(opts: TimeoutGuardOpts): ActorPlugin {\n return {\n name: 'timeoutGuard',\n install(ctx: any) {\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const reset = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n console.error(`[${ctx.pname}] timeout after ${opts.ms}ms — exiting`);\n try { process.exit(1); } catch {}\n }, opts.ms);\n };\n\n ctx.onMessage?.(() => reset());\n ctx.onStart?.(() => reset());\n },\n };\n}\n"],"mappings":";AAcA,SAAgB,aAAa,MAAqC;CAChE,OAAO;EACL,MAAM;EACN,QAAQ,KAAU;GAChB,IAAI,QAA8C;GAElD,MAAM,cAAc;IAClB,IAAI,OAAO,aAAa,KAAK;IAC7B,QAAQ,iBAAiB;KACvB,QAAQ,MAAM,IAAI,IAAI,MAAM,kBAAkB,KAAK,GAAG,aAAa;KACnE,IAAI;MAAE,QAAQ,KAAK,CAAC;KAAG,QAAQ,CAAC;IAClC,GAAG,KAAK,EAAE;GACZ;GAEA,IAAI,kBAAkB,MAAM,CAAC;GAC7B,IAAI,gBAAgB,MAAM,CAAC;EAC7B;CACF;AACF"}
@@ -0,0 +1,33 @@
1
+ import { d as WithSender, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message } from "./types-Bau9O_vk.js";
2
+
3
+ //#region src/util.d.ts
4
+ type ReducerClosure<M> = (msg: M) => void;
5
+ type ReadyFn = () => boolean;
6
+ /**
7
+ * Generator helper that loops, yielding `null` and feeding incoming
8
+ * messages to `fn` until `readyFn()` returns true. Used inside
9
+ * process generators to build the main message loop.
10
+ */
11
+ declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, M>;
12
+ /**
13
+ * @deprecated Use AsyncProcess._watchExit instead.
14
+ *
15
+ * Wrap a process generator so that on completion it sends STOP to
16
+ * all children and EXIT to the parent. Useful for custom process
17
+ * wrappers that need lifecycle management without extending
18
+ * AsyncProcess.
19
+ */
20
+ //#endregion
21
+ //#region src/process.d.ts
22
+ /** @deprecated Use {@link spawnAsync} instead. */
23
+ declare function spawn<A, S, IM extends Message = Message, OM extends Message = ExitMessage>(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void): (a: A) => Process<A, S, IM, OM>;
24
+ /** @deprecated Use {@link AsyncProcess} instead. Sync processes are
25
+ * wrapped via asyncify internally; spawnAsync handles both. */
26
+ declare class Process<A, S, IM extends Message, OM extends Message> extends AsyncProcess<A, S, IM, OM> {
27
+ constructor(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void);
28
+ start(a: A): this;
29
+ tick(): Promise<void>;
30
+ }
31
+ //#endregion
32
+ export { spawn as n, runDispatch as r, Process as t };
33
+ //# sourceMappingURL=process-B1vevrTc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-B1vevrTc.d.ts","names":[],"sources":["../src/util.ts","../src/process.ts"],"mappings":";;;KAOK,cAAA,OAAqB,GAAA,EAAK,CAAC;AAAA,KAC3B,OAAA;;;;;;iBAQK,WAAA,IACR,IAAA,UACA,EAAA,EAAI,cAAA,CAAe,CAAA,GACnB,OAAA,GAAS,OAAA,EACT,UAAA,aACC,SAAA,aAAsB,CAAA;AAdO;AAAA;;;;AACpB;AACC;;;;;iBCDG,KAAA,kBAGH,OAAA,GAAU,OAAA,aACV,OAAA,GAAU,WAAA,EAErB,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GACxB,KAAA,UACA,EAAA,IAAM,CAAA,EAAG,UAAA,CAAW,EAAA,cAClB,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;;;cAMzB,OAAA,kBAGO,OAAA,aACA,OAAA,UACH,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;cAE7B,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GACxB,KAAA,UACA,EAAA,IAAM,CAAA,EAAG,UAAA,CAAW,EAAA;EAKtB,KAAA,CAAM,CAAA,EAAG,CAAA;EAIT,IAAA,IAAQ,OAAA;AAAA"}
@@ -1,4 +1,5 @@
1
- import { _ as WithSender, c as ExitMessage, d as ProcessCtx, f as ProcessFn, t as Process } from "./process-BiX7Ena4.js";
1
+ import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-Bau9O_vk.js";
2
+ import { t as Process } from "./process-B1vevrTc.js";
2
3
 
3
4
  //#region src/supervisor.d.ts
4
5
  type SupMsg = ExitMessage | RunMsg | StopMsg | ErrorMsg | OkMsg;
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","names":[],"sources":["../src/supervisor.ts"],"mappings":";;;KAOK,MAAA,GAAS,WAAA,GAAc,MAAA,GAAS,OAAA,GAAU,QAAA,GAAW,KAAA;AAAA,UAEhD,MAAA;EACR,IAAA;EACA,EAAA,EAAI,SAAS;EACb,IAAA;EACA,KAAA;AAAA;AAAA,UAGQ,OAAA;EACR,IAAI;AAAA;AAAA,UAGI,QAAA;EACR,IAAI;AAAA;AAAA,UAGI,KAAA;EACR,IAAA;EAAA,CACC,GAAW;AAAA;AAAA,UAKG,eAAA;EACf,SAAA,EAAW,OAAO;EAClB,KAAA;AAAA;;;;;;;AApBK;AAAA;iBAiCG,SAAA;EACN,KAAA;EAAO,QAAA;EAAU;AAAA,GAAQ,UAAA,OAAiB,eAAA,EAAiB,MAAA,EAAQ,MAAA,GACrE,IAAA,IAAO,CAAA,EAAG,eAAA,KAAoB,eAAA,EAC9B,UAAA,aACC,SAAA,CAAU,eAAA,eAA8B,UAAA,CAAW,MAAA;;;AAjChD;AAAA;iBAqEG,MAAA,qBACP,UAAA,EAAY,OAAA,WAAkB,MAAA,EAAQ,MAAA,GACtC,EAAA,EAAI,SAAA,CAAU,IAAA,kBACd,KAAA,eACK,IAAA,EAAM,IAAA"}
1
+ {"version":3,"file":"supervisor.d.ts","names":[],"sources":["../src/supervisor.ts"],"mappings":";;;;KAOK,MAAA,GAAS,WAAA,GAAc,MAAA,GAAS,OAAA,GAAU,QAAA,GAAW,KAAA;AAAA,UAEhD,MAAA;EACR,IAAA;EACA,EAAA,EAAI,SAAS;EACb,IAAA;EACA,KAAA;AAAA;AAAA,UAGQ,OAAA;EACR,IAAI;AAAA;AAAA,UAGI,QAAA;EACR,IAAI;AAAA;AAAA,UAGI,KAAA;EACR,IAAA;EAAA,CACC,GAAW;AAAA;AAAA,UAKG,eAAA;EACf,SAAA,EAAW,OAAO;EAClB,KAAA;AAAA;;;;;;;;AApBK;iBAiCG,SAAA;EACN,KAAA;EAAO,QAAA;EAAU;AAAA,GAAQ,UAAA,OAAiB,eAAA,EAAiB,MAAA,EAAQ,MAAA,GACrE,IAAA,IAAO,CAAA,EAAG,eAAA,KAAoB,eAAA,EAC9B,UAAA,aACC,SAAA,CAAU,eAAA,eAA8B,UAAA,CAAW,MAAA;;;;AAjChD;iBAqEG,MAAA,qBACP,UAAA,EAAY,OAAA,WAAkB,MAAA,EAAQ,MAAA,GACtC,EAAA,EAAI,SAAA,CAAU,IAAA,kBACd,KAAA,eACK,IAAA,EAAM,IAAA"}
@@ -1,66 +1,14 @@
1
- //#region src/types.d.ts
2
- /** Base message type. All messages must include a `type` field
3
- * for discrimination in reducers. */
4
- interface Message {
5
- type: string;
6
- }
7
- /** Sender identity. `fromName` is the process name, `fromId` its symbol. */
8
- interface SenderInfo {
9
- fromName: string;
10
- fromId: symbol;
11
- }
12
- /** A message paired with its sender. This is the currency inside the
13
- * framework — every message in the buffer and every value the generator
14
- * receives is `WithSender<M>`. */
15
- type WithSender<M extends Message> = [M, SenderInfo];
16
- /** Extract the message type from a stamped tuple. */
17
- type WithoutSender<T extends WithSender<any>> = T[0];
18
- /** Message emitted by a process to its parent when it terminates.
19
- * The sender's identity is carried in the {@link SenderInfo} tuple. */
20
- type ExitMessage = {
21
- type: "EXIT";
22
- };
23
- type StopMessage = {
24
- type: "STOP";
25
- };
26
- type ProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => Generator<State | null, void, WithSender<InMessage>>;
27
- type AsyncProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => AsyncGenerator<State | null, void, WithSender<InMessage>>;
28
- /** Origin of a message — either a process context or the literal "root"
29
- * (used by the system harness to inject messages from outside). */
30
- type SenderOrigin = ProcessCtx<unknown, unknown, Message, Message> | "root";
31
- type ProcessMessageCb$1<M> = (msg: M) => void;
32
- /** Fork a child process. Takes a ProcessFn and a name, returns a
33
- * curried function that accepts the child's initial args. */
34
- /** Context injected into every running process. */
35
- type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
36
- pname: string;
37
- id: symbol;
38
- sendSelf: (msg: IM) => void;
39
- toParent: ProcessMessageCb$1<OM>;
40
- } & Pick<AsyncProcess<Args, State, IM, OM>, "fork" | "forkSync">;
41
- /** State yielded by the pipe process. */
42
- interface PipeState<Params, Result> {
43
- params: Params | null;
44
- result: Result | null;
45
- running: boolean;
46
- }
47
- /** State yielded by the supervisor process. */
48
- interface SupervisorState {
49
- processes: any[];
50
- phase: "wait" | "running" | "stopping";
51
- }
52
- //#endregion
53
1
  //#region src/process.async.d.ts
54
2
  type NotifyFn = () => void;
55
3
  type AsyncReducer<M> = (msg: M) => Promise<void>;
56
- type ReadyFn$1 = () => boolean;
4
+ type ReadyFn = () => boolean;
57
5
  /**
58
6
  * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding
59
7
  * each incoming message to an `async` reducer. Exits when `readyFn()`
60
8
  * returns true.
61
9
  */
62
- declare function runDispatchAsync<M>(name: string, fn: AsyncReducer<M>, readyFn?: ReadyFn$1, debugLevel?: boolean): AsyncGenerator<null, void, M>;
63
- type ProcessMessageCb<M> = (msg: M) => void;
10
+ declare function runDispatchAsync<M>(name: string, fn: AsyncReducer<M>, readyFn?: ReadyFn, debugLevel?: boolean): AsyncGenerator<null, void, M>;
11
+ type ProcessMessageCb$1<M> = (msg: M) => void;
64
12
  /**
65
13
  * A process driven by an async generator. Functionally identical to
66
14
  * {@link Process} but supports `await` inside reducers.
@@ -73,7 +21,7 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
73
21
  pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;
74
22
  pname: string;
75
23
  /** Called for every message sent via `ctx.toParent`. Receives `WithSender<OutMessage>`. */
76
- toParent: ProcessMessageCb<WithSender<OutMessage>>;
24
+ toParent: ProcessMessageCb$1<WithSender<OutMessage>>;
77
25
  id: symbol;
78
26
  state: State | null;
79
27
  private current;
@@ -88,7 +36,7 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
88
36
  private _exitReject;
89
37
  private _ready;
90
38
  private _resolveReady;
91
- constructor(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb<WithSender<OutMessage>> | undefined);
39
+ constructor(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb$1<WithSender<OutMessage>> | undefined);
92
40
  /** Promise that resolves once the initial state is available. */
93
41
  ready(): Promise<void>;
94
42
  /**
@@ -98,8 +46,8 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
98
46
  start(arg0: Args): this;
99
47
  /** Wrap the user's generator so EXIT/STOP logic fires on completion. */
100
48
  private _watchExit;
101
- fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname: string): (args: ChildArgs) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>;
102
- forkSync<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname: string): (args: ChildArgs) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>;
49
+ fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname?: string): (args: ChildArgs) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>;
50
+ forkSync<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname?: string): (args: ChildArgs) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>;
103
51
  protected _tick(): Promise<void>;
104
52
  /** Call `.next()` and redirect unhandled rejections. */
105
53
  private _safeNext;
@@ -135,36 +83,66 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
135
83
  * Spawn a new async process. Accepts both sync and async process
136
84
  * functions — sync ones are automatically wrapped with {@link asyncify}.
137
85
  */
138
- declare function spawnAsync<Args, State, InMessage extends Message = Message, OutMessage extends Message = ExitMessage>(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent?: ProcessMessageCb<WithSender<OutMessage>>): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage>;
139
- //#endregion
140
- //#region src/util.d.ts
141
- type ReducerClosure<M> = (msg: M) => void;
142
- type ReadyFn = () => boolean;
143
- /**
144
- * Generator helper that loops, yielding `null` and feeding incoming
145
- * messages to `fn` until `readyFn()` returns true. Used inside
146
- * process generators to build the main message loop.
147
- */
148
- declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, M>;
149
- /**
150
- * @deprecated Use AsyncProcess._watchExit instead.
151
- *
152
- * Wrap a process generator so that on completion it sends STOP to
153
- * all children and EXIT to the parent. Useful for custom process
154
- * wrappers that need lifecycle management without extending
155
- * AsyncProcess.
156
- */
86
+ declare function spawnAsync<Args, State, InMessage extends Message = Message, OutMessage extends Message = ExitMessage>(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent?: ProcessMessageCb$1<WithSender<OutMessage>>): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage>;
157
87
  //#endregion
158
- //#region src/process.d.ts
159
- /** @deprecated Use {@link spawnAsync} instead. */
160
- declare function spawn<A, S, IM extends Message = Message, OM extends Message = ExitMessage>(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void): (a: A) => Process<A, S, IM, OM>;
161
- /** @deprecated Use {@link AsyncProcess} instead. Sync processes are
162
- * wrapped via asyncify internally; spawnAsync handles both. */
163
- declare class Process<A, S, IM extends Message, OM extends Message> extends AsyncProcess<A, S, IM, OM> {
164
- constructor(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void);
165
- start(a: A): this;
166
- tick(): Promise<void>;
88
+ //#region src/types.d.ts
89
+ /** Base message type. All messages must include a `type` field
90
+ * for discrimination in reducers. */
91
+ interface Message {
92
+ type: string;
93
+ }
94
+ /** Sender identity. `fromName` is the process name, `fromId` its symbol. */
95
+ interface SenderInfo {
96
+ fromName: string;
97
+ fromId: symbol;
98
+ }
99
+ /** A message paired with its sender. This is the currency inside the
100
+ * framework — every message in the buffer and every value the generator
101
+ * receives is `WithSender<M>`. */
102
+ type WithSender<M extends Message> = [M, SenderInfo];
103
+ /** Extract the message type from a stamped tuple. */
104
+ type WithoutSender<T extends WithSender<any>> = T[0];
105
+ /** Message emitted by a process to its parent when it terminates.
106
+ * The sender's identity is carried in the {@link SenderInfo} tuple. */
107
+ type ExitMessage = {
108
+ type: "EXIT";
109
+ };
110
+ type StopMessage = {
111
+ type: "STOP";
112
+ };
113
+ type ProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => Generator<State | null, void, WithSender<InMessage>>;
114
+ type AsyncProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => AsyncGenerator<State | null, void, WithSender<InMessage>>;
115
+ /** Origin of a message — either a process context or the literal "root"
116
+ * (used by the system harness to inject messages from outside). */
117
+ type SenderOrigin = ProcessCtx<unknown, unknown, Message, Message> | "root";
118
+ type ProcessMessageCb<M> = (msg: M) => void;
119
+ /** Fork a child process. Takes a ProcessFn and a name, returns a
120
+ * curried function that accepts the child's initial args. */
121
+ /** Context injected into every running process. */
122
+ type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
123
+ pname: string;
124
+ id: symbol;
125
+ sendSelf: (msg: IM) => void;
126
+ toParent: ProcessMessageCb<OM>; /** Register an onMessage hook. Return stopPropagation() to short-circuit. */
127
+ onMessage?: (fn: (msg: IM, sender: SenderInfo) => void | Promise<void> | symbol) => void; /** Register an onEmit hook. */
128
+ onEmit?: (fn: (msg: OM) => void) => void; /** Register an onChildExit hook. */
129
+ onChildExit?: (fn: (name: string) => void | Promise<void>) => void; /** Register an onStart hook. */
130
+ onStart?: (fn: (state: State) => void | Promise<void>) => void; /** Register an onStopRequested hook. */
131
+ onStopRequested?: (fn: () => void | Promise<void>) => void; /** Register an onError hook. */
132
+ onError?: (fn: (err: unknown) => void) => void; /** Register an onEnd hook. Fires before the process exits. */
133
+ onEnd?: (fn: (reason: unknown) => void | Promise<void>) => void;
134
+ } & Pick<AsyncProcess<Args, State, IM, OM>, "fork" | "forkSync">;
135
+ /** State yielded by the pipe process. */
136
+ interface PipeState<Params, Result> {
137
+ params: Params | null;
138
+ result: Result | null;
139
+ running: boolean;
140
+ }
141
+ /** State yielded by the supervisor process. */
142
+ interface SupervisorState {
143
+ processes: any[];
144
+ phase: "wait" | "running" | "stopping";
167
145
  }
168
146
  //#endregion
169
- export { WithSender as _, runDispatchAsync as a, ExitMessage as c, ProcessCtx as d, ProcessFn as f, SupervisorState as g, StopMessage as h, AsyncProcess as i, Message as l, SenderOrigin as m, spawn as n, spawnAsync as o, SenderInfo as p, runDispatch as r, AsyncProcessFn as s, Process as t, PipeState as u, WithoutSender as v };
170
- //# sourceMappingURL=process-BiX7Ena4.d.ts.map
147
+ export { ProcessCtx as a, SenderOrigin as c, WithSender as d, WithoutSender as f, spawnAsync as h, PipeState as i, StopMessage as l, runDispatchAsync as m, ExitMessage as n, ProcessFn as o, AsyncProcess as p, Message as r, SenderInfo as s, AsyncProcessFn as t, SupervisorState as u };
148
+ //# sourceMappingURL=types-Bau9O_vk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-Bau9O_vk.d.ts","names":[],"sources":["../src/process.async.ts","../src/types.ts"],"mappings":"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"}
package/dist/xfetch.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { _ as WithSender, c as ExitMessage, d as ProcessCtx, t as Process } from "./process-BiX7Ena4.js";
1
+ import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-Bau9O_vk.js";
2
+ import { t as Process } from "./process-B1vevrTc.js";
2
3
 
3
4
  //#region src/xfetch.d.ts
4
5
  /** State of an in-flight or completed fetch. */
@@ -1 +1 @@
1
- {"version":3,"file":"xfetch.d.ts","names":[],"sources":["../src/xfetch.ts"],"mappings":";;;;KAOY,UAAA;EACV,IAAA;EACA,IAAA,EAAM,CAAA;EACN,IAAA;EACA,MAAA;EACA,eAAA,EAAiB,MAAM;AAAA;;KAIb,SAAA;EAEN,GAAA,EAAK,GAAA;EACL,MAAA;EACA,IAAA;EACA,OAAA,GAAU,MAAA;AAAA;EAGV,GAAA,EAAK,GAAA;EACL,MAAA;EACA,IAAA,EAAM,CAAA;EACN,OAAA,GAAU,MAAA;AAAA;;KAIJ,YAAA;EAEN,IAAA;EACA,IAAA,GAAO,CAAA;EACP,IAAA;EACA,MAAA;EACA,eAAA,EAAiB,MAAA;AAAA;EAEjB,IAAA;AAAA,IACF,WAAA;;KAGQ,YAAA,MAAkB,OAAA,CAC5B,SAAA,CAAU,CAAA,GACV,UAAA,CAAW,CAAA,GACX,YAAA,CAAa,CAAA,GACb,YAAA,CAAa,CAAA;;;;;;iBA0BL,MAAA;EAEN,KAAA;EACA,QAAA;EACA;AAAA,GACC,UAAA,CACD,SAAA,CAAU,IAAA,GACV,UAAA,CAAW,IAAA,GACX,YAAA,CAAa,IAAA,GACb,YAAA,CAAa,IAAA;EAEb,MAAA;EAAgB,GAAA;EAAK,IAAA;EAAM,OAAA,EAAS;AAAA,GAAiB,SAAA,CAAU,IAAA,IAChE,SAAA,CAAU,UAAA,CAAW,IAAA,gBAAoB,UAAA,CAAW,YAAA,CAAa,IAAA"}
1
+ {"version":3,"file":"xfetch.d.ts","names":[],"sources":["../src/xfetch.ts"],"mappings":";;;;;KAOY,UAAA;EACV,IAAA;EACA,IAAA,EAAM,CAAA;EACN,IAAA;EACA,MAAA;EACA,eAAA,EAAiB,MAAM;AAAA;;KAIb,SAAA;EAEN,GAAA,EAAK,GAAA;EACL,MAAA;EACA,IAAA;EACA,OAAA,GAAU,MAAA;AAAA;EAGV,GAAA,EAAK,GAAA;EACL,MAAA;EACA,IAAA,EAAM,CAAA;EACN,OAAA,GAAU,MAAA;AAAA;;KAIJ,YAAA;EAEN,IAAA;EACA,IAAA,GAAO,CAAA;EACP,IAAA;EACA,MAAA;EACA,eAAA,EAAiB,MAAA;AAAA;EAEjB,IAAA;AAAA,IACF,WAAA;;KAGQ,YAAA,MAAkB,OAAA,CAC5B,SAAA,CAAU,CAAA,GACV,UAAA,CAAW,CAAA,GACX,YAAA,CAAa,CAAA,GACb,YAAA,CAAa,CAAA;;;;;;iBA0BL,MAAA;EAEN,KAAA;EACA,QAAA;EACA;AAAA,GACC,UAAA,CACD,SAAA,CAAU,IAAA,GACV,UAAA,CAAW,IAAA,GACX,YAAA,CAAa,IAAA,GACb,YAAA,CAAa,IAAA;EAEb,MAAA;EAAgB,GAAA;EAAK,IAAA;EAAM,OAAA,EAAS;AAAA,GAAiB,SAAA,CAAU,IAAA,IAChE,SAAA,CAAU,UAAA,CAAW,IAAA,gBAAoB,UAAA,CAAW,YAAA,CAAa,IAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "posipaki",
4
- "version": "0.11.0",
4
+ "version": "0.12.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "files": [
@@ -28,6 +28,22 @@
28
28
  "./xfetch": {
29
29
  "types": "./dist/xfetch.d.ts",
30
30
  "default": "./dist/xfetch.js"
31
+ },
32
+ "./plugins/debug-logger": {
33
+ "types": "./dist/plugins/debug-logger.d.ts",
34
+ "default": "./dist/plugins/debug-logger.js"
35
+ },
36
+ "./plugins/timeout-guard": {
37
+ "types": "./dist/plugins/timeout-guard.d.ts",
38
+ "default": "./dist/plugins/timeout-guard.js"
39
+ },
40
+ "./plugins/rbac": {
41
+ "types": "./dist/plugins/rbac.d.ts",
42
+ "default": "./dist/plugins/rbac.js"
43
+ },
44
+ "./hooks": {
45
+ "types": "./dist/hooks.d.ts",
46
+ "default": "./dist/hooks.js"
31
47
  }
32
48
  }
33
49
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-BiX7Ena4.d.ts","names":[],"sources":["../src/types.ts","../src/process.async.ts","../src/util.ts","../src/process.ts"],"mappings":"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"}