@bluelibs/runner-dev 5.3.0 → 6.0.1

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.
Files changed (148) hide show
  1. package/AI.md +25 -3
  2. package/README.md +190 -55
  3. package/dist/cli/generators/artifact.js +2 -14
  4. package/dist/cli/generators/artifact.js.map +1 -1
  5. package/dist/cli/generators/common.d.ts +1 -0
  6. package/dist/cli/generators/common.js +22 -0
  7. package/dist/cli/generators/common.js.map +1 -1
  8. package/dist/cli/generators/printNewHelp.js +2 -2
  9. package/dist/cli/generators/printNewHelp.js.map +1 -1
  10. package/dist/cli/generators/scaffold/templates/package.json.d.ts +2 -2
  11. package/dist/cli/generators/scaffold/templates/package.json.js +2 -2
  12. package/dist/cli/generators/scaffold/templates/src/main.ts.js +7 -9
  13. package/dist/cli/generators/scaffold/templates/src/main.ts.js.map +1 -1
  14. package/dist/cli/generators/scaffold.js +1 -135
  15. package/dist/cli/generators/scaffold.js.map +1 -1
  16. package/dist/cli/generators/templates.js +64 -63
  17. package/dist/cli/generators/templates.js.map +1 -1
  18. package/dist/generated/resolvers-types.d.ts +376 -144
  19. package/dist/index.d.ts +39 -43
  20. package/dist/resources/cli.config.resource.d.ts +1 -1
  21. package/dist/resources/cli.config.resource.js +2 -2
  22. package/dist/resources/cli.config.resource.js.map +1 -1
  23. package/dist/resources/coverage.resource.d.ts +2 -2
  24. package/dist/resources/coverage.resource.js +3 -3
  25. package/dist/resources/coverage.resource.js.map +1 -1
  26. package/dist/resources/dev.resource.d.ts +1 -1
  27. package/dist/resources/dev.resource.js +2 -2
  28. package/dist/resources/dev.resource.js.map +1 -1
  29. package/dist/resources/docs.generator.resource.d.ts +4 -4
  30. package/dist/resources/docs.generator.resource.js +2 -2
  31. package/dist/resources/docs.generator.resource.js.map +1 -1
  32. package/dist/resources/graphql-accumulator.resource.d.ts +2 -2
  33. package/dist/resources/graphql-accumulator.resource.js +6 -3
  34. package/dist/resources/graphql-accumulator.resource.js.map +1 -1
  35. package/dist/resources/graphql.cli.resource.d.ts +1 -1
  36. package/dist/resources/graphql.cli.resource.js +2 -2
  37. package/dist/resources/graphql.cli.resource.js.map +1 -1
  38. package/dist/resources/graphql.query.cli.task.d.ts +14 -16
  39. package/dist/resources/graphql.query.cli.task.js +3 -3
  40. package/dist/resources/graphql.query.cli.task.js.map +1 -1
  41. package/dist/resources/graphql.query.task.d.ts +18 -20
  42. package/dist/resources/graphql.query.task.js +4 -4
  43. package/dist/resources/graphql.query.task.js.map +1 -1
  44. package/dist/resources/http.tag.d.ts +1 -1
  45. package/dist/resources/http.tag.js +2 -2
  46. package/dist/resources/http.tag.js.map +1 -1
  47. package/dist/resources/introspector.cli.resource.d.ts +2 -2
  48. package/dist/resources/introspector.cli.resource.js +14 -6
  49. package/dist/resources/introspector.cli.resource.js.map +1 -1
  50. package/dist/resources/introspector.resource.d.ts +3 -3
  51. package/dist/resources/introspector.resource.js +4 -5
  52. package/dist/resources/introspector.resource.js.map +1 -1
  53. package/dist/resources/live.resource.d.ts +4 -6
  54. package/dist/resources/live.resource.js +38 -25
  55. package/dist/resources/live.resource.js.map +1 -1
  56. package/dist/resources/models/Introspector.d.ts +28 -14
  57. package/dist/resources/models/Introspector.js +334 -161
  58. package/dist/resources/models/Introspector.js.map +1 -1
  59. package/dist/resources/models/durable.runtime.js +36 -10
  60. package/dist/resources/models/durable.runtime.js.map +1 -1
  61. package/dist/resources/models/durable.tools.d.ts +1 -1
  62. package/dist/resources/models/durable.tools.js +6 -3
  63. package/dist/resources/models/durable.tools.js.map +1 -1
  64. package/dist/resources/models/initializeFromStore.js +54 -21
  65. package/dist/resources/models/initializeFromStore.js.map +1 -1
  66. package/dist/resources/models/initializeFromStore.utils.d.ts +7 -6
  67. package/dist/resources/models/initializeFromStore.utils.js +302 -25
  68. package/dist/resources/models/initializeFromStore.utils.js.map +1 -1
  69. package/dist/resources/models/introspector.tools.js +18 -6
  70. package/dist/resources/models/introspector.tools.js.map +1 -1
  71. package/dist/resources/routeHandlers/getDocsData.d.ts +4 -0
  72. package/dist/resources/routeHandlers/getDocsData.js +28 -0
  73. package/dist/resources/routeHandlers/getDocsData.js.map +1 -1
  74. package/dist/resources/routeHandlers/registerHttpRoutes.hook.d.ts +26 -25
  75. package/dist/resources/routeHandlers/registerHttpRoutes.hook.js +10 -9
  76. package/dist/resources/routeHandlers/registerHttpRoutes.hook.js.map +1 -1
  77. package/dist/resources/server.resource.d.ts +20 -22
  78. package/dist/resources/server.resource.js +6 -6
  79. package/dist/resources/server.resource.js.map +1 -1
  80. package/dist/resources/swap.cli.resource.d.ts +4 -4
  81. package/dist/resources/swap.cli.resource.js +2 -2
  82. package/dist/resources/swap.cli.resource.js.map +1 -1
  83. package/dist/resources/swap.resource.d.ts +7 -7
  84. package/dist/resources/swap.resource.js +188 -38
  85. package/dist/resources/swap.resource.js.map +1 -1
  86. package/dist/resources/swap.tools.d.ts +3 -2
  87. package/dist/resources/swap.tools.js +27 -27
  88. package/dist/resources/swap.tools.js.map +1 -1
  89. package/dist/resources/telemetry.resource.d.ts +1 -1
  90. package/dist/resources/telemetry.resource.js +46 -43
  91. package/dist/resources/telemetry.resource.js.map +1 -1
  92. package/dist/runner-compat.d.ts +85 -0
  93. package/dist/runner-compat.js +178 -0
  94. package/dist/runner-compat.js.map +1 -0
  95. package/dist/runner-node-compat.d.ts +2 -0
  96. package/dist/runner-node-compat.js +28 -0
  97. package/dist/runner-node-compat.js.map +1 -0
  98. package/dist/schema/index.js +4 -8
  99. package/dist/schema/index.js.map +1 -1
  100. package/dist/schema/model.d.ts +80 -23
  101. package/dist/schema/model.js.map +1 -1
  102. package/dist/schema/query.js +2 -1
  103. package/dist/schema/query.js.map +1 -1
  104. package/dist/schema/types/AllType.js +6 -3
  105. package/dist/schema/types/AllType.js.map +1 -1
  106. package/dist/schema/types/BaseElementCommon.js +2 -2
  107. package/dist/schema/types/ErrorType.js +1 -1
  108. package/dist/schema/types/ErrorType.js.map +1 -1
  109. package/dist/schema/types/EventType.js +19 -2
  110. package/dist/schema/types/EventType.js.map +1 -1
  111. package/dist/schema/types/LaneSummaryTypes.d.ts +3 -0
  112. package/dist/schema/types/LaneSummaryTypes.js +19 -0
  113. package/dist/schema/types/LaneSummaryTypes.js.map +1 -0
  114. package/dist/schema/types/LiveType.js +67 -0
  115. package/dist/schema/types/LiveType.js.map +1 -1
  116. package/dist/schema/types/ResourceType.js +100 -19
  117. package/dist/schema/types/ResourceType.js.map +1 -1
  118. package/dist/schema/types/RunOptionsType.js +41 -5
  119. package/dist/schema/types/RunOptionsType.js.map +1 -1
  120. package/dist/schema/types/TagType.js +35 -4
  121. package/dist/schema/types/TagType.js.map +1 -1
  122. package/dist/schema/types/TaskType.js +5 -0
  123. package/dist/schema/types/TaskType.js.map +1 -1
  124. package/dist/schema/types/index.d.ts +2 -2
  125. package/dist/schema/types/index.js +6 -7
  126. package/dist/schema/types/index.js.map +1 -1
  127. package/dist/schema/types/middleware/common.d.ts +3 -2
  128. package/dist/schema/types/middleware/common.js +19 -13
  129. package/dist/schema/types/middleware/common.js.map +1 -1
  130. package/dist/ui/.vite/manifest.json +2 -2
  131. package/dist/ui/assets/docs-Btkv97Ls.js +302 -0
  132. package/dist/ui/assets/docs-Btkv97Ls.js.map +1 -0
  133. package/dist/ui/assets/docs-CipvKUxZ.css +1 -0
  134. package/dist/utils/lane-resources.d.ts +55 -0
  135. package/dist/utils/lane-resources.js +143 -0
  136. package/dist/utils/lane-resources.js.map +1 -0
  137. package/dist/utils/zod.js +36 -3
  138. package/dist/utils/zod.js.map +1 -1
  139. package/dist/version.d.ts +1 -1
  140. package/dist/version.js +1 -1
  141. package/package.json +4 -4
  142. package/readmes/runner-AI.md +740 -0
  143. package/readmes/runner-durable-workflows.md +2247 -0
  144. package/readmes/runner-full-guide.md +5869 -0
  145. package/readmes/runner-remote-lanes.md +909 -0
  146. package/dist/ui/assets/docs-BhRuaJ5l.css +0 -1
  147. package/dist/ui/assets/docs-H4oDZj7p.js +0 -302
  148. package/dist/ui/assets/docs-H4oDZj7p.js.map +0 -1
