@toa.io/userland 1.0.0-alpha.284 → 1.0.0-alpha.286

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.
@@ -19,6 +19,7 @@ configuration:
19
19
  properties:
20
20
  signal:
21
21
  type: string
22
- default: quack
22
+ defaults:
23
+ signal: quack
23
24
 
24
25
  state: ~
@@ -1,3 +1,3 @@
1
- export async function computation (_, context) {
1
+ export async function computation(_, context) {
2
2
  return context.state.value
3
3
  }
@@ -1,3 +1,3 @@
1
- export async function computation (key, context) {
1
+ export async function computation(key, context) {
2
2
  return context.state.values.get(key)
3
3
  }
@@ -1,11 +1,11 @@
1
1
  export class Computation {
2
2
  #context
3
3
 
4
- async mount (context) {
4
+ async mount(context) {
5
5
  this.#context = context
6
6
  }
7
7
 
8
- async execute () {
8
+ async execute() {
9
9
  return this.#context.configuration.signal
10
10
  }
11
11
  }
@@ -19,7 +19,9 @@ operations:
19
19
  type: number
20
20
  times:
21
21
  type: number
22
- default: 1
23
22
  type: object
23
+ required:
24
+ - value
25
+ - times
24
26
  output:
25
27
  type: number
@@ -1,3 +1,3 @@
1
- export async function computation (input) {
1
+ export async function computation(input) {
2
2
  return input.a + input.b
3
3
  }
@@ -1,4 +1,4 @@
1
- export async function computation (input, context) {
1
+ export async function computation(input, context) {
2
2
  let value = input.value
3
3
 
4
4
  for (let i = 0; i < input.times; i++) {
@@ -1,4 +1,4 @@
1
- export async function computation (input, context) {
1
+ export async function computation(input, context) {
2
2
  const request = { input }
3
3
 
4
4
  // noinspection JSUnresolvedVariable
@@ -3,22 +3,21 @@ namespace: tea
3
3
 
4
4
  entity:
5
5
  storage: mongodb
6
- schema:
7
- properties:
8
- volume:
9
- type: number
10
- booked:
11
- type: boolean
12
- default: false
13
- material:
14
- type: string
15
- enum:
16
- - glass
17
- - ceramic
18
- - steel
19
- type: object
20
- required:
21
- - material
6
+ properties:
7
+ volume:
8
+ type: number
9
+ booked:
10
+ type: boolean
11
+ material:
12
+ type: string
13
+ enum:
14
+ - glass
15
+ - ceramic
16
+ - steel
17
+ required:
18
+ - material
19
+ blank:
20
+ booked: false
22
21
 
23
22
  operations:
24
23
  transit:
@@ -53,4 +52,5 @@ configuration:
53
52
  properties:
54
53
  step:
55
54
  type: number
56
- default: 0.5
55
+ defaults:
56
+ step: 0.5
@@ -1,4 +1,4 @@
1
- export async function computation (input, context) {
1
+ export async function computation(input, context) {
2
2
  const criteria = `material==${input}`
3
3
  const query = { criteria, limit }
4
4
 
@@ -1,9 +1,8 @@
1
- export async function computation (_, context) {
1
+ export async function computation(_, context) {
2
2
  const response = await context.fetch('http://api.example.com/path/to/resource')
3
3
  const type = response.headers.get('content-type')
4
4
 
5
- if (type !== 'application/json')
6
- return ERR_UNSUPPORTED_MEDIA_TYPE
5
+ if (type !== 'application/json') return ERR_UNSUPPORTED_MEDIA_TYPE
7
6
 
8
7
  return await response.json()
9
8
  }
@@ -1,5 +1,5 @@
1
1
  name: examples
2
2
  registry: example
3
3
 
4
- amqp: amqp://localhost
5
- mongodb: mongodb://localhost
4
+ amqp: amqp://localhost:31010
5
+ mongodb: mongodb://localhost:31020
@@ -41,5 +41,8 @@ it('should throw on invalid input', async () => {
41
41
  const a = 'not a number'
42
42
  const b = 'neither'
43
43
 
44
- await assert.rejects(math.invoke('add', { input: { a, b } }), (error) => { assert.ok(error instanceof RequestContractException); return true })
44
+ await assert.rejects(math.invoke('add', { input: { a, b } }), (error) => {
45
+ assert.ok(error instanceof RequestContractException)
46
+ return true
47
+ })
45
48
  })
@@ -84,13 +84,13 @@ it('should emit event', async () => {
84
84
  class Subscriber extends Connector {
85
85
  #handler
86
86
 
87
- constructor (handler) {
87
+ constructor(handler) {
88
88
  super()
89
89
 
90
90
  this.#handler = handler
91
91
  }
92
92
 
93
- async receive (message) {
93
+ async receive(message) {
94
94
  this.#handler(message.payload)
95
95
  }
96
96
  }
@@ -6,7 +6,7 @@ import * as stage from '@toa.io/userland/stage'
6
6
 
7
7
  const root = resolve(import.meta.dirname, '../components')
8
8
 
9
- /** @type {toa.core.Component} */
9
+ /** @type {import('@toa.io/core').Component} */
10
10
  let component
11
11
 
12
12
  before(async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toa.io/userland",
3
- "version": "1.0.0-alpha.284",
3
+ "version": "1.0.0-alpha.286",
4
4
  "type": "module",
5
5
  "description": "Toa development kit",
6
6
  "homepage": "https://toa.io",
@@ -32,13 +32,13 @@
32
32
  "./package.json": "./package.json"
33
33
  },
34
34
  "dependencies": {
35
- "@toa.io/boot": "1.0.0-alpha.284",
36
- "@toa.io/core": "1.0.0-alpha.284",
37
- "@toa.io/generic": "1.0.0-alpha.283",
38
- "@toa.io/norm": "1.0.0-alpha.284",
39
- "@toa.io/schemas": "1.0.0-alpha.283",
35
+ "@toa.io/boot": "1.0.0-alpha.286",
36
+ "@toa.io/core": "1.0.0-alpha.286",
37
+ "@toa.io/generic": "1.0.0-alpha.286",
38
+ "@toa.io/norm": "1.0.0-alpha.286",
39
+ "@toa.io/schemas": "1.0.0-alpha.286",
40
40
  "@toa.io/storages.null": "0.22.0",
41
41
  "js-yaml": "5.4.1"
42
42
  },
43
- "gitHead": "006755556879e91e8d68fa86753aa3b475bdf4bf"
43
+ "gitHead": "81f3d0688f17668b902be336d1749cc715edcdb6"
44
44
  }
@@ -5,4 +5,12 @@ import { service } from './service.js'
5
5
  import { remote } from './remote.js'
6
6
  import { shutdown } from './shutdown.js'
7
7
 
8
- export { manifest, component, composition, composition as compose, service as serve, remote, shutdown }
8
+ export {
9
+ manifest,
10
+ component,
11
+ composition,
12
+ composition as compose,
13
+ service as serve,
14
+ remote,
15
+ shutdown
16
+ }
@@ -24,8 +24,12 @@ it('should boot component', async () => {
24
24
  assert.deepStrictEqual(mock.boot.manifest.mock.calls[0].arguments[0], path)
25
25
  const manifest = await mock.boot.manifest.mock.calls[0].result
26
26
 
27
- assert.ok(mock.boot.component.mock.calls.some((call) =>
28
- call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], manifest)))
27
+ assert.ok(
28
+ mock.boot.component.mock.calls.some(
29
+ (call) =>
30
+ call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], manifest)
31
+ )
32
+ )
29
33
  assert.deepStrictEqual(component, await mock.boot.component.mock.calls[0].result)
30
34
  assert.ok(component.connect.mock.callCount() > 0)
31
35
  })
@@ -22,6 +22,10 @@ it('should boot manifest', async () => {
22
22
 
23
23
  const manifest = await stage.manifest(path)
24
24
 
25
- assert.ok(mock.boot.manifest.mock.calls.some((call) => call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], path)))
25
+ assert.ok(
26
+ mock.boot.manifest.mock.calls.some(
27
+ (call) => call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], path)
28
+ )
29
+ )
26
30
  assert.deepStrictEqual(manifest, await mock.boot.manifest.mock.calls[0].result)
27
31
  })
@@ -59,7 +59,7 @@ it('should reset state', async () => {
59
59
  assert.ok(state.reset.mock.callCount() > 0)
60
60
  })
61
61
 
62
- function resetCalls (target = [assert, mock, stage], seen = new Set()) {
62
+ function resetCalls(target = [assert, mock, stage], seen = new Set()) {
63
63
  if (target === null || typeof target !== 'object' || seen.has(target)) return
64
64
 
65
65
  seen.add(target)
@@ -8,9 +8,9 @@ it('should be', () => {
8
8
  })
9
9
 
10
10
  it('should reset', () => {
11
- const component = /** @type {toa.core.Component} */ 1
12
- const composition = /** @type {toa.core.Connector} */ 2
13
- const remote = /** @type {toa.core.Component} */ 3
11
+ const component = /** @type {import('@toa.io/core').Component} */ 1
12
+ const composition = /** @type {import('@toa.io/core').Connector} */ 2
13
+ const remote = /** @type {import('@toa.io/core').Component} */ 3
14
14
 
15
15
  assert.deepStrictEqual(state.components.length, 0)
16
16
  assert.deepStrictEqual(state.compositions.length, 0)
@@ -1,17 +1,20 @@
1
- import * as _core from '@toa.io/core'
1
+ import type * as _core from '@toa.io/core'
2
2
  import * as _norm from '@toa.io/norm/types'
3
3
  import * as _composition from '@toa.io/boot/types/composition'
4
4
 
5
- export function manifest (path: string): Promise<_norm.Component>
5
+ export function manifest(path: string): Promise<_norm.Component>
6
6
 
7
- export function component (path: string): Promise<_core.Component>
7
+ export function component(path: string): Promise<_core.Component>
8
8
 
9
- export function composition (paths: string[], options?: _composition.Options): Promise<void>
9
+ export function composition(
10
+ paths: string[],
11
+ options?: _composition.Options
12
+ ): Promise<void>
10
13
 
11
- export function compose (paths: string[]): Promise<void>
14
+ export function compose(paths: string[]): Promise<void>
12
15
 
13
- export function serve (ref: string): Promise<_core.Component>
16
+ export function serve(ref: string): Promise<_core.Component>
14
17
 
15
- export function remote (id: string): Promise<_core.Component>
18
+ export function remote(id: string): Promise<_core.Component>
16
19
 
17
- export function shutdown (): Promise<void>
20
+ export function shutdown(): Promise<void>
@@ -1,7 +1,6 @@
1
- import * as _core from '@toa.io/core'
2
-
3
- declare namespace toa.stage{
1
+ import type * as _core from '@toa.io/core'
4
2
 
3
+ declare namespace toa.stage {
5
4
  type State = {
6
5
  reset: () => void
7
6
  components: _core.Component[]
@@ -9,7 +8,6 @@ declare namespace toa.stage{
9
8
  services: _core.Connector[]
10
9
  remotes: _core.Component[]
11
10
  }
12
-
13
11
  }
14
12
 
15
13
  export type State = toa.stage.State
package/CHANGELOG.md DELETED
@@ -1,336 +0,0 @@
1
- # Change Log
2
-
3
- All notable changes to this project will be documented in this file.
4
- See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
-
6
- # [1.0.0-alpha.284](https://github.com/toa-io/toa/compare/v1.0.0-alpha.283...v1.0.0-alpha.284) (2026-09-05)
7
-
8
- ### Bug Fixes
9
-
10
- * run the feature suites on a fresh checkout ([712a03d](https://github.com/toa-io/toa/commit/712a03d37cca40709e919f9cc996a3d67bea2098))
11
-
12
-
13
- # [1.0.0-alpha.283](https://github.com/toa-io/toa/compare/v1.0.0-alpha.282...v1.0.0-alpha.283) (2026-09-04)
14
-
15
- ### Features
16
-
17
- * **cli:** generate an application's types from its manifests ([195ac94](https://github.com/toa-io/toa/commit/195ac94de0d8c9de995847599511782c399768a5))
18
-
19
-
20
- # [1.0.0-alpha.282](https://github.com/toa-io/toa/compare/v1.0.0-alpha.281...v1.0.0-alpha.282) (2026-09-03)
21
-
22
- **Note:** Version bump only for package @toa.io/userland
23
-
24
-
25
-
26
-
27
-
28
- # [1.0.0-alpha.279](https://github.com/toa-io/toa/compare/v1.0.0-alpha.278...v1.0.0-alpha.279) (2026-09-03)
29
-
30
- ### Bug Fixes
31
-
32
- * **userland:** let a TypeScript consumer find the declarations of `stage` ([c108cb5](https://github.com/toa-io/toa/commit/c108cb545d62204339b924f47f3863b8c40831d3))
33
-
34
-
35
- # [1.0.0-alpha.278](https://github.com/toa-io/toa/compare/v1.0.0-alpha.277...v1.0.0-alpha.278) (2026-09-03)
36
-
37
- **Note:** Version bump only for package @toa.io/userland
38
-
39
-
40
-
41
-
42
-
43
- # [1.0.0-alpha.277](https://github.com/toa-io/toa/compare/v1.0.0-alpha.276...v1.0.0-alpha.277) (2026-09-03)
44
-
45
- ### Bug Fixes
46
-
47
- * settle what the module loader made asynchronous ([d4ab9df](https://github.com/toa-io/toa/commit/d4ab9dfb09e382da311dba08f52214e7645f4a6c))
48
- * what the loader resolves, and what it will not ([1b8a02f](https://github.com/toa-io/toa/commit/1b8a02ff0a5e0f18ee62e3f71bc81116f86f9af1))
49
-
50
-
51
- # [1.0.0-alpha.274](https://github.com/toa-io/toa/compare/v1.0.0-alpha.273...v1.0.0-alpha.274) (2026-09-02)
52
-
53
-
54
- * Configuration is served by a component, followed live, and kept per epoch (#1017) ([b05997d](https://github.com/toa-io/toa/commit/b05997d3adb784f238a222cb46878b23859339a2)), closes [#1017](https://github.com/toa-io/toa/issues/1017)
55
-
56
-
57
- ### BREAKING CHANGES
58
-
59
- * a secret configuration value is an object, not a string;
60
- read it with `unwrap()`.
61
-
62
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
63
-
64
- * test(configuration): wait for the second round rather than assume it
65
-
66
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
67
-
68
- * refactor(configuration)!: read a secret with its own unwrap
69
-
70
- Component code depends on no Toa package, so a secret is read as
71
- `context.configuration.apiKey.unwrap()` and the helper in `@toa.io/generic`
72
- goes. A value a component reads as a secret is therefore given as a reference:
73
- `identity.basic` no longer defaults `pepper` to `''`, the development context
74
- and the feature harness give the token keys, the federation client secret and
75
- the signing key as references, and the harness has a step for the secrets a
76
- scenario refers to. CONTRIBUTING states the rule.
77
- * `identity.basic` `pepper` has no default; a value read as a
78
- secret must be given as a `$NAME` reference.
79
-
80
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
81
-
82
- * feat(configuration): list the configurations
83
-
84
- `configuration.values.list` returns every component's configuration for its
85
- deployed epoch, by component name, and `GET /configuration/values/` serves it
86
- behind `system:configuration:get`.
87
-
88
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
89
-
90
- * fix(exposition): write a value in YAML the way its toJSON says
91
-
92
- A redacted secret in a reply was dumped as an empty object; it is written as
93
- `<REDACTED>`, as JSON and msgpack already write it.
94
-
95
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
96
-
97
- * test(configuration): a secret is an object, and stays redacted in a reply
98
-
99
- A component with `{ a: 1, b: $SECRET_B }` returns its configuration as
100
- `{ a: 1, b: '<REDACTED>' }` and the secret itself through `unwrap()`. The reply
101
- step also accepts a reply as a caller across a process boundary receives it,
102
- since a call within the process hands the object over as it is.
103
-
104
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
105
-
106
- * chore(schemas): bump the dependencies
107
-
108
- ajv 8.18.0 to 8.20.0, ajv-formats 2.1.1 to 3.0.1, better-ajv-errors 1.2.0
109
- to 2.0.3, fast-glob 3.2.12 to 3.3.3 and js-yaml 4.3.1 to 5.4.1 — the version
110
- exposition already uses. The three majors keep the CommonJS entry points this
111
- library calls: ajv-formats as a function, better-ajv-errors as .default, and
112
- js-yaml's load.
113
-
114
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
115
-
116
- * feat(configuration)!: serve the schema with the value
117
-
118
- GET /configuration/values/:component/ answers { configuration, schema, epoch }
119
- where it answered with the configuration alone, and list carries the schema of
120
- every component. Nothing reads a configuration without needing to know what it
121
- is checked against, and the schema was only ever on the values service.
122
-
123
- An epoch the deployment does not know has no schema; the value stored for it
124
- is still returned.
125
-
126
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
127
-
128
- * feat(configuration): publish a configuration UI
129
-
130
- The values service serves a page at /.configuration on port 8003, out of the
131
- directory ui builds: the configured components, a screen per component showing
132
- what it holds now, and a dialog creating the next one. Reading needs
133
- system:configuration:get and creating needs system:configuration:create.
134
-
135
- A configuration is immutable, so the dialog opens on the current value and what
136
- is left out of it is left out of the component. The editor takes YAML, the
137
- schema is applied before anything is sent, and a secret is a reference the page
138
- never shows.
139
-
140
- The page is always published: the annotation is the per-component values map
141
- and has nowhere to carry a switch.
142
-
143
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
144
-
145
- * feat(introspection): link a component to its configuration
146
-
147
- A card carrying @toa.io/extensions.configuration reads that extension as a link
148
- to the configuration UI rather than as a name, and configuration joins the
149
- namespaces the runtime provides, so its components band under System.
150
-
151
- Deployed, both pages sit behind the same ingress and the path alone is right;
152
- locally each console has its own port.
153
-
154
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
155
-
156
- * feat(introspection): scroll the map, zoom with a modifier
157
-
158
- The map was grabbed to move and zoomed with a bare wheel, which is neither what
159
- a page does nor what the wheel does anywhere else. A plain scroll now pans on
160
- both axes and the wheel scales only with the modifier held — a trackpad pinch
161
- arrives as one of those on every platform.
162
-
163
- A card's own scrollable box keeps its wheel, in both paths.
164
-
165
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
166
-
167
- * refactor(introspection): centre the filter in the header
168
-
169
- The sides take equal space, which is what leaves the filter between them.
170
- Neither side may shrink under what it holds, or the tabs run out from under
171
- their side and across the filter, and the filter across the sign-out button;
172
- the title gives way instead.
173
-
174
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
175
-
176
- * fix(configuration): connect the UI to the values service
177
-
178
- The page was declared as a dependency from inside `open`, and a connector connects
179
- what it depends on before `open` runs — so the server was constructed and never
180
- listened. Nothing caught it: the UI feature builds the server itself.
181
-
182
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
183
-
184
- * feat(configuration)!: reserve resources in the annotation
185
-
186
- The values service deploys like any other and must state what it may take, but the
187
- annotation is a map of component ids and had nowhere to put it — so `toa env` failed
188
- for every context using configuration unless it declared a context-wide `resources`.
189
-
190
- `resources` is now the service's own, read the way `introspection` and `realtime` read
191
- theirs. A component actually named `resources` is written `default.resources`, which is
192
- what its id is anyway.
193
-
194
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
195
-
196
- * feat(configuration): follow the system colour scheme
197
-
198
- The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
199
- pointed at that class too — so a component's own dark styling never applied either.
200
- Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
201
- the same answer.
202
-
203
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
204
-
205
- * feat(introspection): follow the system colour scheme
206
-
207
- The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
208
- pointed at that class too — so a component's own dark styling never applied either.
209
- Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
210
- the same answer.
211
-
212
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
213
-
214
- * feat(configuration): present a change as an edit of what is there
215
-
216
- A configuration is immutable and creating one replaces the whole of it, but the dialog
217
- opens on the current value and the page never shows an older one — so what the reader
218
- does is edit. The words follow: Edit rather than New, Update rather than Create, and
219
- the paragraph explaining the model goes, along with the field's label, which the title
220
- above it already said.
221
-
222
- The editor also stayed as wide as its longest line — `field-sizing: content` sizes to
223
- content, and no `max-width` clamps that — so a long value painted outside the dialog.
224
- It is fixed now, the dialog takes the width the screen has rather than a fixed step,
225
- and the band held for errors no longer leaves a gap when there are none.
226
-
227
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
228
-
229
- * feat(configuration): mark a component that keeps a secret
230
-
231
- A key after the name on the row, wherever the configuration holds a reference, however
232
- deep. The predicate reads the same lines the value screen renders, so the two cannot
233
- disagree about what counts as a secret.
234
-
235
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
236
-
237
- * feat(configuration): lead back to the list from the title
238
-
239
- Every address ends in a slash, so the way up is the address itself on the list and one
240
- level above it on a component's screen — which holds wherever the page is mounted.
241
-
242
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
243
-
244
-
245
-
246
-
247
-
248
- # [1.0.0-alpha.273](https://github.com/toa-io/toa/compare/v1.0.0-alpha.272...v1.0.0-alpha.273) (2026-09-02)
249
-
250
- **Note:** Version bump only for package @toa.io/userland
251
-
252
-
253
-
254
-
255
-
256
- # [1.0.0-alpha.272](https://github.com/toa-io/toa/compare/v1.0.0-alpha.271...v1.0.0-alpha.272) (2026-09-01)
257
-
258
- **Note:** Version bump only for package @toa.io/userland
259
-
260
-
261
-
262
-
263
-
264
- # [1.0.0-alpha.270](https://github.com/toa-io/toa/compare/v1.0.0-alpha.269...v1.0.0-alpha.270) (2026-08-31)
265
-
266
- **Note:** Version bump only for package @toa.io/userland
267
-
268
-
269
-
270
-
271
-
272
- # [1.0.0-alpha.266](https://github.com/toa-io/toa/compare/v1.0.0-alpha.265...v1.0.0-alpha.266) (2026-08-29)
273
-
274
- **Note:** Version bump only for package @toa.io/userland
275
-
276
-
277
-
278
-
279
-
280
- # [1.0.0-alpha.265](https://github.com/toa-io/toa/compare/v1.0.0-alpha.264...v1.0.0-alpha.265) (2026-08-29)
281
-
282
- **Note:** Version bump only for package @toa.io/userland
283
-
284
-
285
-
286
-
287
-
288
- # [1.0.0-alpha.264](https://github.com/toa-io/toa/compare/v1.0.0-alpha.263...v1.0.0-alpha.264) (2026-08-29)
289
-
290
- **Note:** Version bump only for package @toa.io/userland
291
-
292
-
293
-
294
-
295
-
296
- # [1.0.0-alpha.263](https://github.com/toa-io/toa/compare/v1.0.0-alpha.262...v1.0.0-alpha.263) (2026-08-29)
297
-
298
- **Note:** Version bump only for package @toa.io/userland
299
-
300
-
301
-
302
-
303
-
304
- # [1.0.0-alpha.262](https://github.com/toa-io/toa/compare/v1.0.0-alpha.261...v1.0.0-alpha.262) (2026-08-28)
305
-
306
-
307
- ### Bug Fixes
308
-
309
- * **stage:** name the feature suite as the caller ([e4e593b](https://github.com/toa-io/toa/commit/e4e593b795cc7dc113f06e8a1554ae2ef36442c0))
310
-
311
-
312
-
313
-
314
-
315
- # [1.0.0-alpha.259](https://github.com/toa-io/toa/compare/v1.0.0-alpha.258...v1.0.0-alpha.259) (2026-08-24)
316
-
317
- **Note:** Version bump only for package @toa.io/userland
318
-
319
-
320
-
321
-
322
-
323
- # [1.0.0-alpha.257](https://github.com/toa-io/toa/compare/v1.0.0-alpha.256...v1.0.0-alpha.257) (2026-08-24)
324
-
325
- **Note:** Version bump only for package @toa.io/userland
326
-
327
-
328
-
329
-
330
-
331
- # [1.0.0-alpha.256](https://github.com/toa-io/toa/compare/v1.0.0-alpha.255...v1.0.0-alpha.256) (2026-08-23)
332
-
333
-
334
- ### Features
335
-
336
- * add toa mono and discover components at components/* ([787a111](https://github.com/toa-io/toa/commit/787a111c8f83e56ebc734801c97106c585d034ea))