@pinecall/dot 0.11.23 → 0.11.25

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 (124) hide show
  1. package/README.md +145 -63
  2. package/dist/agent/index.d.ts +3 -2
  3. package/dist/agent/index.d.ts.map +1 -1
  4. package/dist/agent/index.js +2 -1
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/agent/tutor.d.ts +12 -10
  7. package/dist/agent/tutor.d.ts.map +1 -1
  8. package/dist/agent/tutor.js +81 -68
  9. package/dist/agent/tutor.js.map +1 -1
  10. package/dist/agent/walks.d.ts +19 -0
  11. package/dist/agent/walks.d.ts.map +1 -0
  12. package/dist/agent/walks.js +89 -0
  13. package/dist/agent/walks.js.map +1 -0
  14. package/dist/page/page.d.ts +2 -2
  15. package/dist/page/page.d.ts.map +1 -1
  16. package/dist/page/page.js +5 -5
  17. package/dist/page/page.js.map +1 -1
  18. package/dist/page/roles.d.ts +2 -0
  19. package/dist/page/roles.d.ts.map +1 -1
  20. package/dist/page/roles.js +21 -2
  21. package/dist/page/roles.js.map +1 -1
  22. package/dist/pointer/asking.d.ts +25 -0
  23. package/dist/pointer/asking.d.ts.map +1 -0
  24. package/dist/pointer/asking.js +82 -0
  25. package/dist/pointer/asking.js.map +1 -0
  26. package/dist/pointer/flight.d.ts +40 -4
  27. package/dist/pointer/flight.d.ts.map +1 -1
  28. package/dist/pointer/flight.js +139 -17
  29. package/dist/pointer/flight.js.map +1 -1
  30. package/dist/pointer/frames.d.ts +28 -0
  31. package/dist/pointer/frames.d.ts.map +1 -0
  32. package/dist/pointer/frames.js +66 -0
  33. package/dist/pointer/frames.js.map +1 -0
  34. package/dist/pointer/icons.d.ts +8 -0
  35. package/dist/pointer/icons.d.ts.map +1 -0
  36. package/dist/pointer/icons.js +15 -0
  37. package/dist/pointer/icons.js.map +1 -0
  38. package/dist/pointer/menu.d.ts +5 -4
  39. package/dist/pointer/menu.d.ts.map +1 -1
  40. package/dist/pointer/menu.js +56 -47
  41. package/dist/pointer/menu.js.map +1 -1
  42. package/dist/pointer/person.d.ts +13 -2
  43. package/dist/pointer/person.d.ts.map +1 -1
  44. package/dist/pointer/person.js +47 -41
  45. package/dist/pointer/person.js.map +1 -1
  46. package/dist/pointer/pressing.d.ts +6 -0
  47. package/dist/pointer/pressing.d.ts.map +1 -0
  48. package/dist/pointer/pressing.js +32 -0
  49. package/dist/pointer/pressing.js.map +1 -0
  50. package/dist/pointer/sections.d.ts +4 -7
  51. package/dist/pointer/sections.d.ts.map +1 -1
  52. package/dist/pointer/sections.js +11 -17
  53. package/dist/pointer/sections.js.map +1 -1
  54. package/dist/pointer/typing.d.ts +5 -3
  55. package/dist/pointer/typing.d.ts.map +1 -1
  56. package/dist/pointer/typing.js +46 -15
  57. package/dist/pointer/typing.js.map +1 -1
  58. package/dist/server/index.d.ts +34 -0
  59. package/dist/server/index.d.ts.map +1 -0
  60. package/dist/server/index.js +108 -0
  61. package/dist/server/index.js.map +1 -0
  62. package/dist/server/questions.d.ts +30 -0
  63. package/dist/server/questions.d.ts.map +1 -0
  64. package/dist/server/questions.js +136 -0
  65. package/dist/server/questions.js.map +1 -0
  66. package/dist/server/saying.d.ts +31 -0
  67. package/dist/server/saying.d.ts.map +1 -0
  68. package/dist/server/saying.js +124 -0
  69. package/dist/server/saying.js.map +1 -0
  70. package/dist/tutor/acting.d.ts +42 -0
  71. package/dist/tutor/acting.d.ts.map +1 -0
  72. package/dist/tutor/acting.js +180 -0
  73. package/dist/tutor/acting.js.map +1 -0
  74. package/dist/tutor/aloud.d.ts +50 -0
  75. package/dist/tutor/aloud.d.ts.map +1 -0
  76. package/dist/tutor/aloud.js +288 -0
  77. package/dist/tutor/aloud.js.map +1 -0
  78. package/dist/tutor/ask.d.ts +49 -0
  79. package/dist/tutor/ask.d.ts.map +1 -0
  80. package/dist/tutor/ask.js +47 -0
  81. package/dist/tutor/ask.js.map +1 -0
  82. package/dist/tutor/listening.d.ts +17 -0
  83. package/dist/tutor/listening.d.ts.map +1 -0
  84. package/dist/tutor/listening.js +66 -0
  85. package/dist/tutor/listening.js.map +1 -0
  86. package/dist/tutor/options.d.ts +37 -1
  87. package/dist/tutor/options.d.ts.map +1 -1
  88. package/dist/tutor/options.js +1 -1
  89. package/dist/tutor/options.js.map +1 -1
  90. package/dist/tutor/reading.d.ts +58 -0
  91. package/dist/tutor/reading.d.ts.map +1 -0
  92. package/dist/tutor/reading.js +193 -0
  93. package/dist/tutor/reading.js.map +1 -0
  94. package/dist/tutor/text.d.ts +16 -0
  95. package/dist/tutor/text.d.ts.map +1 -0
  96. package/dist/tutor/text.js +119 -0
  97. package/dist/tutor/text.js.map +1 -0
  98. package/dist/tutor/tutor.d.ts +2 -9
  99. package/dist/tutor/tutor.d.ts.map +1 -1
  100. package/dist/tutor/tutor.js +110 -87
  101. package/dist/tutor/tutor.js.map +1 -1
  102. package/dist/tutor/walking.d.ts +26 -8
  103. package/dist/tutor/walking.d.ts.map +1 -1
  104. package/dist/tutor/walking.js +145 -30
  105. package/dist/tutor/walking.js.map +1 -1
  106. package/dist/tutor/walks.d.ts +33 -0
  107. package/dist/tutor/walks.d.ts.map +1 -1
  108. package/dist/tutor/walks.js +121 -13
  109. package/dist/tutor/walks.js.map +1 -1
  110. package/dist/wire/acts.d.ts +60 -0
  111. package/dist/wire/acts.d.ts.map +1 -0
  112. package/dist/wire/acts.js +120 -0
  113. package/dist/wire/acts.js.map +1 -0
  114. package/dist/wire/ask.d.ts +132 -0
  115. package/dist/wire/ask.d.ts.map +1 -0
  116. package/dist/wire/ask.js +102 -0
  117. package/dist/wire/ask.js.map +1 -0
  118. package/dist/wire/index.d.ts +38 -8
  119. package/dist/wire/index.d.ts.map +1 -1
  120. package/dist/wire/index.js +86 -12
  121. package/dist/wire/index.js.map +1 -1
  122. package/docs/macros.md +216 -0
  123. package/docs/write-a-tutor.md +247 -0
  124. package/package.json +11 -6
