@open-agent-toolkit/cli 0.2.20 → 0.2.22

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 (58) hide show
  1. package/assets/docs/workflows/projects/artifacts.md +1 -1
  2. package/assets/docs/workflows/skills/explainer-kit.md +188 -23
  3. package/assets/docs/workflows/skills/index.md +1 -1
  4. package/assets/public-package-versions.json +4 -4
  5. package/assets/skills/explainer-kit/SKILL.md +87 -25
  6. package/assets/skills/explainer-kit/briefs/deep-dive.md +35 -0
  7. package/assets/skills/explainer-kit/briefs/engineer-tour.md +45 -0
  8. package/assets/skills/explainer-kit/briefs/program-recap.md +41 -0
  9. package/assets/skills/explainer-kit/briefs/project-explainer.md +38 -0
  10. package/assets/skills/explainer-kit/briefs/project-page.md +38 -0
  11. package/assets/skills/explainer-kit/briefs/project-recap.md +47 -0
  12. package/assets/skills/explainer-kit/briefs/supporting-diagram.md +28 -0
  13. package/assets/skills/explainer-kit/briefs/walkthrough-deck.md +35 -0
  14. package/assets/skills/explainer-kit/examples/project-recap/content.md +57 -14
  15. package/assets/skills/explainer-kit/examples/project-recap/fact-base.json +104 -0
  16. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +26 -4
  17. package/assets/skills/explainer-kit/recipes/engineer-tour.json +27 -10
  18. package/assets/skills/explainer-kit/recipes/program-recap.json +35 -11
  19. package/assets/skills/explainer-kit/recipes/project-explainer.json +27 -10
  20. package/assets/skills/explainer-kit/recipes/project-recap.json +43 -11
  21. package/assets/skills/explainer-kit/references/contracts.md +45 -19
  22. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +41 -0
  23. package/assets/skills/explainer-kit/schemas/author-result.v2.schema.json +52 -0
  24. package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +442 -0
  25. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +223 -10
  26. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +28 -43
  27. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +237 -0
  28. package/assets/skills/explainer-kit/scripts/lib/html-safety.mjs +687 -0
  29. package/assets/skills/explainer-kit/scripts/lib/markdown.mjs +414 -0
  30. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +313 -14
  31. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +314 -41
  32. package/assets/skills/explainer-kit/scripts/lib/records.mjs +61 -0
  33. package/assets/skills/explainer-kit/scripts/lib/render.mjs +166 -12
  34. package/assets/skills/explainer-kit/scripts/render-qa.mjs +152 -2
  35. package/assets/skills/explainer-kit/scripts/run.mjs +789 -272
  36. package/assets/skills/explainer-kit/templates/deck-shell.html +25 -5
  37. package/assets/skills/explainer-kit/templates/diagram-shell.html +29 -7
  38. package/assets/skills/explainer-kit/templates/engineer-tour.html +133 -9
  39. package/assets/skills/explainer-kit/templates/house-style.html +82 -0
  40. package/assets/skills/oat-brainstorm/SKILL.md +1 -1
  41. package/assets/skills/oat-brainstorm/scripts/helper.js +18 -11
  42. package/assets/skills/oat-brainstorm/scripts/server.cjs +109 -55
  43. package/assets/skills/oat-explainer-kit/SKILL.md +16 -9
  44. package/assets/skills/oat-explainer-kit/references/author-callback.md +51 -0
  45. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +10 -8
  46. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +14 -0
  47. package/assets/skills/oat-explainer-kit/scripts/run.mjs +7 -11
  48. package/assets/skills/oat-project-complete/SKILL.md +18 -2
  49. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  50. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +7 -1
  51. package/assets/skills/oat-wave-execute/SKILL.md +12 -19
  52. package/assets/skills/oat-wave-program/SKILL.md +12 -13
  53. package/dist/commands/init/tools/index.d.ts.map +1 -1
  54. package/dist/commands/init/tools/index.js +4 -4
  55. package/dist/engine/compute-plan.js +3 -3
  56. package/package.json +2 -2
  57. package/assets/skills/explainer-kit/schemas/author-request.schema.json +0 -85
  58. package/assets/skills/explainer-kit/schemas/author-result.schema.json +0 -65
