@north-light/crouter 0.3.196 → 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 (148) 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 +90 -168
  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/termrender/display.d.ts +7 -3
  91. package/dist/core/termrender/display.js +45 -9
  92. package/dist/core/termrender/termrender.d.ts +3 -12
  93. package/dist/core/termrender/termrender.js +6 -37
  94. package/dist/core/user-settings.d.ts +17 -2
  95. package/dist/core/user-settings.js +32 -11
  96. package/dist/daemon/api/handlers/human.js +1 -1
  97. package/dist/daemon/api/handlers/inbox.js +22 -7
  98. package/dist/daemon/cron-run.js +16 -2
  99. package/dist/daemon/crtrd.js +1 -1
  100. package/dist/daemon/fleet.d.ts +22 -10
  101. package/dist/daemon/fleet.js +43 -24
  102. package/dist/daemon/human/finish.d.ts +2 -1
  103. package/dist/daemon/human/finish.js +45 -28
  104. package/dist/daemon/human/sweep.js +4 -2
  105. package/dist/daemon/reconcilers/broker-supervision.js +11 -8
  106. package/dist/daemon/reconcilers/dormant-inbox.js +11 -6
  107. package/dist/daemon/reconcilers/live-obligation.d.ts +21 -1
  108. package/dist/daemon/reconcilers/live-obligation.js +30 -2
  109. package/dist/daemon/reconcilers/storage-maintenance.d.ts +5 -0
  110. package/dist/daemon/reconcilers/storage-maintenance.js +28 -1
  111. package/dist/daemon/review/sweep.js +12 -1
  112. package/dist/pages/bundle.css +1 -1
  113. package/dist/pages/bundle.js +1008 -577
  114. package/dist/pages/comments.d.ts +29 -0
  115. package/dist/pages/comments.js +51 -0
  116. package/dist/pages/controls.d.ts +98 -0
  117. package/dist/pages/controls.js +261 -0
  118. package/dist/pages/elements/cards.d.ts +15 -4
  119. package/dist/pages/elements/cards.js +299 -186
  120. package/dist/pages/elements/chart.d.ts +22 -0
  121. package/dist/pages/elements/chart.js +107 -91
  122. package/dist/pages/elements/options.d.ts +9 -0
  123. package/dist/pages/elements/options.js +268 -155
  124. package/dist/pages/elements/pages.d.ts +6 -0
  125. package/dist/pages/elements/pages.js +60 -38
  126. package/dist/pages/elements/slot.d.ts +5 -0
  127. package/dist/pages/elements/slot.js +17 -10
  128. package/dist/pages/elements/table.d.ts +17 -0
  129. package/dist/pages/elements/table.js +336 -228
  130. package/dist/pages/elements/text.d.ts +9 -3
  131. package/dist/pages/elements/text.js +350 -143
  132. package/dist/pages/host.d.ts +0 -24
  133. package/dist/pages/host.js +0 -17
  134. package/dist/pages/readonly.d.ts +24 -0
  135. package/dist/pages/readonly.js +31 -0
  136. package/dist/pages/responses.d.ts +37 -0
  137. package/dist/pages/responses.js +56 -0
  138. package/dist/pi-extensions/canvas-bash-valve.d.ts +9 -1
  139. package/dist/pi-extensions/canvas-bash-valve.js +12 -8
  140. package/dist/types.d.ts +19 -5
  141. package/dist/types.js +2 -1
  142. package/package.json +1 -1
  143. package/runtime.lock.json +2 -2
  144. package/scripts/install-runtime.mjs +19 -24
  145. package/dist/clients/attach/render/html-markdown.d.ts +0 -13
  146. package/dist/clients/attach/render/html-markdown.js +0 -206
  147. package/dist/core/human/markdown-html.d.ts +0 -8
  148. package/dist/core/human/markdown-html.js +0 -581
