@miadi/inquiry-weave 0.12.2 → 0.13.1

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/review.js ADDED
@@ -0,0 +1,326 @@
1
+ /**
2
+ * The review seam — a Miadi review entering an episode: read it from the
3
+ * review service's public JSON, record it in `episode.yaml`, and put it on the
4
+ * wheel in the shape Episode 345 set by hand (`review-medicine-wheel-
5
+ * experiment.md`): one reusable `review:<uuid>` node, and one
6
+ * `chronicle:<episode>` → `review:<uuid>` edge whose relationship type names
7
+ * what the episode uses the review for.
8
+ *
9
+ * Three rules this file keeps:
10
+ *
11
+ * 1. Only the configured review origin is fetched (`parseReviewRef` refuses
12
+ * any other), so a caller cannot make the server fetch an address of its
13
+ * choosing.
14
+ * 2. The manifest entry is written once per review and never overwritten:
15
+ * a later call fills keys that were missing (the ceremony, once it opens)
16
+ * and leaves every recorded value as it was, including the version the
17
+ * episode used.
18
+ * 3. The wheel projection never throws. A wheel that is down answers
19
+ * `pending`, as the lineage and registration projections do. One ordered
20
+ * node pair is one edge on the wheel, so an edge someone made by hand is
21
+ * kept with its own relationship type.
22
+ *
23
+ * Ref: jgwill/Miadi#630.
24
+ */
25
+ import { readFile, writeFile } from "node:fs/promises";
26
+ import { existsSync } from "node:fs";
27
+ import { dirname } from "node:path";
28
+ import { isMap, isSeq, parseDocument } from "yaml";
29
+ import { parseReviewRef, REVIEW_ENTRY_KEYS, REVIEW_NODE_KIND, REVIEW_SERVICE_BASE_URL, reviewJsonUrl, reviewNodeId, toEpisodeReviewEntry, } from "@miadi/episodic-memory-schema";
30
+ import { missingManifestRemedy } from "./episode.js";
31
+ export class ReviewError extends Error {
32
+ code;
33
+ constructor(code, message) {
34
+ super(message);
35
+ this.code = code;
36
+ this.name = "ReviewError";
37
+ }
38
+ }
39
+ /** `MIADI_REVIEW_BASE_URL` names another deployment; the miadi-review skill reads the same variable. */
40
+ export function reviewBaseUrl(env = process.env) {
41
+ const named = env.MIADI_REVIEW_BASE_URL?.trim();
42
+ return (named || REVIEW_SERVICE_BASE_URL).replace(/\/+$/, "");
43
+ }
44
+ /** Parse, or refuse with the door's error. */
45
+ export function requireReviewRef(raw, base) {
46
+ const ref = parseReviewRef(raw, { base });
47
+ if (!ref) {
48
+ throw new ReviewError("invalid_review", `'${String(raw ?? "")}' is not a review on ${base}: give ${base}/review/<uuid>, its /json form, miadi-review:<uuid>, or the uuid`);
49
+ }
50
+ return ref;
51
+ }
52
+ const REVIEW_READ_TIMEOUT_MS = 15_000;
53
+ function text(value) {
54
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
55
+ }
56
+ /** GET `<base>/review/<id>/json[?v=N]`. Public; no token. */
57
+ export async function fetchPublicReview(ref, options = {}) {
58
+ const fetchImpl = options.fetchImpl ?? fetch;
59
+ const url = reviewJsonUrl(ref.id, ref.base, ref.version);
60
+ const controller = new AbortController();
61
+ const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? REVIEW_READ_TIMEOUT_MS);
62
+ let response;
63
+ try {
64
+ response = await fetchImpl(url, { signal: controller.signal, headers: { accept: "application/json" } });
65
+ }
66
+ catch (error) {
67
+ throw new ReviewError("review_unreachable", `GET ${url}: ${error instanceof Error ? error.message : String(error)}`);
68
+ }
69
+ finally {
70
+ clearTimeout(timer);
71
+ }
72
+ if (response.status === 404)
73
+ throw new ReviewError("review_not_found", `no published review ${ref.id} on ${ref.base}`);
74
+ if (!response.ok)
75
+ throw new ReviewError("review_unreachable", `GET ${url}: HTTP ${response.status}`);
76
+ let body;
77
+ try {
78
+ body = (await response.json());
79
+ }
80
+ catch (error) {
81
+ throw new ReviewError("review_unreachable", `GET ${url} returned unreadable JSON: ${error instanceof Error ? error.message : String(error)}`);
82
+ }
83
+ const selected = (body.version && typeof body.version === "object" ? body.version : {});
84
+ const latest = typeof body.latest_version === "number" ? body.latest_version : Number(selected.version) || 0;
85
+ const version = typeof selected.version === "number" ? selected.version : latest;
86
+ if (!(version >= 1))
87
+ throw new ReviewError("review_not_found", `review ${ref.id} has no published version yet`);
88
+ return {
89
+ id: ref.id,
90
+ url: ref.url,
91
+ title: text(body.title) ?? "Untitled review",
92
+ ...(text(body.video_url) ? { video_url: text(body.video_url) } : {}),
93
+ ...(text(body.channel) ? { channel: text(body.channel) } : {}),
94
+ latest_version: latest,
95
+ version,
96
+ ...(text(body.updated_at) ? { updated_at: text(body.updated_at) } : {}),
97
+ };
98
+ }
99
+ function entrySource(entry) {
100
+ const node = {};
101
+ for (const key of REVIEW_ENTRY_KEYS) {
102
+ const value = entry[key];
103
+ if (value !== undefined && value !== "")
104
+ node[key] = value;
105
+ }
106
+ return node;
107
+ }
108
+ /**
109
+ * Add a review to `episode.yaml`, or fill the keys an existing entry lacks.
110
+ * Comments, key order and every other field survive (yaml document model, as
111
+ * `appendLineageEdge`). Refuses a `reviews` key that is not a list.
112
+ */
113
+ export async function upsertEpisodeReview(input) {
114
+ if (!existsSync(input.episodeYamlPath)) {
115
+ throw new ReviewError("review_manifest_conflict", missingManifestRemedy(dirname(input.episodeYamlPath)));
116
+ }
117
+ const before = await readFile(input.episodeYamlPath, "utf8");
118
+ const doc = parseDocument(before);
119
+ if (doc.errors.length > 0) {
120
+ throw new ReviewError("review_manifest_conflict", `unreadable episode.yaml ${input.episodeYamlPath}: ${doc.errors[0].message}`);
121
+ }
122
+ if (!isMap(doc.contents)) {
123
+ throw new ReviewError("review_manifest_conflict", `episode.yaml ${input.episodeYamlPath} is not a mapping`);
124
+ }
125
+ const reviews = doc.get("reviews");
126
+ let created = false;
127
+ const filled = [];
128
+ let entry;
129
+ if (reviews === undefined || reviews === null) {
130
+ created = true;
131
+ entry = input.entry;
132
+ doc.set("reviews", [entrySource(entry)]);
133
+ }
134
+ else if (!isSeq(reviews)) {
135
+ throw new ReviewError("review_manifest_conflict", `reviews in ${input.episodeYamlPath} is not a list — refusing to overwrite`);
136
+ }
137
+ else {
138
+ const index = reviews.items.findIndex((item) => {
139
+ const read = toEpisodeReviewEntry(isMap(item) ? item.toJSON() : item?.value ?? item);
140
+ return read?.id === input.entry.id;
141
+ });
142
+ if (index < 0) {
143
+ created = true;
144
+ entry = input.entry;
145
+ doc.addIn(["reviews"], entrySource(entry));
146
+ }
147
+ else {
148
+ const item = reviews.items[index];
149
+ if (!isMap(item)) {
150
+ throw new ReviewError("review_manifest_conflict", `reviews[${index}] in ${input.episodeYamlPath} names review ${input.entry.id} as a scalar — refusing to rewrite it`);
151
+ }
152
+ for (const key of REVIEW_ENTRY_KEYS) {
153
+ const value = input.entry[key];
154
+ if (value === undefined || value === "")
155
+ continue;
156
+ const present = item.get(key);
157
+ if (present === undefined || present === null || present === "") {
158
+ item.set(key, value);
159
+ filled.push(key);
160
+ }
161
+ }
162
+ entry = toEpisodeReviewEntry(item.toJSON()) ?? input.entry;
163
+ }
164
+ }
165
+ const changed = created || filled.length > 0;
166
+ const wrote = changed && !input.dryRun;
167
+ if (wrote)
168
+ await writeFile(input.episodeYamlPath, doc.toString(), "utf8");
169
+ return { entry, created, filled, wrote, dryRun: input.dryRun === true };
170
+ }
171
+ async function wheelJson(fetchImpl, url, init) {
172
+ try {
173
+ const response = await fetchImpl(url, init);
174
+ let body = null;
175
+ try {
176
+ body = await response.json();
177
+ }
178
+ catch {
179
+ body = null;
180
+ }
181
+ return { ok: response.ok, status: response.status, body };
182
+ }
183
+ catch (error) {
184
+ return { ok: false, status: 0, body: null, error: error instanceof Error ? error.message : String(error) };
185
+ }
186
+ }
187
+ function failure(method, url, answer) {
188
+ if (answer.error)
189
+ return `medicine-wheel unreachable at ${url}: ${answer.error}`;
190
+ const detail = answer.body && typeof answer.body === "object" && typeof answer.body.error === "string"
191
+ ? ` — ${answer.body.error}`
192
+ : "";
193
+ return `${method} ${url}: HTTP ${answer.status}${detail}`;
194
+ }
195
+ function edgesFrom(payload) {
196
+ if (Array.isArray(payload))
197
+ return payload;
198
+ if (payload && typeof payload === "object") {
199
+ for (const key of ["edges", "data", "items"]) {
200
+ const value = payload[key];
201
+ if (Array.isArray(value))
202
+ return value;
203
+ }
204
+ }
205
+ return [];
206
+ }
207
+ /**
208
+ * The relationship type of an episode→review edge already on the wheel, when
209
+ * one exists. Never throws: an unreadable wheel answers undefined.
210
+ */
211
+ export async function existingReviewRelation(mwUrl, episodeNodeId, reviewId, options = {}) {
212
+ const listing = await wheelJson(options.fetchImpl ?? fetch, `${mwUrl.replace(/\/+$/, "")}/api/edges?limit=all`);
213
+ if (!listing.ok)
214
+ return undefined;
215
+ const nodeId = reviewNodeId(reviewId);
216
+ const edge = edgesFrom(listing.body).find((e) => String(e.from_id) === episodeNodeId && String(e.to_id) === nodeId);
217
+ return typeof edge?.relationship_type === "string" && edge.relationship_type ? edge.relationship_type : undefined;
218
+ }
219
+ /**
220
+ * Put the review node and the episode→review edge on the wheel. Creates the
221
+ * node when absent; when present, refreshes only `metadata.latest_version`
222
+ * (the wheel merges metadata), so a hand-written name and description stay.
223
+ */
224
+ export async function projectEpisodeReview(mwUrl, input, options = {}) {
225
+ const fetchImpl = options.fetchImpl ?? fetch;
226
+ const base = mwUrl.replace(/\/+$/, "");
227
+ const nodeId = reviewNodeId(input.review.id);
228
+ const edgeId = `${input.episodeNodeId}:${nodeId}`;
229
+ const projection = {
230
+ node: { id: nodeId, state: "pending" },
231
+ edge: { id: edgeId, state: "pending", relationship_type: input.relation },
232
+ };
233
+ const nodeUrl = `${base}/api/nodes/${encodeURIComponent(nodeId)}`;
234
+ const read = await wheelJson(fetchImpl, nodeUrl);
235
+ if (read.ok) {
236
+ const node = read.body?.node;
237
+ if (node?.metadata?.latest_version === input.review.latest_version) {
238
+ projection.node.state = "already-present";
239
+ }
240
+ else if (options.dryRun) {
241
+ projection.node.state = "skipped";
242
+ }
243
+ else {
244
+ const patched = await wheelJson(fetchImpl, nodeUrl, {
245
+ method: "PATCH",
246
+ headers: { "content-type": "application/json" },
247
+ body: JSON.stringify({ metadata: { latest_version: input.review.latest_version } }),
248
+ });
249
+ projection.node = patched.ok ? { id: nodeId, state: "refreshed" } : { id: nodeId, state: "pending", error: failure("PATCH", nodeUrl, patched) };
250
+ }
251
+ }
252
+ else if (read.status === 404) {
253
+ if (options.dryRun) {
254
+ projection.node.state = "skipped";
255
+ }
256
+ else {
257
+ const created = await wheelJson(fetchImpl, `${base}/api/nodes`, {
258
+ method: "POST",
259
+ headers: { "content-type": "application/json" },
260
+ body: JSON.stringify({
261
+ id: nodeId,
262
+ type: "knowledge",
263
+ name: `Review — ${input.review.title}`,
264
+ description: `A Miadi Review${input.review.channel ? ` of ${input.review.channel}` : ""}: ${input.review.title}.`,
265
+ direction: "east",
266
+ metadata: {
267
+ kind: REVIEW_NODE_KIND,
268
+ review_id: input.review.id,
269
+ latest_version: input.review.latest_version,
270
+ public_url: input.review.url,
271
+ ...(input.review.video_url ? { source_url: input.review.video_url } : {}),
272
+ service: "miadi-review",
273
+ },
274
+ }),
275
+ });
276
+ projection.node = created.ok ? { id: nodeId, state: "created" } : { id: nodeId, state: "pending", error: failure("POST", `${base}/api/nodes`, created) };
277
+ }
278
+ }
279
+ else {
280
+ projection.node = { id: nodeId, state: "pending", error: failure("GET", nodeUrl, read) };
281
+ }
282
+ // An edge to a node the wheel does not hold would dangle; wait for the node.
283
+ if (projection.node.state === "pending") {
284
+ projection.edge.error = "the review node is not on the wheel yet";
285
+ return projection;
286
+ }
287
+ const edgesUrl = `${base}/api/edges`;
288
+ // A bare list stops at the wheel's 100-row default, and POST replaces a pair
289
+ // it already holds: reading a page would overwrite an edge someone wrote by hand.
290
+ const listing = await wheelJson(fetchImpl, `${edgesUrl}?limit=all`);
291
+ if (!listing.ok) {
292
+ projection.edge.error = failure("GET", edgesUrl, listing);
293
+ return projection;
294
+ }
295
+ const existing = edgesFrom(listing.body).find((edge) => String(edge.from_id) === input.episodeNodeId && String(edge.to_id) === nodeId);
296
+ if (existing) {
297
+ projection.edge = { id: edgeId, state: "already-present", relationship_type: String(existing.relationship_type ?? input.relation) };
298
+ return projection;
299
+ }
300
+ if (options.dryRun) {
301
+ projection.edge.state = "skipped";
302
+ return projection;
303
+ }
304
+ const posted = await wheelJson(fetchImpl, edgesUrl, {
305
+ method: "POST",
306
+ headers: { "content-type": "application/json" },
307
+ body: JSON.stringify({
308
+ from_id: input.episodeNodeId,
309
+ to_id: nodeId,
310
+ relationship_type: input.relation,
311
+ strength: 1,
312
+ obligations: input.obligations,
313
+ }),
314
+ });
315
+ if (posted.ok && posted.body?.replaced === true) {
316
+ projection.edge = { id: edgeId, state: "pending", relationship_type: input.relation, error: "the wheel replaced an edge the listing did not show; check the edge by hand" };
317
+ }
318
+ else if (posted.ok)
319
+ projection.edge.state = "created";
320
+ else if (posted.status === 409)
321
+ projection.edge.state = "already-present";
322
+ else
323
+ projection.edge.error = failure("POST", edgesUrl, posted);
324
+ return projection;
325
+ }
326
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.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.12.2",
3
+ "version": "0.13.1",
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"
@@ -26,7 +26,7 @@
26
26
  "rispecs"
27
27
  ],
28
28
  "dependencies": {
29
- "@miadi/episodic-memory-schema": "^0.10.0",
29
+ "@miadi/episodic-memory-schema": "^0.11.0",
30
30
  "yaml": "^2.5.0"
31
31
  },
32
32
  "devDependencies": {