@@ -24,6 +24,7 @@
24
24
  --sans: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
25
25
  --serif: ui-serif, Georgia, serif;
26
26
  --mono: ui-monospace, SFMono-Regular, Consolas, monospace;
27
+ /* AUTHOR EXTENSION REGION: resolved theme tokens */
27
28
  {{THEME_CSS}}
28
29
  }
29
30
  * {
@@ -39,6 +40,9 @@
39
40
  color: var(--ink);
40
41
  font-family: var(--sans);
41
42
  }
43
+ noscript p {
44
+ color: var(--muted);
45
+ }
42
46
  .deck {
43
47
  display: flex;
44
48
  width: 100%;
@@ -197,16 +201,28 @@
197
201
  }
198
202
  </style>
199
203
  </head>
200
- <body>
204
+ <body data-explainer-shell="deck-shell">
201
205
  <noscript>
202
206
  <p>This deck remains available below as a readable vertical document.</p>
203
207
  </noscript>
204
- <main class="deck" aria-label="{{TITLE}}">{{SLIDES}}</main>
205
- <nav class="deck-controls" aria-label="Slide navigation">
208
+ <main class="deck" data-shell-anchor="deck" aria-label="{{TITLE}}">
209
+ <!-- AUTHOR EXTENSION REGION: semantic section.slide frames -->
210
+ {{SLIDES}}
211
+ <!-- END AUTHOR EXTENSION REGION -->
212
+ </main>
213
+ <nav
214
+ class="deck-controls"
215
+ data-shell-anchor="deck-controls"
216
+ aria-label="Slide navigation"
217
+ >
206
218
  <button type="button" data-direction="-1" aria-label="Previous slide">
207
219
 
208
220
  </button>
209
- <span id="deck-counter" aria-live="polite"></span>
221
+ <span
222
+ id="deck-counter"
223
+ data-shell-anchor="deck-counter"
224
+ aria-live="polite"
225
+ ></span>
210
226
  <button type="button" data-direction="1" aria-label="Next slide">
211
227
 
212
228
  </button>
@@ -214,11 +230,15 @@
214
230
  <div
215
231
  class="deck-progress"
216
232
  id="deck-progress"
233
+ data-shell-anchor="deck-progress"
217
234
  role="progressbar"
218
235
  aria-label="Slide progress"
219
236
  aria-valuemin="1"
220
237
  >
221
- <span class="deck-progress__bar"></span>
238
+ <span
239
+ class="deck-progress__bar"
240
+ data-shell-anchor="deck-progress-bar"
241
+ ></span>
222
242
  </div>
223
243
  <script>
