@nwire/app 0.7.1 → 0.8.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
@@ -1,46 +1,114 @@
1
1
  # @nwire/app
2
2
 
3
- > Container + plugin lifecycle + envelope.
3
+ > Plugin primitive, framework-event bus, and the lifecycle event catalog every app fires.
4
4
 
5
- ## What it does
6
-
7
- Composes modules and plugins into a managed Container, fires typed framework events at every lifecycle transition, and propagates correlation / tracing / tenant via the envelope. `definePlugin` is the single extension primitive; the bus carries `App*` events (`AppRegistering`, `AppBooting`, `AppBooted`, `AppReady`, `AppShuttingDown`, `AppShutdown`) plus any plugins declare themselves.
8
-
9
- ## Install
5
+ The "app" layer of the sealed architecture. Ships `definePlugin`, the
6
+ typed `FrameworkEventBus`, and the built-in lifecycle events. The
7
+ composition root (`createApp`) currently lives in `@nwire/forge` and
8
+ re-exports everything here so a single import line keeps working.
10
9
 
11
10
  ```bash
12
11
  pnpm add @nwire/app
13
12
  ```
14
13
 
15
- ## Quick start
14
+ ## Quick example
16
15
 
17
16
  ```ts
18
- import { FrameworkEventBus, AppBooted, defineFrameworkEvent } from "@nwire/app";
17
+ import {
18
+ FrameworkEventBus,
19
+ AppBooted,
20
+ PluginBooting,
21
+ defineFrameworkEvent,
22
+ definePlugin,
23
+ } from "@nwire/app";
19
24
  import { NoopLogger } from "@nwire/logger";
20
25
 
21
26
  const bus = new FrameworkEventBus(new NoopLogger());
22
27
 
23
- bus.on(AppBooted, async ({ appName, bootedAt }) => {
28
+ bus.on(AppBooted, ({ appName, bootedAt }) => {
24
29
  console.log(`${appName} booted at ${bootedAt}`);
25
30
  });
26
31
 
32
+ // A series-bail handler can veto by returning `false`.
33
+ bus.on(PluginBooting, ({ pluginName }) => {
34
+ if (pluginName === "broken") return false;
35
+ });
36
+
37
+ // User-defined framework event — same machinery.
27
38
  const TenantSwitched = defineFrameworkEvent<{ tenantId: string }>(
28
39
  "app.tenant-switched",
29
40
  "parallel",
30
41
  );
31
- bus.on(TenantSwitched, ({ tenantId }) => console.log(`switched to ${tenantId}`));
32
-
42
+ bus.on(TenantSwitched, ({ tenantId }) => console.log("→", tenantId));
33
43
  await bus.fire(TenantSwitched, { tenantId: "acme" });
44
+
45
+ // definePlugin — narrow primitive (no forge-specific knowledge).
46
+ export const tracing = definePlugin("tracing", ({ provide, on, boot }) => {
47
+ provide("tracer", {
48
+ boot: () => createTracer(),
49
+ shutdown: (t) => t.shutdown(),
50
+ });
51
+ on(AppBooted, ({ appName }) => console.log(`tracing live on ${appName}`));
52
+ boot(async () => {/* warm-up */});
53
+ });
34
54
  ```
35
55
 
