@my-life-buddies/cli 0.14.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +63 -15
  2. package/dist/bin/buddy.js +28 -9
  3. package/dist/bin/buddy.js.map +2 -2
  4. package/dist/bin/core.js +1293 -603
  5. package/dist/bin/core.js.map +4 -4
  6. package/dist/bin/preview.js +43 -8
  7. package/dist/bin/preview.js.map +2 -2
  8. package/dist/web/app.js +11 -6
  9. package/dist/web/widgets.css +59 -28
  10. package/dist/web/widgets.js +230 -76
  11. package/package.json +3 -3
  12. package/resources/README.md +6 -50
  13. package/resources/buddy-creator/INSTALL.md +0 -25
  14. package/resources/buddy-creator/PATCHES.md +0 -53
  15. package/resources/buddy-creator/SKILL.md +0 -76
  16. package/resources/buddy-creator/THIRD_PARTY_NOTICES.md +0 -154
  17. package/resources/buddy-creator/agents/openai.yaml +0 -4
  18. package/resources/buddy-creator/assets/licenses/bail.txt +0 -26
  19. package/resources/buddy-creator/assets/licenses/ccount.txt +0 -26
  20. package/resources/buddy-creator/assets/licenses/character-entities-html4.txt +0 -26
  21. package/resources/buddy-creator/assets/licenses/character-entities-legacy.txt +0 -26
  22. package/resources/buddy-creator/assets/licenses/character-entities.txt +0 -26
  23. package/resources/buddy-creator/assets/licenses/character-reference-invalid.txt +0 -26
  24. package/resources/buddy-creator/assets/licenses/comma-separated-tokens.txt +0 -26
  25. package/resources/buddy-creator/assets/licenses/debug.txt +0 -24
  26. package/resources/buddy-creator/assets/licenses/decode-named-character-reference.txt +0 -26
  27. package/resources/buddy-creator/assets/licenses/dequal.txt +0 -25
  28. package/resources/buddy-creator/assets/licenses/devlop.txt +0 -26
  29. package/resources/buddy-creator/assets/licenses/escape-string-regexp.txt +0 -13
  30. package/resources/buddy-creator/assets/licenses/estree-util-is-identifier-name.txt +0 -26
  31. package/resources/buddy-creator/assets/licenses/extend.txt +0 -27
  32. package/resources/buddy-creator/assets/licenses/hast-util-to-jsx-runtime.txt +0 -26
  33. package/resources/buddy-creator/assets/licenses/hast-util-whitespace.txt +0 -26
  34. package/resources/buddy-creator/assets/licenses/html-url-attributes.txt +0 -25
  35. package/resources/buddy-creator/assets/licenses/inline-style-parser.txt +0 -13
  36. package/resources/buddy-creator/assets/licenses/is-alphabetical.txt +0 -26
  37. package/resources/buddy-creator/assets/licenses/is-alphanumerical.txt +0 -26
  38. package/resources/buddy-creator/assets/licenses/is-decimal.txt +0 -26
  39. package/resources/buddy-creator/assets/licenses/is-hexadecimal.txt +0 -26
  40. package/resources/buddy-creator/assets/licenses/is-plain-obj.txt +0 -13
  41. package/resources/buddy-creator/assets/licenses/longest-streak.txt +0 -26
  42. package/resources/buddy-creator/assets/licenses/markdown-table.txt +0 -26
  43. package/resources/buddy-creator/assets/licenses/mdast-util-find-and-replace.txt +0 -26
  44. package/resources/buddy-creator/assets/licenses/mdast-util-from-markdown.txt +0 -26
  45. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-autolink-literal.txt +0 -26
  46. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-footnote.txt +0 -26
  47. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-strikethrough.txt +0 -26
  48. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-table.txt +0 -26
  49. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-task-list-item.txt +0 -26
  50. package/resources/buddy-creator/assets/licenses/mdast-util-gfm.txt +0 -26
  51. package/resources/buddy-creator/assets/licenses/mdast-util-mdx-expression.txt +0 -26
  52. package/resources/buddy-creator/assets/licenses/mdast-util-mdx-jsx.txt +0 -26
  53. package/resources/buddy-creator/assets/licenses/mdast-util-mdxjs-esm.txt +0 -26
  54. package/resources/buddy-creator/assets/licenses/mdast-util-phrasing.txt +0 -27
  55. package/resources/buddy-creator/assets/licenses/mdast-util-to-hast.txt +0 -26
  56. package/resources/buddy-creator/assets/licenses/mdast-util-to-markdown.txt +0 -26
  57. package/resources/buddy-creator/assets/licenses/mdast-util-to-string.txt +0 -26
  58. package/resources/buddy-creator/assets/licenses/micromark-core-commonmark.txt +0 -26
  59. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-autolink-literal.txt +0 -26
  60. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-footnote.txt +0 -26
  61. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-strikethrough.txt +0 -26
  62. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-table.txt +0 -26
  63. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-tagfilter.txt +0 -26
  64. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-task-list-item.txt +0 -26
  65. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm.txt +0 -26
  66. package/resources/buddy-creator/assets/licenses/micromark-factory-destination.txt +0 -26
  67. package/resources/buddy-creator/assets/licenses/micromark-factory-label.txt +0 -26
  68. package/resources/buddy-creator/assets/licenses/micromark-factory-space.txt +0 -26
  69. package/resources/buddy-creator/assets/licenses/micromark-factory-title.txt +0 -26
  70. package/resources/buddy-creator/assets/licenses/micromark-factory-whitespace.txt +0 -26
  71. package/resources/buddy-creator/assets/licenses/micromark-util-character.txt +0 -26
  72. package/resources/buddy-creator/assets/licenses/micromark-util-chunked.txt +0 -26
  73. package/resources/buddy-creator/assets/licenses/micromark-util-classify-character.txt +0 -26
  74. package/resources/buddy-creator/assets/licenses/micromark-util-combine-extensions.txt +0 -26
  75. package/resources/buddy-creator/assets/licenses/micromark-util-decode-numeric-character-reference.txt +0 -26
  76. package/resources/buddy-creator/assets/licenses/micromark-util-decode-string.txt +0 -26
  77. package/resources/buddy-creator/assets/licenses/micromark-util-encode.txt +0 -26
  78. package/resources/buddy-creator/assets/licenses/micromark-util-html-tag-name.txt +0 -26
  79. package/resources/buddy-creator/assets/licenses/micromark-util-normalize-identifier.txt +0 -26
  80. package/resources/buddy-creator/assets/licenses/micromark-util-resolve-all.txt +0 -26
  81. package/resources/buddy-creator/assets/licenses/micromark-util-sanitize-uri.txt +0 -26
  82. package/resources/buddy-creator/assets/licenses/micromark-util-subtokenize.txt +0 -26
  83. package/resources/buddy-creator/assets/licenses/micromark-util-symbol.txt +0 -26
  84. package/resources/buddy-creator/assets/licenses/micromark-util-types.txt +0 -26
  85. package/resources/buddy-creator/assets/licenses/micromark.txt +0 -26
  86. package/resources/buddy-creator/assets/licenses/ms.txt +0 -25
  87. package/resources/buddy-creator/assets/licenses/parse-entities.txt +0 -26
  88. package/resources/buddy-creator/assets/licenses/phosphor-icons--react.txt +0 -25
  89. package/resources/buddy-creator/assets/licenses/property-information.txt +0 -26
  90. package/resources/buddy-creator/assets/licenses/react-dom.txt +0 -25
  91. package/resources/buddy-creator/assets/licenses/react-markdown.txt +0 -25
  92. package/resources/buddy-creator/assets/licenses/react.txt +0 -25
  93. package/resources/buddy-creator/assets/licenses/remark-gfm.txt +0 -26
  94. package/resources/buddy-creator/assets/licenses/remark-parse.txt +0 -25
  95. package/resources/buddy-creator/assets/licenses/remark-rehype.txt +0 -26
  96. package/resources/buddy-creator/assets/licenses/remark-stringify.txt +0 -25
  97. package/resources/buddy-creator/assets/licenses/scheduler.txt +0 -25
  98. package/resources/buddy-creator/assets/licenses/space-separated-tokens.txt +0 -26
  99. package/resources/buddy-creator/assets/licenses/stringify-entities.txt +0 -26
  100. package/resources/buddy-creator/assets/licenses/style-to-js.txt +0 -26
  101. package/resources/buddy-creator/assets/licenses/style-to-object.txt +0 -26
  102. package/resources/buddy-creator/assets/licenses/trim-lines.txt +0 -26
  103. package/resources/buddy-creator/assets/licenses/trough.txt +0 -25
  104. package/resources/buddy-creator/assets/licenses/types--debug.txt +0 -25
  105. package/resources/buddy-creator/assets/licenses/types--estree-jsx.txt +0 -25
  106. package/resources/buddy-creator/assets/licenses/types--estree.txt +0 -25
  107. package/resources/buddy-creator/assets/licenses/types--hast.txt +0 -25
  108. package/resources/buddy-creator/assets/licenses/types--mdast.txt +0 -25
  109. package/resources/buddy-creator/assets/licenses/types--ms.txt +0 -25
  110. package/resources/buddy-creator/assets/licenses/types--unist.txt +0 -25
  111. package/resources/buddy-creator/assets/licenses/ungap--structured-clone.txt +0 -19
  112. package/resources/buddy-creator/assets/licenses/unified.txt +0 -25
  113. package/resources/buddy-creator/assets/licenses/unist-util-is.txt +0 -26
  114. package/resources/buddy-creator/assets/licenses/unist-util-position.txt +0 -26
  115. package/resources/buddy-creator/assets/licenses/unist-util-stringify-position.txt +0 -26
  116. package/resources/buddy-creator/assets/licenses/unist-util-visit-parents.txt +0 -26
  117. package/resources/buddy-creator/assets/licenses/unist-util-visit.txt +0 -26
  118. package/resources/buddy-creator/assets/licenses/vfile-message.txt +0 -26
  119. package/resources/buddy-creator/assets/licenses/vfile.txt +0 -25
  120. package/resources/buddy-creator/assets/licenses/zwitch.txt +0 -26
  121. package/resources/buddy-creator/assets/preview/assets/index-B5VmkoSx.js +0 -39
  122. package/resources/buddy-creator/assets/preview/assets/index-DWKP6b-3.css +0 -4
  123. package/resources/buddy-creator/assets/preview/brand-logo.png +0 -0
  124. package/resources/buddy-creator/assets/preview/brand.css +0 -100
  125. package/resources/buddy-creator/assets/preview/index.html +0 -7
  126. package/resources/buddy-creator/assets/preview/reader.css +0 -165
  127. package/resources/buddy-creator/assets/preview/reader.js +0 -135
  128. package/resources/buddy-creator/assets/preview/widgets.css +0 -1
  129. package/resources/buddy-creator/assets/preview/widgets.js +0 -168
  130. package/resources/buddy-creator/assets/widget-reference/conversation.png +0 -0
  131. package/resources/buddy-creator/assets/widget-reference/expanded.png +0 -0
  132. package/resources/buddy-creator/assets/widget-v2/app.js +0 -62
  133. package/resources/buddy-creator/assets/widget-v2/style.css +0 -1
  134. package/resources/buddy-creator/assets/widget-v3/app.js +0 -65
  135. package/resources/buddy-creator/assets/widget-v3/style.css +0 -103
  136. package/resources/buddy-creator/assets/widget-v4/app.js +0 -66
  137. package/resources/buddy-creator/assets/widget-v4/style.css +0 -187
  138. package/resources/buddy-creator/references/artifact-schema.md +0 -70
  139. package/resources/buddy-creator/references/catalog.json +0 -401
  140. package/resources/buddy-creator/references/definition.md +0 -24
  141. package/resources/buddy-creator/references/dialogue-examples.md +0 -133
  142. package/resources/buddy-creator/references/host-guide.md +0 -219
  143. package/resources/buddy-creator/references/interview.md +0 -235
  144. package/resources/buddy-creator/references/knowledge.md +0 -40
  145. package/resources/buddy-creator/references/methods.md +0 -77
  146. package/resources/buddy-creator/references/opening.md +0 -14
  147. package/resources/buddy-creator/references/preview-panel.md +0 -66
  148. package/resources/buddy-creator/references/recovery.md +0 -46
  149. package/resources/buddy-creator/references/service.md +0 -76
  150. package/resources/buddy-creator/references/widgets-protocol.md +0 -83
  151. package/resources/buddy-creator/references/widgets.md +0 -99
  152. package/resources/buddy-creator/scripts/buddy.py +0 -108
  153. package/resources/buddy-creator/scripts/buddy_client.py +0 -67
  154. package/resources/buddy-creator/scripts/buddy_core.py +0 -865
  155. package/resources/buddy-creator/scripts/completion.py +0 -296
  156. package/resources/buddy-creator/scripts/interview.py +0 -215
  157. package/resources/buddy-creator/scripts/preview.py +0 -617
  158. package/resources/buddy-creator/scripts/preview_panel.py +0 -80
  159. package/resources/buddy-creator/scripts/sources.py +0 -239
  160. package/resources/buddy-creator/scripts/widget_render.py +0 -66
  161. package/resources/buddy-creator/scripts/widget_render_v1.py +0 -176
  162. package/resources/buddy-creator/scripts/widget_render_v2.py +0 -98
  163. package/resources/buddy-creator/scripts/widget_render_v3.py +0 -86
  164. package/resources/buddy-creator/scripts/widget_render_v4.py +0 -121
  165. package/resources/buddy-creator/scripts/widgets.py +0 -227
  166. package/resources/buddy-creator/version.json +0 -8
  167. package/resources/buddy-creator.manifest.json +0 -791
  168. package/resources/dada-object-avatar/SKILL.md +0 -37
  169. package/resources/dada-object-avatar/agents/openai.yaml +0 -4
  170. package/resources/dada-object-avatar/assets/examples/cat.png +0 -0
  171. package/resources/dada-object-avatar/assets/examples/cooking.png +0 -0
  172. package/resources/dada-object-avatar/assets/examples/divination.png +0 -0
  173. package/resources/dada-object-avatar/assets/examples/doctor.png +0 -0
  174. package/resources/dada-object-avatar/assets/examples/relationship.png +0 -0
  175. package/resources/dada-object-avatar/assets/examples/work.png +0 -0
  176. package/resources/dada-object-avatar/assets/preview.png +0 -0
  177. package/resources/dada-object-avatar/references/evaluation-rubric.md +0 -22
  178. package/resources/dada-object-avatar/references/examples.json +0 -8
  179. package/resources/dada-object-avatar/references/prompt-template.md +0 -27
  180. package/resources/dada-object-avatar/references/style-system.md +0 -54
  181. package/resources/dada-object-avatar/references/subject-design.md +0 -23
  182. package/resources/dada-object-avatar/references/training-guide.md +0 -14
  183. package/resources/dada-object-avatar/references/training-log.jsonl +0 -0
  184. package/resources/dada-object-avatar/references/training-record.schema.json +0 -20
  185. package/resources/dada-object-avatar/scripts/choose_gaze.py +0 -36
  186. package/resources/dada-object-avatar/scripts/record_example.py +0 -22
  187. package/resources/dada-object-avatar/scripts/validate_png.py +0 -52
  188. package/resources/dada-object-avatar.manifest.json +0 -85