224
244
  (() => {
@@ -20,6 +20,7 @@
20
20
  --accent: hsl(215 28% 32%);
21
21
  --sans: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
22
22
  --mono: ui-monospace, SFMono-Regular, Consolas, monospace;
23
+ /* AUTHOR EXTENSION REGION: resolved theme tokens */
23
24
  {{THEME_CSS}}
24
25
  }
25
26
  * {
@@ -125,35 +126,56 @@
125
126
  }
126
127
  </style>
127
128
  </head>
128
- <body>
129
+ <body data-explainer-shell="diagram-shell">
129
130
  <main>
130
131
  <header>
131
- <h1 id="diagram-title">{{TITLE}}</h1>
132
- <p id="diagram-description">{{DESCRIPTION}}</p>
132
+ <h1 id="diagram-title" data-shell-anchor="diagram-title">{{TITLE}}</h1>
133
+ <p id="diagram-description" data-shell-anchor="diagram-description">
134
+ {{DESCRIPTION}}
135
+ </p>
133
136
  </header>
134
- <section class="diagram-shell" aria-labelledby="diagram-title">
137
+ <section
138
+ class="diagram-shell"
139
+ data-shell-anchor="diagram-shell"
140
+ aria-labelledby="diagram-title"
141
+ >
135
142
  <p class="diagram-hint">
136
143
  Use the controls or Ctrl/Command + wheel to zoom; drag to pan.
137
144
  </p>
138
- <div class="zoom-controls" aria-label="Diagram zoom">
145
+ <div
146
+ class="zoom-controls"
147
+ data-shell-anchor="zoom-controls"
148
+ aria-label="Diagram zoom"
149
+ >
139
150
  <button type="button" data-zoom="in" aria-label="Zoom in">+</button>
140
151
  <button type="button" data-zoom="out" aria-label="Zoom out">−</button>
141
152
  <button type="button" data-zoom="reset" aria-label="Reset zoom">
142
153
 
143
154
  </button>
144
155
  </div>
145
- <div class="diagram-viewport">
156
+ <div class="diagram-viewport" data-shell-anchor="diagram-viewport">
146
157
  <svg
147
158
  class="diagram-canvas"
159
+ data-shell-anchor="diagram-canvas"
148
160
  viewBox="0 0 1200 720"
149
161
  role="img"
150
162
  aria-labelledby="diagram-title diagram-description"
151
163
  xmlns="http://www.w3.org/2000/svg"
152
164
  >
165
+ <!-- AUTHOR EXTENSION REGION: accessible inline SVG diagram -->
153
166
  {{DIAGRAM}}
167
+ <!-- END AUTHOR EXTENSION REGION -->
154
168
  </svg>
155
169
  </div>
156
- <div class="legend" aria-label="Diagram legend">{{LEGEND}}</div>
170
+ <div
171
+ class="legend"
172
+ data-shell-anchor="diagram-legend"
173
+ aria-label="Diagram legend"
174
+ >
175
+ <!-- AUTHOR EXTENSION REGION: optional visual legend -->
176
+ {{LEGEND}}
177
+ <!-- END AUTHOR EXTENSION REGION -->
178
+ </div>
157
179
  </section>
158
180
  </main>
159
181
  <script>
@@ -24,6 +24,7 @@
24
24
  --sans: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
25
25
  --serif: ui-serif, Georgia, serif;
26
26
  --mono: ui-monospace, SFMono-Regular, Consolas, monospace;
27
+ /* AUTHOR EXTENSION REGION: resolved theme tokens */
27
28
  {{THEME_CSS}}
28
29
  }
29
30
  * {
@@ -56,8 +57,7 @@
56
57
  padding-block: 2.5rem;
57
58
  }
58
59
  .toc-brand,
