@north-light/crouter 0.3.197 → 0.3.198

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 (144) hide show
  1. package/dist/api/client.d.ts +2 -2
  2. package/dist/api/dto/inbox.d.ts +46 -0
  3. package/dist/builtin-memory/00-runtime-base.md +3 -3
  4. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  5. package/dist/builtin-memory/internal/storage-tiers.md +1 -1
  6. package/dist/builtin-memory/wedged-child-on-runaway-bash.md +1 -1
  7. package/dist/clients/attach/render/chat-view.d.ts +3 -8
  8. package/dist/clients/attach/render/chat-view.js +3 -24
  9. package/dist/clients/attach/render/markdown-source.js +0 -6
  10. package/dist/clients/attach/render/tool-calls.js +16 -2
  11. package/dist/clients/attach/viewer.js +613 -602
  12. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +2 -2
  13. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +11 -4
  14. package/dist/clients/inbox/controller.js +4 -4
  15. package/dist/clients/inbox/page-adapter.d.ts +2 -1
  16. package/dist/clients/inbox/tui/render.js +46 -25
  17. package/dist/clients/inbox/tui/slots.d.ts +1 -3
  18. package/dist/clients/inbox/tui/slots.js +8 -37
  19. package/dist/clients/inbox/tui/types.d.ts +4 -3
  20. package/dist/commands/__tests__/human.test.js +160 -23
  21. package/dist/commands/canvas-browse.js +1 -1
  22. package/dist/commands/human/doc.js +21 -74
  23. package/dist/commands/human/html.d.ts +2 -0
  24. package/dist/commands/human/html.js +81 -0
  25. package/dist/commands/human/prompts.d.ts +5 -4
  26. package/dist/commands/human/prompts.js +81 -153
  27. package/dist/commands/human/shared.d.ts +5 -6
  28. package/dist/commands/human/shared.js +13 -61
  29. package/dist/commands/human.js +7 -2
  30. package/dist/core/__tests__/daemon-boot.test.js +7 -4
  31. package/dist/core/__tests__/dead-node-policy-table.test.js +20 -36
  32. package/dist/core/__tests__/human-deliver.test.js +28 -37
  33. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +13 -11
  34. package/dist/core/__tests__/seam/dormancy-release.test.js +63 -4
  35. package/dist/core/__tests__/serial/human-deliver-e2e.test.js +3 -13
  36. package/dist/core/canvas/__tests__/attention.test.js +2 -2
  37. package/dist/core/canvas/__tests__/render-remote.test.js +2 -2
  38. package/dist/core/canvas/browse/app.d.ts +1 -1
  39. package/dist/core/canvas/browse/app.js +21 -3
  40. package/dist/core/canvas/browse/render.d.ts +4 -0
  41. package/dist/core/canvas/browse/render.js +5 -1
  42. package/dist/core/canvas/canvas.d.ts +26 -0
  43. package/dist/core/canvas/canvas.js +55 -0
  44. package/dist/core/command.js +6 -11
  45. package/dist/core/config.js +3 -2
  46. package/dist/core/help.d.ts +3 -0
  47. package/dist/core/human/__tests__/html-markdown.test.d.ts +1 -0
  48. package/dist/core/human/__tests__/html-markdown.test.js +52 -0
  49. package/dist/core/human/__tests__/page-catalog.test.d.ts +1 -0
  50. package/dist/core/human/__tests__/page-catalog.test.js +16 -0
  51. package/dist/core/human/__tests__/page-render.test.js +40 -23
  52. package/dist/core/human/__tests__/page-tickets.test.js +48 -27
  53. package/dist/core/human/__tests__/page.test.js +48 -65
  54. package/dist/core/human/__tests__/serial/inbox-core.test.js +5 -15
  55. package/dist/core/human/answer-text.d.ts +3 -0
  56. package/dist/core/human/answer-text.js +98 -0
  57. package/dist/core/human/answer.d.ts +51 -0
  58. package/dist/core/human/answer.js +125 -0
  59. package/dist/core/human/component-docs.d.ts +14 -0
  60. package/dist/core/human/component-docs.js +161 -0
  61. package/dist/core/human/html-markdown.d.ts +3 -0
  62. package/dist/core/human/html-markdown.js +288 -0
  63. package/dist/core/human/page-catalog.d.ts +19 -3
  64. package/dist/core/human/page-catalog.js +73 -16
  65. package/dist/core/human/page-render.d.ts +3 -2
  66. package/dist/core/human/page-render.js +19 -45
  67. package/dist/core/human/page-schema.d.ts +108 -8
  68. package/dist/core/human/page-schema.js +88 -31
  69. package/dist/core/human/page-synth.d.ts +2 -4
  70. package/dist/core/human/page-synth.js +23 -7
  71. package/dist/core/human/page.d.ts +14 -7
  72. package/dist/core/human/page.js +178 -90
  73. package/dist/core/human/review-schema.d.ts +1 -0
  74. package/dist/core/human/review-schema.js +1 -1
  75. package/dist/core/human/scan.d.ts +3 -2
  76. package/dist/core/human/scan.js +7 -8
  77. package/dist/core/human/summary.d.ts +4 -7
  78. package/dist/core/human/summary.js +4 -60
  79. package/dist/core/human/tickets.d.ts +10 -9
  80. package/dist/core/human/tickets.js +5 -3
  81. package/dist/core/human/types.d.ts +4 -0
  82. package/dist/core/keybindings/catalog.d.ts +2 -2
  83. package/dist/core/keybindings/catalog.js +1 -0
  84. package/dist/core/review/realize.js +9 -1
  85. package/dist/core/runtime/boot-root.js +6 -1
  86. package/dist/core/runtime/broker.js +8 -6
  87. package/dist/core/runtime/busy.d.ts +4 -3
  88. package/dist/core/runtime/busy.js +4 -3
  89. package/dist/core/runtime/spawn.js +4 -4
  90. package/dist/core/user-settings.d.ts +17 -2
  91. package/dist/core/user-settings.js +32 -11
  92. package/dist/daemon/api/handlers/human.js +1 -1
  93. package/dist/daemon/api/handlers/inbox.js +22 -7
  94. package/dist/daemon/cron-run.js +16 -2
  95. package/dist/daemon/crtrd.js +1 -1
  96. package/dist/daemon/fleet.d.ts +22 -10
  97. package/dist/daemon/fleet.js +43 -24
  98. package/dist/daemon/human/finish.d.ts +2 -1
  99. package/dist/daemon/human/finish.js +45 -28
  100. package/dist/daemon/human/sweep.js +4 -2
  101. package/dist/daemon/reconcilers/broker-supervision.js +11 -8
  102. package/dist/daemon/reconcilers/dormant-inbox.js +11 -6
  103. package/dist/daemon/reconcilers/live-obligation.d.ts +21 -1
  104. package/dist/daemon/reconcilers/live-obligation.js +30 -2
  105. package/dist/daemon/reconcilers/storage-maintenance.d.ts +5 -0
  106. package/dist/daemon/reconcilers/storage-maintenance.js +28 -1
  107. package/dist/daemon/review/sweep.js +12 -1
  108. package/dist/pages/bundle.css +1 -1
  109. package/dist/pages/bundle.js +1008 -577
  110. package/dist/pages/comments.d.ts +29 -0
  111. package/dist/pages/comments.js +51 -0
  112. package/dist/pages/controls.d.ts +98 -0
  113. package/dist/pages/controls.js +261 -0
  114. package/dist/pages/elements/cards.d.ts +15 -4
  115. package/dist/pages/elements/cards.js +299 -186
  116. package/dist/pages/elements/chart.d.ts +22 -0
  117. package/dist/pages/elements/chart.js +107 -91
  118. package/dist/pages/elements/options.d.ts +9 -0
  119. package/dist/pages/elements/options.js +268 -155
  120. package/dist/pages/elements/pages.d.ts +6 -0
  121. package/dist/pages/elements/pages.js +60 -38
  122. package/dist/pages/elements/slot.d.ts +5 -0
  123. package/dist/pages/elements/slot.js +17 -10
  124. package/dist/pages/elements/table.d.ts +17 -0
  125. package/dist/pages/elements/table.js +336 -228
  126. package/dist/pages/elements/text.d.ts +9 -3
  127. package/dist/pages/elements/text.js +350 -143
  128. package/dist/pages/host.d.ts +0 -24
  129. package/dist/pages/host.js +0 -17
  130. package/dist/pages/readonly.d.ts +24 -0
  131. package/dist/pages/readonly.js +31 -0
  132. package/dist/pages/responses.d.ts +37 -0
  133. package/dist/pages/responses.js +56 -0
  134. package/dist/pi-extensions/canvas-bash-valve.d.ts +9 -1
  135. package/dist/pi-extensions/canvas-bash-valve.js +12 -8
  136. package/dist/types.d.ts +19 -5
  137. package/dist/types.js +2 -1
  138. package/package.json +1 -1
  139. package/runtime.lock.json +2 -2
  140. package/scripts/install-runtime.mjs +19 -24
  141. package/dist/clients/attach/render/html-markdown.d.ts +0 -13
  142. package/dist/clients/attach/render/html-markdown.js +0 -206
  143. package/dist/core/human/markdown-html.d.ts +0 -8
  144. package/dist/core/human/markdown-html.js +0 -581
