@miadi/inquiry-weave 0.6.8 → 0.7.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Miadi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Attention-node projection — make "what needs a human" visible on the wheel.
3
+ *
4
+ * Mirrors episode-node.ts: the vessel's `attention.json` stays authoritative;
5
+ * each item projects as ONE dedicated node (`attention:<episode>/<item-id>`),
6
+ * riding `knowledge` facing SOUTH — a decision ask is consent work. Per-item
7
+ * nodes are deliberate: medicine-wheel PATCH replaces the whole metadata
8
+ * object (storage-provider jsonl.ts `metadata: patch.metadata`, no merge), so
9
+ * items sharing a node would race every concurrent writer; one item, one
10
+ * writer, one node. forgewright's chronicle view is wheel-fed only, so this
11
+ * projection IS how attention reaches ilex.
12
+ *
13
+ * POST upserts by id on medicine-wheel ≥0.5.0, so registration preflights GET
14
+ * and UPDATES an existing node via PATCH instead of silently overwriting.
15
+ * Fail-open boundary exactly like registerEpisodeNode: network failure
16
+ * resolves to `pending`, never a throw — the file write upstream must never
17
+ * be lost to a wheel outage.
18
+ */
19
+ import type { AttentionItem } from "@miadi/episodic-memory-schema";
20
+ import { ATTENTION_SCHEMA_VERSION } from "@miadi/episodic-memory-schema";
21
+ export interface AttentionNodeRecord {
22
+ id: string;
23
+ type: "knowledge";
24
+ name: string;
25
+ description: string;
26
+ direction: "south";
27
+ metadata: {
28
+ contract: "miadi.artifact-ref.v1";
29
+ kind: "attention";
30
+ schema_version: typeof ATTENTION_SCHEMA_VERSION;
31
+ root: "MIADI_CHRONICLE_ROOT";
32
+ relative_path: string;
33
+ parent_id: string;
34
+ item_id: string;
35
+ state: "open" | "answered";
36
+ asked?: string;
37
+ unlocks?: string;
38
+ answer?: string;
39
+ answered_at?: string;
40
+ };
41
+ }
42
+ export type AttentionNodeState = "registered" | "updated" | "pending";
43
+ export interface AttentionNodeOutcome {
44
+ state: AttentionNodeState;
45
+ node_id: string;
46
+ /** True only when a read-back confirmed the stored state matches the item. */
47
+ verified: boolean;
48
+ error?: string;
49
+ }
50
+ export declare function attentionNodeId(episodeName: string, itemId: string): string;
51
+ export declare function projectAttentionNode(episodeName: string, item: AttentionItem): AttentionNodeRecord;
52
+ export interface RegisterAttentionNodeOptions {
53
+ fetchImpl?: typeof fetch;
54
+ }
55
+ /**
56
+ * Create or update the wheel node for one item, then read it back.
57
+ * `verified: true` means the wheel now SERVES the item's state — reached,
58
+ * not merely configured.
59
+ */
60
+ export declare function registerAttentionNode(mwUrl: string, episodeName: string, item: AttentionItem, options?: RegisterAttentionNodeOptions): Promise<AttentionNodeOutcome>;
61
+ export interface SyncAttentionOutcome {
62
+ outcomes: AttentionNodeOutcome[];
63
+ registered: number;
64
+ updated: number;
65
+ pending: number;
66
+ verified: number;
67
+ }
68
+ /** Project every item of one episode; never throws past its boundary. */
69
+ export declare function syncEpisodeAttention(mwUrl: string, episodeName: string, items: readonly AttentionItem[], options?: RegisterAttentionNodeOptions): Promise<SyncAttentionOutcome>;
70
+ //# sourceMappingURL=attention-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-node.d.ts","sourceRoot":"","sources":["../src/attention-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAExE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE;QACR,QAAQ,EAAE,uBAAuB,CAAA;QACjC,IAAI,EAAE,WAAW,CAAA;QACjB,cAAc,EAAE,OAAO,wBAAwB,CAAA;QAC/C,IAAI,EAAE,sBAAsB,CAAA;QAC5B,aAAa,EAAE,MAAM,CAAA;QACrB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;CACF;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAA;AAErE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,kBAAkB,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,GAClB,mBAAmB,CAuBrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAgBD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,oBAAoB,CAAC,CAwG/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,yEAAyE;AACzE,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,oBAAoB,CAAC,CAY/B"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Attention-node projection — make "what needs a human" visible on the wheel.
3
+ *
4
+ * Mirrors episode-node.ts: the vessel's `attention.json` stays authoritative;
5
+ * each item projects as ONE dedicated node (`attention:<episode>/<item-id>`),
6
+ * riding `knowledge` facing SOUTH — a decision ask is consent work. Per-item
7
+ * nodes are deliberate: medicine-wheel PATCH replaces the whole metadata
8
+ * object (storage-provider jsonl.ts `metadata: patch.metadata`, no merge), so
9
+ * items sharing a node would race every concurrent writer; one item, one
10
+ * writer, one node. forgewright's chronicle view is wheel-fed only, so this
11
+ * projection IS how attention reaches ilex.
12
+ *
13
+ * POST upserts by id on medicine-wheel ≥0.5.0, so registration preflights GET
14
+ * and UPDATES an existing node via PATCH instead of silently overwriting.
15
+ * Fail-open boundary exactly like registerEpisodeNode: network failure
16
+ * resolves to `pending`, never a throw — the file write upstream must never
17
+ * be lost to a wheel outage.
18
+ */
19
+ import { ATTENTION_SCHEMA_VERSION } from "@miadi/episodic-memory-schema";
20
+ export function attentionNodeId(episodeName, itemId) {
21
+ return `attention:${episodeName}/${itemId}`;
22
+ }
23
+ export function projectAttentionNode(episodeName, item) {
24
+ const metadata = {
25
+ contract: "miadi.artifact-ref.v1",
26
+ kind: "attention",
27
+ schema_version: ATTENTION_SCHEMA_VERSION,
28
+ root: "MIADI_CHRONICLE_ROOT",
29
+ relative_path: `${episodeName}/attention.json`,
30
+ parent_id: `chronicle:${episodeName}`,
31
+ item_id: item.id,
32
+ state: item.state,
33
+ };
34
+ if (item.asked)
35
+ metadata.asked = item.asked;
36
+ if (item.unlocks)
37
+ metadata.unlocks = item.unlocks;
38
+ if (item.answer)
39
+ metadata.answer = item.answer;
40
+ if (item.answered_at)
41
+ metadata.answered_at = item.answered_at;
42
+ return {
43
+ id: attentionNodeId(episodeName, item.id),
44
+ type: "knowledge",
45
+ name: item.question,
46
+ description: item.unlocks ? `unlocks: ${item.unlocks}` : "",
47
+ direction: "south",
48
+ metadata,
49
+ };
50
+ }
51
+ function describeFailure(error) {
52
+ return error instanceof Error ? error.message : String(error);
53
+ }
54
+ async function readErrorBody(response) {
55
+ try {
56
+ const body = (await response.json());
57
+ if (body && typeof body.error === "string")
58
+ return body.error;
59
+ }
60
+ catch {
61
+ // Non-JSON body — the status line is all we can report.
62
+ }
63
+ return "";
64
+ }
65
+ /**
66
+ * Create or update the wheel node for one item, then read it back.
67
+ * `verified: true` means the wheel now SERVES the item's state — reached,
68
+ * not merely configured.
69
+ */
70
+ export async function registerAttentionNode(mwUrl, episodeName, item, options = {}) {
71
+ const fetchImpl = options.fetchImpl ?? fetch;
72
+ const base = mwUrl.replace(/\/+$/, "");
73
+ const record = projectAttentionNode(episodeName, item);
74
+ const node_id = record.id;
75
+ const nodeUrl = `${base}/api/nodes/${encodeURIComponent(node_id)}`;
76
+ let existing;
77
+ try {
78
+ existing = await fetchImpl(nodeUrl);
79
+ }
80
+ catch (error) {
81
+ return {
82
+ state: "pending",
83
+ node_id,
84
+ verified: false,
85
+ error: `medicine-wheel unreachable at ${base}: ${describeFailure(error)}`,
86
+ };
87
+ }
88
+ let state;
89
+ if (existing.ok) {
90
+ // Full-metadata PATCH by design: the store replaces, so we always send the
91
+ // complete projection — never a partial that would erase sibling fields.
92
+ let patched;
93
+ try {
94
+ patched = await fetchImpl(nodeUrl, {
95
+ method: "PATCH",
96
+ headers: { "content-type": "application/json" },
97
+ body: JSON.stringify({
98
+ name: record.name,
99
+ description: record.description,
100
+ metadata: record.metadata,
101
+ }),
102
+ });
103
+ }
104
+ catch (error) {
105
+ return {
106
+ state: "pending",
107
+ node_id,
108
+ verified: false,
109
+ error: `PATCH ${nodeUrl}: ${describeFailure(error)}`,
110
+ };
111
+ }
112
+ if (!patched.ok) {
113
+ const detail = await readErrorBody(patched);
114
+ return {
115
+ state: "pending",
116
+ node_id,
117
+ verified: false,
118
+ error: `PATCH ${nodeUrl}: HTTP ${patched.status}${detail ? ` — ${detail}` : ""}`,
119
+ };
120
+ }
121
+ state = "updated";
122
+ }
123
+ else if (existing.status === 404) {
124
+ let created;
125
+ try {
126
+ created = await fetchImpl(`${base}/api/nodes`, {
127
+ method: "POST",
128
+ headers: { "content-type": "application/json" },
129
+ body: JSON.stringify(record),
130
+ });
131
+ }
132
+ catch (error) {
133
+ return {
134
+ state: "pending",
135
+ node_id,
136
+ verified: false,
137
+ error: `medicine-wheel unreachable at ${base}: ${describeFailure(error)}`,
138
+ };
139
+ }
140
+ if (!created.ok) {
141
+ const detail = await readErrorBody(created);
142
+ return {
143
+ state: "pending",
144
+ node_id,
145
+ verified: false,
146
+ error: `POST ${base}/api/nodes: HTTP ${created.status}${detail ? ` — ${detail}` : ""}`,
147
+ };
148
+ }
149
+ state = "registered";
150
+ }
151
+ else {
152
+ const detail = await readErrorBody(existing);
153
+ return {
154
+ state: "pending",
155
+ node_id,
156
+ verified: false,
157
+ error: `GET ${nodeUrl}: HTTP ${existing.status}${detail ? ` — ${detail}` : ""}`,
158
+ };
159
+ }
160
+ // The verify leg — the boot-law applied to the write path.
161
+ try {
162
+ const back = await fetchImpl(nodeUrl);
163
+ if (!back.ok)
164
+ return { state, node_id, verified: false, error: `verify GET: HTTP ${back.status}` };
165
+ const body = (await back.json());
166
+ const served = body.node?.metadata?.state ?? body.metadata?.state;
167
+ if (served === item.state)
168
+ return { state, node_id, verified: true };
169
+ return {
170
+ state,
171
+ node_id,
172
+ verified: false,
173
+ error: `verify: wheel serves state=${String(served)}, item is ${item.state}`,
174
+ };
175
+ }
176
+ catch (error) {
177
+ return { state, node_id, verified: false, error: `verify GET: ${describeFailure(error)}` };
178
+ }
179
+ }
180
+ /** Project every item of one episode; never throws past its boundary. */
181
+ export async function syncEpisodeAttention(mwUrl, episodeName, items, options = {}) {
182
+ const outcomes = [];
183
+ for (const item of items) {
184
+ outcomes.push(await registerAttentionNode(mwUrl, episodeName, item, options));
185
+ }
186
+ return {
187
+ outcomes,
188
+ registered: outcomes.filter((o) => o.state === "registered").length,
189
+ updated: outcomes.filter((o) => o.state === "updated").length,
190
+ pending: outcomes.filter((o) => o.state === "pending").length,
191
+ verified: outcomes.filter((o) => o.verified).length,
192
+ };
193
+ }
194
+ //# sourceMappingURL=attention-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-node.js","sourceRoot":"","sources":["../src/attention-node.ts"],"names":[],"mappings":"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"}
package/dist/episode.d.ts CHANGED
@@ -33,10 +33,12 @@ export declare function episodeManifestPath(episodeDir: string): string;
33
33
  * Whether an episode directory carries its manifest.