36
- ## API surface
56
+ ## Surface
57
+
58
+ | Export | Role |
59
+ | -------------------------- | ----------------------------------------------------------------- |
60
+ | `FrameworkEventBus` | Typed dispatcher; one per app instance. |
61
+ | `defineFrameworkEvent` | Declare a typed event + its dispatch mode. |
62
+ | `definePlugin(name, setup)`| Narrow plugin: `provide` / `on` / `boot` / `shutdown`. |
63
+ | `isAppPlugin(x)` | Type guard for `definePlugin` output. |
64
+ | `AppRegistering` (series-bail) | Before provider boot — vetoable. |
65
+ | `AppBooting` (series-bail) | After provider boot, before plugin boot — vetoable. |
66
+ | `AppBooted` (parallel) | All plugins booted. |
67
+ | `AppReady` (parallel) | Wire mounted, K8s `/ready` flipped. |
68
+ | `AppShuttingDown` (series-bail) | Vetoable shutdown signal. |
69
+ | `AppShutdown` (parallel) | Everything torn down. |
70
+ | `PluginRegistered` / `PluginBooting` / `PluginBooted` / `PluginShuttingDown` / `PluginShutdown` | Per-plugin lifecycle, all carry an optional `kind: "plugin" \| "module"`. |
71
+ | `WireMounting` (series-bail) / `WireMounted` / `WireUnmounted` | Transport mount lifecycle, fired by `@nwire/endpoint`. |
72
+ | `builtInLifecycleEvents` | Array of every built-in above — useful for observability adapters.|
73
+
74
+ ### Dispatch modes (tense convention)
75
+
76
+ | Mode | Tense | Semantics |
77
+ | ------------- | -------- | ------------------------------------------------------------ |
78
+ | `series-bail` | `*-ing` | Sequential await. Return `false` to short-circuit. |
79
+ | `series` | (rare) | Sequential await. Throw stops the chain. |
80
+ | `parallel` | `*-ed` | `Promise.allSettled`; one failing handler logs but continues.|
81
+
82
+ `FrameworkEventBus.fire()` returns `false` only when a `series-bail`
83
+ handler vetoed; `true` otherwise.
84
+
85
+ ### Module-as-plugin
86
+
87
+ Modules participate in the same plugin lifecycle. `PluginRegistered` /
88
+ `PluginBooting` / `PluginBooted` payloads carry an optional
89
+ `kind: "plugin" | "module"` field so Studio + observability adapters
90
+ render each with the right affordance.
91
+
92
+ ## When to reach for which `definePlugin`
93
+
94
+ | You need… | Use |
95
+ | ---------------------------------------- | ------------------ |
96
+ | Bind a DB / cache / SDK to the container | `@nwire/app` |
97
+ | React to lifecycle events | `@nwire/app` |
98
+ | Intercept every action dispatch | `@nwire/forge` |
99
+ | Hook actor transitions | `@nwire/forge` |
100
+ | `before("action.x", ...)` sugar | `@nwire/forge` |
101
+
102
+ `@nwire/forge`'s richer `definePlugin` is a superset — both shapes
103
+ coexist in the same plugin list and the runtime dispatches each through
104
+ the right wiring path.
105
+
106
+ ## Related
37
107
 
38
- - `defineFrameworkEvent<TPayload>(name, mode)` declare a typed lifecycle event.
39
- - `FrameworkEventBus`typed dispatcher; one per app instance.
40
- - `AppRegistering` / `AppBooting` / `AppBooted` / `AppReady` / `AppShuttingDown` / `AppShutdown` built-in lifecycle events.
41
- - `definePlugin(name, setup)` — closure-form plugin with `bind` / `provide` / `on` / `before` / `after` / `middleware` / `boot` / `shutdown`.
42
- - Dispatch modes — `parallel` (`*-ed`, fire-and-forget), `series` (sequential await), `series-bail` (`*-ing`, vetoable).
108
+ - `@nwire/forge` — wraps this package and adds the action/actor primitives.
109
+ - `@nwire/hooks` — the dispatch substrate; `FrameworkEventBus` adopts a per-event hook lazily so `listHooks()` and `nwire scan` see every framework event.
110
+ - `@nwire/endpoint` fires `WireMounting` / `WireMounted` / `WireUnmounted` on this bus.
43
111
 
44
- ## When to use
112
+ ## Status
45
113
 
46
- The composition root for any non-trivial Nwire app. Standalone: use framework events as a generic typed pub/sub for any lifecycle. Full-stack: pair with `@nwire/forge` and the bus carries `ActionDispatching` / `ActionCompleted` / `ActionFailed` alongside lifecycle events.
114
+ v0.x `definePlugin` closure shape, framework-event catalog, and dispatch modes are locked. `createApp` extraction from forge is a follow-up; imports won't change.
@@ -31,6 +31,7 @@
31
31
  * actor transitions, you don't need forge's plugin form. Use this one.
32
32
  */
33
33
  import type { Container } from "@nwire/container";
