openmates 0.11.0-alpha.25 → 0.11.0-alpha.27

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.
@@ -6323,6 +6323,7 @@ function prepareUrlEmbeds(message) {
6323
6323
  }
6324
6324
 
6325
6325
  // src/embedRenderers.ts
6326
+ import qrcode2 from "qrcode-terminal";
6326
6327
  var str = (v) => typeof v === "string" && v.length > 0 ? v : null;
6327
6328
  var DIRECT_TYPES = /* @__PURE__ */ new Set([
6328
6329
  "code",
@@ -6490,6 +6491,9 @@ async function renderEmbedPreview(embed, client) {
6490
6491
  case "videos/get_transcript":
6491
6492
  renderVideoTranscriptPreview(c, ln);
6492
6493
  break;
6494
+ case "videos/create":
6495
+ await renderRemotionCreatePreview(embed, c, ln, client);
6496
+ break;
6493
6497
  case "health/search_appointments":
6494
6498
  await renderHealthSearchPreview(c, ln, client);
6495
6499
  break;
@@ -6598,6 +6602,9 @@ async function renderEmbedFullscreen(embed, client) {
6598
6602
  case "videos/get_transcript":
6599
6603
  renderVideoTranscriptFullscreen(c);
6600
6604
  break;
6605
+ case "videos/create":
6606
+ await renderRemotionCreateFullscreen(embed, c, client);
6607
+ break;
6601
6608
  case "health/search_appointments":
6602
6609
  await renderHealthSearchFullscreen(c, client);
6603
6610
  break;
@@ -6706,6 +6713,127 @@ async function renderVideosSearchFullscreen(c, client) {
6706
6713
  console.log();
6707
6714
  }
6708
6715
  }
6716
+ async function renderRemotionCreatePreview(embed, c, ln, client) {
6717
+ const meta = remotionMeta(c);
6718
+ ln(`\x1B[1m${meta.filename}\x1B[0m`);
6719
+ ln(`${meta.statusText} \x1B[2mv${meta.sourceVersion} \xB7 ${meta.durationSeconds}s \xB7 ${meta.width}x${meta.height}\x1B[0m`);
6720
+ if (meta.layers.length > 0) {
6721
+ ln(`Timeline: ${meta.layers.slice(0, 4).join(" \u2192 ")}`);
6722
+ }
6723
+ if (meta.error) {
6724
+ ln(`\x1B[31m${meta.error}\x1B[0m`);
6725
+ }
6726
+ if (meta.status === "finished") {
6727
+ await renderRemotionShareLink(embed.embedId, client, ln);
6728
+ }
6729
+ }
6730
+ async function renderRemotionCreateFullscreen(embed, c, client) {
6731
+ const meta = remotionMeta(c);
6732
+ process.stdout.write(`\x1B[1m${meta.filename}\x1B[0m
6733
+ `);
6734
+ process.stdout.write(`${meta.statusText} \x1B[2mv${meta.sourceVersion} \xB7 ${meta.durationSeconds}s \xB7 ${meta.width}x${meta.height}\x1B[0m
6735
+
6736
+ `);
6737
+ if (meta.layers.length > 0) {
6738
+ process.stdout.write("Timeline:\n");
6739
+ for (const layer of meta.layers) {
6740
+ process.stdout.write(` - ${layer}
6741
+ `);
6742
+ }
6743
+ process.stdout.write("\n");
6744
+ }
6745
+ if (meta.source) {
6746
+ process.stdout.write("Source:\n");
6747
+ process.stdout.write("```tsx\n");
6748
+ process.stdout.write(`${meta.source.trim()}
6749
+ `);
6750
+ process.stdout.write("```\n\n");
6751
+ }
6752
+ if (meta.error) {
6753
+ process.stdout.write(`\x1B[31mError:\x1B[0m ${meta.error}
6754
+
6755
+ `);
6756
+ }
6757
+ if (meta.status === "finished") {
6758
+ await renderRemotionShareLink(embed.embedId, client, (line) => process.stdout.write(`${line}
6759
+ `));
6760
+ } else {
6761
+ process.stdout.write("Run again after rendering finishes to get the rendered video link and QR code.\n");
6762
+ }
6763
+ }
6764
+ async function renderRemotionShareLink(embedId, client, ln) {
6765
+ try {
6766
+ const url = await client.createEmbedShareLink(embedId);
6767
+ ln(`Rendered video link: ${url}`);
6768
+ ln("QR code:");
6769
+ const qr = await generateQr(url);
6770
+ for (const line of qr.split("\n")) {
6771
+ if (line.trim().length > 0) ln(line);
6772
+ }
6773
+ } catch (error) {
6774
+ const message = error instanceof Error ? error.message : String(error);
6775
+ ln(`\x1B[2mShare link unavailable: ${message}\x1B[0m`);
6776
+ }
6777
+ }
6778
+ function generateQr(value) {
6779
+ return new Promise((resolve5) => {
6780
+ qrcode2.generate(value, { small: true }, (qr) => resolve5(qr));
6781
+ });
6782
+ }
6783
+ function remotionMeta(c) {
6784
+ const source = str(c.remotion_source) ?? str(c.source) ?? "";
6785
+ const fps = firstInt(source, /fps\s*[:=]\s*(\d+)/) ?? 30;
6786
+ const frames = firstInt(source, /durationInFrames\s*[:=]\s*(\d+)/) ?? 150;
6787
+ const status = str(c.status) ?? "processing";
6788
+ return {
6789
+ filename: str(c.filename) ?? str(c.title) ?? "Composition.tsx",
6790
+ status,
6791
+ statusText: remotionStatusText(status),
6792
+ source,
6793
+ sourceVersion: numberValue(c.current_source_version ?? c.source_version) ?? 1,
6794
+ durationSeconds: Math.max(1, Math.ceil(frames / Math.max(1, fps))),
6795
+ width: firstInt(source, /width\s*[:=]\s*(\d+)/) ?? 1920,
6796
+ height: firstInt(source, /height\s*[:=]\s*(\d+)/) ?? 1080,
6797
+ layers: remotionLayers(source),
6798
+ error: str(c.error) ?? str(c.error_message)
6799
+ };
6800
+ }
6801
+ function remotionStatusText(status) {
6802
+ switch (status) {
6803
+ case "rendering":
6804
+ return "Rendering video...";
6805
+ case "processing":
6806
+ return "Preparing Remotion source...";
6807
+ case "finished":
6808
+ return "Rendered video ready";
6809
+ case "cancelled":
6810
+ return "Render stopped";
6811
+ case "needs_rerender":
6812
+ return "Needs rerender";
6813
+ case "error":
6814
+ return "Render failed";
6815
+ default:
6816
+ return status;
6817
+ }
6818
+ }
6819
+ function remotionLayers(source) {
6820
+ const names = [...source.matchAll(/<([A-Z][A-Za-z0-9]*)\b/g)].map((match) => match[1]).filter((name) => name && !["AbsoluteFill", "Sequence", "Img", "Audio", "Video"].includes(name));
6821
+ return Array.from(new Set(names.length > 0 ? names : ["Composition"])).slice(0, 6);
6822
+ }
6823
+ function firstInt(source, regex) {
6824
+ const match = regex.exec(source);
6825
+ if (!match?.[1]) return null;
6826
+ const value = Number.parseInt(match[1], 10);
6827
+ return Number.isFinite(value) ? value : null;
6828
+ }
6829
+ function numberValue(value) {
6830
+ if (typeof value === "number" && Number.isFinite(value)) return value;
6831
+ if (typeof value === "string" && value.trim()) {
6832
+ const parsed = Number.parseInt(value, 10);
6833
+ return Number.isFinite(parsed) ? parsed : null;
6834
+ }
6835
+ return null;
6836
+ }
6709
6837
  function renderMapsSearchPreview(c, ln) {
6710
6838
  const results = c.results;
6711
6839
  if (Array.isArray(results) && results.length > 0) {
@@ -10170,7 +10298,9 @@ async function handleE2E(client, subcommand, rest, flags) {
10170
10298
  }
10171
10299
  if (flags.password !== void 0) throw new Error("Use generated passwords or OPENMATES_CLI_SIGNUP_PASSWORD, not --password.");
10172
10300
  const slot = parseRequiredNumber(flags.slot, "--slot");
10173
- if (![15, 17].includes(slot)) throw new Error("Only reserved slots 15 and 17 are supported.");
10301
+ if (![15, 16, 17, 18, 19, 20].includes(slot)) {
10302
+ throw new Error("Only reserved slots 15-20 are supported.");
10303
+ }
10174
10304
  const artifact = typeof flags.artifact === "string" ? flags.artifact : `test-results/credential-updates/slot-${slot}.env`;
10175
10305
  const domain = typeof flags.domain === "string" ? flags.domain : process.env.OPENMATES_CLI_E2E_EMAIL_DOMAIN;
10176
10306
  const email = typeof flags.email === "string" ? flags.email : domain ? `cli-e2e-slot-${slot}-${Date.now()}@${domain}` : await promptLine("E2E account email: ");
@@ -12512,7 +12642,7 @@ Creates local ignored credential artifacts for reserved E2E auth accounts. The
12512
12642
  command refuses production API URLs and does not upload GitHub secrets.
12513
12643
 
12514
12644
  Options:
12515
- --slot <15|17> Reserved auth-account slot
12645
+ --slot <15-20> Reserved auth-account slot
12516
12646
  --artifact <path> Output .env artifact path
12517
12647
  --email <email> Test email; prompted/generated when omitted
12518
12648
  --domain <mail-domain> Generate email at this domain
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  getExtForLang,
4
4
  serializeToYaml
5
- } from "./chunk-P4QJYRPZ.js";
5
+ } from "./chunk-TAH6ZMGO.js";
6
6
  import "./chunk-AXNRPVLE.js";
7
7
  export {
8
8
  getExtForLang,
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  getExtForLang,
8
8
  parseNewChatSuggestionText,
9
9
  serializeToYaml
10
- } from "./chunk-P4QJYRPZ.js";
10
+ } from "./chunk-TAH6ZMGO.js";
11
11
  import "./chunk-AXNRPVLE.js";
12
12
  export {
13
13
  MATE_NAMES,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmates",
3
- "version": "0.11.0-alpha.25",
3
+ "version": "0.11.0-alpha.27",
4
4
  "description": "OpenMates CLI and SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,11 +23,12 @@
23
23
  "test:unit:e2e-provisioning": "node --test tests/e2e-provisioning.test.ts",
24
24
  "test:unit:ws": "node --test --experimental-strip-types tests/ws.test.ts",
25
25
  "test:unit:url-embed": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/urlEmbed.test.ts",
26
+ "test:unit:embed-renderers": "node --test --experimental-strip-types tests/embedRenderers.test.ts",
26
27
  "test:unit:server": "node --test --experimental-strip-types tests/server.test.ts",
27
28
  "test:unit:billing": "node --test tests/billing.test.ts",
28
29
  "test:unit:account-delete": "node --test tests/account-delete.test.ts",
29
30
  "test:unit:cli": "node --test tests/cli.test.ts",
30
- "test": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/crypto.test.ts tests/storage.test.ts tests/keychain.test.ts tests/mentions.test.ts tests/outputRedactor.test.ts tests/fileEmbed.test.ts tests/embedCreator.test.ts tests/shareEncryption.test.ts tests/server.test.ts tests/ws.test.ts tests/urlEmbed.test.ts && node --test tests/cli.test.ts tests/billing.test.ts tests/account-delete.test.ts tests/signup.test.ts tests/security-setup.test.ts tests/e2e-provisioning.test.ts"
31
+ "test": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/crypto.test.ts tests/storage.test.ts tests/keychain.test.ts tests/mentions.test.ts tests/outputRedactor.test.ts tests/fileEmbed.test.ts tests/embedCreator.test.ts tests/shareEncryption.test.ts tests/server.test.ts tests/ws.test.ts tests/urlEmbed.test.ts && node --test --experimental-strip-types tests/embedRenderers.test.ts && node --test tests/cli.test.ts tests/billing.test.ts tests/account-delete.test.ts tests/signup.test.ts tests/security-setup.test.ts tests/e2e-provisioning.test.ts"
31
32
  },
32
33
  "keywords": [
33
34
  "openmates",