@north-light/crouter 0.3.236 → 0.3.238

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 (177) hide show
  1. package/dist/api/client.d.ts +2 -1
  2. package/dist/api/client.js +3 -0
  3. package/dist/api/dto/broker-ops.d.ts +1 -1
  4. package/dist/api/dto/common.d.ts +2 -0
  5. package/dist/api/dto/lifecycle.d.ts +9 -2
  6. package/dist/api/dto/messages.d.ts +5 -0
  7. package/dist/api/dto/nodes.d.ts +10 -2
  8. package/dist/api/dto/worktree.d.ts +10 -0
  9. package/dist/api/routes.d.ts +1 -0
  10. package/dist/api/routes.js +1 -0
  11. package/dist/builtin-memory/00-runtime-base/00-authoring.md +1 -1
  12. package/dist/builtin-memory/internal/agent-shaping.md +1 -1
  13. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +1 -1
  14. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +1 -1
  15. package/dist/clients/attach/render/tool-calls.js +18 -3
  16. package/dist/clients/attach/viewer.js +442 -442
  17. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +6 -0
  18. package/dist/clients/inbox/review/roundtrip.js +1 -1
  19. package/dist/commands/memory/lint.js +22 -13
  20. package/dist/commands/memory/shared.js +1 -1
  21. package/dist/commands/node/create.d.ts +1 -1
  22. package/dist/commands/node/create.js +1 -1
  23. package/dist/commands/node/lifecycle.js +1 -1
  24. package/dist/commands/node-worktree.js +39 -8
  25. package/dist/commands/revive.js +11 -2
  26. package/dist/commands/sys/context/admin/actions.d.ts +48 -0
  27. package/dist/commands/sys/context/admin/actions.js +246 -0
  28. package/dist/commands/sys/context/admin/axes-panel.d.ts +21 -0
  29. package/dist/commands/sys/context/admin/axes-panel.js +117 -0
  30. package/dist/commands/sys/context/admin/detail-panel.d.ts +53 -0
  31. package/dist/commands/sys/context/admin/detail-panel.js +178 -0
  32. package/dist/commands/sys/context/admin/docs-panel.d.ts +45 -0
  33. package/dist/commands/sys/context/admin/docs-panel.js +186 -0
  34. package/dist/commands/sys/context/admin/model.d.ts +75 -0
  35. package/dist/commands/sys/context/admin/model.js +209 -0
  36. package/dist/commands/sys/context/admin/shell.d.ts +82 -0
  37. package/dist/commands/sys/context/admin/shell.js +669 -0
  38. package/dist/commands/sys/context/admin.d.ts +1 -0
  39. package/dist/commands/sys/context/admin.js +124 -0
  40. package/dist/commands/sys/context/doc.d.ts +1 -0
  41. package/dist/commands/sys/context/doc.js +196 -0
  42. package/dist/commands/sys/context/prompt-review.d.ts +1 -0
  43. package/dist/commands/sys/{prompt-review.js → context/prompt-review.js} +10 -10
  44. package/dist/commands/sys/context/resolve.d.ts +55 -0
  45. package/dist/commands/sys/context/resolve.js +428 -0
  46. package/dist/commands/sys/context/sysprompt.d.ts +1 -0
  47. package/dist/commands/sys/{sysprompt.js → context/sysprompt.js} +11 -11
  48. package/dist/commands/sys/context.d.ts +2 -0
  49. package/dist/commands/sys/context.js +20 -0
  50. package/dist/commands/sys.js +3 -4
  51. package/dist/core/__tests__/child-death-wake.test.js +38 -22
  52. package/dist/core/__tests__/cron-self-cancel-delivery.test.js +72 -0
  53. package/dist/core/__tests__/daemon-boot.test.js +40 -28
  54. package/dist/core/__tests__/human-deliver.test.js +1 -1
  55. package/dist/core/__tests__/human-node-not-supervised.test.js +10 -15
  56. package/dist/core/__tests__/integration/revive.test.js +12 -12
  57. package/dist/core/__tests__/integration/spawn-root.test.js +6 -0
  58. package/dist/core/__tests__/integration/worktree-reap.test.js +32 -0
  59. package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +1 -0
  60. package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +61 -0
  61. package/dist/core/__tests__/migration.test.js +38 -1
  62. package/dist/core/__tests__/push-final-guard.test.js +1 -1
  63. package/dist/core/__tests__/revive-capacity.test.d.ts +1 -0
  64. package/dist/core/__tests__/revive-capacity.test.js +127 -0
  65. package/dist/core/__tests__/revive-parked-fresh.test.js +7 -7
  66. package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +1 -0
  67. package/dist/core/__tests__/seam/broker-cap-freeze.test.js +81 -0
  68. package/dist/core/__tests__/seam/dormancy-release.test.js +7 -7
  69. package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +1 -1
  70. package/dist/core/canvas/browse/render.js +11 -3
  71. package/dist/core/canvas/canvas.d.ts +15 -3
  72. package/dist/core/canvas/canvas.js +52 -16
  73. package/dist/core/canvas/migrations.js +21 -0
  74. package/dist/core/canvas/nav-render.js +3 -1
  75. package/dist/core/canvas/remote-canvas-source.js +2 -0
  76. package/dist/core/canvas/render-source.d.ts +3 -1
  77. package/dist/core/canvas/render-source.js +7 -3
  78. package/dist/core/canvas/status-glyph.d.ts +10 -1
  79. package/dist/core/canvas/status-glyph.js +19 -3
  80. package/dist/core/canvas/types.d.ts +20 -1
  81. package/dist/core/feed/feed.js +1 -1
  82. package/dist/core/human/feedback-companion.js +5 -2
  83. package/dist/core/keybindings/catalog.d.ts +1 -1
  84. package/dist/core/keybindings/catalog.js +6 -2
  85. package/dist/core/memory/lint.d.ts +19 -0
  86. package/dist/core/memory/lint.js +97 -0
  87. package/dist/core/memory-resolver.d.ts +4 -0
  88. package/dist/core/memory-resolver.js +7 -7
  89. package/dist/core/preview-registry.js +4 -4
  90. package/dist/core/review/realize.js +4 -2
  91. package/dist/core/runtime/close.js +1 -1
  92. package/dist/core/runtime/fleet.d.ts +29 -1
  93. package/dist/core/runtime/fleet.js +23 -0
  94. package/dist/core/runtime/host.js +32 -11
  95. package/dist/core/runtime/launch-prompt.d.ts +1 -1
  96. package/dist/core/runtime/launch-prompt.js +2 -2
  97. package/dist/core/runtime/lifecycle.d.ts +4 -2
  98. package/dist/core/runtime/lifecycle.js +12 -1
  99. package/dist/core/runtime/memory.js +1 -1
  100. package/dist/core/runtime/reopen.js +10 -1
  101. package/dist/core/runtime/reset.js +1 -1
  102. package/dist/core/runtime/revive-all.d.ts +3 -0
  103. package/dist/core/runtime/revive-all.js +10 -4
  104. package/dist/core/runtime/revive.d.ts +12 -0
  105. package/dist/core/runtime/revive.js +62 -3
  106. package/dist/core/runtime/spawn.d.ts +4 -0
  107. package/dist/core/runtime/spawn.js +36 -7
  108. package/dist/core/runtime/tmux-bindings.js +4 -0
  109. package/dist/core/substrate/frontmatter-validation.js +1 -1
  110. package/dist/core/substrate/index.d.ts +6 -3
  111. package/dist/core/substrate/index.js +4 -3
  112. package/dist/core/substrate/on-read.d.ts +0 -8
  113. package/dist/core/substrate/on-read.js +45 -124
  114. package/dist/core/substrate/plan.d.ts +94 -0
  115. package/dist/core/substrate/plan.js +266 -0
  116. package/dist/core/substrate/render.d.ts +5 -6
  117. package/dist/core/substrate/render.js +76 -129
  118. package/dist/core/substrate/schema.d.ts +1 -6
  119. package/dist/core/substrate/schema.js +1 -15
  120. package/dist/core/substrate/session-cache.d.ts +2 -10
  121. package/dist/core/substrate/session-cache.js +9 -47
  122. package/dist/core/substrate/subject-fields.d.ts +1 -4
  123. package/dist/core/substrate/subject-fields.js +2 -5
  124. package/dist/core/substrate/surface-match.d.ts +37 -17
  125. package/dist/core/substrate/surface-match.js +44 -53
  126. package/dist/core/tui/page-host.d.ts +6 -0
  127. package/dist/core/tui/page-host.js +12 -3
  128. package/dist/core/worktree.d.ts +8 -0
  129. package/dist/core/worktree.js +65 -0
  130. package/dist/daemon/__tests__/reconciler-signature.test.js +3 -2
  131. package/dist/daemon/__tests__/thaw-order.test.d.ts +1 -0
  132. package/dist/daemon/__tests__/thaw-order.test.js +55 -0
  133. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +6 -0
  134. package/dist/daemon/api/__tests__/node-create-description.test.js +6 -0
  135. package/dist/daemon/api/__tests__/profile-launch-gates.test.js +1 -1
  136. package/dist/daemon/api/bridge.js +5 -1
  137. package/dist/daemon/api/handlers/attach.js +5 -1
  138. package/dist/daemon/api/handlers/bash-jobs.js +1 -1
  139. package/dist/daemon/api/handlers/messages.js +10 -2
  140. package/dist/daemon/api/handlers/nodes.js +8 -1
  141. package/dist/daemon/api/handlers/worktree.js +10 -1
  142. package/dist/daemon/api/map.js +7 -0
  143. package/dist/daemon/companion-retire.js +1 -1
  144. package/dist/daemon/cron/passes.d.ts +0 -5
  145. package/dist/daemon/cron/passes.js +0 -20
  146. package/dist/daemon/cron/sinks.js +1 -1
  147. package/dist/daemon/cron-run.d.ts +5 -6
  148. package/dist/daemon/cron-run.js +7 -16
  149. package/dist/daemon/crtrd.d.ts +0 -10
  150. package/dist/daemon/crtrd.js +23 -61
  151. package/dist/daemon/fleet.d.ts +10 -7
  152. package/dist/daemon/fleet.js +71 -12
  153. package/dist/daemon/messaging/node-message.js +3 -1
  154. package/dist/daemon/profile-delete.js +1 -1
  155. package/dist/daemon/reconcilers/broker-supervision.d.ts +26 -9
  156. package/dist/daemon/reconcilers/broker-supervision.js +39 -52
  157. package/dist/daemon/reconcilers/controller-death.d.ts +7 -0
  158. package/dist/daemon/reconcilers/controller-death.js +26 -0
  159. package/dist/daemon/reconcilers/cron-lane.d.ts +0 -3
  160. package/dist/daemon/reconcilers/cron-lane.js +0 -3
  161. package/dist/daemon/reconcilers/live-obligation.js +3 -1
  162. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +53 -0
  163. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +170 -0
  164. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.d.ts +5 -0
  165. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +16 -0
  166. package/dist/daemon/reconcilers/node-lifecycle/terminating.d.ts +4 -0
  167. package/dist/daemon/reconcilers/node-lifecycle/terminating.js +13 -0
  168. package/dist/daemon/reconcilers/node-lifecycle/tick.d.ts +26 -0
  169. package/dist/daemon/reconcilers/node-lifecycle/tick.js +140 -0
  170. package/package.json +1 -1
  171. package/runtime.lock.json +2 -2
  172. package/dist/commands/sys/prompt-review.d.ts +0 -1
  173. package/dist/commands/sys/sysprompt.d.ts +0 -1
  174. package/dist/core/__tests__/cron-broker-capacity.test.js +0 -119
  175. package/dist/daemon/reconcilers/dormant-inbox.d.ts +0 -18
  176. package/dist/daemon/reconcilers/dormant-inbox.js +0 -157
  177. /package/dist/core/__tests__/{cron-broker-capacity.test.d.ts → cron-self-cancel-delivery.test.d.ts} +0 -0