34
+ import { type SourceLocation } from "@nwire/messages";
34
35
  import type { FrameworkEventDefinition } from "./framework-events.js";
35
36
  import type { FrameworkEventBus, FrameworkEventHandler } from "./framework-event-bus.js";
36
37
  /**
@@ -118,6 +119,8 @@ export interface AppPluginDefinition {
118
119
  * before proceeding to provider boot.
119
120
  */
120
121
  readonly setup: (ctx: AppPluginContext) => void | Promise<void>;
122
+ /** Call-site of `definePlugin(...)` — Studio + scan render this. */
123
+ readonly $source?: SourceLocation;
121
124
  }
122
125
  /**
123
126
  * Build a plugin. The returned value is opaque — pass it to your app's
@@ -1 +1 @@
1
- {"version":3,"file":"define-plugin.d.ts","sourceRoot":"","sources":["../src/define-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAItF;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9C;AAID;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAEhC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/D;;;;OAIG;IACH,EAAE,CAAC,QAAQ,EACT,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACxC,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAAC;IAER;;;;;OAKG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAE3C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAChD;AAID;;;;;;;;;GASG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAID;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrD,mBAAmB,CAMrB;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,mBAAmB,CAMhE"}
1
+ {"version":3,"file":"define-plugin.d.ts","sourceRoot":"","sources":["../src/define-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAItF;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9C;AAID;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAEhC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/D;;;;OAIG;IACH,EAAE,CAAC,QAAQ,EACT,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACxC,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAAC;IAER;;;;;OAKG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAE3C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAChD;AAID;;;;;;;;;GASG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,oEAAoE;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;CACnC;AAID;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrD,mBAAmB,CAOrB;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,mBAAmB,CAMhE"}
@@ -30,6 +30,7 @@
30
30
  * In other words: if you don't need to peek inside action dispatch or
31
31
  * actor transitions, you don't need forge's plugin form. Use this one.
32
32
  */
33
+ import { captureSourceLocation } from "@nwire/messages";
33
34
  // ─── The factory ──────────────────────────────────────────────────
34
35
  /**
35
36
  * Build a plugin. The returned value is opaque — pass it to your app's
@@ -61,6 +62,7 @@ export function definePlugin(name, setup) {
61
62
  $nwireAppPlugin: true,
62
63
  name,
63
64
  setup,
65
+ $source: captureSourceLocation(),
64
66
  };
65
67
  }
66
68
  /** Type guard — does this look like an app-layer plugin definition? */
