@miadi/inquiry-weave 0.7.0 → 0.8.0
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/README.md +113 -0
- package/dist/chronicle-dsl.d.ts +191 -0
- package/dist/chronicle-dsl.d.ts.map +1 -0
- package/dist/chronicle-dsl.js +327 -0
- package/dist/chronicle-dsl.js.map +1 -0
- package/dist/chronicle-terminal.d.ts +305 -0
- package/dist/chronicle-terminal.d.ts.map +1 -0
- package/dist/chronicle-terminal.js +449 -0
- package/dist/chronicle-terminal.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +222 -8
- package/dist/cli.js.map +1 -1
- package/dist/terminal-install.d.ts +84 -0
- package/dist/terminal-install.d.ts.map +1 -0
- package/dist/terminal-install.js +306 -0
- package/dist/terminal-install.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terminal surface for miadi-chronicle references.
|
|
3
|
+
*
|
|
4
|
+
* Contract: rispecs/miadi-chronicle-dsl/SPEC-TERMINAL.md (v1.2).
|
|
5
|
+
* Grounded in foundations/resource-addressing-and-terminal-hypermedia/.
|
|
6
|
+
*
|
|
7
|
+
* Two jobs the pure module cannot do, because both touch the world:
|
|
8
|
+
*
|
|
9
|
+
* - the OPEN LADDER: turn a resolution into one thing a window manager can
|
|
10
|
+
* act on, preferring what is on this disk over what is on a network.
|
|
11
|
+
* - OSC 8 EMISSION: hand a terminal a link whose label is not its target.
|
|
12
|
+
*
|
|
13
|
+
* Why OSC 8 rather than letting the terminal find URLs in the text: regex
|
|
14
|
+
* linkification is an UNMARKED-ANCHOR mechanism (Grønbæk & Trigg, CACM 37(2),
|
|
15
|
+
* 1994) — the anchor carries no marker, its location must be computed by
|
|
16
|
+
* scanning, and its VALUE IS THE MATCHED TEXT. So under linkification the
|
|
17
|
+
* displayed label and the target are necessarily the same string, and
|
|
18
|
+
* `{{ … | label="Mila gathering" }}` cannot be expressed at all. OSC 8 is a
|
|
19
|
+
* marked anchor: declared, retrievable from the selection, carrying a value
|
|
20
|
+
* independent of what is shown. That is a property of the two anchoring
|
|
21
|
+
* models, not of any terminal's version number.
|
|
22
|
+
*/
|
|
23
|
+
import { type ArtifactKind, type ChronicleResolution, type FragmentVerdict, type ParsedChronicleUri, type ResolvableEpisode } from "./chronicle-dsl.js";
|
|
24
|
+
/** VTE and iTerm2 both refuse URIs beyond this. */
|
|
25
|
+
export declare const MAX_OSC8_URI_BYTES = 2083;
|
|
26
|
+
/**
|
|
27
|
+
* Percent-encode anything outside the OSC command-string repertoire.
|
|
28
|
+
*
|
|
29
|
+
* ECMA-48 §5.6 constrains a command string to bit combinations 00/08–00/13 and
|
|
30
|
+
* 02/00–07/14. In practice for a URI that means bytes 32–126: anything else is
|
|
31
|
+
* undefined behaviour and must be escaped before it reaches the wire.
|
|
32
|
+
*/
|
|
33
|
+
export declare function encodeForOsc8(uri: string): string;
|
|
34
|
+
export interface Osc8Options {
|
|
35
|
+
/**
|
|
36
|
+
* Hover-grouping hint, NOT a data channel. VTE caps ids near 250 bytes and
|
|
37
|
+
* reserves the right to change that without notice, and the OSC 8 spec
|
|
38
|
+
* instructs multiplexers and pagers to PREFIX incoming ids with a
|
|
39
|
+
* pane-unique string — so anything meaningful packed in here gets truncated
|
|
40
|
+
* and namespaced by layers we do not control.
|
|
41
|
+
*
|
|
42
|
+
* The spec's own rule: simple line-oriented utilities SHOULD NOT assign an
|
|
43
|
+
* id; full-screen applications SHOULD. This defaults to omitting it.
|
|
44
|
+
*/
|
|
45
|
+
id?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Wrap a label in an OSC 8 hyperlink.
|
|
49
|
+
*
|
|
50
|
+
* Emitted unconditionally, because there is no alternative. The OSC 8 spec
|
|
51
|
+
* says so in its own words: "Currently there's no way of detecting whether the
|
|
52
|
+
* terminal emulator supports hyperlinks." Any behaviour that branches on
|
|
53
|
+
* support is unimplementable, and backward compatibility is guaranteed one
|
|
54
|
+
* layer down — a terminal that parses OSC per ECMA-48 discards the payload and
|
|
55
|
+
* shows the label.
|
|
56
|
+
*
|
|
57
|
+
* Returns the bare label when the URI exceeds the byte ceiling: a link that
|
|
58
|
+
* would be truncated mid-URI is worse than no link, because it points
|
|
59
|
+
* somewhere real and wrong.
|
|
60
|
+
*/
|
|
61
|
+
export declare function osc8(uri: string, label: string, options?: Osc8Options): string;
|
|
62
|
+
/**
|
|
63
|
+
* A chronicle reference as a terminal writes it: the marked anchor AND the
|
|
64
|
+
* address in plain sight.
|
|
65
|
+
*
|
|
66
|
+
* Not a fallback — two requirements met at once. The OSC 8 spec: hyperlinks
|
|
67
|
+
* "should not be the only means of figuring out the target." Engelbart's open
|
|
68
|
+
* hyperdocument requirement: every address stays "understandable and readable
|
|
69
|
+
* by a user." And the angle brackets are RFC 3986 Appendix C's explicit
|
|
70
|
+
* recommendation for delimiting a URI in running text, which is what makes the
|
|
71
|
+
* line survive `script`, CI capture, a pipe to a file, GNU screen, and xterm —
|
|
72
|
+
* none of which will ever render the escape.
|
|
73
|
+
*/
|
|
74
|
+
export declare function terminalRef(uri: string, label: string, target: string, options?: Osc8Options): string;
|
|
75
|
+
/**
|
|
76
|
+
* How complete an answer this resolution is.
|
|
77
|
+
*
|
|
78
|
+
* This is a discretised HARVEST report in Fox & Brewer's sense (HotOS-VII,
|
|
79
|
+
* 1999): yield is whether the reference resolved at all, harvest is "the
|
|
80
|
+
* fraction of the data reflected in the response, i.e. the completeness of the
|
|
81
|
+
* answer." `resolved` is the yield; this is the harvest.
|
|
82
|
+
*
|
|
83
|
+
* Its consumer is named, deliberately: `resolveLines()` below prints it on
|
|
84
|
+
* every human-readable run. HTTP shipped exactly this field once — RFC 7234
|
|
85
|
+
* §5.5's `Warning`, including code 112 "Disconnected Operation" — and RFC 9111
|
|
86
|
+
* §8.3 obsoleted it because it "is not widely generated or surfaced to users."
|
|
87
|
+
* A modality nobody renders is dead metadata within two releases.
|
|
88
|
+
*/
|
|
89
|
+
export type Modality = "relational" | "standalone" | "none";
|
|
90
|
+
export interface ArtifactTarget {
|
|
91
|
+
kind: ArtifactKind;
|
|
92
|
+
/** Absolute path on this host. */
|
|
93
|
+
path: string;
|
|
94
|
+
/** Other candidates the same reference matched — never hidden (SPEC §1). */
|
|
95
|
+
alternates?: string[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The default chronicle room. Verified live 2026-08-16: `/chronicle` and
|
|
99
|
+
* `/chronicle/<folder>` both answer 200 on 127.0.0.1:3335, the same server the
|
|
100
|
+
* voice layer already talks to. The 2026-08-07 draft assumed the surface was
|
|
101
|
+
* down because it probed :3000 — the wrong port — and built a ladder around an
|
|
102
|
+
* outage that was not happening.
|
|
103
|
+
*/
|
|
104
|
+
export declare const DEFAULT_LOCAL_BASE = "http://127.0.0.1:3335";
|
|
105
|
+
/**
|
|
106
|
+
* The chronicle room has three addresses and one identity.
|
|
107
|
+
*
|
|
108
|
+
* Measured 2026-08-16: `/chronicle/<folder>` answers 200 on all three —
|
|
109
|
+
* `127.0.0.1:3335`, the tailnet front (`$MIADI_URL_BASE_INTERNAL`), and the
|
|
110
|
+
* ngrok front (`$MIADI_URL_BASE`). Same room, three doors, and which door is
|
|
111
|
+
* reachable depends entirely on where the reader is standing.
|
|
112
|
+
*
|
|
113
|
+
* This is ARK's Name Mapping Authority rule arriving as a real requirement:
|
|
114
|
+
* the resolver's hostport is **identity-inert** — "ARKs that differ only in
|
|
115
|
+
* the optional NMA part identify the same object", and the host is
|
|
116
|
+
* "temporary, disposable, and replaceable". So the base never enters
|
|
117
|
+
* `canonical`. `miadi-chronicle:311` is the name; a base is chosen at render
|
|
118
|
+
* time, by audience.
|
|
119
|
+
*
|
|
120
|
+
* Which is also why the earlier draft's single `open` was wrong twice over —
|
|
121
|
+
* it picked a file when it should have picked a room, and it would have
|
|
122
|
+
* picked one room when there are three and the right one depends on who is
|
|
123
|
+
* reading.
|
|
124
|
+
*/
|
|
125
|
+
export interface WebBases {
|
|
126
|
+
/** This host only. Fastest, and useless to anyone else. */
|
|
127
|
+
local?: string;
|
|
128
|
+
/** Tailnet — private, reaches other machines on the tailscale network. */
|
|
129
|
+
internal?: string;
|
|
130
|
+
/** Public front. The only one that survives being pasted somewhere. */
|
|
131
|
+
public?: string;
|
|
132
|
+
}
|
|
133
|
+
export type BaseKind = "local" | "internal" | "public";
|
|
134
|
+
/**
|
|
135
|
+
* Read the bases from the environment. Nothing is probed — reachability is a
|
|
136
|
+
* claim about the reader's network, not about this process, and a resolver
|
|
137
|
+
* that silently dropped an unreachable base would hide exactly the fact a
|
|
138
|
+
* reader elsewhere needs.
|
|
139
|
+
*/
|
|
140
|
+
export declare function readWebBases(env?: NodeJS.ProcessEnv): WebBases;
|
|
141
|
+
/** One door. A reference has several; which one is right depends on the reader. */
|
|
142
|
+
export interface Destination {
|
|
143
|
+
kind: "room" | "wheel-api" | "wheel-page" | "artifact-file" | "readme" | "vessel";
|
|
144
|
+
/** Where the base came from, for the room kinds. */
|
|
145
|
+
base?: BaseKind;
|
|
146
|
+
/** Short human label — what a terminal prints inside the anchor. */
|
|
147
|
+
label: string;
|
|
148
|
+
url: string;
|
|
149
|
+
}
|
|
150
|
+
export interface Destinations {
|
|
151
|
+
/**
|
|
152
|
+
* Every door, in offer order. A chronicle reference is not one place: the
|
|
153
|
+
* same episode is a room on three fronts and a file on this disk, and which
|
|
154
|
+
* is useful depends on where the reader is standing and what they came for.
|
|
155
|
+
*
|
|
156
|
+
* William's doors principle, in the resolver: *"Depending on the Door you
|
|
157
|
+
* enter Guillaume's world, you don't get the content presented the same
|
|
158
|
+
* way."*
|
|
159
|
+
*/
|
|
160
|
+
all: Destination[];
|
|
161
|
+
/** The default pick — `all[0]`, or null when nothing resolved. */
|
|
162
|
+
open: string | null;
|
|
163
|
+
openKind: Destination["kind"] | "none";
|
|
164
|
+
/**
|
|
165
|
+
* The door that survives being pasted somewhere else. A localhost URL in a
|
|
166
|
+
* chronicle, an issue or a voice record is a link that works for exactly one
|
|
167
|
+
* reader on exactly one machine.
|
|
168
|
+
*/
|
|
169
|
+
shareable: string | null;
|
|
170
|
+
/**
|
|
171
|
+
* Bytes on this host, for whatever consumes bytes — a script, an agent, an
|
|
172
|
+
* editor, a diff. Always present when the episode resolved, independent of
|
|
173
|
+
* any web surface. This is the local-first guarantee kept where it belongs:
|
|
174
|
+
* local-first is about data ownership and availability, never about
|
|
175
|
+
* presentation.
|
|
176
|
+
*/
|
|
177
|
+
path: string | null;
|
|
178
|
+
modality: Modality;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* `file://` URLs carry this host's name, always.
|
|
182
|
+
*
|
|
183
|
+
* Browsers ignore the authority in a file URL. OSC 8 explicitly forbids that
|
|
184
|
+
* laxity BECAUSE IT BREAKS UNDER SSH: a terminal is required to refuse opening
|
|
185
|
+
* a local file when the hostname does not match, and to treat empty or
|
|
186
|
+
* "localhost" as local. RFC 8089 formalises `file-auth = "localhost" / host`,
|
|
187
|
+
* so that "a client on another system [can] know that it cannot access the
|
|
188
|
+
* file system."
|
|
189
|
+
*
|
|
190
|
+
* On this stack ssh is the normal case — the chronicle wheel is reached
|
|
191
|
+
* through a tunnel — so `file:///srv/miadi/...` would be a link that opens
|
|
192
|
+
* confidently, on the wrong machine's disk.
|
|
193
|
+
*/
|
|
194
|
+
export declare function fileUrl(absolutePath: string, host?: string): string;
|
|
195
|
+
export declare function resolveArtifactTarget(kind: ArtifactKind, episodeDir: string): Promise<ArtifactTarget | null>;
|
|
196
|
+
/**
|
|
197
|
+
* The wheel's own doors, and the one endpoint that can be believed.
|
|
198
|
+
*
|
|
199
|
+
* Measured 2026-08-16: `/graph`, `/nodes` and `/relations` all begin
|
|
200
|
+
* `"use client"`. Fetching `/nodes?node=<a real episode id>` and grepping the
|
|
201
|
+
* HTML for the episode name returns **zero hits** — the shell is byte-identical
|
|
202
|
+
* for any parameter, and focus happens in the browser after it fetches
|
|
203
|
+
* `/api/nodes`. `/graph?direction=nowhere` is a 200 too.
|
|
204
|
+
*
|
|
205
|
+
* Forgewright behaves the same way: `?episode=9999-99-99-episode-000-nope`
|
|
206
|
+
* → 200. Two services, two codebases, one trap.
|
|
207
|
+
*
|
|
208
|
+
* **So an HTTP 200 from any of these pages is not evidence the episode
|
|
209
|
+
* exists.** `GET /api/nodes/<id>` is — it returns the node or a real 404
|
|
210
|
+
* (`{"error":"Node not found: chronicle:nope"}`). A resolver that hands a human
|
|
211
|
+
* a page URL without checking it first is handing them a silently empty wheel.
|
|
212
|
+
*/
|
|
213
|
+
export declare const WHEEL_PAGE_DOORS: readonly [{
|
|
214
|
+
readonly path: "/graph";
|
|
215
|
+
readonly label: "wheel·graph";
|
|
216
|
+
}, {
|
|
217
|
+
readonly path: "/nodes";
|
|
218
|
+
readonly label: "wheel·node";
|
|
219
|
+
}, {
|
|
220
|
+
readonly path: "/relations";
|
|
221
|
+
readonly label: "wheel·relations";
|
|
222
|
+
}];
|
|
223
|
+
export declare function wheelUrl(env?: NodeJS.ProcessEnv): string;
|
|
224
|
+
/**
|
|
225
|
+
* Where a wheel-backed artifact actually lives.
|
|
226
|
+
*
|
|
227
|
+
* Every one is keyed by `episode_path` — the full folder name. The number is
|
|
228
|
+
* not a key: `?episode_number=320` returns 0 records for an episode whose
|
|
229
|
+
* `?episode_path=<folder>` returns 1, because the records carry no
|
|
230
|
+
* `episode_number` field and the filter compares strictly.
|
|
231
|
+
*/
|
|
232
|
+
export declare function wheelArtifactUrl(kind: ArtifactKind, episodeFolder: string, base: string): string | null;
|
|
233
|
+
export interface WheelVerdict {
|
|
234
|
+
checked: boolean;
|
|
235
|
+
exists: boolean;
|
|
236
|
+
nodeId: string;
|
|
237
|
+
status?: number;
|
|
238
|
+
error?: string;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Ask the wheel whether this episode is actually on it.
|
|
242
|
+
*
|
|
243
|
+
* Opt-in (`--verify`) because it is a network call, and because a resolution
|
|
244
|
+
* that answers from the catalog on disk is already true about the disk. What
|
|
245
|
+
* this adds is the other half: whether the relational layer knows the episode
|
|
246
|
+
* too. Both answers are real, and they can disagree — forgewright's UI sees a
|
|
247
|
+
* 28-episode registry while its own disk routes resolve episodes the registry
|
|
248
|
+
* has never heard of.
|
|
249
|
+
*/
|
|
250
|
+
export declare function verifyOnWheel(episodeFolder: string, base: string, timeoutMs?: number): Promise<WheelVerdict>;
|
|
251
|
+
/**
|
|
252
|
+
* Enumerate every door this reference opens.
|
|
253
|
+
*
|
|
254
|
+
* Two questions, never collapsed: *"where do I go to read this?"* is a room,
|
|
255
|
+
* *"where does this live?"* is the vessel. The 2026-08-07 draft answered only
|
|
256
|
+
* the second and called it `open`, which is how a chronicle link came to open
|
|
257
|
+
* emacs on raw JSON.
|
|
258
|
+
*/
|
|
259
|
+
export declare function buildDestinations(resolution: ChronicleResolution, parsed: ParsedChronicleUri, chronicleRoot: string, options?: {
|
|
260
|
+
bases?: WebBases;
|
|
261
|
+
prefer?: BaseKind | "local-file";
|
|
262
|
+
wheelUrl?: string;
|
|
263
|
+
}): Promise<{
|
|
264
|
+
destinations: Destinations;
|
|
265
|
+
artifact: ArtifactTarget | null;
|
|
266
|
+
}>;
|
|
267
|
+
export interface ChronicleResolveResult {
|
|
268
|
+
ok: boolean;
|
|
269
|
+
uri: string;
|
|
270
|
+
/** Canonical rootless form — what a caller should persist or cite, and what
|
|
271
|
+
* a future registered `x-scheme-handler/miadi-chronicle` app would receive. */
|
|
272
|
+
canonical: string;
|
|
273
|
+
parsed: {
|
|
274
|
+
episodePath: string;
|
|
275
|
+
segments: string[];
|
|
276
|
+
episodeSegments: string[];
|
|
277
|
+
artifact: ArtifactKind | null;
|
|
278
|
+
query: Record<string, string>;
|
|
279
|
+
options: Record<string, string>;
|
|
280
|
+
fragment?: string;
|
|
281
|
+
};
|
|
282
|
+
resolution: ChronicleResolution;
|
|
283
|
+
artifact: ArtifactTarget | null;
|
|
284
|
+
/** Every door, in offer order. */
|
|
285
|
+
destinations: Destination[];
|
|
286
|
+
/** The default pick — `destinations[0]`. */
|
|
287
|
+
open: string | null;
|
|
288
|
+
openKind: Destinations["openKind"];
|
|
289
|
+
/** The door that survives being pasted elsewhere. */
|
|
290
|
+
shareable: string | null;
|
|
291
|
+
/** Bytes on this host. Independent of `open`. */
|
|
292
|
+
path: string | null;
|
|
293
|
+
modality: Modality;
|
|
294
|
+
/** Present only when the fragment names something positional. */
|
|
295
|
+
fragmentWarning?: FragmentVerdict;
|
|
296
|
+
/** Present only with --verify: what the wheel said about this episode. */
|
|
297
|
+
wheel?: WheelVerdict;
|
|
298
|
+
}
|
|
299
|
+
export declare function resolveForTerminal(uri: string, entries: ResolvableEpisode[], chronicleRoot: string, options?: {
|
|
300
|
+
bases?: WebBases;
|
|
301
|
+
prefer?: BaseKind | "local-file";
|
|
302
|
+
wheelUrl?: string;
|
|
303
|
+
verify?: boolean;
|
|
304
|
+
}): Promise<ChronicleResolveResult | null>;
|
|
305
|
+
//# sourceMappingURL=chronicle-terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chronicle-terminal.d.ts","sourceRoot":"","sources":["../src/chronicle-terminal.ts"],"names":[],"mappings":"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"}
|