@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.
@@ -0,0 +1,306 @@
1
+ /**
2
+ * Install the terminal handler for `miadi-chronicle:` references.
3
+ *
4
+ * Contract: rispecs/miadi-chronicle-dsl/SPEC-TERMINAL.md §3.
5
+ *
6
+ * Two files, shipped as embedded strings so `dist/` is self-contained — the
7
+ * same shape `installSkill` uses. Hand-writing them into a home directory is
8
+ * how a working setup becomes unreproducible on the next machine.
9
+ *
10
+ * ~/.config/terminator/plugins/miadi_chronicle_url_handler.py
11
+ * ~/bin/miadi-chronicle-open
12
+ *
13
+ * The plugin makes a bare `miadi-chronicle:311` clickable in ANY output — a
14
+ * git log, a grep hit, an agent's raw text — output that knows nothing about
15
+ * miadi and will never wrap itself in an OSC 8 escape. That is why it lives
16
+ * alongside OSC 8 rather than competing with it: Terminator has two click
17
+ * paths, and only the regex one consults url_handler plugins
18
+ * (`terminal.py` — OSC 8 calls `open_url(prepare=False)` and goes straight to
19
+ * xdg-open, bypassing the plugin API entirely).
20
+ */
21
+ import { chmodSync, copyFileSync, lstatSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
22
+ import { homedir } from "node:os";
23
+ import { dirname, join } from "node:path";
24
+ export class TerminalInstallError extends Error {
25
+ constructor(message) {
26
+ super(message);
27
+ this.name = "TerminalInstallError";
28
+ }
29
+ }
30
+ export const PLUGIN_CLASS = "MiadiChronicleURLHandler";
31
+ export const PLUGIN_FILENAME = "miadi_chronicle_url_handler.py";
32
+ export const WRAPPER_FILENAME = "miadi-chronicle-open";
33
+ export const ENV_DROPIN_FILENAME = "50-miadi-chronicle.conf";
34
+ /**
35
+ * The URI regex, in one place.
36
+ *
37
+ * Accepts the rootless canonical form and the legacy `//` form. The character
38
+ * class stops at what ends a URI in running text — RFC 3986 Appendix C's point
39
+ * that a reader cannot tell a sentence's trailing period from part of the
40
+ * address. The callback strips trailing punctuation for the same reason.
41
+ */
42
+ export const URI_MATCH_REGEX = String.raw `\bmiadi-chronicle:(?://)?[A-Za-z0-9._~/\-]+(?:\?[^\s<>"'` + "`" + String.raw `]*)?(?:#[^\s<>"'` + "`" + String.raw `]*)?`;
43
+ /**
44
+ * A systemd user environment drop-in — the OS's own answer to "a GUI app
45
+ * cannot see my shell variables".
46
+ *
47
+ * `~/.config/environment.d/*.conf` is read by
48
+ * /usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator
49
+ * at user-session start, so every GUI process launched by that session
50
+ * inherits it — Terminator included. This machine already uses the pattern
51
+ * (999-node.conf), so it is the local convention, not an invention.
52
+ *
53
+ * It takes effect at the next login. The wrapper still carries its own
54
+ * defaults so a click works before then; the drop-in is what makes those
55
+ * defaults stop being the only copy.
56
+ */
57
+ function envDropinSource(env) {
58
+ const lines = [
59
+ `# ${ENV_DROPIN_FILENAME} — miadi chronicle environment for GUI sessions.`,
60
+ `#`,
61
+ `# INSTALLED FILE — source of truth:`,
62
+ `# jgwill/Miadi packages/inquiry-weave/src/terminal-install.ts`,
63
+ `# Reinstall with: inquiry-weave terminal install --force`,
64
+ `#`,
65
+ `# Read by systemd's user-environment generator at session start, so every`,
66
+ `# GUI process inherits these — a terminal emulator does not get them from`,
67
+ `# your shell rc. Takes effect at the NEXT LOGIN.`,
68
+ `MIADI_CHRONICLE_ROOT=${env.chronicleRoot}`,
69
+ ];
70
+ if (env.publicBase)
71
+ lines.push(`MIADI_URL_BASE=${env.publicBase}`);
72
+ if (env.internalBase)
73
+ lines.push(`MIADI_URL_BASE_INTERNAL=${env.internalBase}`);
74
+ lines.push(`MW_API_URL=${env.mwUrl}`);
75
+ return `${lines.join("\n")}\n`;
76
+ }
77
+ function pluginSource() {
78
+ return `"""${PLUGIN_FILENAME} — Terminator URL handler for miadi-chronicle references.
79
+
80
+ INSTALLED FILE — do not edit here. Source of truth:
81
+ jgwill/Miadi packages/inquiry-weave/src/terminal-install.ts
82
+ Reinstall with: inquiry-weave terminal install --force
83
+
84
+ Makes a bare \`miadi-chronicle:311\` in ANY terminal output Ctrl-clickable — a
85
+ git log, a grep hit, an agent's raw text — output that knows nothing about miadi
86
+ and so will never wrap itself in an OSC 8 escape.
87
+
88
+ Terminator has two click paths (terminal.py): an OSC 8 hyperlink calls
89
+ open_url(prepare=False) and goes straight to xdg-open, while a regex match calls
90
+ prepare=True, which is the only path that consults url_handler plugins. The two
91
+ cover different halves of the problem and both land on the same wrapper.
92
+
93
+ Spec: rispecs/miadi-chronicle-dsl/SPEC-TERMINAL.md
94
+ Issue: jgwill/Miadi#595
95
+ """
96
+
97
+ import os
98
+ import subprocess
99
+
100
+ import terminatorlib.plugin as plugin
101
+
102
+ AVAILABLE = ['${PLUGIN_CLASS}']
103
+
104
+ OPEN = os.path.expanduser('~/bin/${WRAPPER_FILENAME}')
105
+
106
+
107
+ class ${PLUGIN_CLASS}(plugin.URLHandler):
108
+ capabilities = ['url_handler']
109
+ handler_name = 'miadi_chronicle_uri'
110
+ # r'''...''' because the pattern contains a double quote.
111
+ match = r'''${URI_MATCH_REGEX}'''
112
+ nameopen = 'Open chronicle episode'
113
+ namecopy = 'Copy miadi-chronicle reference'
114
+
115
+ def callback(self, url):
116
+ """Return something openable, or the URL itself so failure stays visible.
117
+
118
+ Never raises: a handler that throws takes the click with it and the user
119
+ sees nothing at all. Returning the original means the system handler
120
+ reports a plain "no application" error — a failure that can be read.
121
+ """
122
+ url = url.rstrip('.,;:!?)]}\\'"')
123
+ try:
124
+ result = subprocess.run(
125
+ [OPEN, url], capture_output=True, text=True, timeout=20,
126
+ )
127
+ except (OSError, subprocess.TimeoutExpired):
128
+ return url
129
+ if result.returncode != 0:
130
+ return url
131
+ return result.stdout.strip() or url
132
+ `;
133
+ }
134
+ function wrapperSource(env) {
135
+ const { binPath, nodePath, defaultBase, chronicleRoot, publicBase, internalBase, mwUrl } = env;
136
+ return `#!/usr/bin/env bash
137
+ # ${WRAPPER_FILENAME} — resolve a miadi-chronicle reference to something openable.
138
+ #
139
+ # INSTALLED FILE — do not edit here. Source of truth:
140
+ # jgwill/Miadi packages/inquiry-weave/src/terminal-install.ts
141
+ # Reinstall with: inquiry-weave terminal install --force
142
+ #
143
+ # Usage: ${WRAPPER_FILENAME} "miadi-chronicle:311/services-inventory"
144
+ # Stdout: one URL
145
+ # Exit: 0 ok · 64 usage · 65 not a chronicle reference · 66 unresolved
146
+ #
147
+ # Spec: rispecs/miadi-chronicle-dsl/SPEC-TERMINAL.md
148
+ # Issue: jgwill/Miadi#595
149
+
150
+ set -euo pipefail
151
+
152
+ # Baked at install time to the bin that installed it, so the handler does not
153
+ # depend on PATH resolution inside a GUI process — Terminator does not inherit
154
+ # a login shell's PATH, which is how a handler that works in a terminal fails
155
+ # when clicked.
156
+ IW_BIN="\${MIADI_IW_BIN:-${binPath}}"
157
+ NODE_BIN="\${MIADI_NODE_BIN:-${nodePath}}"
158
+
159
+ # Baked at install time for the same reason as the bin paths: a GUI process
160
+ # inherits none of this, so without it every click would silently fall back to
161
+ # the localhost door — a link that works for one reader on one machine.
162
+ export MIADI_CHRONICLE_ROOT="\${MIADI_CHRONICLE_ROOT:-${chronicleRoot}}"
163
+ export MIADI_URL_BASE="\${MIADI_URL_BASE:-${publicBase}}"
164
+ export MIADI_URL_BASE_INTERNAL="\${MIADI_URL_BASE_INTERNAL:-${internalBase}}"
165
+ export MW_API_URL="\${MW_API_URL:-${mwUrl}}"
166
+
167
+ [ $# -ge 1 ] || { echo "usage: \$0 \\"miadi-chronicle:<episode>[/<artifact>]\\"" >&2; exit 64; }
168
+
169
+ case "\$1" in
170
+ miadi-chronicle:*) ;;
171
+ *) echo "not a chronicle reference: \$1" >&2; exit 65 ;;
172
+ esac
173
+
174
+ # Which door a click opens. 'public' by default because a clicked link is often
175
+ # shared onward, and a localhost URL works for exactly one reader on one machine.
176
+ BASE="\${MIADI_CHRONICLE_OPEN_BASE:-${defaultBase}}"
177
+
178
+ url=\$("\$NODE_BIN" "\$IW_BIN" resolve "\$1" --json --base "\$BASE" 2>/dev/null | "\$NODE_BIN" -e '
179
+ let raw = ""
180
+ process.stdin.on("data", (c) => (raw += c))
181
+ process.stdin.on("end", () => {
182
+ try { process.stdout.write(JSON.parse(raw).open || "") } catch { process.stdout.write("") }
183
+ })')
184
+
185
+ [ -n "\$url" ] || { echo "unresolved: \$1" >&2; exit 66; }
186
+ printf '%s\\n' "\$url"
187
+ `;
188
+ }
189
+ function pathState(path) {
190
+ try {
191
+ lstatSync(path);
192
+ return "present";
193
+ }
194
+ catch {
195
+ return "missing";
196
+ }
197
+ }
198
+ /**
199
+ * Install both files, and optionally enable the plugin.
200
+ *
201
+ * Idempotent: an existing file is left alone unless `force` is set, so running
202
+ * this twice is safe and running it after an upgrade is the repair.
203
+ */
204
+ export function installTerminalHandler(options = {}) {
205
+ const home = options.homeDir ?? homedir();
206
+ const binPath = options.binPath ?? process.argv[1];
207
+ const nodePath = options.nodePath ?? process.execPath;
208
+ const defaultBase = options.defaultBase ?? "public";
209
+ const env = options.env ?? process.env;
210
+ const pluginPath = join(home, ".config", "terminator", "plugins", PLUGIN_FILENAME);
211
+ const wrapperPath = join(home, "bin", WRAPPER_FILENAME);
212
+ const bakeable = {
213
+ chronicleRoot: options.chronicleRoot ?? env.MIADI_CHRONICLE_ROOT ?? "/srv/miadi/episodes/miadi-chronicle",
214
+ publicBase: options.publicBase ?? env.MIADI_URL_BASE ?? "",
215
+ internalBase: options.internalBase ?? env.MIADI_URL_BASE_INTERNAL ?? "",
216
+ mwUrl: options.mwUrl ?? env.MW_API_URL ?? "http://127.0.0.1:8040",
217
+ };
218
+ const envDropinPath = join(home, ".config", "environment.d", ENV_DROPIN_FILENAME);
219
+ const targets = [
220
+ { path: pluginPath, content: pluginSource() },
221
+ { path: envDropinPath, content: envDropinSource(bakeable) },
222
+ {
223
+ path: wrapperPath,
224
+ content: wrapperSource({ binPath, nodePath, defaultBase, ...bakeable }),
225
+ mode: 0o755,
226
+ },
227
+ ];
228
+ const files = [];
229
+ for (const target of targets) {
230
+ const exists = pathState(target.path) === "present";
231
+ if (exists && options.force !== true) {
232
+ files.push({ path: target.path, state: "exists" });
233
+ continue;
234
+ }
235
+ if (options.dryRun === true) {
236
+ files.push({ path: target.path, state: "would-write" });
237
+ continue;
238
+ }
239
+ mkdirSync(dirname(target.path), { recursive: true });
240
+ writeFileSync(target.path, target.content, "utf8");
241
+ if (target.mode !== undefined)
242
+ chmodSync(target.path, target.mode);
243
+ files.push({ path: target.path, state: "written" });
244
+ }
245
+ const configPath = join(home, ".config", "terminator", "config");
246
+ const result = {
247
+ files,
248
+ configPath,
249
+ configState: "not-requested",
250
+ binPath,
251
+ };
252
+ if (options.enable !== true)
253
+ return result;
254
+ if (pathState(configPath) === "missing") {
255
+ result.configState = "no-config";
256
+ return result;
257
+ }
258
+ const config = readFileSync(configPath, "utf8");
259
+ if (config.includes(PLUGIN_CLASS)) {
260
+ result.configState = "already-enabled";
261
+ return result;
262
+ }
263
+ const line = /^(\s*enabled_plugins\s*=\s*)(.*)$/m.exec(config);
264
+ if (!line) {
265
+ throw new TerminalInstallError(`no enabled_plugins line in ${configPath} — add "${PLUGIN_CLASS}" by hand`);
266
+ }
267
+ if (options.dryRun === true) {
268
+ result.configState = "would-enable";
269
+ return result;
270
+ }
271
+ // A backup before touching a config the user owns and did not write here.
272
+ const backupPath = `${configPath}.bak-miadi-chronicle`;
273
+ copyFileSync(configPath, backupPath);
274
+ result.backupPath = backupPath;
275
+ const updated = config.replace(line[0], `${line[1]}${line[2].trim()}, ${PLUGIN_CLASS}`);
276
+ writeFileSync(configPath, updated, "utf8");
277
+ result.configState = "enabled";
278
+ return result;
279
+ }
280
+ /** Remove both files and drop the class from `enabled_plugins`. */
281
+ export function uninstallTerminalHandler(options = {}) {
282
+ const home = options.homeDir ?? homedir();
283
+ const removed = [];
284
+ for (const path of [
285
+ join(home, ".config", "terminator", "plugins", PLUGIN_FILENAME),
286
+ join(home, ".config", "environment.d", ENV_DROPIN_FILENAME),
287
+ join(home, "bin", WRAPPER_FILENAME),
288
+ ]) {
289
+ if (pathState(path) === "present") {
290
+ if (options.dryRun !== true)
291
+ rmSync(path);
292
+ removed.push(path);
293
+ }
294
+ }
295
+ const configPath = join(home, ".config", "terminator", "config");
296
+ if (pathState(configPath) === "missing")
297
+ return { removed, configState: "no-config" };
298
+ const config = readFileSync(configPath, "utf8");
299
+ if (!config.includes(PLUGIN_CLASS))
300
+ return { removed, configState: "not-enabled" };
301
+ if (options.dryRun !== true) {
302
+ writeFileSync(configPath, config.replace(new RegExp(`,\\s*${PLUGIN_CLASS}|${PLUGIN_CLASS},\\s*`), ""), "utf8");
303
+ }
304
+ return { removed, configState: "disabled" };
305
+ }
306
+ //# sourceMappingURL=terminal-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-install.js","sourceRoot":"","sources":["../src/terminal-install.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miadi/inquiry-weave",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Relate and sync IAIP inquiry artefacts, their GitHub issues, and miadi-chronicle episodes. Creates vessels and relations only — never inquiry content.",
5
5
  "publishConfig": {
6
6
  "access": "public"