@miadi/inquiry-weave 0.16.6 → 0.17.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/artefact-dsl.d.ts +60 -0
- package/dist/artefact-dsl.d.ts.map +1 -0
- package/dist/artefact-dsl.js +138 -0
- package/dist/artefact-dsl.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/markdown-directives.d.ts +2 -0
- package/dist/markdown-directives.d.ts.map +1 -1
- package/dist/markdown-directives.js +23 -1
- package/dist/markdown-directives.js.map +1 -1
- package/dist/mcp-server.js +213 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/mint.d.ts +261 -1
- package/dist/mint.d.ts.map +1 -1
- package/dist/mint.js +565 -0
- package/dist/mint.js.map +1 -1
- package/dist/notebook.d.ts +88 -0
- package/dist/notebook.d.ts.map +1 -0
- package/dist/notebook.js +258 -0
- package/dist/notebook.js.map +1 -0
- package/dist/pde.d.ts +54 -0
- package/dist/pde.d.ts.map +1 -0
- package/dist/pde.js +165 -0
- package/dist/pde.js.map +1 -0
- package/dist/prototype.d.ts +90 -0
- package/dist/prototype.d.ts.map +1 -0
- package/dist/prototype.js +286 -0
- package/dist/prototype.js.map +1 -0
- package/dist/references.d.ts +2 -0
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +2 -0
- package/dist/references.js.map +1 -1
- package/dist/rise-dsl.d.ts +44 -0
- package/dist/rise-dsl.d.ts.map +1 -0
- package/dist/rise-dsl.js +99 -0
- package/dist/rise-dsl.js.map +1 -0
- package/dist/rise-workspaces.d.ts +34 -0
- package/dist/rise-workspaces.d.ts.map +1 -0
- package/dist/rise-workspaces.js +73 -0
- package/dist/rise-workspaces.js.map +1 -0
- package/dist/rispec.d.ts +72 -0
- package/dist/rispec.d.ts.map +1 -0
- package/dist/rispec.js +227 -0
- package/dist/rispec.js.map +1 -0
- package/dist/text-references.d.ts +3 -2
- package/dist/text-references.d.ts.map +1 -1
- package/dist/text-references.js +29 -3
- package/dist/text-references.js.map +1 -1
- package/dist/tracing.d.ts +95 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +302 -0
- package/dist/tracing.js.map +1 -0
- package/package.json +2 -2
package/dist/notebook.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The notebook seam — a Deep Diver notebook entering an episode, in the shape
|
|
3
|
+
* the review (jgwill/Miadi#630) and foundation (#713) seams set: one reusable
|
|
4
|
+
* `notebook:<uuid>` node on the wheel, one `chronicle:<episode>` →
|
|
5
|
+
* `notebook:<uuid>` edge whose relationship type names what the episode does
|
|
6
|
+
* with it (`cites` when nobody said), and an entry in `episode.yaml`'s
|
|
7
|
+
* `notebooks:` list keeping the episode's own record.
|
|
8
|
+
*
|
|
9
|
+
* Episodes 120, 140 and 550 wrote that list by hand before this seam existed
|
|
10
|
+
* (`/deepdive` step 6). The rules kept from the other seams make that safe:
|
|
11
|
+
* the manifest entry is written once and never overwritten (a later call
|
|
12
|
+
* fills missing keys only), one ordered node pair is one edge so a hand-made
|
|
13
|
+
* edge keeps its relation, and the wheel projection never throws — a wheel
|
|
14
|
+
* that is down answers `pending`. The notebook's files under
|
|
15
|
+
* `captures/notebook-<uuid>/` are read for their names and the README's
|
|
16
|
+
* title, never written. Ref: jgwill/miadi-orchestration-kit#80 (A1).
|
|
17
|
+
*/
|
|
18
|
+
import { readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
19
|
+
import { existsSync } from "node:fs";
|
|
20
|
+
import { dirname, join } from "node:path";
|
|
21
|
+
import { Scalar, isMap, isScalar, isSeq, parseDocument } from "yaml";
|
|
22
|
+
import { DEFAULT_NOTEBOOK_RELATION, NOTEBOOK_ENTRY_KEYS, NOTEBOOK_NODE_KIND, notebookFolder, notebookNodeId, notebookReference, parseNotebookRef, toEpisodeNotebookEntry, } from "@miadi/episodic-memory-schema";
|
|
23
|
+
import { missingManifestRemedy } from "./episode.js";
|
|
24
|
+
import { readmeTitle } from "./foundation.js";
|
|
25
|
+
import { edgesFrom, failure, wheelJson } from "./review.js";
|
|
26
|
+
export class NotebookError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
constructor(code, message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.code = code;
|
|
31
|
+
this.name = "NotebookError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Read the notebook an input names: its Gemini Notebook URL, `miadi-notebook:<uuid>`, `notebook:<uuid>` or a bare uuid. */
|
|
35
|
+
export function requireNotebookRef(raw) {
|
|
36
|
+
const ref = parseNotebookRef(raw);
|
|
37
|
+
if (ref)
|
|
38
|
+
return ref;
|
|
39
|
+
throw new NotebookError("invalid_notebook", `notebook '${String(raw)}' is not a Gemini Notebook address, a miadi-notebook: reference or a uuid`);
|
|
40
|
+
}
|
|
41
|
+
/** The folder a notebook's files live in, read for names and the README title. Never writes. */
|
|
42
|
+
export async function readNotebookFolder(episodeDir, id) {
|
|
43
|
+
const path = notebookFolder(id);
|
|
44
|
+
const dir = join(episodeDir, path);
|
|
45
|
+
try {
|
|
46
|
+
if (!(await stat(dir)).isDirectory())
|
|
47
|
+
return { files: [] };
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return { files: [] };
|
|
51
|
+
}
|
|
52
|
+
// Top-level files first, then what keep/ holds, each in name order.
|
|
53
|
+
const entries = (await readdir(dir, { withFileTypes: true })).filter((e) => !e.name.startsWith("."));
|
|
54
|
+
const files = entries.filter((e) => e.isFile()).map((e) => e.name).sort((a, b) => a.localeCompare(b));
|
|
55
|
+
if (entries.some((e) => e.isDirectory() && e.name === "keep")) {
|
|
56
|
+
const kept = (await readdir(join(dir, "keep"), { withFileTypes: true })).filter((e) => e.isFile() && !e.name.startsWith("."));
|
|
57
|
+
files.push(...kept.map((e) => `keep/${e.name}`).sort((a, b) => a.localeCompare(b)));
|
|
58
|
+
}
|
|
59
|
+
let title;
|
|
60
|
+
try {
|
|
61
|
+
title = readmeTitle(await readFile(join(dir, "README.md"), "utf8"));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
title = undefined;
|
|
65
|
+
}
|
|
66
|
+
return { path, ...(title ? { title } : {}), files };
|
|
67
|
+
}
|
|
68
|
+
function quoted(doc, value) {
|
|
69
|
+
const node = doc.createNode(value);
|
|
70
|
+
node.type = Scalar.QUOTE_SINGLE;
|
|
71
|
+
return node;
|
|
72
|
+
}
|
|
73
|
+
/** A value as the manifest writes it: strings quoted (#713 review, F13), lists as block sequences of quoted strings. */
|
|
74
|
+
function valueNode(doc, value) {
|
|
75
|
+
if (Array.isArray(value)) {
|
|
76
|
+
const seq = doc.createNode([]);
|
|
77
|
+
for (const item of value)
|
|
78
|
+
seq.items.push(quoted(doc, item));
|
|
79
|
+
return seq;
|
|
80
|
+
}
|
|
81
|
+
return quoted(doc, value);
|
|
82
|
+
}
|
|
83
|
+
function entryNode(doc, entry) {
|
|
84
|
+
const map = doc.createNode({});
|
|
85
|
+
for (const key of NOTEBOOK_ENTRY_KEYS) {
|
|
86
|
+
const value = entry[key];
|
|
87
|
+
if (value === undefined || value === "" || (Array.isArray(value) && value.length === 0))
|
|
88
|
+
continue;
|
|
89
|
+
map.set(key, valueNode(doc, value));
|
|
90
|
+
}
|
|
91
|
+
return map;
|
|
92
|
+
}
|
|
93
|
+
const sameEntry = (a, b) => a !== null && a.id === b.id;
|
|
94
|
+
/**
|
|
95
|
+
* Add a notebook to `episode.yaml`'s `notebooks:` list, or fill the keys an
|
|
96
|
+
* existing entry lacks. Comments, key order and every other field survive.
|
|
97
|
+
* Refuses a `notebooks` key that is not a list.
|
|
98
|
+
*/
|
|
99
|
+
export async function upsertEpisodeNotebook(input) {
|
|
100
|
+
if (!existsSync(input.episodeYamlPath)) {
|
|
101
|
+
throw new NotebookError("notebook_manifest_conflict", missingManifestRemedy(dirname(input.episodeYamlPath)));
|
|
102
|
+
}
|
|
103
|
+
const doc = parseDocument(await readFile(input.episodeYamlPath, "utf8"));
|
|
104
|
+
if (doc.errors.length > 0) {
|
|
105
|
+
throw new NotebookError("notebook_manifest_conflict", `unreadable episode.yaml ${input.episodeYamlPath}: ${doc.errors[0].message}`);
|
|
106
|
+
}
|
|
107
|
+
if (!isMap(doc.contents)) {
|
|
108
|
+
throw new NotebookError("notebook_manifest_conflict", `episode.yaml ${input.episodeYamlPath} is not a mapping`);
|
|
109
|
+
}
|
|
110
|
+
const list = doc.get("notebooks", true);
|
|
111
|
+
let created = false;
|
|
112
|
+
const filled = [];
|
|
113
|
+
let entry;
|
|
114
|
+
if (list === undefined || list === null || (isScalar(list) && (list.value === null || list.value === undefined))) {
|
|
115
|
+
created = true;
|
|
116
|
+
entry = input.entry;
|
|
117
|
+
const seq = doc.createNode([]);
|
|
118
|
+
seq.items.push(entryNode(doc, entry));
|
|
119
|
+
if (isScalar(list) && list.comment)
|
|
120
|
+
seq.comment = list.comment;
|
|
121
|
+
doc.set("notebooks", seq);
|
|
122
|
+
}
|
|
123
|
+
else if (!isSeq(list)) {
|
|
124
|
+
throw new NotebookError("notebook_manifest_conflict", `notebooks in ${input.episodeYamlPath} is not a list — refusing to overwrite`);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const index = list.items.findIndex((item) => sameEntry(toEpisodeNotebookEntry(isMap(item) ? item.toJSON() : item?.value ?? item), input.entry));
|
|
128
|
+
if (index < 0) {
|
|
129
|
+
created = true;
|
|
130
|
+
entry = input.entry;
|
|
131
|
+
list.items.push(entryNode(doc, entry));
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const item = list.items[index];
|
|
135
|
+
if (!isMap(item)) {
|
|
136
|
+
// A bare url written by hand already holds the notebook. Left as written.
|
|
137
|
+
entry = toEpisodeNotebookEntry(isScalar(item) ? item.value : item) ?? input.entry;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
for (const key of NOTEBOOK_ENTRY_KEYS) {
|
|
141
|
+
const value = input.entry[key];
|
|
142
|
+
if (value === undefined || value === "" || (Array.isArray(value) && value.length === 0))
|
|
143
|
+
continue;
|
|
144
|
+
const present = item.get(key);
|
|
145
|
+
if (present === undefined || present === null || present === "") {
|
|
146
|
+
item.set(key, valueNode(doc, value));
|
|
147
|
+
filled.push(key);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
entry = toEpisodeNotebookEntry(item.toJSON()) ?? input.entry;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const wrote = (created || filled.length > 0) && !input.dryRun;
|
|
155
|
+
if (wrote)
|
|
156
|
+
await writeFile(input.episodeYamlPath, doc.toString(), "utf8");
|
|
157
|
+
return { entry, created, filled, wrote, dryRun: input.dryRun === true };
|
|
158
|
+
}
|
|
159
|
+
/** The relationship type of an episode→notebook edge already on the wheel. Never throws. */
|
|
160
|
+
export async function existingNotebookRelation(mwUrl, episodeNodeId, nodeId, options = {}) {
|
|
161
|
+
const listing = await wheelJson(options.fetchImpl ?? fetch, `${mwUrl.replace(/\/+$/, "")}/api/edges?limit=all`);
|
|
162
|
+
if (!listing.ok)
|
|
163
|
+
return undefined;
|
|
164
|
+
const edge = edgesFrom(listing.body).find((e) => String(e.from_id) === episodeNodeId && String(e.to_id) === nodeId);
|
|
165
|
+
return typeof edge?.relationship_type === "string" && edge.relationship_type ? edge.relationship_type : undefined;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Put the notebook node and the episode→notebook edge on the wheel. A
|
|
169
|
+
* notebook is a `knowledge` node. When the node exists it is left as it is,
|
|
170
|
+
* so a hand-written name and description stay.
|
|
171
|
+
*/
|
|
172
|
+
export async function projectEpisodeNotebook(mwUrl, input, options = {}) {
|
|
173
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
174
|
+
const base = mwUrl.replace(/\/+$/, "");
|
|
175
|
+
const nodeId = notebookNodeId(input.entry.id);
|
|
176
|
+
const edgeId = `${input.episodeNodeId}:${nodeId}`;
|
|
177
|
+
const projection = {
|
|
178
|
+
node: { id: nodeId, state: "pending" },
|
|
179
|
+
edge: { id: edgeId, state: "pending", relationship_type: input.relation },
|
|
180
|
+
};
|
|
181
|
+
const nodeUrl = `${base}/api/nodes/${encodeURIComponent(nodeId)}`;
|
|
182
|
+
const read = await wheelJson(fetchImpl, nodeUrl);
|
|
183
|
+
if (read.ok) {
|
|
184
|
+
projection.node.state = "already-present";
|
|
185
|
+
}
|
|
186
|
+
else if (read.status === 404) {
|
|
187
|
+
if (options.dryRun) {
|
|
188
|
+
projection.node.state = "skipped";
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const title = input.title ?? `notebook ${input.entry.id.slice(0, 8)}`;
|
|
192
|
+
const created = await wheelJson(fetchImpl, `${base}/api/nodes`, {
|
|
193
|
+
method: "POST",
|
|
194
|
+
headers: { "content-type": "application/json" },
|
|
195
|
+
body: JSON.stringify({
|
|
196
|
+
id: nodeId,
|
|
197
|
+
type: "knowledge",
|
|
198
|
+
name: `Notebook — ${title}`,
|
|
199
|
+
description: `A Deep Diver notebook built for episode ${input.episodeFolder}: ${title}.`,
|
|
200
|
+
direction: "east",
|
|
201
|
+
metadata: {
|
|
202
|
+
kind: NOTEBOOK_NODE_KIND,
|
|
203
|
+
notebook_id: input.entry.id,
|
|
204
|
+
public_url: input.entry.url,
|
|
205
|
+
address: notebookReference(input.entry.id),
|
|
206
|
+
episode_path: input.episodeFolder,
|
|
207
|
+
...(input.entry.path ? { path: input.entry.path } : {}),
|
|
208
|
+
...(input.entry.made_by ? { made_by: input.entry.made_by } : {}),
|
|
209
|
+
...(input.entry.sources?.length ? { sources: input.entry.sources } : {}),
|
|
210
|
+
service: "gemini-notebook",
|
|
211
|
+
},
|
|
212
|
+
}),
|
|
213
|
+
});
|
|
214
|
+
projection.node = created.ok ? { id: nodeId, state: "created" } : { id: nodeId, state: "pending", error: failure("POST", `${base}/api/nodes`, created) };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
projection.node = { id: nodeId, state: "pending", error: failure("GET", nodeUrl, read) };
|
|
219
|
+
}
|
|
220
|
+
if (projection.node.state === "pending") {
|
|
221
|
+
projection.edge.error = "the notebook node is not on the wheel yet";
|
|
222
|
+
return projection;
|
|
223
|
+
}
|
|
224
|
+
const edgesUrl = `${base}/api/edges`;
|
|
225
|
+
// POST replaces a pair the wheel already holds: read the whole list first,
|
|
226
|
+
// so an edge someone wrote by hand is never overwritten.
|
|
227
|
+
const listing = await wheelJson(fetchImpl, `${edgesUrl}?limit=all`);
|
|
228
|
+
if (!listing.ok) {
|
|
229
|
+
projection.edge.error = failure("GET", edgesUrl, listing);
|
|
230
|
+
return projection;
|
|
231
|
+
}
|
|
232
|
+
const existing = edgesFrom(listing.body).find((edge) => String(edge.from_id) === input.episodeNodeId && String(edge.to_id) === nodeId);
|
|
233
|
+
if (existing) {
|
|
234
|
+
projection.edge = { id: edgeId, state: "already-present", relationship_type: String(existing.relationship_type ?? input.relation) };
|
|
235
|
+
return projection;
|
|
236
|
+
}
|
|
237
|
+
if (options.dryRun) {
|
|
238
|
+
projection.edge.state = "skipped";
|
|
239
|
+
return projection;
|
|
240
|
+
}
|
|
241
|
+
const posted = await wheelJson(fetchImpl, edgesUrl, {
|
|
242
|
+
method: "POST",
|
|
243
|
+
headers: { "content-type": "application/json" },
|
|
244
|
+
body: JSON.stringify({ from_id: input.episodeNodeId, to_id: nodeId, relationship_type: input.relation, strength: 1, obligations: [] }),
|
|
245
|
+
});
|
|
246
|
+
if (posted.ok && posted.body?.replaced === true) {
|
|
247
|
+
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" };
|
|
248
|
+
}
|
|
249
|
+
else if (posted.ok)
|
|
250
|
+
projection.edge.state = "created";
|
|
251
|
+
else if (posted.status === 409)
|
|
252
|
+
projection.edge.state = "already-present";
|
|
253
|
+
else
|
|
254
|
+
projection.edge.error = failure("POST", edgesUrl, posted);
|
|
255
|
+
return projection;
|
|
256
|
+
}
|
|
257
|
+
export { DEFAULT_NOTEBOOK_RELATION };
|
|
258
|
+
//# sourceMappingURL=notebook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook.js","sourceRoot":"","sources":["../src/notebook.ts"],"names":[],"mappings":"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"}
|
package/dist/pde.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The decompositions an episode holds (jgwill/Miadi#778): the episode's own
|
|
3
|
+
* `.pde/` read from disk, and the `pdes:` list in `episode.yaml` for a PDE
|
|
4
|
+
* kept in a repository. The contract is `@miadi/episodic-memory-schema`'s
|
|
5
|
+
* episode-pde; this module reads the folder and writes the list.
|
|
6
|
+
*/
|
|
7
|
+
import { type EpisodePdeEntry } from "@miadi/episodic-memory-schema";
|
|
8
|
+
export type PdeErrorCode = "invalid_pde" | "pde_manifest_conflict";
|
|
9
|
+
export declare class PdeError extends Error {
|
|
10
|
+
readonly code: PdeErrorCode;
|
|
11
|
+
constructor(code: PdeErrorCode, message: string);
|
|
12
|
+
}
|
|
13
|
+
export declare function requirePdeUuid(raw: unknown): string;
|
|
14
|
+
/** A PDE found in an episode's `.pde/` folder. */
|
|
15
|
+
export interface FolderPde {
|
|
16
|
+
uuid: string;
|
|
17
|
+
/** The folder's `YYMMDDHHmm`. */
|
|
18
|
+
stamp: string;
|
|
19
|
+
/** The folder, relative to the episode: `.pde/<stamp>--<uuid>` (children nest below their parent). */
|
|
20
|
+
path: string;
|
|
21
|
+
/** For a nested PDE, the uuid of the PDE it was decomposed from. */
|
|
22
|
+
parent?: string;
|
|
23
|
+
title?: string;
|
|
24
|
+
engine?: string;
|
|
25
|
+
model?: string;
|
|
26
|
+
/** When the decomposition was made, from `pde-<uuid>.json`. */
|
|
27
|
+
made?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Every PDE under `<episodeDir>/.pde`, parents before children, oldest first.
|
|
31
|
+
* A folder that does not carry miaco's `<stamp>--<uuid>` name is not a PDE and
|
|
32
|
+
* is not entered. Nothing outside the `.pde/` folder is read.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readEpisodePdeFolder(episodeDir: string): Promise<FolderPde[]>;
|
|
35
|
+
export interface UpsertEpisodePdeResult {
|
|
36
|
+
entry: EpisodePdeEntry;
|
|
37
|
+
created: boolean;
|
|
38
|
+
/** Keys an existing entry lacked and now has. */
|
|
39
|
+
filled: string[];
|
|
40
|
+
wrote: boolean;
|
|
41
|
+
dryRun: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Add a PDE to `episode.yaml`'s `pdes:` list, or fill the keys an existing
|
|
45
|
+
* entry for the same uuid lacks. Comments, key order and every other field
|
|
46
|
+
* survive. Refuses a `pdes` key that is not a list, and an entry whose path is
|
|
47
|
+
* absolute or climbs out.
|
|
48
|
+
*/
|
|
49
|
+
export declare function upsertEpisodePde(input: {
|
|
50
|
+
episodeYamlPath: string;
|
|
51
|
+
entry: EpisodePdeEntry;
|
|
52
|
+
dryRun?: boolean;
|
|
53
|
+
}): Promise<UpsertEpisodePdeResult>;
|
|
54
|
+
//# sourceMappingURL=pde.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pde.d.ts","sourceRoot":"","sources":["../src/pde.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAA;AAGtC,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,uBAAuB,CAAA;AAElE,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,YAAY;gBAAlB,IAAI,EAAE,YAAY,EAClC,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAInD;AAID,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,sGAAsG;IACtG,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAeD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA+BnF;AAID,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,eAAe,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,iDAAiD;IACjD,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAkBD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAwDpJ"}
|
package/dist/pde.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The decompositions an episode holds (jgwill/Miadi#778): the episode's own
|
|
3
|
+
* `.pde/` read from disk, and the `pdes:` list in `episode.yaml` for a PDE
|
|
4
|
+
* kept in a repository. The contract is `@miadi/episodic-memory-schema`'s
|
|
5
|
+
* episode-pde; this module reads the folder and writes the list.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, readdir, writeFile } from "node:fs/promises";
|
|
8
|
+
import { existsSync } from "node:fs";
|
|
9
|
+
import { dirname, join } from "node:path";
|
|
10
|
+
import { Scalar, isMap, isScalar, isSeq, parseDocument } from "yaml";
|
|
11
|
+
import { PDE_ENTRY_KEYS, isRelativePdePath, pdeFolderOf, pdeTitleOf, pdeUuidOf, toEpisodePdeEntry, } from "@miadi/episodic-memory-schema";
|
|
12
|
+
import { missingManifestRemedy } from "./episode.js";
|
|
13
|
+
export class PdeError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
constructor(code, message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.name = "PdeError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function requirePdeUuid(raw) {
|
|
22
|
+
const uuid = pdeUuidOf(raw);
|
|
23
|
+
if (!uuid)
|
|
24
|
+
throw new PdeError("invalid_pde", `'${String(raw)}' is not a PDE uuid or a miadi-pde: reference`);
|
|
25
|
+
return uuid;
|
|
26
|
+
}
|
|
27
|
+
const MAX_DEPTH = 5;
|
|
28
|
+
const str = (value) => (typeof value === "string" && value.trim() ? value.trim() : undefined);
|
|
29
|
+
async function readJson(file) {
|
|
30
|
+
try {
|
|
31
|
+
const parsed = JSON.parse(await readFile(file, "utf8"));
|
|
32
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Every PDE under `<episodeDir>/.pde`, parents before children, oldest first.
|
|
40
|
+
* A folder that does not carry miaco's `<stamp>--<uuid>` name is not a PDE and
|
|
41
|
+
* is not entered. Nothing outside the `.pde/` folder is read.
|
|
42
|
+
*/
|
|
43
|
+
export async function readEpisodePdeFolder(episodeDir) {
|
|
44
|
+
const out = [];
|
|
45
|
+
const walk = async (dir, rel, parent, depth) => {
|
|
46
|
+
if (depth > MAX_DEPTH)
|
|
47
|
+
return;
|
|
48
|
+
let names;
|
|
49
|
+
try {
|
|
50
|
+
names = (await readdir(dir, { withFileTypes: true })).filter((d) => d.isDirectory()).map((d) => d.name).sort();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
for (const name of names) {
|
|
56
|
+
const folder = pdeFolderOf(name);
|
|
57
|
+
if (!folder)
|
|
58
|
+
continue;
|
|
59
|
+
const path = `${rel}/${name}`;
|
|
60
|
+
const json = await readJson(join(dir, name, `pde-${folder.uuid}.json`));
|
|
61
|
+
const meta = await readJson(join(dir, name, "meta.json"));
|
|
62
|
+
const pde = { uuid: folder.uuid, stamp: folder.stamp, path, ...(parent ? { parent } : {}) };
|
|
63
|
+
const title = pdeTitleOf(json);
|
|
64
|
+
if (title)
|
|
65
|
+
pde.title = title;
|
|
66
|
+
const engine = str(json?.engine) ?? str(meta?.engine);
|
|
67
|
+
if (engine)
|
|
68
|
+
pde.engine = engine;
|
|
69
|
+
const model = str(json?.model) ?? str(meta?.model);
|
|
70
|
+
if (model)
|
|
71
|
+
pde.model = model;
|
|
72
|
+
const made = str(json?.timestamp) ?? str(meta?.created_at);
|
|
73
|
+
if (made)
|
|
74
|
+
pde.made = made;
|
|
75
|
+
out.push(pde);
|
|
76
|
+
await walk(join(dir, name), path, folder.uuid, depth + 1);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
await walk(join(episodeDir, ".pde"), ".pde", undefined, 1);
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
function quoted(doc, value) {
|
|
83
|
+
const node = doc.createNode(value);
|
|
84
|
+
node.type = Scalar.QUOTE_SINGLE;
|
|
85
|
+
return node;
|
|
86
|
+
}
|
|
87
|
+
function entryNode(doc, entry) {
|
|
88
|
+
const map = doc.createNode({});
|
|
89
|
+
for (const key of PDE_ENTRY_KEYS) {
|
|
90
|
+
const value = entry[key];
|
|
91
|
+
if (value === undefined || value === "")
|
|
92
|
+
continue;
|
|
93
|
+
map.set(key, quoted(doc, value));
|
|
94
|
+
}
|
|
95
|
+
return map;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Add a PDE to `episode.yaml`'s `pdes:` list, or fill the keys an existing
|
|
99
|
+
* entry for the same uuid lacks. Comments, key order and every other field
|
|
100
|
+
* survive. Refuses a `pdes` key that is not a list, and an entry whose path is
|
|
101
|
+
* absolute or climbs out.
|
|
102
|
+
*/
|
|
103
|
+
export async function upsertEpisodePde(input) {
|
|
104
|
+
if (input.entry.path !== undefined && !isRelativePdePath(input.entry.path)) {
|
|
105
|
+
throw new PdeError("invalid_pde", `path '${input.entry.path}' must be relative to its repository or to the episode folder`);
|
|
106
|
+
}
|
|
107
|
+
if (!existsSync(input.episodeYamlPath)) {
|
|
108
|
+
throw new PdeError("pde_manifest_conflict", missingManifestRemedy(dirname(input.episodeYamlPath)));
|
|
109
|
+
}
|
|
110
|
+
const doc = parseDocument(await readFile(input.episodeYamlPath, "utf8"));
|
|
111
|
+
if (doc.errors.length > 0) {
|
|
112
|
+
throw new PdeError("pde_manifest_conflict", `unreadable episode.yaml ${input.episodeYamlPath}: ${doc.errors[0].message}`);
|
|
113
|
+
}
|
|
114
|
+
if (!isMap(doc.contents)) {
|
|
115
|
+
throw new PdeError("pde_manifest_conflict", `episode.yaml ${input.episodeYamlPath} is not a mapping`);
|
|
116
|
+
}
|
|
117
|
+
const list = doc.get("pdes", true);
|
|
118
|
+
let created = false;
|
|
119
|
+
const filled = [];
|
|
120
|
+
let entry;
|
|
121
|
+
if (list === undefined || list === null || (isScalar(list) && (list.value === null || list.value === undefined))) {
|
|
122
|
+
created = true;
|
|
123
|
+
entry = input.entry;
|
|
124
|
+
const seq = doc.createNode([]);
|
|
125
|
+
seq.items.push(entryNode(doc, entry));
|
|
126
|
+
if (isScalar(list) && list.comment)
|
|
127
|
+
seq.comment = list.comment;
|
|
128
|
+
doc.set("pdes", seq);
|
|
129
|
+
}
|
|
130
|
+
else if (!isSeq(list)) {
|
|
131
|
+
throw new PdeError("pde_manifest_conflict", `pdes in ${input.episodeYamlPath} is not a list — refusing to overwrite`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const index = list.items.findIndex((item) => toEpisodePdeEntry(isMap(item) ? item.toJSON() : item)?.uuid === input.entry.uuid);
|
|
135
|
+
if (index < 0) {
|
|
136
|
+
created = true;
|
|
137
|
+
entry = input.entry;
|
|
138
|
+
list.items.push(entryNode(doc, entry));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const item = list.items[index];
|
|
142
|
+
if (!isMap(item)) {
|
|
143
|
+
entry = input.entry;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
for (const key of PDE_ENTRY_KEYS) {
|
|
147
|
+
const value = input.entry[key];
|
|
148
|
+
if (value === undefined || value === "")
|
|
149
|
+
continue;
|
|
150
|
+
const present = item.get(key);
|
|
151
|
+
if (present === undefined || present === null || present === "") {
|
|
152
|
+
item.set(key, quoted(doc, value));
|
|
153
|
+
filled.push(key);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
entry = toEpisodePdeEntry(item.toJSON()) ?? input.entry;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const wrote = (created || filled.length > 0) && !input.dryRun;
|
|
161
|
+
if (wrote)
|
|
162
|
+
await writeFile(input.episodeYamlPath, doc.toString(), "utf8");
|
|
163
|
+
return { entry, created, filled, wrote, dryRun: input.dryRun === true };
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=pde.js.map
|
package/dist/pde.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pde.js","sourceRoot":"","sources":["../src/pde.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The prototype seam — a prototype entering an episode, in the shape the
|
|
3
|
+
* review (jgwill/Miadi#630) and foundation (#713) seams set: one reusable
|
|
4
|
+
* `prototype:<slug>` node on the wheel, one `chronicle:<episode>` →
|
|
5
|
+
* `prototype:<slug>` edge whose relationship type names what the episode does
|
|
6
|
+
* with it (`is-prototyped-in` when nobody said), and an entry in
|
|
7
|
+
* `episode.yaml`'s `prototypes:` list.
|
|
8
|
+
*
|
|
9
|
+
* Two addresses, two reaches. The published address goes in the manifest
|
|
10
|
+
* and on the node (`public_url`). The editing address (a v0 chat, say) goes
|
|
11
|
+
* in the node's metadata only (`editor_url`) and is handed out by the door to
|
|
12
|
+
* a viewer who may edit the episode; it is never written in `episode.yaml`,
|
|
13
|
+
* which is served to every reader of the episode. Rules kept from the other
|
|
14
|
+
* seams: the manifest entry is written once and never overwritten, one
|
|
15
|
+
* ordered node pair is one edge, and the wheel projection never throws.
|
|
16
|
+
* Ref: jgwill/Miadi#769 (A2), jgwill/miadi-orchestration-kit#80.
|
|
17
|
+
*/
|
|
18
|
+
import { DEFAULT_PROTOTYPE_RELATION, type EpisodePrototypeEntry } from "@miadi/episodic-memory-schema";
|
|
19
|
+
export type PrototypeErrorCode = "invalid_prototype" | "prototype_manifest_conflict";
|
|
20
|
+
export declare class PrototypeError extends Error {
|
|
21
|
+
readonly code: PrototypeErrorCode;
|
|
22
|
+
constructor(code: PrototypeErrorCode, message: string);
|
|
23
|
+
}
|
|
24
|
+
/** The slug an input names: a slug or `miadi-prototype:<slug>`. */
|
|
25
|
+
export declare function requirePrototypeSlug(raw: unknown): string;
|
|
26
|
+
/** The published address an input names, or a refusal. */
|
|
27
|
+
export declare function requirePrototypeUrl(raw: unknown): string;
|
|
28
|
+
/** A v0 chat page is where a prototype is edited, never where it is published. */
|
|
29
|
+
export declare function looksLikeEditor(url: string): boolean;
|
|
30
|
+
/** The published and the editing address are two doors; one URL cannot be both. */
|
|
31
|
+
export declare function assertDistinctPrototypeAddresses(url: string, editor: string | undefined): void;
|
|
32
|
+
/** The editing address, when given: https, kept off the manifest. */
|
|
33
|
+
export declare function optionalEditorUrl(raw: unknown): string | undefined;
|
|
34
|
+
export interface UpsertEpisodePrototypeResult {
|
|
35
|
+
entry: EpisodePrototypeEntry;
|
|
36
|
+
created: boolean;
|
|
37
|
+
filled: string[];
|
|
38
|
+
wrote: boolean;
|
|
39
|
+
dryRun: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Add a prototype to `episode.yaml`'s `prototypes:` list, or fill the keys an
|
|
43
|
+
* existing entry lacks. Comments, key order and every other field survive.
|
|
44
|
+
* Refuses a `prototypes` key that is not a list. Never writes an editing address.
|
|
45
|
+
*/
|
|
46
|
+
export declare function upsertEpisodePrototype(input: {
|
|
47
|
+
episodeYamlPath: string;
|
|
48
|
+
entry: EpisodePrototypeEntry;
|
|
49
|
+
dryRun?: boolean;
|
|
50
|
+
}): Promise<UpsertEpisodePrototypeResult>;
|
|
51
|
+
export type PrototypeProjectionState = "created" | "refreshed" | "already-present" | "skipped" | "pending";
|
|
52
|
+
export interface PrototypeProjection {
|
|
53
|
+
node: {
|
|
54
|
+
id: string;
|
|
55
|
+
state: PrototypeProjectionState;
|
|
56
|
+
error?: string;
|
|
57
|
+
};
|
|
58
|
+
edge: {
|
|
59
|
+
id: string;
|
|
60
|
+
state: PrototypeProjectionState;
|
|
61
|
+
relationship_type: string;
|
|
62
|
+
error?: string;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** The relationship type of an episode→prototype edge already on the wheel. Never throws. */
|
|
66
|
+
export declare function existingPrototypeRelation(mwUrl: string, episodeNodeId: string, nodeId: string, options?: {
|
|
67
|
+
fetchImpl?: typeof fetch;
|
|
68
|
+
}): Promise<string | undefined>;
|
|
69
|
+
/** The editing address a prototype node holds, for a viewer the door has already checked. Never throws. */
|
|
70
|
+
export declare function prototypeEditorUrl(mwUrl: string, slug: string, options?: {
|
|
71
|
+
fetchImpl?: typeof fetch;
|
|
72
|
+
}): Promise<string | undefined>;
|
|
73
|
+
/**
|
|
74
|
+
* Put the prototype node and the episode→prototype edge on the wheel. A
|
|
75
|
+
* prototype is a `knowledge` node. When the node exists, only an editing
|
|
76
|
+
* address it lacks is added, so a hand-written name and description stay.
|
|
77
|
+
*/
|
|
78
|
+
export declare function projectEpisodePrototype(mwUrl: string, input: {
|
|
79
|
+
episodeNodeId: string;
|
|
80
|
+
episodeFolder: string;
|
|
81
|
+
entry: EpisodePrototypeEntry;
|
|
82
|
+
/** Kept in the node's metadata only. */
|
|
83
|
+
editor?: string;
|
|
84
|
+
relation: string;
|
|
85
|
+
}, options?: {
|
|
86
|
+
fetchImpl?: typeof fetch;
|
|
87
|
+
dryRun?: boolean;
|
|
88
|
+
}): Promise<PrototypeProjection>;
|
|
89
|
+
export { DEFAULT_PROTOTYPE_RELATION };
|
|
90
|
+
//# sourceMappingURL=prototype.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prototype.d.ts","sourceRoot":"","sources":["../src/prototype.ts"],"names":[],"mappings":"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"}
|