@stacksjs/defaults 0.75.120 → 0.75.122

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.
@@ -468,3 +468,58 @@ those operations.
468
468
  - Each driver module exports a pre-instantiated `driver` singleton and both class-based and function-based APIs
469
469
  - Discord embed default color is `0x5865F2` (Discord blurple), not customizable via the auto-build path
470
470
  - Teams Adaptive Cards use version `1.4` with the official JSON schema URL
471
+
472
+
473
+ ## Persistent direct messaging
474
+
475
+ `@stacksjs/orm` and `@stacksjs/chat` export `createMessenger`. Enable
476
+ `traits: { useMessaging: true }` to bind `record.messenger(options)` to a
477
+ hydrated model's identity. Trait migrations create `chat_conversations` and
478
+ `chat_messages` with a cascading conversation foreign key and a unique send key.
479
+
480
+ ```ts
481
+ import { createMessenger } from '@stacksjs/chat'
482
+
483
+ const messenger = createMessenger({
484
+ actorId: authenticatedUser.id,
485
+ scope: `gym:${authorizedGym.id}`,
486
+ authorize: (actorId, recipientId) => canMessage(actorId, recipientId),
487
+ maxLength: 4000,
488
+ pageSize: 50,
489
+ enabled: true,
490
+ })
491
+ const thread = await messenger.direct(recipient.id)
492
+ await messenger.send(thread.id, 'How did the session feel?', retryKey)
493
+ const page = await messenger.messages(thread.id)
494
+ await messenger.markRead(thread.id, page.messages.at(-1)!.id)
495
+ ```
496
+
497
+ Select actor and scope on the server. Authorization is required and is checked
498
+ for every inbox, history, send and read receipt operation. Use a stable retry
499
+ key for one attempted message; a different body with the same key returns 409.
500
+ History is chronological, with `has_more` and a `before` message-id cursor.
501
+ Receipts acknowledge only messages through the id actually displayed.
502
+ `MessagingError.status` provides safe HTTP statuses for application handlers.
503
+
504
+ For the UI, STX ships `ChatInbox`, `ChatMessage`, and `ChatUnreadBadge` in
505
+ `@stacksjs/components`. Browser stores import `createChat` from
506
+ `@stacksjs/components/chat` and inject their authenticated HTTP transport.
507
+
508
+ ### Native broadcasting
509
+
510
+ `createMessenger` emits `messaging.sent` after a new persisted message and
511
+ `messaging.read` when acknowledged messages first become read. Retried sends and
512
+ unchanged receipts emit nothing. Set `broadcast: false` to disable. Initialize
513
+ Stacks realtime before delivery, using `createServer` for WebSockets or
514
+ `createBroadcastHub` for authenticated HTTP streams.
515
+
516
+ `messagingChannel(participantType, userId)` selects that person's private inbox.
517
+ Authorize subscription using the authenticated person's server-owned ID. Events
518
+ carry only `conversation_id`; always re-read message text through current
519
+ relationship and tenant policy. This prevents a revoked relationship's old socket
520
+ from receiving private message contents.
521
+
522
+ The native STX controller accepts `broadcastEndpoint`. `chat.observe(active)`
523
+ shares one stream across inboxes, launchers and unread badges, returns a cleanup,
524
+ and reconciles after reconnect. Only an active visible inbox acknowledges reads.
525
+ It clears account/tenant state and reconnects when the scope changes.
@@ -107,7 +107,7 @@ export default defineCommands({
107
107
  // app/Listeners/Console.ts
108
108
  export default function(cli: CLI) {
109
109
  cli.on('custom:command', () => {
110
- console.log('Custom command executed!')
110
+ log.info('Custom command executed!')
111
111
  })
112
112
 
113
113
  cli.on('my:*', () => {
@@ -120,14 +120,23 @@ export default function(cli: CLI) {
120
120
  }
121
121
  ```
122
122
 
123
+ ## Plain command output
124
+
125
+ Import `print` and `printError` from `@stacksjs/cli/output` for command results,
126
+ test tallies and diagnostics that must be visible even when logging is filtered.
127
+ They write synchronously to stdout and stderr, preserve Node formatting and
128
+ inspection, append a newline, and complete before an immediate `process.exit()`.
129
+ The narrow import needs no application configuration. Use `log` for application
130
+ logging with levels, context and transports.
131
+
123
132
  ## Output Formatting
124
133
 
125
134
  Via `@stacksjs/utils` color functions (available in CLI context):
126
135
  ```typescript
127
136
  import { bold, green, red, yellow, dim, underline } from '@stacksjs/utils'
128
137
 
129
- console.log(green('✓ Success'))
130
- console.log(red('✗ Error'))
138
+ print(green('✓ Success'))
139
+ printError(red('✗ Error'))
131
140
  console.log(yellow('⚠ Warning'))
132
141
  console.log(bold('Important'))
133
142
  console.log(dim('Subtle info'))
@@ -1,184 +1,51 @@
1
1
  ---
2
2
  name: stacks-lint
3
- description: Use when linting or formatting code in a Stacks project. CRITICAL - always use pickier, NEVER eslint directly. Run 'bunx --bun pickier .' to lint, 'bunx --bun pickier . --fix' to auto-fix. For unused variables, prefer eslint-disable-next-line comments over underscore prefix. Covers @stacksjs/lint and config/code-style.ts.
3
+ description: Use when linting or formatting a Stacks project. Always use Pickier through buddy or its native CLI, never ESLint directly.
4
4
  license: MIT
5
5
  compatibility: Bun >= 1.3.0, TypeScript
6
- allowed-tools: Read Edit Write Bash Grep Glob
7
6
  ---
8
7
 
9
8
  # Stacks Linting
10
9
 
11
- ## CRITICAL RULES
12
- 1. **ALWAYS** use `bunx --bun pickier .` to lint -- **NEVER** use `eslint` directly
13
- 2. **Auto-fix**: `bunx --bun pickier . --fix`
14
- 3. For unused variable warnings: prefer `// eslint-disable-next-line` comments over prefixing with `_`
15
-
16
- ## Key Paths
17
- - Lint package: `storage/framework/core/lint/` (package: `@stacksjs/lint`)
18
- - Configuration: `config/code-style.ts` (auto-loaded via pickier's bunfig alias `code-style`; pickier handles both linting and formatting)
19
- - Lint command source: `storage/framework/core/buddy/src/commands/lint.ts`
20
-
21
- ## Package Details
22
- - Package name: `@stacksjs/lint`
23
- - Version: tracks framework version (currently 0.70.23)
24
- - The lint package is a thin wrapper -- the actual linting is done by pickier
25
- - `storage/framework/core/lint/build.ts` is a no-op (nothing to build)
26
- - Dev dependencies: `better-dx`, `@stacksjs/gitlint`, `bun-git-hooks`
10
+ Use `./buddy lint`, `./buddy lint:fix` and `./buddy format`. The code-style
11
+ commands call Pickier's SDK directly. Pickier is the linter and formatter;
12
+ it does not wrap ESLint. ESLint-style disable comments are compatibility syntax.
27
13
 
28
14
  ## Commands
29
15
 
30
- ### Via buddy CLI
31
- The buddy `lint` command internally runs pickier with the project's pickier config:
32
-
33
- ```bash
34
- # Lint (runs: bunx --bun pickier run --mode lint --config ./pickier.config.ts)
35
- buddy lint
36
-
37
- # Auto-fix (runs: bunx --bun pickier run --mode lint --config ./pickier.config.ts --fix)
38
- buddy lint --fix
39
- buddy lint:fix
40
-
41
- # Format (runs: bunx --bun pickier run --mode format --config ./pickier.config.ts --write)
42
- buddy format
43
- buddy format --write # same as above (write is default)
44
-
45
- # Check formatting without changes
46
- buddy format --check # runs: pickier run --mode format --config ./pickier.config.ts --check
47
- buddy format:check
48
- ```
49
-
50
- ### Direct pickier usage
51
- ```bash
52
- # Lint entire project
53
- bunx --bun pickier .
54
-
55
- # Auto-fix
56
- bunx --bun pickier . --fix
57
-
58
- # Via npm scripts
59
- bun run lint
60
- bun run lint:fix
61
- bun run format
62
- bun run format:check
63
- ```
64
-
65
- ## config/code-style.ts (PickierOptions)
66
-
67
- The actual configuration used by the project. This is the source of truth for all lint settings:
68
-
69
- ```typescript
70
- import type { PickierOptions } from 'pickier'
71
-
72
- const config: PickierOptions = {
73
- format: {
74
- extensions: ['ts', 'js', 'stx', 'json', 'yaml', 'md'],
75
- indent: 2,
76
- quotes: 'single',
77
- semi: false,
78
- },
79
-
80
- rules: {
81
- // TypeScript rules
82
- noDebugger: 'off',
83
- noConsole: 'off',
84
- },
85
-
86
- pluginRules: {
87
- // Regexp rules disabled (false positives on route definitions)
88
- 'regexp/no-unused-capturing-group': 'off',
89
- 'regexp/no-super-linear-backtracking': 'off',
90
- 'regexp/optimal-quantifier-concatenation': 'off',
91
- // Style rules disabled (conflict with common patterns or generated code)
92
- 'style/brace-style': 'off',
93
- 'style/max-statements-per-line': 'off',
94
- 'style/quotes': 'off',
95
- 'indent': 'off',
96
- 'quotes': 'off',
97
- // TypeScript rules
98
- 'ts/no-top-level-await': 'off',
99
- // Console is intentional
100
- 'no-console': 'off',
101
- // Markdown rules
102
- 'markdown/heading-increment': 'off',
103
- 'markdown/no-empty-links': 'off',
104
- },
105
-
106
- ignores: [
107
- '**/fixtures/**',
108
- '**/coverage/**',
109
- '**/temp/**',
110
- ],
111
- }
112
-
113
- export default config
114
- ```
115
-
116
- ## Format Settings (enforced)
117
- - **Indent**: 2 spaces
118
- - **Quotes**: single quotes
119
- - **Semicolons**: none (no semicolons)
120
- - **Extensions**: ts, js, stx, json, yaml, md
121
-
122
- ## Handling Unused Variables
123
-
124
- When pickier/eslint reports unused variables, use eslint-disable comments -- do NOT prefix with underscore:
125
-
126
- ```typescript
127
- // CORRECT: Use eslint-disable comment
128
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
129
- const unusedVar = someFunction()
16
+ - `./buddy lint`: report errors and warnings; errors fail the command.
17
+ - `./buddy lint --max-warnings 0`: require zero errors and warnings.
18
+ - `./buddy lint:fix --max-warnings 0`: fix supported findings and enforce the warning budget.
19
+ - `./buddy format`: write formatting; `./buddy format --check` checks without writing.
20
+ - `./buddy lint --stx`: run the separate stx conformance checks from `config/lint.ts`.
130
21
 
131
- // ALSO CORRECT: Use eslint-disable for next line only
132
- // eslint-disable-next-line no-unused-vars
133
- function handler(req, res, next) {
134
- res.send('ok')
135
- }
22
+ For direct CLI use, run `bunx --bun pickier .`, adding `--fix` for supported
23
+ fixes. Re-run without `--fix` to confirm remaining findings. Only apply fixes
24
+ that preserve the source behavior; investigate false positives at Pickier's source.
136
25
 
137
- // INCORRECT: Don't prefix with underscore
138
- const _unusedVar = someFunction() // DON'T DO THIS
139
- ```
26
+ ## Configuration and discovery
140
27
 
141
- ## Internal Implementation
28
+ Pickier discovers its own configuration (`pickier.config.ts`, `.config/pickier.ts`,
29
+ and other supported names). `config/code-style.ts` is the framework's policy;
30
+ applications may supply their own Pickier config. An explicit CLI `--config`
31
+ selects that file. Keep the command and CI on the same policy.
142
32
 
143
- The buddy `lint` command (in `storage/framework/core/buddy/src/commands/lint.ts`) delegates entirely to pickier:
33
+ Buddy discovers tracked files plus untracked files allowed by `.gitignore`.
34
+ Its extension and path predicate lives in `@stacksjs/actions/lint/files`;
35
+ code-style discovery currently includes ts, js, json, md, yaml and yml.
36
+ Use Pickier directly to include stx and shell sources. Generated framework
37
+ assets belong to the upstream framework's checks, not application edits.
144
38
 
145
- ```typescript
146
- // lint.ts internals
147
- buddy
148
- .command('lint', 'Automagically lints your project codebase')
149
- .option('-f, --fix', 'Automagically fixes all lint errors', { default: false })
150
- .action(async (options: LintOptions) => {
151
- if (options.fix)
152
- await runCommand('bunx --bun pickier run --mode lint --config ./pickier.config.ts --fix', { cwd: path.projectPath() })
153
- else
154
- await runCommand('bunx --bun pickier run --mode lint --config ./pickier.config.ts', { cwd: path.projectPath() })
155
- })
156
- ```
39
+ ## Conventions
157
40
 
158
- The `format` command uses pickier in format mode:
41
+ Use two spaces, single quotes and no optional semicolons. Use Crosswind classes
42
+ and stx signals/directives in templates. Fix real findings in source, rather than
43
+ turning off rules to obtain a clean report. For intentional unused variables,
44
+ prefer a targeted `// eslint-disable-next-line` over an underscore prefix.
159
45
 
160
- ```typescript
161
- buddy
162
- .command('format', 'Format your project codebase')
163
- .option('-w, --write', 'Write changes to files', { default: false })
164
- .option('-c, --check', 'Check formatting without making changes', { default: false })
165
- .action(async (options) => {
166
- if (options.check)
167
- await runCommand('bunx --bun pickier run --mode format --config ./pickier.config.ts --check', { cwd: path.projectPath() })
168
- else
169
- await runCommand('bunx --bun pickier run --mode format --config ./pickier.config.ts --write', { cwd: path.projectPath() })
170
- })
171
- ```
46
+ ## Source
172
47
 
173
- ## Gotchas
174
- - Pickier is the Stacks linting tool -- it wraps eslint with Stacks-specific config
175
- - **NEVER** run `eslint` directly -- always go through `bunx --bun pickier` or `buddy lint`
176
- - The `config/code-style.ts` file exports a `PickierOptions` object -- not an eslint config (auto-discovered by pickier via bunfig alias `code-style`)
177
- - The project intentionally allows `console.*` calls (`noConsole: 'off'`, `'no-console': 'off'`)
178
- - The project intentionally allows `debugger` statements (`noDebugger: 'off'`)
179
- - Top-level await is allowed (`'ts/no-top-level-await': 'off'`)
180
- - Brace style and max-statements-per-line rules are disabled to avoid conflicts with generated code
181
- - Run `bunx --bun pickier . --fix` after code generation to clean up
182
- - `buddy lint` exits through the `lint:*` wildcard handler if an invalid sub-command is used
183
- - `buddy format` defaults to `--write` mode (writes changes) unless `--check` is specified
184
- - The lint package (`@stacksjs/lint`) itself has no source files to build -- it is a configuration-only package
48
+ - Actions: `storage/framework/core/actions/src/lint/lint.ts`
49
+ - CLI: `storage/framework/core/buddy/src/commands/lint.ts`
50
+ - Discovery: `storage/framework/core/actions/src/lint/files.ts`
51
+ - Formatter/linter: the first-party Pickier repository
@@ -11,7 +11,7 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
11
11
  | Package | Task guidance | Source entry | Retained tests |
12
12
  |---|---|---|---|
13
13
  | `@stacksjs/action-runner` | [`stacks-actions`](../stacks-actions/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/action-runner/src/index.ts) | 1 |
14
- | `@stacksjs/actions` | [`stacks-actions`](../stacks-actions/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/index.ts) | 64 |
14
+ | `@stacksjs/actions` | [`stacks-actions`](../stacks-actions/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/index.ts) | 65 |
15
15
  | `@stacksjs/ai` | [`stacks-ai`](../stacks-ai/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/ai/src/index.ts) | 15 |
16
16
  | `@stacksjs/alias` | [`stacks-alias`](../stacks-alias/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/alias/src/index.ts) | 1 |
17
17
  | `@stacksjs/analytics` | [`stacks-analytics`](../stacks-analytics/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/analytics/src/index.ts) | 6 |
@@ -27,7 +27,7 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
27
27
  | `@stacksjs/calendar-api` | [`stacks-calendar`](../stacks-calendar/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/calendar-api/src/index.ts) | 2 |
28
28
  | `@stacksjs/charts` | [`stacks-charts`](../stacks-charts/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/charts/src/index.ts) | 3 |
29
29
  | `@stacksjs/chat` | [`stacks-chat`](../stacks-chat/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/chat/src/index.ts) | 5 |
30
- | `@stacksjs/cli` | [`stacks-cli`](../stacks-cli/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/index.ts) | 9 |
30
+ | `@stacksjs/cli` | [`stacks-cli`](../stacks-cli/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/index.ts) | 10 |
31
31
  | `@stacksjs/cloud` | [`stacks-cloud`](../stacks-cloud/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cloud/src/index.ts) | 10 |
32
32
  | `@stacksjs/cms` | [`stacks-cms`](../stacks-cms/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cms/src/index.ts) | 5 |
33
33
  | `@stacksjs/collections` | [`stacks-collections`](../stacks-collections/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/collections/src/index.ts) | 2 |
@@ -65,14 +65,14 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
65
65
  | `@stacksjs/newsletter` | [`stacks-newsletter`](../stacks-newsletter/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/newsletter/src/index.ts) | 7 |
66
66
  | `@stacksjs/notifications` | [`stacks-notifications`](../stacks-notifications/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/index.ts) | 11 |
67
67
  | `@stacksjs/objects` | [`stacks-objects`](../stacks-objects/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/objects/src/index.ts) | 4 |
68
- | `@stacksjs/orm` | [`stacks-orm`](../stacks-orm/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/index.ts) | 60 |
68
+ | `@stacksjs/orm` | [`stacks-orm`](../stacks-orm/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/index.ts) | 61 |
69
69
  | `@stacksjs/pagination` | [`stacks-pagination`](../stacks-pagination/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/pagination/src/index.ts) | 0 |
70
70
  | `@stacksjs/path` | [`stacks-path`](../stacks-path/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/path/src/index.ts) | 9 |
71
71
  | `@stacksjs/payments` | [`stacks-payments`](../stacks-payments/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/index.ts) | 20 |
72
72
  | `@stacksjs/push` | [`stacks-push`](../stacks-push/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/push/src/index.ts) | 5 |
73
73
  | `@stacksjs/query-builder` | [`stacks-query-builder`](../stacks-query-builder/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/query-builder/src/index.ts) | 6 |
74
74
  | `@stacksjs/queue` | [`stacks-queue`](../stacks-queue/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/index.ts) | 48 |
75
- | `@stacksjs/realtime` | [`stacks-realtime`](../stacks-realtime/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/index.ts) | 10 |
75
+ | `@stacksjs/realtime` | [`stacks-realtime`](../stacks-realtime/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/index.ts) | 11 |
76
76
  | `@stacksjs/registry` | [`stacks-registry`](../stacks-registry/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/registry/src/index.ts) | 1 |
77
77
  | `@stacksjs/repl` | [`stacks-repl`](../stacks-repl/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/repl/src/index.ts) | 2 |
78
78
  | `@stacksjs/router` | [`stacks-router`](../stacks-router/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/router/src/index.ts) | 86 |
@@ -119,7 +119,7 @@ Declared runtime exports: `BlogAdminError`, `DEFAULT_STX_LINT_CONFIG`, `blogSlug
119
119
 
120
120
  Local source modules: [src/action.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/action.ts), [src/add.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/add.ts), [src/blog-admin.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/blog-admin.ts), [src/commit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/commit.ts), [src/dev/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/dev/index.ts), [src/discover-packages.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/discover-packages.ts), [src/generate/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/generate/index.ts), [src/helpers/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/helpers/index.ts), [src/library/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/library/index.ts), [src/lint/lint.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/lint/lint.ts), [src/lint/stx-gate.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/lint/stx-gate.ts), [src/make-command.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/make-command.ts), [src/make-job.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/make-job.ts), [src/make-policy.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/make-policy.ts), [src/make-resource.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/make-resource.ts), [src/make.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/make.ts), [src/scaffold-crud.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/scaffold-crud.ts), [src/setup/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/setup/index.ts), [src/stacks.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/stacks.ts), [src/upgrade/package-project.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/upgrade/package-project.ts), [src/upgrade/route-actions.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/upgrade/route-actions.ts).
121
121
 
122
- Evidence directory: [64 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
122
+ Evidence directory: [65 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
123
123
 
124
124
  ### @stacksjs/ai
125
125
 
@@ -259,7 +259,7 @@ Evidence directory: [3 retained tests](https://github.com/stacksjs/stacks/blob/m
259
259
 
260
260
  Guidance: [`stacks-chat`](../stacks-chat/SKILL.md). Source: [storage/framework/core/chat/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/chat/src/index.ts).
261
261
 
262
- Declared runtime exports: `configureDiscord`, `configureSlack`, `configureTeams`, `discord`, `inbox`, `send`, `sendToDiscord`, `sendToSlack`, `sendToTeams`, `slack`, `teams`.
262
+ Declared runtime exports: `MessagingError`, `configureDiscord`, `configureSlack`, `configureTeams`, `createMessenger`, `discord`, `inbox`, `messagingChannel`, `send`, `sendToDiscord`, `sendToSlack`, `sendToTeams`, `slack`, `teams`.
263
263
 
264
264
  Local source modules: [src/drivers/discord.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/chat/src/drivers/discord.ts), [src/drivers/slack.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/chat/src/drivers/slack.ts), [src/drivers/teams.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/chat/src/drivers/teams.ts), [src/inbox/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/chat/src/inbox/index.ts).
265
265
 
@@ -271,9 +271,9 @@ Guidance: [`stacks-cli`](../stacks-cli/SKILL.md). Source: [storage/framework/cor
271
271
 
272
272
  Read the entrypoint and package export map for re-exported or type-only surfaces.
273
273
 
274
- Local source modules: [src/actions/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/actions/index.ts), [src/cli.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/cli.ts), [src/commands.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/commands.ts), [src/exec.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/exec.ts), [src/helpers.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/helpers.ts), [src/parse.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/parse.ts), [src/prompts.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/prompts.ts), [src/run.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/run.ts), [src/signals.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/signals.ts), [src/spinner.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/spinner.ts), [src/terminal.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/terminal.ts), [src/utils.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/utils.ts).
274
+ Local source modules: [src/actions/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/actions/index.ts), [src/cli.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/cli.ts), [src/commands.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/commands.ts), [src/exec.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/exec.ts), [src/helpers.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/helpers.ts), [src/output.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/output.ts), [src/parse.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/parse.ts), [src/prompts.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/prompts.ts), [src/run.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/run.ts), [src/signals.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/signals.ts), [src/spinner.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/spinner.ts), [src/terminal.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/terminal.ts), [src/utils.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/src/utils.ts).
275
275
 
276
- Evidence directory: [9 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
276
+ Evidence directory: [10 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cli/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
277
277
 
278
278
  ### @stacksjs/cloud
279
279
 
@@ -629,9 +629,9 @@ Guidance: [`stacks-orm`](../stacks-orm/SKILL.md). Source: [storage/framework/cor
629
629
 
630
630
  Declared runtime exports: `Activity`, `AnalyticsEvent`, `Auction`, `AuctionItem`, `Author`, `Automation`, `AutomationRun`, `BILLABLE_INSTANCE_METHODS`, `Bid`, `Board`, `BoardColumn`, `Campaign`, `CampaignSend`, `CampaignVariant`, `Card`, `CardAttachment`, `CardComment`, `Cart`, `CartItem`, `Categorizable`, `Category`, `Comment`, `CommunicationSuppression`, `ConsentEvent`, `Coupon`, `Courier`, `CourierPing`, `Customer`, `DeliveryRoute`, `DeliveryStop`, `Deployment`, `DigitalDelivery`, `EmailIdempotency`, `EmailList`, `EmailListSubscriber`, `EmailSuppression`, `EmailWebhookEvent`, `ErrorModel`, `FailedJob`, `FeedbackToken`, `Form`, `FormField`, `FormSubmission`, `GdprRequest`, `GiftCard`, `Job`, `Label`, `LicenseKey`, `Log`, `LoyaltyPoint`, `LoyaltyReward`, `MagicLinkToken`, `MailPreference`, `Manufacturer`, `Menu`, `MenuItem`, `Notification`, `NotificationDelivery`, `Order`, `OrderIdempotency`, `OrderItem`, `Page`, `PageRevision`, `Payment`, `PaymentMethod`, `PaymentProduct`, `PaymentTransaction`, `PaymentWebhookEvent`, `PersonalAccessToken`, `Pledge`, `Post`, `PrintDevice`, `Product`, `ProductUnit`, `ProductVariant`, `QueryLog`, `Receipt`, `Redirect`, `Referral`, `ReferralCode`, `Release`, `Request`, `Review`, `SenderDomain`, `ShippingMethod`, `ShippingRate`, `ShippingZone`, `Site`, `SiteDomain`, `SmsOptOut`, `SocialAccount`, `SocialPost`, `StorageItem`, `StorageItemTask`, `Subscriber`, `SubscriberEmail`, `Subscription`, `SubscriptionNotOwnedError`, `Tag`, `TaxRate`, `Team`, `TeamInvitation`, `TeamMember`, `Transaction`, `UsageEvent`, `User`, `WaitlistProduct`, `WaitlistRestaurant`, `Websocket`, `buildDatabaseSchema`, `collectEncryptedAttributes`, `createAuditMethods`, `createCategorizableMethods`, `createCommentableMethods`, `createLikeableMethods`, `createTaggableMethods`, `customerOwnership`, `decryptValue`, `encryptValue`, `enrichPaginatorUrls`, `filterFillable`, `getWritableFields`, `isBillable`, `isCursorPaginator`, `isEncrypted`, `isPaginator`, `isSimplePaginator`, `isUniqueViolation`, `mapWriteError`, `modelGlobalNames`, `ormReady`, `parentOwnership`, `parseCursor`, `renderDatabaseTypeFile`, `resolveCursorArgs`, `resolvePageArgs`, `selfOwnership`, `setAuditUser`, `siteOwnership`, `teamMembershipOwnership`, `toCursorPaginator`, `toPaginator`, `toSimplePaginator`, `toSnakeCaseKeys`.
631
631
 
632
- Local source modules: [src/auto-crud.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/auto-crud.ts), [src/batch-loader.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/batch-loader.ts), [src/db.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/db.ts), [src/define-model.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/define-model.ts), [src/extend-model.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/extend-model.ts), [src/gdpr/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/gdpr/index.ts), [src/generate-database-schema.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/generate-database-schema.ts), [src/locked-row.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/locked-row.ts), [src/model-types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/model-types.ts), [src/ownership.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/ownership.ts), [src/paginator-request.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/paginator-request.ts), [src/row-token.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/row-token.ts), [src/subquery.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/subquery.ts), [src/traits/audit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/audit.ts), [src/traits/billable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/billable.ts), [src/traits/categorizable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/categorizable.ts), [src/traits/commentable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/commentable.ts), [src/traits/likeable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/likeable.ts), [src/traits/taggable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/taggable.ts), [src/transaction.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/transaction.ts), [src/types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/types.ts), [src/utils/compiled-binary.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/compiled-binary.ts), [src/utils/encrypted.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/encrypted.ts), [src/utils/prunable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/prunable.ts).
632
+ Local source modules: [src/auto-crud.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/auto-crud.ts), [src/batch-loader.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/batch-loader.ts), [src/db.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/db.ts), [src/define-model.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/define-model.ts), [src/extend-model.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/extend-model.ts), [src/gdpr/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/gdpr/index.ts), [src/generate-database-schema.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/generate-database-schema.ts), [src/locked-row.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/locked-row.ts), [src/messaging.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/messaging.ts), [src/model-types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/model-types.ts), [src/ownership.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/ownership.ts), [src/paginator-request.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/paginator-request.ts), [src/row-token.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/row-token.ts), [src/subquery.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/subquery.ts), [src/traits/audit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/audit.ts), [src/traits/billable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/billable.ts), [src/traits/categorizable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/categorizable.ts), [src/traits/commentable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/commentable.ts), [src/traits/likeable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/likeable.ts), [src/traits/taggable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/taggable.ts), [src/transaction.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/transaction.ts), [src/types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/types.ts), [src/utils/compiled-binary.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/compiled-binary.ts), [src/utils/encrypted.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/encrypted.ts), [src/utils/prunable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/prunable.ts).
633
633
 
634
- Evidence directory: [60 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
634
+ Evidence directory: [61 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
635
635
 
636
636
  ### @stacksjs/pagination
637
637
 
@@ -691,11 +691,11 @@ Evidence directory: [48 retained tests](https://github.com/stacksjs/stacks/blob/
691
691
 
692
692
  Guidance: [`stacks-realtime`](../stacks-realtime/SKILL.md). Source: [storage/framework/core/realtime/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/index.ts).
693
693
 
694
- Declared runtime exports: `LegacyBroadcast`, `StacksChannel`, `channel`, `createChannel`, `createServer`, `debugSnapshot`, `dispatchBroadcast`, `emit`, `emitToUser`, `emitToUsers`, `getReplayBuffer`, `getServer`, `getWsAuthenticator`, `pruneExpired`, `recordBroadcast`, `replaySince`, `runBroadcast`, `setReplayBuffer`, `setServer`, `setWsAuthenticator`, `stopServer`, `storeWebSocketEvent`.
694
+ Declared runtime exports: `LegacyBroadcast`, `StacksChannel`, `channel`, `createBroadcastHub`, `createBroadcastResponse`, `createChannel`, `createServer`, `debugSnapshot`, `dispatchBroadcast`, `emit`, `emitToUser`, `emitToUsers`, `getReplayBuffer`, `getServer`, `getWsAuthenticator`, `pruneExpired`, `recordBroadcast`, `replaySince`, `runBroadcast`, `setReplayBuffer`, `setServer`, `setWsAuthenticator`, `stopServer`, `storeWebSocketEvent`.
695
695
 
696
- Local source modules: [src/broadcast.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/broadcast.ts), [src/channel.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/channel.ts), [src/emit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/emit.ts), [src/replay-buffer.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/replay-buffer.ts), [src/server-instance.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/server-instance.ts), [src/ws.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/ws.ts).
696
+ Local source modules: [src/broadcast.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/broadcast.ts), [src/channel.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/channel.ts), [src/emit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/emit.ts), [src/replay-buffer.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/replay-buffer.ts), [src/server-instance.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/server-instance.ts), [src/stream.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/stream.ts), [src/ws.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/ws.ts).
697
697
 
698
- Evidence directory: [10 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
698
+ Evidence directory: [11 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
699
699
 
700
700
  ### @stacksjs/registry
701
701
 
@@ -375,3 +375,21 @@ private/presence channel authorization are separate checks. Replay is in-memory
375
375
  and per process, not durable recovery or a cluster-wide sequence.
376
376
  Retained tests: `core/realtime/tests/ws-auth.test.ts`,
377
377
  `websocket-options.test.ts`, and replay/exclusion tests in that directory.
378
+
379
+ ## Authenticated HTTP broadcast transport
380
+
381
+ `createBroadcastHub()` initializes the same ts-broadcasting engine without opening
382
+ an extra WebSocket listener. It reuses an existing server. This is an explicit
383
+ single-process HTTP transport; it does not initialize Redis or a cluster.
384
+ `emit()`, model broadcasts and private chat invalidations all reach its hooks.
385
+
386
+ `createBroadcastResponse({ channels, authorize, signal })` returns an SSE Response.
387
+ Select channel names on the server. Authorization is mandatory and runs before
388
+ subscription, before each event, and at every heartbeat. Pass the request's abort
389
+ signal. Cancellation, failed authorization and slow consumers remove the hook.
390
+ Streams bound both queued events and pending authorization work (64 by default).
391
+
392
+ STX's `useBroadcastStream({ request, endpoint, onMessage, onConnected })` makes
393
+ fresh authenticated requests using the application's injected transport, reconnects
394
+ with backoff, and cancels on `close()`. Re-read durable state in `onConnected`;
395
+ this stream does not promise durable replay. Credentials stay in HTTP headers.
@@ -2,7 +2,7 @@
2
2
  "publisher": "Stacks",
3
3
  "name": "vscode-stacks",
4
4
  "displayName": "Stacks",
5
- "version": "0.75.120",
5
+ "version": "0.75.122",
6
6
  "description": "Stacks, built into VS Code: stx templates, pickier linting and formatting, encrypted env files, the dev server preview and every buddy command. No other extensions required.",
7
7
  "license": "MIT",
8
8
  "funding": "https://github.com/sponsors/chrisbbreuer",
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/defaults",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.75.120",
5
+ "version": "0.75.122",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/stacksjs/stacks.git",
@@ -55,7 +55,7 @@
55
55
  "dependencies": {
56
56
  "@iconify-json/f7": "^1.2.2",
57
57
  "@iconify-json/hugeicons": "^1.2.35",
58
- "@stacksjs/mobile": "^0.75.120",
58
+ "@stacksjs/mobile": "^0.75.122",
59
59
  "@stacksjs/sanitizer": "^0.2.422",
60
60
  "@xterm/addon-fit": "^0.11.0",
61
61
  "@xterm/xterm": "^6.0.0",
@@ -308,7 +308,8 @@ export async function loadAutoImports() {
308
308
  Reflect.set(globalThis, name, value)
309
309
  }
310
310
  }
311
- } catch {
311
+ }
312
+ catch {
312
313
  // Package might not exist or not be built yet
313
314
  }
314
315
  }
@@ -328,7 +329,8 @@ export async function loadAutoImports() {
328
329
  Reflect.set(globalThis, name, value)
329
330
  }
330
331
  }
331
- } catch {
332
+ }
333
+ catch {
332
334
  // Some files may have client-side dependencies, skip them
333
335
  }
334
336
  }
@@ -361,11 +363,13 @@ export async function loadAutoImports() {
361
363
  Reflect.set(globalThis, modelName, module.default)
362
364
  loadedModels.add(modelName)
363
365
  }
364
- } catch {
366
+ }
367
+ catch {
365
368
  // Model may have unresolved dependencies during bootstrap
366
369
  }
367
370
  }
368
- } catch {
371
+ }
372
+ catch {
369
373
  // Directory may not exist
370
374
  }
371
375
  }
@@ -392,11 +396,13 @@ export async function loadAutoImports() {
392
396
  Reflect.set(globalThis, jobName, module.default)
393
397
  loadedJobs.add(jobName)
394
398
  }
395
- } catch {
399
+ }
400
+ catch {
396
401
  // Job may have unresolved dependencies during bootstrap
397
402
  }
398
403
  }
399
- } catch {
404
+ }
405
+ catch {
400
406
  // Directory may not exist
401
407
  }
402
408
 
@@ -427,11 +433,13 @@ export async function loadAutoImports() {
427
433
  Reflect.set(globalThis, controllerName, module.default)
428
434
  loadedControllers.add(controllerName)
429
435
  }
430
- } catch {
436
+ }
437
+ catch {
431
438
  // Controller may have unresolved dependencies during bootstrap
432
439
  }
433
440
  }
434
- } catch {
441
+ }
442
+ catch {
435
443
  // Directory may not exist
436
444
  }
437
445
  }