59
- .eyebrow,
60
- .section-number {
60
+ .eyebrow {
61
61
  color: var(--muted);
62
62
  font: 0.7rem/1.4 var(--mono);
63
63
  letter-spacing: 0.12em;
@@ -116,12 +116,105 @@
116
116
  max-width: 100%;
117
117
  margin: 0;
118
118
  overflow-x: auto;
119
+ border: 0;
120
+ border-radius: 0;
121
+ background: transparent;
119
122
  padding: 1rem;
120
123
  font-family: var(--mono);
121
124
  }
122
125
  .snippet:not(.open) pre {
123
126
  display: none;
124
127
  }
128
+ .diagram-scroll {
129
+ max-width: 100%;
130
+ overflow-x: auto;
131
+ }
132
+ .diagram-scroll > svg {
133
+ display: block;
134
+ }
135
+ /* Narrative renderer block output. The renderer emits these for any
136
+ markdown artifact, so the shell must style them or the structure
137
+ renders as unformatted text. */
138
+ .callout {
139
+ min-width: 0;
140
+ border: 1px solid var(--border);
141
+ border-inline-start: 0.25rem solid var(--accent);
142
+ border-radius: 0.6rem;
143
+ background: var(--panel);
144
+ padding: 1rem;
145
+ overflow-wrap: anywhere;
146
+ }
147
+ .callout--important {
148
+ border-inline-start-color: var(--success, var(--accent));
149
+ }
150
+ .callout--warning {
151
+ border-inline-start-color: var(--warning);
152
+ }
153
+ .callout--caution {
154
+ border-inline-start-color: var(--danger, var(--warning));
155
+ }
156
+ .callout__label {
157
+ color: var(--muted);
158
+ font: 0.72rem/1.4 var(--mono);
159
+ font-weight: 700;
160
+ letter-spacing: 0.08em;
161
+ text-transform: uppercase;
162
+ }
163
+ .timeline {
164
+ display: grid;
165
+ gap: 0.8rem;
166
+ padding-inline-start: 0;
167
+ list-style: none;
168
+ }
169
+ .timeline li {
170
+ display: grid;
171
+ grid-template-columns: minmax(7rem, 0.25fr) 1fr;
172
+ gap: 1rem;
173
+ border-inline-start: 0.2rem solid var(--accent);
174
+ padding-inline-start: 1rem;
175
+ }
176
+ .timeline time {
177
+ color: var(--muted);
178
+ font-family: var(--mono);
179
+ }
180
+ .table-scroll,
181
+ pre {
182
+ max-width: 100%;
183
+ overflow-x: auto;
184
+ }
185
+ table {
186
+ width: 100%;
187
+ border-collapse: collapse;
188
+ }
189
+ th,
190
+ td {
191
+ border-block-end: 1px solid var(--border);
192
+ padding: 0.6rem;
193
+ text-align: start;
194
+ }
195
+ pre {
196
+ border: 1px solid var(--border);
197
+ border-radius: 0.6rem;
198
+ background: var(--panel);
199
+ padding: 1rem;
200
+ font-family: var(--mono);
201
+ }
202
+ code {
203
+ font-family: var(--mono);
204
+ }
205
+ blockquote {
206
+ margin-inline: 0;
207
+ border-inline-start: 0.2rem solid var(--border);
208
+ color: var(--muted);
209
+ padding-inline-start: 1rem;
210
+ }
211
+ figure {
212
+ margin-inline: 0;
213
+ }
214
+ figcaption {
215
+ color: var(--muted);
216
+ font: 0.8rem/1.5 var(--mono);
217
+ }
125
218
  .diagram-rail {
126
219
  position: sticky;
127
220
  top: 0;
@@ -140,6 +233,19 @@
140
233
  width: 100%;
141
234
  height: auto;
142
235
  }
236
+ .diagram-card .node rect {
237
+ fill: var(--panel-muted);
238
+ stroke: var(--accent);
239
+ stroke-width: 1.5;
240
+ }
241
+ .diagram-card .edge {
242
+ fill: none;
243
+ stroke: var(--muted);
244
+ }
245
+ .diagram-card text {
246
+ fill: var(--ink);
247
+ font: 0.85rem var(--sans);
248
+ }
143
249
  .diagram-card .node,
144
250
  .diagram-card .edge {
145
251
  transition: opacity 180ms ease, stroke 180ms ease, fill 180ms ease;
@@ -199,25 +305,43 @@
199
305
  }
200
306
  </style>
201
307
  </head>
202
- <body>
203
- <div class="layout">
204
- <nav class="toc" aria-label="Tour sections">
308
+ <body data-explainer-shell="engineer-tour">
309
+ <div class="layout" data-shell-anchor="tour-layout">
310
+ <nav
311
+ class="toc"
312
+ data-shell-anchor="tour-navigation"
313
+ aria-label="Tour sections"
314
+ >
205
315
  <div class="toc-brand">{{EYEBROW}}</div>
316
+ <!-- AUTHOR EXTENSION REGION: section navigation -->
206
317
  {{NAVIGATION}}
318
+ <!-- END AUTHOR EXTENSION REGION -->
207
319
  </nav>
208
- <main class="tour-body">
320
+ <main class="tour-body" data-shell-anchor="tour-body">
209
321
  <header>
210
322
  <div class="eyebrow">{{EYEBROW}}</div>
211
323
  <h1>{{TITLE}}</h1>
212
324
  <p>{{DESCRIPTION}}</p>
213
325
  </header>
326
+ <!-- AUTHOR EXTENSION REGION: narrative tour sections -->
214
327
  {{CONTENT}}
215
- <footer>{{FOOTER}}</footer>
328
+ <!-- END AUTHOR EXTENSION REGION -->
329
+ <footer>
330
+ <!-- AUTHOR EXTENSION REGION: supporting references and next steps -->
331
+ {{FOOTER}}
332
+ <!-- END AUTHOR EXTENSION REGION -->
333
+ </footer>
216
334
  </main>
217
- <aside class="diagram-rail" aria-label="System diagram">
218
- <div class="diagram-card">
335
+ <aside
336
+ class="diagram-rail"
337
+ data-shell-anchor="diagram-rail"
338
+ aria-label="System diagram"
339
+ >
340
+ <div class="diagram-card" data-shell-anchor="diagram-card">
219
341
  <svg viewBox="0 0 360 540" role="img" aria-label="{{TITLE}}">
342
+ <!-- AUTHOR EXTENSION REGION: synchronized system diagram -->
220
343
  {{DIAGRAM}}
344
+ <!-- END AUTHOR EXTENSION REGION -->
221
345
  </svg>
222
346
  </div>
223
347
  </aside>
@@ -118,11 +118,76 @@
118
118
  .callout {
119
119
  border-inline-start: 0.25rem solid var(--accent);
120
120
  }
121
+ .callout--tip,
122
+ .callout--note {
123
+ border-inline-start-color: var(--accent);
124
+ }
125
+ .callout--important {
126
+ border-inline-start-color: var(--success);
127
+ }
128
+ .callout--warning {
129
+ border-inline-start-color: var(--warning);
130
+ }
131
+ .callout--caution {
132
+ border-inline-start-color: var(--danger);
133
+ }
134
+ .callout__label {
135
+ color: var(--muted);
136
+ font: 0.72rem/1.4 var(--mono);
137
+ font-weight: 700;
138
+ letter-spacing: 0.08em;
139
+ text-transform: uppercase;
140
+ }
141
+ blockquote {
142
+ margin-inline: 0;
143
+ border-inline-start: 0.2rem solid var(--border);
144
+ padding-inline-start: 1rem;
145
+ color: var(--muted);
146
+ }
147
+ .task-list {
148
+ padding-inline-start: 0;
149
+ list-style: none;
150
+ }
151
+ .task-list li {
152
+ display: flex;
153
+ align-items: baseline;
154
+ gap: 0.5rem;
155
+ }
156
+ .task-list li > p {
157
+ margin-block: 0.2rem;
158
+ }
159
+ .timeline {
160
+ display: grid;
161
+ gap: 0.8rem;
162
+ padding-inline-start: 0;
163
+ list-style: none;
164
+ }
165
+ .timeline li {
166
+ display: grid;
167
+ grid-template-columns: minmax(7rem, 0.25fr) 1fr;
168
+ gap: 1rem;
169
+ border-inline-start: 0.2rem solid var(--accent);
170
+ padding-inline-start: 1rem;
171
+ }
172
+ .timeline time {
173
+ color: var(--muted);
174
+ font-family: var(--mono);
175
+ }
121
176
  .table-scroll,
177
+ .diagram-scroll,
122
178
  pre {
123
179
  max-width: 100%;
124
180
  overflow-x: auto;
125
181
  }
182
+ .diagram-scroll > svg {
183
+ display: block;
184
+ }
185
+ pre {
186
+ border: 1px solid var(--border);
187
+ border-radius: var(--radius);
188
+ background: var(--panel-muted);
189
+ padding: 1rem;
190
+ }
126
191
  table {
127
192
  width: 100%;
128
193
  border-collapse: collapse;
@@ -137,6 +202,23 @@
137
202
  pre {
138
203
  font-family: var(--mono);
139
204
  }
205
+ :not(pre) > code {
206
+ border-radius: calc(var(--radius) / 2);
207
+ background: var(--panel-muted);
208
+ padding: 0.1em 0.3em;
209
+ }
210
+ figure {
211
+ margin-inline: 0;
212
+ border: 1px solid var(--border);
213
+ border-radius: var(--radius);
214
+ background: var(--panel);
215
+ padding: 1rem;
216
+ }
217
+ figcaption {
218
+ margin-block-start: 0.5rem;
219
+ color: var(--muted);
220
+ font-size: 0.9rem;
221
+ }
140
222
  footer {
141
223
  border-block-start: 1px solid var(--border);
142
224
  color: var(--muted);
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-brainstorm
3
- version: 1.1.1
3
+ version: 1.1.2
4
4
  description: Use when the user explicitly invokes the `brainstorm` verb, including `/oat-brainstorm`, "let's brainstorm", "brainstorm this", "can we brainstorm X", or "help me brainstorm X". For ambiguous exploratory phrasing ("I've been thinking", "what if", "help me think through"), do NOT auto-enter; respond conversationally and offer mode only after ≥2 sustained exploratory turns. Do NOT use for review, debug, PR, status, implementation, or active-workflow questions.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -1,5 +1,5 @@
1
- (function() {
2
- const WS_URL = 'ws://' + window.location.host;
1
+ (function () {
2
+ const WS_URL = `ws://${window.location.host}`;
3
3
  let ws = null;
4
4
  let eventQueue = [];
5
5
 
@@ -7,7 +7,7 @@
7
7
  ws = new WebSocket(WS_URL);
8
8
 
9
9
  ws.onopen = () => {
10
- eventQueue.forEach(e => ws.send(JSON.stringify(e)));
10
+ eventQueue.forEach((e) => ws.send(JSON.stringify(e)));
11
11
  eventQueue = [];
12
12
  };
13
13
 
@@ -41,7 +41,7 @@
41
41
  type: 'click',
42
42
  text: target.textContent.trim(),
43
43
  choice: target.dataset.choice,
44
- id: target.id || null
44
+ id: target.id || null,
45
45
  });
46
46
 
47
47
  // Update indicator bar (defer so toggleSelect runs first)
@@ -51,12 +51,16 @@
51
51
  const container = target.closest('.options') || target.closest('.cards');
52
52
  const selected = container ? container.querySelectorAll('.selected') : [];
53
53
  if (selected.length === 0) {
54
- indicator.textContent = 'Click an option above, then return to the terminal';
54
+ indicator.textContent =
55
+ 'Click an option above, then return to the terminal';
55
56
  } else if (selected.length === 1) {
56
- const label = selected[0].querySelector('h3, .content h3, .card-body h3')?.textContent?.trim() || selected[0].dataset.choice;
57
- indicator.innerHTML = '<span class="selected-text">' + label + ' selected</span> — return to terminal to continue';
57
+ const label =
58
+ selected[0]
59
+ .querySelector('h3, .content h3, .card-body h3')
60
+ ?.textContent?.trim() || selected[0].dataset.choice;
61
+ indicator.innerHTML = `<span class="selected-text">${label} selected</span> — return to terminal to continue`;
58
62
  } else {
59
- indicator.innerHTML = '<span class="selected-text">' + selected.length + ' selected</span> — return to terminal to continue';
63
+ indicator.innerHTML = `<span class="selected-text">${selected.length} selected</span> — return to terminal to continue`;
60
64
  }
61
65
  }, 0);
62
66
  });
@@ -64,11 +68,13 @@
64
68
  // Frame UI: selection tracking
65
69
  window.selectedChoice = null;
66
70
 
67
- window.toggleSelect = function(el) {
71
+ window.toggleSelect = function (el) {
68
72
  const container = el.closest('.options') || el.closest('.cards');
69
73
  const multi = container && container.dataset.multiselect !== undefined;
70
74
  if (container && !multi) {
71
- container.querySelectorAll('.option, .card').forEach(o => o.classList.remove('selected'));
75
+ container
76
+ .querySelectorAll('.option, .card')
77
+ .forEach((o) => o.classList.remove('selected'));
72
78
  }
73
79
  if (multi) {
74
80
  el.classList.toggle('selected');
@@ -81,7 +87,8 @@
81
87
  // Expose API for explicit use
82
88
  window.brainstorm = {
83
89
  send: sendEvent,
84
- choice: (value, metadata = {}) => sendEvent({ type: 'choice', value, ...metadata })
90
+ choice: (value, metadata = {}) =>
91
+ sendEvent({ type: 'choice', value, ...metadata }),
85
92
  };
86
93
 
87
94
  connect();