@miadi/episodic-memory-schema 0.12.0 → 0.14.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/README.md +16 -0
- package/dist/chronicle-manifest.d.ts +2 -0
- package/dist/chronicle-manifest.d.ts.map +1 -1
- package/dist/chronicle-manifest.js +3 -0
- package/dist/chronicle-manifest.js.map +1 -1
- package/dist/episode-media.d.ts +110 -0
- package/dist/episode-media.d.ts.map +1 -0
- package/dist/episode-media.js +169 -0
- package/dist/episode-media.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/screenwalk.d.ts +194 -0
- package/dist/screenwalk.d.ts.map +1 -0
- package/dist/screenwalk.js +438 -0
- package/dist/screenwalk.js.map +1 -0
- package/dist/story-library-manifest.d.ts +1 -1
- package/dist/story-library-manifest.js +1 -1
- package/package.json +2 -1
- package/schema/screenwalk.schema.json +124 -0
package/README.md
CHANGED
|
@@ -182,6 +182,22 @@ modifies source material.
|
|
|
182
182
|
- **Reviews held by an episode.** `parseReviewRef`, `readEpisodeReviews`, `reviewNodeId` and
|
|
183
183
|
`EpisodeReviewEntry` type a Miadi review inside `episode.yaml` (`reviews:`), with its
|
|
184
184
|
`review:<uuid>` node id. Pure: no fs, no fetch.
|
|
185
|
+
- **Screenwalks.** `ScreenwalkRecord` types a screenwalk, a recording of a person working live
|
|
186
|
+
with agent sessions, as an episode holds it in `captures/screenwalk-<id>/screenwalk.json`: its
|
|
187
|
+
id is the stamp the person names when recording starts (`miadi-screenwalk:<yymmddHHMM>`), and
|
|
188
|
+
it gathers the sessions on screen with their ledgers, the video, the review, transcriptions,
|
|
189
|
+
witness closings and outputs (dialogue, chapters, shorts). `toScreenwalkRecord` also reads the
|
|
190
|
+
screenwalk `capture.json` files written by hand before the record existed, `isScreenwalkRecord`
|
|
191
|
+
guards the written form, and `@miadi/episodic-memory-schema/schema/screenwalk` is its JSON
|
|
192
|
+
Schema. A record lists its `stills` (frames kept as images, with the minute) and its `seeds`
|
|
193
|
+
(the images the walk starts from). Pure: no fs, no fetch.
|
|
194
|
+
- **Media records.** `EpisodeMediaRecord` is the record kept beside a picture in an episode,
|
|
195
|
+
`<media path>.yaml`: its role (cover, map, still, illustration, photo, screenshot), alt text,
|
|
196
|
+
caption, origin (generated, photo, screenshot, frame, drawn, imported, with the tool, notebook
|
|
197
|
+
or screenwalk), who made it, who chose it, its digest and the original it was stored from.
|
|
198
|
+
`toEpisodeMediaRecord` reads one tolerantly in file order; `episodeMediaCredit` gives the line
|
|
199
|
+
a surface shows at the bottom of the picture. `EpisodeManifestEntry.cover` carries the cover
|
|
200
|
+
`episode.yaml` names.
|
|
185
201
|
|
|
186
202
|
## Versioning
|
|
187
203
|
|
|
@@ -41,6 +41,8 @@ export interface EpisodeManifestEntry {
|
|
|
41
41
|
relations: EpisodeRelation[];
|
|
42
42
|
/** True when a structured `episode.yaml` was observed (vs. name-only). */
|
|
43
43
|
structured: boolean;
|
|
44
|
+
/** The episode's cover image, vessel-relative (`episode.yaml` `cover:`). jgwill/Miadi#743. */
|
|
45
|
+
cover?: string;
|
|
44
46
|
/**
|
|
45
47
|
* Published book/story form(s) for this episode, attached by `linkStoryForms`
|
|
46
48
|
* from a `StoryLibraryManifest`. Absent when the episode has no published story.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chronicle-manifest.d.ts","sourceRoot":"","sources":["../src/chronicle-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,8BAA8B,CAAA;AACnE,eAAO,MAAM,gBAAgB,oBAAoB,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,SAAS,EAAE,eAAe,EAAE,CAAA;IAC5B,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,EACzC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACpD,oBAAoB,EAAE,CAMxB;AAED,wEAAwE;AACxE,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC,WAAW,EAAE,uBAAuB,EAAE,CAAA;CACvC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,2BAA2B,EAAE,EAC9C,OAAO,GAAE,+BAAoC,GAC5C,iBAAiB,
|
|
1
|
+
{"version":3,"file":"chronicle-manifest.d.ts","sourceRoot":"","sources":["../src/chronicle-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,8BAA8B,CAAA;AACnE,eAAO,MAAM,gBAAgB,oBAAoB,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,SAAS,EAAE,eAAe,EAAE,CAAA;IAC5B,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAA;IACnB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,EACzC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACpD,oBAAoB,EAAE,CAMxB;AAED,wEAAwE;AACxE,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC,WAAW,EAAE,uBAAuB,EAAE,CAAA;CACvC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,2BAA2B,EAAE,EAC9C,OAAO,GAAE,+BAAoC,GAC5C,iBAAiB,CA0DnB"}
|
|
@@ -68,6 +68,9 @@ export function observeChronicleManifest(inputs, options = {}) {
|
|
|
68
68
|
relations: obs?.relations ?? [],
|
|
69
69
|
structured: obs !== undefined,
|
|
70
70
|
};
|
|
71
|
+
const cover = obs ? readStringField(obs.unmappedFields, "cover") : undefined;
|
|
72
|
+
if (cover)
|
|
73
|
+
entry.cover = cover;
|
|
71
74
|
if (obs) {
|
|
72
75
|
for (const d of obs.diagnostics) {
|
|
73
76
|
diagnostics.push({ ...d, path: d.path ?? input.name });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chronicle-manifest.js","sourceRoot":"","sources":["../src/chronicle-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,2BAA2B,CAAA;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,aAAa,IAAI,EAAE,CAAA;AAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"chronicle-manifest.js","sourceRoot":"","sources":["../src/chronicle-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The record beside a picture (later a sound or a film) kept in an episode: what it is,
|
|
3
|
+
* where it came from, who made it and who chose it.
|
|
4
|
+
*
|
|
5
|
+
* File: `<media path>.yaml` beside the media file, e.g. `images/still.webp.yaml`. One record
|
|
6
|
+
* per file, so two seats adding at once never edit the same file (D2 of the episode images
|
|
7
|
+
* proposal, jgwill/Miadi#743). Guillaume, 2026-10-07: images say where they came from and who
|
|
8
|
+
* chose them; a generated image says so in a discreet credit at its bottom.
|
|
9
|
+
*
|
|
10
|
+
* The `role` separates what a picture is for. A cover is the episode's face. A map explains
|
|
11
|
+
* the episode as a whole, such as Deep Diver's infographic of the screenwalk lifecycle. A still
|
|
12
|
+
* is a frame of a screenwalk.
|
|
13
|
+
*
|
|
14
|
+
* Shape (YAML, keys in this order):
|
|
15
|
+
*
|
|
16
|
+
* media: screenwalk-lifecycle-261007.png
|
|
17
|
+
* role: map
|
|
18
|
+
* alt: Infographic of the screenwalk lifecycle, from Capture and Witnessing to Final Archival
|
|
19
|
+
* caption: The Screenwalk Lifecycle
|
|
20
|
+
* origin:
|
|
21
|
+
* kind: generated
|
|
22
|
+
* tool: Gemini Notebook infographic
|
|
23
|
+
* notebook: 0ae51b4c-8ed2-4ee2-a641-2c7e88b7e2ea
|
|
24
|
+
* source: captures/notebook-0ae51b4c-…/Screenwalk-Lifecycle-Process-Diagram-20261007T000621.png
|
|
25
|
+
* made_by: T6 Deep Diver seat
|
|
26
|
+
* chosen_by: Guillaume
|
|
27
|
+
* added_by: Guillaume
|
|
28
|
+
* added_at: 2026-10-07T07:10:00Z
|
|
29
|
+
* sha256: …
|
|
30
|
+
* original: { name: …, type: image/png, bytes: 3962783, sha256: …, width: …, height: … }
|
|
31
|
+
* public_uses: [https://…]
|
|
32
|
+
* boundary: Illustrative, not evidence that …
|
|
33
|
+
*
|
|
34
|
+
* Pure: no fs, no YAML. Reading and writing the file is the host's.
|
|
35
|
+
*/
|
|
36
|
+
/** What a picture is for in its episode. */
|
|
37
|
+
export declare const EPISODE_MEDIA_ROLES: readonly ["cover", "map", "still", "illustration", "photo", "screenshot", "other"];
|
|
38
|
+
export type EpisodeMediaRole = (typeof EPISODE_MEDIA_ROLES)[number];
|
|
39
|
+
/** How it came to exist. */
|
|
40
|
+
export declare const EPISODE_MEDIA_ORIGIN_KINDS: readonly ["generated", "photo", "screenshot", "frame", "drawn", "imported"];
|
|
41
|
+
export type EpisodeMediaOriginKind = (typeof EPISODE_MEDIA_ORIGIN_KINDS)[number];
|
|
42
|
+
export interface EpisodeMediaOrigin {
|
|
43
|
+
kind: EpisodeMediaOriginKind;
|
|
44
|
+
/** The model or tool, e.g. `xai/grok-imagine-image-2.0`, `Gemini Notebook infographic`. */
|
|
45
|
+
tool?: string;
|
|
46
|
+
/** The prompt file beside it, or the prompt text. */
|
|
47
|
+
prompt?: string;
|
|
48
|
+
/** An image the generation was guided by. */
|
|
49
|
+
reference?: string;
|
|
50
|
+
/** A Deep Diver / Gemini Notebook id. */
|
|
51
|
+
notebook?: string;
|
|
52
|
+
/** For a frame: `miadi-screenwalk:<id>` and where in the video. */
|
|
53
|
+
screenwalk?: string;
|
|
54
|
+
at?: string;
|
|
55
|
+
/** The device that took a photo or a screenshot. */
|
|
56
|
+
device?: string;
|
|
57
|
+
/** The file this one was made from, when the episode keeps it too. */
|
|
58
|
+
source?: string;
|
|
59
|
+
}
|
|
60
|
+
/** The file as it was received, when it was stored in another form. */
|
|
61
|
+
export interface EpisodeMediaOriginal {
|
|
62
|
+
name?: string;
|
|
63
|
+
type?: string;
|
|
64
|
+
bytes?: number;
|
|
65
|
+
sha256?: string;
|
|
66
|
+
width?: number;
|
|
67
|
+
height?: number;
|
|
68
|
+
}
|
|
69
|
+
export interface EpisodeMediaRecord {
|
|
70
|
+
/** The media file's name, as a check that the record sits beside the right file. */
|
|
71
|
+
media: string;
|
|
72
|
+
role?: EpisodeMediaRole;
|
|
73
|
+
alt?: string;
|
|
74
|
+
caption?: string;
|
|
75
|
+
origin?: EpisodeMediaOrigin;
|
|
76
|
+
/** The person or agent who made it. */
|
|
77
|
+
made_by?: string;
|
|
78
|
+
/** The person who chose it for the episode. */
|
|
79
|
+
chosen_by?: string;
|
|
80
|
+
added_by?: string;
|
|
81
|
+
added_at?: string;
|
|
82
|
+
/** Digest of the stored file. */
|
|
83
|
+
sha256?: string;
|
|
84
|
+
original?: EpisodeMediaOriginal;
|
|
85
|
+
/** Where it was published outside the chronicle. */
|
|
86
|
+
public_uses?: string[];
|
|
87
|
+
/** What it does not prove. */
|
|
88
|
+
boundary?: string;
|
|
89
|
+
}
|
|
90
|
+
/** The record's keys in the order the file writes them. */
|
|
91
|
+
export declare const EPISODE_MEDIA_RECORD_KEYS: readonly ["media", "role", "alt", "caption", "origin", "made_by", "chosen_by", "added_by", "added_at", "sha256", "original", "public_uses", "boundary"];
|
|
92
|
+
/** The record's path for a media file: `images/still.webp` → `images/still.webp.yaml`. */
|
|
93
|
+
export declare function episodeMediaRecordPath(mediaPath: string): string;
|
|
94
|
+
/** The media path a record path belongs to, or null when the path is not a record's. */
|
|
95
|
+
export declare function episodeMediaPathOfRecord(recordPath: string): string | null;
|
|
96
|
+
export declare function isEpisodeMediaRole(value: unknown): value is EpisodeMediaRole;
|
|
97
|
+
/**
|
|
98
|
+
* Tolerant reader: keeps what it recognises, in file order, and drops the rest. `media` falls
|
|
99
|
+
* back to `options.media` (the file the record sits beside). Null when neither names a file.
|
|
100
|
+
*/
|
|
101
|
+
export declare function toEpisodeMediaRecord(raw: unknown, options?: {
|
|
102
|
+
media?: string;
|
|
103
|
+
}): EpisodeMediaRecord | null;
|
|
104
|
+
/**
|
|
105
|
+
* The credit a surface shows at the bottom of a picture, or null when the record names no one
|
|
106
|
+
* and no tool. "Generated with Gemini Notebook infographic · made by T6 Deep Diver seat · chosen
|
|
107
|
+
* by Guillaume".
|
|
108
|
+
*/
|
|
109
|
+
export declare function episodeMediaCredit(record: EpisodeMediaRecord | null | undefined): string | null;
|
|
110
|
+
//# sourceMappingURL=episode-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"episode-media.d.ts","sourceRoot":"","sources":["../src/episode-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,4CAA4C;AAC5C,eAAO,MAAM,mBAAmB,oFAAqF,CAAA;AACrH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,4BAA4B;AAC5B,eAAO,MAAM,0BAA0B,6EAA8E,CAAA;AACrH,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAA;IAC5B,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,yJAc5B,CAAA;AAMV,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E;AAiBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,kBAAkB,GAAG,IAAI,CA4C9G;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAc/F"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The record beside a picture (later a sound or a film) kept in an episode: what it is,
|
|
3
|
+
* where it came from, who made it and who chose it.
|
|
4
|
+
*
|
|
5
|
+
* File: `<media path>.yaml` beside the media file, e.g. `images/still.webp.yaml`. One record
|
|
6
|
+
* per file, so two seats adding at once never edit the same file (D2 of the episode images
|
|
7
|
+
* proposal, jgwill/Miadi#743). Guillaume, 2026-10-07: images say where they came from and who
|
|
8
|
+
* chose them; a generated image says so in a discreet credit at its bottom.
|
|
9
|
+
*
|
|
10
|
+
* The `role` separates what a picture is for. A cover is the episode's face. A map explains
|
|
11
|
+
* the episode as a whole, such as Deep Diver's infographic of the screenwalk lifecycle. A still
|
|
12
|
+
* is a frame of a screenwalk.
|
|
13
|
+
*
|
|
14
|
+
* Shape (YAML, keys in this order):
|
|
15
|
+
*
|
|
16
|
+
* media: screenwalk-lifecycle-261007.png
|
|
17
|
+
* role: map
|
|
18
|
+
* alt: Infographic of the screenwalk lifecycle, from Capture and Witnessing to Final Archival
|
|
19
|
+
* caption: The Screenwalk Lifecycle
|
|
20
|
+
* origin:
|
|
21
|
+
* kind: generated
|
|
22
|
+
* tool: Gemini Notebook infographic
|
|
23
|
+
* notebook: 0ae51b4c-8ed2-4ee2-a641-2c7e88b7e2ea
|
|
24
|
+
* source: captures/notebook-0ae51b4c-…/Screenwalk-Lifecycle-Process-Diagram-20261007T000621.png
|
|
25
|
+
* made_by: T6 Deep Diver seat
|
|
26
|
+
* chosen_by: Guillaume
|
|
27
|
+
* added_by: Guillaume
|
|
28
|
+
* added_at: 2026-10-07T07:10:00Z
|
|
29
|
+
* sha256: …
|
|
30
|
+
* original: { name: …, type: image/png, bytes: 3962783, sha256: …, width: …, height: … }
|
|
31
|
+
* public_uses: [https://…]
|
|
32
|
+
* boundary: Illustrative, not evidence that …
|
|
33
|
+
*
|
|
34
|
+
* Pure: no fs, no YAML. Reading and writing the file is the host's.
|
|
35
|
+
*/
|
|
36
|
+
/** What a picture is for in its episode. */
|
|
37
|
+
export const EPISODE_MEDIA_ROLES = ["cover", "map", "still", "illustration", "photo", "screenshot", "other"];
|
|
38
|
+
/** How it came to exist. */
|
|
39
|
+
export const EPISODE_MEDIA_ORIGIN_KINDS = ["generated", "photo", "screenshot", "frame", "drawn", "imported"];
|
|
40
|
+
/** The record's keys in the order the file writes them. */
|
|
41
|
+
export const EPISODE_MEDIA_RECORD_KEYS = [
|
|
42
|
+
"media",
|
|
43
|
+
"role",
|
|
44
|
+
"alt",
|
|
45
|
+
"caption",
|
|
46
|
+
"origin",
|
|
47
|
+
"made_by",
|
|
48
|
+
"chosen_by",
|
|
49
|
+
"added_by",
|
|
50
|
+
"added_at",
|
|
51
|
+
"sha256",
|
|
52
|
+
"original",
|
|
53
|
+
"public_uses",
|
|
54
|
+
"boundary",
|
|
55
|
+
];
|
|
56
|
+
const ORIGIN_KEYS = ["kind", "tool", "prompt", "reference", "notebook", "screenwalk", "at", "device", "source"];
|
|
57
|
+
const ORIGINAL_TEXT_KEYS = ["name", "type", "sha256"];
|
|
58
|
+
const ORIGINAL_NUMBER_KEYS = ["bytes", "width", "height"];
|
|
59
|
+
/** The record's path for a media file: `images/still.webp` → `images/still.webp.yaml`. */
|
|
60
|
+
export function episodeMediaRecordPath(mediaPath) {
|
|
61
|
+
return `${mediaPath}.yaml`;
|
|
62
|
+
}
|
|
63
|
+
/** The media path a record path belongs to, or null when the path is not a record's. */
|
|
64
|
+
export function episodeMediaPathOfRecord(recordPath) {
|
|
65
|
+
return /\.(?:png|jpe?g|webp|gif|avif|m4a|mp3|wav|mp4|webm|mov)\.yaml$/i.test(recordPath) ? recordPath.slice(0, -5) : null;
|
|
66
|
+
}
|
|
67
|
+
export function isEpisodeMediaRole(value) {
|
|
68
|
+
return typeof value === "string" && EPISODE_MEDIA_ROLES.includes(value);
|
|
69
|
+
}
|
|
70
|
+
function text(value, max = 2000) {
|
|
71
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
72
|
+
value = String(value);
|
|
73
|
+
if (typeof value !== "string")
|
|
74
|
+
return undefined;
|
|
75
|
+
const trimmed = value.trim();
|
|
76
|
+
return trimmed ? trimmed.slice(0, max) : undefined;
|
|
77
|
+
}
|
|
78
|
+
function obj(value) {
|
|
79
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : undefined;
|
|
80
|
+
}
|
|
81
|
+
function count(value) {
|
|
82
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Tolerant reader: keeps what it recognises, in file order, and drops the rest. `media` falls
|
|
86
|
+
* back to `options.media` (the file the record sits beside). Null when neither names a file.
|
|
87
|
+
*/
|
|
88
|
+
export function toEpisodeMediaRecord(raw, options = {}) {
|
|
89
|
+
const r = obj(raw) ?? {};
|
|
90
|
+
const media = text(r.media, 300) ?? text(options.media, 300);
|
|
91
|
+
if (!media)
|
|
92
|
+
return null;
|
|
93
|
+
const record = { media };
|
|
94
|
+
if (isEpisodeMediaRole(r.role))
|
|
95
|
+
record.role = r.role;
|
|
96
|
+
for (const key of ["alt", "caption", "made_by", "chosen_by", "added_by", "added_at", "boundary"]) {
|
|
97
|
+
const value = text(r[key], key === "alt" || key === "boundary" ? 1000 : 300);
|
|
98
|
+
if (value)
|
|
99
|
+
record[key] = value;
|
|
100
|
+
}
|
|
101
|
+
const sha = text(r.sha256, 64);
|
|
102
|
+
if (sha && /^[0-9a-f]{64}$/i.test(sha))
|
|
103
|
+
record.sha256 = sha.toLowerCase();
|
|
104
|
+
const o = obj(r.origin);
|
|
105
|
+
const kind = o && EPISODE_MEDIA_ORIGIN_KINDS.includes(o.kind) ? o.kind : undefined;
|
|
106
|
+
if (o && kind) {
|
|
107
|
+
const origin = {};
|
|
108
|
+
for (const key of ORIGIN_KEYS) {
|
|
109
|
+
const value = key === "kind" ? kind : text(o[key], 600);
|
|
110
|
+
if (value)
|
|
111
|
+
origin[key] = value;
|
|
112
|
+
}
|
|
113
|
+
record.origin = origin;
|
|
114
|
+
}
|
|
115
|
+
const g = obj(r.original);
|
|
116
|
+
if (g) {
|
|
117
|
+
const original = {};
|
|
118
|
+
for (const key of ORIGINAL_TEXT_KEYS) {
|
|
119
|
+
const value = text(g[key], 300);
|
|
120
|
+
if (value)
|
|
121
|
+
original[key] = value;
|
|
122
|
+
}
|
|
123
|
+
for (const key of ORIGINAL_NUMBER_KEYS) {
|
|
124
|
+
const value = count(g[key]);
|
|
125
|
+
if (value !== undefined)
|
|
126
|
+
original[key] = value;
|
|
127
|
+
}
|
|
128
|
+
if (Object.keys(original).length)
|
|
129
|
+
record.original = original;
|
|
130
|
+
}
|
|
131
|
+
const uses = (Array.isArray(r.public_uses) ? r.public_uses : []).map((u) => text(u, 600)).filter((u) => u !== undefined);
|
|
132
|
+
if (uses.length)
|
|
133
|
+
record.public_uses = uses;
|
|
134
|
+
const ordered = {};
|
|
135
|
+
for (const key of EPISODE_MEDIA_RECORD_KEYS)
|
|
136
|
+
if (record[key] !== undefined)
|
|
137
|
+
ordered[key] = record[key];
|
|
138
|
+
return ordered;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The credit a surface shows at the bottom of a picture, or null when the record names no one
|
|
142
|
+
* and no tool. "Generated with Gemini Notebook infographic · made by T6 Deep Diver seat · chosen
|
|
143
|
+
* by Guillaume".
|
|
144
|
+
*/
|
|
145
|
+
export function episodeMediaCredit(record) {
|
|
146
|
+
if (!record)
|
|
147
|
+
return null;
|
|
148
|
+
const parts = [];
|
|
149
|
+
const origin = record.origin;
|
|
150
|
+
if (origin?.kind === "generated")
|
|
151
|
+
parts.push(origin.tool ? `Generated with ${origin.tool}` : "Generated");
|
|
152
|
+
else if (origin?.kind === "frame")
|
|
153
|
+
parts.push(origin.at ? `Frame at ${origin.at}` : "Frame");
|
|
154
|
+
else if (origin?.kind === "photo")
|
|
155
|
+
parts.push(origin.device ? `Photo, ${origin.device}` : "Photo");
|
|
156
|
+
else if (origin?.kind === "screenshot")
|
|
157
|
+
parts.push("Screenshot");
|
|
158
|
+
else if (origin?.kind === "drawn")
|
|
159
|
+
parts.push(origin.tool ? `Drawn with ${origin.tool}` : "Drawn");
|
|
160
|
+
if (record.made_by)
|
|
161
|
+
parts.push(`made by ${record.made_by}`);
|
|
162
|
+
if (record.chosen_by && record.chosen_by !== record.made_by)
|
|
163
|
+
parts.push(`chosen by ${record.chosen_by}`);
|
|
164
|
+
if (!parts.length)
|
|
165
|
+
return null;
|
|
166
|
+
const line = parts.join(" · ");
|
|
167
|
+
return line.charAt(0).toUpperCase() + line.slice(1);
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=episode-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"episode-media.js","sourceRoot":"","sources":["../src/episode-media.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -38,4 +38,16 @@ export type { ReviewRef, EpisodeReviewEntry, ObservedEpisodeReview } from "./epi
|
|
|
38
38
|
*/
|
|
39
39
|
export { FOUNDATION_REFERENCE_PREFIX, FOUNDATION_NODE_PREFIX, FOUNDATION_NODE_KIND, FOUNDATION_ENTRY_KEYS, EPISODE_FOUNDATIONS_DIR, DEFAULT_FOUNDATION_RELATION, isFoundationSlug, foundationNodeId, foundationSlugOf, episodeFoundationPath, toEpisodeFoundationEntry, readEpisodeFoundations, } from "./episode-foundation.js";
|
|
40
40
|
export type { FoundationSource, EpisodeFoundationEntry, ObservedEpisodeFoundation } from "./episode-foundation.js";
|
|
41
|
+
/**
|
|
42
|
+
* The screenwalk record: a recording of a person working live with agent sessions, held in an
|
|
43
|
+
* episode as `captures/screenwalk-<id>/screenwalk.json` (Episode 550, jgwill/Miadi#707).
|
|
44
|
+
*/
|
|
45
|
+
export { SCREENWALK_REFERENCE_PREFIX, SCREENWALK_FOLDER_PREFIX, SCREENWALK_FILE, SCREENWALK_STATES, SCREENWALK_OUTPUT_KINDS, SCREENWALK_RECORD_KEYS, LEGACY_SCREENWALK_KEYS, isScreenwalkState, isScreenwalkId, screenwalkReference, screenwalkFolder, screenwalkPath, parseScreenwalkRef, parseScreenwalkStamp, deriveScreenwalkState, toScreenwalkRecord, isScreenwalkRecord, } from "./screenwalk.js";
|
|
46
|
+
export type { ScreenwalkState, ScreenwalkRef, ScreenwalkStamp, ScreenwalkRecording, ScreenwalkVideo, ScreenwalkReview, ScreenwalkSession, ScreenwalkClosing, ScreenwalkTranscription, ScreenwalkOutputKind, ScreenwalkOutput, ScreenwalkStill, ScreenwalkRecord, } from "./screenwalk.js";
|
|
47
|
+
/**
|
|
48
|
+
* The record beside a picture kept in an episode, `<media path>.yaml`: its role (cover, map,
|
|
49
|
+
* still…), alt, caption, origin, who made and who chose it (jgwill/Miadi#743).
|
|
50
|
+
*/
|
|
51
|
+
export { EPISODE_MEDIA_ROLES, EPISODE_MEDIA_ORIGIN_KINDS, EPISODE_MEDIA_RECORD_KEYS, episodeMediaRecordPath, episodeMediaPathOfRecord, isEpisodeMediaRole, toEpisodeMediaRecord, episodeMediaCredit, } from "./episode-media.js";
|
|
52
|
+
export type { EpisodeMediaRole, EpisodeMediaOriginKind, EpisodeMediaOrigin, EpisodeMediaOriginal, EpisodeMediaRecord, } from "./episode-media.js";
|
|
41
53
|
//# sourceMappingURL=index.d.ts.map
|
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,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAE7C;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAA;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAEjE;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,aAAa,EACb,cAAc,EACd,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAEvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAE/F;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAE7C;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAA;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAEjE;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,aAAa,EACb,cAAc,EACd,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAEvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAE/F;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAElH;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAExB;;;GAGG;AACH,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -34,4 +34,14 @@ export { REVIEW_SERVICE_BASE_URL, REVIEW_REFERENCE_PREFIX, REVIEW_NODE_PREFIX, R
|
|
|
34
34
|
* `episode.yaml`, and the wheel node kind it projects to (jgwill/Miadi#713).
|
|
35
35
|
*/
|
|
36
36
|
export { FOUNDATION_REFERENCE_PREFIX, FOUNDATION_NODE_PREFIX, FOUNDATION_NODE_KIND, FOUNDATION_ENTRY_KEYS, EPISODE_FOUNDATIONS_DIR, DEFAULT_FOUNDATION_RELATION, isFoundationSlug, foundationNodeId, foundationSlugOf, episodeFoundationPath, toEpisodeFoundationEntry, readEpisodeFoundations, } from "./episode-foundation.js";
|
|
37
|
+
/**
|
|
38
|
+
* The screenwalk record: a recording of a person working live with agent sessions, held in an
|
|
39
|
+
* episode as `captures/screenwalk-<id>/screenwalk.json` (Episode 550, jgwill/Miadi#707).
|
|
40
|
+
*/
|
|
41
|
+
export { SCREENWALK_REFERENCE_PREFIX, SCREENWALK_FOLDER_PREFIX, SCREENWALK_FILE, SCREENWALK_STATES, SCREENWALK_OUTPUT_KINDS, SCREENWALK_RECORD_KEYS, LEGACY_SCREENWALK_KEYS, isScreenwalkState, isScreenwalkId, screenwalkReference, screenwalkFolder, screenwalkPath, parseScreenwalkRef, parseScreenwalkStamp, deriveScreenwalkState, toScreenwalkRecord, isScreenwalkRecord, } from "./screenwalk.js";
|
|
42
|
+
/**
|
|
43
|
+
* The record beside a picture kept in an episode, `<media path>.yaml`: its role (cover, map,
|
|
44
|
+
* still…), alt, caption, origin, who made and who chose it (jgwill/Miadi#743).
|
|
45
|
+
*/
|
|
46
|
+
export { EPISODE_MEDIA_ROLES, EPISODE_MEDIA_ORIGIN_KINDS, EPISODE_MEDIA_RECORD_KEYS, episodeMediaRecordPath, episodeMediaPathOfRecord, isEpisodeMediaRole, toEpisodeMediaRecord, episodeMediaCredit, } from "./episode-media.js";
|
|
37
47
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAE7C;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAA;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAG7B;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AAOvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAG5B;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,yBAAyB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAE7C;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAA;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAG7B;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AAOvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAG5B;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,yBAAyB,CAAA;AAGhC;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AAiBxB;;;GAGG;AACH,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The chronicle SCREENWALK record — a recording of a person working live with agent
|
|
3
|
+
* sessions, with their voices, held by an episode.
|
|
4
|
+
*
|
|
5
|
+
* Episode 550 ("The Screenwalk as a Media Type") drew the type before any code held it, in
|
|
6
|
+
* `diagrams/screenwalk.erdf.json`: an Episode holds Screenwalks; a Screenwalk witnesses
|
|
7
|
+
* sessions, ends with witness closings, is read as one Review and is teased by Shorts. Its
|
|
8
|
+
* states are the episode's two machines, `screenwalk.smdf.json` (NotStarted to
|
|
9
|
+
* InConversation) and the media cycle that continues after Reviewed.
|
|
10
|
+
*
|
|
11
|
+
* File: `captures/screenwalk-<id>/screenwalk.json` in the episode vessel, beside the seat
|
|
12
|
+
* ledgers. `capture.json` stays the descriptor of a phone audio take (`@miadi/episode-capture`),
|
|
13
|
+
* whose reader skips every other shape. The screenwalk `capture.json` files written by hand
|
|
14
|
+
* before this record existed are read by `toScreenwalkRecord` and converted.
|
|
15
|
+
*
|
|
16
|
+
* The id is the stamp the person writes when they press record, `yymmddHHMM`
|
|
17
|
+
* (`miadi-screenwalk:2610061207`). The first records used `yymmdd-NNN`. The stamp is the
|
|
18
|
+
* minute the person named. `recording.started` is where the uploaded video's clock begins,
|
|
19
|
+
* which can differ from it (a retake).
|
|
20
|
+
*
|
|
21
|
+
* Shape (`screenwalk.json`):
|
|
22
|
+
*
|
|
23
|
+
* { "screenwalk": "2610061207", "reference": "miadi-screenwalk:2610061207",
|
|
24
|
+
* "state": "Reviewed", "episode": "2026-10-01-episode-550-…", "stamp": "2026-10-06T12:07",
|
|
25
|
+
* "recording": { "started": "…", "length": "about 24:30", "evidence": "…", "retake": "…" },
|
|
26
|
+
* "video": { "url": "https://youtu.be/…", "title": "…" },
|
|
27
|
+
* "review": { "id": "6a2b5b59-…", "version": 1 },
|
|
28
|
+
* "related": [], "sessions": [{ "session_id": "…", "name": "…", "ledger": "seat-….md" }],
|
|
29
|
+
* "closings": [], "transcriptions": [{ "file": "…", "source": "…", "coverage": "…" }],
|
|
30
|
+
* "outputs": [], "stills": [{ "file": "images/screenwalk-2610061207/frame.webp", "at": "12:31" }],
|
|
31
|
+
* "seeds": ["images/screenwalk-lifecycle-261007.png"], "finding": "…" }
|
|
32
|
+
*
|
|
33
|
+
* Pure — no fs, no fetch. Reading and writing the file is the consumer's. Ref: jgwill/Miadi#707.
|
|
34
|
+
*/
|
|
35
|
+
/** The portable reference form: `miadi-screenwalk:<id>`. `miadi-screenwalk://<id>` is read too. */
|
|
36
|
+
export declare const SCREENWALK_REFERENCE_PREFIX = "miadi-screenwalk:";
|
|
37
|
+
/** The folder a screenwalk lives in, under the vessel's `captures/`: `screenwalk-<id>`. */
|
|
38
|
+
export declare const SCREENWALK_FOLDER_PREFIX = "screenwalk-";
|
|
39
|
+
/** The record's file inside its folder. */
|
|
40
|
+
export declare const SCREENWALK_FILE = "screenwalk.json";
|
|
41
|
+
/**
|
|
42
|
+
* Every state a screenwalk can be in: Episode 550's `screenwalk.smdf.json`, then the media
|
|
43
|
+
* cycle that continues it after Reviewed (`screenwalk-media-cycle.smdf.json`).
|
|
44
|
+
*/
|
|
45
|
+
export declare const SCREENWALK_STATES: readonly ["NotStarted", "Recording", "Witnessing", "ClosingDrafted", "Played", "Revising", "Recorded", "Published", "Reviewed", "Chronicled", "InConversation", "Enriched", "Notebooked", "MediaGenerated", "Watched", "HeldInCircle", "ScriptedNext"];
|
|
46
|
+
export type ScreenwalkState = (typeof SCREENWALK_STATES)[number];
|
|
47
|
+
export declare function isScreenwalkState(value: unknown): value is ScreenwalkState;
|
|
48
|
+
export declare function isScreenwalkId(value: unknown): value is string;
|
|
49
|
+
export declare function screenwalkReference(id: string): string;
|
|
50
|
+
export declare function screenwalkFolder(id: string): string;
|
|
51
|
+
/** The record's path inside an episode vessel, relative to the vessel. */
|
|
52
|
+
export declare function screenwalkPath(id: string): string;
|
|
53
|
+
export interface ScreenwalkRef {
|
|
54
|
+
id: string;
|
|
55
|
+
/** `miadi-screenwalk:<id>`. */
|
|
56
|
+
reference: string;
|
|
57
|
+
/** `screenwalk-<id>`, the folder under `captures/`. */
|
|
58
|
+
folder: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read a screenwalk reference: `miadi-screenwalk:<id>`, `miadi-screenwalk://<id>`, a folder
|
|
62
|
+
* name `screenwalk-<id>`, or a bare id. Null for anything else.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseScreenwalkRef(input: unknown): ScreenwalkRef | null;
|
|
65
|
+
export interface ScreenwalkStamp {
|
|
66
|
+
/** `YYYY-MM-DD`. */
|
|
67
|
+
date: string;
|
|
68
|
+
/** `HH:MM`, present when the id carries an hour. An id with an hour and no minute gives `HH:00`. */
|
|
69
|
+
time?: string;
|
|
70
|
+
precision: "day" | "hour" | "minute";
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The date and time an id names, read from its leading digits (`yymmdd`, `yymmddHH`,
|
|
74
|
+
* `yymmddHHMM`). Local time, as the person wrote it. Null when the digits are not a date.
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseScreenwalkStamp(id: string): ScreenwalkStamp | null;
|
|
77
|
+
export interface ScreenwalkRecording {
|
|
78
|
+
/** Where the uploaded video's clock begins, ISO or as the evidence states it. */
|
|
79
|
+
started?: string;
|
|
80
|
+
/** The video's length as measured, e.g. `about 24:30`. */
|
|
81
|
+
length?: string;
|
|
82
|
+
/** How `started` was established. */
|
|
83
|
+
evidence?: string;
|
|
84
|
+
/** Why the video differs from the recording the stamp named, when it does. */
|
|
85
|
+
retake?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface ScreenwalkVideo {
|
|
88
|
+
url: string;
|
|
89
|
+
title?: string;
|
|
90
|
+
published_at?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface ScreenwalkReview {
|
|
93
|
+
/** The review UUID. */
|
|
94
|
+
id: string;
|
|
95
|
+
/** The version this record last checked. */
|
|
96
|
+
version?: number;
|
|
97
|
+
}
|
|
98
|
+
/** A session on screen (the ERD's WitnessedSession). */
|
|
99
|
+
export interface ScreenwalkSession {
|
|
100
|
+
session_id?: string;
|
|
101
|
+
/** The session's name, often its tmux name. */
|
|
102
|
+
name?: string;
|
|
103
|
+
/** What the session was doing in the recording. */
|
|
104
|
+
note?: string;
|
|
105
|
+
/** The seat ledger file in this folder: what the seat did, in wall-clock time. */
|
|
106
|
+
ledger?: string;
|
|
107
|
+
}
|
|
108
|
+
/** A witness closing played in the recording (the ERD's WitnessClosing). */
|
|
109
|
+
export interface ScreenwalkClosing {
|
|
110
|
+
version: number;
|
|
111
|
+
file?: string;
|
|
112
|
+
/** The person's words after hearing this version. */
|
|
113
|
+
correction?: string;
|
|
114
|
+
}
|
|
115
|
+
export interface ScreenwalkTranscription {
|
|
116
|
+
file: string;
|
|
117
|
+
source?: string;
|
|
118
|
+
coverage?: string;
|
|
119
|
+
complete?: boolean;
|
|
120
|
+
}
|
|
121
|
+
export declare const SCREENWALK_OUTPUT_KINDS: readonly ["dialogue", "chapters", "short", "audio", "other"];
|
|
122
|
+
export type ScreenwalkOutputKind = (typeof SCREENWALK_OUTPUT_KINDS)[number];
|
|
123
|
+
/** Something made from the screenwalk: a dialogue, chapters, a short (the ERD's Short), audio. */
|
|
124
|
+
export interface ScreenwalkOutput {
|
|
125
|
+
kind: ScreenwalkOutputKind;
|
|
126
|
+
/** Where it lives: a file in this folder, a URL, or a `miadi-*` reference. */
|
|
127
|
+
ref?: string;
|
|
128
|
+
/** For a short: where it starts and ends in the video, `mm:ss` or `h:mm:ss`. */
|
|
129
|
+
starts_at?: string;
|
|
130
|
+
ends_at?: string;
|
|
131
|
+
note?: string;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* A frame of the recording kept as an image in the episode, by convention under
|
|
135
|
+
* `images/screenwalk-<id>/` (Guillaume's D3, 2026-10-07; jgwill/Miadi#743).
|
|
136
|
+
*/
|
|
137
|
+
export interface ScreenwalkStill {
|
|
138
|
+
/** Vessel-relative path of the image. */
|
|
139
|
+
file: string;
|
|
140
|
+
/** Where in the video it was taken, `mm:ss` or `h:mm:ss`. */
|
|
141
|
+
at?: string;
|
|
142
|
+
note?: string;
|
|
143
|
+
}
|
|
144
|
+
export interface ScreenwalkRecord {
|
|
145
|
+
/** The id: the stamp, `yymmddHHMM`, or an early `yymmdd-NNN`. */
|
|
146
|
+
screenwalk: string;
|
|
147
|
+
/** `miadi-screenwalk:<id>`. */
|
|
148
|
+
reference: string;
|
|
149
|
+
state?: ScreenwalkState;
|
|
150
|
+
/** The episode directory that holds it. */
|
|
151
|
+
episode?: string;
|
|
152
|
+
/** The minute the person named, `YYYY-MM-DDTHH:MM` local, read from the id when absent. */
|
|
153
|
+
stamp?: string;
|
|
154
|
+
recording?: ScreenwalkRecording;
|
|
155
|
+
video?: ScreenwalkVideo;
|
|
156
|
+
review?: ScreenwalkReview;
|
|
157
|
+
/** References to what the screenwalk is about: reviews, episodes, issues. */
|
|
158
|
+
related?: string[];
|
|
159
|
+
sessions: ScreenwalkSession[];
|
|
160
|
+
closings: ScreenwalkClosing[];
|
|
161
|
+
transcriptions: ScreenwalkTranscription[];
|
|
162
|
+
outputs: ScreenwalkOutput[];
|
|
163
|
+
/** Frames of this walk kept as images in the episode. */
|
|
164
|
+
stills?: ScreenwalkStill[];
|
|
165
|
+
/** Vessel-relative paths of the images this walk starts from: a still of an earlier walk, a map, a photo. */
|
|
166
|
+
seeds?: string[];
|
|
167
|
+
/** What a listener found that the review would not say, e.g. that the person's voice is missing. */
|
|
168
|
+
finding?: string;
|
|
169
|
+
/** An `@miadi/episode-capture` stem, when the phone also filed an audio take. */
|
|
170
|
+
audio_take?: string;
|
|
171
|
+
}
|
|
172
|
+
/** The record's keys in the order `screenwalk.json` writes them. */
|
|
173
|
+
export declare const SCREENWALK_RECORD_KEYS: readonly ["screenwalk", "reference", "state", "episode", "stamp", "recording", "video", "review", "related", "sessions", "closings", "transcriptions", "outputs", "stills", "seeds", "finding", "audio_take"];
|
|
174
|
+
/**
|
|
175
|
+
* Keys of the hand-written screenwalk `capture.json` files that `toScreenwalkRecord` maps.
|
|
176
|
+
* A converter that meets any other key should stop rather than drop it.
|
|
177
|
+
*/
|
|
178
|
+
export declare const LEGACY_SCREENWALK_KEYS: readonly ["stem", "video", "title", "review", "reference", "started", "session", "sessions", "seat_ledgers", "related", "recording", "stamp_estimate", "transcriptions", "finding", "note"];
|
|
179
|
+
/** The furthest state the record's own fields prove: a review, then a video. Undefined otherwise. */
|
|
180
|
+
export declare function deriveScreenwalkState(record: Pick<ScreenwalkRecord, "review" | "video">): ScreenwalkState | undefined;
|
|
181
|
+
/**
|
|
182
|
+
* Tolerant reader for a `screenwalk.json`, or for a screenwalk `capture.json` written by hand
|
|
183
|
+
* before this record existed (`stem`, `video` as a string, `review` as `miadi-review:<uuid>`,
|
|
184
|
+
* `session`/`sessions` strings, `seat_ledgers`, `stamp_estimate`). The id comes from
|
|
185
|
+
* `screenwalk`, then `stem`, then `options.id` (the folder name), then `reference`. Null when
|
|
186
|
+
* none names a screenwalk.
|
|
187
|
+
*/
|
|
188
|
+
export declare function toScreenwalkRecord(raw: unknown, options?: {
|
|
189
|
+
id?: string;
|
|
190
|
+
episode?: string;
|
|
191
|
+
}): ScreenwalkRecord | null;
|
|
192
|
+
/** Strict guard for a record as `screenwalk.json` writes it. */
|
|
193
|
+
export declare function isScreenwalkRecord(value: unknown): value is ScreenwalkRecord;
|
|
194
|
+
//# sourceMappingURL=screenwalk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenwalk.d.ts","sourceRoot":"","sources":["../src/screenwalk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The chronicle SCREENWALK record — a recording of a person working live with agent
|
|
3
|
+
* sessions, with their voices, held by an episode.
|
|
4
|
+
*
|
|
5
|
+
* Episode 550 ("The Screenwalk as a Media Type") drew the type before any code held it, in
|
|
6
|
+
* `diagrams/screenwalk.erdf.json`: an Episode holds Screenwalks; a Screenwalk witnesses
|
|
7
|
+
* sessions, ends with witness closings, is read as one Review and is teased by Shorts. Its
|
|
8
|
+
* states are the episode's two machines, `screenwalk.smdf.json` (NotStarted to
|
|
9
|
+
* InConversation) and the media cycle that continues after Reviewed.
|
|
10
|
+
*
|
|
11
|
+
* File: `captures/screenwalk-<id>/screenwalk.json` in the episode vessel, beside the seat
|
|
12
|
+
* ledgers. `capture.json` stays the descriptor of a phone audio take (`@miadi/episode-capture`),
|
|
13
|
+
* whose reader skips every other shape. The screenwalk `capture.json` files written by hand
|
|
14
|
+
* before this record existed are read by `toScreenwalkRecord` and converted.
|
|
15
|
+
*
|
|
16
|
+
* The id is the stamp the person writes when they press record, `yymmddHHMM`
|
|
17
|
+
* (`miadi-screenwalk:2610061207`). The first records used `yymmdd-NNN`. The stamp is the
|
|
18
|
+
* minute the person named. `recording.started` is where the uploaded video's clock begins,
|
|
19
|
+
* which can differ from it (a retake).
|
|
20
|
+
*
|
|
21
|
+
* Shape (`screenwalk.json`):
|
|
22
|
+
*
|
|
23
|
+
* { "screenwalk": "2610061207", "reference": "miadi-screenwalk:2610061207",
|
|
24
|
+
* "state": "Reviewed", "episode": "2026-10-01-episode-550-…", "stamp": "2026-10-06T12:07",
|
|
25
|
+
* "recording": { "started": "…", "length": "about 24:30", "evidence": "…", "retake": "…" },
|
|
26
|
+
* "video": { "url": "https://youtu.be/…", "title": "…" },
|
|
27
|
+
* "review": { "id": "6a2b5b59-…", "version": 1 },
|
|
28
|
+
* "related": [], "sessions": [{ "session_id": "…", "name": "…", "ledger": "seat-….md" }],
|
|
29
|
+
* "closings": [], "transcriptions": [{ "file": "…", "source": "…", "coverage": "…" }],
|
|
30
|
+
* "outputs": [], "stills": [{ "file": "images/screenwalk-2610061207/frame.webp", "at": "12:31" }],
|
|
31
|
+
* "seeds": ["images/screenwalk-lifecycle-261007.png"], "finding": "…" }
|
|
32
|
+
*
|
|
33
|
+
* Pure — no fs, no fetch. Reading and writing the file is the consumer's. Ref: jgwill/Miadi#707.
|
|
34
|
+
*/
|
|
35
|
+
import { isReviewId, parseReviewRef } from "./episode-review.js";
|
|
36
|
+
/** The portable reference form: `miadi-screenwalk:<id>`. `miadi-screenwalk://<id>` is read too. */
|
|
37
|
+
export const SCREENWALK_REFERENCE_PREFIX = "miadi-screenwalk:";
|
|
38
|
+
/** The folder a screenwalk lives in, under the vessel's `captures/`: `screenwalk-<id>`. */
|
|
39
|
+
export const SCREENWALK_FOLDER_PREFIX = "screenwalk-";
|
|
40
|
+
/** The record's file inside its folder. */
|
|
41
|
+
export const SCREENWALK_FILE = "screenwalk.json";
|
|
42
|
+
/**
|
|
43
|
+
* Every state a screenwalk can be in: Episode 550's `screenwalk.smdf.json`, then the media
|
|
44
|
+
* cycle that continues it after Reviewed (`screenwalk-media-cycle.smdf.json`).
|
|
45
|
+
*/
|
|
46
|
+
export const SCREENWALK_STATES = [
|
|
47
|
+
"NotStarted",
|
|
48
|
+
"Recording",
|
|
49
|
+
"Witnessing",
|
|
50
|
+
"ClosingDrafted",
|
|
51
|
+
"Played",
|
|
52
|
+
"Revising",
|
|
53
|
+
"Recorded",
|
|
54
|
+
"Published",
|
|
55
|
+
"Reviewed",
|
|
56
|
+
"Chronicled",
|
|
57
|
+
"InConversation",
|
|
58
|
+
"Enriched",
|
|
59
|
+
"Notebooked",
|
|
60
|
+
"MediaGenerated",
|
|
61
|
+
"Watched",
|
|
62
|
+
"HeldInCircle",
|
|
63
|
+
"ScriptedNext",
|
|
64
|
+
];
|
|
65
|
+
export function isScreenwalkState(value) {
|
|
66
|
+
return typeof value === "string" && SCREENWALK_STATES.includes(value);
|
|
67
|
+
}
|
|
68
|
+
/** A date and time stamp of six to ten digits, then optional `-word` parts: `2610061207`, `261005-001`. */
|
|
69
|
+
const SCREENWALK_ID = /^[0-9]{6,10}(?:-[0-9a-z]+)*$/;
|
|
70
|
+
export function isScreenwalkId(value) {
|
|
71
|
+
return typeof value === "string" && SCREENWALK_ID.test(value);
|
|
72
|
+
}
|
|
73
|
+
export function screenwalkReference(id) {
|
|
74
|
+
return `${SCREENWALK_REFERENCE_PREFIX}${id}`;
|
|
75
|
+
}
|
|
76
|
+
export function screenwalkFolder(id) {
|
|
77
|
+
return `${SCREENWALK_FOLDER_PREFIX}${id}`;
|
|
78
|
+
}
|
|
79
|
+
/** The record's path inside an episode vessel, relative to the vessel. */
|
|
80
|
+
export function screenwalkPath(id) {
|
|
81
|
+
return `captures/${screenwalkFolder(id)}/${SCREENWALK_FILE}`;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read a screenwalk reference: `miadi-screenwalk:<id>`, `miadi-screenwalk://<id>`, a folder
|
|
85
|
+
* name `screenwalk-<id>`, or a bare id. Null for anything else.
|
|
86
|
+
*/
|
|
87
|
+
export function parseScreenwalkRef(input) {
|
|
88
|
+
if (typeof input !== "string")
|
|
89
|
+
return null;
|
|
90
|
+
let raw = input.trim().toLowerCase();
|
|
91
|
+
if (raw.startsWith(SCREENWALK_REFERENCE_PREFIX))
|
|
92
|
+
raw = raw.slice(SCREENWALK_REFERENCE_PREFIX.length).replace(/^\/\//, "");
|
|
93
|
+
else if (raw.startsWith(SCREENWALK_FOLDER_PREFIX))
|
|
94
|
+
raw = raw.slice(SCREENWALK_FOLDER_PREFIX.length);
|
|
95
|
+
if (!isScreenwalkId(raw))
|
|
96
|
+
return null;
|
|
97
|
+
return { id: raw, reference: screenwalkReference(raw), folder: screenwalkFolder(raw) };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The date and time an id names, read from its leading digits (`yymmdd`, `yymmddHH`,
|
|
101
|
+
* `yymmddHHMM`). Local time, as the person wrote it. Null when the digits are not a date.
|
|
102
|
+
*/
|
|
103
|
+
export function parseScreenwalkStamp(id) {
|
|
104
|
+
const digits = /^([0-9]{6,10})/.exec(id)?.[1];
|
|
105
|
+
if (!digits || (digits.length !== 6 && digits.length !== 8 && digits.length !== 10))
|
|
106
|
+
return null;
|
|
107
|
+
const [yy, mm, dd, hh, mi] = [0, 2, 4, 6, 8].map((i) => digits.slice(i, i + 2));
|
|
108
|
+
const month = Number(mm);
|
|
109
|
+
const day = Number(dd);
|
|
110
|
+
if (month < 1 || month > 12 || day < 1 || day > 31)
|
|
111
|
+
return null;
|
|
112
|
+
const date = `20${yy}-${mm}-${dd}`;
|
|
113
|
+
if (!hh)
|
|
114
|
+
return { date, precision: "day" };
|
|
115
|
+
if (Number(hh) > 23 || (mi && Number(mi) > 59))
|
|
116
|
+
return null;
|
|
117
|
+
return { date, time: `${hh}:${mi || "00"}`, precision: mi ? "minute" : "hour" };
|
|
118
|
+
}
|
|
119
|
+
export const SCREENWALK_OUTPUT_KINDS = ["dialogue", "chapters", "short", "audio", "other"];
|
|
120
|
+
/** The record's keys in the order `screenwalk.json` writes them. */
|
|
121
|
+
export const SCREENWALK_RECORD_KEYS = [
|
|
122
|
+
"screenwalk",
|
|
123
|
+
"reference",
|
|
124
|
+
"state",
|
|
125
|
+
"episode",
|
|
126
|
+
"stamp",
|
|
127
|
+
"recording",
|
|
128
|
+
"video",
|
|
129
|
+
"review",
|
|
130
|
+
"related",
|
|
131
|
+
"sessions",
|
|
132
|
+
"closings",
|
|
133
|
+
"transcriptions",
|
|
134
|
+
"outputs",
|
|
135
|
+
"stills",
|
|
136
|
+
"seeds",
|
|
137
|
+
"finding",
|
|
138
|
+
"audio_take",
|
|
139
|
+
];
|
|
140
|
+
/**
|
|
141
|
+
* Keys of the hand-written screenwalk `capture.json` files that `toScreenwalkRecord` maps.
|
|
142
|
+
* A converter that meets any other key should stop rather than drop it.
|
|
143
|
+
*/
|
|
144
|
+
export const LEGACY_SCREENWALK_KEYS = [
|
|
145
|
+
"stem",
|
|
146
|
+
"video",
|
|
147
|
+
"title",
|
|
148
|
+
"review",
|
|
149
|
+
"reference",
|
|
150
|
+
"started",
|
|
151
|
+
"session",
|
|
152
|
+
"sessions",
|
|
153
|
+
"seat_ledgers",
|
|
154
|
+
"related",
|
|
155
|
+
"recording",
|
|
156
|
+
"stamp_estimate",
|
|
157
|
+
"transcriptions",
|
|
158
|
+
"finding",
|
|
159
|
+
"note",
|
|
160
|
+
];
|
|
161
|
+
function text(value) {
|
|
162
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
163
|
+
}
|
|
164
|
+
function obj(value) {
|
|
165
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : undefined;
|
|
166
|
+
}
|
|
167
|
+
function list(value) {
|
|
168
|
+
return Array.isArray(value) ? value : [];
|
|
169
|
+
}
|
|
170
|
+
const SESSION_ID = /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\b\s*(?:\((.*)\))?\s*$/is;
|
|
171
|
+
/** A session written as an object, or as the early string `"<uuid> (note)"`. */
|
|
172
|
+
function toSession(raw) {
|
|
173
|
+
if (typeof raw === "string") {
|
|
174
|
+
const match = SESSION_ID.exec(raw.trim());
|
|
175
|
+
if (match)
|
|
176
|
+
return { session_id: match[1].toLowerCase(), ...(text(match[2]) ? { note: text(match[2]) } : {}) };
|
|
177
|
+
return text(raw) ? { note: text(raw) } : null;
|
|
178
|
+
}
|
|
179
|
+
const r = obj(raw);
|
|
180
|
+
if (!r)
|
|
181
|
+
return null;
|
|
182
|
+
const session = {};
|
|
183
|
+
const id = text(r.session_id) ?? text(r.session);
|
|
184
|
+
if (id)
|
|
185
|
+
session.session_id = id;
|
|
186
|
+
const name = text(r.name) ?? text(r.seat);
|
|
187
|
+
if (name)
|
|
188
|
+
session.name = name;
|
|
189
|
+
const note = text(r.note);
|
|
190
|
+
if (note)
|
|
191
|
+
session.note = note;
|
|
192
|
+
const ledger = text(r.ledger) ?? text(r.file);
|
|
193
|
+
if (ledger)
|
|
194
|
+
session.ledger = ledger;
|
|
195
|
+
return Object.keys(session).length ? session : null;
|
|
196
|
+
}
|
|
197
|
+
/** Attach each early `seat_ledgers` entry to its session: by session id, then by a note opening with the seat's name. */
|
|
198
|
+
function attachLedgers(sessions, ledgers) {
|
|
199
|
+
for (const raw of ledgers) {
|
|
200
|
+
const ledger = toSession(raw);
|
|
201
|
+
if (!ledger?.ledger)
|
|
202
|
+
continue;
|
|
203
|
+
const seat = ledger.name;
|
|
204
|
+
const match = sessions.find((s) => (ledger.session_id && s.session_id === ledger.session_id) ||
|
|
205
|
+
(seat && !s.name && s.note !== undefined && new RegExp(`^${seat.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?:[;,)]|$)`).test(s.note)));
|
|
206
|
+
if (match) {
|
|
207
|
+
if (seat && !match.name) {
|
|
208
|
+
match.name = seat;
|
|
209
|
+
if (match.note) {
|
|
210
|
+
const rest = match.note.slice(seat.length).replace(/^[;,]\s*/, "").trim();
|
|
211
|
+
if (rest)
|
|
212
|
+
match.note = rest;
|
|
213
|
+
else
|
|
214
|
+
delete match.note;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
match.ledger = ledger.ledger;
|
|
218
|
+
if (ledger.session_id && !match.session_id)
|
|
219
|
+
match.session_id = ledger.session_id;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
sessions.push(ledger);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return sessions;
|
|
226
|
+
}
|
|
227
|
+
function toTranscription(raw) {
|
|
228
|
+
const r = obj(raw);
|
|
229
|
+
const file = text(r?.file);
|
|
230
|
+
if (!r || !file)
|
|
231
|
+
return null;
|
|
232
|
+
const out = { file };
|
|
233
|
+
const source = text(r.source);
|
|
234
|
+
if (source)
|
|
235
|
+
out.source = source;
|
|
236
|
+
const coverage = text(r.coverage);
|
|
237
|
+
if (coverage)
|
|
238
|
+
out.coverage = coverage;
|
|
239
|
+
if (typeof r.complete === "boolean")
|
|
240
|
+
out.complete = r.complete;
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
243
|
+
function toClosing(raw) {
|
|
244
|
+
const r = obj(raw);
|
|
245
|
+
if (!r || typeof r.version !== "number" || !Number.isSafeInteger(r.version) || r.version < 1)
|
|
246
|
+
return null;
|
|
247
|
+
const out = { version: r.version };
|
|
248
|
+
const file = text(r.file);
|
|
249
|
+
if (file)
|
|
250
|
+
out.file = file;
|
|
251
|
+
const correction = text(r.correction);
|
|
252
|
+
if (correction)
|
|
253
|
+
out.correction = correction;
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
function toOutput(raw) {
|
|
257
|
+
const r = obj(raw);
|
|
258
|
+
if (!r)
|
|
259
|
+
return null;
|
|
260
|
+
const kind = SCREENWALK_OUTPUT_KINDS.includes(r.kind) ? r.kind : undefined;
|
|
261
|
+
if (!kind)
|
|
262
|
+
return null;
|
|
263
|
+
const out = { kind };
|
|
264
|
+
for (const key of ["ref", "starts_at", "ends_at", "note"]) {
|
|
265
|
+
const value = text(r[key]);
|
|
266
|
+
if (value)
|
|
267
|
+
out[key] = value;
|
|
268
|
+
}
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
function toStill(raw) {
|
|
272
|
+
const r = obj(raw);
|
|
273
|
+
const file = r ? text(r.file) : text(raw);
|
|
274
|
+
if (!file)
|
|
275
|
+
return null;
|
|
276
|
+
const out = { file };
|
|
277
|
+
const at = r && text(r.at);
|
|
278
|
+
if (at)
|
|
279
|
+
out.at = at;
|
|
280
|
+
const note = r && text(r.note);
|
|
281
|
+
if (note)
|
|
282
|
+
out.note = note;
|
|
283
|
+
return out;
|
|
284
|
+
}
|
|
285
|
+
function toReview(raw) {
|
|
286
|
+
const r = obj(raw);
|
|
287
|
+
const ref = parseReviewRef(r ? (text(r.id) ?? text(r.url)) : raw);
|
|
288
|
+
if (!ref)
|
|
289
|
+
return undefined;
|
|
290
|
+
const version = r && typeof r.version === "number" && Number.isSafeInteger(r.version) && r.version > 0 ? r.version : ref.version;
|
|
291
|
+
return { id: ref.id, ...(version !== undefined ? { version } : {}) };
|
|
292
|
+
}
|
|
293
|
+
function toVideo(raw, title) {
|
|
294
|
+
const r = obj(raw);
|
|
295
|
+
const url = r ? text(r.url) : text(raw);
|
|
296
|
+
if (!url)
|
|
297
|
+
return undefined;
|
|
298
|
+
const video = { url };
|
|
299
|
+
const t = (r && text(r.title)) ?? text(title);
|
|
300
|
+
if (t)
|
|
301
|
+
video.title = t;
|
|
302
|
+
const published = r && text(r.published_at);
|
|
303
|
+
if (published)
|
|
304
|
+
video.published_at = published;
|
|
305
|
+
return video;
|
|
306
|
+
}
|
|
307
|
+
function toRecording(raw, estimate) {
|
|
308
|
+
const r = obj(raw);
|
|
309
|
+
const e = obj(estimate);
|
|
310
|
+
const recording = {};
|
|
311
|
+
const fromEstimate = e ? parseScreenwalkStamp(text(e.stamp) ?? "") : null;
|
|
312
|
+
const started = (r && (text(r.started) ?? text(r.started_estimate))) ?? (fromEstimate?.time ? `${fromEstimate.date}T${fromEstimate.time}` : undefined);
|
|
313
|
+
if (started)
|
|
314
|
+
recording.started = started;
|
|
315
|
+
const length = r && text(r.length);
|
|
316
|
+
if (length)
|
|
317
|
+
recording.length = length;
|
|
318
|
+
const evidence = (r && text(r.evidence)) ?? (e && text(e.evidence));
|
|
319
|
+
if (evidence)
|
|
320
|
+
recording.evidence = evidence;
|
|
321
|
+
const retake = r && text(r.retake);
|
|
322
|
+
if (retake)
|
|
323
|
+
recording.retake = retake;
|
|
324
|
+
return Object.keys(recording).length ? recording : undefined;
|
|
325
|
+
}
|
|
326
|
+
/** The furthest state the record's own fields prove: a review, then a video. Undefined otherwise. */
|
|
327
|
+
export function deriveScreenwalkState(record) {
|
|
328
|
+
if (record.review)
|
|
329
|
+
return "Reviewed";
|
|
330
|
+
if (record.video)
|
|
331
|
+
return "Published";
|
|
332
|
+
return undefined;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Tolerant reader for a `screenwalk.json`, or for a screenwalk `capture.json` written by hand
|
|
336
|
+
* before this record existed (`stem`, `video` as a string, `review` as `miadi-review:<uuid>`,
|
|
337
|
+
* `session`/`sessions` strings, `seat_ledgers`, `stamp_estimate`). The id comes from
|
|
338
|
+
* `screenwalk`, then `stem`, then `options.id` (the folder name), then `reference`. Null when
|
|
339
|
+
* none names a screenwalk.
|
|
340
|
+
*/
|
|
341
|
+
export function toScreenwalkRecord(raw, options = {}) {
|
|
342
|
+
const r = obj(raw);
|
|
343
|
+
if (!r)
|
|
344
|
+
return null;
|
|
345
|
+
const ref = parseScreenwalkRef(r.screenwalk) ?? parseScreenwalkRef(r.stem) ?? parseScreenwalkRef(options.id) ?? parseScreenwalkRef(r.reference);
|
|
346
|
+
if (!ref)
|
|
347
|
+
return null;
|
|
348
|
+
const record = {
|
|
349
|
+
screenwalk: ref.id,
|
|
350
|
+
reference: ref.reference,
|
|
351
|
+
sessions: [],
|
|
352
|
+
closings: [],
|
|
353
|
+
transcriptions: [],
|
|
354
|
+
outputs: [],
|
|
355
|
+
};
|
|
356
|
+
const episode = text(r.episode) ?? options.episode;
|
|
357
|
+
const stamp = text(r.stamp) ?? text(r.started);
|
|
358
|
+
const named = parseScreenwalkStamp(ref.id);
|
|
359
|
+
const recording = toRecording(r.recording, r.stamp_estimate);
|
|
360
|
+
const video = toVideo(r.video, r.title);
|
|
361
|
+
const review = toReview(r.review);
|
|
362
|
+
const related = list(r.related).map(text).filter((v) => v !== undefined);
|
|
363
|
+
const sessions = attachLedgers([...list(r.sessions), ...(r.session !== undefined ? [r.session] : [])].map(toSession).filter((s) => s !== null), list(r.seat_ledgers));
|
|
364
|
+
const finding = text(r.finding);
|
|
365
|
+
const audioTake = text(r.audio_take);
|
|
366
|
+
const state = isScreenwalkState(r.state) ? r.state : deriveScreenwalkState({ review, video });
|
|
367
|
+
if (state)
|
|
368
|
+
record.state = state;
|
|
369
|
+
if (episode)
|
|
370
|
+
record.episode = episode;
|
|
371
|
+
if (stamp)
|
|
372
|
+
record.stamp = stamp;
|
|
373
|
+
else if (named?.time)
|
|
374
|
+
record.stamp = `${named.date}T${named.time}`;
|
|
375
|
+
if (recording)
|
|
376
|
+
record.recording = recording;
|
|
377
|
+
if (video)
|
|
378
|
+
record.video = video;
|
|
379
|
+
if (review)
|
|
380
|
+
record.review = review;
|
|
381
|
+
if (related.length)
|
|
382
|
+
record.related = related;
|
|
383
|
+
record.sessions = sessions.map((s) => {
|
|
384
|
+
const ordered = {};
|
|
385
|
+
for (const key of ["session_id", "name", "note", "ledger"])
|
|
386
|
+
if (s[key] !== undefined)
|
|
387
|
+
ordered[key] = s[key];
|
|
388
|
+
return ordered;
|
|
389
|
+
});
|
|
390
|
+
record.closings = list(r.closings).map(toClosing).filter((c) => c !== null);
|
|
391
|
+
record.transcriptions = list(r.transcriptions).map(toTranscription).filter((t) => t !== null);
|
|
392
|
+
record.outputs = list(r.outputs).map(toOutput).filter((o) => o !== null);
|
|
393
|
+
const stills = list(r.stills).map(toStill).filter((x) => x !== null);
|
|
394
|
+
if (stills.length)
|
|
395
|
+
record.stills = stills;
|
|
396
|
+
const seeds = list(r.seeds).map(text).filter((v) => v !== undefined);
|
|
397
|
+
if (seeds.length)
|
|
398
|
+
record.seeds = seeds;
|
|
399
|
+
if (finding)
|
|
400
|
+
record.finding = finding;
|
|
401
|
+
if (audioTake)
|
|
402
|
+
record.audio_take = audioTake;
|
|
403
|
+
// Rebuild in the order the file writes, so a written record diffs cleanly.
|
|
404
|
+
const ordered = {};
|
|
405
|
+
for (const key of SCREENWALK_RECORD_KEYS)
|
|
406
|
+
if (record[key] !== undefined)
|
|
407
|
+
ordered[key] = record[key];
|
|
408
|
+
return ordered;
|
|
409
|
+
}
|
|
410
|
+
/** Strict guard for a record as `screenwalk.json` writes it. */
|
|
411
|
+
export function isScreenwalkRecord(value) {
|
|
412
|
+
const r = obj(value);
|
|
413
|
+
if (!r || !isScreenwalkId(r.screenwalk) || r.reference !== screenwalkReference(r.screenwalk))
|
|
414
|
+
return false;
|
|
415
|
+
if (r.state !== undefined && !isScreenwalkState(r.state))
|
|
416
|
+
return false;
|
|
417
|
+
for (const key of ["sessions", "closings", "transcriptions", "outputs"])
|
|
418
|
+
if (!Array.isArray(r[key]))
|
|
419
|
+
return false;
|
|
420
|
+
const video = r.video === undefined ? null : obj(r.video);
|
|
421
|
+
if (r.video !== undefined && !text(video?.url))
|
|
422
|
+
return false;
|
|
423
|
+
const review = r.review === undefined ? null : obj(r.review);
|
|
424
|
+
if (r.review !== undefined && !isReviewId(review?.id))
|
|
425
|
+
return false;
|
|
426
|
+
if (!r.outputs.every((o) => toOutput(o) !== null))
|
|
427
|
+
return false;
|
|
428
|
+
if (!r.transcriptions.every((t) => toTranscription(t) !== null))
|
|
429
|
+
return false;
|
|
430
|
+
if (!r.closings.every((c) => toClosing(c) !== null))
|
|
431
|
+
return false;
|
|
432
|
+
if (r.stills !== undefined && !(Array.isArray(r.stills) && r.stills.every((x) => obj(x) && toStill(x) !== null)))
|
|
433
|
+
return false;
|
|
434
|
+
if (r.seeds !== undefined && !(Array.isArray(r.seeds) && r.seeds.every((x) => text(x) !== undefined)))
|
|
435
|
+
return false;
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=screenwalk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenwalk.js","sourceRoot":"","sources":["../src/screenwalk.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* and validates what it is handed so the app and forgewright never fork the
|
|
11
11
|
* read-side.
|
|
12
12
|
*
|
|
13
|
-
* OWNERSHIP (jgwill/Miadi#592, packages/
|
|
13
|
+
* OWNERSHIP (jgwill/Miadi#592, packages/AGENTS.md): this module is the *declaration*
|
|
14
14
|
* of the chronicle→book edge. `@miadi/inquiry-weave` owns its *enumeration* and never
|
|
15
15
|
* authors a story; `packages/passages` owns the *derivation* of a book from a vessel,
|
|
16
16
|
* as a read-only projection of the chronicle; `app/chronicle` renders and serves.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* and validates what it is handed so the app and forgewright never fork the
|
|
11
11
|
* read-side.
|
|
12
12
|
*
|
|
13
|
-
* OWNERSHIP (jgwill/Miadi#592, packages/
|
|
13
|
+
* OWNERSHIP (jgwill/Miadi#592, packages/AGENTS.md): this module is the *declaration*
|
|
14
14
|
* of the chronicle→book edge. `@miadi/inquiry-weave` owns its *enumeration* and never
|
|
15
15
|
* authors a story; `packages/passages` owns the *derivation* of a book from a vessel,
|
|
16
16
|
* as a read-only projection of the chronicle; `app/chronicle` renders and serves.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miadi/episodic-memory-schema",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "TypeScript types and JSON Schema for episodic memory — the durable session-to-session memory layer in the Miadi orchestration kit. Narrative layer is NCP-aligned; provenance layer is W3C PROV-DM and OAIS-informed.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"miadi",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"default": "./dist/index.js"
|
|
32
32
|
},
|
|
33
33
|
"./schema": "./schema/episodic-memory.schema.json",
|
|
34
|
+
"./schema/screenwalk": "./schema/screenwalk.schema.json",
|
|
34
35
|
"./package.json": "./package.json"
|
|
35
36
|
},
|
|
36
37
|
"files": [
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/jgwill/Miadi/packages/episodic-memory-schema/schema/screenwalk.schema.json",
|
|
4
|
+
"title": "Screenwalk record",
|
|
5
|
+
"description": "captures/screenwalk-<id>/screenwalk.json in a chronicle episode vessel: a recording of a person working live with agent sessions, with their voices. Types: src/screenwalk.ts.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["screenwalk", "reference", "sessions", "closings", "transcriptions", "outputs"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"screenwalk": { "type": "string", "pattern": "^[0-9]{6,10}(?:-[0-9a-z]+)*$", "description": "The stamp yymmddHHMM, or an early yymmdd-NNN." },
|
|
10
|
+
"reference": { "type": "string", "pattern": "^miadi-screenwalk:[0-9]{6,10}(?:-[0-9a-z]+)*$" },
|
|
11
|
+
"state": {
|
|
12
|
+
"enum": ["NotStarted", "Recording", "Witnessing", "ClosingDrafted", "Played", "Revising", "Recorded", "Published", "Reviewed", "Chronicled", "InConversation", "Enriched", "Notebooked", "MediaGenerated", "Watched", "HeldInCircle", "ScriptedNext"]
|
|
13
|
+
},
|
|
14
|
+
"episode": { "type": "string", "description": "The episode directory that holds it." },
|
|
15
|
+
"stamp": { "type": "string", "description": "The minute the person named, YYYY-MM-DDTHH:MM local." },
|
|
16
|
+
"recording": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"properties": {
|
|
19
|
+
"started": { "type": "string" },
|
|
20
|
+
"length": { "type": "string" },
|
|
21
|
+
"evidence": { "type": "string" },
|
|
22
|
+
"retake": { "type": "string" }
|
|
23
|
+
},
|
|
24
|
+
"additionalProperties": false
|
|
25
|
+
},
|
|
26
|
+
"video": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"required": ["url"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"url": { "type": "string", "minLength": 1 },
|
|
31
|
+
"title": { "type": "string" },
|
|
32
|
+
"published_at": { "type": "string" }
|
|
33
|
+
},
|
|
34
|
+
"additionalProperties": false
|
|
35
|
+
},
|
|
36
|
+
"review": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"required": ["id"],
|
|
39
|
+
"properties": {
|
|
40
|
+
"id": { "type": "string", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$" },
|
|
41
|
+
"version": { "type": "integer", "minimum": 1 }
|
|
42
|
+
},
|
|
43
|
+
"additionalProperties": false
|
|
44
|
+
},
|
|
45
|
+
"related": { "type": "array", "items": { "type": "string" } },
|
|
46
|
+
"sessions": {
|
|
47
|
+
"type": "array",
|
|
48
|
+
"items": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"properties": {
|
|
51
|
+
"session_id": { "type": "string" },
|
|
52
|
+
"name": { "type": "string" },
|
|
53
|
+
"note": { "type": "string" },
|
|
54
|
+
"ledger": { "type": "string" }
|
|
55
|
+
},
|
|
56
|
+
"additionalProperties": false
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"closings": {
|
|
60
|
+
"type": "array",
|
|
61
|
+
"items": {
|
|
62
|
+
"type": "object",
|
|
63
|
+
"required": ["version"],
|
|
64
|
+
"properties": {
|
|
65
|
+
"version": { "type": "integer", "minimum": 1 },
|
|
66
|
+
"file": { "type": "string" },
|
|
67
|
+
"correction": { "type": "string" }
|
|
68
|
+
},
|
|
69
|
+
"additionalProperties": false
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"transcriptions": {
|
|
73
|
+
"type": "array",
|
|
74
|
+
"items": {
|
|
75
|
+
"type": "object",
|
|
76
|
+
"required": ["file"],
|
|
77
|
+
"properties": {
|
|
78
|
+
"file": { "type": "string", "minLength": 1 },
|
|
79
|
+
"source": { "type": "string" },
|
|
80
|
+
"coverage": { "type": "string" },
|
|
81
|
+
"complete": { "type": "boolean" }
|
|
82
|
+
},
|
|
83
|
+
"additionalProperties": false
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"outputs": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"items": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"required": ["kind"],
|
|
91
|
+
"properties": {
|
|
92
|
+
"kind": { "enum": ["dialogue", "chapters", "short", "audio", "other"] },
|
|
93
|
+
"ref": { "type": "string" },
|
|
94
|
+
"starts_at": { "type": "string" },
|
|
95
|
+
"ends_at": { "type": "string" },
|
|
96
|
+
"note": { "type": "string" }
|
|
97
|
+
},
|
|
98
|
+
"additionalProperties": false
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"stills": {
|
|
102
|
+
"type": "array",
|
|
103
|
+
"description": "Frames of this walk kept as images in the episode, by convention under images/screenwalk-<id>/.",
|
|
104
|
+
"items": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"required": ["file"],
|
|
107
|
+
"properties": {
|
|
108
|
+
"file": { "type": "string", "minLength": 1 },
|
|
109
|
+
"at": { "type": "string", "description": "mm:ss or h:mm:ss in the video." },
|
|
110
|
+
"note": { "type": "string" }
|
|
111
|
+
},
|
|
112
|
+
"additionalProperties": false
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"seeds": {
|
|
116
|
+
"type": "array",
|
|
117
|
+
"description": "Vessel-relative paths of the images this walk starts from.",
|
|
118
|
+
"items": { "type": "string", "minLength": 1 }
|
|
119
|
+
},
|
|
120
|
+
"finding": { "type": "string" },
|
|
121
|
+
"audio_take": { "type": "string" }
|
|
122
|
+
},
|
|
123
|
+
"additionalProperties": false
|
|
124
|
+
}
|