package/AI.md CHANGED
@@ -13,8 +13,25 @@ Runner-Dev is a powerful development toolkit for applications built with the **@
13
13
  - **MCP Integration**: AI-native development environment
14
14
  - **Tags (first-class)**: Discover Tag objects and reverse usage via GraphQL (`tags`, `tag(id)`).
15
15
  - **Documentation UI Overviews**: Sortable and searchable overview tables with a `Used By` counter column for faster cross-element inspection.
16
- - **Visibility Awareness**: Every element exposes `isPrivate` (based on Runner `exports()` boundaries), and resources expose `exports`.
16
+ - **Visibility Awareness**: Every element exposes `isPrivate` (based on Runner `isolate()` boundaries), and resources expose `isolation`.
17
+ - **Subtree Governance Awareness**: Resources expose normalized `subtree` policy summaries (middleware and validator counts per branch).
18
+ - **Lifecycle Awareness**: Resources expose `cooldown` support and run options expose `lifecycleMode`, `disposeBudgetMs`, `disposeDrainBudgetMs`.
19
+ - **Lane Awareness**: Events expose optional `eventLane` summaries (`globals.tags.eventLane`) and both tasks and events expose optional `rpcLane` summaries (`globals.tags.rpcLane`).
20
+ - **Isolation Wildcard Explorer**: Wildcard isolation rules can be clicked to inspect all matching resources in a searchable modal list.
21
+ - **Tag Handlers**: Tag views separate direct tag usages from handler elements that depend on the tag id.
17
22
  - **Task Interceptor Introspection**: Tasks expose `interceptorCount` and `hasInterceptors` for runtime `task.intercept(...)` registrations.