@@ -1 +1 @@
1
- {"version":3,"file":"define-plugin.js","sourceRoot":"","sources":["../src/define-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AA8GH,qEAAqE;AAErE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,KAAsD;IAEtD,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,IAAI;QACJ,KAAK;KACN,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACT,CAAmC,CAAC,eAAe,KAAK,IAAI,CAC9D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"define-plugin.js","sourceRoot":"","sources":["../src/define-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,qBAAqB,EAAuB,MAAM,iBAAiB,CAAC;AA8G7E,qEAAqE;AAErE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,KAAsD;IAEtD,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,IAAI;QACJ,KAAK;QACL,OAAO,EAAE,qBAAqB,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACT,CAAmC,CAAC,eAAe,KAAK,IAAI,CAC9D,CAAC;AACJ,CAAC"}
@@ -56,11 +56,39 @@ export type FrameworkEventObserver = (record: FrameworkEventObservation) => void
56
56
  * focused on the domain pipeline. Designed to be reusable — Studio, the
57
57
  * orchestrator, and external plugins all hit the same surface.
58
58
  */
59
+ import { type Hook } from "@nwire/hooks";
59
60
  export declare class FrameworkEventBus {
60
61
  private readonly subs;
61
62
  private readonly observers;
62
63
  private readonly logger;
63
- constructor(logger: Logger);
64
+ /**
65
+ * One hook per event name, lazily created on first `fire()`. Each hook has
66
+ * a single no-op chain step named "dispatch" so every fire emits start +
67
+ * end taps under `framework.event:<eventName>`. The dispatch logic in
68
+ * `fire()` is unchanged — these hooks are an observation surface so
69
+ * `listHooks()` + scan + Studio see every framework event in the
70
+ * registry, not a replacement for the existing dispatcher.
71
+ *
72
+ * Runtime can pass an `adoptHook` callback in the constructor; each
73
+ * lazily-created hook is adopted so taps flow into the canonical
74
+ * telemetry stream as `kind: "hook.step"`.
75
+ */
76
+ private readonly eventHooks;
77
+ private readonly adoptHook?;
78
+ constructor(logger: Logger, options?: {
79
+ adoptHook?: (h: Hook<unknown>) => void;
80
+ /**
81
+ * Built-in framework events to pre-create observation hooks for at
82
+ * construction. Pass the host's known event registry (e.g. forge's
83
+ * `builtInFrameworkEvents`) so `listHooks()` + scan see them BEFORE
84
+ * the first fire — Studio's Hooks page and CLI both consume that.
85
+ */
86
+ events?: ReadonlyArray<{
87
+ readonly name: string;
88
+ }>;
89
+ });
90
+ /** Lazily create + adopt the per-event hook. Called from `fire()`. */
91
+ private ensureEventHook;
64
92
  /**
65
93
  * Subscribe to EVERY framework-event firing on this bus. Used by the
66
94
  * dev logger, Studio Live, and OTel exporter to surface lifecycle
@@ -1 +1 @@
1
- {"version":3,"file":"framework-event-bus.d.ts","sourceRoot":"","sources":["../src/framework-event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,CAAC,QAAQ,IAAI,CAC5C,OAAO,EAAE,QAAQ,KACd,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC;AAO9C;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAC;AAEjF;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8C;IACnE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAI1B;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAQpD,OAAO,CAAC,MAAM;IAgBd;;;;;OAKG;IACH,EAAE,CAAC,QAAQ,EACT,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACxC,QAAQ,GAAE,MAAU,GACnB,MAAM,IAAI;IAgBb;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EACjB,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,QAAQ,GAChB,OAAO,CAAC,OAAO,CAAC;IA8DnB,2EAA2E;IAC3E,eAAe,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM;CAGzD"}
1
+ {"version":3,"file":"framework-event-bus.d.ts","sourceRoot":"","sources":["../src/framework-event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,CAAC,QAAQ,IAAI,CAC5C,OAAO,EAAE,QAAQ,KACd,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC;AAO9C;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAC;AAEjF;;;;GAIG;AACH,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAE/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8C;IACnE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA6B;gBAGtD,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QACP,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;QACvC;;;;;WAKG;QACH,MAAM,CAAC,EAAK,aAAa,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjD;IASR,sEAAsE;IACtE,OAAO,CAAC,eAAe;IAUvB;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAQpD,OAAO,CAAC,MAAM;IAgBd;;;;;OAKG;IACH,EAAE,CAAC,QAAQ,EACT,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACxC,QAAQ,GAAE,MAAU,GACnB,MAAM,IAAI;IAgBb;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EACjB,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,QAAQ,GAChB,OAAO,CAAC,OAAO,CAAC;IAmEnB,2EAA2E;IAC3E,eAAe,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM;CAGzD"}
@@ -27,12 +27,42 @@
27
27
  * focused on the domain pipeline. Designed to be reusable — Studio, the
28
28
  * orchestrator, and external plugins all hit the same surface.
29
29
  */
30
+ import { hook } from "@nwire/hooks";
30
31
  export class FrameworkEventBus {
31
32
  subs = new Map();
32
33
  observers = [];
33
34
  logger;
34
- constructor(logger) {
35
+ /**
36
+ * One hook per event name, lazily created on first `fire()`. Each hook has
37
+ * a single no-op chain step named "dispatch" so every fire emits start +
38
+ * end taps under `framework.event:<eventName>`. The dispatch logic in
39
+ * `fire()` is unchanged — these hooks are an observation surface so
40
+ * `listHooks()` + scan + Studio see every framework event in the
41
+ * registry, not a replacement for the existing dispatcher.
42
+ *
43
+ * Runtime can pass an `adoptHook` callback in the constructor; each
44
+ * lazily-created hook is adopted so taps flow into the canonical
45
+ * telemetry stream as `kind: "hook.step"`.
46
+ */
47
+ eventHooks = new Map();
48
+ adoptHook;
49
+ constructor(logger, options = {}) {
35
50
  this.logger = logger;
51
+ this.adoptHook = options.adoptHook;
52
+ for (const event of options.events ?? []) {
53
+ this.ensureEventHook(event.name);
54
+ }
55
+ }
56
+ /** Lazily create + adopt the per-event hook. Called from `fire()`. */
57
+ ensureEventHook(eventName) {
58
+ let h = this.eventHooks.get(eventName);
59
+ if (h)
60
+ return h;
61
+ h = hook(`framework.event:${eventName}`);
62
+ h.use(async (_, next) => { await next(); }, { name: "dispatch" });
63
+ this.eventHooks.set(eventName, h);
64
+ this.adoptHook?.(h);
65
+ return h;
36
66
  }
37
67
  /**
38
68
  * Subscribe to EVERY framework-event firing on this bus. Used by the
@@ -94,6 +124,11 @@ export class FrameworkEventBus {
94
124
  */
95
125
  async fire(event, payload) {
96
126
  const handlers = (this.subs.get(event.name) ?? []);
127
+ // Observation surface — emit start + end taps via the per-event hook.
128
+ // Cheap (one closure invocation per fire) and adds the event to
129
+ // `listHooks()` for scan + Studio + CLI visibility.
130
+ const eventHook = this.ensureEventHook(event.name);
131
+ await eventHook.run(payload);
97
132
  // Always notify observers — even when no subscribers exist for this
98
133
  // event. The lifecycle is the signal worth recording; subscribers are
99
134
  // an orthogonal concern (could be none in dev, several in prod).
@@ -1 +1 @@
1
- {"version":3,"file":"framework-event-bus.js","sourceRoot":"","sources":["../src/framework-event-bus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"framework-event-bus.js","sourceRoot":"","sources":["../src/framework-event-bus.ts"],"names":[],"mappings":"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"}
@@ -102,9 +102,16 @@ export declare const AppShutdown: FrameworkEventDefinition<{
102
102
  * begins. Useful for an observer that wants to list "what's this app made
103
103
  * of?" before lifecycle starts. Observable; runs in parallel.
104
104
  */
105
+ /**
106
+ * `kind` distinguishes a plugin proper from a module that's been compiled
107
+ * onto the plugin lifecycle. Optional + defaulting to "plugin" so existing
108
+ * subscribers stay back-compat.
109
+ */
110
+ export type PluginKind = "plugin" | "module";
105
111
  export declare const PluginRegistered: FrameworkEventDefinition<{
106
112
  readonly appName: string;
107
113
  readonly pluginName: string;
114
+ readonly kind?: PluginKind;
108
115
  }>;
109
116
  /**
110
117
  * Fired before a plugin's `boot()` callback (object-form) or its `boot(...)`
@@ -115,12 +122,14 @@ export declare const PluginRegistered: FrameworkEventDefinition<{
115
122
  export declare const PluginBooting: FrameworkEventDefinition<{
116
123
  readonly appName: string;
117
124
  readonly pluginName: string;
125
+ readonly kind?: PluginKind;
118
126
  }>;
119
127
  /** Fired after a plugin's boot completes successfully. Observable. */
120
128
  export declare const PluginBooted: FrameworkEventDefinition<{
121
129
  readonly appName: string;
122
130
  readonly pluginName: string;
123
131
  readonly durationMs: number;
132
+ readonly kind?: PluginKind;
124
133
  }>;
125
134
  /**
126
135
  * Fired before a plugin's `shutdown()` callback runs. Interceptable. Used
@@ -129,12 +138,14 @@ export declare const PluginBooted: FrameworkEventDefinition<{
129
138
  export declare const PluginShuttingDown: FrameworkEventDefinition<{
130
139
  readonly appName: string;
131
140
  readonly pluginName: string;
141
+ readonly kind?: PluginKind;
132
142
  }>;
133
143
  /** Fired after a plugin's shutdown completes. Observable. */
134
144
  export declare const PluginShutdown: FrameworkEventDefinition<{
135
145
  readonly appName: string;
136
146
  readonly pluginName: string;
137
147
  readonly durationMs: number;
148
+ readonly kind?: PluginKind;
138
149
  }>;
139
150
  /**
140
151
  * Fired before an interface is attached to a host (typically an endpoint).
@@ -188,20 +199,25 @@ export declare const builtInLifecycleEvents: readonly [FrameworkEventDefinition<
188
199
  }>, FrameworkEventDefinition<{
189
200
  readonly appName: string;
190
201
  readonly pluginName: string;
202
+ readonly kind?: PluginKind;
191
203
  }>, FrameworkEventDefinition<{
192
204
  readonly appName: string;
193
205
  readonly pluginName: string;
206
+ readonly kind?: PluginKind;
194
207
  }>, FrameworkEventDefinition<{
195
208
  readonly appName: string;
196
209
  readonly pluginName: string;
197
210
  readonly durationMs: number;
211
+ readonly kind?: PluginKind;
198
212
  }>, FrameworkEventDefinition<{
199
213
  readonly appName: string;
200
214
  readonly pluginName: string;
215
+ readonly kind?: PluginKind;
201
216
  }>, FrameworkEventDefinition<{
202
217
  readonly appName: string;
203
218
  readonly pluginName: string;
204
219
  readonly durationMs: number;
220
+ readonly kind?: PluginKind;
205
221
  }>, FrameworkEventDefinition<{
206
222
  readonly appName: string;
207
223
  readonly transport: string;
@@ -1 +1 @@
1
- {"version":3,"file":"framework-events.d.ts","sourceRoot":"","sources":["../src/framework-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEvE,wEAAwE;AACxE,MAAM,WAAW,wBAAwB,CAAC,QAAQ,GAAG,OAAO;IAC1D,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAC3C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,kBAAkB,GACvB,wBAAwB,CAAC,QAAQ,CAAC,CAEpC;AAID;;;GAGG;AACH,eAAO,MAAM,cAAc;sBACP,MAAM;EACgB,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,UAAU;sBACH,MAAM;EACY,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,SAAS;sBACF,MAAM;uBACL,MAAM;EACO,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,QAAQ;sBACD,MAAM;sBACN,MAAM;EACO,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,eAAe;sBACR,MAAM;sBACN,MAAM;EACkB,CAAC;AAE7C,iEAAiE;AACjE,eAAO,MAAM,WAAW;sBACJ,MAAM;EACU,CAAC;AAIrC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;sBACT,MAAM;yBACH,MAAM;EACY,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,aAAa;sBACN,MAAM;yBACH,MAAM;EACY,CAAC;AAE1C,sEAAsE;AACtE,eAAO,MAAM,YAAY;sBACL,MAAM;yBACH,MAAM;yBACN,MAAM;EACQ,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,kBAAkB;sBACX,MAAM;yBACH,MAAM;EACkB,CAAC;AAEhD,6DAA6D;AAC7D,eAAO,MAAM,cAAc;sBACP,MAAM;yBACH,MAAM;yBACN,MAAM;EACU,CAAC;AAIxC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;sBACL,MAAM;wBACJ,MAAM;uBACP,OAAO;EACY,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,WAAW;sBACJ,MAAM;wBACJ,MAAM;uBACP,OAAO;EACQ,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,aAAa;sBACN,MAAM;wBACJ,MAAM;EACU,CAAC;AAIvC;;;GAGG;AACH,eAAO,MAAM,sBAAsB;sBArIf,MAAM;;sBASN,MAAM;;sBAQN,MAAM;uBACL,MAAM;;sBASP,MAAM;sBACN,MAAM;;sBASN,MAAM;sBACN,MAAM;;sBAKN,MAAM;;sBAWN,MAAM;yBACH,MAAM;;sBAUT,MAAM;yBACH,MAAM;;sBAKT,MAAM;yBACH,MAAM;yBACN,MAAM;;sBAQT,MAAM;yBACH,MAAM;;sBAKT,MAAM;yBACH,MAAM;yBACN,MAAM;;sBAaT,MAAM;wBACJ,MAAM;uBACP,OAAO;;sBASR,MAAM;wBACJ,MAAM;uBACP,OAAO;;sBAQR,MAAM;wBACJ,MAAM;GAwBlB,CAAC"}
1
+ {"version":3,"file":"framework-events.d.ts","sourceRoot":"","sources":["../src/framework-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEvE,wEAAwE;AACxE,MAAM,WAAW,wBAAwB,CAAC,QAAQ,GAAG,OAAO;IAC1D,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAC3C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,kBAAkB,GACvB,wBAAwB,CAAC,QAAQ,CAAC,CAEpC;AAID;;;GAGG;AACH,eAAO,MAAM,cAAc;sBACP,MAAM;EACgB,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,UAAU;sBACH,MAAM;EACY,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,SAAS;sBACF,MAAM;uBACL,MAAM;EACO,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,QAAQ;sBACD,MAAM;sBACN,MAAM;EACO,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,eAAe;sBACR,MAAM;sBACN,MAAM;EACkB,CAAC;AAE7C,iEAAiE;AACjE,eAAO,MAAM,WAAW;sBACJ,MAAM;EACU,CAAC;AAIrC;;;;GAIG;AACH;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7C,eAAO,MAAM,gBAAgB;sBACL,MAAM;yBACN,MAAM;oBACN,UAAU;EACO,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,aAAa;sBACH,MAAM;yBACN,MAAM;oBACN,UAAU;EACQ,CAAC;AAE1C,sEAAsE;AACtE,eAAO,MAAM,YAAY;sBACF,MAAM;yBACN,MAAM;yBACN,MAAM;oBACN,UAAU;EACI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,kBAAkB;sBACR,MAAM;yBACN,MAAM;oBACN,UAAU;EACc,CAAC;AAEhD,6DAA6D;AAC7D,eAAO,MAAM,cAAc;sBACJ,MAAM;yBACN,MAAM;yBACN,MAAM;oBACN,UAAU;EACM,CAAC;AAIxC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;sBACL,MAAM;wBACJ,MAAM;uBACP,OAAO;EACY,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,WAAW;sBACJ,MAAM;wBACJ,MAAM;uBACP,OAAO;EACQ,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,aAAa;sBACN,MAAM;wBACJ,MAAM;EACU,CAAC;AAIvC;;;GAGG;AACH,eAAO,MAAM,sBAAsB;sBAjJf,MAAM;;sBASN,MAAM;;sBAQN,MAAM;uBACL,MAAM;;sBASP,MAAM;sBACN,MAAM;;sBASN,MAAM;sBACN,MAAM;;sBAKN,MAAM;;sBAkBF,MAAM;yBACN,MAAM;oBACN,UAAU;;sBAUX,MAAM;yBACN,MAAM;oBACN,UAAU;;sBAKV,MAAM;yBACN,MAAM;yBACN,MAAM;oBACN,UAAU;;sBAQV,MAAM;yBACN,MAAM;oBACN,UAAU;;sBAKV,MAAM;yBACN,MAAM;yBACN,MAAM;oBACN,UAAU;;sBAab,MAAM;wBACJ,MAAM;uBACP,OAAO;;sBASR,MAAM;wBACJ,MAAM;uBACP,OAAO;;sBAQR,MAAM;wBACJ,MAAM;GAwBlB,CAAC"}
@@ -75,12 +75,6 @@ export const AppReady = defineFrameworkEvent("nwire.app.ready", "parallel");
75
75
  export const AppShuttingDown = defineFrameworkEvent("nwire.app.shutting-down", "series-bail");
76
76
  /** Fired after `app.stop()` completes — everything torn down. */
77
77
  export const AppShutdown = defineFrameworkEvent("nwire.app.shutdown", "parallel");
78
- // ─── Plugin lifecycle ──────────────────────────────────────────────
79
- /**
80
- * Fired once per plugin during `createApp` composition, before any boot
81
- * begins. Useful for an observer that wants to list "what's this app made
82
- * of?" before lifecycle starts. Observable; runs in parallel.
83
- */
84
78
  export const PluginRegistered = defineFrameworkEvent("nwire.plugin.registered", "parallel");
85
79
  /**
86
80
  * Fired before a plugin's `boot()` callback (object-form) or its `boot(...)`
@@ -1 +1 @@
1
- {"version":3,"file":"framework-events.js","sourceRoot":"","sources":["../src/framework-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAcH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,IAAwB;IAExB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,mEAAmE;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAE/C,uBAAuB,EAAE,aAAa,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,oBAAoB,CAE3C,mBAAmB,EAAE,aAAa,CAAC,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,oBAAoB,CAG1C,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,oBAAoB,CAGzC,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAGhD,yBAAyB,EAAE,aAAa,CAAC,CAAC;AAE7C,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAE5C,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAErC,sEAAsE;AAEtE;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAGjD,yBAAyB,EAAE,UAAU,CAAC,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAG9C,sBAAsB,EAAE,aAAa,CAAC,CAAC;AAE1C,sEAAsE;AACtE,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAI7C,qBAAqB,EAAE,UAAU,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAGnD,4BAA4B,EAAE,aAAa,CAAC,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAI/C,uBAAuB,EAAE,UAAU,CAAC,CAAC;AAExC,sEAAsE;AAEtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAI7C,qBAAqB,EAAE,aAAa,CAAC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAI5C,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAG9C,sBAAsB,EAAE,UAAU,CAAC,CAAC;AAEvC,sEAAsE;AAEtE;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,cAAc;IACd,UAAU;IACV,SAAS;IACT,QAAQ;IACR,eAAe;IACf,WAAW;IACX,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,kBAAkB;IAClB,cAAc;IACd,YAAY;IACZ,WAAW;IACX,aAAa;CACL,CAAC"}
1
+ {"version":3,"file":"framework-events.js","sourceRoot":"","sources":["../src/framework-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAcH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,IAAwB;IAExB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,mEAAmE;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAE/C,uBAAuB,EAAE,aAAa,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,oBAAoB,CAE3C,mBAAmB,EAAE,aAAa,CAAC,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,oBAAoB,CAG1C,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,oBAAoB,CAGzC,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAGhD,yBAAyB,EAAE,aAAa,CAAC,CAAC;AAE7C,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAE5C,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAgBrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAIjD,yBAAyB,EAAE,UAAU,CAAC,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAI9C,sBAAsB,EAAE,aAAa,CAAC,CAAC;AAE1C,sEAAsE;AACtE,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAK7C,qBAAqB,EAAE,UAAU,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAInD,4BAA4B,EAAE,aAAa,CAAC,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAK/C,uBAAuB,EAAE,UAAU,CAAC,CAAC;AAExC,sEAAsE;AAEtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAI7C,qBAAqB,EAAE,aAAa,CAAC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAI5C,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAG9C,sBAAsB,EAAE,UAAU,CAAC,CAAC;AAEvC,sEAAsE;AAEtE;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,cAAc;IACd,UAAU;IACV,SAAS;IACT,QAAQ;IACR,eAAe;IACf,WAAW;IACX,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,kBAAkB;IAClB,cAAc;IACd,YAAY;IACZ,WAAW;IACX,aAAa;CACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nwire/app",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "description": "Nwire — managed Container with plugin lifecycle, framework events, and DI hooks. The 'app' in the sealed architecture: composes modules + plugins, boots in order, exposes a Container, fires framework events at every lifecycle transition. Phase 69 extraction in progress; currently ships the framework events + bus.",
5
5
  "keywords": [
6
6
  "app",
@@ -29,8 +29,10 @@
29
29
  "access": "public"
30
30
  },
31
31
  "dependencies": {
32
- "@nwire/container": "0.7.1",
33
- "@nwire/logger": "0.7.1"
32
+ "@nwire/container": "0.8.0",
33
+ "@nwire/logger": "0.8.0",
34
+ "@nwire/messages": "0.8.0",
35
+ "@nwire/hooks": "0.8.0"
34
36
  },
35
37
  "devDependencies": {
36
38
  "@types/node": "^22.19.9",