34
34
  *
35
35
  * resolveEpisode() answers by DIRECTORY NAME alone, so a folder made by hand
36
- * resolves — and holds its number — while every reader downstream (register,
37
- * lineage, medicine-wheel, app/chronicle) reads the manifest and finds nothing.
36
+ * resolves — and holds its number — while lineage and app/chronicle read the
37
+ * manifest and find nothing. Note which consumers are NOT in that list: the
38
+ * medicine wheel derives its card from the directory name too, so registration
39
+ * succeeds on a manifest-less vessel and the wheel then reports it healthy.
38
40
  * Consumers that need the manifest must ask this separately; the two questions
39
- * are not the same question.
41
+ * are not the same question, and the wheel answering yes is not evidence.
40
42
  */
41
43
  export declare function hasEpisodeManifest(episodeDir: string): boolean;
42
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"episode.d.ts","sourceRoot":"","sources":["../src/episode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD,qBAAa,qBAAsB,SAAQ,sBAAsB;aAG7C,UAAU,EAAE,MAAM,EAAE;gBADpC,GAAG,EAAE,MAAM,EACK,UAAU,EAAE,MAAM,EAAE;CAOvC;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAMhG;AAkBD;;GAEG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CA0B1B;AAED,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AAEvD,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMhE;AAED,kFAAkF;AAClF,wBAAsB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlF;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAI9D;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CA0B1B"}
1
+ {"version":3,"file":"episode.d.ts","sourceRoot":"","sources":["../src/episode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD,qBAAa,qBAAsB,SAAQ,sBAAsB;aAG7C,UAAU,EAAE,MAAM,EAAE;gBADpC,GAAG,EAAE,MAAM,EACK,UAAU,EAAE,MAAM,EAAE;CAOvC;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAMhG;AAoCD;;GAEG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CAkC1B;AAED,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AAEvD,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,kFAAkF;AAClF,wBAAsB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlF;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAI9D;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CA0B1B"}
package/dist/episode.js CHANGED
@@ -41,24 +41,53 @@ function identityFromDir(chronicleRoot, dir) {
41
41
  path: inside ? relative(chronicleRoot, dir) : dir,
42
42
  };
43
43
  }
