@toa.io/extensions.introspection 1.0.0-alpha.273 → 1.0.0-alpha.275

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 (44) hide show
  1. package/CHANGELOG.md +216 -0
  2. package/components/introspection.edges/manifest.toa.yaml +1 -0
  3. package/components/introspection.nodes/manifest.toa.yaml +1 -0
  4. package/features/calls.feature +1 -1
  5. package/features/site/favicon.ico +0 -0
  6. package/features/steps/Map.ts +19 -0
  7. package/features/ui.feature +8 -0
  8. package/package.json +3 -3
  9. package/source/UI.ts +16 -1
  10. package/transpiled/UI.js +14 -1
  11. package/transpiled/UI.js.map +1 -1
  12. package/transpiled/tsconfig.tsbuildinfo +1 -1
  13. package/ui/dist/_app/immutable/assets/0.CWRy6hIz.css +2 -0
  14. package/ui/dist/_app/immutable/chunks/BgLVmLUg.js +6 -0
  15. package/ui/dist/_app/immutable/chunks/{zxIUM3uQ.js → CQYQzIAm.js} +1 -1
  16. package/ui/dist/_app/immutable/chunks/DGWLq7zN.js +1 -0
  17. package/ui/dist/_app/immutable/chunks/{B1UAXRl6.js → DLJEiTIm.js} +1 -1
  18. package/ui/dist/_app/immutable/chunks/{DqYXmv_C.js → DWfAh2mU.js} +2 -2
  19. package/ui/dist/_app/immutable/chunks/{BRzKTtG1.js → DllaaI1z.js} +1 -1
  20. package/ui/dist/_app/immutable/chunks/Dnou3631.js +6 -0
  21. package/ui/dist/_app/immutable/chunks/{CHZigHJJ.js → DrupD-xi.js} +1 -1
  22. package/ui/dist/_app/immutable/chunks/Jr_qb31y.js +1 -0
  23. package/ui/dist/_app/immutable/entry/{app.BQaWSqcG.js → app.CwYjzAPj.js} +2 -2
  24. package/ui/dist/_app/immutable/entry/start.CAiqwiTF.js +1 -0
  25. package/ui/dist/_app/immutable/nodes/0.B6k96PrQ.js +1 -0
  26. package/ui/dist/_app/immutable/nodes/{1.Bf7_YJQ8.js → 1.DsHbg745.js} +1 -1
  27. package/ui/dist/_app/immutable/nodes/{2.CFLv6RzK.js → 2.Dv1nbQ4z.js} +2 -2
  28. package/ui/dist/_app/immutable/nodes/3.DqSR_gXe.js +1 -0
  29. package/ui/dist/_app/immutable/nodes/4.C86LxDPm.js +1 -0
  30. package/ui/dist/_app/immutable/nodes/{5.CDeyHOCG.js → 5.DTI16q4i.js} +1 -1
  31. package/ui/dist/_app/version.json +1 -1
  32. package/ui/dist/apple-touch-icon.png +0 -0
  33. package/ui/dist/favicon-96x96.png +0 -0
  34. package/ui/dist/favicon.ico +0 -0
  35. package/ui/dist/index.html +19 -13
  36. package/ui/dist/_app/immutable/assets/0.BL1urM24.css +0 -2
  37. package/ui/dist/_app/immutable/chunks/B4keVd1W.js +0 -1
  38. package/ui/dist/_app/immutable/chunks/BYoLgHHK.js +0 -1
  39. package/ui/dist/_app/immutable/chunks/BhsTl35j.js +0 -5
  40. package/ui/dist/_app/immutable/chunks/Bva_8OsO.js +0 -6
  41. package/ui/dist/_app/immutable/entry/start.DFsFdV8O.js +0 -1
  42. package/ui/dist/_app/immutable/nodes/0.Dl8mPn96.js +0 -1
  43. package/ui/dist/_app/immutable/nodes/3.DANq7w76.js +0 -1
  44. package/ui/dist/_app/immutable/nodes/4.Bc-YH5ro.js +0 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,222 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.0.0-alpha.275](https://github.com/toa-io/toa/compare/v1.0.0-alpha.274...v1.0.0-alpha.275) (2026-09-02)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **configuration:** ship the component's code and the built page ([6ffe988](https://github.com/toa-io/toa/commit/6ffe988a9e67025c114e74ba94665b28a2cafaa1))
12
+ * **introspection:** draw a band to the width of the map ([b70650b](https://github.com/toa-io/toa/commit/b70650b0c91ac49945e887b30d1953836814226b))
13
+ * **introspection:** keep a sideways scroll off the browser's back gesture ([419e012](https://github.com/toa-io/toa/commit/419e012ce093bcd0429dc93fe457bbd964cfc11c))
14
+
15
+
16
+ ### Features
17
+
18
+ * **ui:** give both consoles a favicon ([27d3881](https://github.com/toa-io/toa/commit/27d3881eda10e59dc4c9c5ef38c2a58b71e1448d))
19
+ * **ui:** leave signing out to its icon ([a82fbab](https://github.com/toa-io/toa/commit/a82fbab513706436254348a5e35115dc3721873f))
20
+
21
+
22
+
23
+
24
+
25
+ # [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)
26
+
27
+
28
+ * 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)
29
+
30
+
31
+ ### BREAKING CHANGES
32
+
33
+ * a secret configuration value is an object, not a string;
34
+ read it with `unwrap()`.
35
+
36
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
37
+
38
+ * test(configuration): wait for the second round rather than assume it
39
+
40
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
41
+
42
+ * refactor(configuration)!: read a secret with its own unwrap
43
+
44
+ Component code depends on no Toa package, so a secret is read as
45
+ `context.configuration.apiKey.unwrap()` and the helper in `@toa.io/generic`
46
+ goes. A value a component reads as a secret is therefore given as a reference:
47
+ `identity.basic` no longer defaults `pepper` to `''`, the development context
48
+ and the feature harness give the token keys, the federation client secret and
49
+ the signing key as references, and the harness has a step for the secrets a
50
+ scenario refers to. CONTRIBUTING states the rule.
51
+ * `identity.basic` `pepper` has no default; a value read as a
52
+ secret must be given as a `$NAME` reference.
53
+
54
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
55
+
56
+ * feat(configuration): list the configurations
57
+
58
+ `configuration.values.list` returns every component's configuration for its
59
+ deployed epoch, by component name, and `GET /configuration/values/` serves it
60
+ behind `system:configuration:get`.
61
+
62
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
63
+
64
+ * fix(exposition): write a value in YAML the way its toJSON says
65
+
66
+ A redacted secret in a reply was dumped as an empty object; it is written as
67
+ `<REDACTED>`, as JSON and msgpack already write it.
68
+
69
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
70
+
71
+ * test(configuration): a secret is an object, and stays redacted in a reply
72
+
73
+ A component with `{ a: 1, b: $SECRET_B }` returns its configuration as
74
+ `{ a: 1, b: '<REDACTED>' }` and the secret itself through `unwrap()`. The reply
75
+ step also accepts a reply as a caller across a process boundary receives it,
76
+ since a call within the process hands the object over as it is.
77
+
78
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
79
+
80
+ * chore(schemas): bump the dependencies
81
+
82
+ ajv 8.18.0 to 8.20.0, ajv-formats 2.1.1 to 3.0.1, better-ajv-errors 1.2.0
83
+ 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
84
+ exposition already uses. The three majors keep the CommonJS entry points this
85
+ library calls: ajv-formats as a function, better-ajv-errors as .default, and
86
+ js-yaml's load.
87
+
88
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
89
+
90
+ * feat(configuration)!: serve the schema with the value
91
+
92
+ GET /configuration/values/:component/ answers { configuration, schema, epoch }
93
+ where it answered with the configuration alone, and list carries the schema of
94
+ every component. Nothing reads a configuration without needing to know what it
95
+ is checked against, and the schema was only ever on the values service.
96
+
97
+ An epoch the deployment does not know has no schema; the value stored for it
98
+ is still returned.
99
+
100
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
101
+
102
+ * feat(configuration): publish a configuration UI
103
+
104
+ The values service serves a page at /.configuration on port 8003, out of the
105
+ directory ui builds: the configured components, a screen per component showing
106
+ what it holds now, and a dialog creating the next one. Reading needs
107
+ system:configuration:get and creating needs system:configuration:create.
108
+
109
+ A configuration is immutable, so the dialog opens on the current value and what
110
+ is left out of it is left out of the component. The editor takes YAML, the
111
+ schema is applied before anything is sent, and a secret is a reference the page
112
+ never shows.
113
+
114
+ The page is always published: the annotation is the per-component values map
115
+ and has nowhere to carry a switch.
116
+
117
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
118
+
119
+ * feat(introspection): link a component to its configuration
120
+
121
+ A card carrying @toa.io/extensions.configuration reads that extension as a link
122
+ to the configuration UI rather than as a name, and configuration joins the
123
+ namespaces the runtime provides, so its components band under System.
124
+
125
+ Deployed, both pages sit behind the same ingress and the path alone is right;
126
+ locally each console has its own port.
127
+
128
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
129
+
130
+ * feat(introspection): scroll the map, zoom with a modifier
131
+
132
+ The map was grabbed to move and zoomed with a bare wheel, which is neither what
133
+ a page does nor what the wheel does anywhere else. A plain scroll now pans on
134
+ both axes and the wheel scales only with the modifier held — a trackpad pinch
135
+ arrives as one of those on every platform.
136
+
137
+ A card's own scrollable box keeps its wheel, in both paths.
138
+
139
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
140
+
141
+ * refactor(introspection): centre the filter in the header
142
+
143
+ The sides take equal space, which is what leaves the filter between them.
144
+ Neither side may shrink under what it holds, or the tabs run out from under
145
+ their side and across the filter, and the filter across the sign-out button;
146
+ the title gives way instead.
147
+
148
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
149
+
150
+ * fix(configuration): connect the UI to the values service
151
+
152
+ The page was declared as a dependency from inside `open`, and a connector connects
153
+ what it depends on before `open` runs — so the server was constructed and never
154
+ listened. Nothing caught it: the UI feature builds the server itself.
155
+
156
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
157
+
158
+ * feat(configuration)!: reserve resources in the annotation
159
+
160
+ The values service deploys like any other and must state what it may take, but the
161
+ annotation is a map of component ids and had nowhere to put it — so `toa env` failed
162
+ for every context using configuration unless it declared a context-wide `resources`.
163
+
164
+ `resources` is now the service's own, read the way `introspection` and `realtime` read
165
+ theirs. A component actually named `resources` is written `default.resources`, which is
166
+ what its id is anyway.
167
+
168
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
169
+
170
+ * feat(configuration): follow the system colour scheme
171
+
172
+ The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
173
+ pointed at that class too — so a component's own dark styling never applied either.
174
+ Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
175
+ the same answer.
176
+
177
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
178
+
179
+ * feat(introspection): follow the system colour scheme
180
+
181
+ The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
182
+ pointed at that class too — so a component's own dark styling never applied either.
183
+ Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
184
+ the same answer.
185
+
186
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
187
+
188
+ * feat(configuration): present a change as an edit of what is there
189
+
190
+ A configuration is immutable and creating one replaces the whole of it, but the dialog
191
+ opens on the current value and the page never shows an older one — so what the reader
192
+ does is edit. The words follow: Edit rather than New, Update rather than Create, and
193
+ the paragraph explaining the model goes, along with the field's label, which the title
194
+ above it already said.
195
+
196
+ The editor also stayed as wide as its longest line — `field-sizing: content` sizes to
197
+ content, and no `max-width` clamps that — so a long value painted outside the dialog.
198
+ It is fixed now, the dialog takes the width the screen has rather than a fixed step,
199
+ and the band held for errors no longer leaves a gap when there are none.
200
+
201
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
202
+
203
+ * feat(configuration): mark a component that keeps a secret
204
+
205
+ A key after the name on the row, wherever the configuration holds a reference, however
206
+ deep. The predicate reads the same lines the value screen renders, so the two cannot
207
+ disagree about what counts as a secret.
208
+
209
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
210
+
211
+ * feat(configuration): lead back to the list from the title
212
+
213
+ Every address ends in a slash, so the way up is the address itself on the list and one
214
+ level above it on a component's screen — which holds wherever the page is mounted.
215
+
216
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
217
+
218
+
219
+
220
+
221
+
6
222
  # [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)
7
223
 
8
224
  **Note:** Version bump only for package @toa.io/extensions.introspection
@@ -34,6 +34,7 @@ operations:
34
34
  introspection: false
35
35
 
36
36
  exposition:
37
+ isolated: true
37
38
  /:
38
39
  auth:role: system:introspection
39
40
 
@@ -41,6 +41,7 @@ operations:
41
41
  introspection: false
42
42
 
43
43
  exposition:
44
+ isolated: true
44
45
  /:
45
46
  auth:role: system:introspection
46
47
 
@@ -67,7 +67,7 @@ Feature: Call edges
67
67
  """
68
68
 
69
69
  Scenario: A call from an unidentified caller
70
- When the `probe.target.compute` is called with:
70
+ When the `probe.target.compute` is called by an unidentified caller with:
71
71
  """yaml
72
72
  input:
73
73
  a: 1
Binary file
@@ -7,6 +7,7 @@ import { after, before, binding, then, when } from 'cucumber-tsflow'
7
7
  import { load as parse } from 'js-yaml'
8
8
  import { match } from '@toa.io/generic'
9
9
  import * as boot from '@toa.io/boot'
10
+ import { Locator } from '@toa.io/core'
10
11
  import * as stage from '@toa.io/userland/stage'
11
12
  import { Factory } from '../../source'
12
13
  import type { Component, Connector, Request } from '@toa.io/core'
@@ -16,6 +17,7 @@ export class Map {
16
17
  private service: Connector | null = null
17
18
  private composition: Connector | null = null
18
19
  private remotes: Record<string, Component> = {}
20
+ private unidentified: Component | null = null
19
21
 
20
22
  @when('the `{word}` is called with:')
21
23
  public async call (endpoint: string, yaml: string): Promise<void> {
@@ -26,6 +28,21 @@ export class Map {
26
28
  await this.invoke(`${namespace}.${component}`, operation, request).catch(() => undefined)
27
29
  }
28
30
 
31
+ /**
32
+ * The stage names itself as the caller, as every entry point does; a call that names
33
+ * nobody is made past it, straight through a remote of its own.
34
+ */
35
+ @when('the `{word}` is called by an unidentified caller with:')
36
+ public async callUnidentified (endpoint: string, yaml: string): Promise<void> {
37
+ const request = parse(yaml) as Request
38
+ const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
39
+
40
+ this.unidentified ??= await boot.remote(new Locator(component, namespace))
41
+
42
+ await this.unidentified.connect()
43
+ await this.unidentified.invoke(operation, request).catch(() => undefined)
44
+ }
45
+
29
46
  @then('the map contains a node:')
30
47
  public async node (yaml: string): Promise<void> {
31
48
  await this.eventually('introspection.nodes', parse(yaml) as object)
@@ -71,12 +88,14 @@ export class Map {
71
88
  public async shutdown (): Promise<void> {
72
89
  this.remotes = {}
73
90
 
91
+ await this.unidentified?.disconnect()
74
92
  await this.composition?.disconnect()
75
93
  await stage.shutdown()
76
94
  await this.service?.disconnect()
77
95
 
78
96
  this.composition = null
79
97
  this.service = null
98
+ this.unidentified = null
80
99
  }
81
100
 
82
101
  private async invoke (id: string, operation: string, request: Request): Promise<unknown> {
@@ -59,6 +59,14 @@ Feature: Publishing the UI
59
59
  And the "content-type" header is "text/javascript; charset=utf-8"
60
60
  And the "cache-control" header is "public, max-age=31536000, immutable"
61
61
 
62
+ Scenario: An icon is held, but not forever
63
+ It is named for what it is rather than for its content, so it is asked about again.
64
+
65
+ Given the UI is published
66
+ When "/.introspection/favicon.ico" is requested
67
+ Then the status is 200
68
+ And the "cache-control" header is "public, max-age=86400"
69
+
62
70
  Scenario: The page itself is never cached
63
71
  Given the UI is published
64
72
  When "/.introspection/" is requested
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toa.io/extensions.introspection",
3
- "version": "1.0.0-alpha.273",
3
+ "version": "1.0.0-alpha.275",
4
4
  "description": "Toa Introspection",
5
5
  "author": "temich <tema.gurtovoy@gmail.com>",
6
6
  "homepage": "https://github.com/toa-io/toa#readme",
@@ -19,7 +19,7 @@
19
19
  "dependencies": {
20
20
  "@toa.io/core": "1.0.0-alpha.273",
21
21
  "@toa.io/generic": "1.0.0-alpha.273",
22
- "@toa.io/schemas": "1.0.0-alpha.273",
22
+ "@toa.io/schemas": "1.0.0-alpha.274",
23
23
  "openspan": "1.0.0-alpha.272"
24
24
  },
25
25
  "scripts": {
@@ -28,5 +28,5 @@
28
28
  "prepack": "npm run build:ui",
29
29
  "features": "npx cucumber-js --tags 'not @samples and not @shutdown' && TOA_INTROSPECTION_SAMPLES=1 npx cucumber-js --tags @samples && TOA_INTROSPECTION_INTERVAL=3600 npx cucumber-js --tags @shutdown"
30
30
  },
31
- "gitHead": "ad3284850ece95ffd5325fd0995707fc144c9c3d"
31
+ "gitHead": "ed4e01a7709ca245c738766c9f01724bd1d54e96"
32
32
  }
package/source/UI.ts CHANGED
@@ -150,7 +150,7 @@ export class UI extends Connector {
150
150
  response.writeHead(200, {
151
151
  'content-type': TYPES[path.extname(file)] ?? 'application/octet-stream',
152
152
  'content-length': stats.size,
153
- 'cache-control': file.startsWith(path.join(this.root, IMMUTABLE)) ? FOREVER : 'no-cache'
153
+ 'cache-control': caching(path.relative(this.root, file))
154
154
  })
155
155
 
156
156
  if (request.method === 'HEAD')
@@ -179,6 +179,21 @@ const SITE = path.resolve(__dirname, '..', 'ui', 'dist')
179
179
  const IMMUTABLE = path.join('_app', 'immutable')
180
180
  const FOREVER = 'public, max-age=31536000, immutable'
181
181
 
182
+ /** The icons: named without a hash, so they are re-read, but rarely. */
183
+ const ICONS = new Set(['favicon.ico', 'favicon-96x96.png', 'apple-touch-icon.png'])
184
+ const DAY = 'public, max-age=86400'
185
+
186
+ /**
187
+ * How long what is served may be held. The page is never cached — it names the assets,
188
+ * and their names carry the build. An icon is named for what it is rather than for its
189
+ * content, so it is asked about again, but not on every page load.
190
+ */
191
+ function caching (relative: string): string {
192
+ if (relative.startsWith(IMMUTABLE)) return FOREVER
193
+
194
+ return ICONS.has(relative) ? DAY : 'no-cache'
195
+ }
196
+
182
197
  const TYPES: Record<string, string> = {
183
198
  '.css': 'text/css; charset=utf-8',
184
199
  '.html': 'text/html; charset=utf-8',
package/transpiled/UI.js CHANGED
@@ -142,7 +142,7 @@ class UI extends core_1.Connector {
142
142
  response.writeHead(200, {
143
143
  'content-type': TYPES[path.extname(file)] ?? 'application/octet-stream',
144
144
  'content-length': stats.size,
145
- 'cache-control': file.startsWith(path.join(this.root, IMMUTABLE)) ? FOREVER : 'no-cache'
145
+ 'cache-control': caching(path.relative(this.root, file))
146
146
  });
147
147
  if (request.method === 'HEAD')
148
148
  response.end();
@@ -167,6 +167,19 @@ const SITE = path.resolve(__dirname, '..', 'ui', 'dist');
167
167
  /** Assets under this prefix carry their build hash in the name. */
168
168
  const IMMUTABLE = path.join('_app', 'immutable');
169
169
  const FOREVER = 'public, max-age=31536000, immutable';
170
+ /** The icons: named without a hash, so they are re-read, but rarely. */
171
+ const ICONS = new Set(['favicon.ico', 'favicon-96x96.png', 'apple-touch-icon.png']);
172
+ const DAY = 'public, max-age=86400';
173
+ /**
174
+ * How long what is served may be held. The page is never cached — it names the assets,
175
+ * and their names carry the build. An icon is named for what it is rather than for its
176
+ * content, so it is asked about again, but not on every page load.
177
+ */
178
+ function caching(relative) {
179
+ if (relative.startsWith(IMMUTABLE))
180
+ return FOREVER;
181
+ return ICONS.has(relative) ? DAY : 'no-cache';
182
+ }
170
183
  const TYPES = {
171
184
  '.css': 'text/css; charset=utf-8',
172
185
  '.html': 'text/html; charset=utf-8',
@@ -1 +1 @@
1
- {"version":3,"file":"UI.js","sourceRoot":"","sources":["../source/UI.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UI.js","sourceRoot":"","sources":["../source/UI.ts"],"names":[],"mappings":"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"}