@@ -253,7 +253,7 @@ var PreviewController = class {
253
253
  }
254
254
  start() {
255
255
  if (this.#startPromise) return this.#startPromise;
256
- if (this.#state.phase === "ready") return Promise.resolve(this.#state);
256
+ if (this.#handle) return Promise.resolve(this.#state);
257
257
  if (this.#state.phase === "stopping") {
258
258
  return Promise.reject(Object.assign(new Error("DEV \u4F1A\u8BDD\u6B63\u5728\u505C\u6B62"), { code: "DEV_STOPPING" }));
259
259
  }
@@ -265,6 +265,12 @@ var PreviewController = class {
265
265
  const startPromise = this.#devStarter.start({
266
266
  projectRoot: this.#projectRoot,
267
267
  signal: controller.signal,
268
+ onLifecycle: ({ phase, error }) => {
269
+ if (controller.signal.aborted || !this.#handle || this.#state.phase === "stopping") return;
270
+ if (phase === "reloading") this.#stopOutputWatchers();
271
+ this.#record({ channel: "dev", type: `dev.${phase}`, summary: phase === "reloading" ? "\u672C\u5730\u6587\u4EF6\u5DF2\u4FEE\u6539\uFF0C\u6B63\u5728\u91CD\u8F7D\uFF1B\u5F53\u524D\u56DE\u590D\u53EF\u80FD\u4E2D\u65AD" : phase === "reload_failed" ? error?.message ?? "\u91CD\u8F7D\u5931\u8D25\uFF0C\u4FEE\u6B63\u6587\u4EF6\u540E\u81EA\u52A8\u91CD\u8BD5" : "\u91CD\u8F7D\u5B8C\u6210\uFF0CDEV \u5DF2\u5C31\u7EEA" });
272
+ this.#setState({ phase, ready: this.#state.ready, ...error ? { error } : {} });
273
+ },
268
274
  onLog: ({ source, text: text2 }) => {
269
275
  if (controller.signal.aborted) return;
270
276
  this.#diagnostics.write(source, text2, this.#now().toISOString());
@@ -365,9 +371,12 @@ var PreviewController = class {
365
371
  const client = this.#requiredSimulator();
366
372
  const revision = this.#conversationRevision;
367
373
  let result;
368
- if (action === "list" && client.widgets) result = { widgets: await client.widgets(), conversationRevision: revision };
374
+ if (action === "list" && client.widgets) result = { widgets: await client.widgets(), conversationRevision: revision, capabilities: { documentLifecycle: true, deleteWidget: Boolean(client.deleteWidget) } };
369
375
  else if (action === "html" && client.widgetHtml) result = await client.widgetHtml(id);
370
- else if (action === "image" && client.widgetImage) result = await client.widgetImage(id, mediaId);
376
+ else if (action === "delete" && client.deleteWidget) {
377
+ await client.deleteWidget(id);
378
+ result = { ok: true };
379
+ } else if (action === "image" && client.widgetImage) result = await client.widgetImage(id, mediaId);
371
380
  else if ((action === "pin" || action === "unpin") && client.pinWidget) {
372
381
  await client.pinWidget(id, action === "pin");
373
382
  result = { ok: true };
@@ -922,6 +931,22 @@ function allowedOrigin(request, origin) {
922
931
  const value = request.headers.origin;
923
932
  return value === void 0 || value === origin.origin;
924
933
  }
934
+ function validWidgetRender(value) {
935
+ return value !== null && /^[a-zA-Z0-9-]{16,64}$/u.test(value);
936
+ }
937
+ function widgetDocument(response, html, render, state = "ready", status = 200) {
938
+ writeHeaders(response);
939
+ response.statusCode = status;
940
+ response.setHeader("Content-Security-Policy", "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; connect-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'self'");
941
+ response.setHeader("Content-Type", "text/html; charset=utf-8");
942
+ if (validWidgetRender(render)) {
943
+ const signal = `<script>window.addEventListener('load',()=>parent.postMessage({channel:'buddy-widget-document',render:${JSON.stringify(render)},state:${JSON.stringify(state)}},'*'),{once:true})</script>`;
944
+ if (/<head(?:\s[^>]*)?>/iu.test(html)) html = html.replace(/<head(?:\s[^>]*)?>/iu, (match) => match + signal);
945
+ else if (/<!doctype[^>]*>/iu.test(html)) html = html.replace(/<!doctype[^>]*>/iu, (match) => match + signal);
946
+ else html = signal + html;
947
+ }
948
+ response.end(html);
949
+ }
925
950
  function apiError(response, status, code, message2) {
926
951
  json(response, status, { error: { code, message: message2 } });
927
952
  }
@@ -1075,6 +1100,7 @@ data: ${JSON.stringify(value)}
1075
1100
  try {
1076
1101
  const id = widgetRoute[1] ? decodeURIComponent(widgetRoute[1]) : "";
1077
1102
  const suffix = widgetRoute[2];
1103
+ if (id && !suffix && request.method === "DELETE") return json(response, 200, await options.controller.simulatorWidgets("delete", id));
1078
1104
  if (request.method === "GET" && !id) return json(response, 200, await options.controller.simulatorWidgets("list"));
1079
1105
  if (id && suffix === "pin" && (request.method === "PUT" || request.method === "DELETE")) return json(response, 200, await options.controller.simulatorWidgets(request.method === "PUT" ? "pin" : "unpin", id));
1080
1106
  if (id && request.method === "GET" && suffix === "image") {
@@ -1087,15 +1113,17 @@ data: ${JSON.stringify(value)}
1087
1113
  }
1088
1114
  if (id && request.method === "GET" && !suffix) {
1089
1115
  const html = await options.controller.simulatorWidgets("html", id);
1090
- writeHeaders(response);
1091
- response.setHeader("Content-Security-Policy", "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; connect-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'self'");
1092
- response.setHeader("Content-Type", "text/html; charset=utf-8");
1093
- response.end(html);
1116
+ widgetDocument(response, html, url.searchParams.get("render"));
1094
1117
  return;
1095
1118
  }
1096
1119
  return apiError(response, 405, "METHOD_NOT_ALLOWED", "\u4E0D\u652F\u6301\u8FD9\u4E2A\u5C0F\u6302\u4EF6\u64CD\u4F5C");
1097
1120
  } catch (cause) {
1098
1121
  const failure = requestFailure(cause);
1122
+ const render = url.searchParams.get("render");
1123
+ if (request.method === "GET" && widgetRoute[1] && !widgetRoute[2] && validWidgetRender(render)) {
1124
+ widgetDocument(response, '<!doctype html><html><head><meta charset="utf-8"></head><body>\u5C0F\u6302\u4EF6\u6682\u65F6\u65E0\u6CD5\u6253\u5F00</body></html>', render, "error", failure.status);
1125
+ return;
1126
+ }
1099
1127
  return apiError(response, failure.status, failure.code, failure.message);
1100
1128
  }
1101
1129
  }
@@ -1539,7 +1567,9 @@ function parseWidget(value) {
1539
1567
  ...typeof item?.type === "string" ? { type: item.type } : {},
1540
1568
  ...typeof item?.summary === "string" ? { summary: item.summary } : {},
1541
1569
  ...typeof item?.imageMediaId === "string" && /^media_[a-zA-Z0-9_-]+$/u.test(item.imageMediaId) ? { imageMediaId: item.imageMediaId } : {},
1542
- ...typeof item?.isPinned === "boolean" ? { isPinned: item.isPinned } : {}
1570
+ ...typeof item?.isPinned === "boolean" ? { isPinned: item.isPinned } : {},
1571
+ ...typeof item?.creatorName === "string" ? { creatorName: item.creatorName } : {},
1572
+ ...item?.role === "owner" || item?.role === "editor" || item?.role === "viewer" ? { role: item.role } : {}
1543
1573
  });
1544
1574
  }
1545
1575
  function localReceipt(prefix, value) {
@@ -1620,6 +1650,11 @@ var MlbSimulatorClient = class {
1620
1650
  const privateId = await this.#ensurePrivate();
1621
1651
  await this.#request(pinned ? "PUT" : "DELETE", `/app/widgets/${encodeURIComponent(widgetId(id))}/pin`, { ...pinned ? { body: { sourceConversationId: privateId } } : {} });
1622
1652
  }
1653
+ async deleteWidget(id) {
1654
+ this.#assertResetComplete();
1655
+ const privateId = await this.#ensurePrivate();
1656
+ await this.#request("DELETE", `/app/widgets/${encodeURIComponent(widgetId(id))}?conversationId=${encodeURIComponent(privateId)}`, {});
1657
+ }
1623
1658
  async widgetImage(id, mediaId) {
1624
1659
  this.#assertResetComplete();
1625
1660
  if (!/^media_[a-zA-Z0-9_-]+$/u.test(mediaId)) throw new TypeError("Invalid media ID");