@chipschat/conformance 0.0.0-stage → 1.0.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.
Files changed (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +34 -2
  3. package/dist/checks.d.ts +29 -0
  4. package/dist/checks.d.ts.map +1 -0
  5. package/dist/checks.js +133 -0
  6. package/dist/checks.js.map +1 -0
  7. package/dist/exchange.d.ts +30 -0
  8. package/dist/exchange.d.ts.map +1 -0
  9. package/dist/exchange.js +102 -0
  10. package/dist/exchange.js.map +1 -0
  11. package/dist/fake-chips.d.ts +130 -0
  12. package/dist/fake-chips.d.ts.map +1 -0
  13. package/dist/fake-chips.js +1642 -0
  14. package/dist/fake-chips.js.map +1 -0
  15. package/dist/fake-join.d.ts +56 -0
  16. package/dist/fake-join.d.ts.map +1 -0
  17. package/dist/fake-join.js +181 -0
  18. package/dist/fake-join.js.map +1 -0
  19. package/dist/index.d.ts +20 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +14 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/project.d.ts +39 -0
  24. package/dist/project.d.ts.map +1 -0
  25. package/dist/project.js +254 -0
  26. package/dist/project.js.map +1 -0
  27. package/dist/report.d.ts +65 -0
  28. package/dist/report.d.ts.map +1 -0
  29. package/dist/report.js +142 -0
  30. package/dist/report.js.map +1 -0
  31. package/dist/room-files.d.ts +54 -0
  32. package/dist/room-files.d.ts.map +1 -0
  33. package/dist/room-files.js +144 -0
  34. package/dist/room-files.js.map +1 -0
  35. package/dist/scenario.d.ts +41 -0
  36. package/dist/scenario.d.ts.map +1 -0
  37. package/dist/scenario.js +414 -0
  38. package/dist/scenario.js.map +1 -0
  39. package/dist/settings.d.ts +60 -0
  40. package/dist/settings.d.ts.map +1 -0
  41. package/dist/settings.js +142 -0
  42. package/dist/settings.js.map +1 -0
  43. package/dist/spend.d.ts +20 -0
  44. package/dist/spend.d.ts.map +1 -0
  45. package/dist/spend.js +50 -0
  46. package/dist/spend.js.map +1 -0
  47. package/dist/subject.d.ts +55 -0
  48. package/dist/subject.d.ts.map +1 -0
  49. package/dist/subject.js +22 -0
  50. package/dist/subject.js.map +1 -0
  51. package/dist/waiting.d.ts +12 -0
  52. package/dist/waiting.d.ts.map +1 -0
  53. package/dist/waiting.js +30 -0
  54. package/dist/waiting.js.map +1 -0
  55. package/dist/workspace.d.ts +893 -0
  56. package/dist/workspace.d.ts.map +1 -0
  57. package/dist/workspace.js +3160 -0
  58. package/dist/workspace.js.map +1 -0
  59. package/package.json +38 -3
@@ -0,0 +1,144 @@
1
+ /**
2
+ * The room's files (ADR 0099), as the fake plays them: the real server's reads and door over the
3
+ * fake's log rather than its projections. The files posted in a room, in order, none from a message
4
+ * taken back; what each file of a post was made from, copied onto it from the post's `replaces`;
5
+ * and the refusal of one made from a version no longer current. Which file is which version, and
6
+ * the refusal's words, are the protocol's, so the two cannot differ.
7
+ */
8
+ import { currentFiles, messageIdOf, staleRefusal, staleVersion, versionsNamed, versionsOf, } from "@chipschat/protocol";
9
+ /** The events whose files are the room's: a message, and an artifact (as the server's projection). */
10
+ const CARRIES = new Set(["message.post", "artifact.create"]);
11
+ function filesOf(event) {
12
+ const one = event.payload["attachment"];
13
+ const many = event.payload["attachments"];
14
+ if (Array.isArray(many))
15
+ return many;
16
+ return typeof one === "object" && one !== null ? [one] : [];
17
+ }
18
+ /** The files posted in a room, oldest first, up to the event at `upto` and with it. */
19
+ export function postedFilesInLog(log, spaceId, upto = Number.POSITIVE_INFINITY) {
20
+ const taken = new Set(log
21
+ .filter((event) => event.type === "message.deleted")
22
+ .map((event) => String(event.payload["message_id"])));
23
+ return log
24
+ .filter((event) => CARRIES.has(event.type) && event.space_id === spaceId && event.seq <= upto)
25
+ .filter((event) => !taken.has(messageIdOf(event.id)))
26
+ .flatMap((event) => filesOf(event).map((file) => ({
27
+ seq: event.seq,
28
+ at: event.ts,
29
+ by: event.actor.id,
30
+ attachment_id: String(file["attachment_id"]),
31
+ filename: String(file["filename"]),
32
+ sha256: String(file["sha256"]),
33
+ byte_size: Number(file["byte_size"]),
34
+ mime_type: String(file["mime_type"]),
35
+ message_id: messageIdOf(event.id),
36
+ ...measured(file),
37
+ })));
38
+ }
39
+ /** A file's pixels and length, where the server measured them. */
40
+ function measured(file) {
41
+ const { width, height, duration_ms: duration } = file;
42
+ return {
43
+ ...(typeof width === "number" ? { width } : {}),
44
+ ...(typeof height === "number" ? { height } : {}),
45
+ ...(typeof duration === "number" ? { duration_ms: duration } : {}),
46
+ };
47
+ }
48
+ /** One version as the real server says it. */
49
+ function wireOf(version, room, madeFrom) {
50
+ return {
51
+ name: version.filename,
52
+ version: version.version,
53
+ attachment_id: version.attachment_id,
54
+ sha256: version.sha256,
55
+ byte_size: version.byte_size,
56
+ mime_type: version.mime_type,
57
+ by: room.by(version.by),
58
+ at: version.at,
59
+ ...(version.message_id === undefined ? {} : { message_id: version.message_id }),
60
+ ...(version.width === undefined ? {} : { width: version.width }),
61
+ ...(version.height === undefined ? {} : { height: version.height }),
62
+ ...(version.duration_ms === undefined ? {} : { duration_ms: version.duration_ms }),
63
+ ...(madeFrom === undefined ? {} : { replaces: madeFrom }),
64
+ ...(room.sign?.(version.attachment_id) ?? {}),
65
+ };
66
+ }
67
+ /** A room's files at their current version, newest first, as the real server hands them over. */
68
+ export function roomFilesInLog(log, room) {
69
+ const posted = postedFilesInLog(log, room.spaceId, room.upto);
70
+ return currentFiles(posted, room.most).map((version) => wireOf(version, room));
71
+ }
72
+ /** One name's versions, newest first, each with what it was made from (ADR 0100). */
73
+ export function fileVersionsInLog(log, room) {
74
+ const posted = postedFilesInLog(log, room.spaceId);
75
+ const made = new Map();
76
+ for (const event of log) {
77
+ if (!CARRIES.has(event.type) || event.space_id !== room.spaceId)
78
+ continue;
79
+ for (const file of filesOf(event)) {
80
+ if (typeof file["replaces"] === "string")
81
+ made.set(String(file["attachment_id"]), file["replaces"]);
82
+ }
83
+ }
84
+ return versionsNamed(posted, room.name, room.most).map((version) => wireOf(version, room, made.get(version.attachment_id)));
85
+ }
86
+ /** Where an attachment was posted in the log, under what name, and its digest. */
87
+ function factOf(log, attachmentId) {
88
+ for (const event of log) {
89
+ if (!CARRIES.has(event.type))
90
+ continue;
91
+ const file = filesOf(event).find((each) => each["attachment_id"] === attachmentId);
92
+ if (file !== undefined) {
93
+ return {
94
+ space_id: event.space_id,
95
+ filename: file["filename"],
96
+ sha256: String(file["sha256"]),
97
+ };
98
+ }
99
+ }
100
+ return undefined;
101
+ }
102
+ /**
103
+ * The real door's `fillMadeFrom` and the store's `fileGate`, at once, since the fake has one writer
104
+ * and nothing between them: each file's `replaces` copied onto it when it names a version of that
105
+ * file in this room, the map not kept; a key that is none of the post's files refused; a file made
106
+ * from a version no longer current refused `stale_file`.
107
+ */
108
+ export function madeFromInLog(log, event, nameOf) {
109
+ if (event["type"] !== "message.post")
110
+ return undefined;
111
+ const files = Array.isArray(event["attachments"])
112
+ ? event["attachments"]
113
+ : [];
114
+ for (const file of files)
115
+ delete file["replaces"];
116
+ const map = event["replaces"];
117
+ delete event["replaces"];
118
+ if (typeof map !== "object" || map === null)
119
+ return undefined;
120
+ const made = [];
121
+ for (const [carried, from] of Object.entries(map)) {
122
+ const file = files.find((each) => each["attachment_id"] === carried);
123
+ if (file === undefined) {
124
+ return {
125
+ kind: "invalid",
126
+ message: `replaces names ${carried}, which this message does not carry`,
127
+ };
128
+ }
129
+ const was = factOf(log, from);
130
+ if (was === undefined ||
131
+ was.space_id !== event["space_id"] ||
132
+ was.filename !== file["filename"])
133
+ continue;
134
+ file["replaces"] = from;
135
+ made.push({
136
+ filename: String(file["filename"]),
137
+ sha256: String(file["sha256"]),
138
+ from: was.sha256,
139
+ });
140
+ }
141
+ const current = staleVersion(made, versionsOf(postedFilesInLog(log, String(event["space_id"]))));
142
+ return current === undefined ? undefined : staleRefusal(current, nameOf(current.by));
143
+ }
144
+ //# sourceMappingURL=room-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-files.js","sourceRoot":"","sources":["../src/room-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The golden scenario, played from the person's chair (technical-plan Appendix A). The person
3
+ * says what they said in the plan; whatever the harness asks, the person answers — a card is
4
+ * approved, a question takes its default — until the run ends or nothing more comes. Then the
5
+ * log is read: which rows of the checklist the harness lit, and what it got wrong on the way.
6
+ *
7
+ * The driver never assumes the adapter's shape beyond the wire. It does not know where an
8
+ * adapter reads its usage from, or that Jacobian's card is a keyboard; it knows a person said
9
+ * something and a harness was expected to work, ask, and finish.
10
+ *
11
+ * A harness that declares `new_spaces` is then asked for a room of its own, as the + by the tab
12
+ * bar asks: the person opens a room, asks the harness into it and says what it is for. It must
13
+ * claim the room under a key of its own, and is expected to answer there. A harness that does not
14
+ * declare it is not asked, and passes or fails on the golden scenario alone.
15
+ *
16
+ * A harness that declares `forks` is asked for a copy of the agent it played the scenario as, in
17
+ * a room of the person's (ADR 0087, Fork): its copy, registered with `forked_from` and the room,
18
+ * must join it while the room waits.
19
+ */
20
+ import { type Report } from "./report.js";
21
+ import type { ChipsAddress, Subject } from "./subject.js";
22
+ /** What the person says: the first line of the golden scenario. */
23
+ export declare const GOLDEN_MESSAGE = "Here's the signed PO. Get it confirmed with Northwind and update the tracker.";
24
+ /** What the person asks a new room for, of a harness that declares `new_spaces`. */
25
+ export declare const NEW_SPACE_MESSAGE = "Plan the kitchen remodel: two quotes, a budget and a start date.";
26
+ export interface ConformanceOptions {
27
+ readonly subject: Subject;
28
+ /** Where the fake listens. Any free port when absent. */
29
+ readonly port?: number | undefined;
30
+ /** How long to wait for each thing the harness should do next. Ten seconds. */
31
+ readonly beatTimeoutMs?: number | undefined;
32
+ /** How long to wait for a harness that acts on its own to connect. Two minutes. */
33
+ readonly connectTimeoutMs?: number | undefined;
34
+ /** Told where Chips is once it listens — what `custom` prints for a person to paste. */
35
+ readonly onAddress?: ((address: ChipsAddress) => void) | undefined;
36
+ /** Progress, a line at a time, as the scenario plays. */
37
+ readonly log?: ((line: string) => void) | undefined;
38
+ }
39
+ /** Walk the subject through the scenario and read the log. Never throws: what went wrong is in the report. */
40
+ export declare function runConformance(options: ConformanceOptions): Promise<Report>;
41
+ //# sourceMappingURL=scenario.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAgD,KAAK,MAAM,EAAU,MAAM,aAAa,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAI1D,mEAAmE;AACnE,eAAO,MAAM,cAAc,kFACsD,CAAC;AAElF,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,qEAAqE,CAAC;AAEpG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,mFAAmF;IACnF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACnE,yDAAyD;IACzD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACrD;AA0ZD,8GAA8G;AAC9G,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CjF"}
@@ -0,0 +1,414 @@
1
+ /**
2
+ * The golden scenario, played from the person's chair (technical-plan Appendix A). The person
3
+ * says what they said in the plan; whatever the harness asks, the person answers — a card is
4
+ * approved, a question takes its default — until the run ends or nothing more comes. Then the
5
+ * log is read: which rows of the checklist the harness lit, and what it got wrong on the way.
6
+ *
7
+ * The driver never assumes the adapter's shape beyond the wire. It does not know where an
8
+ * adapter reads its usage from, or that Jacobian's card is a keyboard; it knows a person said
9
+ * something and a harness was expected to work, ask, and finish.
10
+ *
11
+ * A harness that declares `new_spaces` is then asked for a room of its own, as the + by the tab
12
+ * bar asks: the person opens a room, asks the harness into it and says what it is for. It must
13
+ * claim the room under a key of its own, and is expected to answer there. A harness that does not
14
+ * declare it is not asked, and passes or fails on the golden scenario alone.
15
+ *
16
+ * A harness that declares `forks` is asked for a copy of the agent it played the scenario as, in
17
+ * a room of the person's (ADR 0087, Fork): its copy, registered with `forked_from` and the room,
18
+ * must join it while the room waits.
19
+ */
20
+ import { eventDefinition, HARNESS_CAPABILITIES, messageIdOf } from "@chipschat/protocol";
21
+ import { askForAChange, askForANewAgent, askForARestart, SETTINGS_CAPABILITIES } from "./checks.js";
22
+ import { startFakeChips } from "./fake-chips.js";
23
+ import { levelsOf, passes, rowsOf } from "./report.js";
24
+ import { byHarness, POLL_MS, sleep, within } from "./waiting.js";
25
+ /** What the person says: the first line of the golden scenario. */
26
+ export const GOLDEN_MESSAGE = "Here's the signed PO. Get it confirmed with Northwind and update the tracker.";
27
+ /** What the person asks a new room for, of a harness that declares `new_spaces`. */
28
+ export const NEW_SPACE_MESSAGE = "Plan the kitchen remodel: two quotes, a budget and a start date.";
29
+ const DEFAULT_BEAT_MS = 10_000;
30
+ const DEFAULT_CONNECT_MS = 120_000;
31
+ /** After the run ends, how long trailing events are given to land before the log is read. */
32
+ const SETTLE_MS = 500;
33
+ const ENDINGS = new Set(["run.completed", "run.failed"]);
34
+ const ASKS = new Set(["approval.request", "question.ask"]);
35
+ function messageOf(error) {
36
+ return error instanceof Error ? error.message : String(error);
37
+ }
38
+ /**
39
+ * Has the harness shown up: a socket subscribed, or any call at all made with its token? A poll
40
+ * counts — a harness in hooks mode reads the log before it has anything to say, and a kit that
41
+ * waited for it to speak first would wait for ever, as would the harness.
42
+ */
43
+ async function connectedWithin(chips, ms, log) {
44
+ const { harnessId } = chips.address;
45
+ const spoke = () => chips.heard() || chips.workspace.log.some((event) => byHarness(event, harnessId));
46
+ const until = Date.now() + ms;
47
+ log(`Waiting for the harness to connect (up to ${Math.round(ms / 1000)} s)…`);
48
+ while (Date.now() < until) {
49
+ if (spoke()) {
50
+ log("The harness is here.");
51
+ return true;
52
+ }
53
+ await sleep(POLL_MS);
54
+ }
55
+ return spoke();
56
+ }
57
+ /**
58
+ * The next thing the harness does that the person must answer, or that ends the run. A lane's
59
+ * own ending is not the run's (M3.5): a subagent finishing, a Space handing back, is news for
60
+ * the lead, and the person waits for the lead.
61
+ */
62
+ async function nextBeat(chips, after, timeoutMs) {
63
+ const { harnessId } = chips.address;
64
+ const ends = (event) => ENDINGS.has(event.type) && !chips.workspace.isLaneRun(event.run_id);
65
+ try {
66
+ return await chips.waitFor((event) => event.seq > after && byHarness(event, harnessId) && (ASKS.has(event.type) || ends(event))
67
+ ? event
68
+ : undefined, timeoutMs);
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ }
74
+ /** What was being waited for when nothing came, said so the report can. */
75
+ function nothingCame(chips, timeoutMs) {
76
+ const seconds = Math.round(timeoutMs / 1000);
77
+ const { harnessId } = chips.address;
78
+ const events = chips.workspace.log.filter((event) => byHarness(event, harnessId));
79
+ if (!events.some((event) => event.type === "run.started")) {
80
+ return `no run started within ${seconds} s of the message`;
81
+ }
82
+ return `the run did not end within ${seconds} s of the last thing the person answered`;
83
+ }
84
+ /** Answer whatever comes, until the run ends. */
85
+ async function answerUntilTheEnd(chips, since, beatMs, findings, log) {
86
+ let cursor = since;
87
+ for (;;) {
88
+ const next = await nextBeat(chips, cursor, beatMs);
89
+ if (next === undefined) {
90
+ findings.push({ severity: "note", message: nothingCame(chips, beatMs) });
91
+ return;
92
+ }
93
+ cursor = next.seq;
94
+ if (ENDINGS.has(next.type)) {
95
+ log(`The run ${next.type === "run.completed" ? "completed" : "failed"}.`);
96
+ return;
97
+ }
98
+ if (next.type === "approval.request") {
99
+ const action = next.payload["action"]?.kind ?? "an action";
100
+ await chips.decide(String(next.payload["approval_id"]), "approved", { reason: "Go ahead." });
101
+ log(`You approved ${action}.`);
102
+ }
103
+ else {
104
+ await chips.answer(String(next.payload["ask_id"]));
105
+ log("You answered the question with its default.");
106
+ }
107
+ }
108
+ }
109
+ /** The subject's turn must finish once the run has; a turn that hangs is a finding, not a hang. */
110
+ async function settled(turning, ms, findings) {
111
+ if (turning === undefined)
112
+ return;
113
+ let timer;
114
+ const late = new Promise((resolve) => {
115
+ timer = setTimeout(() => resolve("late"), ms);
116
+ });
117
+ const outcome = await Promise.race([turning.then(() => "done"), late]);
118
+ clearTimeout(timer);
119
+ if (outcome === "late") {
120
+ findings.push({
121
+ severity: "warn",
122
+ message: `the subject's turn had not finished ${Math.round(ms / 1000)} s after the run ended`,
123
+ });
124
+ }
125
+ }
126
+ async function play(chips, subject, beatMs, findings, log) {
127
+ const message = await chips.say(GOLDEN_MESSAGE);
128
+ log(`You: ${GOLDEN_MESSAGE}`);
129
+ const turning = subject
130
+ .turn?.({
131
+ spaceId: chips.address.spaceId,
132
+ messageId: messageIdOf(message.id),
133
+ text: GOLDEN_MESSAGE,
134
+ })
135
+ .catch((error) => {
136
+ findings.push({
137
+ severity: "error",
138
+ message: `the subject's turn failed: ${messageOf(error)}`,
139
+ });
140
+ });
141
+ await answerUntilTheEnd(chips, message.seq, beatMs, findings, log);
142
+ await sleep(SETTLE_MS);
143
+ await settled(turning, beatMs, findings);
144
+ }
145
+ /** A person asks for a new room: the harness claims it, and answers there. */
146
+ async function askForARoom(chips, beatMs, findings, log) {
147
+ const { harnessId } = chips.address;
148
+ const seconds = Math.round(beatMs / 1000);
149
+ const { spaceId } = await chips.askForSpace(NEW_SPACE_MESSAGE);
150
+ log(`You asked for a new space: ${NEW_SPACE_MESSAGE}`);
151
+ const claimed = await within(chips, (event) => event.type === "space.claimed" && event.space_id === spaceId, beatMs);
152
+ if (claimed === undefined) {
153
+ findings.push({
154
+ severity: "error",
155
+ message: `the harness declares new_spaces but did not claim the space a person asked it for within ${seconds} s`,
156
+ });
157
+ return;
158
+ }
159
+ const title = claimed.payload["title"];
160
+ log(`It claimed the space${typeof title === "string" ? ` as “${title}”` : ""}.`);
161
+ if (typeof title !== "string") {
162
+ findings.push({
163
+ severity: "note",
164
+ message: "the new space was claimed without a title, so it reads as its first words",
165
+ });
166
+ }
167
+ const answered = await within(chips, (event) => event.type === "message.post" && event.space_id === spaceId && byHarness(event, harnessId), beatMs);
168
+ if (answered === undefined) {
169
+ findings.push({
170
+ severity: "warn",
171
+ message: `the harness claimed the new space but said nothing in it within ${seconds} s`,
172
+ });
173
+ }
174
+ else
175
+ log("It answered in the new space.");
176
+ }
177
+ /** A person asks for a copy of the harness's agent in another room: the copy joins it. */
178
+ async function askForACopy(chips, beatMs, findings, log) {
179
+ const { workspace } = chips;
180
+ const original = [...workspace.agents.values()].find((agent) => !agent.lead && workspace.agentRoom(agent.agent_id) === chips.address.spaceId);
181
+ if (original === undefined) {
182
+ findings.push({
183
+ severity: "warn",
184
+ message: "the harness declares forks, but no agent of its is in the scenario's space to copy",
185
+ });
186
+ return;
187
+ }
188
+ const spaceId = await chips.openRoom("Second opinion");
189
+ const { forkId } = await chips.askForFork(original.agent_id, spaceId);
190
+ log(`You asked for a copy of ${original.name} in another space.`);
191
+ const joined = await within(chips, (event) => event.type === "membership.added" && event.payload["fork_of"] === forkId, beatMs);
192
+ if (joined === undefined) {
193
+ findings.push({
194
+ severity: "error",
195
+ message: `the harness declares forks but no copy joined the space it was asked for within ${Math.round(beatMs / 1000)} s`,
196
+ });
197
+ return;
198
+ }
199
+ const copy = workspace.agents.get(String(joined.payload["participant_id"]));
200
+ log(`Its copy${copy === undefined ? "" : `, ${copy.name},`} joined the space.`);
201
+ }
202
+ function errorsIn(findings) {
203
+ return findings.filter((finding) => finding.severity === "error").length;
204
+ }
205
+ /** Whether the harness was there to play at all. */
206
+ function played(chips) {
207
+ return chips.workspace.log.some((event) => byHarness(event, chips.address.harnessId));
208
+ }
209
+ function unique(findings) {
210
+ const seen = new Set();
211
+ return findings.filter((finding) => {
212
+ const key = `${finding.severity}:${finding.message}`;
213
+ if (seen.has(key))
214
+ return false;
215
+ seen.add(key);
216
+ return true;
217
+ });
218
+ }
219
+ /** What the log says the harness got wrong, beyond which rows it lit. */
220
+ function findingsFrom(chips) {
221
+ const { harnessId } = chips.address;
222
+ const found = [];
223
+ const sent = chips.workspace.log.filter((event) => byHarness(event, harnessId));
224
+ for (const refused of chips.workspace.refusals) {
225
+ if (refused.who !== "harness")
226
+ continue;
227
+ found.push({
228
+ severity: "error",
229
+ message: `Chips refused ${refused.type ?? "an event"}: ${refused.message}`,
230
+ });
231
+ }
232
+ for (const dropped of chips.workspace.dropped) {
233
+ if (dropped.who !== "harness")
234
+ continue;
235
+ found.push({
236
+ severity: "warn",
237
+ message: `${dropped.type} carried \`${dropped.field}\`, which the protocol does not declare: Chips drops it`,
238
+ });
239
+ }
240
+ for (const event of sent) {
241
+ if (eventDefinition(event.type)?.requiresRun === true && event.run_id === null) {
242
+ found.push({
243
+ severity: "warn",
244
+ message: `${event.type} was sent without a run; the protocol says it belongs to one`,
245
+ });
246
+ }
247
+ }
248
+ found.push(...approvalFindings(chips, sent), ...runFindings(chips, sent));
249
+ return unique(found);
250
+ }
251
+ function approvalFindings(chips, sent) {
252
+ const found = [];
253
+ const executed = new Set(sent
254
+ .filter((event) => event.type === "approval.executed")
255
+ .map((event) => String(event.payload["approval_id"])));
256
+ for (const row of chips.workspace.approvals.values()) {
257
+ if (row.state !== "resolved" || row.decision === "denied")
258
+ continue;
259
+ if (!executed.has(row.approval_id)) {
260
+ found.push({
261
+ severity: "warn",
262
+ message: "an approval was answered yes but the run never said what became of it: send approval.executed so the card can move from approved to sent",
263
+ });
264
+ }
265
+ }
266
+ return found;
267
+ }
268
+ /** The steps still open at the end: started, and never reported done or failed. */
269
+ function openSteps(sent) {
270
+ const open = new Map();
271
+ for (const event of sent) {
272
+ if (event.type !== "step.log")
273
+ continue;
274
+ const stepId = String(event.payload["step_id"]);
275
+ if (event.payload["status"] === "started") {
276
+ open.set(stepId, String(event.payload["title"] ?? stepId));
277
+ }
278
+ else
279
+ open.delete(stepId);
280
+ }
281
+ return [...open.values()];
282
+ }
283
+ function runFindings(chips, sent) {
284
+ const found = [];
285
+ const open = openSteps(sent);
286
+ for (const run of chips.workspace.runs.values()) {
287
+ if (run.state !== "done" && run.state !== "failed") {
288
+ found.push({ severity: "warn", message: `a run was left ${run.state}` });
289
+ }
290
+ else if (open.length > 0) {
291
+ found.push({
292
+ severity: "warn",
293
+ message: `the run ended with ${open.length} step${open.length === 1 ? "" : "s"} still started: ${open.join(", ")}`,
294
+ });
295
+ }
296
+ }
297
+ return [...found, ...trailingFindings(sent)];
298
+ }
299
+ /** What a usage or a failure says about itself. */
300
+ function trailingFindings(sent) {
301
+ const found = [];
302
+ for (const event of sent) {
303
+ if (event.type === "usage" && event.payload["cost"] === undefined) {
304
+ found.push({
305
+ severity: "note",
306
+ message: "usage carried no cost; Chips estimates one from its price table",
307
+ });
308
+ }
309
+ if (event.type === "run.failed") {
310
+ found.push({
311
+ severity: "note",
312
+ message: `the run failed: ${String(event.payload["error"])}`,
313
+ });
314
+ }
315
+ }
316
+ return found;
317
+ }
318
+ async function stopQuietly(subject, findings) {
319
+ try {
320
+ await subject.stop();
321
+ }
322
+ catch (error) {
323
+ findings.push({
324
+ severity: "warn",
325
+ message: `stopping the subject failed: ${messageOf(error)}`,
326
+ });
327
+ }
328
+ }
329
+ /**
330
+ * Each capability the harness declares, checked after the golden scenario: what became of it,
331
+ * passed or failed by whether its check found anything wrong.
332
+ */
333
+ async function playCapabilities(chips, declared, beatMs, findings, log) {
334
+ const outcomes = new Map();
335
+ const check = async (capability, step) => {
336
+ if (!declared.has(capability))
337
+ return;
338
+ const before = errorsIn(findings);
339
+ await step();
340
+ outcomes.set(capability, errorsIn(findings) > before ? "failed" : "passed");
341
+ };
342
+ const { newSpaces, forks, newAgents, restarts } = HARNESS_CAPABILITIES;
343
+ await check(newSpaces, () => askForARoom(chips, beatMs, findings, log));
344
+ await check(forks, () => askForACopy(chips, beatMs, findings, log));
345
+ await check(newAgents, () => askForANewAgent(chips, beatMs, findings, log));
346
+ for (const capability of SETTINGS_CAPABILITIES) {
347
+ await check(capability, () => askForAChange(capability, chips, beatMs, findings, log));
348
+ }
349
+ // Last: it may take the harness away and back.
350
+ await check(restarts, () => askForARestart(chips, beatMs, findings, log));
351
+ return outcomes;
352
+ }
353
+ /** What no check sees is declared; what a harness never came to play is failed. */
354
+ function settle(chips, declared, outcomes) {
355
+ const all = new Map(outcomes);
356
+ const there = played(chips);
357
+ for (const capability of declared) {
358
+ if (!all.has(capability))
359
+ all.set(capability, there ? "declared" : "failed");
360
+ }
361
+ return all;
362
+ }
363
+ /** Walk the subject through the scenario and read the log. Never throws: what went wrong is in the report. */
364
+ export async function runConformance(options) {
365
+ const { subject } = options;
366
+ const log = options.log ?? (() => undefined);
367
+ const beatMs = options.beatTimeoutMs ?? DEFAULT_BEAT_MS;
368
+ const chips = await startFakeChips({ port: options.port, capabilities: subject.capabilities });
369
+ const declared = new Set(subject.capabilities ?? []);
370
+ let outcomes = new Map();
371
+ const started = Date.now();
372
+ const findings = [];
373
+ try {
374
+ options.onAddress?.(chips.address);
375
+ await subject.start(chips.address);
376
+ const present = subject.turn !== undefined ||
377
+ (await connectedWithin(chips, options.connectTimeoutMs ?? DEFAULT_CONNECT_MS, log));
378
+ if (present) {
379
+ await play(chips, subject, beatMs, findings, log);
380
+ outcomes = await playCapabilities(chips, declared, beatMs, findings, log);
381
+ }
382
+ else {
383
+ findings.push({
384
+ severity: "error",
385
+ message: "the harness never connected: no socket subscribed and nothing arrived over HTTP",
386
+ });
387
+ }
388
+ }
389
+ catch (error) {
390
+ findings.push({
391
+ severity: "error",
392
+ message: `the scenario could not be played: ${messageOf(error)}`,
393
+ });
394
+ }
395
+ finally {
396
+ await stopQuietly(subject, findings);
397
+ await chips.close();
398
+ }
399
+ const sent = chips.workspace.log
400
+ .filter((event) => byHarness(event, chips.address.harnessId))
401
+ .map((event) => event.type);
402
+ const rows = rowsOf(sent);
403
+ const all = unique([...findings, ...findingsFrom(chips)]);
404
+ return {
405
+ adapter: subject.name,
406
+ rows,
407
+ levels: levelsOf(rows, settle(chips, declared, outcomes)),
408
+ findings: all,
409
+ events: sent.length,
410
+ durationMs: Date.now() - started,
411
+ passed: passes(rows, all),
412
+ };
413
+ }
414
+ //# sourceMappingURL=scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario.js","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"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"}