@@ -20,8 +20,16 @@
20
20
  *
21
21
  * A single-step page renders no pager chrome at all — no progress, no forward/back — just
22
22
  * the submit affordance, because there is nothing to flip.
23
+ *
24
+ * Both elements paint entirely through `--crtr-page-*` component tokens — the same element
25
+ * scope `bundle.css` gives `crtr-pages` and `crtr-page`, because a person looking at the page
26
+ * sees one thing. The pager's buttons are the bundle's ordinary buttons, so their focus ring
27
+ * and their motion chain through the shared `--crtr-control-*` family before falling back to
28
+ * the kit default.
23
29
  */
30
+ import { focusRingStyle } from '../controls.js';
24
31
  import { registerElement } from '../register.js';
32
+ import { reportSlotResponses } from '../responses.js';
25
33
  function hostBridge() {
26
34
  return window.crtr;
27
35
  }
@@ -37,11 +45,15 @@ const PAGE_STYLE = `
37
45
 
38
46
  [part="page"] {
39
47
  display: grid;
40
- gap: var(--crtr-space-3);
48
+ gap: var(--crtr-page-step-gap, var(--crtr-space-3));
41
49
  }
42
50
 
43
- [part="page"]:focus {
44
- outline: none;
51
+ /* A step takes focus programmatically when the pager flips to it, so it wears no ring by
52
+ default — a host that wants one sets the outline rather than patching around it. The
53
+ pager focuses the element itself, not the inner div, so the rule has to sit on the host:
54
+ on [part="page"] it would never match and every step change would paint a UA ring. */
55
+ :host(:focus) {
56
+ outline: var(--crtr-page-step-focus-outline, none);
45
57
  }
46
58
  `;