23
+ - **Schema Export Compatibility**: Schema fields prefer `toJSONSchema()` exporters (including matcher-normalized schemas), with `zod` conversion as compatibility fallback.
24
+
25
+ ## Runner 6.0 Migration Notes
26
+
27
+ | Before | After (hard switch) |
28
+ | --------------------- | --------------------------------------------------------- |
29
+ | `Resource.exports` | `Resource.isolation { deny, only, exports, exportsMode }` |
30
+ | `Middleware.global` | `Middleware.autoApply { enabled, scope, hasPredicate }` |
31
+ | `Tag.middlewares` | `Tag.taskMiddlewares` + `Tag.resourceMiddlewares` |
32
+ | N/A | `Tag.errors`, `Tag.targets` |
33
+ | `RunOptions.initMode` | `RunOptions.lifecycleMode` (+ disposal budgets) |
34
+ | `Resource.tunnelInfo` | Removed (hard switch to Event Lane + RPC Lane surfaces) |
18
35
 
19
36
  ## Available GraphQL Queries
20
37
 
@@ -44,7 +61,7 @@ query SystemOverview {
44
61
  shutdownHooks
45
62
  dryRun
46
63
  lazy
47
- initMode
64
+ lifecycleMode
48
65
  runtimeEventCycleDetection
49
66
  hasOnUnhandledError
50
67
  rootId
@@ -71,7 +88,12 @@ query Architecture {
71
88
  resources {
72
89
  id
73
90
  isPrivate
74
- exports
91
+ isolation {
92
+ deny
93
+ only
94
+ exports
95
+ exportsMode
96
+ }
75
97
  meta {
76
98
  title
77
99
  description
package/README.md CHANGED
@@ -11,7 +11,7 @@ Runner Dev Tools provide introspection, live telemetry, and a GraphQL API to exp
11
11
 
12
12
  The way it works, is that this is a resource that opens a graphql server which opens your application to introspection.
13
13
 
14
- If you use `zod` for schemas of your runner primitives, you will get them beautifully transformed to JSON Schemas. This can be made to work with any schema that supports conversion to JSON Schemas.
14
+ If your runner primitives expose `toJSONSchema()` (for example matcher-based normalized schemas), runner-dev uses that as first-class schema export. `zod` schemas are also supported and converted to JSON Schema.
15
15
 
16
16
  ## Install
17
17
 
@@ -22,41 +22,62 @@ npx @bluelibs/runner-dev
22
22
  ```
23
23
 
24
24
  ```ts
25
+ import { r } from "@bluelibs/runner";
25
26
  import { dev } from "@bluelibs/runner-dev";
26
27
 
27
- const app = resource({
28
- register: [
28
+ const app = r
29
+ .resource("app")
30
+ .register([
29
31
  // your resources,
30
32
  dev, // if you are fine with defaults or
31
33
  dev.with({
32
34
  port: 1337, // default,
33
35
  maxEntries: 10000, // how many logs to keep in the store.
34
36
  }),
35
- ],
36
- });
37
+ ])
38
+ .build();
37
39
  ```
38
40
 
39
41
  ## What you get
40
42
 
41
43
  - Fully-featured UI with AI assistance to explore your app, call tasks, emit events, diagnostics, logs and more.
42
44
  - Overview tables across UI sections now include sortable and searchable columns (`ID`, `Title`, `Description`, `Used By`) with per-element usage counters.
43
- - Overview tables now include `Visibility` (`Public`/`Private`) derived from Runner resource `exports()` boundaries.
45
+ - Overview tables now include `Visibility` (`Public`/`Private`) derived from Runner resource `isolate()` boundaries.
44
46
  - Introspector: programmatic API to inspect tasks, hooks, resources, events, middleware, and diagnostics (including file paths, contents)
45
47
  - Task introspection includes runtime `interceptorCount` / `hasInterceptors` (registered via `taskDependency.intercept(...)` in resource init).
46
- - Resource introspection includes `exports` (resolved list of ids exposed by `.exports([...])`).
48
+ - Resource introspection includes `isolation` (`deny`, `only`, `exports`, `exportsMode`) from `.isolate(...)`.
49
+ - Resource introspection includes `subtree` governance summaries (middleware attachment counts and validator counts per branch).
50
+ - Resource introspection indicates whether a resource exposes a `cooldown()` hook for shutdown lifecycle.
51
+ - Isolation wildcard rules are clickable in the docs UI and open a modal showing matched resources with inline filtering when lists are large.
52
+ - Event introspection includes `transactional`, `parallel`, optional `eventLane { laneId, orderingKey, metadata }`, and optional `rpcLane { laneId }`.
53
+ - Task introspection includes optional `rpcLane { laneId }`.
54
+ - Tag pages distinguish between directly tagged elements and tag handlers (elements that depend on the tag id).
47
55
  - Live: in-memory logs and event emissions
48
56
  - Live File Previews and Saving.
49
57
  - GraphQL server: deep graph navigation over your app’s topology and live data
50
58
  - CLI with scaffolding, query-ing capabilities on a live endpoint or via dry-run mode.
51
59
  - MCP server: allow your AI to do introspection for you.
52
60
 
61
+ ## Runner 6.0 Migration Notes
62
+
63
+ | Before | After (hard switch) |
64
+ | --------------------- | -------------------------------------------------------------------------------------------- |
65
+ | `Resource.exports` | `Resource.isolation { deny, only, exports, exportsMode }` |
66
+ | `Middleware.global` | `Middleware.autoApply { enabled, scope, hasPredicate }` |
67
+ | `Tag.middlewares` | `Tag.taskMiddlewares` + `Tag.resourceMiddlewares` |
68
+ | N/A | `Tag.errors`, `Tag.targets` |
69
+ | `RunOptions.initMode` | `RunOptions.lifecycleMode` + `dispose.{ totalBudgetMs, drainingBudgetMs, cooldownWindowMs }` |
70
+ | N/A | `Resource.subtree`, `Resource.cooldown` |
71
+ | N/A | `Event.transactional`, `Event.parallel`, `Event.eventLane`, `Event.rpcLane`, `Task.rpcLane` |
72
+ | `Resource.tunnelInfo` | Removed (hard switch to lane surfaces) |
73
+
53
74
  ## Table of Contents
54
75
 
55
76
  - [Quickstart Guide](#quickstart)
56
77
  - [Model Context Protocol (MCP) Server](#cli-usage-mcp-server)
57
78
  - [CLI Tooling & Scaffolding](#cli-usage-direct)
58
79
  - [Live Telemetry & Correlation](#live-telemetry)
59
- - [Hot-Swapping Debugging System](#-hot-swapping-debugging-system)
80
+ - [Hot-Swapping Debugging System](#hot-swapping-debugging-system)
60
81
  - [GraphQL API Examples](#example-queries)
61
82
  - [API Reference](API_REFERENCE.md)
62
83
  - [Contributing & Local Dev](CONTRIBUTING.md)
@@ -66,27 +87,27 @@ const app = resource({
66
87
  Register the Dev resources in your Runner root:
67
88
 
68
89
  ```ts
69
- import { resource } from "@bluelibs/runner";
90
+ import { r } from "@bluelibs/runner";
70
91
  import { dev } from "@bluelibs/runner-dev";
71
92
 
72
- export const app = resource({
73
- id: "app",
74
- register: [
93
+ export const app = r
94
+ .resource("app")
95
+ .register([
75
96
  // You can omit .with() if you are fine with defaults.
76
97
  dev.with({
77
98
  port: 1337, // default
78
99
  maxEntries: 1000, // default
79
100
  }),
80
101
  // rest of your app.
81
- ],
82
- });
102
+ ])
103
+ .build();
83
104
  ```
84
105
 
85
106
  ### Accessing the UI
86
107
 
87
108
  Once your application is running with the `dev` resource, you can access the visual DevTools UI:
88
109
 
89
- 🚀 **Open [http://localhost:1337](http://localhost:1337) in your browser.**
110
+ Open [http://localhost:1337](http://localhost:1337) in your browser.
90
111
 
91
112
  Inside the UI, you can:
92
113
 
@@ -205,15 +226,15 @@ runner-dev new resource-middleware soft-delete --ns app --dir src --export
205
226
 
206
227
  Flags for artifact scaffolding:
207
228
 
208
- - `--ns` / `--namespace`: namespace used when generating the id (default: `app`)
209
- - `--id <id>`: explicit id override (for example: `app.tasks.save`)
229
+ - `--ns` / `--namespace`: namespace used for folders only, mapped to `<dir>/<ns>/<type>` (default: `app`)
230
+ - `--id <id>`: explicit local id override (for example: `save-user`)
210
231
  - `--dir <dir>`: base directory under which files are created (default: `src`)
211
232
  - `--export`: append a re-export to an `index.ts` in the target folder for better auto-import UX
212
233
  - `--dry` / `--dry-run`: print the generated file without writing it
213
234
 
214
235
  Conventions:
215
236
 
216
- - Generated ids follow: `<namespace>.(resources|tasks|events|tags|task-middleware|resource-middleware).<kebab-name>`
237
+ - Generated ids are local ids only and default to the kebab-cased artifact name
217
238
  - Folders:
218
239
  - resources: `src/resources`
219
240
  - tasks: `src/tasks`
@@ -635,42 +656,40 @@ All Dev UI modals (code viewer, execute, trace view, log details, stats overlay)
635
656
  - Define an event:
636
657
 
637
658
  ```ts
638
- import { event } from "@bluelibs/runner";
659
+ import { r } from "@bluelibs/runner";
639
660
 
640
- export const userCreated = event<{ id: string; name: string }>({
641
- id: "evt.user.created",
642
- });
661
+ export const userCreated = r.event<{ id: string; name: string }>("userCreated").build();
643
662
  ```
644
663
 
645
664
  - Use it in a task:
646
665
 
647
666
  ```ts
648
- import { task } from "@bluelibs/runner";
667
+ import { r } from "@bluelibs/runner";
649
668
  import { userCreated } from "./events";
650
669
 
651
- export const createUser = task({
652
- id: "task.user.create",
653
- dependencies: { userCreated },
654
- async run(input: { name: string }, { userCreated }) {
670
+ export const createUser = r
671
+ .task<{ name: string }>("createUser")
672
+ .dependencies({ userCreated })
673
+ .run(async (input, { userCreated }) => {
655
674
  const id = crypto.randomUUID();
656
675
  await userCreated({ id, name: input.name });
657
676
  return { id };
658
- },
659
- });
677
+ })
678
+ .build();
660
679
  ```
661
680
 
662
681
  - Emit logs:
663
682
 
664
683
  ```ts
665
- import { globals, task } from "@bluelibs/runner";
684
+ import { globals, r } from "@bluelibs/runner";
666
685
 
667
- export const logSomething = task({
668
- id: "task.log",
669
- dependencies: { logger: globals.resources.logger },
670
- async run(_i, { logger }) {
686
+ export const logSomething = r
687
+ .task("logSomething")
688
+ .dependencies({ logger: globals.resources.logger })
689
+ .run(async (_i, { logger }) => {
671
690
  logger.info("Hello world!");
672
- },
673
- });
691
+ })
692
+ .build();
674
693
  ```
675
694
 
676
695
  ## Notes on Overrides
@@ -687,7 +706,7 @@ export const logSomething = task({
687
706
 
688
707
  For full details on development, testing, and codegen, see [CONTRIBUTING.md](CONTRIBUTING.md).
689
708
 
690
- ## 🔥 Hot-Swapping Debugging System
709
+ ## Hot-Swapping Debugging System
691
710
 
692
711
  **Revolutionary live debugging feature that allows AI assistants and developers to dynamically replace task run functions in live applications.**
693
712
 
@@ -707,12 +726,12 @@ The hot-swapping system enables:
707
726
  Add the swap manager to your app:
708
727
 
709
728
  ```ts
710
- import { resource } from "@bluelibs/runner";
729
+ import { r } from "@bluelibs/runner";
711
730
  import { resources as dev } from "@bluelibs/runner-dev";
712
731
 
713
- export const app = resource({
714
- id: "app",
715
- register: [
732
+ export const app = r
733
+ .resource("app")
734
+ .register([
716
735
  // Core dev resources
717
736
  dev.live,
718
737
  dev.introspector,
@@ -722,8 +741,8 @@ export const app = resource({
722
741
 
723
742
  // GraphQL server with swap mutations
724
743
  dev.server.with({ port: 1337 }),
725
- ],
726
- });
744
+ ])
745
+ .build();
727
746
  ```
728
747
 
729
748
  ### GraphQL API
@@ -809,7 +828,7 @@ mutation {
809
828
  await deps.emitLog({
810
829
  timestamp: new Date(),
811
830
  level: "info",
812
- message: "🔍 DEBUG: Creating user started",
831
+ message: "DEBUG: Creating user started",
813
832
  data: { input }
814
833
  });
815
834
  }
@@ -834,7 +853,7 @@ mutation {
834
853
  await deps.emitLog({
835
854
  timestamp: new Date(),
836
855
  level: "info",
837
- message: "🔍 DEBUG: User created successfully",
856
+ message: "DEBUG: User created successfully",
838
857
  data: { result }
839
858
  });
840
859
  }
@@ -915,7 +934,7 @@ Swapped functions can emit logs that are captured by the live telemetry system:
915
934
  # After swapping with debug logging, query the logs
916
935
  query RecentDebugLogs {
917
936
  live {
918
- logs(last: 50, filter: { messageIncludes: "🔍 DEBUG" }) {
937
+ logs(last: 50, filter: { messageIncludes: "DEBUG" }) {
919
938
  timestampMs
920
939
  level
921
940
  message
@@ -1139,7 +1158,7 @@ The system automatically handles complex JavaScript types:
1139
1158
 
1140
1159
  For advanced debugging, the system provides an `eval` mutation to execute arbitrary JavaScript/TypeScript code on the server.
1141
1160
 
1142
- **⚠️ Security Warning**: This feature is powerful and executes code with the same privileges as the application. It is intended for development environments only and is disabled by default in production. To enable it, set the environment variable `RUNNER_DEV_EVAL=1`.
1161
+ **Security Warning**: This feature is powerful and executes code with the same privileges as the application. It is intended for development environments only and is disabled by default in production. To enable it, set the environment variable `RUNNER_DEV_EVAL=1`.
1143
1162
 
1144
1163
  #### `eval` Mutation
1145
1164
 
@@ -1182,13 +1201,129 @@ mutation {
1182
1201
 
1183
1202
  ### Architecture
1184
1203
 
1185
- The hot-swapping system consists of:
1204
+ The hot-swapping system is organized into five high-level capabilities:
1205
+
1206
+ - **Execution Control**: swaps task `run` implementations at runtime and supports rollback.
1207
+ - **Validation Pipeline**: parses and compiles submitted code before activation.
1208
+ - **API Surface**: exposes swap and restore operations through GraphQL mutations.
1209
+ - **Observability**: integrates with live telemetry so swapped behavior can be inspected immediately.
1210
+ - **Safety Controls**: isolates failures to the attempted swap and preserves previous task behavior when validation fails.
1211
+
1212
+ The implementation remains fully type-safe and is covered by both unit and GraphQL integration tests.
1213
+
1214
+ ---
1215
+
1216
+ ## System Architecture
1217
+
1218
+ ### Overview
1219
+
1220
+ Runner-Dev is built as a modular system of resources that integrate with the @bluelibs/runner framework to provide comprehensive development tools. The architecture follows a resource-based composition pattern where each component is a self-contained resource that can be registered and configured independently.
1221
+
1222
+ ### Core Components
1223
+
1224
+ ```mermaid
1225
+ graph TB
1226
+ subgraph "Core Framework (@bluelibs/runner)"
1227
+ App[Application Root]
1228
+ Resource[Resources]
1229
+ Task[Tasks]
1230
+ Event[Events]
1231
+ Middleware[Middleware]
1232
+ Hook[Hooks]
1233
+ Tag[Tags]
1234
+ end
1235
+
1236
+ subgraph "DevTools Layer (@bluelibs/runner-dev)"
1237
+ Dev[dev Resource]
1238
+ Introspector[Introspector]
1239
+ Live[Live Telemetry]
1240
+ Swap[Swap Manager]
1241
+ GraphQL[GraphQL Server]
1242
+ MCP[MCP Server]
1243
+ end
1244
+
1245
+ subgraph "Interfaces"
1246
+ UI[React UI]
1247
+ CLI[CLI Tools]
1248
+ AI[AI Assistants]
1249
+ end
1250
+
1251
+ App --> Dev
1252
+ Dev --> Introspector
1253
+ Dev --> Live
1254
+ Dev --> Swap
1255
+ Dev --> GraphQL
1256
+ GraphQL --> MCP
1257
+
1258
+ Introspector --> Resource
1259
+ Introspector --> Task
1260
+ Introspector --> Event
1261
+ Introspector --> Middleware
1262
+ Introspector --> Hook
1263
+ Introspector --> Tag
1264
+
1265
+ GraphQL --> UI
1266
+ GraphQL --> CLI
1267
+ MCP --> AI
1268
+ ```
1269
+
1270
+ ### Component Responsibilities (High-Level)
1271
+
1272
+ | Layer | Responsibility |
1273
+ | --------------------------- | -------------------------------------------------------------------------------- |
1274
+ | **Composition Layer** | Registers and wires DevTools capabilities into the Runner application lifecycle. |
1275
+ | **Introspection Layer** | Builds a runtime model of tasks, resources, events, middleware, hooks, and tags. |
1276
+ | **Observability Layer** | Captures logs, emissions, errors, runs, and health metrics for analysis. |
1277
+ | **Execution Control Layer** | Supports remote task invocation and controlled hot-swapping workflows. |
1278
+ | **Access Layer** | Exposes a GraphQL API and transports for UI, CLI, and MCP clients. |
1279
+
1280
+ ### Data Flow
1281
+
1282
+ ```mermaid
1283
+ sequenceDiagram
1284
+ participant App as Runner App
1285
+ participant Dev as dev Resource
1286
+ participant Intro as Introspector
1287
+ participant GQL as GraphQL Server
1288
+ participant UI as React UI
1289
+
1290
+ App->>Dev: register dev.with({port: 1337})
1291
+ Dev->>Intro: walk application graph
1292
+ Intro-->>Dev: serialized topology
1293
+ Dev->>GQL: start server on port 1337
1294
+
1295
+ UI->>GQL: query { tasks { id dependsOn } }
1296
+ GQL-->>UI: introspected data
1297
+
1298
+ UI->>GQL: mutation invokeTask(...)
1299
+ GQL->>App: execute task
1300
+ App-->>GQL: result
1301
+ GQL-->>UI: response
1302
+ ```
1303
+
1304
+ ### Key Architectural Patterns
1305
+
1306
+ 1. **Resource-Based Composition**: Everything in Runner is a resource that can be registered and composed. The dev tools themselves are resources.
1307
+
1308
+ 2. **Introspection System**: The Introspector walks the application graph at runtime, extracting metadata about:
1309
+
1310
+ - Tasks (dependencies, emissions, interceptors)
1311
+ - Resources (isolation rules, subtree governance, cooldown hooks)
1312
+ - Events (listeners, transactional/parallel modes, lanes)
1313
+ - Middleware (auto-apply scopes, tags)
1314
+ - Tags (cross-cutting concerns with handlers)
1315
+
1316
+ 3. **Live Telemetry**: In-memory store for recent activity with SSE streaming via `/live/stream`
1317
+
1318
+ 4. **Hot-Swapping**: Modify task implementations without restart via `swapTask` mutation
1319
+
1320
+ 5. **GraphQL API**: Full schema at `src/schema/` with queries for architecture and mutations for invocation/swapping
1321
+
1322
+ 6. **MCP Integration**: AI assistants can connect via Model Context Protocol to introspect and interact with running apps
1186
1323
 
1187
- - **SwapManager Resource** (`src/resources/swap.resource.ts`): Core swapping logic
1188
- - **GraphQL Types** (`src/schema/types/SwapType.ts`): Type definitions for GraphQL API
1189
- - **GraphQL Mutations** (`src/schema/mutation.ts`): Remote swap operations
1190
- - **TypeScript Compiler**: Automatic code compilation and validation
1191
- - **State Management**: Tracking of swapped functions and original code
1192
- - **Error Handling**: Comprehensive validation and recovery mechanisms
1324
+ ### Entry Points
1193
1325
 
1194
- The implementation maintains 100% type safety and provides extensive test coverage with both unit tests and GraphQL integration tests.
1326
+ - **Main export**: `src/index.ts` - exports `dev` resource and types
1327
+ - **CLI entry**: `src/cli.ts` - command-line interface
1328
+ - **MCP entry**: `src/mcp.ts` - Model Context Protocol server
1329
+ - **UI entry**: `src/ui/index.html` - React documentation UI
@@ -14,20 +14,8 @@ async function scaffoldArtifact({ kind, name, namespace, baseDir, dryRun = false
14
14
  const kebab = (0, common_1.toKebabCase)(name);
15
15
  const camel = (0, common_1.toCamelCase)(name);
16
16
  const pascal = (0, common_1.toPascalCase)(name);
17
- const id = explicitId ||
18
- `${namespace}.${kind === "resource"
19
- ? "resources"
20
- : kind === "task"
21
- ? "tasks"
22
- : kind === "event"
23
- ? "events"
24
- : kind === "hook"
25
- ? "hooks"
26
- : kind === "tag"
27
- ? "tags"
28
- : kind === "task-middleware" || kind === "resource-middleware"
29
- ? "middleware"
30
- : kind}.${kebab}`;
17
+ const id = explicitId || kebab;
18
+ (0, common_1.validateLocalId)(id);
31
19
  // Build directory as: <baseDir>/<namespace segments>/<type-collection>
32
20
  const nsSegments = namespace
33
21
  .split(".")
@@ -1 +1 @@
1
- {"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../../src/cli/generators/artifact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../../src/cli/generators/artifact.ts"],"names":[],"mappings":"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"}
@@ -2,3 +2,4 @@ export type ArtifactKind = "project" | "resource" | "task" | "event" | "hook" |
2
2
  export declare function toKebabCase(input: string): string;
3
3
  export declare function toCamelCase(input: string): string;
4
4
  export declare function toPascalCase(input: string): string;
5
+ export declare function validateLocalId(id: string): void;
@@ -3,6 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.toKebabCase = toKebabCase;
4
4
  exports.toCamelCase = toCamelCase;
5
5
  exports.toPascalCase = toPascalCase;
6
+ exports.validateLocalId = validateLocalId;
7
+ const RESERVED_LOCAL_IDS = new Set([
8
+ "tasks",
9
+ "resources",
10
+ "events",
11
+ "hooks",
12
+ "tags",
13
+ "errors",
14
+ "asyncContexts",
15
+ ]);
6
16
  function toKebabCase(input) {
7
17
  return input
8
18
  .replace(/([a-z])([A-Z])/g, "$1-$2")
@@ -21,4 +31,16 @@ function toPascalCase(input) {
21
31
  const s = toCamelCase(input);
22
32
  return s.charAt(0).toUpperCase() + s.slice(1);
23
33
  }
34
+ function validateLocalId(id) {
35
+ const trimmedId = id.trim();
36
+ if (!trimmedId) {
37
+ throw new Error("Definition id cannot be empty.");
38
+ }
39
+ if (trimmedId.includes(".")) {
40
+ throw new Error(`Definition id "${trimmedId}" is invalid. Use a local id without dots, for example "create-user".`);
41
+ }
42
+ if (RESERVED_LOCAL_IDS.has(trimmedId)) {
43
+ throw new Error(`Definition id "${trimmedId}" is reserved. Choose a different local id.`);
44
+ }
45
+ }
24
46
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/cli/generators/common.ts"],"names":[],"mappings":";;AAUA,kCAMC;AAED,kCAMC;AAED,oCAGC;AAnBD,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK;SACT,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;SACzB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACrE,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,CAAC,IAAI,MAAM,CAAC;AACrB,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa;IACxC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/cli/generators/common.ts"],"names":[],"mappings":";;AAoBA,kCAMC;AAED,kCAMC;AAED,oCAGC;AAED,0CAkBC;AAjDD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,OAAO;IACP,WAAW;IACX,QAAQ;IACR,OAAO;IACP,MAAM;IACN,QAAQ;IACR,eAAe;CAChB,CAAC,CAAC;AAEH,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK;SACT,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;SACzB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACrE,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,CAAC,IAAI,MAAM,CAAC;AACrB,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa;IACxC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,eAAe,CAAC,EAAU;IACxC,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,uEAAuE,CACnG,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,6CAA6C,CACzE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -37,9 +37,9 @@ function printNewHelp() {
37
37
  [format_1.c.yellow("--run-tests"), "Run 'npm test' after project scaffold"],
38
38
  [
39
39
  format_1.c.yellow("--ns=<namespace>"),
40
- "Namespace for id (default: app). Also maps to path as <dir>/<ns>/<type>.",
40
+ "Namespace for folders (default: app). Maps to <dir>/<ns>/<type>.",
41
41
  ],
42
- [format_1.c.yellow("--id=<id>"), "Explicit id override (ex: app.tasks.save)"],
42
+ [format_1.c.yellow("--id=<id>"), "Explicit local id override (ex: save-user)"],
43
43
  [format_1.c.yellow("--dir=<dir>"), "Base directory (default: src)"],
44
44
  [format_1.c.yellow("--export"), "Append export to <dir>/.../index.ts"],
45
45
  [format_1.c.yellow("--dry"), "Print file to stdout, do not write"],
@@ -1 +1 @@
1
- {"version":3,"file":"printNewHelp.js","sourceRoot":"","sources":["../../../src/cli/generators/printNewHelp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"printNewHelp.js","sourceRoot":"","sources":["../../../src/cli/generators/printNewHelp.ts"],"names":[],"mappings":"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"}
@@ -12,10 +12,10 @@ export declare function packageJson(projectName: string): {
12
12
  readonly "schema:sdl": "runner-dev schema sdl";
13
13
  };
14
14
  readonly dependencies: {
15
- readonly "@bluelibs/runner": "^5.2.0";
15
+ readonly "@bluelibs/runner": "^6.0.0";
16
16
  };
17
17
  readonly devDependencies: {
18
- readonly "@bluelibs/runner-dev": "^5.0.0";
18
+ readonly "@bluelibs/runner-dev": "^6.0.0";
19
19
  readonly typescript: "^5.6.3";
20
20
  readonly tsx: "^4.19.2";
21
21
  readonly jest: "^29.7.0";
@@ -16,10 +16,10 @@ function packageJson(projectName) {
16
16
  "schema:sdl": "runner-dev schema sdl",
17
17
  },
18
18
  dependencies: {
19
- "@bluelibs/runner": "^5.2.0",
19
+ "@bluelibs/runner": "^6.0.0",
20
20
  },
21
21
  devDependencies: {
22
- "@bluelibs/runner-dev": "^5.0.0",
22
+ "@bluelibs/runner-dev": "^6.0.0",
23
23
  typescript: "^5.6.3",
24
24
  tsx: "^4.19.2",
25
25
  jest: "^29.7.0",
@@ -2,21 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mainTs = mainTs;
4
4
  function mainTs(projectName) {
5
- return `import { run, resource } from '@bluelibs/runner';
5
+ return `import { r, run } from '@bluelibs/runner';
6
6
  import { dev } from '@bluelibs/runner-dev';
7
7
 
8
8
  // Minimal Runner app using runner-dev's dev resource
9
- const app = resource({
10
- id: 'app.${projectName}',
11
- register: [
9
+ const app = r.resource('${projectName}')
10
+ .register([
12
11
  dev.with({ port: 1337 }),
13
- ],
14
- });
12
+ ])
13
+ .build();
15
14
 
16
15
  run(app)
17
- .then(() => {
18
- // eslint-disable-next-line no-console
19
- console.log('Runner app started on http://localhost:1337');
16
+ .then(({ logger }) => {
17
+ logger.info('Runner app started on http://localhost:1337');
20
18
  })
21
19
  .catch((err) => {
22
20
  // eslint-disable-next-line no-console
@@ -1 +1 @@
1
- {"version":3,"file":"main.ts.js","sourceRoot":"","sources":["../../../../../../src/cli/generators/scaffold/templates/src/main.ts.ts"],"names":[],"mappings":";;AAAA,wBAuBC;AAvBD,SAAgB,MAAM,CAAC,WAAmB;IACxC,OAAO;;;;;aAKI,WAAW;;;;;;;;;;;;;;;;CAgBvB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"main.ts.js","sourceRoot":"","sources":["../../../../../../src/cli/generators/scaffold/templates/src/main.ts.ts"],"names":[],"mappings":";;AAAA,wBAqBC;AArBD,SAAgB,MAAM,CAAC,WAAmB;IACxC,OAAO;;;;0BAIiB,WAAW;;;;;;;;;;;;;;;CAepC,CAAC;AACF,CAAC"}