44
+ /**
45
+ * Every directory-ish entry, symlinks included.
46
+ *
47
+ * `isDirectory()` is false for a symlink to a directory, so a symlinked episode
48
+ * was invisible to resolution while being a perfectly ordinary episode to every
49
+ * reader that opened it — and scaffolding then happily minted a SECOND directory
50
+ * carrying the same number, manufacturing the ambiguity that nothing can repair.
51
+ */
44
52
  async function listEpisodeDirs(chronicleRoot) {
45
53
  const entries = await readdir(chronicleRoot, { withFileTypes: true });
46
- return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
54
+ return entries
55
+ .filter((entry) => {
56
+ if (entry.isDirectory())
57
+ return true;
58
+ if (!entry.isSymbolicLink())
59
+ return false;
60
+ try {
61
+ return statSync(join(chronicleRoot, entry.name)).isDirectory();
62
+ }
63
+ catch {
64
+ return false; // dangling link: nothing is there to be an episode
65
+ }
66
+ })
67
+ .map((entry) => entry.name);
47
68
  }
48
69
  /**
49
70
  * Resolve an episode reference: a number ("126"), a directory name, or a path.
50
71
  */
51
72
  export async function resolveEpisode(chronicleRoot, ref) {
52
73
  const trimmed = ref.trim();
53
- if (/^\d+$/.test(trimmed)) {
54
- const wanted = Number(trimmed);
74
+ // `ep<NNN>` is the form the episode-addressing spec owns, and the one
75
+ // `voice_resolve_episode` documents itself as accepting. This resolver took a bare
76
+ // number or a path and rejected it outright — so an agent holding the canonical
77
+ // address got `episode not found` from the verb and fell back to hand-rolling the
78
+ // git and curl the verb exists to replace. Measured 2026-08-14 (ep325):
79
+ // `status --episode ep325` failed while `--episode 325` resolved the same vessel.
80
+ // Two resolvers in one platform must not disagree about the address.
81
+ const numeric = /^ep(\d+)$/i.exec(trimmed)?.[1] ?? trimmed;
82
+ if (/^\d+$/.test(numeric)) {
83
+ const wanted = Number(numeric);
55
84
  const matches = (await listEpisodeDirs(chronicleRoot)).filter((name) => parseEpisodeName(name).number === wanted);
56
85
  if (matches.length === 1) {
57
86
  return identityFromDir(chronicleRoot, join(chronicleRoot, matches[0]));
58
87
  }
59
88
  if (matches.length > 1)
60
89
  throw new AmbiguousEpisodeError(trimmed, matches.sort());
61
- throw new EpisodeResolutionError(`no episode numbered ${trimmed} under ${chronicleRoot}`);
90
+ throw new EpisodeResolutionError(`no episode numbered ${numeric} under ${chronicleRoot}`);
62
91
  }
63
92
  const candidates = [
64
93
  isAbsolute(trimmed) ? trimmed : undefined,
@@ -81,10 +110,12 @@ export function episodeManifestPath(episodeDir) {
81
110
  * Whether an episode directory carries its manifest.
82
111
  *
83
112
  * resolveEpisode() answers by DIRECTORY NAME alone, so a folder made by hand
84
- * resolves — and holds its number — while every reader downstream (register,
85
- * lineage, medicine-wheel, app/chronicle) reads the manifest and finds nothing.
113
+ * resolves — and holds its number — while lineage and app/chronicle read the
114
+ * manifest and find nothing. Note which consumers are NOT in that list: the
115
+ * medicine wheel derives its card from the directory name too, so registration
116
+ * succeeds on a manifest-less vessel and the wheel then reports it healthy.
86
117
  * Consumers that need the manifest must ask this separately; the two questions
87
- * are not the same question.
118
+ * are not the same question, and the wheel answering yes is not evidence.
88
119
  */
89
120
  export function hasEpisodeManifest(episodeDir) {
90
121
  return existsSync(episodeManifestPath(episodeDir));
@@ -96,8 +127,10 @@ export function hasEpisodeManifest(episodeDir) {
96
127
  */
97
128
  export function missingManifestRemedy(episodeDir) {
98
129
  return (`${episodeManifestPath(episodeDir)} is missing — the directory resolves by name but carries no manifest, ` +
99
- `so it is invisible to register, lineage, the medicine wheel and /chronicle. ` +
100
- `Give it one in place with: mkepisode --adopt -n <number> -t <title> -g <goal> -r <reference>`);
130
+ `so lineage cannot be authored on it and /chronicle cannot render it. ` +
131
+ `(The medicine wheel is NOT a manifest reader: it derives a card from the directory name, ` +
132
+ `so this vessel can be registered and read healthy while staying unreadable to everything else.) ` +
133
+ `Give it a manifest in place with: mkepisode --adopt -n <number> -t <title> -g <goal> -r <reference>`);
101
134
  }
102
135
  /** Max existing episode number + 1 — the only safe rule given wild duplicates. */
103
136
  export async function allocateEpisodeNumber(chronicleRoot) {
@@ -1 +1 @@
1
- {"version":3,"file":"episode.js","sourceRoot":"","sources":["../src/episode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"episode.js","sourceRoot":"","sources":["../src/episode.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export * from "./lineage.js";
11
11
  export * from "./status.js";
12
12
  export * from "./register.js";
13
13
  export * from "./episode-node.js";
14
+ export * from "./attention-node.js";
14
15
  export * from "./catalog.js";
15
16
  export * from "./story-library.js";
16
17
  export { runCli, type RunCliOptions, type CliStreams } from "./cli.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA"}
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ export * from "./lineage.js";
11
11
  export * from "./status.js";
12
12
  export * from "./register.js";
13
13
  export * from "./episode-node.js";
14
+ export * from "./attention-node.js";
14
15
  export * from "./catalog.js";
15
16
  export * from "./story-library.js";
16
17
  export { runCli } from "./cli.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,MAAM,EAAuC,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,MAAM,EAAuC,MAAM,UAAU,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miadi/inquiry-weave",
3
- "version": "0.6.8",
3
+ "version": "0.7.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"
@@ -25,14 +25,9 @@
25
25
  "README.md",
26
26
  "rispecs"
27
27
  ],
28
- "scripts": {
29
- "build": "../../node_modules/.bin/tsc -p tsconfig.build.json",
30
- "test": "npm run build && node --test test/*.test.mjs",
31
- "prepublishOnly": "npm run build"
32
- },
33
28
  "dependencies": {
34
- "@miadi/episodic-memory-schema": "^0.5.1 || ^0.6.0 || ^0.7.0",
35
- "yaml": "^2.5.0"
29
+ "yaml": "^2.5.0",
30
+ "@miadi/episodic-memory-schema": "^0.8.0"
36
31
  },
37
32
  "devDependencies": {
38
33
  "typescript": "^5.4.0"
@@ -50,5 +45,9 @@
50
45
  "url": "git+https://github.com/jgwill/Miadi.git",
51
46
  "directory": "packages/inquiry-weave"
52
47
  },
53
- "license": "MIT"
54
- }
48
+ "license": "MIT",
49
+ "scripts": {
50
+ "build": "../../node_modules/.bin/tsc -p tsconfig.build.json",
51
+ "test": "npm run build && node --test test/*.test.mjs"
52
+ }
53
+ }