47
59
  const PAGES_STYLE = `
@@ -51,7 +63,7 @@ const PAGES_STYLE = `
51
63
 
52
64
  [part="container"] {
53
65
  display: grid;
54
- gap: var(--crtr-space-4);
66
+ gap: var(--crtr-page-container-gap, var(--crtr-space-4));
55
67
  }
56
68
 
57
69
  [part="chrome"] {
@@ -59,9 +71,11 @@ const PAGES_STYLE = `
59
71
  flex-wrap: wrap;
60
72
  align-items: center;
61
73
  justify-content: space-between;
62
- gap: var(--crtr-space-3);
63
- padding-top: var(--crtr-space-3);
64
- border-top: 1px solid var(--crtr-color-border);
74
+ gap: var(--crtr-page-chrome-gap, var(--crtr-space-3));
75
+ padding-top: var(--crtr-page-chrome-padding-top, var(--crtr-space-3));
76
+ border-top: var(--crtr-page-chrome-border-width, 1px)
77
+ var(--crtr-page-chrome-border-style, solid)
78
+ var(--crtr-page-chrome-border-color, var(--crtr-color-border));
65
79
  }
66
80
 
67
81
  [part="container"][data-steps="1"] [part="chrome"] {
@@ -71,79 +85,83 @@ const PAGES_STYLE = `
71
85
  [part="progress"] {
72
86
  display: flex;
73
87
  align-items: center;
74
- gap: var(--crtr-space-2);
75
- color: var(--crtr-color-text-muted);
88
+ gap: var(--crtr-page-progress-gap, var(--crtr-space-2));
89
+ color: var(--crtr-page-progress-text-color, var(--crtr-color-text-muted));
76
90
  }
77
91
 
78
92
  [part="progress-track"] {
79
93
  display: flex;
80
94
  align-items: center;
81
- gap: var(--crtr-space-1);
95
+ gap: var(--crtr-page-progress-track-gap, var(--crtr-space-1));
82
96
  }
83
97
 
84
98
  [part="progress-step"] {
85
- width: var(--crtr-space-2);
86
- height: var(--crtr-space-1);
87
- border-radius: var(--crtr-radius-small);
88
- background: var(--crtr-color-border);
99
+ width: var(--crtr-page-progress-step-width, var(--crtr-space-2));
100
+ height: var(--crtr-page-progress-step-height, var(--crtr-space-1));
101
+ border-radius: var(--crtr-page-progress-step-radius, var(--crtr-radius-small));
102
+ background: var(--crtr-page-progress-step-fill, var(--crtr-color-border));
89
103
  }
90
104
 
91
105
  [part="progress-step"][data-state="complete"] {
92
- background: var(--crtr-color-text-muted);
106
+ background: var(--crtr-page-progress-step-complete-fill, var(--crtr-color-text-muted));
93
107
  }
94
108
 
95
109
  [part="progress-step"][data-state="current"] {
96
- width: var(--crtr-space-4);
97
- background: var(--crtr-color-accent);
110
+ width: var(--crtr-page-progress-step-current-width, var(--crtr-space-4));
111
+ background: var(--crtr-page-progress-step-current-fill, var(--crtr-color-accent));
98
112
  }
99
113
 
100
114
  [part="actions"] {
101
115
  display: flex;
102
116
  align-items: center;
103
- gap: var(--crtr-space-2);
117
+ gap: var(--crtr-page-actions-gap, var(--crtr-space-2));
104
118
  }
105
119
 
106
120
  button {
107
- font: inherit;
108
- color: var(--crtr-color-text);
109
- background: var(--crtr-color-surface);
110
- border: 1px solid var(--crtr-color-border);
111
- border-radius: var(--crtr-radius-small);
112
- padding: var(--crtr-space-2) var(--crtr-space-3);
121
+ font: var(--crtr-page-button-font, inherit);
122
+ color: var(--crtr-page-button-text-color, var(--crtr-color-text));
123
+ background: var(--crtr-page-button-fill, var(--crtr-color-surface));
124
+ border: var(--crtr-page-button-border-width, 1px)
125
+ var(--crtr-page-button-border-style, solid)
126
+ var(--crtr-page-button-border-color, var(--crtr-color-border));
127
+ border-radius: var(--crtr-page-button-radius, var(--crtr-radius-small));
128
+ padding: var(--crtr-page-button-padding, var(--crtr-space-2) var(--crtr-space-3));
113
129
  cursor: pointer;
130
+ transition: color var(--crtr-page-button-transition, var(--crtr-control-transition, 120ms ease)),
131
+ background-color var(--crtr-page-button-transition, var(--crtr-control-transition, 120ms ease)),
132
+ border-color var(--crtr-page-button-transition, var(--crtr-control-transition, 120ms ease));
114
133
  }
115
134
 
116
135
  button:hover:not(:disabled) {
117
- background: var(--crtr-color-surface-hover);
118
- }
119
-
120
- button:focus-visible {
121
- outline: 2px solid var(--crtr-color-focus);
122
- outline-offset: 2px;
136
+ background: var(--crtr-page-button-hover-fill, var(--crtr-color-surface-hover));
123
137
  }
124
138
 
139
+ ${focusRingStyle({ scope: 'page-button' }, 'button')}
125
140
  button:disabled {
126
141
  cursor: not-allowed;
127
- opacity: 0.5;
142
+ opacity: var(--crtr-page-button-disabled-opacity, var(--crtr-control-disabled-opacity, 0.5));
128
143
  }
129
144
 
130
145
  [part="submit"] {
131
- color: var(--crtr-color-accent-contrast);
132
- background: var(--crtr-color-accent);
133
- border-color: transparent;
146
+ color: var(--crtr-page-submit-text-color, var(--crtr-color-accent-contrast));
147
+ background: var(--crtr-page-submit-fill, var(--crtr-color-accent));
148
+ border-color: var(--crtr-page-submit-border-color, var(--crtr-color-accent));
134
149
  }
135
150
 
151
+ /* Mixing the accent toward the text colour darkens on a light token set and lightens on a
152
+ dark one — a brightness filter moves the wrong way on one of them. */
136
153
  [part="submit"]:hover:not(:disabled) {
137
- background: var(--crtr-color-accent);
138
- filter: brightness(1.08);
154
+ background: var(--crtr-page-submit-hover-fill, color-mix(in srgb, var(--crtr-color-accent) 88%, var(--crtr-color-text)));
155
+ border-color: var(--crtr-page-submit-hover-border-color, color-mix(in srgb, var(--crtr-color-accent) 88%, var(--crtr-color-text)));
139
156
  }
140
157
 
141
158
  [part="notice"] {
142
- color: var(--crtr-color-text-muted);
159
+ color: var(--crtr-page-notice-text-color, var(--crtr-color-text-muted));
160
+ font-size: var(--crtr-page-notice-font-size, 0.875em);
143
161
  }
144
162
 
145
163
  [part="notice"][data-state="error"] {
146
- color: var(--crtr-color-danger);
164
+ color: var(--crtr-page-notice-error-text-color, var(--crtr-color-danger));
147
165
  }
148
166
 
149
167
  [hidden] {
@@ -266,6 +284,10 @@ class CrtrPagesElement extends HTMLElement {
266
284
  this.#error = null;
267
285
  this.#render();
268
286
  try {
287
+ // The host has only heard from the slots the person changed. A submit sends the whole
288
+ // page, so every response-bearing slot reports what it is currently showing first —
289
+ // an untouched slot's answer is what it shows, not an omission.
290
+ reportSlotResponses();
269
291
  await bridge.submit();
270
292
  this.#state = 'submitted';
271
293
  }
@@ -17,5 +17,10 @@
17
17
  *
18
18
  * A mounted component owns its own answer: it talks to `window.crtr` itself, and this element
19
19
  * never invents a response shape for a kind whose shape only the product knows.
20
+ *
21
+ * The unavailable notice is the only thing this element paints, and every value in it is read
22
+ * through a `--crtr-slot-*` component token so a host can restyle the notice without touching
23
+ * crtr. There is no shared family behind these: nothing else in the bundle draws a notice, so
24
+ * each chain is one layer over the kit default.
20
25
  */
21
26
  export {};
@@ -17,6 +17,11 @@
17
17
  *
18
18
  * A mounted component owns its own answer: it talks to `window.crtr` itself, and this element
19
19
  * never invents a response shape for a kind whose shape only the product knows.
20
+ *
21
+ * The unavailable notice is the only thing this element paints, and every value in it is read
22
+ * through a `--crtr-slot-*` component token so a host can restyle the notice without touching
23
+ * crtr. There is no shared family behind these: nothing else in the bundle draws a notice, so
24
+ * each chain is one layer over the kit default.
20
25
  */
21
26
  import { mountWorkspaceComponent } from '../host.js';
22
27
  import { registerElement } from '../register.js';
@@ -26,13 +31,15 @@ const STYLE = `
26
31
  display: block;
27
32
  }
28
33
 
34
+ /* Flat: this sits in the flow of the page. A shadow in this bundle means floating. */
29
35
  [part="unavailable"] {
30
- padding: var(--crtr-space-3);
31
- color: var(--crtr-color-text-muted);
32
- background: var(--crtr-color-surface);
33
- border: 1px solid var(--crtr-color-border);
34
- border-radius: var(--crtr-radius-medium);
35
- box-shadow: var(--crtr-shadow);
36
+ padding: var(--crtr-slot-unavailable-padding, var(--crtr-space-3));
37
+ color: var(--crtr-slot-unavailable-text-color, var(--crtr-color-text-muted));
38
+ background: var(--crtr-slot-unavailable-fill, var(--crtr-color-surface));
39
+ border: var(--crtr-slot-unavailable-border-width, 1px)
40
+ var(--crtr-slot-unavailable-border-style, solid)
41
+ var(--crtr-slot-unavailable-border-color, var(--crtr-color-border));
42
+ border-radius: var(--crtr-slot-unavailable-radius, var(--crtr-radius-medium));
36
43
  }
37
44
 
38
45
  [part="unavailable"][hidden] {
@@ -40,14 +47,14 @@ const STYLE = `
40
47
  }
41
48
 
42
49
  [part="kind"] {
43
- color: var(--crtr-color-text);
44
- font-family: var(--crtr-font-mono);
50
+ color: var(--crtr-slot-kind-text-color, var(--crtr-color-text));
51
+ font-family: var(--crtr-slot-kind-font-family, var(--crtr-font-mono));
45
52
  }
46
53
 
47
54
  [part="reason"] {
48
55
  display: block;
49
- margin-top: var(--crtr-space-1);
50
- font-size: 0.9em;
56
+ margin-top: var(--crtr-slot-reason-gap, var(--crtr-space-1));
57
+ font-size: var(--crtr-slot-reason-font-size, 0.875em);
51
58
  }
52
59
  `;
53
60
  class CrtrSlotElement extends HTMLElement {
@@ -15,5 +15,22 @@
15
15
  * Ported from the agent interaction kit's `agent-table.tsx` (northlight `3705fe9e2`), with the
16
16
  * kit's `classic-list-keys` grammar — j/k move, x selects, c comments — reimplemented here
17
17
  * over the shadow root.
18
+ *
19
+ * ## Styling
20
+ *
21
+ * Every styling value below is read through a `--crtr-table-*` component token, so a host
22
+ * restyles this element without touching crtr — custom properties inherit through the shadow
23
+ * boundary, which is the whole mechanism. The parts a person can name each own a scope:
24
+ * `container`, `caption`, `header`, `column-toggle`, `row`, `cell`, `selection` (the row
25
+ * control and the header's select-all, deliberately one thing), `comment-trigger`,
26
+ * `comment-editor`, `comment-input`, `comment-button` and its `comment-cancel` /
27
+ * `comment-save` paint, `notice`, `reason`, `empty`. Where a shared recipe draws the value the
28
+ * chain is `--crtr-table-<part>-<knob>` over the family's `--crtr-control-*` and then the kit
29
+ * default; every default stays inline at the rule that spends it, and no token is declared
30
+ * anywhere, which is what keeps the kit's own look when a host sets nothing.
31
+ *
32
+ * Layout and behaviour stay literal: `display`, positioning, the shrink-to-content column
33
+ * widths, text alignment, and the trigger's reveal-on-hover `opacity` are anatomy rather than
34
+ * paint, so they are not knobs.
18
35
  */
19
36
  export {};