@@ -0,0 +1,209 @@
1
+ // The read model behind `crtr sys context admin`: the configuration snapshot
2
+ // the page dials, the per-event delivery plans it resolves from, and the
3
+ // vocabulary both the matrix and the dossier read from.
4
+ import { resolve as resolvePath } from 'node:path';
5
+ import { theme } from '../../../../core/tui/panel.js';
6
+ import { realpathOrSelf } from '../../../../core/fs-utils.js';
7
+ import { planDelivery, } from '../../../../core/substrate/plan.js';
8
+ import { RUNGS, SURFACE_EVENTS, rungRank, } from '../../../../core/substrate/schema.js';
9
+ import { scopeForCwd, profileNameFor } from '../../../../core/substrate/subject-fields.js';
10
+ import { resolveMemoryDocForTarget } from '../../../../core/memory-resolver.js';
11
+ export function subjectOf(snapshot) {
12
+ return {
13
+ kind: snapshot.kind,
14
+ mode: snapshot.mode,
15
+ lifecycle: snapshot.lifecycle,
16
+ hasManager: snapshot.hasManager,
17
+ cwd: snapshot.cwd,
18
+ scope: scopeForCwd(snapshot.cwd),
19
+ orchestration: { depth: snapshot.depth },
20
+ profile: profileNameFor(snapshot.profileId),
21
+ };
22
+ }
23
+ export function targetOf(snapshot) {
24
+ return { cwd: snapshot.cwd, profileId: snapshot.profileId, nodeId: snapshot.nodeId };
25
+ }
26
+ /** Which payload axis an event reads, so the rail offers exactly the one field
27
+ * that can make the current event match anything. */
28
+ export function payloadAxisFor(event) {
29
+ if (event === 'read')
30
+ return 'file';
31
+ if (event === 'memory-read')
32
+ return 'docName';
33
+ if (event === 'command' || event === 'pre-command')
34
+ return 'command';
35
+ return null;
36
+ }
37
+ /** Every plan for one snapshot, computed on demand.
38
+ *
39
+ * Each event's corpus is its own — workspace-open sees project stores only,
40
+ * boot orders node-local documents last, read pulls in the stores enclosing
41
+ * the read file — so a shared corpus would report a delivery the runtime would
42
+ * never make. The planner therefore loads per event, and this cache keeps the
43
+ * page responsive by resolving the focused event first and warming the rest
44
+ * one macrotask at a time. */
45
+ export class PlanSet {
46
+ snapshot;
47
+ plans = new Map();
48
+ warming;
49
+ constructor(snapshot) {
50
+ this.snapshot = snapshot;
51
+ }
52
+ setSnapshot(snapshot) {
53
+ this.snapshot = snapshot;
54
+ this.invalidate();
55
+ }
56
+ /** Drop every plan — after a snapshot change, or after a mutation rewrote a
57
+ * document the corpus was read from. */
58
+ invalidate() {
59
+ this.plans.clear();
60
+ if (this.warming !== undefined) {
61
+ clearTimeout(this.warming);
62
+ this.warming = undefined;
63
+ }
64
+ }
65
+ dispose() {
66
+ if (this.warming !== undefined)
67
+ clearTimeout(this.warming);
68
+ this.warming = undefined;
69
+ }
70
+ /** The plan for one event, computing it now. */
71
+ plan(event) {
72
+ const held = this.plans.get(event);
73
+ if (held !== undefined)
74
+ return held;
75
+ const computed = planDelivery(subjectOf(this.snapshot), targetOf(this.snapshot), event, this.payload(event));
76
+ this.plans.set(event, computed);
77
+ return computed;
78
+ }
79
+ /** The plan for one event only if it is already computed — what the matrix
80
+ * reads, so an uncomputed column draws as pending instead of stalling the
81
+ * frame on five extra corpus loads. */
82
+ peek(event) {
83
+ return this.plans.get(event);
84
+ }
85
+ /** Compute one pending event per macrotask, calling back after each so the
86
+ * matrix fills in column by column. */
87
+ warm(onProgress) {
88
+ if (this.warming !== undefined)
89
+ return;
90
+ const pending = SURFACE_EVENTS.find((event) => !this.plans.has(event));
91
+ if (pending === undefined)
92
+ return;
93
+ this.warming = setTimeout(() => {
94
+ this.warming = undefined;
95
+ this.plan(pending);
96
+ onProgress();
97
+ this.warm(onProgress);
98
+ }, 0);
99
+ }
100
+ payload(event) {
101
+ if (event === 'read') {
102
+ // Against the DIALLED cwd, not this process's: the axes rail accepts a
103
+ // relative path and the page plans for the snapshot's directory.
104
+ return this.snapshot.file === ''
105
+ ? {}
106
+ : { absoluteFile: resolvePath(this.snapshot.cwd, this.snapshot.file) };
107
+ }
108
+ if (event === 'memory-read') {
109
+ if (this.snapshot.docName === '')
110
+ return {};
111
+ return {
112
+ resolvedCanonicalName: this.snapshot.docName,
113
+ resolvedDocPath: resolvedDocRealpath(this.snapshot.docName, targetOf(this.snapshot)),
114
+ };
115
+ }
116
+ if (event === 'command' || event === 'pre-command') {
117
+ return this.snapshot.command === '' ? {} : { command: this.snapshot.command };
118
+ }
119
+ return {};
120
+ }
121
+ }
122
+ /** The read document never delivers to itself, so a `memory-read` plan needs
123
+ * the resolved document's physical path — the same exclusion the live read
124
+ * path passes. A name that resolves to nothing excludes nothing. */
125
+ function resolvedDocRealpath(name, target) {
126
+ try {
127
+ return realpathOrSelf(resolveMemoryDocForTarget(name, target).path);
128
+ }
129
+ catch {
130
+ return '';
131
+ }
132
+ }
133
+ export function cellStateOf(record) {
134
+ if (record === undefined)
135
+ return 'silent';
136
+ if (!record.docGate.pass)
137
+ return 'gated';
138
+ if (record.shadowedBy !== null)
139
+ return 'shadowed';
140
+ if (record.finalRung !== 'none') {
141
+ return rungRank(record.finalRung) < rungRank(record.authoredRung) ? 'capped' : 'delivers';
142
+ }
143
+ if (record.authoredRung !== 'none')
144
+ return 'capped';
145
+ if (record.entryGate !== null && !record.entryGate.pass)
146
+ return 'gated';
147
+ return 'silent';
148
+ }
149
+ const RUNG_GLYPH = { none: '·', name: '▁', preview: '▄', content: '█' };
150
+ /** One matrix cell: the delivered rung as a filled bar, or the mark that says
151
+ * why nothing is delivered. Colour separates a clean delivery from one the
152
+ * profile cap trimmed, so a capped `content` never reads as an authored one. */
153
+ export function cellGlyph(record, state) {
154
+ if (state === 'pending')
155
+ return theme.fg('dim', '…');
156
+ if (state === 'gated')
157
+ return theme.fg('warning', '×');
158
+ if (state === 'shadowed')
159
+ return theme.fg('muted', '∅');
160
+ if (record === undefined || state === 'silent')
161
+ return theme.fg('dim', RUNG_GLYPH.none);
162
+ const glyph = RUNG_GLYPH[record.finalRung];
163
+ if (state === 'capped')
164
+ return theme.fg('warning', record.finalRung === 'none' ? '⌐' : glyph);
165
+ return theme.fg('success', glyph);
166
+ }
167
+ /** The one-letter column heads over the matrix, in `SURFACE_EVENTS` order. */
168
+ export const EVENT_INITIALS = {
169
+ boot: 'b',
170
+ 'workspace-open': 'w',
171
+ read: 'r',
172
+ 'memory-read': 'm',
173
+ command: 'c',
174
+ 'pre-command': 'p',
175
+ };
176
+ export function nextRung(rung, delta) {
177
+ const at = (rungRank(rung) + delta + RUNGS.length) % RUNGS.length;
178
+ return RUNGS[at];
179
+ }
180
+ /** A parsed entry back in the shape `memory edit --surface` accepts. The parsed
181
+ * form always carries `match` as a list and spells its frontmatter key
182
+ * `matchFrontmatter`; `coerceSurface` wants a bare string for a single glob
183
+ * and the hyphenated key, and rejects anything else. */
184
+ export function surfaceEntryToFlag(entry) {
185
+ const match = entry.match === undefined || entry.match.length === 0
186
+ ? undefined
187
+ : entry.match.length === 1 ? entry.match[0] : entry.match;
188
+ return JSON.stringify({
189
+ on: entry.on,
190
+ ...(match === undefined ? {} : { match }),
191
+ ...(entry.matchFrontmatter === undefined ? {} : { 'match-frontmatter': entry.matchFrontmatter }),
192
+ ...(entry.gate === undefined ? {} : { gate: entry.gate }),
193
+ at: entry.at,
194
+ });
195
+ }
196
+ /** One authored entry as a single readable row. */
197
+ export function describeSurfaceEntry(entry) {
198
+ const parts = [entry.on];
199
+ if (entry.match !== undefined && entry.match.length > 0)
200
+ parts.push(entry.match.join(' | '));
201
+ if (entry.matchFrontmatter !== undefined)
202
+ parts.push(`fm ${JSON.stringify(entry.matchFrontmatter)}`);
203
+ if (entry.gate !== undefined)
204
+ parts.push(`gate ${JSON.stringify(entry.gate)}`);
205
+ return `${parts.join(' ')} → ${entry.at}`;
206
+ }
207
+ export function plural(count, one, many) {
208
+ return `${count} ${count === 1 ? one : many}`;
209
+ }
@@ -0,0 +1,82 @@
1
+ import { type Component, type Focusable, type TUI } from '@earendil-works/pi-tui';
2
+ import { type BindingId, type BindingResolution } from '../../../../core/keybindings/index.js';
3
+ import { type CapChange } from './actions.js';
4
+ import { type Snapshot } from './model.js';
5
+ export interface AdminResult {
6
+ edited: string[];
7
+ capChanges: CapChange[];
8
+ }
9
+ export declare class ContextAdminShell implements Component, Focusable {
10
+ private readonly tui;
11
+ private readonly terminalRows;
12
+ private readonly bindings;
13
+ private readonly suspendForChild;
14
+ private snapshot;
15
+ private plans;
16
+ private zone;
17
+ private axisIndex;
18
+ private readonly docs;
19
+ private readonly detail;
20
+ private modal;
21
+ private notice;
22
+ private busy;
23
+ private readonly edited;
24
+ private readonly capChanges;
25
+ private _focused;
26
+ onCancel?: () => void;
27
+ onSubmit?: (result: AdminResult) => void;
28
+ constructor(seed: Snapshot, tui: TUI, terminalRows: () => number, bindings: BindingResolution<BindingId>, suspendForChild: () => () => void);
29
+ set focused(value: boolean);
30
+ get focused(): boolean;
31
+ /** Required by `Component`. Nothing is cached between frames: a plan can land
32
+ * from a warm tick and an edit can land from an await, both between inputs. */
33
+ invalidate(): void;
34
+ dispose(): void;
35
+ /** Recompute the focused event's plan, refresh the panels from it, and let
36
+ * the remaining events fill in behind it. */
37
+ private rebuild;
38
+ private syncDetail;
39
+ private setSnapshot;
40
+ private matches;
41
+ private label;
42
+ private isDown;
43
+ private isUp;
44
+ private isDescend;
45
+ private isAscend;
46
+ /** Tab steps the focused event from any zone — the one axis every panel is
47
+ * drawn against, so it earns the page-level gesture. */
48
+ private cyclesEvent;
49
+ handleInput(data: string): void;
50
+ private handleAxes;
51
+ private handleDocs;
52
+ private handleDetail;
53
+ /** What the focused dossier row does when opened — the same write its letter
54
+ * key starts, so a user who never learns the letters can still edit. */
55
+ private activate;
56
+ private get record();
57
+ private apply;
58
+ private cycleEntryRung;
59
+ private removeEntry;
60
+ /** Event, then match, then rung — the three fields a valid entry needs, asked
61
+ * in the order the schema reads them. */
62
+ private composeEntry;
63
+ private editGate;
64
+ private flip;
65
+ private editRouting;
66
+ private editShortForm;
67
+ /** The one write that leaves the page: the terminal goes to $EDITOR and comes
68
+ * back repainted, and the buffer that returns is saved through `memory edit`
69
+ * like every other field here. */
70
+ private editBody;
71
+ private editMove;
72
+ /** The ceiling belongs to the profile project entry that governs the store,
73
+ * not to the document, so this write is offered only when one exists. */
74
+ private editCap;
75
+ private openAxisField;
76
+ private close;
77
+ private handleModal;
78
+ private renderModal;
79
+ private footer;
80
+ render(width: number): string[];
81
+ }
82
+ export declare function runContextAdmin(seed: Snapshot): Promise<AdminResult | undefined>;