@north-light/crouter 0.3.236 → 0.3.237
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.
- package/dist/api/client.d.ts +2 -1
- package/dist/api/client.js +3 -0
- package/dist/api/dto/broker-ops.d.ts +1 -1
- package/dist/api/dto/common.d.ts +2 -0
- package/dist/api/dto/lifecycle.d.ts +9 -2
- package/dist/api/dto/messages.d.ts +5 -0
- package/dist/api/dto/nodes.d.ts +10 -2
- package/dist/api/dto/worktree.d.ts +10 -0
- package/dist/api/routes.d.ts +1 -0
- package/dist/api/routes.js +1 -0
- package/dist/builtin-memory/00-runtime-base/00-authoring.md +1 -1
- package/dist/builtin-memory/internal/agent-shaping.md +1 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +1 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +1 -1
- package/dist/clients/attach/render/tool-calls.js +18 -3
- package/dist/clients/attach/viewer.js +426 -426
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +6 -0
- package/dist/clients/inbox/review/roundtrip.js +1 -1
- package/dist/commands/memory/lint.js +22 -13
- package/dist/commands/memory/shared.js +1 -1
- package/dist/commands/node/create.d.ts +1 -1
- package/dist/commands/node/create.js +1 -1
- package/dist/commands/node/lifecycle.js +1 -1
- package/dist/commands/node-worktree.js +39 -8
- package/dist/commands/revive.js +11 -2
- package/dist/commands/sys/context/admin/actions.d.ts +48 -0
- package/dist/commands/sys/context/admin/actions.js +246 -0
- package/dist/commands/sys/context/admin/axes-panel.d.ts +21 -0
- package/dist/commands/sys/context/admin/axes-panel.js +117 -0
- package/dist/commands/sys/context/admin/detail-panel.d.ts +53 -0
- package/dist/commands/sys/context/admin/detail-panel.js +178 -0
- package/dist/commands/sys/context/admin/docs-panel.d.ts +45 -0
- package/dist/commands/sys/context/admin/docs-panel.js +186 -0
- package/dist/commands/sys/context/admin/model.d.ts +75 -0
- package/dist/commands/sys/context/admin/model.js +209 -0
- package/dist/commands/sys/context/admin/shell.d.ts +82 -0
- package/dist/commands/sys/context/admin/shell.js +669 -0
- package/dist/commands/sys/context/admin.d.ts +1 -0
- package/dist/commands/sys/context/admin.js +124 -0
- package/dist/commands/sys/context/doc.d.ts +1 -0
- package/dist/commands/sys/context/doc.js +196 -0
- package/dist/commands/sys/context/prompt-review.d.ts +1 -0
- package/dist/commands/sys/{prompt-review.js → context/prompt-review.js} +10 -10
- package/dist/commands/sys/context/resolve.d.ts +55 -0
- package/dist/commands/sys/context/resolve.js +428 -0
- package/dist/commands/sys/context/sysprompt.d.ts +1 -0
- package/dist/commands/sys/{sysprompt.js → context/sysprompt.js} +11 -11
- package/dist/commands/sys/context.d.ts +2 -0
- package/dist/commands/sys/context.js +20 -0
- package/dist/commands/sys.js +3 -4
- package/dist/core/__tests__/child-death-wake.test.js +38 -22
- package/dist/core/__tests__/cron-self-cancel-delivery.test.js +72 -0
- package/dist/core/__tests__/daemon-boot.test.js +40 -28
- package/dist/core/__tests__/human-deliver.test.js +1 -1
- package/dist/core/__tests__/human-node-not-supervised.test.js +10 -15
- package/dist/core/__tests__/integration/revive.test.js +12 -12
- package/dist/core/__tests__/integration/spawn-root.test.js +6 -0
- package/dist/core/__tests__/integration/worktree-reap.test.js +32 -0
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +1 -0
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +61 -0
- package/dist/core/__tests__/migration.test.js +38 -1
- package/dist/core/__tests__/push-final-guard.test.js +1 -1
- package/dist/core/__tests__/revive-capacity.test.d.ts +1 -0
- package/dist/core/__tests__/revive-capacity.test.js +127 -0
- package/dist/core/__tests__/revive-parked-fresh.test.js +7 -7
- package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +1 -0
- package/dist/core/__tests__/seam/broker-cap-freeze.test.js +81 -0
- package/dist/core/__tests__/seam/dormancy-release.test.js +7 -7
- package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +1 -1
- package/dist/core/canvas/browse/render.js +11 -3
- package/dist/core/canvas/canvas.d.ts +15 -3
- package/dist/core/canvas/canvas.js +52 -16
- package/dist/core/canvas/migrations.js +21 -0
- package/dist/core/canvas/nav-render.js +3 -1
- package/dist/core/canvas/remote-canvas-source.js +2 -0
- package/dist/core/canvas/render-source.d.ts +3 -1
- package/dist/core/canvas/render-source.js +7 -3
- package/dist/core/canvas/status-glyph.d.ts +10 -1
- package/dist/core/canvas/status-glyph.js +19 -3
- package/dist/core/canvas/types.d.ts +20 -1
- package/dist/core/feed/feed.js +1 -1
- package/dist/core/human/feedback-companion.js +5 -2
- package/dist/core/memory/lint.d.ts +19 -0
- package/dist/core/memory/lint.js +97 -0
- package/dist/core/memory-resolver.d.ts +4 -0
- package/dist/core/memory-resolver.js +7 -7
- package/dist/core/preview-registry.js +4 -4
- package/dist/core/review/realize.js +4 -2
- package/dist/core/runtime/close.js +1 -1
- package/dist/core/runtime/fleet.d.ts +29 -1
- package/dist/core/runtime/fleet.js +23 -0
- package/dist/core/runtime/host.js +32 -11
- package/dist/core/runtime/launch-prompt.d.ts +1 -1
- package/dist/core/runtime/launch-prompt.js +2 -2
- package/dist/core/runtime/lifecycle.d.ts +4 -2
- package/dist/core/runtime/lifecycle.js +12 -1
- package/dist/core/runtime/memory.js +1 -1
- package/dist/core/runtime/reopen.js +10 -1
- package/dist/core/runtime/reset.js +1 -1
- package/dist/core/runtime/revive-all.d.ts +3 -0
- package/dist/core/runtime/revive-all.js +10 -4
- package/dist/core/runtime/revive.d.ts +12 -0
- package/dist/core/runtime/revive.js +62 -3
- package/dist/core/runtime/spawn.d.ts +4 -0
- package/dist/core/runtime/spawn.js +36 -7
- package/dist/core/substrate/frontmatter-validation.js +1 -1
- package/dist/core/substrate/index.d.ts +6 -3
- package/dist/core/substrate/index.js +4 -3
- package/dist/core/substrate/on-read.d.ts +0 -8
- package/dist/core/substrate/on-read.js +45 -124
- package/dist/core/substrate/plan.d.ts +94 -0
- package/dist/core/substrate/plan.js +266 -0
- package/dist/core/substrate/render.d.ts +5 -6
- package/dist/core/substrate/render.js +76 -129
- package/dist/core/substrate/schema.d.ts +1 -6
- package/dist/core/substrate/schema.js +1 -15
- package/dist/core/substrate/session-cache.d.ts +2 -10
- package/dist/core/substrate/session-cache.js +9 -47
- package/dist/core/substrate/subject-fields.d.ts +1 -4
- package/dist/core/substrate/subject-fields.js +2 -5
- package/dist/core/substrate/surface-match.d.ts +37 -17
- package/dist/core/substrate/surface-match.js +44 -53
- package/dist/core/tui/page-host.d.ts +6 -0
- package/dist/core/tui/page-host.js +12 -3
- package/dist/core/worktree.d.ts +8 -0
- package/dist/core/worktree.js +65 -0
- package/dist/daemon/__tests__/reconciler-signature.test.js +3 -2
- package/dist/daemon/__tests__/thaw-order.test.d.ts +1 -0
- package/dist/daemon/__tests__/thaw-order.test.js +55 -0
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +6 -0
- package/dist/daemon/api/__tests__/node-create-description.test.js +6 -0
- package/dist/daemon/api/__tests__/profile-launch-gates.test.js +1 -1
- package/dist/daemon/api/bridge.js +5 -1
- package/dist/daemon/api/handlers/attach.js +5 -1
- package/dist/daemon/api/handlers/bash-jobs.js +1 -1
- package/dist/daemon/api/handlers/messages.js +10 -2
- package/dist/daemon/api/handlers/nodes.js +8 -1
- package/dist/daemon/api/handlers/worktree.js +10 -1
- package/dist/daemon/api/map.js +7 -0
- package/dist/daemon/companion-retire.js +1 -1
- package/dist/daemon/cron/passes.d.ts +0 -5
- package/dist/daemon/cron/passes.js +0 -20
- package/dist/daemon/cron/sinks.js +1 -1
- package/dist/daemon/cron-run.d.ts +5 -6
- package/dist/daemon/cron-run.js +7 -16
- package/dist/daemon/crtrd.d.ts +0 -10
- package/dist/daemon/crtrd.js +23 -61
- package/dist/daemon/fleet.d.ts +10 -7
- package/dist/daemon/fleet.js +71 -12
- package/dist/daemon/messaging/node-message.js +3 -1
- package/dist/daemon/profile-delete.js +1 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +26 -9
- package/dist/daemon/reconcilers/broker-supervision.js +39 -52
- package/dist/daemon/reconcilers/controller-death.d.ts +7 -0
- package/dist/daemon/reconcilers/controller-death.js +26 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +0 -3
- package/dist/daemon/reconcilers/cron-lane.js +0 -3
- package/dist/daemon/reconcilers/live-obligation.js +3 -1
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +53 -0
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +170 -0
- package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.d.ts +5 -0
- package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +16 -0
- package/dist/daemon/reconcilers/node-lifecycle/terminating.d.ts +4 -0
- package/dist/daemon/reconcilers/node-lifecycle/terminating.js +13 -0
- package/dist/daemon/reconcilers/node-lifecycle/tick.d.ts +26 -0
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +140 -0
- package/package.json +1 -1
- package/runtime.lock.json +2 -2
- package/dist/commands/sys/prompt-review.d.ts +0 -1
- package/dist/commands/sys/sysprompt.d.ts +0 -1
- package/dist/core/__tests__/cron-broker-capacity.test.js +0 -119
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +0 -18
- package/dist/daemon/reconcilers/dormant-inbox.js +0 -157
- /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>;
|