@miadi/inquiry-weave 0.18.6 → 0.18.8
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/capability-holding.d.ts +134 -0
- package/dist/capability-holding.d.ts.map +1 -0
- package/dist/capability-holding.js +363 -0
- package/dist/capability-holding.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +50 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/mint.d.ts +84 -0
- package/dist/mint.d.ts.map +1 -1
- package/dist/mint.js +206 -0
- package/dist/mint.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The capability seam: what an episode did with a capability, in the shape
|
|
3
|
+
* the rispec seam set (rispec.ts). One reusable capability node on the wheel
|
|
4
|
+
* (`capability:<kind>-<slug>`, the registry's id, `knowledge` with
|
|
5
|
+
* `metadata.kind: "capability"`), one episode→capability edge whose
|
|
6
|
+
* relationship type is the relation (`uses`, `revises`, `brings-into-being`),
|
|
7
|
+
* and an entry per capability and version in `episode.yaml`'s
|
|
8
|
+
* `capabilities:` list with the evidence of the work.
|
|
9
|
+
*
|
|
10
|
+
* Episode 568's Capability Registry, `EpisodeCapabilityHolding` (P12).
|
|
11
|
+
*/
|
|
12
|
+
import { type CapabilityRef, type EpisodeCapabilityEntry } from "@miadi/episodic-memory-schema";
|
|
13
|
+
export type CapabilityHoldingErrorCode = "invalid_capability" | "capability_manifest_conflict";
|
|
14
|
+
export declare class CapabilityHoldingError extends Error {
|
|
15
|
+
readonly code: CapabilityHoldingErrorCode;
|
|
16
|
+
constructor(code: CapabilityHoldingErrorCode, message: string);
|
|
17
|
+
}
|
|
18
|
+
/** The capability an input names: `miadi-capability:<owner>/<repo>/<kind>/<name>`, `//` accepted. */
|
|
19
|
+
export declare function requireCapabilityRef(raw: unknown): CapabilityRef;
|
|
20
|
+
export interface UpsertEpisodeCapabilityResult {
|
|
21
|
+
entry: EpisodeCapabilityEntry;
|
|
22
|
+
created: boolean;
|
|
23
|
+
filled: string[];
|
|
24
|
+
wrote: boolean;
|
|
25
|
+
dryRun: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Add a holding to `episode.yaml`'s `capabilities:` list, or complete the one
|
|
29
|
+
* that holds this capability at this version: keys it lacks are filled and
|
|
30
|
+
* new evidence is appended. The relation an entry already records is kept.
|
|
31
|
+
* Comments, key order and every other field survive. Refuses a
|
|
32
|
+
* `capabilities` key that is not a list.
|
|
33
|
+
*/
|
|
34
|
+
export declare function upsertEpisodeCapability(input: {
|
|
35
|
+
episodeYamlPath: string;
|
|
36
|
+
entry: EpisodeCapabilityEntry;
|
|
37
|
+
dryRun?: boolean;
|
|
38
|
+
}): Promise<UpsertEpisodeCapabilityResult>;
|
|
39
|
+
export type CapabilityProjectionState = "created" | "already-present" | "skipped" | "pending";
|
|
40
|
+
export interface CapabilityProjection {
|
|
41
|
+
node: {
|
|
42
|
+
id: string;
|
|
43
|
+
state: CapabilityProjectionState;
|
|
44
|
+
error?: string;
|
|
45
|
+
};
|
|
46
|
+
edge: {
|
|
47
|
+
id: string;
|
|
48
|
+
state: CapabilityProjectionState;
|
|
49
|
+
relationship_type: string;
|
|
50
|
+
error?: string;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Put the capability node and the episode→capability edge on the wheel. A
|
|
55
|
+
* node that exists is left as it is. One edge joins an episode and a
|
|
56
|
+
* capability whatever the versions; the first relation recorded names it.
|
|
57
|
+
*/
|
|
58
|
+
export declare function projectEpisodeCapability(mwUrl: string, input: {
|
|
59
|
+
episodeNodeId: string;
|
|
60
|
+
episodeFolder: string;
|
|
61
|
+
episodeNumber?: number;
|
|
62
|
+
ref: CapabilityRef;
|
|
63
|
+
entry: EpisodeCapabilityEntry;
|
|
64
|
+
}, options?: {
|
|
65
|
+
fetchImpl?: typeof fetch;
|
|
66
|
+
dryRun?: boolean;
|
|
67
|
+
}): Promise<CapabilityProjection>;
|
|
68
|
+
export interface RemoveEpisodeCapabilityResult {
|
|
69
|
+
/** The entries taken out. */
|
|
70
|
+
removed: EpisodeCapabilityEntry[];
|
|
71
|
+
/** What the manifest still holds of this capability, in its order. */
|
|
72
|
+
remaining: EpisodeCapabilityEntry[];
|
|
73
|
+
wrote: boolean;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Take a capability's holdings out of `episode.yaml`: the one at `version`,
|
|
77
|
+
* or every one of the capability when no version is given. Removing what the
|
|
78
|
+
* episode does not hold changes nothing. Every other entry, comment and key survives.
|
|
79
|
+
*/
|
|
80
|
+
export declare function removeEpisodeCapabilityEntries(input: {
|
|
81
|
+
episodeYamlPath: string;
|
|
82
|
+
capability: string;
|
|
83
|
+
version?: string;
|
|
84
|
+
dryRun?: boolean;
|
|
85
|
+
}): Promise<RemoveEpisodeCapabilityResult>;
|
|
86
|
+
export interface AmendEpisodeCapabilityResult {
|
|
87
|
+
entry: EpisodeCapabilityEntry;
|
|
88
|
+
/** The keys whose value changed. */
|
|
89
|
+
changed: string[];
|
|
90
|
+
/** What the manifest holds of this capability after the change, in its order. */
|
|
91
|
+
held: EpisodeCapabilityEntry[];
|
|
92
|
+
wrote: boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Change the holding at (`capability`, `version`): its relation, its evidence
|
|
96
|
+
* (replaced as given) or its title. Refuses a holding the episode does not have.
|
|
97
|
+
*/
|
|
98
|
+
export declare function amendEpisodeCapabilityEntry(input: {
|
|
99
|
+
episodeYamlPath: string;
|
|
100
|
+
capability: string;
|
|
101
|
+
version?: string;
|
|
102
|
+
relation?: EpisodeCapabilityEntry["relation"];
|
|
103
|
+
evidence?: string[];
|
|
104
|
+
title?: string;
|
|
105
|
+
dryRun?: boolean;
|
|
106
|
+
}): Promise<AmendEpisodeCapabilityResult>;
|
|
107
|
+
export interface CapabilityEdgeReconcile {
|
|
108
|
+
id: string;
|
|
109
|
+
/**
|
|
110
|
+
* `deleted` when no holding of the capability remains; `amended` when the
|
|
111
|
+
* edge took the first holding's relation; `matching` when it already had it;
|
|
112
|
+
* `absent` when there was no edge to delete; `skipped` on a dry run;
|
|
113
|
+
* `pending` when the wheel did not answer.
|
|
114
|
+
*/
|
|
115
|
+
state: "deleted" | "amended" | "matching" | "absent" | "skipped" | "pending";
|
|
116
|
+
relationship_type?: string;
|
|
117
|
+
error?: string;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Make the episode→capability edge say what the manifest holds: gone when no
|
|
121
|
+
* holding of the capability remains, the first remaining holding's relation
|
|
122
|
+
* otherwise. The capability node stays: other episodes hold it too. Never throws.
|
|
123
|
+
*/
|
|
124
|
+
export declare function reconcileEpisodeCapabilityEdge(mwUrl: string, input: {
|
|
125
|
+
episodeNodeId: string;
|
|
126
|
+
episodeFolder: string;
|
|
127
|
+
episodeNumber?: number;
|
|
128
|
+
ref: CapabilityRef;
|
|
129
|
+
held: readonly EpisodeCapabilityEntry[];
|
|
130
|
+
}, options?: {
|
|
131
|
+
fetchImpl?: typeof fetch;
|
|
132
|
+
dryRun?: boolean;
|
|
133
|
+
}): Promise<CapabilityEdgeReconcile>;
|
|
134
|
+
//# sourceMappingURL=capability-holding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-holding.d.ts","sourceRoot":"","sources":["../src/capability-holding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The capability seam: what an episode did with a capability, in the shape
|
|
3
|
+
* the rispec seam set (rispec.ts). One reusable capability node on the wheel
|
|
4
|
+
* (`capability:<kind>-<slug>`, the registry's id, `knowledge` with
|
|
5
|
+
* `metadata.kind: "capability"`), one episode→capability edge whose
|
|
6
|
+
* relationship type is the relation (`uses`, `revises`, `brings-into-being`),
|
|
7
|
+
* and an entry per capability and version in `episode.yaml`'s
|
|
8
|
+
* `capabilities:` list with the evidence of the work.
|
|
9
|
+
*
|
|
10
|
+
* Episode 568's Capability Registry, `EpisodeCapabilityHolding` (P12).
|
|
11
|
+
*/
|
|
12
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
13
|
+
import { existsSync } from "node:fs";
|
|
14
|
+
import { dirname } from "node:path";
|
|
15
|
+
import { Scalar, isMap, isScalar, isSeq, parseDocument } from "yaml";
|
|
16
|
+
import { CAPABILITY_ENTRY_KEYS, CAPABILITY_NODE_KIND, capabilityHoldingKey, capabilityNodeId, parseCapabilityRef, toEpisodeCapabilityEntry, } from "@miadi/episodic-memory-schema";
|
|
17
|
+
import { missingManifestRemedy } from "./episode.js";
|
|
18
|
+
import { edgesFrom, failure, wheelJson } from "./review.js";
|
|
19
|
+
export class CapabilityHoldingError extends Error {
|
|
20
|
+
code;
|
|
21
|
+
constructor(code, message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.name = "CapabilityHoldingError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** The capability an input names: `miadi-capability:<owner>/<repo>/<kind>/<name>`, `//` accepted. */
|
|
28
|
+
export function requireCapabilityRef(raw) {
|
|
29
|
+
const ref = parseCapabilityRef(raw);
|
|
30
|
+
if (ref)
|
|
31
|
+
return ref;
|
|
32
|
+
throw new CapabilityHoldingError("invalid_capability", `capability '${String(raw)}' is not a miadi-capability:<owner>/<repo>/<kind>/<name> address`);
|
|
33
|
+
}
|
|
34
|
+
function quoted(doc, value) {
|
|
35
|
+
const node = doc.createNode(value);
|
|
36
|
+
node.type = Scalar.QUOTE_SINGLE;
|
|
37
|
+
return node;
|
|
38
|
+
}
|
|
39
|
+
function evidenceNode(doc, evidence) {
|
|
40
|
+
const seq = doc.createNode([]);
|
|
41
|
+
for (const e of evidence)
|
|
42
|
+
seq.items.push(quoted(doc, e));
|
|
43
|
+
return seq;
|
|
44
|
+
}
|
|
45
|
+
function entryNode(doc, entry) {
|
|
46
|
+
const map = doc.createNode({});
|
|
47
|
+
for (const key of CAPABILITY_ENTRY_KEYS) {
|
|
48
|
+
const value = entry[key];
|
|
49
|
+
if (value === undefined || value === "")
|
|
50
|
+
continue;
|
|
51
|
+
if (key === "evidence") {
|
|
52
|
+
if (Array.isArray(value) && value.length > 0)
|
|
53
|
+
map.set(key, evidenceNode(doc, value));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
map.set(key, quoted(doc, value));
|
|
57
|
+
}
|
|
58
|
+
return map;
|
|
59
|
+
}
|
|
60
|
+
const plain = (item) => (isMap(item) ? item.toJSON() : isScalar(item) ? item.value : item);
|
|
61
|
+
/**
|
|
62
|
+
* Add a holding to `episode.yaml`'s `capabilities:` list, or complete the one
|
|
63
|
+
* that holds this capability at this version: keys it lacks are filled and
|
|
64
|
+
* new evidence is appended. The relation an entry already records is kept.
|
|
65
|
+
* Comments, key order and every other field survive. Refuses a
|
|
66
|
+
* `capabilities` key that is not a list.
|
|
67
|
+
*/
|
|
68
|
+
export async function upsertEpisodeCapability(input) {
|
|
69
|
+
if (!existsSync(input.episodeYamlPath)) {
|
|
70
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", missingManifestRemedy(dirname(input.episodeYamlPath)));
|
|
71
|
+
}
|
|
72
|
+
const doc = parseDocument(await readFile(input.episodeYamlPath, "utf8"));
|
|
73
|
+
if (doc.errors.length > 0) {
|
|
74
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", `unreadable episode.yaml ${input.episodeYamlPath}: ${doc.errors[0].message}`);
|
|
75
|
+
}
|
|
76
|
+
if (!isMap(doc.contents)) {
|
|
77
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", `episode.yaml ${input.episodeYamlPath} is not a mapping`);
|
|
78
|
+
}
|
|
79
|
+
const key = capabilityHoldingKey(input.entry);
|
|
80
|
+
const list = doc.get("capabilities", true);
|
|
81
|
+
let created = false;
|
|
82
|
+
const filled = [];
|
|
83
|
+
let entry;
|
|
84
|
+
if (list === undefined || list === null || (isScalar(list) && (list.value === null || list.value === undefined))) {
|
|
85
|
+
created = true;
|
|
86
|
+
entry = input.entry;
|
|
87
|
+
const seq = doc.createNode([]);
|
|
88
|
+
seq.items.push(entryNode(doc, entry));
|
|
89
|
+
doc.set("capabilities", seq);
|
|
90
|
+
}
|
|
91
|
+
else if (!isSeq(list)) {
|
|
92
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", `capabilities in ${input.episodeYamlPath} is not a list — refusing to overwrite`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const index = list.items.findIndex((item) => {
|
|
96
|
+
const read = toEpisodeCapabilityEntry(plain(item));
|
|
97
|
+
return read !== null && capabilityHoldingKey(read) === key;
|
|
98
|
+
});
|
|
99
|
+
if (index < 0) {
|
|
100
|
+
created = true;
|
|
101
|
+
entry = input.entry;
|
|
102
|
+
list.items.push(entryNode(doc, entry));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const item = list.items[index];
|
|
106
|
+
if (!isMap(item)) {
|
|
107
|
+
entry = toEpisodeCapabilityEntry(plain(item)) ?? input.entry;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
for (const k of CAPABILITY_ENTRY_KEYS) {
|
|
111
|
+
if (k === "evidence" || k === "relation")
|
|
112
|
+
continue;
|
|
113
|
+
const value = input.entry[k];
|
|
114
|
+
if (value === undefined || value === "")
|
|
115
|
+
continue;
|
|
116
|
+
const present = item.get(k);
|
|
117
|
+
if (present === undefined || present === null || present === "") {
|
|
118
|
+
item.set(k, quoted(doc, value));
|
|
119
|
+
filled.push(k);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const had = toEpisodeCapabilityEntry(item.toJSON())?.evidence ?? [];
|
|
123
|
+
const more = (input.entry.evidence ?? []).filter((e) => !had.includes(e));
|
|
124
|
+
if (more.length > 0) {
|
|
125
|
+
item.set("evidence", evidenceNode(doc, [...had, ...more]));
|
|
126
|
+
filled.push("evidence");
|
|
127
|
+
}
|
|
128
|
+
entry = toEpisodeCapabilityEntry(item.toJSON()) ?? input.entry;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const wrote = (created || filled.length > 0) && !input.dryRun;
|
|
133
|
+
if (wrote)
|
|
134
|
+
await writeFile(input.episodeYamlPath, doc.toString(), "utf8");
|
|
135
|
+
return { entry, created, filled, wrote, dryRun: input.dryRun === true };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Put the capability node and the episode→capability edge on the wheel. A
|
|
139
|
+
* node that exists is left as it is. One edge joins an episode and a
|
|
140
|
+
* capability whatever the versions; the first relation recorded names it.
|
|
141
|
+
*/
|
|
142
|
+
export async function projectEpisodeCapability(mwUrl, input, options = {}) {
|
|
143
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
144
|
+
const base = mwUrl.replace(/\/+$/, "");
|
|
145
|
+
const nodeId = capabilityNodeId(input.ref);
|
|
146
|
+
const relation = input.entry.relation;
|
|
147
|
+
const projection = {
|
|
148
|
+
node: { id: nodeId, state: "pending" },
|
|
149
|
+
edge: { id: `${input.episodeNodeId}:${nodeId}`, state: "pending", relationship_type: relation },
|
|
150
|
+
};
|
|
151
|
+
const nodeUrl = `${base}/api/nodes/${encodeURIComponent(nodeId)}`;
|
|
152
|
+
const read = await wheelJson(fetchImpl, nodeUrl);
|
|
153
|
+
if (read.ok) {
|
|
154
|
+
projection.node.state = "already-present";
|
|
155
|
+
}
|
|
156
|
+
else if (read.status === 404) {
|
|
157
|
+
if (options.dryRun) {
|
|
158
|
+
projection.node.state = "skipped";
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
const created = await wheelJson(fetchImpl, `${base}/api/nodes`, {
|
|
162
|
+
method: "POST",
|
|
163
|
+
headers: { "content-type": "application/json" },
|
|
164
|
+
body: JSON.stringify({
|
|
165
|
+
id: nodeId,
|
|
166
|
+
type: "knowledge",
|
|
167
|
+
name: `Capability — ${input.ref.kind} ${input.ref.name}`,
|
|
168
|
+
description: `One thing ${input.ref.owner}/${input.ref.repo} provides: the ${input.ref.kind} ${input.ref.name}. Its address is ${input.ref.reference}.`,
|
|
169
|
+
metadata: {
|
|
170
|
+
kind: CAPABILITY_NODE_KIND,
|
|
171
|
+
address: input.ref.reference,
|
|
172
|
+
owner: input.ref.owner,
|
|
173
|
+
repo: input.ref.repo,
|
|
174
|
+
capability_kind: input.ref.kind,
|
|
175
|
+
name: input.ref.name,
|
|
176
|
+
provided_by: `repository:${input.ref.owner}/${input.ref.repo}`,
|
|
177
|
+
},
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
projection.node = created.ok ? { id: nodeId, state: "created" } : { id: nodeId, state: "pending", error: failure("POST", `${base}/api/nodes`, created) };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
projection.node = { id: nodeId, state: "pending", error: failure("GET", nodeUrl, read) };
|
|
185
|
+
}
|
|
186
|
+
if (projection.node.state === "pending") {
|
|
187
|
+
projection.edge.error = "the capability node is not on the wheel yet";
|
|
188
|
+
return projection;
|
|
189
|
+
}
|
|
190
|
+
const edgesUrl = `${base}/api/edges`;
|
|
191
|
+
const listing = await wheelJson(fetchImpl, `${edgesUrl}?limit=all`);
|
|
192
|
+
if (!listing.ok) {
|
|
193
|
+
projection.edge.error = failure("GET", edgesUrl, listing);
|
|
194
|
+
return projection;
|
|
195
|
+
}
|
|
196
|
+
const existing = edgesFrom(listing.body).find((edge) => String(edge.from_id) === input.episodeNodeId && String(edge.to_id) === nodeId);
|
|
197
|
+
if (existing) {
|
|
198
|
+
projection.edge = { ...projection.edge, state: "already-present", relationship_type: String(existing.relationship_type ?? relation) };
|
|
199
|
+
return projection;
|
|
200
|
+
}
|
|
201
|
+
if (options.dryRun) {
|
|
202
|
+
projection.edge.state = "skipped";
|
|
203
|
+
return projection;
|
|
204
|
+
}
|
|
205
|
+
const who = input.episodeNumber !== undefined ? `Episode ${input.episodeNumber}` : input.episodeFolder;
|
|
206
|
+
const posted = await wheelJson(fetchImpl, edgesUrl, {
|
|
207
|
+
method: "POST",
|
|
208
|
+
headers: { "content-type": "application/json" },
|
|
209
|
+
body: JSON.stringify({
|
|
210
|
+
from_id: input.episodeNodeId,
|
|
211
|
+
to_id: nodeId,
|
|
212
|
+
relationship_type: relation,
|
|
213
|
+
description: `${who} ${relation.replace(/-/g, " ")} ${input.ref.name}${input.entry.version ? ` ${input.entry.version}` : ""}.`,
|
|
214
|
+
strength: 1,
|
|
215
|
+
obligations: [],
|
|
216
|
+
}),
|
|
217
|
+
});
|
|
218
|
+
if (posted.ok && posted.body?.replaced === true) {
|
|
219
|
+
projection.edge = { ...projection.edge, state: "pending", error: "the wheel replaced an edge the listing did not show; check the edge by hand" };
|
|
220
|
+
}
|
|
221
|
+
else if (posted.ok)
|
|
222
|
+
projection.edge.state = "created";
|
|
223
|
+
else if (posted.status === 409)
|
|
224
|
+
projection.edge.state = "already-present";
|
|
225
|
+
else
|
|
226
|
+
projection.edge.error = failure("POST", edgesUrl, posted);
|
|
227
|
+
return projection;
|
|
228
|
+
}
|
|
229
|
+
async function readManifestDoc(path) {
|
|
230
|
+
if (!existsSync(path))
|
|
231
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", missingManifestRemedy(dirname(path)));
|
|
232
|
+
const doc = parseDocument(await readFile(path, "utf8"));
|
|
233
|
+
if (doc.errors.length > 0)
|
|
234
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", `unreadable episode.yaml ${path}: ${doc.errors[0].message}`);
|
|
235
|
+
if (!isMap(doc.contents))
|
|
236
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", `episode.yaml ${path} is not a mapping`);
|
|
237
|
+
return doc;
|
|
238
|
+
}
|
|
239
|
+
function heldOf(doc) {
|
|
240
|
+
const list = doc.get("capabilities", true);
|
|
241
|
+
if (list === undefined || list === null || (isScalar(list) && (list.value === null || list.value === undefined)))
|
|
242
|
+
return { list: null, entries: [] };
|
|
243
|
+
if (!isSeq(list))
|
|
244
|
+
throw new CapabilityHoldingError("capability_manifest_conflict", "capabilities in episode.yaml is not a list — refusing to change it");
|
|
245
|
+
const entries = [];
|
|
246
|
+
list.items.forEach((item, index) => {
|
|
247
|
+
const entry = toEpisodeCapabilityEntry(plain(item));
|
|
248
|
+
if (entry)
|
|
249
|
+
entries.push({ index, entry });
|
|
250
|
+
});
|
|
251
|
+
return { list, entries };
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Take a capability's holdings out of `episode.yaml`: the one at `version`,
|
|
255
|
+
* or every one of the capability when no version is given. Removing what the
|
|
256
|
+
* episode does not hold changes nothing. Every other entry, comment and key survives.
|
|
257
|
+
*/
|
|
258
|
+
export async function removeEpisodeCapabilityEntries(input) {
|
|
259
|
+
const doc = await readManifestDoc(input.episodeYamlPath);
|
|
260
|
+
const { list, entries } = heldOf(doc);
|
|
261
|
+
const ofCapability = entries.filter((e) => e.entry.capability === input.capability);
|
|
262
|
+
const removed = ofCapability.filter((e) => input.version === undefined || (e.entry.version ?? "") === input.version);
|
|
263
|
+
const remaining = ofCapability.filter((e) => !removed.includes(e)).map((e) => e.entry);
|
|
264
|
+
if (removed.length === 0 || list === null)
|
|
265
|
+
return { removed: [], remaining, wrote: false };
|
|
266
|
+
for (const { index } of [...removed].sort((a, b) => b.index - a.index))
|
|
267
|
+
list.items.splice(index, 1);
|
|
268
|
+
if (!input.dryRun)
|
|
269
|
+
await writeFile(input.episodeYamlPath, doc.toString(), "utf8");
|
|
270
|
+
return { removed: removed.map((e) => e.entry), remaining, wrote: !input.dryRun };
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Change the holding at (`capability`, `version`): its relation, its evidence
|
|
274
|
+
* (replaced as given) or its title. Refuses a holding the episode does not have.
|
|
275
|
+
*/
|
|
276
|
+
export async function amendEpisodeCapabilityEntry(input) {
|
|
277
|
+
const doc = await readManifestDoc(input.episodeYamlPath);
|
|
278
|
+
const { list, entries } = heldOf(doc);
|
|
279
|
+
const found = entries.find((e) => e.entry.capability === input.capability && (e.entry.version ?? "") === (input.version ?? ""));
|
|
280
|
+
if (!found || list === null) {
|
|
281
|
+
throw new CapabilityHoldingError("invalid_capability", `the episode holds no ${input.capability}${input.version ? ` at ${input.version}` : " without a version"}`);
|
|
282
|
+
}
|
|
283
|
+
const item = list.items[found.index];
|
|
284
|
+
const changed = [];
|
|
285
|
+
const map = isMap(item) ? item : doc.createNode({ capability: found.entry.capability });
|
|
286
|
+
if (!isMap(item))
|
|
287
|
+
list.items[found.index] = map;
|
|
288
|
+
if (input.relation && input.relation !== found.entry.relation) {
|
|
289
|
+
map.set("relation", quoted(doc, input.relation));
|
|
290
|
+
changed.push("relation");
|
|
291
|
+
}
|
|
292
|
+
if (input.evidence) {
|
|
293
|
+
const next = [...new Set(input.evidence)];
|
|
294
|
+
if (JSON.stringify(next) !== JSON.stringify(found.entry.evidence ?? [])) {
|
|
295
|
+
if (next.length > 0)
|
|
296
|
+
map.set("evidence", evidenceNode(doc, next));
|
|
297
|
+
else
|
|
298
|
+
map.delete("evidence");
|
|
299
|
+
changed.push("evidence");
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (input.title !== undefined && input.title !== (found.entry.title ?? "")) {
|
|
303
|
+
if (input.title)
|
|
304
|
+
map.set("title", quoted(doc, input.title));
|
|
305
|
+
else
|
|
306
|
+
map.delete("title");
|
|
307
|
+
changed.push("title");
|
|
308
|
+
}
|
|
309
|
+
const wrote = changed.length > 0 && !input.dryRun;
|
|
310
|
+
if (wrote)
|
|
311
|
+
await writeFile(input.episodeYamlPath, doc.toString(), "utf8");
|
|
312
|
+
const entry = toEpisodeCapabilityEntry(map.toJSON()) ?? found.entry;
|
|
313
|
+
const held = heldOf(doc).entries.filter((e) => e.entry.capability === input.capability).map((e) => e.entry);
|
|
314
|
+
return { entry, changed, held, wrote };
|
|
315
|
+
}
|
|
316
|
+
/** The wheel names one edge by its ordered pair. */
|
|
317
|
+
const pairQuery = (from, to) => new URLSearchParams({ from, to }).toString();
|
|
318
|
+
/**
|
|
319
|
+
* Make the episode→capability edge say what the manifest holds: gone when no
|
|
320
|
+
* holding of the capability remains, the first remaining holding's relation
|
|
321
|
+
* otherwise. The capability node stays: other episodes hold it too. Never throws.
|
|
322
|
+
*/
|
|
323
|
+
export async function reconcileEpisodeCapabilityEdge(mwUrl, input, options = {}) {
|
|
324
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
325
|
+
const nodeId = capabilityNodeId(input.ref);
|
|
326
|
+
const id = `${input.episodeNodeId}:${nodeId}`;
|
|
327
|
+
const edgesUrl = `${mwUrl.replace(/\/+$/, "")}/api/edges`;
|
|
328
|
+
const listing = await wheelJson(fetchImpl, `${edgesUrl}?limit=all`);
|
|
329
|
+
if (!listing.ok)
|
|
330
|
+
return { id, state: "pending", error: failure("GET", edgesUrl, listing) };
|
|
331
|
+
const existing = edgesFrom(listing.body).find((edge) => String(edge.from_id) === input.episodeNodeId && String(edge.to_id) === nodeId);
|
|
332
|
+
const first = input.held[0];
|
|
333
|
+
if (!first) {
|
|
334
|
+
if (!existing)
|
|
335
|
+
return { id, state: "absent" };
|
|
336
|
+
if (options.dryRun)
|
|
337
|
+
return { id, state: "skipped" };
|
|
338
|
+
const deleted = await wheelJson(fetchImpl, `${edgesUrl}?${pairQuery(input.episodeNodeId, nodeId)}`, { method: "DELETE" });
|
|
339
|
+
if (deleted.ok)
|
|
340
|
+
return { id, state: "deleted" };
|
|
341
|
+
const said = deleted.body?.error;
|
|
342
|
+
if (deleted.status === 404 && typeof said === "string")
|
|
343
|
+
return { id, state: "absent" };
|
|
344
|
+
return { id, state: "pending", error: failure("DELETE", edgesUrl, deleted) };
|
|
345
|
+
}
|
|
346
|
+
if (!existing)
|
|
347
|
+
return { id, state: "absent" };
|
|
348
|
+
if (String(existing.relationship_type ?? "") === first.relation)
|
|
349
|
+
return { id, state: "matching", relationship_type: first.relation };
|
|
350
|
+
if (options.dryRun)
|
|
351
|
+
return { id, state: "skipped", relationship_type: first.relation };
|
|
352
|
+
const who = input.episodeNumber !== undefined ? `Episode ${input.episodeNumber}` : input.episodeFolder;
|
|
353
|
+
const patched = await wheelJson(fetchImpl, `${edgesUrl}?${pairQuery(input.episodeNodeId, nodeId)}`, {
|
|
354
|
+
method: "PATCH",
|
|
355
|
+
headers: { "content-type": "application/json" },
|
|
356
|
+
body: JSON.stringify({
|
|
357
|
+
relationship_type: first.relation,
|
|
358
|
+
description: `${who} ${first.relation.replace(/-/g, " ")} ${input.ref.name}${first.version ? ` ${first.version}` : ""}.`,
|
|
359
|
+
}),
|
|
360
|
+
});
|
|
361
|
+
return patched.ok ? { id, state: "amended", relationship_type: first.relation } : { id, state: "pending", error: failure("PATCH", edgesUrl, patched) };
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=capability-holding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-holding.js","sourceRoot":"","sources":["../src/capability-holding.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ export * from "./prototype.js";
|
|
|
31
31
|
export * from "./pde.js";
|
|
32
32
|
export * from "./tracing.js";
|
|
33
33
|
export * from "./rispec.js";
|
|
34
|
+
export * from "./capability-holding.js";
|
|
34
35
|
export * from "./rise-workspaces.js";
|
|
35
36
|
export * from "./rise-resolve.js";
|
|
36
37
|
export * from "./chronicle-terminal.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,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,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,7 @@ export * from "./prototype.js";
|
|
|
31
31
|
export * from "./pde.js";
|
|
32
32
|
export * from "./tracing.js";
|
|
33
33
|
export * from "./rispec.js";
|
|
34
|
+
export * from "./capability-holding.js";
|
|
34
35
|
export * from "./rise-workspaces.js";
|
|
35
36
|
export * from "./rise-resolve.js";
|
|
36
37
|
export * from "./chronicle-terminal.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,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,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,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,MAAM,EAAuC,MAAM,UAAU,CAAA"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -49,7 +49,7 @@ import { isFoundationUri } from "./foundation-dsl.js";
|
|
|
49
49
|
import { isCapabilityUri } from "./capability-dsl.js";
|
|
50
50
|
import { readWebBases, resolveCapabilityRefForTerminal, resolveForTerminal, resolveFoundationRefForTerminal, resolveWheelRefForTerminal } from "./chronicle-terminal.js";
|
|
51
51
|
import { answerChronicleAttention, getChronicleAttention, listChronicleAttention, } from "./attention.js";
|
|
52
|
-
import { attachEpisodeFoundation, attachEpisodeNotebook, attachEpisodePrototype, attachEpisodePde, listEpisodePdes, attachEpisodeTracing, attachEpisodeRispec, attachEpisodeReview, authorEpisodeLineage, checkEpisodeNumber, episodeDoorStatus, landEpisode, mintEpisode, previewAllocation, redeemEpisodeRegistration, resolveDoorContext, weaveEpisodeInquiry, } from "./mint.js";
|
|
52
|
+
import { attachEpisodeFoundation, attachEpisodeNotebook, attachEpisodePrototype, attachEpisodePde, listEpisodePdes, attachEpisodeTracing, attachEpisodeRispec, attachEpisodeCapability, amendEpisodeCapability, removeEpisodeCapability, attachEpisodeReview, authorEpisodeLineage, checkEpisodeNumber, episodeDoorStatus, landEpisode, mintEpisode, previewAllocation, redeemEpisodeRegistration, resolveDoorContext, weaveEpisodeInquiry, } from "./mint.js";
|
|
53
53
|
const API_BASE = (process.env.MIADI_INQUIRY_API_BASE || "").replace(/\/$/, "");
|
|
54
54
|
const ISSUES_BASE = (process.env.MIADI_INQUIRY_ISSUES_BASE ||
|
|
55
55
|
process.env.MIADI_INQUIRY_THREADS_BASE ||
|
|
@@ -439,6 +439,25 @@ const TOOLS = [
|
|
|
439
439
|
required: ["episode", "spec"],
|
|
440
440
|
},
|
|
441
441
|
},
|
|
442
|
+
{
|
|
443
|
+
name: "chronicle_episode_capability",
|
|
444
|
+
description: "Hold a capability in an episode (Episode 568's Capability Registry): record under capabilities: in episode.yaml what the episode did with it at one version (uses, revises or brings-into-being) and the evidence of the work (owner/repo#n, owner/repo@<sha>, session:<uuid>, npm:<package>@<version>); put the capability node (knowledge, kind capability, the registry's id capability:<kind>-<slug>) and the episode→capability edge on the wheel; land. One entry per capability and version; repeating the call adds only evidence it lacks. action amend corrects one holding (relation, evidence replaced as given, title); action remove stops holding it at version, or at every version when none is given. Both then make the wheel edge agree: removed once no holding remains, the first holding's relation otherwise.",
|
|
445
|
+
inputSchema: {
|
|
446
|
+
type: "object",
|
|
447
|
+
properties: {
|
|
448
|
+
episode: { type: "string", description: "Episode number, epNNN, or folder name." },
|
|
449
|
+
capability: { type: "string", description: "miadi-capability:<owner>/<repo>/<kind>/<name>; // is accepted." },
|
|
450
|
+
action: { type: "string", enum: ["hold", "amend", "remove"], default: "hold", description: "hold (default) adds or completes a holding; amend corrects one; remove stops holding it." },
|
|
451
|
+
relation: { type: "string", enum: ["uses", "revises", "brings-into-being"], description: "What the episode did with it (default: uses)." },
|
|
452
|
+
version: { type: "string", description: "The version the episode used or released, e.g. 0.5.1." },
|
|
453
|
+
evidence: { type: "array", items: { type: "string" }, description: "owner/repo#n, owner/repo@<sha>, session:<uuid>, npm:<package>@<version>" },
|
|
454
|
+
title: { type: "string" },
|
|
455
|
+
land: { type: "boolean", default: true },
|
|
456
|
+
dryRun: { type: "boolean", default: false },
|
|
457
|
+
},
|
|
458
|
+
required: ["episode", "capability"],
|
|
459
|
+
},
|
|
460
|
+
},
|
|
442
461
|
{
|
|
443
462
|
name: "chronicle_episode_status",
|
|
444
463
|
description: "The five-stage closing proof for one episode — created, committed, pushed, registered, receipt-verified — each with its probe and what it said, plus drift shapes and owed actions.",
|
|
@@ -753,6 +772,36 @@ async function callTool(name, args) {
|
|
|
753
772
|
return apiCall("POST", `/api/chronicle/episodes/${encodeURIComponent(ref)}/rispecs`, input);
|
|
754
773
|
return attachEpisodeRispec(door.context, ref, input);
|
|
755
774
|
}
|
|
775
|
+
case "chronicle_episode_capability": {
|
|
776
|
+
const door = episodeDoor();
|
|
777
|
+
const ref = episodeRefArg(args);
|
|
778
|
+
const str = (key) => (typeof args[key] === "string" ? args[key] : undefined);
|
|
779
|
+
const input = {
|
|
780
|
+
capability: str("capability") ?? "",
|
|
781
|
+
relation: str("relation"),
|
|
782
|
+
version: str("version"),
|
|
783
|
+
evidence: Array.isArray(args.evidence) ? args.evidence.filter((e) => typeof e === "string") : undefined,
|
|
784
|
+
title: str("title"),
|
|
785
|
+
land: args.land !== false,
|
|
786
|
+
dryRun: args.dryRun === true,
|
|
787
|
+
};
|
|
788
|
+
const action = args.action === "amend" || args.action === "remove" ? args.action : "hold";
|
|
789
|
+
const path = `/api/chronicle/episodes/${encodeURIComponent(ref)}/capabilities`;
|
|
790
|
+
if (action === "remove") {
|
|
791
|
+
const removal = { capability: input.capability, version: input.version, land: input.land, dryRun: input.dryRun };
|
|
792
|
+
if (door.mode === "http")
|
|
793
|
+
return apiCall("DELETE", path, removal);
|
|
794
|
+
return removeEpisodeCapability(door.context, ref, removal);
|
|
795
|
+
}
|
|
796
|
+
if (action === "amend") {
|
|
797
|
+
if (door.mode === "http")
|
|
798
|
+
return apiCall("PATCH", path, input);
|
|
799
|
+
return amendEpisodeCapability(door.context, ref, input);
|
|
800
|
+
}
|
|
801
|
+
if (door.mode === "http")
|
|
802
|
+
return apiCall("POST", path, input);
|
|
803
|
+
return attachEpisodeCapability(door.context, ref, input);
|
|
804
|
+
}
|
|
756
805
|
case "chronicle_episode_status": {
|
|
757
806
|
const door = episodeDoor();
|
|
758
807
|
const ref = episodeRefArg(args);
|