openmates 0.15.0-alpha.44 → 0.15.0-alpha.45

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.
@@ -1284,6 +1284,7 @@ function resolveServerPath(flags) {
1284
1284
  import { createRequire } from "module";
1285
1285
  var require2 = createRequire(import.meta.url);
1286
1286
  var WebSocket = require2("ws");
1287
+ var DEFAULT_ASYNC_EMBED_WAIT_MS = 3e5;
1287
1288
  var SUB_CHAT_EVENT_TYPES = /* @__PURE__ */ new Set([
1288
1289
  "spawn_sub_chats",
1289
1290
  "sub_chat_progress",
@@ -1667,7 +1668,7 @@ var OpenMatesWsClient = class {
1667
1668
  collectAiResponse(userMessageId, chatId, options) {
1668
1669
  const timeoutMs = options?.timeoutMs ?? 9e4;
1669
1670
  const onStream = options?.onStream;
1670
- const asyncEmbedWaitMs = options?.asyncEmbedWaitMs ?? 12e4;
1671
+ const asyncEmbedWaitMs = options?.asyncEmbedWaitMs ?? DEFAULT_ASYNC_EMBED_WAIT_MS;
1671
1672
  return new Promise((resolve8, reject) => {
1672
1673
  let latestContent = "";
1673
1674
  let messageId = null;
@@ -8771,6 +8772,14 @@ var OpenMatesClient = class _OpenMatesClient {
8771
8772
  category = resp.category;
8772
8773
  modelName = resp.modelName;
8773
8774
  assistantMessageId = assistantId;
8775
+ await this.persistStreamedEmbeds({
8776
+ ws,
8777
+ embeds: resp.embeds,
8778
+ chatId,
8779
+ chatKeyBytes,
8780
+ fallbackMessageId: assistantId,
8781
+ ownerId
8782
+ });
8774
8783
  clearSyncCache(teamId);
8775
8784
  await persistCompressionCheckpoints(resp.compressionCheckpoints);
8776
8785
  const mateName2 = category ? MATE_NAMES[category] ?? null : null;
@@ -40665,6 +40674,56 @@ embed_ref: result-XhI`,
40665
40674
  }
40666
40675
  };
40667
40676
 
40677
+ // ../ui/src/demo_chats/data/example_chats/screenshot-to-html-pricing-card.ts
40678
+ var screenshotToHtmlPricingCardChat = {
40679
+ chat_id: "example-screenshot-to-html-pricing",
40680
+ slug: "screenshot-to-html-pricing-card",
40681
+ title: "example_chats.screenshot_to_html_pricing_card.title",
40682
+ summary: "example_chats.screenshot_to_html_pricing_card.summary",
40683
+ icon: "code",
40684
+ category: "design",
40685
+ keywords: ["screenshot to HTML", "HTML card", "visual AI", "frontend code", "design to code"],
40686
+ follow_up_suggestions: ["example_chats.screenshot_to_html_pricing_card.follow_up_1", "example_chats.screenshot_to_html_pricing_card.follow_up_2", "example_chats.screenshot_to_html_pricing_card.follow_up_3", "example_chats.screenshot_to_html_pricing_card.follow_up_4", "example_chats.screenshot_to_html_pricing_card.follow_up_5", "example_chats.screenshot_to_html_pricing_card.follow_up_6"],
40687
+ messages: [
40688
+ {
40689
+ "id": "6eec58cb-3d75-4726-9ae7-70549f6e8bc5",
40690
+ "role": "user",
40691
+ "content": "example_chats.screenshot_to_html_pricing_card.message_1",
40692
+ "created_at": 1784765315
40693
+ },
40694
+ {
40695
+ "id": "a8863386-c6d7-5c48-a7a7-36cc5bfbc5d0",
40696
+ "role": "assistant",
40697
+ "content": "example_chats.screenshot_to_html_pricing_card.message_2",
40698
+ "created_at": 1784765522,
40699
+ "user_message_id": "6eec58cb-3d75-4726-9ae7-70549f6e8bc5",
40700
+ "response_credits": 250,
40701
+ "category": "design",
40702
+ "model_name": "Gemini 3.5 Flash-Lite"
40703
+ }
40704
+ ],
40705
+ embeds: [
40706
+ {
40707
+ "embed_id": "395f8816-7e0b-4753-8058-f1f5c49d0482",
40708
+ "type": "code",
40709
+ "content": 'type: code\napp_id: code\nskill_id: image_to_html\nlanguage: html\ncode: "<!DOCTYPE html>\\n<html lang=\\"en\\">\\n<head>\\n <meta charset=\\"UTF-8\\">\\n <meta name=\\"viewport\\" content=\\"width=1440, height=1200, initial-scale=1.0\\">\\n <title>Pricing Card</title>\\n <style>\\n * {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n }\\n\\n body {\\n width: 1440px;\\n height: 1200px;\\n margin: 0;\\n padding: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background-color: #f4f6fc;\\n background-image: \\n radial-gradient(circle at 100% 100%, #fff4eb 0%, rgba(255, 244, 235, 0) 55%),\\n radial-gradient(circle at 0% 0%, #e9effd 0%, rgba(233, 239, 253, 0) 55%);\\n font-family: -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, Helvetica, Arial, sans-serif;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n overflow: hidden;\\n }\\n\\n .card {\\n width: 418px;\\n background: #ffffff;\\n border-radius: 28px;\\n padding: 42px 40px;\\n box-shadow: \\n 0 32px 64px -12px rgba(110, 120, 175, 0.14),\\n 0 12px 28px -8px rgba(0, 0, 0, 0.02);\\n display: flex;\\n flex-direction: column;\\n }\\n\\n .badge {\\n display: inline-flex;\\n align-items: center;\\n gap: 7px;\\n background-color: #e8effd;\\n color: #3b5bfd;\\n font-size: 12.5px;\\n font-weight: 600;\\n padding: 5px 12px 5px 10px;\\n border-radius: 100px;\\n width: fit-content;\\n margin-bottom: 24px;\\n }\\n\\n .badge-dot {\\n width: 6px;\\n height: 6px;\\n background-color: #3b5bfd;\\n border-radius: 50%;\\n }\\n\\n .title {\\n font-size: 36px;\\n font-weight: 800;\\n color: #151828;\\n line-height: 1.14;\\n letter-spacing: -0.03em;\\n margin-bottom: 14px;\\n }\\n\\n .description {\\n font-size: 14.5px;\\n line-height: 1.48;\\n color: #676f83;\\n margin-bottom: 32px;\\n }\\n\\n .price-container {\\n display: flex;\\n align-items: baseline;\\n gap: 8px;\\n margin-bottom: 32px;\\n }\\n\\n .price {\\n font-size: 48px;\\n font-weight: 800;\\n color: #151828;\\n line-height: 1;\\n letter-spacing: -0.035em;\\n }\\n\\n .price-period {\\n font-size: 14px;\\n font-weight: 500;\\n color: #676f83;\\n }\\n\\n .features {\\n display: flex;\\n flex-direction: column;\\n gap: 16px;\\n margin-bottom: 36px;\\n }\\n\\n .feature-item {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n }\\n\\n .feature-icon {\\n width: 20px;\\n height: 20px;\\n border-radius: 50%;\\n background-color: #d8f7e5;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-shrink: 0;\\n }\\n\\n .feature-icon-dot {\\n width: 6px;\\n height: 6px;\\n border-radius: 50%;\\n background-color: #02b153;\\n }\\n\\n .feature-text {\\n font-size: 14.5px;\\n font-weight: 700;\\n color: #151828;\\n letter-spacing: -0.01em;\\n }\\n\\n .btn {\\n width: 100%;\\n height: 52px;\\n background: linear-gradient(90deg, #405bf8 0%, #813cfc 100%);\\n color: #ffffff;\\n border: none;\\n border-radius: 16px;\\n font-size: 15px;\\n font-weight: 600;\\n cursor: pointer;\\n box-shadow: 0 10px 24px -2px rgba(105, 70, 255, 0.42);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-family: inherit;\\n }\\n </style>\\n</head>\\n<body>\\n <div class=\\"card\\">\\n <div class=\\"badge\\">\\n <span class=\\"badge-dot\\"></span>\\n Team Plan\\n </div>\\n \\n <h1 class=\\"title\\">Design faster with<br>visual AI</h1>\\n \\n <p class=\\"description\\">\\n Turn screenshots into clean front-end code and<br>review the result in seconds.\\n </p>\\n \\n <div class=\\"price-container\\">\\n <span class=\\"price\\">$29</span>\\n <span class=\\"price-period\\">/ seat monthly</span>\\n </div>\\n \\n <div class=\\"features\\">\\n <div class=\\"feature-item\\">\\n <div class=\\"feature-icon\\">\\n <div class=\\"feature-icon-dot\\"></div>\\n </div>\\n <span class=\\"feature-text\\">Unlimited design imports</span>\\n </div>\\n <div class=\\"feature-item\\">\\n <div class=\\"feature-icon\\">\\n <div class=\\"feature-icon-dot\\"></div>\\n </div>\\n <span class=\\"feature-text\\">Responsive HTML export</span>\\n </div>\\n <div class=\\"feature-item\\">\\n <div class=\\"feature-icon\\">\\n <div class=\\"feature-icon-dot\\"></div>\\n </div>\\n <span class=\\"feature-text\\">Visual QA reports</span>\\n </div>\\n </div>\\n \\n <button class=\\"btn\\">Start building</button>\\n </div>\\n</body>\\n</html>"\nfilename: index.html\nembed_ref: code-395f88\nstatus: finished\nline_count: 200\nimage_to_html_metadata:\n correction_passes_used: 2\n validation_warnings[0]:\n usage:\n model: gemini-3.6-flash\n input_tokens: 19416\n output_tokens: 5272\n cache_read_tokens: 0\n cache_write_tokens: 0\n e2b_render_seconds: 100.38043770287186\n correction_passes_used: 2\n validation_repair_attempts: 0\n extracted_asset_count: 0\n visual_diff_score: 0.0149640522875817\n duration_second: 100.38043770287186\n provider_cost_usd: 0.068664\n provider_cost_credits: 69\n model_credits: 215\n e2b_credits: 10\n e2b_started_minutes: 2\n reserved_credits: 1500\n credits_charged: 225\n credits_refunded: 1275',
40710
+ "parent_embed_id": null,
40711
+ "embed_ids": null
40712
+ },
40713
+ {
40714
+ "embed_id": "fcfe81c4-5baa-4580-be67-d5bec235d2f4",
40715
+ "type": "image",
40716
+ "content": "type: image\napp_id: images\nskill_id: upload\nstatus: finished\nfilename: simple-card-input.png\nembed_ref: simple-card-input-png-fcfe81c4-5baa-4580-afa07b\ncontent_hash: efb02bdf09ab6665c910dc9b94ab00384280148bf633d9d9d0c6ce758a253ed4\nai_detection:\n ai_generated: 0.99\n provider: sightengine\n status: success\n error: null",
40717
+ "parent_embed_id": null,
40718
+ "embed_ids": null
40719
+ }
40720
+ ],
40721
+ metadata: {
40722
+ featured: true,
40723
+ order: 118
40724
+ }
40725
+ };
40726
+
40668
40727
  // ../ui/src/demo_chats/exampleChatData.ts
40669
40728
  var ALL_EXAMPLE_CHATS = [
40670
40729
  giganticAirplanesChat,
@@ -40764,7 +40823,8 @@ var ALL_EXAMPLE_CHATS = [
40764
40823
  dashboardSidebarSvgIconsChat,
40765
40824
  vitalFarmsSecFinancialsChat,
40766
40825
  financeCashFlowOverviewChat,
40767
- privacyFirstLocalAiWorkspaceChat
40826
+ privacyFirstLocalAiWorkspaceChat,
40827
+ screenshotToHtmlPricingCardChat
40768
40828
  ].sort((a, b) => a.metadata.order - b.metadata.order);
40769
40829
 
40770
40830
  // ../ui/src/i18n/locales/en.json
@@ -50133,6 +50193,38 @@ Would you like to start executing on any specific pillar of this plan\u2014such
50133
50193
  text: '```json\n{"type": "app_skill_use", "embed_id": "2f72870d-27c9-4e6a-82a0-ac6cef2b8839", "app_id": "code", "skill_id": "search_repos", "query": "vector database rust"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "bb757fef-77ab-4050-b3be-a62d0c177b72", "app_id": "code", "skill_id": "search_repos", "query": "vector search rust"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "5358df62-b716-487b-a554-36c8c0ad0cf9", "app_id": "code", "skill_id": "search_repos", "query": "qdrant/qdrant"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "70951676-9c32-4eac-bfe7-97e7b3888ce1", "app_id": "code", "skill_id": "search_repos", "query": "vector database language:rust"}\n```\n\nRust has become a premier language for building vector databases due to its zero-cost abstractions, memory safety, and C++ like performance\u2014qualities that are essential for handling millions of high-dimensional embeddings.\n\nBased on active, open-source repositories on GitHub, here is a comparison of the top Rust-based vector database engines and extensions available for self-hosting.\n\n### \u{1F4CA} Comparison Overview\n\n```json\n{"type": "sheet", "embed_id": "3895dddf-e6d3-4048-aabb-6687f38c788d"}\n```\n\n\n*\\*Activity is based on the most recent code commits as of June 2026.*\n\n---\n\n### \u{1F50D} Detailed Breakdown\n\n#### 1. The Industry Standard: Qdrant\n[Qdrant](embed:qdrant-B6U) is the undisputed leader when it comes to pure-Rust vector databases. It was built from the ground up for high-performance vector similarity search.\n* **Pros:** Production-ready, massive community support, supports complex filtering payloads alongside vector search, cloud-native architecture, and includes a built-in Web UI.\n* **Use Case:** Ideal if you are building production-level AI applications, recommendation systems, or semantic search architectures and want a standalone, horizontally scalable vector engine.\n\n#### 2. The Rising Graph-Vector Hybrid: HelixDB\n[HelixDB](embed:helix-db-SlF) is a relatively new but heavily trending database that combines graph database capabilities with vector embeddings.\n* **Pros:** By combining graph nodes with vector embeddings, it\'s highly optimized for Retrieval-Augmented Generation (RAG) tasks where you need both semantic similarity (vectors) and explicit relationship context (graphs).\n* **Use Case:** Excellent for advanced Agentic AI architectures, RAG, and knowledge graphs where standard vector search lacks relational context.\n\n#### 3. The Postgres Extensions: pgvecto.rs & Lantern\nIf you already use PostgreSQL and don\'t want to maintain a separate infrastructure just for vectors, Rust powers two major extensions:\n* **[pgvecto.rs](embed:pgvecto-rs-Lg9)** (Apache 2.0): Focuses on scalable, low-latency hybrid search. It replaces standard Postgres indexing with highly optimized Rust bindings for ANN (Approximate Nearest Neighbor) searches.\n* **[Lantern](embed:lantern-A4O)** (AGPL 3.0): Another Postgres extension heavily leaning into external index generation and edge use-cases.\n* **Use Case:** Perfect if your embeddings are tightly coupled with existing relational data and you prefer scaling a single Postgres cluster.\n\n#### 4. The Specialized Engines: SeekStorm & Cozo\n* **[SeekStorm](embed:seekstorm-p2o)**: Focuses heavily on combining traditional full-text (BM25/lexical) search with dense vector retrieval in a single query. It can run as an embedded in-process library or a standalone multi-tenant server.\n* **[CozoDB](embed:cozo-nPL)**: A unique transactional database that uses **Datalog** (a declarative logic language) for querying. It brings together relational schemas, graph traversal, and vector search under one engine.\n\n### \u{1F4A1} Recommendation\n\n* If you want the **safest, most robust, and widely supported** self-hosted engine: Choose **Qdrant**.\n* If you are building an **advanced LLM/RAG pipeline** that relies on interconnected concepts: Choose **HelixDB**.\n* If you want to keep everything inside **Postgres** but with better performance than standard `pgvector` (which is written in C): Choose **pgvecto.rs**.'
50134
50194
  }
50135
50195
  },
50196
+ screenshot_to_html_pricing_card: {
50197
+ title: {
50198
+ text: "Screenshot to HTML pricing card"
50199
+ },
50200
+ summary: {
50201
+ text: "Watch OpenMates turn a pricing-card screenshot into a standalone inline HTML code embed with visual QA metadata."
50202
+ },
50203
+ message_1: {
50204
+ text: "Please turn this screenshot into a standalone inline HTML code embed. Match the screenshot closely and keep it self-contained.\n[!](embed:simple-card-input-png-fcfe81c4-5baa-4580-afa07b)"
50205
+ },
50206
+ message_2: {
50207
+ text: '```json\n{"type": "app_skill_use", "embed_id": "395f8816-7e0b-4753-8058-f1f5c49d0482", "app_id": "code", "skill_id": "image_to_html"}\n```\n\n\u6211\u73B0\u5728\u6B63\u6839\u636E\u4F60\u7684\u622A\u56FE\u751F\u6210\u72EC\u7ACB\u7684 HTML \u4EE3\u7801 embed\u3002'
50208
+ },
50209
+ follow_up_1: {
50210
+ text: "Run this HTML code to see how it works"
50211
+ },
50212
+ follow_up_2: {
50213
+ text: "Explain how to customize this card's colors"
50214
+ },
50215
+ follow_up_3: {
50216
+ text: "Find similar HTML card designs for inspiration"
50217
+ },
50218
+ follow_up_4: {
50219
+ text: "Show me how to add interactive elements"
50220
+ },
50221
+ follow_up_5: {
50222
+ text: "Generate a matching mobile version of this card"
50223
+ },
50224
+ follow_up_6: {
50225
+ text: "Teach me about responsive design principles"
50226
+ }
50227
+ },
50136
50228
  sqlite_strict_tables_summary: {
50137
50229
  title: {
50138
50230
  text: "SQLite STRICT Tables for App Developers"
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  getExtForLang,
4
4
  serializeToYaml
5
- } from "./chunk-LAAY2YYX.js";
5
+ } from "./chunk-F2G7QKBM.js";
6
6
  import "./chunk-MLWBMJEN.js";
7
7
  export {
8
8
  getExtForLang,
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  reconcileAuthoritativeChats,
19
19
  renderSupportInfo,
20
20
  serializeToYaml
21
- } from "./chunk-LAAY2YYX.js";
21
+ } from "./chunk-F2G7QKBM.js";
22
22
  import "./chunk-MLWBMJEN.js";
23
23
  export {
24
24
  APP_SKILL_METADATA,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmates",
3
- "version": "0.15.0-alpha.44",
3
+ "version": "0.15.0-alpha.45",
4
4
  "description": "OpenMates CLI and SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",