@@ -1,206 +0,0 @@
1
- // Supported raw HTML for assistant Markdown in the attach viewer.
2
- //
3
- // This is deliberately a semantic allowlist, not an HTML renderer. Complete
4
- // details/summary blocks become terminal disclosure rows, while kbd and mark
5
- // become theme-styled inline text. Everything else stays literal, and Markdown
6
- // code spans/fences are protected before the allowlist scanner runs.
7
- const PROTECTED_PREFIX = '\u0000\u0001CRTR_HTML_CODE_';
8
- const PROTECTED_SUFFIX = '\u0002';
9
- const DETAILS_OPEN = /<details\b[^>]*>/gi;
10
- const DETAILS_TAG = /<\/?details\b[^>]*>/gi;
11
- const VALID_DETAILS_OPEN = /^<details(?:[ \t\r\n]+open)?[ \t\r\n]*>$/i;
12
- const VALID_DETAILS_CLOSE = /^<\/details[ \t\r\n]*>$/i;
13
- const SUMMARY_OPEN = /^[ \t\r\n]*<summary[ \t\r\n]*>/i;
14
- const SUMMARY_CLOSE = /<\/summary[ \t\r\n]*>/i;
15
- const INLINE_HTML = /<(kbd|mark)>([^<>\n]*?)<\/\1[ \t]*>/gi;
16
- const SUPPORTED_HTML = /<(?:details|kbd|mark)\b/i;
17
- function protectedToken(index) {
18
- return `${PROTECTED_PREFIX}${index}${PROTECTED_SUFFIX}`;
19
- }
20
- function lineWithoutEnding(line) {
21
- return line.endsWith('\n') ? line.slice(0, -1).replace(/\r$/, '') : line;
22
- }
23
- function protectFencedCode(source, protectedParts) {
24
- const lines = source.match(/[^\n]*(?:\n|$)/g)?.filter((line) => line !== '') ?? [];
25
- const out = [];
26
- for (let index = 0; index < lines.length;) {
27
- const openingLine = lineWithoutEnding(lines[index]);
28
- const opening = /^ {0,3}(`{3,}|~{3,})[^\n]*$/.exec(openingLine);
29
- if (!opening) {
30
- out.push(lines[index]);
31
- index++;
32
- continue;
33
- }
34
- const marker = opening[1];
35
- const markerChar = marker[0];
36
- let end = index + 1;
37
- for (; end < lines.length; end++) {
38
- const candidate = lineWithoutEnding(lines[end]);
39
- const closing = /^ {0,3}(`+|~+)[ \t]*$/.exec(candidate)?.[1];
40
- if (closing?.[0] === markerChar && closing.length >= marker.length) {
41
- end++;
42
- break;
43
- }
44
- }
45
- const raw = lines.slice(index, end).join('');
46
- const tokenIndex = protectedParts.push(raw) - 1;
47
- out.push(protectedToken(tokenIndex));
48
- index = end;
49
- }
50
- return out.join('');
51
- }
52
- function protectInlineCode(source, protectedParts) {
53
- let out = '';
54
- let index = 0;
55
- while (index < source.length) {
56
- if (source[index] !== '`') {
57
- out += source[index];
58
- index++;
59
- continue;
60
- }
61
- let openingEnd = index + 1;
62
- while (source[openingEnd] === '`')
63
- openingEnd++;
64
- const markerLength = openingEnd - index;
65
- let cursor = openingEnd;
66
- let closingEnd = -1;
67
- while (cursor < source.length) {
68
- const next = source.indexOf('`', cursor);
69
- if (next === -1)
70
- break;
71
- let runEnd = next + 1;
72
- while (source[runEnd] === '`')
73
- runEnd++;
74
- if (runEnd - next === markerLength) {
75
- closingEnd = runEnd;
76
- break;
77
- }
78
- cursor = runEnd;
79
- }
80
- if (closingEnd === -1) {
81
- out += source.slice(index, openingEnd);
82
- index = openingEnd;
83
- continue;
84
- }
85
- const tokenIndex = protectedParts.push(source.slice(index, closingEnd)) - 1;
86
- out += protectedToken(tokenIndex);
87
- index = closingEnd;
88
- }
89
- return out;
90
- }
91
- function protectMarkdownCode(source) {
92
- const protectedParts = [];
93
- const fenced = protectFencedCode(source, protectedParts);
94
- const masked = protectInlineCode(fenced, protectedParts);
95
- return {
96
- masked,
97
- restore: (text) => text.replace(/\u0000\u0001CRTR_HTML_CODE_(\d+)\u0002/g, (_whole, rawIndex) => protectedParts[Number(rawIndex)] ?? ''),
98
- };
99
- }
100
- function isEscaped(source, index) {
101
- let slashes = 0;
102
- for (let cursor = index - 1; cursor >= 0 && source[cursor] === '\\'; cursor--)
103
- slashes++;
104
- return slashes % 2 === 1;
105
- }
106
- /** HTML phrasing content for this allowlist is plain text. Escape CommonMark's
107
- * ASCII punctuation so a key label such as `[x]` cannot become a link, while
108
- * the Markdown renderer removes the escapes from the displayed text. */
109
- function escapeMarkdownInline(text) {
110
- return [...text].map((char) => /[!-/:-@[-`{-~]/.test(char) ? `\\${char}` : char).join('');
111
- }
112
- function transformInlineHtml(text, styles) {
113
- return text.replace(INLINE_HTML, (whole, rawTag, rawBody, offset) => {
114
- if (isEscaped(text, offset))
115
- return whole;
116
- const tag = rawTag.toLowerCase();
117
- const body = tag === 'kbd' ? rawBody.replace(/\s+/g, ' ').trim() : rawBody.trim();
118
- if (body === '')
119
- return whole;
120
- const escaped = escapeMarkdownInline(body);
121
- return tag === 'kbd' ? styles.kbd(escaped) : styles.mark(escaped);
122
- });
123
- }
124
- function findDetailsRange(source, openEnd) {
125
- DETAILS_TAG.lastIndex = openEnd;
126
- let depth = 1;
127
- let nested = false;
128
- for (let match = DETAILS_TAG.exec(source); match; match = DETAILS_TAG.exec(source)) {
129
- if (isEscaped(source, match.index))
130
- continue;
131
- const closing = /^<\//.test(match[0]);
132
- if (closing) {
133
- depth--;
134
- if (depth === 0)
135
- return { closeStart: match.index, closeTag: match[0], end: DETAILS_TAG.lastIndex, nested };
136
- }
137
- else {
138
- depth++;
139
- nested = true;
140
- }
141
- }
142
- DETAILS_TAG.lastIndex = 0;
143
- return undefined;
144
- }
145
- function renderDetails(source, openTag, openEnd, range, options) {
146
- if (!VALID_DETAILS_OPEN.test(openTag) || !VALID_DETAILS_CLOSE.test(range.closeTag) || range.nested)
147
- return undefined;
148
- const inner = source.slice(openEnd, range.closeStart);
149
- const summaryOpen = SUMMARY_OPEN.exec(inner);
150
- if (!summaryOpen)
151
- return undefined;
152
- const afterSummaryOpen = summaryOpen[0].length;
153
- const summaryClose = SUMMARY_CLOSE.exec(inner.slice(afterSummaryOpen));
154
- if (!summaryClose)
155
- return undefined;
156
- const summaryEnd = afterSummaryOpen + summaryClose.index;
157
- const summary = inner.slice(afterSummaryOpen, summaryEnd).trim();
158
- if (summary === '')
159
- return undefined;
160
- const summaryRendered = transformInlineHtml(summary, options.styles);
161
- const openByAttribute = /[ \t\r\n]open[ \t\r\n]*>$/i.test(openTag);
162
- const expanded = options.detailsExpanded ?? openByAttribute;
163
- const glyph = expanded ? '▾' : '▸';
164
- if (!expanded)
165
- return `${glyph} ${summaryRendered} ${options.styles.hint('— ctrl+o to expand')}`;
166
- const bodyStart = summaryEnd + summaryClose[0].length;
167
- const body = inner.slice(bodyStart).trim();
168
- if (body === '')
169
- return `${glyph} ${summaryRendered}`;
170
- return `${glyph} ${summaryRendered}\n\n${transformInlineHtml(body, options.styles)}`;
171
- }
172
- /** Transform the strict supported HTML subset in one Markdown string. */
173
- export function transformHtmlMarkdown(source, options) {
174
- if (!SUPPORTED_HTML.test(source))
175
- return source;
176
- const protectedMarkdown = protectMarkdownCode(source);
177
- const masked = protectedMarkdown.masked;
178
- let out = '';
179
- let cursor = 0;
180
- DETAILS_OPEN.lastIndex = 0;
181
- for (let match = DETAILS_OPEN.exec(masked); match; match = DETAILS_OPEN.exec(masked)) {
182
- if (match.index < cursor)
183
- continue;
184
- const range = findDetailsRange(masked, DETAILS_OPEN.lastIndex);
185
- if (!range) {
186
- out += transformInlineHtml(masked.slice(cursor, match.index), options.styles);
187
- out += masked.slice(match.index);
188
- cursor = masked.length;
189
- break;
190
- }
191
- out += transformInlineHtml(masked.slice(cursor, match.index), options.styles);
192
- const whole = masked.slice(match.index, range.end);
193
- if (isEscaped(masked, match.index)) {
194
- out += whole;
195
- }
196
- else {
197
- const rendered = renderDetails(masked, match[0], DETAILS_OPEN.lastIndex, range, options);
198
- out += rendered ?? whole;
199
- }
200
- cursor = range.end;
201
- DETAILS_OPEN.lastIndex = range.end;
202
- }
203
- if (cursor < masked.length)
204
- out += transformInlineHtml(masked.slice(cursor), options.styles);
205
- return protectedMarkdown.restore(out);
206
- }
@@ -1,8 +0,0 @@
1
- /** Escape text for an HTML text node. */
2
- export declare function escapeHtmlText(raw: string): string;
3
- /** Escape a value for a double-quoted HTML attribute. */
4
- export declare function escapeHtmlAttribute(raw: string): string;
5
- /** Render one markdown document fragment as HTML. */
6
- export declare function renderMarkdownToHtml(markdown: string): string;
7
- /** Render inline markdown. Exported for callers rendering a single line. */
8
- export declare function renderInline(source: string): string;