@@ -3,40 +3,80 @@
3
3
  // One audio element plays every sentence in turn: Safari lets an element the visitor's click
4
4
  // started go on to its next source, where a new element would need another click. Each frame
5
5
  // reads where the audio is, so the words and the pointer follow the sound, whatever the network.
6
- import { walksOf } from "../wire/index.js";
6
+ // A walk called with values fills its slots: a step that acts (fill, press, wait, read) is done by
7
+ // the page between two sentences, and a sentence with slots is recorded when it is reached. A step
8
+ // a slot of which nothing filled, or whose `if` or `unless` says so, is left out.
9
+ import { filled, isAct, taken, walksDocument, walksOf } from "../wire/index.js";
7
10
  import { Player } from "./macro.js";
8
- /** The walks an agent published, read with no key; none where the page cannot read them. */
9
- export async function publishedWalks(url) {
10
- if (url === "")
11
- return [];
11
+ /** A document's walks, read with no key; null where it is not there or cannot be read. */
12
+ async function readWalks(url) {
12
13
  try {
13
14
  const answer = await fetch(url);
14
- return answer.ok ? walksOf(await answer.json()) : [];
15
+ return answer.ok ? walksOf(await answer.json()) : null;
15
16
  }
16
17
  catch {
18
+ return null;
19
+ }
20
+ }
21
+ /**
22
+ * The walks an agent published for the page at `path`, read with no key; none where the page cannot read them.
23
+ * `url` is the agent's `walks` document, the home's: a page of its own has `walks-<page>` beside it, and is
24
+ * read from there, or from `url` when the agent published none for it (the walks that name no page).
25
+ */
26
+ export async function publishedWalks(url, path = "") {
27
+ if (url === "")
17
28
  return [];
29
+ const own = walksDocument(path);
30
+ const [base, query = ""] = url.split("?");
31
+ if (own !== "walks" && base !== undefined && base.endsWith("/walks")) {
32
+ const found = await readWalks(`${base.slice(0, -"walks".length)}${own}${query === "" ? "" : `?${query}`}`);
33
+ if (found !== null)
34
+ return found;
18
35
  }
36
+ return (await readWalks(url)) ?? [];
19
37
  }
20
- /** A walk's length, in ms. */
38
+ /** A walk's length, in ms: its recorded sentences'. */
21
39
  export function lengthOf(walk) {
22
- return walk.steps.reduce((total, step) => total + step.durationMs, 0);
40
+ return walk.steps.reduce((total, step) => total + ("durationMs" in step ? step.durationMs : 0), 0);
41
+ }
42
+ const NO_HOOKS = { act: async () => ({}), voice: async () => null };
43
+ // An audio element is the visitor's to start: one that played inside their click goes on playing
44
+ // sources after it, so a walk that starts after a wait (a door asked, a search) plays this first.
45
+ const SILENCE = "data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQAAAAA=";
46
+ /** A step's beats with the slots of what they find filled: `["row", "{hit}"]`. A beat whose slot nothing filled is left out. */
47
+ function beatsFilled(beats, values) {
48
+ return beats.flatMap((beat) => {
49
+ if (beat.find === undefined)
50
+ return [beat];
51
+ const name = filled(beat.find[1], values);
52
+ return name === null ? [] : [{ ...beat, find: [beat.find[0], name] }];
53
+ });
23
54
  }
24
55
  export class Walking {
25
56
  audio;
26
57
  #ended;
27
58
  #shows;
28
59
  #player = new Player();
60
+ #hooks;
29
61
  #walk = null;
30
62
  #step = 0;
31
63
  #paused = false;
64
+ #values = {};
65
+ /** The sentence playing; null while a step acts or is recorded. */
66
+ #current = null;
67
+ /** A sentence ready while the walk was paused, played on resume. */
68
+ #held = null;
69
+ /** Which run of the walk is on: a stop or a new start ends the one before, mid-act. */
70
+ #run = 0;
32
71
  /**
33
72
  * Play through `audio`; `ended` hears a walk that played to its end, or failed to play; `shows`
34
- * hears each sentence as it starts, for what it shows beside the page, and null as the walk stops.
73
+ * hears each sentence as it starts (and which step it is), for what it shows beside the page, and null as the walk stops.
35
74
  */
36
- constructor(audio, ended, shows = () => undefined) {
75
+ constructor(audio, ended, shows = () => undefined, hooks = NO_HOOKS) {
37
76
  this.audio = audio;
38
77
  this.#ended = ended;
39
78
  this.#shows = shows;
79
+ this.#hooks = hooks;
40
80
  // The ear reads the audio through Web Audio, which hears silence from a source fetched without CORS.
41
81
  audio.crossOrigin = "anonymous";
42
82
  audio.preload = "auto";
@@ -63,24 +103,64 @@ export class Walking {
63
103
  if (this.#walk === null || !this.#paused)
64
104
  return;
65
105
  this.#paused = false;
66
- this.audio.play().catch(() => this.#finish(false));
106
+ const held = this.#held;
107
+ this.#held = null;
108
+ if (held !== null)
109
+ this.#play(held);
110
+ else if (this.#current !== null)
111
+ this.audio.play().catch(() => this.#finish(false));
112
+ }
113
+ /**
114
+ * The next sentence, or the one before (`delta` 1 or -1): going on, a step that acts is done on the way;
115
+ * going back, it is passed over, never done twice. Call it from the visitor's click.
116
+ */
117
+ skip(delta) {
118
+ const walk = this.#walk;
119
+ if (walk === null)
120
+ return;
121
+ let at = this.#step + delta;
122
+ const acts = (index) => {
123
+ const step = walk.steps[index];
124
+ return step !== undefined && isAct(step);
125
+ };
126
+ while (delta < 0 && at > 0 && acts(at))
127
+ at -= 1;
128
+ this.#step = Math.max(0, at);
129
+ this.#paused = false;
130
+ this.#held = null;
131
+ this.#current = null;
132
+ this.#player.drop();
133
+ this.audio.pause();
134
+ void this.#go();
135
+ }
136
+ /** Let this element play later, from the visitor's click: a walk that starts after a wait. */
137
+ unlock() {
138
+ if (this.#walk !== null)
139
+ return;
140
+ this.audio.src = SILENCE;
141
+ this.audio.play().catch(() => undefined);
67
142
  }
68
- /** Play a walk from its first sentence. Call it from the visitor's click: a browser starts audio only inside one. */
69
- start(walk) {
143
+ /** Play a walk from its first sentence, its slots filled from `values`. Call it from the visitor's click, or after `unlock`. */
144
+ start(walk, values = {}) {
70
145
  this.#walk = walk;
71
146
  this.#step = 0;
72
- this.#play();
147
+ this.#values = { ...values };
148
+ void this.#go();
73
149
  }
74
150
  /** Where the walk is now; null while none plays. */
75
151
  frame() {
76
152
  const walk = this.#walk;
77
- const step = walk?.steps[this.#step];
78
- if (walk === null || step === undefined)
153
+ if (walk === null)
79
154
  return null;
155
+ const step = this.#current;
156
+ const before = walk.steps.slice(0, this.#step).reduce((total, one) => total + ("durationMs" in one ? one.durationMs : 0), 0);
157
+ const fraction = Math.min(1, before / Math.max(1, lengthOf(walk)));
158
+ // Between two sentences, a step acting or being recorded: no words, the bar where it stands.
159
+ if (step === null)
160
+ return { lit: "", coming: "", beats: [], fraction };
80
161
  const now = this.audio.currentTime * 1000;
81
162
  const lit = step.words.filter((word) => word.startMs <= now).map((word) => word.text).join(" ");
82
163
  const rest = step.words.filter((word) => word.startMs > now).map((word) => word.text).join(" ");
83
- const before = walk.steps.slice(0, this.#step).reduce((total, one) => total + one.durationMs, 0);
84
164
  return {
85
165
  lit,
86
166
  coming: lit !== "" && rest !== "" ? ` ${rest}` : rest,
@@ -97,27 +177,58 @@ export class Walking {
97
177
  this.#reset();
98
178
  return walked;
99
179
  }
100
- #play() {
180
+ /** From the step it stands on: acts done and sentences left out in turn, until a sentence plays or the walk ends. */
181
+ async #go() {
182
+ const walk = this.#walk;
183
+ const run = ++this.#run;
184
+ while (walk !== null && run === this.#run) {
185
+ const step = walk.steps[this.#step];
186
+ if (step === undefined)
187
+ return this.#finish(true);
188
+ if (!taken(step, this.#values)) {
189
+ this.#step += 1;
190
+ continue;
191
+ }
192
+ this.#current = null;
193
+ this.#player.drop();
194
+ if (isAct(step)) {
195
+ const read = await this.#hooks.act(step, this.#values, this.#step).catch(() => ({}));
196
+ if (run !== this.#run)
197
+ return;
198
+ Object.assign(this.#values, read);
199
+ this.#step += 1;
200
+ continue;
201
+ }
202
+ const recorded = "live" in step ? await this.#hooks.voice(walk, this.#step, this.#values).catch(() => null) : step;
203
+ if (run !== this.#run)
204
+ return;
205
+ if (recorded === null) {
206
+ this.#step += 1;
207
+ continue;
208
+ }
209
+ return this.#play({ ...recorded, beats: beatsFilled(recorded.beats, this.#values) });
210
+ }
211
+ }
212
+ #play(step) {
101
213
  const walk = this.#walk;
102
- const step = walk?.steps[this.#step];
103
- if (walk === null || step === undefined)
214
+ if (walk === null)
215
+ return;
216
+ if (this.#paused) {
217
+ this.#held = step;
104
218
  return;
219
+ }
220
+ this.#current = step;
105
221
  const asStep = { type: "macro.step", macro: walk.name, step: this.#step, say: step.say, beats: step.beats };
106
222
  this.#player.arm(asStep, null);
107
- this.#shows(step);
223
+ this.#shows(step, this.#step);
108
224
  this.audio.src = step.audio;
109
225
  this.audio.play().catch(() => this.#finish(false));
110
226
  }
111
227
  #next() {
112
- const walk = this.#walk;
113
- if (walk === null)
114
- return;
115
- if (this.#step + 1 < walk.steps.length) {
116
- this.#step += 1;
117
- this.#play();
228
+ if (this.#walk === null || this.#current === null)
118
229
  return;
119
- }
120
- this.#finish(true);
230
+ this.#step += 1;
231
+ void this.#go();
121
232
  }
122
233
  #finish(done) {
123
234
  const walk = this.#walk;
@@ -129,9 +240,13 @@ export class Walking {
129
240
  }
130
241
  #reset() {
131
242
  this.#walk = null;
243
+ this.#run += 1;
244
+ this.#current = null;
245
+ this.#held = null;
246
+ this.#values = {};
132
247
  this.#paused = false;
133
248
  this.#player.drop();
134
- this.#shows(null);
249
+ this.#shows(null, -1);
135
250
  this.audio.pause();
136
251
  }
137
252
  // The player binds a step to a "speech": a sentence of the walk is its own.
@@ -1 +1 @@
1
- {"version":3,"file":"walking.js","sourceRoot":"","sources":["../../src/tutor/walking.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"walking.js","sourceRoot":"","sources":["../../src/tutor/walking.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,9 @@
2
2
  import type { Face } from "../face/index.js";
3
3
  import { CodeWindow } from "../pointer/code.js";
4
4
  import type { Person } from "../pointer/person.js";
5
+ import type { AskRequest } from "../wire/ask.js";
6
+ import { type ActStep, type RecordedStep, type RecordedWalk, type Values, type WalkStep } from "../wire/index.js";
7
+ import { type ReadingOptions } from "./aloud.js";
5
8
  import { type WalkFrame, type Walked } from "./walking.js";
6
9
  export interface WalksOptions {
7
10
  dock: "right" | "left";
@@ -21,6 +24,19 @@ export interface WalksOptions {
21
24
  point: (element: Element) => void;
22
25
  /** Reduced motion: the code is written in at once. */
23
26
  still: boolean;
27
+ /** The field for what the visitor wants shown: its placeholder, and what was typed. None, no field. */
28
+ ask?: {
29
+ placeholder: string;
30
+ onAsk: (text: string) => void;
31
+ } | undefined;
32
+ /** A walk's act done on the page, with what the visitor typed: the values it read. */
33
+ act?: ((step: ActStep, values: Values, message: string) => Promise<Values>) | undefined;
34
+ /** A walk's sentence with slots, recorded now. */
35
+ voice?: ((walk: RecordedWalk, at: number, values: Values) => Promise<RecordedStep | null>) | undefined;
36
+ /** The page read aloud, first in the menu under `title`, where the site marks `data-pinecall-read`. None, it is not offered. */
37
+ reading?: ({
38
+ title: string;
39
+ } & ReadingOptions) | undefined;
24
40
  }
25
41
  export declare class Walks {
26
42
  #private;
@@ -31,10 +47,25 @@ export declare class Walks {
31
47
  frame(): WalkFrame | null;
32
48
  get playing(): boolean;
33
49
  get paused(): boolean;
50
+ /** The walk's next sentence, or the one before: the visitor's buttons. */
51
+ skip(delta: 1 | -1): void;
34
52
  /** Hold the walk playing, or go on with it: the visitor's pause button. */
35
53
  pause(): void;
36
54
  /** The section scrolled to offers its walk, and the site's own buttons show, while no call is on and no walk plays. Called every frame. */
37
55
  place(): void;
56
+ /** The walks of this page, as the field asks about them, with what each takes. */
57
+ listed(): AskRequest["walks"];
58
+ /** Play a walk of this page, by its name, called with `values`: from what the visitor typed (`message`). */
59
+ playNamed(name: string, values?: Values, message?: string): void;
60
+ /** Read the page aloud, as it is now: what it marks `data-pinecall-read`. Call it from the visitor's click. */
61
+ read(): void;
62
+ /** Let a walk play after a wait: from the visitor's submit, before the door answers. */
63
+ unlock(): void;
64
+ /** Open the menu with a line under the field about what was asked, and a button to take it on. */
65
+ offer(text: string, action?: {
66
+ label: string;
67
+ onClick: () => void;
68
+ }): void;
38
69
  /** Stop the walk playing, if one is: the visitor clicked the face, or a call began. */
39
70
  stop(): void;
40
71
  /** Whether the button may show: not during a call, nor while a walk plays. */
@@ -43,4 +74,6 @@ export declare class Walks {
43
74
  taken(): Walked | null;
44
75
  close(): void;
45
76
  }
77
+ /** Every part a reading says, asked of the door before it is read, `AHEAD_AT_ONCE` at a time; a part it fails is left for the reading. */
78
+ export declare function recordAhead(steps: readonly WalkStep[], record: (text: string) => Promise<unknown>): Promise<number>;
46
79
  //# sourceMappingURL=walks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"walks.d.ts","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"AAAA,+JAA+J;AAE/J,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAqC,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE9F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAChD,iGAAiG;IACjG,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,KAAK;;IAChB,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAU1B,YAAY,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EA6BjF;IAED,4DAA4D;IAC5D,KAAK,IAAI,SAAS,GAAG,IAAI,CAExB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,2EAA2E;IAC3E,KAAK,IAAI,IAAI,CAGZ;IAED,2IAA2I;IAC3I,KAAK,IAAI,IAAI,CAEZ;IAED,uFAAuF;IACvF,IAAI,IAAI,IAAI,CAGX;IAED,8EAA8E;IAC9E,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAE3B;IAED,6EAA6E;IAC7E,KAAK,IAAI,MAAM,GAAG,IAAI,CAIrB;IAED,KAAK,IAAI,IAAI,CAKZ;CAqBF"}
1
+ {"version":3,"file":"walks.d.ts","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  /** The walks beside the resting face, with no call: the button and its pills, the player, the code a step shows, and what the next call is told was played. */
2
+ import { Asking } from "../pointer/asking.js";
2
3
  import { CodeWindow } from "../pointer/code.js";
3
4
  import { Sections } from "../pointer/sections.js";
4
5
  import { Menu } from "../pointer/menu.js";
6
+ import { onPage } from "../wire/index.js";
7
+ import { ReadAloud } from "./aloud.js";
8
+ import { fromHere, readingOf } from "./reading.js";
5
9
  import { Walking, lengthOf, publishedWalks } from "./walking.js";
6
10
  export class Walks {
7
11
  /** The window of code a step opens; a call's macro steps open it too. */
@@ -9,40 +13,81 @@ export class Walks {
9
13
  #walking;
10
14
  #menu;
11
15
  #sections;
16
+ #asking;
12
17
  #drawn;
13
18
  #person;
14
19
  #options;
20
+ #document;
15
21
  #list = [];
22
+ /** The walks the menu and the sections offer: those that take no params, which are asked for. */
23
+ #picked = [];
16
24
  #played = null;
25
+ /** What the visitor typed for the walk playing; none for one picked. */
26
+ #message = "";
27
+ /** The page being read aloud, while it is. */
28
+ #aloud = null;
29
+ /** Whether the menu offers reading the page, first. */
30
+ #readable = false;
17
31
  constructor(document, person, drawn, options) {
18
32
  this.#person = person;
33
+ this.#document = document;
19
34
  this.#drawn = drawn;
20
35
  this.#options = options;
21
36
  this.code = new CodeWindow(document, (part) => person.add(part), options.still);
22
- this.#walking = new Walking(document.createElement("audio"), (walked) => this.#ended(walked), (step) => {
37
+ this.#walking = new Walking(document.createElement("audio"), (walked) => this.#ended(walked), (step, at) => {
38
+ if (this.#aloud !== null)
39
+ return this.#aloud.shows(step === null ? -1 : at);
23
40
  // A step that names no code keeps the window as it is; the walk's end closes it.
24
41
  if (step === null)
25
42
  return this.code.hide();
26
43
  const lit = this.code.show(step.code, step.lines);
27
44
  if (lit !== null)
28
45
  options.point(lit);
46
+ }, {
47
+ act: async (step, values, at) => {
48
+ if (this.#aloud !== null)
49
+ return this.#aloud.act(at).then(() => ({}));
50
+ return options.act?.(step, values, this.#message) ?? {};
51
+ },
52
+ voice: (walk, at, values) => (this.#aloud !== null ? this.#aloud.voice(at) : options.voice?.(walk, at, values) ?? Promise.resolve(null)),
53
+ });
54
+ const named = (name) => this.#picked.findIndex((walk) => walk.name === name);
55
+ // What was typed folds the menu away; a line about it opens it again (`offer`).
56
+ const ask = options.ask;
57
+ this.#asking = ask === undefined ? undefined : new Asking(document, (part) => person.add(part), {
58
+ placeholder: ask.placeholder,
59
+ onAsk: (text) => {
60
+ this.#menu.toggle(false);
61
+ ask.onAsk(text);
62
+ },
29
63
  });
30
64
  this.#menu = new Menu(document, (part) => person.add(part), {
65
+ ask: this.#asking,
31
66
  dock: options.dock,
32
67
  label: options.label,
33
68
  more: options.more,
34
69
  face: () => ({ at: person.dock(), radius: person.radius }),
35
- onPick: (index) => this.#play(index),
36
- });
37
- const named = (name) => this.#list.findIndex((walk) => walk.name === name);
38
- this.#sections = new Sections(document, {
39
- onReach: (name) => this.#menu.suggest(named(name)),
40
- onPlay: (name) => this.#play(named(name)),
70
+ onPick: (index) => (this.#readable && index === 0 ? this.read() : this.#play(this.#picked[index - this.#offset])),
71
+ current: () => {
72
+ const at = named(this.#sections.current() ?? "");
73
+ return at === -1 ? -1 : at + this.#offset;
74
+ },
41
75
  });
42
- void publishedWalks(options.url ?? "").then((found) => {
76
+ this.#sections = new Sections(document, { onPlay: (name) => this.#play(this.#picked[named(name)]) });
77
+ const path = document.defaultView?.location.pathname ?? "";
78
+ void publishedWalks(options.url ?? "", path).then((all) => {
79
+ // Only the walks for the page the visitor is on: one that names other pages stays out of the menu.
80
+ const found = all.filter((walk) => onPage(walk.pages, path));
43
81
  this.#list = found;
44
- this.#menu.offer(found.map((walk) => ({ title: walk.title, ms: lengthOf(walk) })));
45
- this.#sections.offer(found.map((walk) => walk.name));
82
+ this.#picked = found.filter((walk) => walk.params === undefined);
83
+ const reading = options.reading;
84
+ const readable = reading === undefined ? null : readingOf(document, reading.title);
85
+ this.#readable = readable !== null;
86
+ // Every part recorded ahead, a few at a time: the door keeps each, so a reading started later starts at once.
87
+ if (readable !== null && reading !== undefined)
88
+ void recordAhead(readable.walk.steps, reading.record);
89
+ this.#menu.offer([...(this.#readable && reading !== undefined ? [{ title: reading.title, ms: 0 }] : []), ...this.#picked.map((walk) => ({ title: walk.title, ms: lengthOf(walk) }))]);
90
+ this.#sections.offer(this.#picked.map((walk) => walk.name));
46
91
  this.#menu.available(!options.inCall());
47
92
  });
48
93
  }
@@ -56,6 +101,10 @@ export class Walks {
56
101
  get paused() {
57
102
  return this.#walking.paused;
58
103
  }
104
+ /** The walk's next sentence, or the one before: the visitor's buttons. */
105
+ skip(delta) {
106
+ this.#walking.skip(delta);
107
+ }
59
108
  /** Hold the walk playing, or go on with it: the visitor's pause button. */
60
109
  pause() {
61
110
  if (this.#walking.paused)
@@ -67,6 +116,42 @@ export class Walks {
67
116
  place() {
68
117
  this.#sections.place(!this.#options.inCall() && !this.playing);
69
118
  }
119
+ /** The walks of this page, as the field asks about them, with what each takes. */
120
+ listed() {
121
+ return this.#list.map((walk) => ({
122
+ name: walk.name,
123
+ title: walk.title,
124
+ ...(walk.when === undefined ? {} : { when: walk.when }),
125
+ ...(walk.params === undefined ? {} : { params: walk.params }),
126
+ }));
127
+ }
128
+ /** Play a walk of this page, by its name, called with `values`: from what the visitor typed (`message`). */
129
+ playNamed(name, values = {}, message = "") {
130
+ this.#play(this.#list.find((walk) => walk.name === name), values, message);
131
+ }
132
+ /** Read the page aloud, as it is now: what it marks `data-pinecall-read`. Call it from the visitor's click. */
133
+ read() {
134
+ const reading = this.#options.reading;
135
+ const found = reading === undefined ? null : readingOf(this.#document, reading.title);
136
+ if (reading === undefined || found === null || this.#options.inCall())
137
+ return;
138
+ this.stop();
139
+ // Its first sentence comes from the door after this click: the audio is let play inside it.
140
+ this.#walking.unlock();
141
+ // From where the page is scrolled to: what was read, or scrolled past, is not read again.
142
+ const here = fromHere(found);
143
+ this.#aloud = new ReadAloud(here, reading);
144
+ this.#play(here.walk);
145
+ }
146
+ /** Let a walk play after a wait: from the visitor's submit, before the door answers. */
147
+ unlock() {
148
+ this.#walking.unlock();
149
+ }
150
+ /** Open the menu with a line under the field about what was asked, and a button to take it on. */
151
+ offer(text, action) {
152
+ this.#menu.toggle(true);
153
+ this.#asking?.hint(text, action);
154
+ }
70
155
  /** Stop the walk playing, if one is: the visitor clicked the face, or a call began. */
71
156
  stop() {
72
157
  const walked = this.#walking.stop();
@@ -87,19 +172,25 @@ export class Walks {
87
172
  this.#walking.stop();
88
173
  this.#menu.close();
89
174
  this.#sections.close();
175
+ this.#asking?.close();
90
176
  this.code.close();
91
177
  }
92
- #play(index) {
93
- const walk = this.#list[index];
178
+ #play(walk, values = {}, message = "") {
94
179
  if (walk === undefined || this.#options.inCall())
95
180
  return;
181
+ this.#message = message;
96
182
  this.#drawn.wake();
97
183
  this.#drawn.listen(this.#walking.audio);
98
184
  this.#menu.available(false);
99
- this.#walking.start(walk);
185
+ this.#walking.start(walk, values);
100
186
  this.#options.onWalk?.({ walk: walk.name, step: 1, of: walk.steps.length, done: false });
101
187
  }
188
+ /** How many pills stand before the walks': the page read aloud, when it is offered. */
189
+ get #offset() {
190
+ return this.#readable ? 1 : 0;
191
+ }
102
192
  #ended(walked) {
193
+ this.#aloud = null;
103
194
  this.#played = walked;
104
195
  this.#drawn.listen(null);
105
196
  this.#person.progress(null);
@@ -109,4 +200,21 @@ export class Walks {
109
200
  this.#options.onWalk?.(walked);
110
201
  }
111
202
  }
203
+ /** How many parts of a page are asked of the door at once while it is recorded ahead. */
204
+ const AHEAD_AT_ONCE = 3;
205
+ /** Every part a reading says, asked of the door before it is read, `AHEAD_AT_ONCE` at a time; a part it fails is left for the reading. */
206
+ export async function recordAhead(steps, record) {
207
+ const texts = [...new Set(steps.flatMap((step) => ("live" in step ? [step.say] : [])))];
208
+ let next = 0;
209
+ let done = 0;
210
+ const one = async () => {
211
+ while (next < texts.length) {
212
+ const text = texts[next++];
213
+ if ((await record(text).catch(() => null)) !== null)
214
+ done += 1;
215
+ }
216
+ };
217
+ await Promise.all(Array.from({ length: AHEAD_AT_ONCE }, one));
218
+ return done;
219
+ }
112
220
  //# sourceMappingURL=walks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"walks.js","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"walks.js","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"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"}