openmates 0.27.0-alpha.51 → 0.27.0-alpha.52

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.
@@ -33945,14 +33945,16 @@ function stripAnsi(value) {
33945
33945
  function terminalText(value) {
33946
33946
  return stripAnsi(value).replace(/[\x00-\x08\x0b-\x1f\x7f-\x9f]/g, "").replace(/\t/g, " ");
33947
33947
  }
33948
- function graphemeWidth(value) {
33948
+ function graphemeCellWidth(value) {
33949
33949
  if (/^[\p{Mark}\p{Cf}]+$/u.test(value)) return 0;
33950
33950
  const cp = value.codePointAt(0) ?? 0;
33951
33951
  if (/\p{Extended_Pictographic}|\p{Regional_Indicator}|\u20e3/u.test(value)) return 2;
33952
33952
  return cp >= 4352 && (cp <= 4447 || cp === 9001 || cp === 9002 || cp >= 11904 && cp <= 42191 && cp !== 12351 || cp >= 44032 && cp <= 55203 || cp >= 63744 && cp <= 64255 || cp >= 65040 && cp <= 65049 || cp >= 65072 && cp <= 65135 || cp >= 65281 && cp <= 65376 || cp >= 65504 && cp <= 65510 || cp >= 131072 && cp <= 262141) ? 2 : 1;
33953
33953
  }
33954
33954
  function cells(value) {
33955
- return [...segments.segment(stripAnsi(value))].reduce((n, item) => n + graphemeWidth(item.segment), 0);
33955
+ let width = 0;
33956
+ for (const { segment } of segments.segment(stripAnsi(value))) width += graphemeCellWidth(segment);
33957
+ return width;
33956
33958
  }
33957
33959
  function truncateCells(value, width, ellipsis = "\u2026") {
33958
33960
  const clean2 = terminalText(value).replace(/\n/g, " ");
@@ -33960,7 +33962,7 @@ function truncateCells(value, width, ellipsis = "\u2026") {
33960
33962
  const available2 = Math.max(0, width - cells(ellipsis));
33961
33963
  let result = "", used = 0;
33962
33964
  for (const { segment } of segments.segment(clean2)) {
33963
- const size = graphemeWidth(segment);
33965
+ const size = graphemeCellWidth(segment);
33964
33966
  if (used + size > available2) break;
33965
33967
  result += segment;
33966
33968
  used += size;
@@ -33977,7 +33979,7 @@ function sliceCells(value, start, width) {
33977
33979
  const end = start + width;
33978
33980
  let position = 0, result = "";
33979
33981
  for (const { segment } of segments.segment(terminalText(value).replace(/\n/g, " "))) {
33980
- const size = graphemeWidth(segment), next = position + size;
33982
+ const size = graphemeCellWidth(segment), next = position + size;
33981
33983
  if (next > start && position < end) {
33982
33984
  result += position >= start && next <= end ? segment : " ".repeat(Math.min(end, next) - Math.max(start, position));
33983
33985
  }
@@ -33992,7 +33994,7 @@ function wrapCells(value, width) {
33992
33994
  for (const line3 of terminalText(value).split("\n")) {
33993
33995
  let text7 = "", used = 0;
33994
33996
  for (const { segment } of segments.segment(line3)) {
33995
- const size = graphemeWidth(segment);
33997
+ const size = graphemeCellWidth(segment);
33996
33998
  if (size > width) {
33997
33999
  if (text7) result.push(text7);
33998
34000
  result.push("?");
@@ -59593,6 +59595,1528 @@ var socialAppNameDomainSearchChat = {
59593
59595
  }
59594
59596
  };
59595
59597
 
59598
+ // ../ui/src/demo_chats/data/example_chats/damped-sine-decay-plot.ts
59599
+ var dampedSineDecayPlotChat = {
59600
+ chat_id: "example-damped-sine-decay-plot",
59601
+ slug: "damped-sine-decay-plot",
59602
+ title: "example_chats.damped_sine_decay_plot.title",
59603
+ summary: "example_chats.damped_sine_decay_plot.summary",
59604
+ icon: "chart-no-axes-combined",
59605
+ category: "science",
59606
+ keywords: ["damped sine wave", "exponential decay", "math plot", "envelope", "harmonic motion"],
59607
+ follow_up_suggestions: ["example_chats.damped_sine_decay_plot.follow_up_1", "example_chats.damped_sine_decay_plot.follow_up_2", "example_chats.damped_sine_decay_plot.follow_up_3", "example_chats.damped_sine_decay_plot.follow_up_4", "example_chats.damped_sine_decay_plot.follow_up_5", "example_chats.damped_sine_decay_plot.follow_up_6"],
59608
+ messages: [
59609
+ {
59610
+ "id": "67a2a271-e475-44c0-bf60-69fea588c37f",
59611
+ "role": "user",
59612
+ "content": "example_chats.damped_sine_decay_plot.message_1",
59613
+ "created_at": 1791547925
59614
+ },
59615
+ {
59616
+ "id": "9ad1ff68-d12c-5572-9a87-c616b82ac78f",
59617
+ "role": "assistant",
59618
+ "content": "example_chats.damped_sine_decay_plot.message_2",
59619
+ "created_at": 1791547977,
59620
+ "user_message_id": "67a2a271-e475-44c0-bf60-69fea588c37f",
59621
+ "category": "science",
59622
+ "model_name": "Gemini 3.8 Flash"
59623
+ }
59624
+ ],
59625
+ embeds: [
59626
+ {
59627
+ "embed_id": "9ef899d2-4b73-4c4e-88bf-d4fd31d61e79",
59628
+ "type": "math-plot",
59629
+ "content": 'type: math-plot\napp_id: math\nskill_id: plot\nplot_spec: "f(x) = exp(-0.2 * x) * sin(3 * x)\\ng(x) = exp(-0.2 * x)\\nh(x) = -exp(-0.2 * x)"\nembed_ref: math-plot-9ef899\nstatus: finished',
59630
+ "parent_embed_id": null,
59631
+ "embed_ids": null
59632
+ }
59633
+ ],
59634
+ metadata: {
59635
+ featured: true,
59636
+ order: 128
59637
+ }
59638
+ };
59639
+
59640
+ // ../ui/src/demo_chats/data/example_chats/community-garden-planning-mindmap.ts
59641
+ var communityGardenPlanningMindmapChat = {
59642
+ chat_id: "example-community-garden-planning-mindmap",
59643
+ slug: "community-garden-planning-mindmap",
59644
+ title: "example_chats.community_garden_planning_mindmap.title",
59645
+ summary: "example_chats.community_garden_planning_mindmap.summary",
59646
+ icon: "network",
59647
+ category: "general_knowledge",
59648
+ keywords: ["community garden", "mind map", "volunteer planning", "planting", "budget", "events"],
59649
+ follow_up_suggestions: ["example_chats.community_garden_planning_mindmap.follow_up_1", "example_chats.community_garden_planning_mindmap.follow_up_2", "example_chats.community_garden_planning_mindmap.follow_up_3", "example_chats.community_garden_planning_mindmap.follow_up_4", "example_chats.community_garden_planning_mindmap.follow_up_5", "example_chats.community_garden_planning_mindmap.follow_up_6"],
59650
+ messages: [
59651
+ {
59652
+ "id": "25bbcf68-8f8c-4e80-b06f-bd5542146297",
59653
+ "role": "user",
59654
+ "content": "example_chats.community_garden_planning_mindmap.message_1",
59655
+ "created_at": 1791547929
59656
+ },
59657
+ {
59658
+ "id": "7c8cd2c3-ed24-546c-828a-7e8e7b586991",
59659
+ "role": "assistant",
59660
+ "content": "example_chats.community_garden_planning_mindmap.message_2",
59661
+ "created_at": 1791547973,
59662
+ "user_message_id": "25bbcf68-8f8c-4e80-b06f-bd5542146297",
59663
+ "category": "science",
59664
+ "model_name": "Gemini 3.8 Flash"
59665
+ }
59666
+ ],
59667
+ embeds: [
59668
+ {
59669
+ "embed_id": "02d212e1-3648-42f5-8c96-700bd34a5070",
59670
+ "type": "mindmap",
59671
+ "content": 'type: mindmap\napp_id: mindmaps\nskill_id: mindmap\ntitle: Community Garden Planning\nsource_json: "{\\n \\"openmatesType\\": \\"mindmap\\",\\n \\"schemaVersion\\": 1,\\n \\"title\\": \\"Community Garden Planning\\",\\n \\"rootId\\": \\"garden-root\\",\\n \\"nodes\\": [\\n {\\n \\"id\\": \\"garden-root\\",\\n \\"label\\": \\"Community Garden Planning\\",\\n \\"icon\\": \\"sprout\\",\\n \\"color\\": \\"#15803d\\",\\n \\"children\\": [\\n \\"branch-volunteers\\",\\n \\"branch-planting\\",\\n \\"branch-budget\\",\\n \\"branch-events\\"\\n ]\\n },\\n {\\n \\"id\\": \\"branch-volunteers\\",\\n \\"label\\": \\"Volunteers & Community\\",\\n \\"icon\\": \\"users\\",\\n \\"color\\": \\"#0284c7\\",\\n \\"children\\": [\\n \\"vol-roles\\",\\n \\"vol-recruitment\\",\\n \\"vol-orientation\\"\\n ]\\n },\\n {\\n \\"id\\": \\"vol-roles\\",\\n \\"label\\": \\"Working Teams (Watering, Weeding, Compost)\\",\\n \\"icon\\": \\"check-square\\",\\n \\"color\\": \\"#38bdf8\\"\\n },\\n {\\n \\"id\\": \\"vol-recruitment\\",\\n \\"label\\": \\"Outreach & Sign-Up Drives\\",\\n \\"icon\\": \\"megaphone\\",\\n \\"color\\": \\"#38bdf8\\"\\n },\\n {\\n \\"id\\": \\"vol-orientation\\",\\n \\"label\\": \\"Tool Safety & Training Days\\",\\n \\"icon\\": \\"graduation-cap\\",\\n \\"color\\": \\"#38bdf8\\"\\n },\\n {\\n \\"id\\": \\"branch-planting\\",\\n \\"label\\": \\"Planting & Horticulture\\",\\n \\"icon\\": \\"flower-2\\",\\n \\"color\\": \\"#16a34a\\",\\n \\"children\\": [\\n \\"plant-soil\\",\\n \\"plant-selection\\",\\n \\"plant-layout\\",\\n \\"plant-irrigation\\"\\n ]\\n },\\n {\\n \\"id\\": \\"plant-soil\\",\\n \\"label\\": \\"Soil Testing & [Compost](wiki:Compost) Amendments\\",\\n \\"icon\\": \\"test-tube\\",\\n \\"color\\": \\"#4ade80\\"\\n },\\n {\\n \\"id\\": \\"plant-selection\\",\\n \\"label\\": \\"Crop Selection ([Companion planting](wiki:Companion_planting), Pollinators)\\",\\n \\"icon\\": \\"leaf\\",\\n \\"color\\": \\"#4ade80\\"\\n },\\n {\\n \\"id\\": \\"plant-layout\\",\\n \\"label\\": \\"Bed Layout (Raised Beds, Pathways, Shed)\\",\\n \\"icon\\": \\"grid\\",\\n \\"color\\": \\"#4ade80\\"\\n },\\n {\\n \\"id\\": \\"plant-irrigation\\",\\n \\"label\\": \\"Water Source & [Drip irrigation](wiki:Drip_irrigation)\\",\\n \\"icon\\": \\"droplet\\",\\n \\"color\\": \\"#4ade80\\"\\n },\\n {\\n \\"id\\": \\"branch-budget\\",\\n \\"label\\": \\"Budget & Resources\\",\\n \\"icon\\": \\"wallet\\",\\n \\"color\\": \\"#d97706\\",\\n \\"children\\": [\\n \\"bud-expenses\\",\\n \\"bud-funding\\",\\n \\"bud-donations\\"\\n ]\\n },\\n {\\n \\"id\\": \\"bud-expenses\\",\\n \\"label\\": \\"Startup Costs (Lumber, Soil, Seeds, Hoses)\\",\\n \\"icon\\": \\"shopping-cart\\",\\n \\"color\\": \\"#fbbf24\\"\\n },\\n {\\n \\"id\\": \\"bud-funding\\",\\n \\"label\\": \\"Grants & Municipal Subsidies\\",\\n \\"icon\\": \\"landmark\\",\\n \\"color\\": \\"#fbbf24\\"\\n },\\n {\\n \\"id\\": \\"bud-donations\\",\\n \\"label\\": \\"Local Business Sponsorships & In-Kind Gifts\\",\\n \\"icon\\": \\"gift\\",\\n \\"color\\": \\"#fbbf24\\"\\n },\\n {\\n \\"id\\": \\"branch-events\\",\\n \\"label\\": \\"Events & Engagement\\",\\n \\"icon\\": \\"calendar\\",\\n \\"color\\": \\"#9333ea\\",\\n \\"children\\": [\\n \\"evt-kickoff\\",\\n \\"evt-workshops\\",\\n \\"evt-harvest\\"\\n ]\\n },\\n {\\n \\"id\\": \\"evt-kickoff\\",\\n \\"label\\": \\"Spring Groundbreaking & Work Parties\\",\\n \\"icon\\": \\"sun\\",\\n \\"color\\": \\"#c084fc\\"\\n },\\n {\\n \\"id\\": \\"evt-workshops\\",\\n \\"label\\": \\"Educational Gardening Workshops\\",\\n \\"icon\\": \\"book-open\\",\\n \\"color\\": \\"#c084fc\\"\\n },\\n {\\n \\"id\\": \\"evt-harvest\\",\\n \\"label\\": \\"Community Harvest Festival & Potluck\\",\\n \\"icon\\": \\"utensils\\",\\n \\"color\\": \\"#c084fc\\"\\n }\\n ],\\n \\"edges\\": [\\n {\\n \\"source\\": \\"vol-roles\\",\\n \\"target\\": \\"plant-irrigation\\"\\n },\\n {\\n \\"source\\": \\"bud-donations\\",\\n \\"target\\": \\"plant-soil\\"\\n }\\n ],\\n \\"view\\": {\\n \\"layout\\": \\"radial-tree\\",\\n \\"collapsedNodeIds\\": []\\n }\\n}"\nmodel:\n openmatesType: mindmap\n schemaVersion: 1\n title: Community Garden Planning\n rootId: garden-root\n nodes[18]:\n - id: garden-root\n label: Community Garden Planning\n icon: sprout\n color: "#15803d"\n children[4]: branch-volunteers,branch-planting,branch-budget,branch-events\n - id: branch-volunteers\n label: Volunteers & Community\n icon: users\n color: "#0284c7"\n children[3]: vol-roles,vol-recruitment,vol-orientation\n - id: vol-roles\n label: "Working Teams (Watering, Weeding, Compost)"\n icon: check-square\n color: "#38bdf8"\n - id: vol-recruitment\n label: Outreach & Sign-Up Drives\n icon: megaphone\n color: "#38bdf8"\n - id: vol-orientation\n label: Tool Safety & Training Days\n icon: graduation-cap\n color: "#38bdf8"\n - id: branch-planting\n label: Planting & Horticulture\n icon: flower-2\n color: "#16a34a"\n children[4]: plant-soil,plant-selection,plant-layout,plant-irrigation\n - id: plant-soil\n label: "Soil Testing & [Compost](wiki:Compost) Amendments"\n icon: test-tube\n color: "#4ade80"\n - id: plant-selection\n label: "Crop Selection ([Companion planting](wiki:Companion_planting), Pollinators)"\n icon: leaf\n color: "#4ade80"\n - id: plant-layout\n label: "Bed Layout (Raised Beds, Pathways, Shed)"\n icon: grid\n color: "#4ade80"\n - id: plant-irrigation\n label: "Water Source & [Drip irrigation](wiki:Drip_irrigation)"\n icon: droplet\n color: "#4ade80"\n - id: branch-budget\n label: Budget & Resources\n icon: wallet\n color: "#d97706"\n children[3]: bud-expenses,bud-funding,bud-donations\n - id: bud-expenses\n label: "Startup Costs (Lumber, Soil, Seeds, Hoses)"\n icon: shopping-cart\n color: "#fbbf24"\n - id: bud-funding\n label: Grants & Municipal Subsidies\n icon: landmark\n color: "#fbbf24"\n - id: bud-donations\n label: Local Business Sponsorships & In-Kind Gifts\n icon: gift\n color: "#fbbf24"\n - id: branch-events\n label: Events & Engagement\n icon: calendar\n color: "#9333ea"\n children[3]: evt-kickoff,evt-workshops,evt-harvest\n - id: evt-kickoff\n label: Spring Groundbreaking & Work Parties\n icon: sun\n color: "#c084fc"\n - id: evt-workshops\n label: Educational Gardening Workshops\n icon: book-open\n color: "#c084fc"\n - id: evt-harvest\n label: Community Harvest Festival & Potluck\n icon: utensils\n color: "#c084fc"\n edges[2]{source,target}:\n vol-roles,plant-irrigation\n bud-donations,plant-soil\n view:\n layout: radial-tree\n collapsedNodeIds: []\nembed_ref: mind-map-02d212\nstatus: finished\nnode_count: 18\nedge_count: 2\nvalidation:\n status: valid\n warnings: []\n parse_error: null\nversion_number: 1',
59672
+ "parent_embed_id": null,
59673
+ "embed_ids": null
59674
+ }
59675
+ ],
59676
+ metadata: {
59677
+ featured: true,
59678
+ order: 129,
59679
+ content_embed_examples: ["mindmaps.mindmap"]
59680
+ }
59681
+ };
59682
+
59683
+ // ../ui/src/demo_chats/data/example_chats/beginner-yoga-classes-berlin.ts
59684
+ var beginnerYogaClassesBerlinChat = {
59685
+ chat_id: "example-beginner-yoga-classes-berlin",
59686
+ slug: "beginner-yoga-classes-berlin",
59687
+ title: "example_chats.beginner_yoga_classes_berlin.title",
59688
+ summary: "example_chats.beginner_yoga_classes_berlin.summary",
59689
+ icon: "heart",
59690
+ category: "medical_health",
59691
+ keywords: ["beginner yoga classes Berlin", "fitness class Berlin", "yoga class booking Berlin"],
59692
+ follow_up_suggestions: ["example_chats.beginner_yoga_classes_berlin.follow_up_1", "example_chats.beginner_yoga_classes_berlin.follow_up_2", "example_chats.beginner_yoga_classes_berlin.follow_up_3", "example_chats.beginner_yoga_classes_berlin.follow_up_4", "example_chats.beginner_yoga_classes_berlin.follow_up_5", "example_chats.beginner_yoga_classes_berlin.follow_up_6"],
59693
+ messages: [
59694
+ {
59695
+ "id": "ab5bc4cd-487f-4073-97cd-7270837a1d15",
59696
+ "role": "user",
59697
+ "content": "example_chats.beginner_yoga_classes_berlin.message_1",
59698
+ "created_at": 1791547967
59699
+ },
59700
+ {
59701
+ "id": "10344500-08de-570b-8b03-dd48ab8937c0",
59702
+ "role": "assistant",
59703
+ "content": "example_chats.beginner_yoga_classes_berlin.message_2",
59704
+ "created_at": 1791548048,
59705
+ "user_message_id": "ab5bc4cd-487f-4073-97cd-7270837a1d15",
59706
+ "category": "medical_health",
59707
+ "model_name": "Gemini 3.8 Flash"
59708
+ }
59709
+ ],
59710
+ embeds: [
59711
+ {
59712
+ "embed_id": "02f512fa-c82a-41c4-b392-1f52e71d63ba",
59713
+ "type": "app_skill_use",
59714
+ "content": 'app_id: events\nskill_id: search\nresult_count: 5\nembed_ids: 021fc737-fe6a-4df3-ac18-9724da3bd0b6|d01064a6-51bf-4a02-b234-9767c4cfaf28|45087a30-85bd-423e-8f3f-0367d57296f7|6063917c-b250-462a-8020-e07665276f6c|e1abaaf7-74d5-4ab3-9a93-f91f76d70fd3\nstatus: finished\nend_date: "2026-10-18T23:59:59+02:00"\nstart_date: "2026-10-12T00:00:00+02:00"\nlocation: "Berlin, Germany"\nrelevance_criteria: Beginner yoga classes or workshops in Berlin next week\ncount: 5\nquery: beginner yoga class\nevent_type: PHYSICAL\nprovider: meetup\nproviders: meetup\npreview_results[5]{title,url,image_url,provider}:\n "Vinyasa Flow in Mitte / Wedding ","https://www.meetup.com/berlin-yoga-club/events/316697938/","https://secure.meetupstatic.com/photos/event/a/d/8/f/highres_487544431.jpeg",meetup\n "Mobility Yoga :) Optional Bouldering after ","https://www.meetup.com/mobility-yoga-with-optional-bouldering-to-connect-after/events/316882262/","https://secure.meetupstatic.com/photos/event/5/d/b/0/highres_534743984.jpeg",meetup\n Yoga Kurs,"https://www.meetup.com/offenes-wohnzimmer-berlin/events/316444501/","https://secure.meetupstatic.com/photos/event/2/0/5/0/highres_535448272.jpeg",meetup\n THERAPEUTISCHES \u2764 YOGA \u2764,"https://www.meetup.com/rooftop-yoga-berlin/events/316680372/","https://secure.meetupstatic.com/photos/event/b/d/2/0/highres_505608416.jpeg",meetup\n Yoga for Grounding,"https://www.eventbrite.de/e/yoga-for-grounding-tickets-2002496392616","https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.com%2Fimages%2F1185517963%2F2833591895431%2F1%2Foriginal.20260527-124333?crop=focalpoint&fit=crop&w=300&auto=format%2Ccompress&q=75&sharp=10&fp-x=0.5&fp-y=0.5&s=0e15d1dc6c29004f6f649af94c344740",eventbrite',
59715
+ "parent_embed_id": null,
59716
+ "embed_ids": [
59717
+ "021fc737-fe6a-4df3-ac18-9724da3bd0b6",
59718
+ "d01064a6-51bf-4a02-b234-9767c4cfaf28",
59719
+ "45087a30-85bd-423e-8f3f-0367d57296f7",
59720
+ "6063917c-b250-462a-8020-e07665276f6c",
59721
+ "e1abaaf7-74d5-4ab3-9a93-f91f76d70fd3"
59722
+ ]
59723
+ },
59724
+ {
59725
+ "embed_id": "e1abaaf7-74d5-4ab3-9a93-f91f76d70fd3",
59726
+ "type": "event",
59727
+ "content": 'type: event_result\nid: "2002496392616"\nprovider: eventbrite\ntitle: Yoga for Grounding\ndescription: "Through mindful sequencing, we build heat and energy in the body with breath-led movement, then pause to hold selected postures, creating space to explore alignment, stillness, and deeper breathing. The practice balances effort and ease, inviting both strength and softness - so you leave feeling energised, centred, and more connected to your breath. Open to all levels and beginner-friendly. This class is held in English. The Art.OM studio is located on the ground floor, just to the left in the hallway when you enter the building. You can bring your own mat or use one of ours. Please arrive 10 minutes early to settle in. The door will be closed once class begins, and late entry will not be possible."\nurl: "https://www.eventbrite.de/e/yoga-for-grounding-tickets-2002496392616"\ndate_start: "2026-10-14T18:00:00"\ndate_end: "2026-10-14T19:00:00"\ntimezone: Europe/Berlin\nevent_type: PHYSICAL\nvenue_name: Wrangelstra\xDFe 54\nvenue_address: "Wrangelstra\xDFe 54, 10997 Berlin"\nvenue_city: Berlin\nvenue_state: BE\nvenue_country: DE\nvenue_lat: 52.49828330000001\nvenue_lon: 13.4424341\norganizer_name: Art OM\norganizer_url: "https://www.eventbrite.de/o/art-om-113675772011"\norganizer_summary: "Art.OM is your welcoming local space for artistic exploration and body alignment, located in vibrant Kreuzberg \u2013 Wrangelstr. 54.We bring together yoga and art to create a space for growth, reflection,..."\norganizer_followers: 92\nis_paid: true\nfee_min: "11.83"\nfee_max: "22.49"\nfee_currency: EUR\nfee_display: 11.83 EUR - 22.49 EUR\nimage_url: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.com%2Fimages%2F1185517963%2F2833591895431%2F1%2Foriginal.20260527-124333?crop=focalpoint&fit=crop&w=300&auto=format%2Ccompress&q=75&sharp=10&fp-x=0.5&fp-y=0.5&s=0e15d1dc6c29004f6f649af94c344740"\nticket_info_tickets_by: Eventbrite\nticket_info_tickets_url: "https://www.eventbrite.com/checkout-external?eid=2002496392616"\nticket_info_has_available_tickets: true\nticket_info_is_sold_out: false\nticket_info_sales_status: on_sale\ntags: "Yoga|Health & Wellness|Class, Training, or Workshop|Yoga|Mindfulness|Flow|Movement|Vinyasa|Hathayoga"\neventbrite_event_id: "2002496392616"\nhash: 1e103583ff3d7072\nembed_ref: yoga-for-grounding-TB2\napp_id: events\nskill_id: search',
59728
+ "parent_embed_id": "02f512fa-c82a-41c4-b392-1f52e71d63ba",
59729
+ "embed_ids": null
59730
+ },
59731
+ {
59732
+ "embed_id": "45087a30-85bd-423e-8f3f-0367d57296f7",
59733
+ "type": "event",
59734
+ "content": 'type: event_result\nid: "316444501"\nprovider: meetup\ntitle: Yoga Kurs\ndescription: "**YOGA mit PAULINA & LAURA**\\n\\nPAULINA:\\nMeine Yogaausbildung habe ich in einem Ashram absolviert, angelehnt an die Sivananda- Tradition.\\nIn meinen Stunden verbinde ich sanfte und dynamische Elemente wie Sonnengr\xFC\xDFe, Atem\xFCbungen und achtsame K\xF6rperarbeit.\\nDurch bewusstes Sp\xFCren in den Asanas m\xF6chte ich die K\xF6rperwahrnehmung, Selbstliebe und ein positives K\xF6rpergef\xFChl st\xE4rken. Gleichzeitig darf Bewegung leicht, spielerisch und voller Freude sein.\\nManchmal flie\xDFen auch Journaling, Faszienb\xE4lle oder andere unterst\xFCtzende Tools in die Stunde ein, die dir helfen k\xF6nnen, noch tiefer bei dir selbst anzukommen.\\nDabei ist es mir wichtig, dass sich jede teilnehmende Person wohlf\xFChlt. Durch individuell anpassbare Positionen ist die Praxis f\xFCr alle Level geeignet. Die Freude an der Bewegung, Yoga und ein achtsames Miteinander stehen dabei im Vordergrund. Egal, ob du Anf\xE4nger\\\\*in bist oder bereits Erfahrung mitbringst.\\n\\nLAURA:\\nMeine Ausbildungen in Ashtanga, Vinyasa und Yin Yoga habe ich in Griechenland absolviert.\\nYoga ist f\xFCr mich nicht nur eine Energiequelle, sondern auch eine Auszeit vom Alltag und ein Anker, wenn das Leben st\xFCrmisch wird. Ich m\xF6chte meinen Sch\xFCler:innen eine \xE4hnliche Erfahrung erm\xF6glichen. Meine eigene Praxis lehrt mich Achtsamkeit, Geduld und die unglaubliche Kraft des Atems. Dieses Wissen habe ich in verschiedenen Workshops vertieft.\\nMeine Leidenschaft gilt der Gestaltung von belebenden und mobilisierenden Vinyasa-Flows sowie von erdenden und entspannenden Yin-Kursen, die oft einem bestimmten Thema folgen.\\nMeine Kurse sind inklusiv: Egal, ob du bereits Erfahrung hast oder dich als Anf\xE4nger siehst und neugierig bist, etwas Neues auszuprobieren \u2013 du bist herzlich willkommen.\\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014-\\n**Donnerstag: 17:50 Uhr**\\n(Beginn 18 Uhr) **Anmeldung** bitte gerne bis ein Tag vorher: [yogaimwohnzimmer@gmx.de](mailto:yogaimwohnzimmer@gmx.de)\\n**Bitte mitbringen:** Yogamatte, Optional: Yogabl\xF6cke, Kissen, dicke Decke, etwas zum schreiben\\nTeilnahme auf Spendenbasis (zur Erhaltung des Raums)."\nurl: "https://www.meetup.com/offenes-wohnzimmer-berlin/events/316444501/"\ndate_start: "2026-10-13T18:00:00+02:00"\ndate_end: "2026-10-13T19:00:00+02:00"\ntimezone: Europe/Berlin\nevent_type: PHYSICAL\nvenue_name: Offenes Wohnzimmer\nvenue_address: Waldenserstra\xDFe 13\nvenue_city: Berlin\nvenue_state: BE\nvenue_country: de\nvenue_lat: 52.52902\nvenue_lon: 13.332935\norganizer_id: "33121633"\norganizer_name: "Offenes Wohnzimmer: Moabit Nachbarschaft"\norganizer_slug: offenes-wohnzimmer-berlin\nrsvp_count: 2\nis_paid: false\nfee: null\nimage_url: "https://secure.meetupstatic.com/photos/event/2/0/5/0/highres_535448272.jpeg"\nhash: 6f01869ea225a70e\nembed_ref: yoga-kurs-qOQ\napp_id: events\nskill_id: search',
59735
+ "parent_embed_id": "02f512fa-c82a-41c4-b392-1f52e71d63ba",
59736
+ "embed_ids": null
59737
+ },
59738
+ {
59739
+ "embed_id": "6063917c-b250-462a-8020-e07665276f6c",
59740
+ "type": "event",
59741
+ "content": `type: event_result
59742
+ id: "316680372"
59743
+ provider: meetup
59744
+ title: THERAPEUTISCHES \u2764 YOGA \u2764
59745
+ description: "THERAPEUTISCH \u2764 Asana Basics\\nTHERAPEUTISCHES YOGA mit monatlichen Fokus:\\nJANUAR \u2764 Asana Basics\\nFEBRUAR \u2764 unteren R\xFCcken\\nM\xC4RZ \u2764 Schulter, Nacken, oberer R\xFCcken\\nAPRIL \u2764 Schulter + Asana Basics\\nMAI \u2764 unteren R\xFCcken\\n...\\nREFERENZEN\\n'Ich wollte Dir/ Euch auch nochmal f\xFCr die tollen Stunden danken! Ich habe Skoliose und ein Myofasziales Schmerzsyndrom in der linken Schulter und kann mir (seitdem ich bei euch Yoga praktiziere) den Gang zum Physiotherapeuten sparen!\\nDas hat seit einigen Monaten wirklich mein Leben ver\xE4ndert und dadurch habe ich auch weniger Schmerzen/ Stressrelease - danke daf\xFCr! <3\\nLiebe Gr\xFC\xDFe, Sophia'"
59746
+ url: "https://www.meetup.com/rooftop-yoga-berlin/events/316680372/"
59747
+ date_start: "2026-10-13T18:15:00+02:00"
59748
+ date_end: "2026-10-13T19:30:00+02:00"
59749
+ timezone: Europe/Berlin
59750
+ event_type: PHYSICAL
59751
+ venue_name: YOGA at Lobe Block UG
59752
+ venue_address: B\xF6ttgerstra\xDFe 16
59753
+ venue_city: Berlin
59754
+ venue_state: BE
59755
+ venue_country: de
59756
+ venue_lat: 52.548916
59757
+ venue_lon: 13.381006
59758
+ organizer_id: "23086785"
59759
+ organizer_name: YOGA at Lobe Block | SUMMER Rooftop Yoga Berlin
59760
+ organizer_slug: rooftop-yoga-berlin
59761
+ rsvp_count: 4
59762
+ is_paid: false
59763
+ fee: null
59764
+ image_url: "https://secure.meetupstatic.com/photos/event/b/d/2/0/highres_505608416.jpeg"
59765
+ hash: 3af59f67bd3504d3
59766
+ embed_ref: therapeutisches-yoga-YHA
59767
+ app_id: events
59768
+ skill_id: search`,
59769
+ "parent_embed_id": "02f512fa-c82a-41c4-b392-1f52e71d63ba",
59770
+ "embed_ids": null
59771
+ },
59772
+ {
59773
+ "embed_id": "d01064a6-51bf-4a02-b234-9767c4cfaf28",
59774
+ "type": "event",
59775
+ "content": 'type: event_result\nid: "316882262"\nprovider: meetup\ntitle: "Mobility Yoga :) Optional Bouldering after "\ndescription: "Spot needs to be booked [here via this link \u{1F33B}](https://gyms.vertical-life.info/urban-apes-fhain/events/9058/list) (not via meetup!)\\n\\nYou\u2018re new to Berlin or already here for a while and want to practice yoga with others in a relaxed atmosphere?\\n\\nOr looking to explore a cool place to get to know new people and have the option to go bouldering or hangout after the class for a drink?\\n\\nThis all-levels yoga class is happening every two weeks at the Bouldering Gym Urban Apes Friedrichshain. We flow together through some yoga, practice specific mobility exercises and after the class you could decide to try out bouldering in the gym. :)\\n\\nNo yoga or climbing experience needed! No flexibility needed! Just come as you are.\\n\\nPoses and Flows are explained and we flow in a relaxed pace, leaving room for play, mistakes, learning and joy :-)\\n\\nAlso a good way to practice English and connect to people with different backgrounds.\\n\\n**Important:**\\nThe yoga class is 5\u20AC (Booking via the Link, NOT via Meetup). If you want to go Bouldering too, you can check in via USC and Wellpass for free or have to pay the regular entrance fee. But of course you can also only come for the yoga class and not pay the bouldering entry :) Class starts 19pm sharp - arrive 15 min before the class starts, so you have enough time to check in and change.\\nMats and blankets at the Gym.\\n\\n[Book your spot via this link \u{1F33B}](https://gyms.vertical-life.info/urban-apes-fhain/events/9058/list)\\n\\nHow to find the Room:\\nFirst go to the counter. From there go right. Yoga Room is next to the Womens Changing Room. If you can\u2019t find it, ask at the counter.\\n\\n(Little tipp: take a screenshot of this for later)"\nurl: "https://www.meetup.com/mobility-yoga-with-optional-bouldering-to-connect-after/events/316882262/"\ndate_start: "2026-10-13T19:00:00+02:00"\ndate_end: "2026-10-13T19:45:00+02:00"\ntimezone: Europe/Berlin\nevent_type: PHYSICAL\nvenue_name: Urban Apes Friedrichshain\nvenue_address: Friedensstra\xDFe 91 B\nvenue_city: Berlin\nvenue_state: ""\nvenue_country: DE\nvenue_lat: 52.522205\nvenue_lon: 13.436905\norganizer_id: "38554467"\norganizer_name: Mobility Yoga - optional bouldering after\norganizer_slug: mobility-yoga-with-optional-bouldering-to-connect-after\nrsvp_count: 1\nis_paid: false\nfee: null\nimage_url: "https://secure.meetupstatic.com/photos/event/5/d/b/0/highres_534743984.jpeg"\nhash: b2c08e896f336dfa\nembed_ref: mobility-yoga-optional-qv3\napp_id: events\nskill_id: search',
59776
+ "parent_embed_id": "02f512fa-c82a-41c4-b392-1f52e71d63ba",
59777
+ "embed_ids": null
59778
+ },
59779
+ {
59780
+ "embed_id": "021fc737-fe6a-4df3-ac18-9724da3bd0b6",
59781
+ "type": "event",
59782
+ "content": 'type: event_result\nid: "316697938"\nprovider: meetup\ntitle: "Vinyasa Flow in Mitte / Wedding "\ndescription: "These vinyasa classes are positively dynamic, soft and strong as silk, always connecting to the deep, guiding you gently to the awareness of your breath to calm the mind and release the body of unnecessary tension.\\nModifications of the poses are offered to better suit each practitioner, from experienced beginners to advanced. Taping into a background of cultural diversity, dance and massage therapy, these sessions are a holistic practice with asanas, free form movement, music, voice, and silence.\\n\\nEach month the classes have a specific focus (i.e. twists, balance, resilience, chakras) to effectively process and develop the connection between mind, body, and spirit.\\n\\n**deutsch**\\n\\nVinyasa Yoga ist gezeichnet durch flie\xDFende Bewegungen und Sequenzen von Asanas die bewusst in Verbindung mit der Atmung stehen. Die Mittwochabend Klassen sind sanft kr\xE4ftigend, dynamisch & schwei\xDFtreibend mit dem Ziel von Regeneration & Revitalisierung. Die Praxis besteht aus Asana-Praxis, freie Bewegung, Atmungs\xFCbungen, Meditation und Entspannung. Es werden sowohl einfache als auch fortgeschrittene Varianten der Asanas angeboten, um deine Praxis an dein Level anzupassen.\\n\\nJeden Monat zielt der Kurs auf einen spezifischen Fokus hin (z.B. R\xFCckbeugen, Gleichgewicht, Umkehrhaltungen) um k\xF6rperliche Fortschritte zu erleichtern und Raum im Geist zu sch\xF6pfen.\\n\\nABOUT MARIANNE:\\n\\nMarianne Schmidt, born to german parents in India, raised across the globe, she calls Berlin home. She is the founder of Soul Treats and works as a certified massage therapist, yoga instructor and life coach.\\n\\nMarianne has been offering yoga classes and massage therapy for over eleven years. Fascinated by human anatomy and the connection between the psyche and the physical, her education is an ongoing process. Taping into many methods of body work, she treats clients and students holistically, by aligning the physical body with the aim of restoring balance on the emotional and energetical levels.\\n\\nDancing and performing since a yoga age, her yoga classes always include elements of dance, movement research and breath work.\\n\\nBreath is a her guide, \\"dancing from sound to silence, flowing from silence to sound.\\"\\n\\nPreis:\\n\\nErste Stunde - 10 Euro\\nStarterpaket: 3 Stunden - 20 Euro (g\xFCltig f\xFCr 1 Monat, in alle Soul Treats Kurse m\xF6glich)"\nurl: "https://www.meetup.com/berlin-yoga-club/events/316697938/"\ndate_start: "2026-10-14T19:30:00+02:00"\ndate_end: "2026-10-14T21:00:00+02:00"\ntimezone: Europe/Berlin\nevent_type: PHYSICAL\nvenue_name: YOGA at Lobe Block UG\nvenue_address: B\xF6ttgerstra\xDFe 16\nvenue_city: Berlin\nvenue_state: BE\nvenue_country: de\nvenue_lat: 52.548916\nvenue_lon: 13.381006\norganizer_id: "22903338"\norganizer_name: Berlin Yoga Club\norganizer_slug: Berlin-Yoga-Club\nrsvp_count: 1\nis_paid: false\nfee: null\nimage_url: "https://secure.meetupstatic.com/photos/event/a/d/8/f/highres_487544431.jpeg"\nhash: a3a3a32f18913dff\nembed_ref: vinyasa-flow-in-a8l\napp_id: events\nskill_id: search',
59783
+ "parent_embed_id": "02f512fa-c82a-41c4-b392-1f52e71d63ba",
59784
+ "embed_ids": null
59785
+ },
59786
+ {
59787
+ "embed_id": "e4569c35-68a2-486d-af5d-dc5600aca187",
59788
+ "type": "app_skill_use",
59789
+ "content": 'app_id: fitness\nskill_id: search_classes\nresult_count: 0\nembed_ids: []\nstatus: finished\nquery: beginner yoga\ndays: 7\nrelevance_criteria: "Beginner-friendly yoga classes in Berlin next week with clear times, locations, and spots"\ncity: Berlin\nstart_date: 2026-10-12\nprovider: Urban Sports Club\nlocation: Berlin\ndate: 2026-10-12\nplan: all\nattendance_mode: all',
59790
+ "parent_embed_id": null,
59791
+ "embed_ids": []
59792
+ }
59793
+ ],
59794
+ metadata: {
59795
+ featured: true,
59796
+ order: 130,
59797
+ app_skill_examples: ["events.search", "fitness.search_classes"]
59798
+ }
59799
+ };
59800
+
59801
+ // ../ui/src/demo_chats/data/example_chats/urban-heat-island-at-night.ts
59802
+ var urbanHeatIslandAtNightChat = {
59803
+ chat_id: "example-urban-heat-island-at",
59804
+ slug: "urban-heat-island-at-night",
59805
+ title: "example_chats.urban_heat_island_at_night.title",
59806
+ summary: "example_chats.urban_heat_island_at_night.summary",
59807
+ icon: "sun",
59808
+ category: "science",
59809
+ keywords: ["urban heat island", "city temperature", "nighttime heat", "urban climate"],
59810
+ follow_up_suggestions: ["example_chats.urban_heat_island_at_night.follow_up_1", "example_chats.urban_heat_island_at_night.follow_up_2", "example_chats.urban_heat_island_at_night.follow_up_3", "example_chats.urban_heat_island_at_night.follow_up_4", "example_chats.urban_heat_island_at_night.follow_up_5", "example_chats.urban_heat_island_at_night.follow_up_6"],
59811
+ messages: [
59812
+ {
59813
+ "id": "24fd34de-944b-4283-a1ad-b4d7a651a383",
59814
+ "role": "user",
59815
+ "content": "example_chats.urban_heat_island_at_night.message_1",
59816
+ "created_at": 1791554617
59817
+ },
59818
+ {
59819
+ "id": "680d2729-ea0a-5a5a-a0a1-238cd7e07742",
59820
+ "role": "assistant",
59821
+ "content": "example_chats.urban_heat_island_at_night.message_2",
59822
+ "created_at": 1791554648,
59823
+ "user_message_id": "24fd34de-944b-4283-a1ad-b4d7a651a383",
59824
+ "category": "science",
59825
+ "model_name": "Gemini 3.8 Flash"
59826
+ }
59827
+ ],
59828
+ embeds: [],
59829
+ metadata: {
59830
+ featured: true,
59831
+ order: 131
59832
+ }
59833
+ };
59834
+
59835
+ // ../ui/src/demo_chats/data/example_chats/community-garden-volunteer-onboarding.ts
59836
+ var communityGardenVolunteerOnboardingChat = {
59837
+ chat_id: "example-community-garden-volunteer-onboarding",
59838
+ slug: "community-garden-volunteer-onboarding",
59839
+ title: "example_chats.community_garden_volunteer_onboarding.title",
59840
+ summary: "example_chats.community_garden_volunteer_onboarding.summary",
59841
+ icon: "docs",
59842
+ category: "business_development",
59843
+ keywords: ["community garden", "volunteer onboarding", "document template"],
59844
+ follow_up_suggestions: ["example_chats.community_garden_volunteer_onboarding.follow_up_1", "example_chats.community_garden_volunteer_onboarding.follow_up_2", "example_chats.community_garden_volunteer_onboarding.follow_up_3", "example_chats.community_garden_volunteer_onboarding.follow_up_4", "example_chats.community_garden_volunteer_onboarding.follow_up_5", "example_chats.community_garden_volunteer_onboarding.follow_up_6"],
59845
+ messages: [
59846
+ {
59847
+ "id": "5652a8b0-8227-45ca-b851-0e820554730d",
59848
+ "role": "user",
59849
+ "content": "example_chats.community_garden_volunteer_onboarding.message_1",
59850
+ "created_at": 1791554723
59851
+ },
59852
+ {
59853
+ "id": "00db518f-6bfc-51b9-b4f3-f3690621f134",
59854
+ "role": "assistant",
59855
+ "content": "example_chats.community_garden_volunteer_onboarding.message_2",
59856
+ "created_at": 1791554753,
59857
+ "user_message_id": "5652a8b0-8227-45ca-b851-0e820554730d",
59858
+ "category": "general_knowledge",
59859
+ "model_name": "Gemini 3.8 Flash"
59860
+ }
59861
+ ],
59862
+ embeds: [
59863
+ {
59864
+ "embed_id": "f40fc42f-df5d-4116-bba3-3500b1805eb5",
59865
+ "type": "document",
59866
+ "content": `type: document
59867
+ app_id: docs
59868
+ skill_id: document
59869
+ status: finished
59870
+ title: Community Garden Volunteer Onboarding Guide
59871
+ filename: Volunteer_Onboarding_Guide.docx
59872
+ word_count: 82
59873
+ page_count: 1
59874
+ docx_model:
59875
+ title: Community Garden Volunteer Onboarding Guide
59876
+ filename: Volunteer_Onboarding_Guide.docx
59877
+ blocks[10]:
59878
+ - type: heading
59879
+ level: 1
59880
+ text: Community Garden Volunteer Guide
59881
+ - type: paragraph
59882
+ runs[1]{text,italic}:
59883
+ Welcome to our community garden! Thank you for sharing your time to help our green space grow.,true
59884
+ - type: heading
59885
+ level: 2
59886
+ text: 1. Arrival & Check-In
59887
+ - type: list
59888
+ ordered: false
59889
+ items[3]: "Head to [Check-In Location, e.g., Garden Shed / Info Kiosk].",Sign in on the attendance sheet and grab a volunteer name badge.,"Store your personal belongings in [Designated Storage Area]."
59890
+ - type: heading
59891
+ level: 2
59892
+ text: 2. First-Day Tasks
59893
+ - type: paragraph
59894
+ runs[1]{text}:
59895
+ "Check the whiteboard at [Shed Location] for the daily task roster. Common starter activities include weeding garden beds, watering seedlings, turning compost, or laying organic mulch. Pair up with a returning volunteer if it is your first time!"
59896
+ - type: heading
59897
+ level: 2
59898
+ text: 3. Safety & Tool Care
59899
+ - type: list
59900
+ ordered: false
59901
+ items[3]: "Wear sturdy, closed-toe shoes and garden gloves at all times.","Stay hydrated\u2014refill water bottles at [Potable Water Station].","Carry sharp tools pointed toward the ground; clean and return all gear to [Tool Rack]."
59902
+ - type: heading
59903
+ level: 2
59904
+ text: 4. Need Help?
59905
+ - type: paragraph
59906
+ runs[5]:
59907
+ - text: "Never hesitate to ask questions! Find today's lead coordinator, "
59908
+ - text: "[Coordinator Name]"
59909
+ bold: true
59910
+ - text: " (wearing [e.g., Bright Orange Vest]), or call "
59911
+ - text: "[Phone Number / Radio Channel]"
59912
+ bold: true
59913
+ - text: ". First aid is stocked at [First Aid Box Location]."`,
59914
+ "parent_embed_id": null,
59915
+ "embed_ids": null
59916
+ }
59917
+ ],
59918
+ metadata: {
59919
+ featured: true,
59920
+ order: 132
59921
+ }
59922
+ };
59923
+
59924
+ // ../ui/src/demo_chats/data/example_chats/books-after-left-hand-of-darkness.ts
59925
+ var booksAfterLeftHandOfDarknessChat = {
59926
+ chat_id: "example-books-after-left-hand",
59927
+ slug: "books-after-left-hand-of-darkness",
59928
+ title: "example_chats.books_after_left_hand_of_darkness.title",
59929
+ summary: "example_chats.books_after_left_hand_of_darkness.summary",
59930
+ icon: "book-open",
59931
+ category: "general_knowledge",
59932
+ keywords: ["Left Hand of Darkness", "science fiction books", "Ursula Le Guin", "book recommendations"],
59933
+ follow_up_suggestions: ["example_chats.books_after_left_hand_of_darkness.follow_up_1", "example_chats.books_after_left_hand_of_darkness.follow_up_2", "example_chats.books_after_left_hand_of_darkness.follow_up_3", "example_chats.books_after_left_hand_of_darkness.follow_up_4", "example_chats.books_after_left_hand_of_darkness.follow_up_5", "example_chats.books_after_left_hand_of_darkness.follow_up_6"],
59934
+ messages: [
59935
+ {
59936
+ "id": "140c0902-e073-4110-b411-1342ead46f8d",
59937
+ "role": "user",
59938
+ "content": "example_chats.books_after_left_hand_of_darkness.message_1",
59939
+ "created_at": 1791554713
59940
+ },
59941
+ {
59942
+ "id": "b263ae73-e35a-4ca0-b3d5-2b8766014d91",
59943
+ "role": "assistant",
59944
+ "content": "example_chats.books_after_left_hand_of_darkness.message_2",
59945
+ "created_at": 1791554761,
59946
+ "user_message_id": "140c0902-e073-4110-b411-1342ead46f8d",
59947
+ "category": "general_knowledge",
59948
+ "model_name": "Gemini 3.8 Flash"
59949
+ }
59950
+ ],
59951
+ embeds: [
59952
+ {
59953
+ "embed_id": "87e82e4a-3fba-475d-a77a-585630b39bec",
59954
+ "type": "focus-mode-activation",
59955
+ "content": "focus_id: books-book_discussion\napp_id: books\nskill_id: book_discussion\nfocus_mode_name: Book discussion\nstatus: finished",
59956
+ "parent_embed_id": null,
59957
+ "embed_ids": null
59958
+ }
59959
+ ],
59960
+ metadata: {
59961
+ featured: true,
59962
+ order: 133,
59963
+ app_focus_mode_examples: ["books.book_discussion"],
59964
+ active_focus_id: "books-book_discussion"
59965
+ }
59966
+ };
59967
+
59968
+ // ../ui/src/demo_chats/data/example_chats/community-garden-calendar-invitation.ts
59969
+ var communityGardenCalendarInvitationChat = {
59970
+ chat_id: "example-community-garden-calendar-invitation",
59971
+ slug: "community-garden-calendar-invitation",
59972
+ title: "example_chats.community_garden_calendar_invitation.title",
59973
+ summary: "example_chats.community_garden_calendar_invitation.summary",
59974
+ icon: "calendar-days",
59975
+ category: "general_knowledge",
59976
+ keywords: ["calendar invitation", "iCalendar", "ICS event", "volunteer schedule", "community garden"],
59977
+ follow_up_suggestions: ["example_chats.community_garden_calendar_invitation.follow_up_1", "example_chats.community_garden_calendar_invitation.follow_up_2", "example_chats.community_garden_calendar_invitation.follow_up_3", "example_chats.community_garden_calendar_invitation.follow_up_4", "example_chats.community_garden_calendar_invitation.follow_up_5", "example_chats.community_garden_calendar_invitation.follow_up_6"],
59978
+ messages: [
59979
+ {
59980
+ "id": "f7f43467-588c-4213-86c6-3ede8723b296",
59981
+ "role": "user",
59982
+ "content": "example_chats.community_garden_calendar_invitation.message_1",
59983
+ "created_at": 1791557955
59984
+ },
59985
+ {
59986
+ "id": "af02afb0-5b7b-5e38-aa68-2c0311b71e6b",
59987
+ "role": "assistant",
59988
+ "content": "example_chats.community_garden_calendar_invitation.message_2",
59989
+ "created_at": 1791557956,
59990
+ "user_message_id": "f7f43467-588c-4213-86c6-3ede8723b296",
59991
+ "category": "science",
59992
+ "model_name": "Gemini 3.8 Flash"
59993
+ }
59994
+ ],
59995
+ embeds: [
59996
+ {
59997
+ "embed_id": "6deff7cb-4e99-4dd3-9052-3985e09a9cc9",
59998
+ "type": "code",
59999
+ "content": 'type: code\napp_id: code\nskill_id: code\nlanguage: text\ncode: "BEGIN:VCALENDAR\\nVERSION:2.0\\nPRODID:-//OpenMates//Community Garden Planting Event//EN\\nCALSCALE:GREGORIAN\\nMETHOD:PUBLISH\\nBEGIN:VTIMEZONE\\nTZID:Europe/Berlin\\nLAST-MODIFIED:20261009T150000Z\\nTZURL:http://tzurl.org/zoneinfo-outlook/Europe/Berlin\\nBEGIN:DAYLIGHT\\nTZNAME:CEST\\nTZOFFSETFROM:+0100\\nTZOFFSETTO:+0200\\nDTSTART:19700329T020000\\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\\nEND:DAYLIGHT\\nBEGIN:STANDARD\\nTZNAME:CET\\nTZOFFSETFROM:+0200\\nTZOFFSETTO:+0100\\nDTSTART:19701025T030000\\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\\nEND:STANDARD\\nEND:VTIMEZONE\\nBEGIN:VEVENT\\nUID:garden-planting-20261017T100000@openmates.local\\nDTSTAMP:20261009T150000Z\\nDTSTART;TZID=Europe/Berlin:20261017T100000\\nDTEND;TZID=Europe/Berlin:20261017T120000\\nSUMMARY:Community Garden Volunteer Planting Session\\nLOCATION:Gartenweg 12\\\\, Berlin\\nDESCRIPTION:Welcome to our autumn planting session! Please bring gardening gloves and wear weather-appropriate clothing.\\\\n\\\\nAgenda:\\\\n- 10:00 - 10:15: Welcome\\\\, brief tour & tool distribution\\\\n- 10:15 - 11:30: Soil bed prep & perennial planting\\\\n- 11:30 - 11:50: Watering\\\\, mulch layer & cleanup\\\\n- 11:50 - 12:00: Wrap-up & shared tea\\nSTATUS:CONFIRMED\\nBEGIN:VALARM\\nACTION:DISPLAY\\nDESCRIPTION:Reminder: Community Garden Volunteer Planting Session starts in 24 hours!\\nTRIGGER:-P1D\\nEND:VALARM\\nEND:VEVENT\\nEND:VCALENDAR"\nfilename: community_garden_planting.ics\nembed_ref: community_garden_planting.ics-6deff7\nstatus: finished\nline_count: 40',
60000
+ "parent_embed_id": null,
60001
+ "embed_ids": null
60002
+ }
60003
+ ],
60004
+ metadata: {
60005
+ featured: true,
60006
+ order: 134
60007
+ }
60008
+ };
60009
+
60010
+ // ../ui/src/demo_chats/data/example_chats/mastodon-public-post-themes.ts
60011
+ var mastodonPublicPostThemesChat = {
60012
+ chat_id: "example-mastodon-public-post-themes",
60013
+ slug: "mastodon-public-post-themes",
60014
+ title: "example_chats.mastodon_public_post_themes.title",
60015
+ summary: "example_chats.mastodon_public_post_themes.summary",
60016
+ icon: "messages-square",
60017
+ category: "general_knowledge",
60018
+ keywords: ["Mastodon", "social media", "fediverse", "public posts"],
60019
+ follow_up_suggestions: ["example_chats.mastodon_public_post_themes.follow_up_1", "example_chats.mastodon_public_post_themes.follow_up_2", "example_chats.mastodon_public_post_themes.follow_up_3", "example_chats.mastodon_public_post_themes.follow_up_4", "example_chats.mastodon_public_post_themes.follow_up_5", "example_chats.mastodon_public_post_themes.follow_up_6"],
60020
+ messages: [
60021
+ {
60022
+ "id": "cb44c7e3-ae4c-478f-96ae-0f3958d03c51",
60023
+ "role": "user",
60024
+ "content": "example_chats.mastodon_public_post_themes.message_1",
60025
+ "created_at": 1791554800
60026
+ },
60027
+ {
60028
+ "id": "49358c4b-fa5d-5a8b-b729-fd526545d337",
60029
+ "role": "assistant",
60030
+ "content": "example_chats.mastodon_public_post_themes.message_2",
60031
+ "created_at": 1791554845,
60032
+ "user_message_id": "cb44c7e3-ae4c-478f-96ae-0f3958d03c51",
60033
+ "category": "general_knowledge",
60034
+ "model_name": "Gemini 3.8 Flash"
60035
+ },
60036
+ {
60037
+ "id": "7a419687-a63b-4ad4-91a6-eeb19a69386c",
60038
+ "role": "user",
60039
+ "content": "example_chats.mastodon_public_post_themes.message_3",
60040
+ "created_at": 1791557996
60041
+ },
60042
+ {
60043
+ "id": "eebcfebc-3c94-5a88-b531-c0da57205a5d",
60044
+ "role": "assistant",
60045
+ "content": "example_chats.mastodon_public_post_themes.message_4",
60046
+ "created_at": 1791557997,
60047
+ "user_message_id": "7a419687-a63b-4ad4-91a6-eeb19a69386c",
60048
+ "category": "general_knowledge",
60049
+ "model_name": "Gemini 3.8 Flash"
60050
+ }
60051
+ ],
60052
+ embeds: [
60053
+ {
60054
+ "embed_id": "12893426-0cd4-5bb4-a622-0593f81f98c3",
60055
+ "type": "social_post",
60056
+ "content": `id: "117015376093145300"
60057
+ platform: mastodon
60058
+ page: Mastodon@mastodon.social
60059
+ title: "@Mastodon: @sushubh Apologies! They should be working now, let us know if you still can't a"
60060
+ body: "@sushubh Apologies! They should be working now, let us know if you still can't access them"
60061
+ author: Mastodon
60062
+ author_display_name: Mastodon
60063
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60064
+ url: "https://mastodon.social/@Mastodon/117015376093145300"
60065
+ published_at: "2026-07-31T15:49:00.878Z"
60066
+ reply_count: 0
60067
+ repost_count: 1
60068
+ like_count: 2
60069
+ media_url: null
60070
+ thumbnail_url: null
60071
+ external_url: null
60072
+ external_title: null
60073
+ comments: []
60074
+ fetched_comment_count: 0
60075
+ provider: Mastodon
60076
+ embed_ref: mastodon-sushubh-apologies-3uP
60077
+ app_id: social_media
60078
+ skill_id: get-posts`,
60079
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60080
+ "embed_ids": null
60081
+ },
60082
+ {
60083
+ "embed_id": "195bf9c6-15c0-52c9-8bf7-6b1bef1fa481",
60084
+ "type": "social_post",
60085
+ "content": `id: "117004738413167978"
60086
+ platform: mastodon
60087
+ page: Mastodon@mastodon.social
60088
+ title: "@Mastodon: RE: https://mastodon.iftas.org/@iftas/116999079831534200 Have you taken the @ift"
60089
+ body: "RE: https://mastodon.iftas.org/@iftas/116999079831534200\\nHave you taken the @iftas Social Web Operations Survey yet? \u{1F9D0} There's only one day left!\\n#Fediverse #socialWeb #MastoAdmin"
60090
+ author: Mastodon
60091
+ author_display_name: Mastodon
60092
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60093
+ url: "https://mastodon.social/@Mastodon/117004738413167978"
60094
+ published_at: "2026-07-29T18:43:42.766Z"
60095
+ reply_count: 1
60096
+ repost_count: 65
60097
+ like_count: 69
60098
+ media_url: null
60099
+ thumbnail_url: null
60100
+ external_url: null
60101
+ external_title: null
60102
+ comments: []
60103
+ fetched_comment_count: 0
60104
+ provider: Mastodon
60105
+ embed_ref: mastodon-re-https-QvQ
60106
+ app_id: social_media
60107
+ skill_id: get-posts`,
60108
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60109
+ "embed_ids": null
60110
+ },
60111
+ {
60112
+ "embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60113
+ "type": "app_skill_use",
60114
+ "content": `app_id: social_media
60115
+ skill_id: get-posts
60116
+ result_count: 10
60117
+ embed_ids: 5254ba5b-a1a0-5533-988c-86e3fd93abcb|272de707-83b6-59ec-8599-6086c8ca9177|3eb9cfe0-5841-5a77-a83d-9a8c6061f988|afe55c27-f2e1-5a67-a34c-aad66cb83a98|0ce6c50a-7987-50b4-a7e5-8c9eab1de682|6324d9bd-968b-57d8-bc97-623379ccf484|de3dce6a-4f62-5a40-bd2a-d9668f13e917|68a61288-fba2-5213-b7ec-30ad764767f2|12893426-0cd4-5bb4-a622-0593f81f98c3|195bf9c6-15c0-52c9-8bf7-6b1bef1fa481
60118
+ status: finished
60119
+ platform: mastodon
60120
+ limit: 10
60121
+ comments_limit: 3
60122
+ include_comments: false
60123
+ page: Mastodon@mastodon.social
60124
+ query: "mastodon: Mastodon@mastodon.social"
60125
+ provider: Mastodon
60126
+ request_count: 2
60127
+ elapsed_seconds: 0.44
60128
+ preview_results[6]{title,url,provider}:
60129
+ "@Mastodon: New #Plushtodon colours now available for pre-orders on our shop! This is a way","https://mastodon.social/@Mastodon/117411420916699261",Mastodon
60130
+ "@Mastodon: Hannah Aubry is leaving Mastodon after her time with us as community director an","https://mastodon.social/@Mastodon/117156549508722805",Mastodon
60131
+ "@Mastodon: After publishing the results of Discovery Week, we can now give you a first snea","https://mastodon.social/@Mastodon/117117221397911074",Mastodon
60132
+ "@Mastodon: Here is a #FeaturedServer for \u{1F30E} Earth, \u{1F98E} Earthlings, and their \u2696 Advocates... h","https://mastodon.social/@Mastodon/117093587981367953",Mastodon
60133
+ "@Mastodon: Our Community Director @haubles provided a \\"plain English\\" version too: https://","https://mastodon.social/@Mastodon/117083694767249113",Mastodon
60134
+ "@Mastodon: Today we're sharing additional guidelines about our Trade Mark Policy based on c","https://mastodon.social/@Mastodon/117083691112770390",Mastodon`,
60135
+ "parent_embed_id": null,
60136
+ "embed_ids": [
60137
+ "5254ba5b-a1a0-5533-988c-86e3fd93abcb",
60138
+ "272de707-83b6-59ec-8599-6086c8ca9177",
60139
+ "3eb9cfe0-5841-5a77-a83d-9a8c6061f988",
60140
+ "afe55c27-f2e1-5a67-a34c-aad66cb83a98",
60141
+ "0ce6c50a-7987-50b4-a7e5-8c9eab1de682",
60142
+ "6324d9bd-968b-57d8-bc97-623379ccf484",
60143
+ "de3dce6a-4f62-5a40-bd2a-d9668f13e917",
60144
+ "68a61288-fba2-5213-b7ec-30ad764767f2",
60145
+ "12893426-0cd4-5bb4-a622-0593f81f98c3",
60146
+ "195bf9c6-15c0-52c9-8bf7-6b1bef1fa481"
60147
+ ]
60148
+ },
60149
+ {
60150
+ "embed_id": "0ce6c50a-7987-50b4-a7e5-8c9eab1de682",
60151
+ "type": "social_post",
60152
+ "content": 'id: "117083694767249113"\nplatform: mastodon\npage: Mastodon@mastodon.social\ntitle: "@Mastodon: Our Community Director @haubles provided a \\"plain English\\" version too: https://"\nbody: "Our Community Director @haubles provided a \\"plain English\\" version too:\\nhttps://hachyderm.io/@haubles/117083650941891878"\nauthor: Mastodon\nauthor_display_name: Mastodon\nauthor_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"\nurl: "https://mastodon.social/@Mastodon/117083694767249113"\npublished_at: "2026-08-12T17:23:21.125Z"\nreply_count: 0\nrepost_count: 27\nlike_count: 70\nmedia_url: null\nthumbnail_url: null\nexternal_url: null\nexternal_title: null\ncomments: []\nfetched_comment_count: 0\nprovider: Mastodon\nembed_ref: mastodon-our-community-iJA\napp_id: social_media\nskill_id: get-posts',
60153
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60154
+ "embed_ids": null
60155
+ },
60156
+ {
60157
+ "embed_id": "de3dce6a-4f62-5a40-bd2a-d9668f13e917",
60158
+ "type": "social_post",
60159
+ "content": `id: "117043346514398510"
60160
+ platform: mastodon
60161
+ page: Mastodon@mastodon.social
60162
+ title: "@Mastodon: We're excited to share the results from Mastodon's first #DiscoveryWeek! In case"
60163
+ body: "We're excited to share the results from Mastodon's first #DiscoveryWeek!\\nIn case you missed it, earlier this year our Head of Design @imanijoy arranged a week of workshops and surveys to get to know you, learn about your needs and wants, and discover how you're using (and want to use) Mastodon.\\nThis week was tremendously helpful for us, and we're grateful to everyone who participated.\\nHere's what we learned:\\nhttps://blog.joinmastodon.org/2026/08/discovery-week-2026-what-we-learned-and-what-were-doing-next/\\n#Mastodon #Fediverse #SocialWeb #OpenSocial"
60164
+ author: Mastodon
60165
+ author_display_name: Mastodon
60166
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60167
+ url: "https://mastodon.social/@Mastodon/117043346514398510"
60168
+ published_at: "2026-08-05T14:22:15.639Z"
60169
+ reply_count: 12
60170
+ repost_count: 159
60171
+ like_count: 226
60172
+ media_url: null
60173
+ thumbnail_url: null
60174
+ external_url: "https://blog.joinmastodon.org/2026/08/discovery-week-2026-what-we-learned-and-what-were-doing-next/"
60175
+ external_title: "Discovery Week 2026: What we learned, and what we\u2019re doing next"
60176
+ comments: []
60177
+ fetched_comment_count: 0
60178
+ provider: Mastodon
60179
+ embed_ref: mastodon-we-re-Abz
60180
+ app_id: social_media
60181
+ skill_id: get-posts`,
60182
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60183
+ "embed_ids": null
60184
+ },
60185
+ {
60186
+ "embed_id": "68a61288-fba2-5213-b7ec-30ad764767f2",
60187
+ "type": "social_post",
60188
+ "content": `id: "117015608750780726"
60189
+ platform: mastodon
60190
+ page: Mastodon@mastodon.social
60191
+ title: "@Mastodon: @TheRealPomax Great suggestion, thank you! We're putting that line in bold text"
60192
+ body: "@TheRealPomax Great suggestion, thank you! We're putting that line in bold text now, and if you haven't already, you should receive an email with more details and a link to the new terms soon."
60193
+ author: Mastodon
60194
+ author_display_name: Mastodon
60195
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60196
+ url: "https://mastodon.social/@Mastodon/117015608750780726"
60197
+ published_at: "2026-07-31T16:48:10.955Z"
60198
+ reply_count: 1
60199
+ repost_count: 1
60200
+ like_count: 2
60201
+ media_url: null
60202
+ thumbnail_url: null
60203
+ external_url: null
60204
+ external_title: null
60205
+ comments: []
60206
+ fetched_comment_count: 0
60207
+ provider: Mastodon
60208
+ embed_ref: mastodon-therealpomax-great-GY6
60209
+ app_id: social_media
60210
+ skill_id: get-posts`,
60211
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60212
+ "embed_ids": null
60213
+ },
60214
+ {
60215
+ "embed_id": "6324d9bd-968b-57d8-bc97-623379ccf484",
60216
+ "type": "social_post",
60217
+ "content": `id: "117083691112770390"
60218
+ platform: mastodon
60219
+ page: Mastodon@mastodon.social
60220
+ title: "@Mastodon: Today we're sharing additional guidelines about our Trade Mark Policy based on c"
60221
+ body: "Today we're sharing additional guidelines about our Trade Mark Policy based on community feedback that we received.\\nThe new guidelines, and more background about these changes, are available on our blog:\\nhttps://blog.joinmastodon.org/2026/08/sharing-guidelines-about-mastodons-trade-mark-policy/\\n#Mastodon #Fediverse #SocialWeb #FediDev #MastoDev #FediAdmin #MastoAdmin"
60222
+ author: Mastodon
60223
+ author_display_name: Mastodon
60224
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60225
+ url: "https://mastodon.social/@Mastodon/117083691112770390"
60226
+ published_at: "2026-08-12T17:22:25.361Z"
60227
+ reply_count: 21
60228
+ repost_count: 85
60229
+ like_count: 110
60230
+ media_url: null
60231
+ thumbnail_url: null
60232
+ external_url: "https://blog.joinmastodon.org/2026/08/sharing-guidelines-about-mastodons-trade-mark-policy/"
60233
+ external_title: Sharing Guidelines about Mastodon\u2019s Trade Mark Policy
60234
+ comments: []
60235
+ fetched_comment_count: 0
60236
+ provider: Mastodon
60237
+ embed_ref: mastodon-today-we-YqD
60238
+ app_id: social_media
60239
+ skill_id: get-posts`,
60240
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60241
+ "embed_ids": null
60242
+ },
60243
+ {
60244
+ "embed_id": "272de707-83b6-59ec-8599-6086c8ca9177",
60245
+ "type": "social_post",
60246
+ "content": 'id: "117156549508722805"\nplatform: mastodon\npage: Mastodon@mastodon.social\ntitle: "@Mastodon: Hannah Aubry is leaving Mastodon after her time with us as community director an"\nbody: "Hannah Aubry is leaving Mastodon after her time with us as community director and board member. We\u2019re very grateful for her contributions, ideas, and commitment to Mastodon and the fediverse. Thank you, Hannah! We wish you all the very best for what comes next."\nauthor: Mastodon\nauthor_display_name: Mastodon\nauthor_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"\nurl: "https://mastodon.social/@Mastodon/117156549508722805"\npublished_at: "2026-08-25T14:11:16.256Z"\nreply_count: 18\nrepost_count: 106\nlike_count: 466\nmedia_url: null\nthumbnail_url: null\nexternal_url: null\nexternal_title: null\ncomments: []\nfetched_comment_count: 0\nprovider: Mastodon\nembed_ref: mastodon-hannah-aubry-G33\napp_id: social_media\nskill_id: get-posts',
60247
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60248
+ "embed_ids": null
60249
+ },
60250
+ {
60251
+ "embed_id": "afe55c27-f2e1-5a67-a34c-aad66cb83a98",
60252
+ "type": "social_post",
60253
+ "content": 'id: "117093587981367953"\nplatform: mastodon\npage: Mastodon@mastodon.social\ntitle: "@Mastodon: Here is a #FeaturedServer for \u{1F30E} Earth, \u{1F98E} Earthlings, and their \u2696 Advocates... h"\nbody: "Here is a #FeaturedServer for \u{1F30E} Earth, \u{1F98E} Earthlings, and their \u2696 Advocates...\\nhttps://earth.law/about\\nEarth.Law is for:\\n\u{1F4DC} Environmental lawyers & policy-makers\\n\u{1F98B} Conservationists & ecologists\\n\u{1F52C} Scientists in related fields\\n\u{1F4DA} Educators and students of environmental studies\\n\u{1F3A4} Activists & advocates\\n\u267B Hosted on a dedicated server in \u{1F1EB}\u{1F1EE} Helsinki and recognised by the Green Web Foundation for using renewable energy.\\n#CommunitySpotlight #Fediverse #Mastodon #SocialWeb"\nauthor: Mastodon\nauthor_display_name: Mastodon\nauthor_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"\nurl: "https://mastodon.social/@Mastodon/117093587981367953"\npublished_at: "2026-08-14T11:19:19.586Z"\nreply_count: 3\nrepost_count: 84\nlike_count: 151\nmedia_url: null\nthumbnail_url: null\nexternal_url: "https://earth.law/about"\nexternal_title: Earth.Law\ncomments: []\nfetched_comment_count: 0\nprovider: Mastodon\nembed_ref: mastodon-here-is-dZE\napp_id: social_media\nskill_id: get-posts',
60254
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60255
+ "embed_ids": null
60256
+ },
60257
+ {
60258
+ "embed_id": "3eb9cfe0-5841-5a77-a83d-9a8c6061f988",
60259
+ "type": "social_post",
60260
+ "content": 'id: "117117221397911074"\nplatform: mastodon\npage: Mastodon@mastodon.social\ntitle: "@Mastodon: After publishing the results of Discovery Week, we can now give you a first snea"\nbody: "After publishing the results of Discovery Week, we can now give you a first sneak peak at Mastodon 5.0, our next big version. It will bring a new visual look to your screens, a refreshed and calmer layout, as well as a new composer.\\nhttps://blog.joinmastodon.org/2026/08/5.0-laying-the-foundation/\\n#mastodon #mastodon5.0"\nauthor: Mastodon\nauthor_display_name: Mastodon\nauthor_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"\nurl: "https://mastodon.social/@Mastodon/117117221397911074"\npublished_at: "2026-08-18T15:29:36.902Z"\nreply_count: 134\nrepost_count: 574\nlike_count: 961\nmedia_url: null\nthumbnail_url: null\nexternal_url: "https://blog.joinmastodon.org/2026/08/5.0-laying-the-foundation/"\nexternal_title: "5.0: Laying the foundation"\ncomments: []\nfetched_comment_count: 0\nprovider: Mastodon\nembed_ref: mastodon-after-publishing-D8d\napp_id: social_media\nskill_id: get-posts',
60261
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60262
+ "embed_ids": null
60263
+ },
60264
+ {
60265
+ "embed_id": "5254ba5b-a1a0-5533-988c-86e3fd93abcb",
60266
+ "type": "social_post",
60267
+ "content": 'id: "117411420916699261"\nplatform: mastodon\npage: Mastodon@mastodon.social\ntitle: "@Mastodon: New #Plushtodon colours now available for pre-orders on our shop! This is a way"\nbody: "New #Plushtodon colours now available for pre-orders on our shop! This is a way to support our work and get a squishy friend at the same time.\\nhttps://blog.joinmastodon.org/2026/10/plushtodon-pre-orders-now-open/\\n#Merchtodon"\nauthor: Mastodon\nauthor_display_name: Mastodon\nauthor_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"\nurl: "https://mastodon.social/@Mastodon/117411420916699261"\npublished_at: "2026-10-09T14:28:25.298Z"\nreply_count: 2\nrepost_count: 31\nlike_count: 24\nmedia_url: null\nthumbnail_url: null\nexternal_url: "https://blog.joinmastodon.org/2026/10/plushtodon-pre-orders-now-open/"\nexternal_title: Plushtodon pre-orders now open\ncomments: []\nfetched_comment_count: 0\nprovider: Mastodon\nembed_ref: mastodon-new-plushtodon-A57\napp_id: social_media\nskill_id: get-posts',
60268
+ "parent_embed_id": "65b92905-0838-46dd-8fff-8e28cdc8789a",
60269
+ "embed_ids": null
60270
+ },
60271
+ {
60272
+ "embed_id": "00a149ea-1c69-5adb-877b-e0d2bd483e94",
60273
+ "type": "social_post",
60274
+ "content": `id: "116967892835165166"
60275
+ platform: mastodon
60276
+ page: Mastodon@mastodon.social
60277
+ title: "@Mastodon: It's time for our first Server Spotlight! We want to help people find their comm"
60278
+ body: "It's time for our first Server Spotlight!\\nWe want to help people find their communities across the #fediverse so we're featuring servers here on this account.\\nFirst up: The Mended Drum, a home for fans of all things Sir Terry Pratchett.\\nIt is said that if you stay on The Mended Drum long enough, you'll meet every hero on the server: https://mendeddrum.org/directory\\n(keep an eye on your horse, though \u{1F609})\\n#FeaturedServer #CommunitySpotlight #Mastodon #SocialWeb #GNUTerryPratchett"
60279
+ author: Mastodon
60280
+ author_display_name: Mastodon
60281
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60282
+ url: "https://mastodon.social/@Mastodon/116967892835165166"
60283
+ published_at: "2026-07-23T06:33:23.881Z"
60284
+ reply_count: 6
60285
+ repost_count: 135
60286
+ like_count: 224
60287
+ media_url: null
60288
+ thumbnail_url: null
60289
+ external_url: "https://mendeddrum.org/directory"
60290
+ external_title: The Mended Drum
60291
+ comments[5]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60292
+ "116968031737433394",wjmaggos@liberal.city,william \u2042 maggos,"@Mastodon\\nI don't get thinking of servers as a community, except to the degree something like the fans of a podcast start a server to talk to each other AND figure out the fedi. but communities are insular and that's the opposite of interoperability. and everybody will soon have friends off server that they feel like are part of their community.\\na server shares mod policy. in order to avoid centralization, when no other sensible division makes sense, let's separate servers by locality.","https://liberal.city/@wjmaggos/116968031703510314","2026-07-23T07:08:42.000Z",4,3,1
60293
+ "116968511717198649",feyter@mastodon.gamedev.place,Feyter,"@wjmaggos @Mastodon in fact moderation by topic makes sense, because local law of the district the server is located is one thing... But there are also social norms and behavior in a community that only members of that community can really understand. It's more about culture than about locality.\\nHowever, the fediverse has become so interconnected, that this gets very blurry.","https://mastodon.gamedev.place/@feyter/116968511685664959","2026-07-23T09:10:46.000Z",1,0,0
60294
+ "116969217752337043",Tho99@mendeddrum.org,"Thomas =:-)","@wjmaggos\\nQuite a few old timers from alt.fan.pratchett and various cons & meets make the drum their home.\\nSimplifies quite a few things.","https://mendeddrum.org/@Tho99/116969217656856589","2026-07-23T12:10:19.000Z",6,1,0
60295
+ "116969610251697436",wjmaggos@liberal.city,william \u2042 maggos,"@Tho99\\nthat's very cool but they could instead form a more closed group using lots of other tools, like #matrix. still uses FOSS decentralized tech.\\nusing fedi for this brings up two problems imo.\\nfew people are part of one community. so you'd have to choose or have multiple personal accounts, something we're kinda trying to avoid.\\na norm of loose moderation on fedi is good for attention/growth (what many news fans want here), but bad for tight communities. getting that wrong hurts both.","https://liberal.city/@wjmaggos/116969610165938479","2026-07-23T13:50:08.000Z",0,1,1
60296
+ "116969833093814576",Tho99@mendeddrum.org,"Thomas =:-)","@wjmaggos we could have, but didn\u2019t","https://mendeddrum.org/@Tho99/116969833003554880","2026-07-23T14:46:48.000Z",3,0,0
60297
+ fetched_comment_count: 5
60298
+ provider: Mastodon
60299
+ embed_ref: mastodon-it-s-ePc
60300
+ app_id: social_media
60301
+ skill_id: get-posts`,
60302
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60303
+ "embed_ids": null
60304
+ },
60305
+ {
60306
+ "embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60307
+ "type": "app_skill_use",
60308
+ "content": `app_id: social_media
60309
+ skill_id: get-posts
60310
+ result_count: 10
60311
+ embed_ids: 1bbc2a8a-6e5d-5628-84f4-43eb854ca3b6|bcd88a73-104b-567d-83ea-8cdea09211d1|db2bb282-6b2c-5716-ac34-341281bfb124|83bdd520-3f8a-534c-85b4-6ed4fa124652|d1e1bf63-ca7e-5d1c-b616-0fa4c6f65d29|f254e840-ba8a-5fe5-8745-61fcf64be857|2fdc6a2e-0150-5a9b-86ab-82fec6c803e1|15f5cdc0-339c-5180-8a54-78c322b51e97|fd043ca3-f171-5271-9d1f-37b90467f626|00a149ea-1c69-5adb-877b-e0d2bd483e94
60312
+ status: finished
60313
+ page: Mastodon@mastodon.social
60314
+ limit: 10
60315
+ platform: mastodon
60316
+ query: "mastodon: Mastodon@mastodon.social"
60317
+ provider: Mastodon
60318
+ request_count: 12
60319
+ elapsed_seconds: 8.75
60320
+ preview_results[6]{title,url,provider}:
60321
+ "@Mastodon: Hannah Aubry is leaving Mastodon after her time with us as community director an","https://mastodon.social/@Mastodon/117156549508722805",Mastodon
60322
+ "@Mastodon: After publishing the results of Discovery Week, we can now give you a first snea","https://mastodon.social/@Mastodon/117117221397911074",Mastodon
60323
+ "@Mastodon: Here is a #FeaturedServer for \u{1F30E} Earth, \u{1F98E} Earthlings, and their \u2696 Advocates... h","https://mastodon.social/@Mastodon/117093587981367953",Mastodon
60324
+ "@Mastodon: Our Community Director @haubles provided a \\"plain English\\" version too: https://","https://mastodon.social/@Mastodon/117083694767249113",Mastodon
60325
+ "@Mastodon: Today we're sharing additional guidelines about our Trade Mark Policy based on c","https://mastodon.social/@Mastodon/117083691112770390",Mastodon
60326
+ "@Mastodon: We're excited to share the results from Mastodon's first #DiscoveryWeek! In case","https://mastodon.social/@Mastodon/117043346514398510",Mastodon`,
60327
+ "parent_embed_id": null,
60328
+ "embed_ids": [
60329
+ "1bbc2a8a-6e5d-5628-84f4-43eb854ca3b6",
60330
+ "bcd88a73-104b-567d-83ea-8cdea09211d1",
60331
+ "db2bb282-6b2c-5716-ac34-341281bfb124",
60332
+ "83bdd520-3f8a-534c-85b4-6ed4fa124652",
60333
+ "d1e1bf63-ca7e-5d1c-b616-0fa4c6f65d29",
60334
+ "f254e840-ba8a-5fe5-8745-61fcf64be857",
60335
+ "2fdc6a2e-0150-5a9b-86ab-82fec6c803e1",
60336
+ "15f5cdc0-339c-5180-8a54-78c322b51e97",
60337
+ "fd043ca3-f171-5271-9d1f-37b90467f626",
60338
+ "00a149ea-1c69-5adb-877b-e0d2bd483e94"
60339
+ ]
60340
+ },
60341
+ {
60342
+ "embed_id": "15f5cdc0-339c-5180-8a54-78c322b51e97",
60343
+ "type": "social_post",
60344
+ "content": `id: "117015376093145300"
60345
+ platform: mastodon
60346
+ page: Mastodon@mastodon.social
60347
+ title: "@Mastodon: @sushubh Apologies! They should be working now, let us know if you still can't a"
60348
+ body: "@sushubh Apologies! They should be working now, let us know if you still can't access them"
60349
+ author: Mastodon
60350
+ author_display_name: Mastodon
60351
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60352
+ url: "https://mastodon.social/@Mastodon/117015376093145300"
60353
+ published_at: "2026-07-31T15:49:00.878Z"
60354
+ reply_count: 0
60355
+ repost_count: 1
60356
+ like_count: 2
60357
+ media_url: null
60358
+ thumbnail_url: null
60359
+ external_url: null
60360
+ external_title: null
60361
+ comments: []
60362
+ fetched_comment_count: 0
60363
+ provider: Mastodon
60364
+ embed_ref: mastodon-sushubh-apologies-YkQ
60365
+ app_id: social_media
60366
+ skill_id: get-posts`,
60367
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60368
+ "embed_ids": null
60369
+ },
60370
+ {
60371
+ "embed_id": "fd043ca3-f171-5271-9d1f-37b90467f626",
60372
+ "type": "social_post",
60373
+ "content": `id: "117004738413167978"
60374
+ platform: mastodon
60375
+ page: Mastodon@mastodon.social
60376
+ title: "@Mastodon: RE: https://mastodon.iftas.org/@iftas/116999079831534200 Have you taken the @ift"
60377
+ body: "RE: https://mastodon.iftas.org/@iftas/116999079831534200\\nHave you taken the @iftas Social Web Operations Survey yet? \u{1F9D0} There's only one day left!\\n#Fediverse #socialWeb #MastoAdmin"
60378
+ author: Mastodon
60379
+ author_display_name: Mastodon
60380
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60381
+ url: "https://mastodon.social/@Mastodon/117004738413167978"
60382
+ published_at: "2026-07-29T18:43:42.766Z"
60383
+ reply_count: 1
60384
+ repost_count: 65
60385
+ like_count: 69
60386
+ media_url: null
60387
+ thumbnail_url: null
60388
+ external_url: null
60389
+ external_title: null
60390
+ comments[1]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60391
+ "117005144655640473",Guillotine_Jones@beige.party,"Guillotine Jones, Fl\xE2neur","@Mastodon @iftas\\nBoosted 4 reach.\\nBong hits 4 Jesus.","https://beige.party/@Guillotine_Jones/117005144316815269","2026-07-29T20:26:56.000Z",1,0,0
60392
+ fetched_comment_count: 1
60393
+ provider: Mastodon
60394
+ embed_ref: mastodon-re-https-zdM
60395
+ app_id: social_media
60396
+ skill_id: get-posts`,
60397
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60398
+ "embed_ids": null
60399
+ },
60400
+ {
60401
+ "embed_id": "2fdc6a2e-0150-5a9b-86ab-82fec6c803e1",
60402
+ "type": "social_post",
60403
+ "content": `id: "117015608750780726"
60404
+ platform: mastodon
60405
+ page: Mastodon@mastodon.social
60406
+ title: "@Mastodon: @TheRealPomax Great suggestion, thank you! We're putting that line in bold text"
60407
+ body: "@TheRealPomax Great suggestion, thank you! We're putting that line in bold text now, and if you haven't already, you should receive an email with more details and a link to the new terms soon."
60408
+ author: Mastodon
60409
+ author_display_name: Mastodon
60410
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60411
+ url: "https://mastodon.social/@Mastodon/117015608750780726"
60412
+ published_at: "2026-07-31T16:48:10.955Z"
60413
+ reply_count: 1
60414
+ repost_count: 1
60415
+ like_count: 2
60416
+ media_url: null
60417
+ thumbnail_url: null
60418
+ external_url: null
60419
+ external_title: null
60420
+ comments[1]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60421
+ "117015642214260225",TheRealPomax,Pomax,"@Mastodon yep, just got the email, which is how I ended up on the blog post.","https://mastodon.social/@TheRealPomax/117015642214260225","2026-07-31T16:56:41.565Z",0,0,0
60422
+ fetched_comment_count: 1
60423
+ provider: Mastodon
60424
+ embed_ref: mastodon-therealpomax-great-sW0
60425
+ app_id: social_media
60426
+ skill_id: get-posts`,
60427
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60428
+ "embed_ids": null
60429
+ },
60430
+ {
60431
+ "embed_id": "f254e840-ba8a-5fe5-8745-61fcf64be857",
60432
+ "type": "social_post",
60433
+ "content": `id: "117043346514398510"
60434
+ platform: mastodon
60435
+ page: Mastodon@mastodon.social
60436
+ title: "@Mastodon: We're excited to share the results from Mastodon's first #DiscoveryWeek! In case"
60437
+ body: "We're excited to share the results from Mastodon's first #DiscoveryWeek!\\nIn case you missed it, earlier this year our Head of Design @imanijoy arranged a week of workshops and surveys to get to know you, learn about your needs and wants, and discover how you're using (and want to use) Mastodon.\\nThis week was tremendously helpful for us, and we're grateful to everyone who participated.\\nHere's what we learned:\\nhttps://blog.joinmastodon.org/2026/08/discovery-week-2026-what-we-learned-and-what-were-doing-next/\\n#Mastodon #Fediverse #SocialWeb #OpenSocial"
60438
+ author: Mastodon
60439
+ author_display_name: Mastodon
60440
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60441
+ url: "https://mastodon.social/@Mastodon/117043346514398510"
60442
+ published_at: "2026-08-05T14:22:15.639Z"
60443
+ reply_count: 12
60444
+ repost_count: 159
60445
+ like_count: 226
60446
+ media_url: null
60447
+ thumbnail_url: null
60448
+ external_url: "https://blog.joinmastodon.org/2026/08/discovery-week-2026-what-we-learned-and-what-were-doing-next/"
60449
+ external_title: "Discovery Week 2026: What we learned, and what we\u2019re doing next"
60450
+ comments[5]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60451
+ "117043482588002992",chris@nutmeg.social,Chris Hayes,"@Mastodon @imanijoy Great report. All good points. Very much agreed on boosting, threading, and hashtags.\\n\u201CSurvey respondents were asked about the\\ncircumstances in which they typically limit\\ntheir posts\u02BC visibility. The #1 reason\\nreported was to avoid spamming others\\nwhen replying.\u201D\\nis interesting to see because 'Quiet Public' doesn't do that. (I used to make that mistake.)\\nFunny to read that others also have a list specifically for quieter posters. Mine is titled \\"Never miss a post.\\"","https://nutmeg.social/@chris/117043480691144967","2026-08-05T14:56:23.000Z",3,1,0
60452
+ "117043975132435787",clare_hooley@mastodon.me.uk,Clare Hooley,"@chris it does to the extent it doesn\u2019t show on local or federated feeds if you\u2019re on a server with those (and I think also think in hashtags feeds if you have hashtags in it). Works out better for me for replies anyway; notify the person I\u2019m replying to but doesn\u2019t clutter local feed, but people can still see it if they want. Mind, I have turned replies off for my main feed and have done for a long time, so I tend to forget that\u2019s not the default!","https://mastodon.me.uk/@clare_hooley/117043974998912242","2026-08-05T17:02:05.000Z",1,0,0
60453
+ "117043651449867148",lachralle@vivaldi.net,Ralf Demuth,@Mastodon @imanijoy Probably late to the game but please make all official apps and the web sites use the marker api to sync read states ceoss-platform.,"https://social.vivaldi.net/@lachralle/117043650894046860","2026-08-05T15:39:40.000Z",1,0,0
60454
+ "117044569428922118",antimundo@mastodon.gamedev.place,Antimundo,"@Mastodon This post is honestly awesome, it's really cool to see something as simple as the team talking with the community. I really appreciate the work I've seen from you so far @imanijoy cheers!","https://mastodon.gamedev.place/@antimundo/117044569400913047","2026-08-05T19:33:15.000Z",5,1,0
60455
+ "117044596654579027",imanijoy,Imani,@antimundo thank you so much!,"https://mastodon.social/@imanijoy/117044596654579027","2026-08-05T19:40:11.263Z",1,0,0
60456
+ fetched_comment_count: 5
60457
+ provider: Mastodon
60458
+ embed_ref: mastodon-we-re-WKA
60459
+ app_id: social_media
60460
+ skill_id: get-posts`,
60461
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60462
+ "embed_ids": null
60463
+ },
60464
+ {
60465
+ "embed_id": "d1e1bf63-ca7e-5d1c-b616-0fa4c6f65d29",
60466
+ "type": "social_post",
60467
+ "content": `id: "117083691112770390"
60468
+ platform: mastodon
60469
+ page: Mastodon@mastodon.social
60470
+ title: "@Mastodon: Today we're sharing additional guidelines about our Trade Mark Policy based on c"
60471
+ body: "Today we're sharing additional guidelines about our Trade Mark Policy based on community feedback that we received.\\nThe new guidelines, and more background about these changes, are available on our blog:\\nhttps://blog.joinmastodon.org/2026/08/sharing-guidelines-about-mastodons-trade-mark-policy/\\n#Mastodon #Fediverse #SocialWeb #FediDev #MastoDev #FediAdmin #MastoAdmin"
60472
+ author: Mastodon
60473
+ author_display_name: Mastodon
60474
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60475
+ url: "https://mastodon.social/@Mastodon/117083691112770390"
60476
+ published_at: "2026-08-12T17:22:25.361Z"
60477
+ reply_count: 21
60478
+ repost_count: 85
60479
+ like_count: 110
60480
+ media_url: null
60481
+ thumbnail_url: null
60482
+ external_url: "https://blog.joinmastodon.org/2026/08/sharing-guidelines-about-mastodons-trade-mark-policy/"
60483
+ external_title: Sharing Guidelines about Mastodon\u2019s Trade Mark Policy
60484
+ comments[5]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60485
+ "117083694767249113",Mastodon,Mastodon,"Our Community Director @haubles provided a \\"plain English\\" version too:\\nhttps://hachyderm.io/@haubles/117083650941891878","https://mastodon.social/@Mastodon/117083694767249113","2026-08-12T17:23:21.125Z",70,0,27
60486
+ "117083727962609466",bazkie@beige.party,surely bazkie \u{1F469}\u{1F3FC}\u{1F4BB},"@Mastodon you don't have shit to say about that kind of thing, it's decentralized.\\nyou shouldn't exist as a company","https://beige.party/@bazkie/117083727834137295","2026-08-12T17:31:45.000Z",16,2,0
60487
+ "117093011192023613",xvilo@mastodon.org.uk,"Sem Schilder :t_blink:",@bazkie @Mastodon that\u2019s not how that works obviously,"https://mastodon.org.uk/@xvilo/117093011085365998","2026-08-14T08:52:36.000Z",0,2,0
60488
+ "117093395066517892",bazkie@beige.party,surely bazkie \u{1F469}\u{1F3FC}\u{1F4BB},@xvilo @Mastodon suck some more corporate dick,"https://beige.party/@bazkie/117093394880154664","2026-08-14T10:30:13.000Z",4,1,0
60489
+ "117093520999270461",xvilo,Sem Schilder,"@bazkie @xvilo@mastodon.org.uk @Mastodon Dus je comment deze opbouwende reactie, maar blocked mij direct? Gelukkig federeren we mooi op een gedecentraliseerd systeem. Als jij je niet blij bent met wat mastodon doet, dan kan je natuurlijk iets anders gebruik om alsnog aan de fediverse te hangen. Dit soort taal is absoluut niet opbouwend, en voegt ook niks toe aan de discussie.","https://mastodon.social/@xvilo/117093520999270461","2026-08-14T11:02:17.660Z",2,1,0
60490
+ fetched_comment_count: 5
60491
+ provider: Mastodon
60492
+ embed_ref: mastodon-today-we-jTv
60493
+ app_id: social_media
60494
+ skill_id: get-posts`,
60495
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60496
+ "embed_ids": null
60497
+ },
60498
+ {
60499
+ "embed_id": "83bdd520-3f8a-534c-85b4-6ed4fa124652",
60500
+ "type": "social_post",
60501
+ "content": 'id: "117083694767249113"\nplatform: mastodon\npage: Mastodon@mastodon.social\ntitle: "@Mastodon: Our Community Director @haubles provided a \\"plain English\\" version too: https://"\nbody: "Our Community Director @haubles provided a \\"plain English\\" version too:\\nhttps://hachyderm.io/@haubles/117083650941891878"\nauthor: Mastodon\nauthor_display_name: Mastodon\nauthor_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"\nurl: "https://mastodon.social/@Mastodon/117083694767249113"\npublished_at: "2026-08-12T17:23:21.125Z"\nreply_count: 0\nrepost_count: 27\nlike_count: 70\nmedia_url: null\nthumbnail_url: null\nexternal_url: null\nexternal_title: null\ncomments: []\nfetched_comment_count: 0\nprovider: Mastodon\nembed_ref: mastodon-our-community-Hxz\napp_id: social_media\nskill_id: get-posts',
60502
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60503
+ "embed_ids": []
60504
+ },
60505
+ {
60506
+ "embed_id": "bcd88a73-104b-567d-83ea-8cdea09211d1",
60507
+ "type": "social_post",
60508
+ "content": `id: "117117221397911074"
60509
+ platform: mastodon
60510
+ page: Mastodon@mastodon.social
60511
+ title: "@Mastodon: After publishing the results of Discovery Week, we can now give you a first snea"
60512
+ body: "After publishing the results of Discovery Week, we can now give you a first sneak peak at Mastodon 5.0, our next big version. It will bring a new visual look to your screens, a refreshed and calmer layout, as well as a new composer.\\nhttps://blog.joinmastodon.org/2026/08/5.0-laying-the-foundation/\\n#mastodon #mastodon5.0"
60513
+ author: Mastodon
60514
+ author_display_name: Mastodon
60515
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60516
+ url: "https://mastodon.social/@Mastodon/117117221397911074"
60517
+ published_at: "2026-08-18T15:29:36.902Z"
60518
+ reply_count: 134
60519
+ repost_count: 574
60520
+ like_count: 961
60521
+ media_url: null
60522
+ thumbnail_url: null
60523
+ external_url: "https://blog.joinmastodon.org/2026/08/5.0-laying-the-foundation/"
60524
+ external_title: "5.0: Laying the foundation"
60525
+ comments[5]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60526
+ "117117243837071506",grymas1000lecia@101010.pl,"Adi :apple_inc:",@Mastodon Looks dope!,"https://101010.pl/@grymas1000lecia/117117243787523984","2026-08-18T15:35:18.000Z",3,0,1
60527
+ "117117253204748361",fabian@mainz.social,"Fabian K\xF6ster :natenom:","@Mastodon Looks great, looking forward to this!","https://mainz.social/@fabian/117117253112606054","2026-08-18T15:37:40.000Z",3,0,0
60528
+ "117117258105671885",phi@kif.rocks,\u03C6,"@Mastodon please add the \\"plan post\\" option to the post composer. It annoys me that I have to use a third party application to do that even though it's supported by Mastodon itself.","https://toot.kif.rocks/@phi/117117257998868084","2026-08-18T15:38:55.000Z",44,2,4
60529
+ "117118575452712049",KayOhtie@blimps.xyz,Kay Ohtie,"@phi @Mastodon + :1000: to this. I'd love to have that built-in since it already exists server-side. I know I can run Elk separately but if we're making UI improvements to stock, adding that should be one of them.","https://blimps.xyz/@KayOhtie/117118575414402270","2026-08-18T21:13:57.000Z",2,0,0
60530
+ "117124173583942935",MonkeyPanic@nerdculture.de,"MonkeyPanic! :startrek:","@phi @Mastodon yes, this","https://nerdculture.de/@MonkeyPanic/117124173522244681","2026-08-19T20:57:37.000Z",0,0,0
60531
+ fetched_comment_count: 5
60532
+ provider: Mastodon
60533
+ embed_ref: mastodon-after-publishing-2LX
60534
+ app_id: social_media
60535
+ skill_id: get-posts`,
60536
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60537
+ "embed_ids": []
60538
+ },
60539
+ {
60540
+ "embed_id": "db2bb282-6b2c-5716-ac34-341281bfb124",
60541
+ "type": "social_post",
60542
+ "content": `id: "117093587981367953"
60543
+ platform: mastodon
60544
+ page: Mastodon@mastodon.social
60545
+ title: "@Mastodon: Here is a #FeaturedServer for \u{1F30E} Earth, \u{1F98E} Earthlings, and their \u2696 Advocates... h"
60546
+ body: "Here is a #FeaturedServer for \u{1F30E} Earth, \u{1F98E} Earthlings, and their \u2696 Advocates...\\nhttps://earth.law/about\\nEarth.Law is for:\\n\u{1F4DC} Environmental lawyers & policy-makers\\n\u{1F98B} Conservationists & ecologists\\n\u{1F52C} Scientists in related fields\\n\u{1F4DA} Educators and students of environmental studies\\n\u{1F3A4} Activists & advocates\\n\u267B Hosted on a dedicated server in \u{1F1EB}\u{1F1EE} Helsinki and recognised by the Green Web Foundation for using renewable energy.\\n#CommunitySpotlight #Fediverse #Mastodon #SocialWeb"
60547
+ author: Mastodon
60548
+ author_display_name: Mastodon
60549
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60550
+ url: "https://mastodon.social/@Mastodon/117093587981367953"
60551
+ published_at: "2026-08-14T11:19:19.586Z"
60552
+ reply_count: 3
60553
+ repost_count: 84
60554
+ like_count: 151
60555
+ media_url: null
60556
+ thumbnail_url: null
60557
+ external_url: "https://earth.law/about"
60558
+ external_title: Earth.Law
60559
+ comments[4]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60560
+ "117093848079127881",individual8,David Schmidt,"@Mastodon If not already in place, I'd suggest a required minimum version to be installed for a #FeaturedServer.","https://mastodon.social/@individual8/117093848079127881","2026-08-14T12:25:28.397Z",1,0,0
60561
+ "117095125812203950",ramkay,Ramnarayan Kalyanaraman,"@Mastodon interesting and nice\\nHow does one follow earth.law ?","https://mastodon.social/@ramkay/117095125812203950","2026-08-14T17:50:25.075Z",0,1,0
60562
+ "117095162889719306",ramkay,Ramnarayan Kalyanaraman,"@Mastodon\\nis this correct\\nhttps://mastodon.social/@sij.law@web.brid.gy ?","https://mastodon.social/@ramkay/117095162889719306","2026-08-14T17:59:50.780Z",0,0,0
60563
+ "117104390508206272",Nikmaximus,Nik,"@Mastodon\\nTodos estos sitios y foros est\xE1n dirigidos a:\\n\xA1Un vac\xEDo y la charla de siempre, encubriendo el bombeo de enormes vol\xFAmenes de agua del ciclo natural del agua... que inevitablemente est\xE1 provocando el cambio clim\xE1tico en todo el planeta Tierra en los \xFAltimos tiempos!\\n\xA1Pero a nadie le importa!\\n\xA1Es como si todos se hubieran vuelto ciegos, sordos o mentalmente degradados al nivel de un pez tonto!\\n\xA1Criaturas viles y est\xFApidas controladas por el \\"Imperio Epstein\\"!","https://mastodon.social/@Nikmaximus/117104390508206272","2026-08-16T09:06:33.065Z",0,0,0
60564
+ fetched_comment_count: 4
60565
+ provider: Mastodon
60566
+ embed_ref: mastodon-here-is-fYs
60567
+ app_id: social_media
60568
+ skill_id: get-posts`,
60569
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60570
+ "embed_ids": []
60571
+ },
60572
+ {
60573
+ "embed_id": "1bbc2a8a-6e5d-5628-84f4-43eb854ca3b6",
60574
+ "type": "social_post",
60575
+ "content": `id: "117156549508722805"
60576
+ platform: mastodon
60577
+ page: Mastodon@mastodon.social
60578
+ title: "@Mastodon: Hannah Aubry is leaving Mastodon after her time with us as community director an"
60579
+ body: "Hannah Aubry is leaving Mastodon after her time with us as community director and board member. We\u2019re very grateful for her contributions, ideas, and commitment to Mastodon and the fediverse. Thank you, Hannah! We wish you all the very best for what comes next."
60580
+ author: Mastodon
60581
+ author_display_name: Mastodon
60582
+ author_avatar_url: "https://files.mastodon.social/accounts/avatars/000/013/179/original/b4ceb19c9c54ec7e.png"
60583
+ url: "https://mastodon.social/@Mastodon/117156549508722805"
60584
+ published_at: "2026-08-25T14:11:16.256Z"
60585
+ reply_count: 18
60586
+ repost_count: 106
60587
+ like_count: 466
60588
+ media_url: null
60589
+ thumbnail_url: null
60590
+ external_url: null
60591
+ external_title: null
60592
+ comments[5]{id,author,author_display_name,body,url,published_at,like_count,reply_count,repost_count}:
60593
+ "117156593368148841",NatureMC@mastodon.online,Petra van Cronenburg,@Mastodon @haubles That's sad for us because your work was so precious. Wishing you all the best for new projects!,"https://mastodon.online/@NatureMC/117156593304180353","2026-08-25T14:22:24.000Z",11,1,0
60594
+ "117156616061869984",stefan@stefanbohacek.online,Stefan Bohacek,"@haubles Joining in to second this.\\nBest of luck with whatever is next for you!\\n@NatureMC @Mastodon","https://stefanbohacek.online/@stefan/117156615905013793","2026-08-25T14:28:09.000Z",4,0,0
60595
+ "117156631804352116",newsmast@newsmast.social,Newsmast Foundation,"@Mastodon\\nThank you for all your work @haubles! We wish you the best \u{1F9E1}","https://backend.newsmast.org/@newsmast/117156631570034185","2026-08-25T14:32:08.000Z",2,0,0
60596
+ "117156653247374469",64bithero@mstdn.games,Jimmothy Baggins,"@Mastodon I hope this was all planned for a long time. Something feels off :blobfoxflooftea:","https://mstdn.games/@64bithero/117156653175743296","2026-08-25T14:37:38.000Z",3,0,0
60597
+ "117156822734819953",cauZation,cauZation,@Mastodon Is HannaH backwards'ing out?..,"https://mastodon.social/@cauZation/117156822734819953","2026-08-25T15:20:45.346Z",1,1,0
60598
+ fetched_comment_count: 5
60599
+ provider: Mastodon
60600
+ embed_ref: mastodon-hannah-aubry-g9H
60601
+ app_id: social_media
60602
+ skill_id: get-posts`,
60603
+ "parent_embed_id": "33ebec48-4730-4b4b-b7d7-f967173ac9b6",
60604
+ "embed_ids": []
60605
+ }
60606
+ ],
60607
+ metadata: {
60608
+ featured: true,
60609
+ order: 135,
60610
+ app_skill_examples: ["social_media.get-posts"]
60611
+ }
60612
+ };
60613
+
60614
+ // ../ui/src/demo_chats/data/example_chats/adjacent-career-portfolio-experiments.ts
60615
+ var adjacentCareerPortfolioExperimentsChat = {
60616
+ chat_id: "example-adjacent-career-portfolio-experiments",
60617
+ slug: "adjacent-career-portfolio-experiments",
60618
+ title: "example_chats.adjacent_career_portfolio_experiments.title",
60619
+ summary: "example_chats.adjacent_career_portfolio_experiments.summary",
60620
+ icon: "briefcase-business",
60621
+ category: "life_coach_psychology",
60622
+ keywords: ["career change", "customer support", "technical writing", "support operations", "portfolio experiments"],
60623
+ follow_up_suggestions: ["example_chats.adjacent_career_portfolio_experiments.follow_up_1", "example_chats.adjacent_career_portfolio_experiments.follow_up_2", "example_chats.adjacent_career_portfolio_experiments.follow_up_3", "example_chats.adjacent_career_portfolio_experiments.follow_up_4", "example_chats.adjacent_career_portfolio_experiments.follow_up_5", "example_chats.adjacent_career_portfolio_experiments.follow_up_6"],
60624
+ messages: [
60625
+ {
60626
+ "id": "4b477f7c-7d77-4310-a831-03639d322038",
60627
+ "role": "user",
60628
+ "content": "example_chats.adjacent_career_portfolio_experiments.message_1",
60629
+ "created_at": 1791558060
60630
+ },
60631
+ {
60632
+ "id": "d41e4130-6e10-4592-b05d-e31442926d04",
60633
+ "role": "assistant",
60634
+ "content": "example_chats.adjacent_career_portfolio_experiments.message_2",
60635
+ "created_at": 1791558061,
60636
+ "user_message_id": "4b477f7c-7d77-4310-a831-03639d322038",
60637
+ "category": "life_coach_psychology",
60638
+ "model_name": "Gemini 3.8 Flash"
60639
+ }
60640
+ ],
60641
+ embeds: [
60642
+ {
60643
+ "embed_id": "22f0006e-a854-4ad5-a5ff-5eefe6c29b40",
60644
+ "type": "focus-mode-activation",
60645
+ "content": "focus_id: jobs-career_insights\napp_id: jobs\nskill_id: career_insights\nfocus_mode_name: Career insights\nstatus: finished",
60646
+ "parent_embed_id": null,
60647
+ "embed_ids": null
60648
+ }
60649
+ ],
60650
+ metadata: {
60651
+ featured: true,
60652
+ order: 136,
60653
+ app_focus_mode_examples: ["jobs.career_insights"],
60654
+ active_focus_id: "jobs-career_insights"
60655
+ }
60656
+ };
60657
+
60658
+ // ../ui/src/demo_chats/data/example_chats/calm-manager-follow-up.ts
60659
+ var calmManagerFollowUpChat = {
60660
+ chat_id: "example-calm-manager-follow-up",
60661
+ slug: "calm-manager-follow-up",
60662
+ title: "example_chats.calm_manager_follow_up.title",
60663
+ summary: "example_chats.calm_manager_follow_up.summary",
60664
+ icon: "heart-handshake",
60665
+ category: "life_coach_psychology",
60666
+ keywords: ["difficult conversation", "manager follow-up", "workplace communication", "career coaching"],
60667
+ follow_up_suggestions: ["example_chats.calm_manager_follow_up.follow_up_1", "example_chats.calm_manager_follow_up.follow_up_2", "example_chats.calm_manager_follow_up.follow_up_3", "example_chats.calm_manager_follow_up.follow_up_4", "example_chats.calm_manager_follow_up.follow_up_5", "example_chats.calm_manager_follow_up.follow_up_6"],
60668
+ messages: [
60669
+ {
60670
+ "id": "4c8d227f-977f-4a6d-827a-70b01bef29e5",
60671
+ "role": "user",
60672
+ "content": "example_chats.calm_manager_follow_up.message_1",
60673
+ "created_at": 1791558236
60674
+ },
60675
+ {
60676
+ "id": "8ddb25e7-4b9b-5b35-a0ae-f69365b43f8a",
60677
+ "role": "assistant",
60678
+ "content": "example_chats.calm_manager_follow_up.message_2",
60679
+ "created_at": 1791558237,
60680
+ "user_message_id": "4c8d227f-977f-4a6d-827a-70b01bef29e5",
60681
+ "category": "life_coach_psychology",
60682
+ "model_name": "Gemini 3.8 Flash"
60683
+ },
60684
+ {
60685
+ "id": "5959f2a7-bd86-43ae-a69c-c6262eb89d23",
60686
+ "role": "user",
60687
+ "content": "example_chats.calm_manager_follow_up.message_3",
60688
+ "created_at": 1791558280
60689
+ },
60690
+ {
60691
+ "id": "479e9f61-8358-5393-bb91-23ef0a2fccf9",
60692
+ "role": "assistant",
60693
+ "content": "example_chats.calm_manager_follow_up.message_4",
60694
+ "created_at": 1791558281,
60695
+ "user_message_id": "5959f2a7-bd86-43ae-a69c-c6262eb89d23",
60696
+ "category": "life_coach_psychology",
60697
+ "model_name": "Gemini 3.8 Flash"
60698
+ }
60699
+ ],
60700
+ embeds: [],
60701
+ metadata: {
60702
+ featured: true,
60703
+ order: 137
60704
+ }
60705
+ };
60706
+
60707
+ // ../ui/src/demo_chats/data/example_chats/autumn-basil-balcony-care.ts
60708
+ var autumnBasilBalconyCareChat = {
60709
+ chat_id: "example-autumn-basil-balcony-care",
60710
+ slug: "autumn-basil-balcony-care",
60711
+ title: "example_chats.autumn_basil_balcony_care.title",
60712
+ summary: "example_chats.autumn_basil_balcony_care.summary",
60713
+ icon: "sprout",
60714
+ category: "science",
60715
+ keywords: ["basil care", "balcony gardening", "Berlin autumn", "plant care guide"],
60716
+ follow_up_suggestions: ["example_chats.autumn_basil_balcony_care.follow_up_1", "example_chats.autumn_basil_balcony_care.follow_up_2", "example_chats.autumn_basil_balcony_care.follow_up_3", "example_chats.autumn_basil_balcony_care.follow_up_4", "example_chats.autumn_basil_balcony_care.follow_up_5", "example_chats.autumn_basil_balcony_care.follow_up_6"],
60717
+ messages: [
60718
+ {
60719
+ "id": "f83632d8-a7f7-494a-946c-9c982f8bcb2d",
60720
+ "role": "user",
60721
+ "content": "example_chats.autumn_basil_balcony_care.message_1",
60722
+ "created_at": 1791558993
60723
+ },
60724
+ {
60725
+ "id": "eafd61f7-e9e9-57fc-bdd5-093a294b464e",
60726
+ "role": "assistant",
60727
+ "content": "example_chats.autumn_basil_balcony_care.message_2",
60728
+ "created_at": 1791558994,
60729
+ "user_message_id": "f83632d8-a7f7-494a-946c-9c982f8bcb2d",
60730
+ "category": "science",
60731
+ "model_name": "Gemini 3.8 Flash"
60732
+ }
60733
+ ],
60734
+ embeds: [],
60735
+ metadata: {
60736
+ featured: true,
60737
+ order: 138
60738
+ }
60739
+ };
60740
+
60741
+ // ../ui/src/demo_chats/data/example_chats/bayes-theorem-quick-quiz.ts
60742
+ var bayesTheoremQuickQuizChat = {
60743
+ chat_id: "example-bayes-theorem-quick-quiz",
60744
+ slug: "bayes-theorem-quick-quiz",
60745
+ title: "example_chats.bayes_theorem_quick_quiz.title",
60746
+ summary: "example_chats.bayes_theorem_quick_quiz.summary",
60747
+ icon: "graduation-cap",
60748
+ category: "general_knowledge",
60749
+ keywords: ["Bayes theorem", "statistics exam", "probability quiz", "prior probability", "study help"],
60750
+ follow_up_suggestions: ["example_chats.bayes_theorem_quick_quiz.follow_up_1", "example_chats.bayes_theorem_quick_quiz.follow_up_2", "example_chats.bayes_theorem_quick_quiz.follow_up_3", "example_chats.bayes_theorem_quick_quiz.follow_up_4", "example_chats.bayes_theorem_quick_quiz.follow_up_5", "example_chats.bayes_theorem_quick_quiz.follow_up_6"],
60751
+ messages: [
60752
+ {
60753
+ "id": "36308e01-b89c-459f-aa01-ff4a327563db",
60754
+ "role": "user",
60755
+ "content": "example_chats.bayes_theorem_quick_quiz.message_1",
60756
+ "created_at": 1791558519
60757
+ },
60758
+ {
60759
+ "id": "043e4300-2d55-53ea-909b-aa59fd38e21f",
60760
+ "role": "assistant",
60761
+ "content": "example_chats.bayes_theorem_quick_quiz.message_2",
60762
+ "created_at": 1791558520,
60763
+ "user_message_id": "36308e01-b89c-459f-aa01-ff4a327563db",
60764
+ "category": "general_knowledge",
60765
+ "model_name": "Gemini 3.8 Flash"
60766
+ },
60767
+ {
60768
+ "id": "1dca0f42-0476-4876-9035-9352b8e711cb",
60769
+ "role": "user",
60770
+ "content": "example_chats.bayes_theorem_quick_quiz.message_3",
60771
+ "created_at": 1791558585
60772
+ },
60773
+ {
60774
+ "id": "0121aa5e-75d0-5665-875a-68a6157cfd0e",
60775
+ "role": "assistant",
60776
+ "content": "example_chats.bayes_theorem_quick_quiz.message_4",
60777
+ "created_at": 1791558586,
60778
+ "user_message_id": "1dca0f42-0476-4876-9035-9352b8e711cb",
60779
+ "category": "general_knowledge",
60780
+ "model_name": "Gemini 3.8 Flash"
60781
+ }
60782
+ ],
60783
+ embeds: [],
60784
+ metadata: {
60785
+ featured: true,
60786
+ order: 139
60787
+ }
60788
+ };
60789
+
60790
+ // ../ui/src/demo_chats/data/example_chats/voice-note-transcription-action-item.ts
60791
+ var voiceNoteTranscriptionActionItemChat = {
60792
+ chat_id: "example-voice-note-transcription-action",
60793
+ slug: "voice-note-transcription-action-item",
60794
+ title: "example_chats.voice_note_transcription_action_item.title",
60795
+ summary: "example_chats.voice_note_transcription_action_item.summary",
60796
+ icon: "audio",
60797
+ category: "general_knowledge",
60798
+ keywords: ["audio transcription", "voice note", "action items", "speech to text"],
60799
+ follow_up_suggestions: ["example_chats.voice_note_transcription_action_item.follow_up_1", "example_chats.voice_note_transcription_action_item.follow_up_2", "example_chats.voice_note_transcription_action_item.follow_up_3", "example_chats.voice_note_transcription_action_item.follow_up_4", "example_chats.voice_note_transcription_action_item.follow_up_5", "example_chats.voice_note_transcription_action_item.follow_up_6"],
60800
+ messages: [
60801
+ {
60802
+ "id": "621c90d7-2625-4979-8ffe-c0167afb5949",
60803
+ "role": "user",
60804
+ "content": "example_chats.voice_note_transcription_action_item.message_1",
60805
+ "created_at": 1791558631
60806
+ },
60807
+ {
60808
+ "id": "a98d6285-3e9e-5962-8cd7-84ab66709870",
60809
+ "role": "assistant",
60810
+ "content": "example_chats.voice_note_transcription_action_item.message_2",
60811
+ "created_at": 1791558632,
60812
+ "user_message_id": "621c90d7-2625-4979-8ffe-c0167afb5949",
60813
+ "category": "general_knowledge",
60814
+ "model_name": "Gemini 3.8 Flash"
60815
+ }
60816
+ ],
60817
+ embeds: [
60818
+ {
60819
+ "embed_id": "476941de-0520-440f-a232-66e7cfb8d7e0",
60820
+ "type": "audio-recording",
60821
+ "content": "app_id: audio\nskill_id: transcribe\ntype: audio-recording\nstatus: finished\nfilename: transcription-demo-voice-note.wav\nembed_ref: transcription-demo-voice-note-wav-ab2ed0-823c8695-2632-495a-9bff-9e66a805d114\nmime_type: audio/wav\npreviewAudioUrl: /store-examples/transcription-demo-voice-note.wav\ntranscript: Real-time transcription is working correctly in OpenMates.\ntranscript_original: Real-time transcription is working correctly in OpenMates.\ntranscript_corrected: Real-time transcription is working correctly in OpenMates.\nuse_corrected: true\ncorrection_model: gemini-3.5-flash\nmodel: voxtral-mini-2602\nwaveform:\n version: 1\n kind: rms-envelope\n samples[128]: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,8,12,8,5,4,0,1,4,5,3,5,6,1,1,5,4,4,5,1,1,1,4,3,1,1,0,3,5,6,3,1,7,3,1,3,5,6,4,1,0,4,6,6,1,1,5,4,5,3,3,1,0,3,4,5,5,2,2,8,5,1,5,9,4,1,6,7,6,7,6,5,4,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n duration_seconds: 5",
60822
+ "parent_embed_id": null,
60823
+ "embed_ids": null
60824
+ }
60825
+ ],
60826
+ metadata: {
60827
+ featured: true,
60828
+ order: 140
60829
+ }
60830
+ };
60831
+
60832
+ // ../ui/src/demo_chats/data/example_chats/net-cash-from-supplied-balances.ts
60833
+ var netCashFromSuppliedBalancesChat = {
60834
+ chat_id: "example-net-cash-from-supplied",
60835
+ slug: "net-cash-from-supplied-balances",
60836
+ title: "example_chats.net_cash_from_supplied_balances.title",
60837
+ summary: "example_chats.net_cash_from_supplied_balances.summary",
60838
+ icon: "wallet",
60839
+ category: "finance",
60840
+ keywords: ["net cash", "account balances", "checking", "savings", "credit card", "personal finance"],
60841
+ follow_up_suggestions: ["example_chats.net_cash_from_supplied_balances.follow_up_1", "example_chats.net_cash_from_supplied_balances.follow_up_2", "example_chats.net_cash_from_supplied_balances.follow_up_3", "example_chats.net_cash_from_supplied_balances.follow_up_4", "example_chats.net_cash_from_supplied_balances.follow_up_5", "example_chats.net_cash_from_supplied_balances.follow_up_6"],
60842
+ messages: [
60843
+ {
60844
+ "id": "c26a8906-39c8-49a7-97c8-0fc13bfa5907",
60845
+ "role": "user",
60846
+ "content": "example_chats.net_cash_from_supplied_balances.message_1",
60847
+ "created_at": 1791558644
60848
+ },
60849
+ {
60850
+ "id": "0a759f57-e28c-5053-af77-8ab8524f8815",
60851
+ "role": "assistant",
60852
+ "content": "example_chats.net_cash_from_supplied_balances.message_2",
60853
+ "created_at": 1791558645,
60854
+ "user_message_id": "c26a8906-39c8-49a7-97c8-0fc13bfa5907",
60855
+ "category": "finance",
60856
+ "model_name": "Gemini 3.8 Flash"
60857
+ }
60858
+ ],
60859
+ embeds: [
60860
+ {
60861
+ "embed_id": "3db1b137-abac-48a5-8c18-31ef7821ec04",
60862
+ "type": "sheet",
60863
+ "content": 'type: sheet\napp_id: sheets\nskill_id: sheet\ntable: "| Account / Obligation | Balance | Category |\\n| :--- | :--- | :--- |\\n| **Checking Account** | +\u20AC1,850 | Liquid Asset |\\n| **Savings Account** | +\u20AC4,200 | Liquid / Semi-liquid Asset |\\n| **Credit Card Balance** | \u2212\u20AC640 | Short-term Liability |\\n| **Net Cash Position** | **+\u20AC5,410** | **Total Liquid Net Worth** |"\ntitle: ""\nembed_ref: sheet-3db1b1\nstatus: finished\nrow_count: 4\ncol_count: 3',
60864
+ "parent_embed_id": null,
60865
+ "embed_ids": null
60866
+ },
60867
+ {
60868
+ "embed_id": "04818ed0-8e67-4cb8-9736-45d5c35d393a",
60869
+ "type": "app_skill_use",
60870
+ "content": 'app_id: math\nskill_id: calculate\nresults[1]:\n - expression_latex: "5410"\n result_latex: "5410.0"\n result_numeric: 5410\n result_str: "5410.00000000000"\n expression_raw: 1850 + 4200 - 640\n title: Net Cash Position\n steps: []\n mode_used: numeric\n error: null\n expression: 1850 + 4200 - 640\n result: "5410.00000000000"\n mode: numeric\nresult_count: 1\nstatus: finished\nembed_ref: net-cash-position-20O\ntitle: Net Cash Position\nexpression: 1850 + 4200 - 640',
60871
+ "parent_embed_id": null,
60872
+ "embed_ids": null
60873
+ }
60874
+ ],
60875
+ metadata: {
60876
+ featured: true,
60877
+ order: 141,
60878
+ app_skill_examples: ["math.calculate"]
60879
+ }
60880
+ };
60881
+
60882
+ // ../ui/src/demo_chats/data/example_chats/community-garden-welcome-melody.ts
60883
+ var communityGardenWelcomeMelodyChat = {
60884
+ chat_id: "example-community-garden-welcome-melody",
60885
+ slug: "community-garden-welcome-melody",
60886
+ title: "example_chats.community_garden_welcome_melody.title",
60887
+ summary: "example_chats.community_garden_welcome_melody.summary",
60888
+ icon: "music",
60889
+ category: "design",
60890
+ keywords: ["music generation", "community garden", "instrumental", "welcome video"],
60891
+ follow_up_suggestions: ["example_chats.community_garden_welcome_melody.follow_up_1", "example_chats.community_garden_welcome_melody.follow_up_2", "example_chats.community_garden_welcome_melody.follow_up_3", "example_chats.community_garden_welcome_melody.follow_up_4", "example_chats.community_garden_welcome_melody.follow_up_5", "example_chats.community_garden_welcome_melody.follow_up_6"],
60892
+ messages: [
60893
+ {
60894
+ "id": "e832737d-5070-459b-8be8-ce36d8091e1d",
60895
+ "role": "user",
60896
+ "content": "example_chats.community_garden_welcome_melody.message_1",
60897
+ "created_at": 1791558941
60898
+ },
60899
+ {
60900
+ "id": "735f2e97-c7b0-58f1-b866-cc18382d0eeb",
60901
+ "role": "assistant",
60902
+ "content": "example_chats.community_garden_welcome_melody.message_2",
60903
+ "created_at": 1791558942,
60904
+ "user_message_id": "e832737d-5070-459b-8be8-ce36d8091e1d",
60905
+ "category": "general_knowledge",
60906
+ "model_name": "Gemini 3.8 Flash"
60907
+ }
60908
+ ],
60909
+ embeds: [
60910
+ {
60911
+ "embed_id": "296e122a-cd23-4fc6-9c27-99f21f8e3401",
60912
+ "type": "app_skill_use",
60913
+ "content": 'app_id: music\nskill_id: generate\ntype: music\nstatus: finished\nprompt: "A short, gentle, and warm instrumental melody perfect for a community garden welcome video. Acoustic guitar, light marimba, soft piano, and delicate strings evoking nature, sunshine, blooming flowers, and neighborhood collaboration."\nmode: instrumental\nlyrics: null\nstyle: "Acoustic folk, ambient, uplifting, warm, peaceful, gentle"\nduration_seconds: 54.52\nmodel: lyria-3-pro-preview\nprovider: Google Vertex AI\npreviewAudioUrl: /store-examples/community-garden-welcome-melody.mp3\ngenerated_at: "2026-10-09T15:16:27.504966+00:00"\nwatermarking: SynthID\nprovenance:\n ai_generated: true\n labeling: audio_container_metadata\n visual_watermark: false\n provider_watermarking: SynthID',
60914
+ "parent_embed_id": null,
60915
+ "embed_ids": null
60916
+ }
60917
+ ],
60918
+ metadata: {
60919
+ featured: true,
60920
+ order: 142,
60921
+ app_skill_examples: ["music.generate"]
60922
+ }
60923
+ };
60924
+
60925
+ // ../ui/src/demo_chats/data/example_chats/berlin-english-speaking-gp-appointments.ts
60926
+ var berlinEnglishSpeakingGpAppointmentsChat = {
60927
+ chat_id: "example-berlin-english-speaking-gp",
60928
+ slug: "berlin-english-speaking-gp-appointments",
60929
+ title: "example_chats.berlin_english_speaking_gp_appointments.title",
60930
+ summary: "example_chats.berlin_english_speaking_gp_appointments.summary",
60931
+ icon: "health",
60932
+ category: "medical_health",
60933
+ keywords: ["doctor appointments", "GP Berlin", "English-speaking doctor", "healthcare"],
60934
+ follow_up_suggestions: ["example_chats.berlin_english_speaking_gp_appointments.follow_up_1", "example_chats.berlin_english_speaking_gp_appointments.follow_up_2", "example_chats.berlin_english_speaking_gp_appointments.follow_up_3", "example_chats.berlin_english_speaking_gp_appointments.follow_up_4", "example_chats.berlin_english_speaking_gp_appointments.follow_up_5", "example_chats.berlin_english_speaking_gp_appointments.follow_up_6"],
60935
+ messages: [
60936
+ {
60937
+ "id": "bddb710b-f700-40cf-8661-c3fd3cba6036",
60938
+ "role": "user",
60939
+ "content": "example_chats.berlin_english_speaking_gp_appointments.message_1",
60940
+ "created_at": 1791560265,
60941
+ "model_name": "gpt-5.4"
60942
+ },
60943
+ {
60944
+ "id": "25c62d4e-d644-5d4e-8807-010430a16bff",
60945
+ "role": "assistant",
60946
+ "content": "example_chats.berlin_english_speaking_gp_appointments.message_2",
60947
+ "created_at": 1791560266,
60948
+ "user_message_id": "bddb710b-f700-40cf-8661-c3fd3cba6036",
60949
+ "category": "medical_health",
60950
+ "model_name": "GPT-5.4"
60951
+ }
60952
+ ],
60953
+ embeds: [
60954
+ {
60955
+ "embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
60956
+ "type": "app_skill_use",
60957
+ "content": 'app_id: health\nskill_id: search_appointments\nresult_count: 7\nembed_ids: 99010615-061a-4e3d-86fb-7ae4bab8f8f9|8caa1f23-c3a5-4a0d-8264-290de347ba98|e86095a4-328e-44af-bbd8-c6fa7eb2ceb4|9bc77630-cf0c-4446-a71d-39a137dd6d39|df08bd10-10a0-4dfd-957f-d356617e013e|3be646e8-8f97-48f2-afae-df58f6f8ca61|0645e8d8-b74f-482f-9b04-b44ce6918eb9\nstatus: finished\nspeciality: general_practitioner\ncity: Berlin\nprovider_platform: both\nlanguage: gb\ndays_ahead: "7"\nmax_doctors: 10\nvisit_motive_category: general\npreview_results[6]{name,address}:\n RAB Arztbesuche - Hausbesuche,"Roscherstra\xDFe 3, 10629 Berlin"\n Privatpraxis Reiche,"Roscherstra\xDFe 3, 10629 Berlin"\n "Hausarztpraxis Adlershof - Dr. Gilbert B\xFCchner und Kolleg:innen","Albert-Einstein-Stra\xDFe 2, 12489 Berlin"\n Katrin Reimer-B\xFCrkle,"Kapweg 5, 13405 Berlin"\n die Haus\xE4rzte,"Stargarder Stra\xDFe 69, 10437 Berlin"\n Hermann Fondis,"M\xFCllerstra\xDFe 36, 13353 Berlin"',
60958
+ "parent_embed_id": null,
60959
+ "embed_ids": [
60960
+ "99010615-061a-4e3d-86fb-7ae4bab8f8f9",
60961
+ "8caa1f23-c3a5-4a0d-8264-290de347ba98",
60962
+ "e86095a4-328e-44af-bbd8-c6fa7eb2ceb4",
60963
+ "9bc77630-cf0c-4446-a71d-39a137dd6d39",
60964
+ "df08bd10-10a0-4dfd-957f-d356617e013e",
60965
+ "3be646e8-8f97-48f2-afae-df58f6f8ca61",
60966
+ "0645e8d8-b74f-482f-9b04-b44ce6918eb9"
60967
+ ]
60968
+ },
60969
+ {
60970
+ "embed_id": "3be646e8-8f97-48f2-afae-df58f6f8ca61",
60971
+ "type": "appointment",
60972
+ "content": 'type: appointment\nhash: 1582680e2683fa55\nslot_datetime: "2026-10-12T08:00:00.000+02:00"\nname: Hermann Fondis\ntitle: null\ngender: null\ndoctor_type: INDIVIDUAL_PRACTITIONER\naddress: "M\xFCllerstra\xDFe 36, 13353 Berlin"\ngps_coordinates_latitude: 52.54931029999999\ngps_coordinates_longitude: 13.3548785\nspeciality: Hausarzt / Allgemeinmediziner\nlanguages: de|gb\ntelehealth: false\nvisit_motive: "Erstuntersuchung Neupatient:in"\ninsurance: unknown\nallows_new_patients: true\npractice_url: "https://www.doctolib.de/allgemeinmedizin/berlin/hermann-fondis?pid=practice-880520"\nprovider_platform: Doctolib\ncountry: DE\nbooking_url: null\nrating: null\nrating_count: null\nprice: null\nservice_name: null\nvisit_motive_id: 15878387\nagenda_id: 2709870\npractice_id: 880520\nadditional_slot_datetimes: "2026-10-12T08:10:00.000+02:00|2026-10-12T08:20:00.000+02:00"\nadditional_slot_count: 2\nsearch_coverage_Doctolib: partial\nsearch_coverage_Jameda: unsupported\nembed_ref: hermann-fondis-d6N\napp_id: health\nskill_id: search_appointments',
60973
+ "parent_embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
60974
+ "embed_ids": null
60975
+ },
60976
+ {
60977
+ "embed_id": "0645e8d8-b74f-482f-9b04-b44ce6918eb9",
60978
+ "type": "appointment",
60979
+ "content": 'type: appointment\nhash: f537a4207681c60f\nslot_datetime: "2026-10-12T08:10:00.000+02:00"\nname: Lubomir Rakita\ntitle: null\ngender: null\ndoctor_type: INDIVIDUAL_PRACTITIONER\naddress: "Wallstra\xDFe 16, 10179 Berlin"\ngps_coordinates_latitude: 52.5108027\ngps_coordinates_longitude: 13.4069725\nspeciality: Hausarzt / Allgemeinmediziner\nlanguages: de|gb\ntelehealth: false\nvisit_motive: "Erstuntersuchung Neupatient:in"\ninsurance: unknown\nallows_new_patients: true\npractice_url: "https://www.doctolib.de/allgemeinmedizin/berlin/lubomir-rakita?pid=practice-811546"\nprovider_platform: Doctolib\ncountry: DE\nbooking_url: null\nrating: null\nrating_count: null\nprice: null\nservice_name: null\nvisit_motive_id: 15878387\nagenda_id: 2724408\npractice_id: 811546\nadditional_slot_datetimes: "2026-10-12T08:20:00.000+02:00"\nadditional_slot_count: 1\nsearch_coverage_Doctolib: partial\nsearch_coverage_Jameda: unsupported\nembed_ref: lubomir-rakita-UPM\napp_id: health\nskill_id: search_appointments',
60980
+ "parent_embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
60981
+ "embed_ids": null
60982
+ },
60983
+ {
60984
+ "embed_id": "e86095a4-328e-44af-bbd8-c6fa7eb2ceb4",
60985
+ "type": "appointment",
60986
+ "content": 'type: appointment\nhash: 5b58d08e4f37ac17\nslot_datetime: "2026-10-12T07:45:00.000+02:00"\nname: "Hausarztpraxis Adlershof - Dr. Gilbert B\xFCchner und Kolleg:innen"\ntitle: null\ngender: null\ndoctor_type: ORGANIZATION\naddress: "Albert-Einstein-Stra\xDFe 2, 12489 Berlin"\ngps_coordinates_latitude: 52.4317717\ngps_coordinates_longitude: 13.5371206\nspeciality: Hausarzt / Allgemeinmediziner\nlanguages: de|gb\ntelehealth: false\nvisit_motive: "Erstuntersuchung Neupatient:in"\ninsurance: private\nallows_new_patients: true\npractice_url: "https://www.doctolib.de/praxis/berlin/hausarztpraxis-adlershof-dr-med-gilbert-buechner?pid=practice-424702"\nprovider_platform: Doctolib\ncountry: DE\nbooking_url: null\nrating: null\nrating_count: null\nprice: null\nservice_name: null\nvisit_motive_id: 8259486\nagenda_id: 2420631\npractice_id: 424702\nadditional_slot_datetimes: []\nadditional_slot_count: 0\nsearch_coverage_Doctolib: partial\nsearch_coverage_Jameda: unsupported\nembed_ref: hausarztpraxis-adlershof-dr-RRw\napp_id: health\nskill_id: search_appointments',
60987
+ "parent_embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
60988
+ "embed_ids": null
60989
+ },
60990
+ {
60991
+ "embed_id": "df08bd10-10a0-4dfd-957f-d356617e013e",
60992
+ "type": "appointment",
60993
+ "content": 'type: appointment\nhash: 029ab242dd6946de\nslot_datetime: "2026-10-12T08:00:00.000+02:00"\nname: die Haus\xE4rzte\ntitle: null\ngender: null\ndoctor_type: ORGANIZATION\naddress: "Stargarder Stra\xDFe 69, 10437 Berlin"\ngps_coordinates_latitude: 52.54654\ngps_coordinates_longitude: 13.41878\nspeciality: Hausarzt / Allgemeinmediziner\nlanguages: de|gb\ntelehealth: false\nvisit_motive: Akutsprechstunde\ninsurance: unknown\nallows_new_patients: true\npractice_url: "https://www.doctolib.de/gemeinschaftspraxis/berlin/die-hausaerzte-berlin?pid=practice-184293"\nprovider_platform: Doctolib\ncountry: DE\nbooking_url: null\nrating: null\nrating_count: null\nprice: null\nservice_name: null\nvisit_motive_id: 7723803\nagenda_id: 471739\npractice_id: 184293\nadditional_slot_datetimes: "2026-10-12T08:10:00.000+02:00|2026-10-12T08:20:00.000+02:00"\nadditional_slot_count: 2\nsearch_coverage_Doctolib: partial\nsearch_coverage_Jameda: unsupported\nembed_ref: die-haus-rzte-Di3\napp_id: health\nskill_id: search_appointments',
60994
+ "parent_embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
60995
+ "embed_ids": null
60996
+ },
60997
+ {
60998
+ "embed_id": "9bc77630-cf0c-4446-a71d-39a137dd6d39",
60999
+ "type": "appointment",
61000
+ "content": 'type: appointment\nhash: eea0a273c14fb441\nslot_datetime: "2026-10-12T08:00:00.000+02:00"\nname: Katrin Reimer-B\xFCrkle\ntitle: ""\ngender: female\ndoctor_type: INDIVIDUAL_PRACTITIONER\naddress: "Kapweg 5, 13405 Berlin"\ngps_coordinates_latitude: 52.5620986\ngps_coordinates_longitude: 13.330914600000028\nspeciality: Haus\xE4rztin / Allgemeinmedizinerin\nlanguages: gb\ntelehealth: false\nvisit_motive: "Erstuntersuchung Neupatient:in"\ninsurance: private\nallows_new_patients: true\npractice_url: "https://www.doctolib.de/allgemeinmedizin/berlin/katrin-buerkle?pid=practice-33442"\nprovider_platform: Doctolib\ncountry: DE\nbooking_url: null\nrating: null\nrating_count: null\nprice: null\nservice_name: null\nvisit_motive_id: 548953\nagenda_id: 62148\npractice_id: 33442\nadditional_slot_datetimes: "2026-10-12T08:15:00.000+02:00"\nadditional_slot_count: 1\nsearch_coverage_Doctolib: partial\nsearch_coverage_Jameda: unsupported\nembed_ref: katrin-reimer-b-bKm\napp_id: health\nskill_id: search_appointments',
61001
+ "parent_embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
61002
+ "embed_ids": null
61003
+ },
61004
+ {
61005
+ "embed_id": "99010615-061a-4e3d-86fb-7ae4bab8f8f9",
61006
+ "type": "appointment",
61007
+ "content": 'type: appointment\nhash: 0e3fa53ce36adefb\nslot_datetime: "2026-10-09T19:00:00.000+02:00"\nname: RAB Arztbesuche - Hausbesuche\ntitle: null\ngender: null\ndoctor_type: ORGANIZATION\naddress: "Roscherstra\xDFe 3, 10629 Berlin"\ngps_coordinates_latitude: 52.5011872\ngps_coordinates_longitude: 13.3016976\nspeciality: Hausarzt / Allgemeinmediziner\nlanguages: de|gb|fr|it|ru|ua\ntelehealth: false\nvisit_motive: "Hausbesuch (optional: Blutentnahme, Urinprobe, Infusionen, Laboruntersuchungen, Troponintest, Covid/RSV/Influenza-Test)"\ninsurance: private\nallows_new_patients: true\npractice_url: "https://www.doctolib.de/privatpraxis/berlin/rab-arztbesuche?pid=practice-878676"\nprovider_platform: Doctolib\ncountry: DE\nbooking_url: null\nrating: null\nrating_count: null\nprice: null\nservice_name: null\nvisit_motive_id: 17012778\nagenda_id: 2704860\npractice_id: 878676\nadditional_slot_datetimes: "2026-10-09T19:30:00.000+02:00|2026-10-09T20:00:00.000+02:00|2026-10-09T20:30:00.000+02:00|2026-10-09T21:00:00.000+02:00|2026-10-09T21:30:00.000+02:00"\nadditional_slot_count: 83\nsearch_coverage_Doctolib: partial\nsearch_coverage_Jameda: unsupported\nembed_ref: rab-arztbesuche-hausbesuche-6de\napp_id: health\nskill_id: search_appointments',
61008
+ "parent_embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
61009
+ "embed_ids": null
61010
+ },
61011
+ {
61012
+ "embed_id": "8caa1f23-c3a5-4a0d-8264-290de347ba98",
61013
+ "type": "appointment",
61014
+ "content": 'type: appointment\nhash: 542423ec054989d6\nslot_datetime: "2026-10-10T09:15:00.000+02:00"\nname: Privatpraxis Reiche\ntitle: null\ngender: null\ndoctor_type: ORGANIZATION\naddress: "Roscherstra\xDFe 3, 10629 Berlin"\ngps_coordinates_latitude: 52.5011872\ngps_coordinates_longitude: 13.3016976\nspeciality: Hausarzt / Allgemeinmediziner\nlanguages: de|gb|fr|it|ru|ua\ntelehealth: false\nvisit_motive: Konsultation\ninsurance: private\nallows_new_patients: true\npractice_url: "https://www.doctolib.de/privatpraxis/berlin/privatpraxis-reiche?pid=practice-704939"\nprovider_platform: Doctolib\ncountry: DE\nbooking_url: null\nrating: null\nrating_count: null\nprice: null\nservice_name: null\nvisit_motive_id: 14596963\nagenda_id: 2308727\npractice_id: 704939\nadditional_slot_datetimes: "2026-10-10T09:30:00.000+02:00|2026-10-10T09:45:00.000+02:00|2026-10-10T10:15:00.000+02:00|2026-10-10T10:45:00.000+02:00"\nadditional_slot_count: 4\nsearch_coverage_Doctolib: partial\nsearch_coverage_Jameda: unsupported\nembed_ref: privatpraxis-reiche-YIV\napp_id: health\nskill_id: search_appointments',
61015
+ "parent_embed_id": "14ccee29-eff7-47e5-8a27-9578da7f6501",
61016
+ "embed_ids": null
61017
+ }
61018
+ ],
61019
+ metadata: {
61020
+ featured: true,
61021
+ order: 143,
61022
+ app_skill_examples: ["health.search_appointments"]
61023
+ }
61024
+ };
61025
+
61026
+ // ../ui/src/demo_chats/data/example_chats/community-garden-sunflower-illustration.ts
61027
+ var communityGardenSunflowerIllustrationChat = {
61028
+ chat_id: "example-community-garden-sunflower-illustration",
61029
+ slug: "community-garden-sunflower-illustration",
61030
+ title: "example_chats.community_garden_sunflower_illustration.title",
61031
+ summary: "example_chats.community_garden_sunflower_illustration.summary",
61032
+ icon: "images",
61033
+ category: "design",
61034
+ keywords: ["botanical illustration", "sunflower", "community garden", "image generation"],
61035
+ follow_up_suggestions: ["example_chats.community_garden_sunflower_illustration.follow_up_1", "example_chats.community_garden_sunflower_illustration.follow_up_2", "example_chats.community_garden_sunflower_illustration.follow_up_3", "example_chats.community_garden_sunflower_illustration.follow_up_4", "example_chats.community_garden_sunflower_illustration.follow_up_5", "example_chats.community_garden_sunflower_illustration.follow_up_6"],
61036
+ messages: [
61037
+ {
61038
+ "id": "5d6ab998-047a-4ada-accc-b1eba1baa53a",
61039
+ "role": "user",
61040
+ "content": "example_chats.community_garden_sunflower_illustration.message_1",
61041
+ "created_at": 1791560540
61042
+ },
61043
+ {
61044
+ "id": "cd839f74-95c7-5c18-8846-6a13138e6c61",
61045
+ "role": "assistant",
61046
+ "content": "example_chats.community_garden_sunflower_illustration.message_2",
61047
+ "created_at": 1791560541,
61048
+ "user_message_id": "5d6ab998-047a-4ada-accc-b1eba1baa53a",
61049
+ "category": "design",
61050
+ "model_name": "Gemini 3.8 Flash"
61051
+ }
61052
+ ],
61053
+ embeds: [
61054
+ {
61055
+ "embed_id": "6a3857ca-aa90-486f-b481-4e1df6f95faa",
61056
+ "type": "app_skill_use",
61057
+ "content": 'app_id: images\nskill_id: generate\ntype: image\nstatus: finished\npreviewImageUrl: /store-examples/community-garden-sunflower.webp\npublic_full_width: 1200\npublic_full_height: 896\npublic_full_size_bytes: 495546\nprompt: "A warm, elegant botanical illustration of a blooming sunflower (Helianthus annuus), featuring detailed golden-yellow petals, rich textured seed center, vibrant green stem and leaves. Vintage botanical plate style with subtle watercolor and ink line details, set against a clean, warm off-white minimalist background. High detail, educational garden illustration, no text, no typography, clean composition."\nmodel: gemini-3-pro-image-preview\naspect_ratio: "4:3"\noutput_filetype: png\ngenerated_at: "2026-10-09T15:43:01.403094+00:00"\ninput_embed_ids: []\nprovenance:\n ai_generated: true\n labeling: xmp+c2pa\n visual_watermark: false\n provider_watermarking: provider-dependent',
61058
+ "parent_embed_id": null,
61059
+ "embed_ids": null
61060
+ }
61061
+ ],
61062
+ metadata: {
61063
+ featured: true,
61064
+ order: 145,
61065
+ app_skill_examples: ["images.generate"]
61066
+ }
61067
+ };
61068
+
61069
+ // ../ui/src/demo_chats/data/example_chats/community-garden-budget-review.ts
61070
+ var communityGardenBudgetReviewChat = {
61071
+ chat_id: "example-community-garden-budget-review",
61072
+ slug: "community-garden-budget-review",
61073
+ title: "example_chats.community_garden_budget_review.title",
61074
+ summary: "example_chats.community_garden_budget_review.summary",
61075
+ icon: "pdf",
61076
+ category: "finance",
61077
+ keywords: ["PDF budget review", "community garden", "funding gap", "expense summary"],
61078
+ follow_up_suggestions: ["example_chats.community_garden_budget_review.follow_up_1", "example_chats.community_garden_budget_review.follow_up_2", "example_chats.community_garden_budget_review.follow_up_3", "example_chats.community_garden_budget_review.follow_up_4", "example_chats.community_garden_budget_review.follow_up_5", "example_chats.community_garden_budget_review.follow_up_6"],
61079
+ messages: [
61080
+ {
61081
+ "id": "2aa70fa5-39ca-41fd-8233-d0f852045a15",
61082
+ "role": "user",
61083
+ "content": "example_chats.community_garden_budget_review.message_1",
61084
+ "created_at": 1791561758,
61085
+ "model_name": "gpt-5.4"
61086
+ },
61087
+ {
61088
+ "id": "978fe6d5-09d6-54db-8b9d-e6ae45080d6d",
61089
+ "role": "assistant",
61090
+ "content": "example_chats.community_garden_budget_review.message_2",
61091
+ "created_at": 1791561759,
61092
+ "user_message_id": "2aa70fa5-39ca-41fd-8233-d0f852045a15",
61093
+ "category": "finance",
61094
+ "model_name": "GPT-5.4"
61095
+ }
61096
+ ],
61097
+ embeds: [
61098
+ {
61099
+ "embed_id": "e3d392de-f8d3-4bbd-a115-df4a3bf95b1c",
61100
+ "type": "app_skill_use",
61101
+ "content": 'app_id: pdf\nskill_id: read\nresults[1]:\n - success: true\n file_path: fictional-community-garden-budget.pdf\n pages_returned: "1"\n pages_skipped: []\n content: "### Page 1\\n\\nCommunity Garden Volunteer Budget - Fictional Example\\n\\nDraft prepared for a sample neighborhood garden project\\n\\nPlanned expenses (EUR)\\nRaised-bed lumber and hardware: 420\\nSoil and compost: 300\\nSeeds and seedlings: 85\\nShared hand tools: 140\\nWatering hoses and connectors: 95\\nOpening event supplies: 75\\n\\nExpected funding (EUR)\\nNeighborhood grant: 800\\nVolunteer donations: 200\\n\\nPlanning note: figures are illustrative and not real account data."\n total_chars: 453\n continuation_hint: null\n error: null\nresult_count: 1\nstatus: finished\nembed_ref: read-w9j\nfile_path: fictional-community-garden-budget.pdf\npages: "1"',
61102
+ "parent_embed_id": null,
61103
+ "embed_ids": null
61104
+ },
61105
+ {
61106
+ "embed_id": "14ad3e3a-5402-49b7-82dc-1c392b9ba5e4",
61107
+ "type": "pdf",
61108
+ "content": 'type: pdf\nfilename: fictional-community-garden-budget.pdf\nembed_ref: fictional-community-garden-budget-pdf-e1-146e58\npage_count: 1\ntotal_tokens_estimated: 110\nper_page_tokens:\n "1": 110\ntoc:\n detected: false\n source_pages: []\n chapters: []\nlegend:\n detected: false\n source_pages: []\n content: ""\npreviewPdfUrl: /store-examples/community-garden-budget.pdf\nocr_provider: mistral\napp_id: pdf\nstatus: finished',
61109
+ "parent_embed_id": null,
61110
+ "embed_ids": null
61111
+ }
61112
+ ],
61113
+ metadata: {
61114
+ featured: true,
61115
+ order: 146,
61116
+ app_skill_examples: ["pdf.read"]
61117
+ }
61118
+ };
61119
+
59596
61120
  // ../ui/src/demo_chats/exampleChatData.ts
59597
61121
  var ALL_EXAMPLE_CHATS = [
59598
61122
  giganticAirplanesChat,
@@ -59691,7 +61215,25 @@ var ALL_EXAMPLE_CHATS = [
59691
61215
  audioSpeakOpenmatesWelcomeMessageChat,
59692
61216
  plumberMessageEmailPhonePrivacyChat,
59693
61217
  privatePlumberEmailChat,
59694
- socialAppNameDomainSearchChat
61218
+ socialAppNameDomainSearchChat,
61219
+ dampedSineDecayPlotChat,
61220
+ communityGardenPlanningMindmapChat,
61221
+ beginnerYogaClassesBerlinChat,
61222
+ urbanHeatIslandAtNightChat,
61223
+ communityGardenVolunteerOnboardingChat,
61224
+ booksAfterLeftHandOfDarknessChat,
61225
+ communityGardenCalendarInvitationChat,
61226
+ mastodonPublicPostThemesChat,
61227
+ adjacentCareerPortfolioExperimentsChat,
61228
+ calmManagerFollowUpChat,
61229
+ autumnBasilBalconyCareChat,
61230
+ bayesTheoremQuickQuizChat,
61231
+ voiceNoteTranscriptionActionItemChat,
61232
+ netCashFromSuppliedBalancesChat,
61233
+ communityGardenWelcomeMelodyChat,
61234
+ berlinEnglishSpeakingGpAppointmentsChat,
61235
+ communityGardenSunflowerIllustrationChat,
61236
+ communityGardenBudgetReviewChat
59695
61237
  ].sort((a, b) => a.metadata.order - b.metadata.order);
59696
61238
 
59697
61239
  // ../ui/src/demo_chats/exampleChatFiles.ts
@@ -65654,6 +67196,120 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
65654
67196
  text: "Open chat"
65655
67197
  }
65656
67198
  },
67199
+ daily_inspiration_fallback: {
67200
+ antikythera: {
67201
+ phrase: {
67202
+ text: "An ancient shipwreck held a machine that predicted the sky."
67203
+ },
67204
+ title: {
67205
+ text: "The Antikythera mechanism"
67206
+ },
67207
+ description: {
67208
+ text: "An ancient Greek hand-powered model of the cosmos."
67209
+ },
67210
+ assistant_response: {
67211
+ text: "The Antikythera mechanism used bronze gears to model astronomical cycles. Explore how ancient engineers predicted the sky."
67212
+ }
67213
+ },
67214
+ bioluminescence: {
67215
+ phrase: {
67216
+ text: "Some animals make their own light. The chemistry is surprisingly elegant."
67217
+ },
67218
+ title: {
67219
+ text: "Bioluminescence"
67220
+ },
67221
+ description: {
67222
+ text: "Living organisms producing light through chemistry."
67223
+ },
67224
+ assistant_response: {
67225
+ text: "Organisms glow for hunting, camouflage, communication, and defense. Explore how chemistry becomes light."
67226
+ }
67227
+ },
67228
+ fermi: {
67229
+ phrase: {
67230
+ text: "If the universe is so large, why does it seem so quiet?"
67231
+ },
67232
+ title: {
67233
+ text: "The Fermi paradox"
67234
+ },
67235
+ description: {
67236
+ text: "The tension between likely extraterrestrial life and no clear evidence."
67237
+ },
67238
+ assistant_response: {
67239
+ text: "The Fermi paradox asks why we have found no convincing evidence of extraterrestrial civilizations. Explore possible answers."
67240
+ }
67241
+ },
67242
+ export: {
67243
+ phrase: {
67244
+ text: "Keep your own backup. Export your OpenMates data whenever you need it."
67245
+ },
67246
+ title: {
67247
+ text: "Export your OpenMates data"
67248
+ },
67249
+ description: {
67250
+ text: "Back up chats, settings, memories, and more."
67251
+ },
67252
+ assistant_response: {
67253
+ text: "Export a copy of your OpenMates data from account settings. Sign in to access your encrypted account data."
67254
+ }
67255
+ },
67256
+ pii: {
67257
+ phrase: {
67258
+ text: "Want stronger privacy controls? Add personal details that OpenMates should hide."
67259
+ },
67260
+ title: {
67261
+ text: "Custom PII detection"
67262
+ },
67263
+ description: {
67264
+ text: "Protect personal details before model calls."
67265
+ },
67266
+ assistant_response: {
67267
+ text: "Choose personal details for OpenMates to hide before a model call. Review the privacy settings to manage them."
67268
+ }
67269
+ },
67270
+ focus: {
67271
+ phrase: {
67272
+ text: "Need a more focused answer? Give your mate a specific job."
67273
+ },
67274
+ title: {
67275
+ text: "Focus modes"
67276
+ },
67277
+ description: {
67278
+ text: "Guide a chat toward a specific goal."
67279
+ },
67280
+ assistant_response: {
67281
+ text: "Use a focus mode to guide a chat toward a specific goal. Explore available modes in Apps."
67282
+ }
67283
+ },
67284
+ memories: {
67285
+ phrase: {
67286
+ text: "Repeating yourself gets old. Save context your mates should remember."
67287
+ },
67288
+ title: {
67289
+ text: "Memories"
67290
+ },
67291
+ description: {
67292
+ text: "Save useful preferences and context."
67293
+ },
67294
+ assistant_response: {
67295
+ text: "Save useful preferences and context as memories, then choose what your mates can use."
67296
+ }
67297
+ },
67298
+ events: {
67299
+ phrase: {
67300
+ text: "Looking for something to do? Explore events near you."
67301
+ },
67302
+ title: {
67303
+ text: "Find local events"
67304
+ },
67305
+ description: {
67306
+ text: "Search classes, meetups, and other events."
67307
+ },
67308
+ assistant_response: {
67309
+ text: "Use Events search to find local classes and meetups. Choose a place and topic to see what is happening nearby."
67310
+ }
67311
+ }
67312
+ },
65657
67313
  demo_chats: {
65658
67314
  announcements_introducing_openmates_v010: {
65659
67315
  title: {
@@ -69487,6 +71143,38 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69487
71143
  }
69488
71144
  },
69489
71145
  example_chats: {
71146
+ adjacent_career_portfolio_experiments: {
71147
+ title: {
71148
+ text: "Test Two Career Paths from Customer Support"
71149
+ },
71150
+ summary: {
71151
+ text: "Compare technical writing and support operations with practical one-month portfolio experiments and interview questions."
71152
+ },
71153
+ message_1: {
71154
+ text: "I work in software customer support and like writing help guides and improving ticket workflows. What two adjacent roles could I test before applying for a new job? Please suggest small portfolio experiments I could do over the next month and questions to ask people in those roles."
71155
+ },
71156
+ message_2: {
71157
+ text: 'Based on your background in [customer support](wiki:Customer_support) and your enjoyment of help guides and ticket workflows, two natural adjacent roles stand out:\n\n1. **Technical Writer / Customer Education Specialist**\n *Focus:* Organizing [information architecture](wiki:Information_architecture), translating complex software features into clear user documentation, creating troubleshooting guides, and maintaining self-service knowledge bases.\n2. **Support Operations Specialist (Support Ops)**\n *Focus:* Administering support ticketing tools (such as [Zendesk](wiki:Zendesk), Freshdesk, or Jira Service Management), analyzing support metrics, optimizing ticket routing, auditing macros, and automating repetitive processes.\n\n---\n\n### 30-Day Portfolio Experiments\n\nYou do not need to switch jobs immediately to build proof of work. You can run these lightweight experiments directly within your current role or as independent case studies:\n\n#### For Technical Writing / Customer Education\n* **The "Top 5 Tickets" Rewrite:** Identify 3 to 5 common support tickets where users routinely get stuck due to confusing UI or vague existing guides.\n* **The Deliverable:** Write a comprehensive, modular troubleshooting guide or how-to article. Structure it with clear headings, prerequisites, step-by-step instructions, and annotated screenshots or diagrams.\n* **Portfolio Metric:** Track whether tickets tagged with this issue decrease after publishing, or measure internal team feedback on resolution speed.\n\n#### For Support Operations\n* **Macro & Routing Efficiency Audit:** Analyze your team\u2019s existing macro library or ticket routing rules.\n* **The Deliverable:** Create a 1-to-2 page process improvement proposal showing:\n 1. Redundant or outdated macros identified.\n 2. A streamlined categorization schema or automated trigger setup.\n 3. An estimate of time saved per agent per week.\n* **Portfolio Metric:** Present this to your lead or implement it if you have admin access, noting the before-and-after baseline.\n\n---\n\n### Questions for Informational Interviews\n\nWhen reaching out to practitioners on LinkedIn or internally:\n\n#### For Technical Writers\n* *"How do you balance writing for end users versus writing for internal technical teams or engineers?"*\n* *"What does your collaboration cycle look like when product features change rapidly before documentation is updated?"*\n* *"Which authoring tools and docs-as-code workflows are most valued in hiring right now?"*\n\n#### For Support Operations Specialists\n* *"How much of your day is spent configuring tooling and integrations versus analyzing data and ticket volume trends?"*\n* *"When scaling support workflows, what is the most common mistake teams make with automation?"*\n* *"What administrative certifications (e.g., Zendesk, Salesforce) or technical skills made the biggest difference in landing your role?"*\n\n---\n\n### Exploring Your Direction (Question 1 of 5)\n\nTo help identify which path aligns best with your long-term goals and day-to-day preferences, let\'s explore your core work style and interests.\n\n```interactive_question\n{\n "type": "choice",\n "id": "adjacent_role_preference",\n "multiple": false,\n "question": "When you reflect on writing guides versus improving workflows, which type of problem energizes you more?",\n "custom_option_id": "other_focus",\n "custom_placeholder": "Describe what you enjoy most or any specific balance...",\n "options": [\n {\n "id": "content_pedagogy",\n "text": "Crafting clear language, structuring documentation, and teaching users how things work (leaning toward Technical Writing / Education)."\n },\n {\n "id": "systems_tooling",\n "text": "Fixing operational bottlenecks, configuring tools, and streamlining team efficiency (leaning toward Support Operations / RevOps)."\n },\n {\n "id": "hybrid_balance",\n "text": "An even split between both; I want to improve internal systems while also authoring the guides."\n },\n {\n "id": "other_focus",\n "text": "Something else / A different aspect entirely."\n }\n ]\n}\n```\n\n**Recommendation:** If you prefer heads-down focus, communication clarity, and UX empathy, the Technical Writing track generally offers more autonomy. If you prefer problem-solving around tool administration, metrics, and systems logic, Support Operations provides a faster runway into operational leadership and product operations.\n\n---\n\n**Potential next steps:**\n- [Draft an outreach message for informational interviews](/#message=Help%20me%20draft%20a%20concise%20outreach%20message%20to%20send%20to%20a%20Technical%20Writer%20or%20Support%20Ops%20lead%20on%20LinkedIn.)\n- [Outline a support workflow audit template](/#message=Create%20a%20step-by-step%20template%20for%20a%20support%20macro%20and%20workflow%20audit%20experiment.)\n---\n*\u26A0\uFE0F This is educational information only and not professional psychological advice. For mental health concerns, please consult a qualified therapist or counselor. If you\'re experiencing a crisis, contact emergency services or a crisis hotline immediately.*'
71158
+ },
71159
+ follow_up_1: {
71160
+ text: "Search for remote technical writer jobs and requirements"
71161
+ },
71162
+ follow_up_2: {
71163
+ text: "Draft a concise outreach message for a technical writer interview"
71164
+ },
71165
+ follow_up_3: {
71166
+ text: "Create a task list for your thirty day portfolio experiment"
71167
+ },
71168
+ follow_up_4: {
71169
+ text: "Outline a step by step guide for your support workflow audit"
71170
+ },
71171
+ follow_up_5: {
71172
+ text: "Search for support operations certification courses and requirements"
71173
+ },
71174
+ follow_up_6: {
71175
+ text: "Compare the daily responsibilities and growth paths of both roles"
71176
+ }
71177
+ },
69490
71178
  ai_workshops_meetups_berlin: {
69491
71179
  title: {
69492
71180
  text: "AI Workshops and Meetups in Berlin"
@@ -69569,6 +71257,38 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69569
71257
  text: "OpenMates can transcribe short voice notes from the command line."
69570
71258
  }
69571
71259
  },
71260
+ autumn_basil_balcony_care: {
71261
+ title: {
71262
+ text: "Autumn Basil Care on a Berlin Balcony"
71263
+ },
71264
+ summary: {
71265
+ text: "Simple autumn care for basil on an east-facing balcony: light, watering, cold signs, and moving indoors."
71266
+ },
71267
+ message_1: {
71268
+ text: "Could you make a concise beginner-friendly care guide for my sweet basil on an east-facing Berlin balcony this autumn? I mostly need watering, light, cold-weather signs, and when to bring it inside."
71269
+ },
71270
+ message_2: {
71271
+ text: 'Here is a concise, autumn-specific care guide for your sweet basil (*Ocimum basilicum*) on an east-facing balcony in Berlin:\n\n---\n\n### 1. Light (East-Facing Balcony)\n* **What to expect:** In Berlin\u2019s autumn, sunrise is lower and daylight hours drop quickly. An east-facing balcony provides soft morning sun for about 2\u20134 hours, which is on the lower side for sun-loving basil.\n* **Placement:** Place the pot as close to the outer railing as safely possible, away from wall shadows, to maximize unobstructed morning sky exposure.\n* **Reflective trick:** Positioning it against a white or light-colored wall can bounce extra ambient light toward the leaves.\n\n---\n\n### 2. Watering Routine\n* **Rule:** Basil\u2019s water needs drop significantly in cool weather because evaporation slows down and plant growth halts.\n* **Check first:** Water **only** when the top 2\u20133 cm (about an inch) of soil feels dry to the touch. Do not water on a fixed calendar schedule.\n* **Timing:** Always water in the morning with room-temperature water. Avoid cold tap water straight from the pipe, which shocks cool roots.\n* **Drainage:** Never allow the pot to sit in standing saucer water; cool, waterlogged soil leads quickly to root rot (*Fusarium* or water mold).\n\n---\n\n### 3. When to Bring It Inside\n* **Critical threshold:** Basil is a tropical tender herb. It suffers physiological cold stress below **10\xB0C (50\xB0F)** and sustains severe tissue damage or death near **0\xB0C to 4\xB0C**.\n* **Timing for Berlin:** Berlin overnight temperatures often drop below 10\xB0C by late September or early October.\n* **Action:** **Bring it inside now** if night forecasts dip below 10\xB0C.\n\n---\n\n### 4. Signs of Cold & Light Stress\n* **Blackened or translucent leaves:** Clear sign of chilling injury (cellular collapse from temperatures below 8\u201310\xB0C).\n* **Purpling or dulling foliage:** A classic response to cold stress combined with slow nutrient uptake.\n* **Drooping while soil is moist:** Root chill or root rot; the roots are too cold or damaged to take up moisture even if water is present.\n* **Stretching / Pale green growth:** Insufficient sunlight (etiolation).\n\n---\n\n### 5. Moving Indoors: Quick Transition Tips\n1. **Brightest window:** Place it on a south-facing windowsill if available; otherwise, the brightest east- or west-facing window.\n2. **Avoid drafts & radiators:** Keep it away from cold cracked window drafts as well as drying heat blowing directly from a radiator (*Heizung*).\n3. **Pest inspection:** Check leaf undersides for aphids or spider mites before placing it near other indoor houseplants.\n4. **Harvest from the top:** Pinch off flower buds and top leaf pairs to encourage bushiness rather than leggy flowering.\n\n---\n\n```interactive_question\n{\n "type": "choice",\n "id": "basil_indoor_setup",\n "multiple": false,\n "question": "Where are you planning to put your basil once it moves inside?",\n "options": [\n { "id": "south_window", "text": "South- or west-facing sunny windowsill" },\n { "id": "east_window", "text": "Staying near the east window indoors" },\n { "id": "grow_light", "text": "Under a dedicated grow light / LED lamp" },\n { "id": "other_spot", "text": "Another room or location" }\n ],\n "custom_option_id": "other_spot",\n "custom_placeholder": "Describe your indoor spot..."\n}\n```\n\n**Next Steps & Suggestions:**\n* [Set a reminder to check tonight\'s low temperatures in Berlin](/#message=Check%20the%20weather%20forecast%20for%20Berlin%20tonight%20to%20see%20if%20it%20drops%20below%2010C.)\n* [Get tips on preserving a large basil harvest](/#message=How%20can%20I%20harvest%20and%20preserve%20my%20basil%20leaves%20before%20winter?)'
71272
+ },
71273
+ follow_up_1: {
71274
+ text: "Check the current weather forecast and overnight temperatures in Berlin"
71275
+ },
71276
+ follow_up_2: {
71277
+ text: "Explain how to harvest sweet basil to encourage bushier growth"
71278
+ },
71279
+ follow_up_3: {
71280
+ text: "Search for quick methods to preserve fresh basil leaves"
71281
+ },
71282
+ follow_up_4: {
71283
+ text: "Describe signs of root rot and how to rescue waterlogged basil"
71284
+ },
71285
+ follow_up_5: {
71286
+ text: "Search for indoor LED grow light options for herbs"
71287
+ },
71288
+ follow_up_6: {
71289
+ text: "List the best companion plants for indoor potted herbs"
71290
+ }
71291
+ },
69572
71292
  balcony_plant_reminder: {
69573
71293
  title: {
69574
71294
  text: "Balcony Plant Reminder"
@@ -69583,6 +71303,44 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69583
71303
  text: '```json\n{"type": "app_skill_use", "embed_id": "d2acf0ee-89b9-4476-9a35-9de4895158aa", "app_id": "reminder", "skill_id": "set-reminder"}\n```\n\nOK. I\'ve set a reminder for you to water the balcony plants tomorrow, June 8th, at 9:00 AM UTC.\n\nTo make sure you don\'t miss the notification even if you aren\'t using the app, you might want to [enable email notifications](/#settings/apps/reminder) in your account settings.\n\nIs there anything else you\'d like to schedule, or perhaps some tips on balcony gardening?\n\n**Follow-up suggestions:**\n* Would you like to make this a recurring weekly reminder?\n* Do you need help identifying which plants need more or less water?'
69584
71304
  }
69585
71305
  },
71306
+ bayes_theorem_quick_quiz: {
71307
+ title: {
71308
+ text: "Learn Bayes\u2019 Theorem with a Quick Quiz"
71309
+ },
71310
+ summary: {
71311
+ text: "Understand prior and posterior probability through a concrete example, then test your intuition with follow-up questions."
71312
+ },
71313
+ message_1: {
71314
+ text: "I have a statistics exam next week. Could you explain Bayes theorem with one everyday example and then quiz me?"
71315
+ },
71316
+ message_2: {
71317
+ text: '### What is Bayes\u2019 Theorem?\n\n[Bayes\' theorem](wiki:Bayes\'_theorem) is a mathematical rule for updating the probability of an event or hypothesis ($A$) when you observe new evidence ($B$).\n\nIn symbols:\n\n$$P(A|B) = \\frac{P(B|A) \\cdot P(A)}{P(B)}$$\n\nHere is what each component represents:\n* **$P(A)$ \u2014 [Prior probability](wiki:Prior_probability):** Your initial estimate of how likely $A$ is before seeing new data (the baseline or base rate).\n* **$P(B|A)$ \u2014 Likelihood:** The probability of observing evidence $B$ if hypothesis $A$ is actually true.\n* **$P(B)$ \u2014 [Marginal likelihood](wiki:Marginal_likelihood):** The total probability of observing evidence $B$ across all possible scenarios.\n* **$P(A|B)$ \u2014 [Posterior probability](wiki:Posterior_probability):** The updated probability of $A$ given that evidence $B$ occurred.\n\n---\n\n### An Everyday Example: The Rapid Medical Test\n\nImagine you take a rapid screening test for a rare condition:\n\n1. **Base Rate (Prior):** Only **$1\\%$** of people in your population actually have this condition:\n $$P(\\text{Condition}) = 0.01, \\quad P(\\text{Healthy}) = 0.99$$\n2. **Test Sensitivity (Likelihood):** If someone has the condition, the test is positive $90\\%$ of the time:\n $$P(\\text{Positive} \\mid \\text{Condition}) = 0.90$$\n3. **False Positive Rate:** If someone does not have it, the test falsely shows positive $10\\%$ of the time:\n $$P(\\text{Positive} \\mid \\text{Healthy}) = 0.10$$\n\nNow suppose **your test comes back positive**. What is the probability you actually have the condition?\n\n#### Applying the Formula:\nFirst, calculate the total chance of getting a positive test, $P(\\text{Positive})$:\n$$\\begin{aligned}\nP(\\text{Positive}) &= P(\\text{Positive} \\mid \\text{Condition}) \\cdot P(\\text{Condition}) + P(\\text{Positive} \\mid \\text{Healthy}) \\cdot P(\\text{Healthy}) \\\\\n&= (0.90 \\cdot 0.01) + (0.10 \\cdot 0.99) \\\\\n&= 0.009 + 0.099 = 0.108\n\\end{aligned}$$\n\nNow, calculate your posterior probability:\n$$P(\\text{Condition} \\mid \\text{Positive}) = \\frac{0.009}{0.108} \\approx 8.3\\%$$\n\nEven with a $90\\%$ accurate test, the chance of actually having the condition is only around **$8.3\\%$**. Because the condition is rare, false positives from the healthy majority easily outnumber true positives from the sick minority.\n\n---\n\n### Quick Check\n\nLet\u2019s test your understanding of the terms:\n\n```interactive_question\n{\n "type": "choice",\n "id": "bayes_components_quiz_1",\n "multiple": false,\n "question": "In the formula P(A|B) = [P(B|A) * P(A)] / P(B), which term represents our initial belief or baseline rate before any new evidence is observed?",\n "options": [\n { "id": "opt_pa", "text": "P(A) \u2014 Prior probability" },\n { "id": "opt_pba", "text": "P(B|A) \u2014 Likelihood" },\n { "id": "opt_pab", "text": "P(A|B) \u2014 Posterior probability" },\n { "id": "opt_pb", "text": "P(B) \u2014 Marginal probability of evidence" }\n ]\n}\n```'
71318
+ },
71319
+ message_3: {
71320
+ text: "I think P(A) is the prior probability, the starting base rate. Is that right? Could you give me one more short question to try?"
71321
+ },
71322
+ message_4: {
71323
+ text: 'That is spot on. $P(A)$ is the **prior probability**\u2014your baseline or starting belief before factoring in any new observations or test results. In our medical screening example, that was the $1\\%$ general population rate.\n\n---\n\n### Challenge Question: Intuition Check\n\nHere is a quick scenario to test your intuition about how Bayes\' theorem behaves in practice:\n\n```interactive_question\n{\n "type": "choice",\n "id": "bayes_intuition_quiz_2",\n "multiple": false,\n "question": "Suppose a burglar alarm goes off in a neighborhood. If burglary is extremely rare in that area (a very tiny prior probability), what is typically true about the posterior probability that a break-in actually occurred, assuming the alarm has a non-zero false alarm rate?",\n "options": [\n {\n "id": "opt_very_high",\n "text": "The posterior probability is close to 100% because alarms are specifically built to detect break-ins."\n },\n {\n "id": "opt_counterintuitively_low",\n "text": "The posterior probability may remain surprisingly low because false alarms from normal events outnumber true break-ins."\n },\n {\n "id": "opt_equal_to_prior",\n "text": "The posterior probability remains completely unchanged regardless of whether the alarm sounds."\n },\n {\n "id": "opt_independent",\n "text": "The posterior probability depends only on alarm volume, not the baseline frequency of burglaries."\n }\n ]\n}\n```\n\n***\n\n**Suggested Next Steps:**\n* [Calculate a full numerical Bayes problem step-by-step](/#message=Can%20we%20solve%20a%20full%20numerical%20Bayes%20theorem%20exam%20problem%20step%20by%20step%3F)\n* [Review continuous Bayes and conjugate priors](/#message=Can%20you%20explain%20how%20Bayes%20theorem%20works%20with%20continuous%20random%20variables%20and%20priors%3F)'
71324
+ },
71325
+ follow_up_1: {
71326
+ text: "Calculate a custom Bayes theorem probability word problem"
71327
+ },
71328
+ follow_up_2: {
71329
+ text: "Explain the difference between frequentist and Bayesian statistics"
71330
+ },
71331
+ follow_up_3: {
71332
+ text: "Search for practice statistics exam questions on probability"
71333
+ },
71334
+ follow_up_4: {
71335
+ text: "Walk through another Bayes theorem example with multiple outcomes"
71336
+ },
71337
+ follow_up_5: {
71338
+ text: "Find online video tutorials explaining Bayes theorem visually"
71339
+ },
71340
+ follow_up_6: {
71341
+ text: "Test me on calculating posterior probability with numbers"
71342
+ }
71343
+ },
69586
71344
  beautiful_single_page_html: {
69587
71345
  title: {
69588
71346
  text: "Beautiful Single Page HTML"
@@ -69615,6 +71373,38 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69615
71373
  text: "[code] Create a similar template but with a different design aesthetic"
69616
71374
  }
69617
71375
  },
71376
+ beginner_yoga_classes_berlin: {
71377
+ title: {
71378
+ text: "Beginner Yoga Classes in Berlin"
71379
+ },
71380
+ summary: {
71381
+ text: "Find three beginner-friendly yoga classes in Berlin with times, prices, and booking links."
71382
+ },
71383
+ message_1: {
71384
+ text: "I\u2019m new to yoga and would like a beginner-friendly class in Berlin next week. Can you find a few classes with times, prices, and booking links?"
71385
+ },
71386
+ message_2: {
71387
+ text: '```json\n{"type":"app_skill_use","embed_id":"e4569c35-68a2-486d-af5d-dc5600aca187","app_id":"fitness","skill_id":"search_classes"}\n```\n\n```json\n{"type":"app_skill_use","embed_id":"02f512fa-c82a-41c4-b392-1f52e71d63ba","app_id":"events","skill_id":"search"}\n```\n\nHere are beginner-friendly [yoga](wiki:Yoga) classes taking place across Berlin next week:\n\n```embeds_results_view\ntitle: Beginner Yoga Classes in Berlin (Next Week)\nembeds: yoga-for-grounding-TB2, mobility-yoga-optional-qv3, vinyasa-flow-in-a8l\n```\n\n---\n\n### 1. [Yoga for Grounding](embed:yoga-for-grounding-TB2) (Kreuzberg)\n- **What it is:** A mindful class balancing breath-led movement with holding postures to explore alignment and stillness. Designed specifically to be accessible for beginners (held in English).\n- **Date & Time:** Wednesday, October 14, 2026, 18:00 \u2013 19:00 CEST (arrive 10 mins early)\n- **Location:** Art OM, Wrangelstra\xDFe 54, 10997 Berlin ([Kreuzberg](wiki:Kreuzberg))\n- **Price:** \u20AC11.83 \u2013 \u20AC22.49\n- **Booking:** [Book tickets on Eventbrite](embed:yoga-for-grounding-TB2)\n\n### 2. [Mobility Yoga & Optional Bouldering](embed:mobility-yoga-optional-qv3) (Friedrichshain)\n- **What it is:** An informal, relaxed all-levels mobility and yoga session where flows are explained step-by-step at a gentle pace. No prior flexibility or experience required.\n- **Date & Time:** Tuesday, October 13, 2026, 19:00 \u2013 19:45 CEST (arrive 15 mins early)\n- **Location:** Urban Apes Friedrichshain, Friedensstra\xDFe 91 B, Berlin ([Friedrichshain](wiki:Friedrichshain))\n- **Price:** \u20AC5 (free entry with Urban Sports Club / Wellpass if you also boulder)\n- **Booking:** [View details and booking link](embed:mobility-yoga-optional-qv3)\n\n### 3. [Vinyasa Flow](embed:vinyasa-flow-in-a8l) (Wedding / Mitte)\n- **What it is:** A dynamic yet gentle Vinyasa session offering modifications for beginners, focusing on breath awareness, body alignment, and stress release.\n- **Date & Time:** Wednesday, October 14, 2026, 19:30 \u2013 21:00 CEST\n- **Location:** YOGA at Lobe Block UG, B\xF6ttgerstra\xDFe 16, Berlin (Gesundbrunnen / [Mitte](wiki:Mitte))\n- **Price:** \u20AC10 for your first trial class (starter pack: 3 classes for \u20AC20)\n- **Booking:** [RSVP via Berlin Yoga Club Meetup](embed:vinyasa-flow-in-a8l)\n\n---\n\n### Tips for your first yoga class\n* **Attire:** Comfortable, stretchy clothing you can move and bend in easily. Yoga is usually practiced barefoot.\n* **Hydration & Meals:** Avoid heavy meals within 1.5\u20132 hours before class.\n* **Listen to your body:** Let the teacher know before class that it\'s your first time; they will gladly show you adjustments and props (blocks, blankets, or straps). If you have pre-existing joint or back issues, check in with a doctor or physical therapist before trying dynamic sequences.\n\nWould you like recommendations closer to a specific neighborhood (e.g., Neuk\xF6lln, Prenzlauer Berg, Charlottenburg), or focused on a gentle style like [Hatha yoga](wiki:Hatha_yoga) or [Yin yoga](wiki:Yin_yoga)?\n---\n*\u26A0\uFE0F This is educational information only and not medical advice. Consult your doctor for medical decisions.*'
71388
+ },
71389
+ follow_up_1: {
71390
+ text: "Search for yoga classes in Neuk\xF6lln Berlin"
71391
+ },
71392
+ follow_up_2: {
71393
+ text: "Explain what to expect during a first yoga class"
71394
+ },
71395
+ follow_up_3: {
71396
+ text: "Find Hatha yoga workshops next weekend"
71397
+ },
71398
+ follow_up_4: {
71399
+ text: "Compare Vinyasa and Hatha yoga styles"
71400
+ },
71401
+ follow_up_5: {
71402
+ text: "Search for Yin yoga studios in Mitte"
71403
+ },
71404
+ follow_up_6: {
71405
+ text: "List beginner tips for buying a yoga mat"
71406
+ }
71407
+ },
69618
71408
  berlin_ai_founder_meetups_map: {
69619
71409
  title: {
69620
71410
  text: "Berlin AI founder meetups map"
@@ -69629,6 +71419,38 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69629
71419
  text: '```json\n{"type": "app_skill_use", "embed_id": "50dda9ce-723f-4e07-80d1-7da89a80dd39", "app_id": "events", "skill_id": "search", "query": "AI workshop meetup", "provider": "meetup", "providers": ["meetup"], "location": "Berlin, Germany"}\n```\n\nHere are the upcoming AI workshops and meetups in Berlin that are best suited for founders looking to build, validate, and connect with other builders:\n\n1. [Build your first app with AI in one evening](embed:build-your-first-K18) (Luma) \u2014 A hands-on physical workshop focusing on practical agentic coding tools. Perfect for founders who want to move past the chat box and build prototypes.\n2. [Build Fridays Berlin](embed:build-fridays-berlin-O4R) (Meetup / Luma) hosted at Miro Office \u2014 An open work session and networking event specifically designed for founders, engineers, and product people who want to ship product, demo work, and solve blockers with peers.\n3. [Master AI Entrepreneurship Masterclass](embed:master-ai-entrepreneurship-QvO) (Eventbrite) \u2014 Focused on spotting profitable opportunities and validating AI business models.\n4. [Prompt to Profit](embed:prompt-to-profit-3sF) (Eventbrite) \u2014 A practical workshop for leveraging generative AI for business innovation and growth.\n### Best Option for Practical Networking & Building: **Build Fridays Berlin**\nFor a founder prioritizing **practical networking**, [Build Fridays Berlin](embed:build-fridays-berlin-O4R) is the standout choice. Unlike standard lecture-style webinars, it brings active builders together in person (hosted at Miro) with structured intros, open hacking, demo time, and direct feedback from fellow founders and engineers who prefer shipping over talking. \n\nIf you want an intensive technical workshop alongside that, [Build your first app with AI in one evening](embed:build-your-first-K18) is also an excellent hands-on option.\n\nWould you like help preparing a pitch or project demo to bring to one of these sessions?\n\n```embeds_map_view\ntitle: Mapped results\nembeds: build-your-first-K18, build-fridays-berlin-O4R, master-ai-entrepreneurship-QvO, prompt-to-profit-3sF\nhighlight: build-fridays-berlin-O4R\n```'
69630
71420
  }
69631
71421
  },
71422
+ berlin_english_speaking_gp_appointments: {
71423
+ title: {
71424
+ text: "Find an English-speaking GP in Berlin"
71425
+ },
71426
+ summary: {
71427
+ text: "Find appointment options with honest insurance details and practice links."
71428
+ },
71429
+ message_1: {
71430
+ text: "I need an English-speaking GP appointment in Berlin next week. Please compare the earliest options, show their appointment cards, and only state insurance coverage when the booking listing confirms it. If coverage is unclear, say so."
71431
+ },
71432
+ message_2: {
71433
+ text: '```json\n{"type":"app_skill_use","embed_id":"14ccee29-eff7-47e5-8a27-9578da7f6501","app_id":"health","skill_id":"search_appointments"}\n```\n\nHere are the earliest English-speaking GP options in Berlin within the next 7 days that I found. I\u2019m only stating insurance coverage where the booking listing itself indicates it.\n\n[!](embed:hausarztpraxis-adlershof-dr-RRw)\n[!](embed:katrin-reimer-b-bKm)\n[!](embed:die-haus-rzte-Di3)\n[!](embed:hermann-fondis-d6N)\n[!](embed:lubomir-rakita-UPM)\n\n**Earliest options next week**\n1. **Mon 12 Oct, 07:45** \u2014 [Hausarztpraxis Adlershof - Dr. Gilbert B\xFCchner und Kolleg:innen](embed:hausarztpraxis-adlershof-dr-RRw)\n - Address: Albert-Einstein-Stra\xDFe 2, 12489 Berlin\n - Visit type: Erstuntersuchung Neupatient:in\n - Languages shown: German, English\n - **Insurance:** private *(confirmed by listing)*\n\n2. **Mon 12 Oct, 08:00** \u2014 [Katrin Reimer-B\xFCrkle](embed:katrin-reimer-b-bKm)\n - Address: Kapweg 5, 13405 Berlin\n - Visit type: Erstuntersuchung Neupatient:in\n - Languages shown: English\n - **Insurance:** private *(confirmed by listing)*\n\n3. **Mon 12 Oct, 08:00** \u2014 [die Haus\xE4rzte](embed:die-haus-rzte-Di3)\n - Address: Stargarder Stra\xDFe 69, 10437 Berlin\n - Visit type: Akutsprechstunde\n - Languages shown: German, English\n - **Insurance:** unclear *(the listing does not confirm it)*\n\n4. **Mon 12 Oct, 08:00** \u2014 [Hermann Fondis](embed:hermann-fondis-d6N)\n - Address: M\xFCllerstra\xDFe 36, 13353 Berlin\n - Visit type: Erstuntersuchung Neupatient:in\n - Languages shown: German, English\n - **Insurance:** unclear *(the listing does not confirm it)*\n\n5. **Mon 12 Oct, 08:10** \u2014 [Lubomir Rakita](embed:lubomir-rakita-UPM)\n - Address: Wallstra\xDFe 16, 10179 Berlin\n - Visit type: Erstuntersuchung Neupatient:in\n - Languages shown: German, English\n - **Insurance:** unclear *(the listing does not confirm it)*\n\nA couple of notes:\n- I excluded the two earlier options on **9\u201310 Oct** from the comparison above because you asked for **next week** specifically.\n- These results appear to come from Doctolib listings; Jameda coverage was unsupported in this search result set.\n\n```embeds_results_view\ntitle: Earliest English-speaking GP appointments in Berlin next week\nembeds: hausarztpraxis-adlershof-dr-RRw, katrin-reimer-b-bKm, die-haus-rzte-Di3, hermann-fondis-d6N, lubomir-rakita-UPM\n```\n\nIf you want, I can next:\n- narrow this to **public insurance only** where confirmed, or\n- create a short shortlist by **district / distance from your area**.\n---\n*\u26A0\uFE0F This is educational information only and not medical advice. Consult your doctor for medical decisions.*'
71434
+ },
71435
+ follow_up_1: {
71436
+ text: "Search for public insurance GP appointments in Mitte"
71437
+ },
71438
+ follow_up_2: {
71439
+ text: "Filter the appointments to show public insurance only"
71440
+ },
71441
+ follow_up_3: {
71442
+ text: "Find English-speaking doctors near Prenzlauer Berg district"
71443
+ },
71444
+ follow_up_4: {
71445
+ text: "Narrow down the options by neighborhood and distance"
71446
+ },
71447
+ follow_up_5: {
71448
+ text: "Search for specialist medical appointments in Berlin"
71449
+ },
71450
+ follow_up_6: {
71451
+ text: "Explain how to book these doctor appointments online"
71452
+ }
71453
+ },
69632
71454
  berlin_mitte_work_friendly_restaurants: {
69633
71455
  title: {
69634
71456
  text: "Berlin Mitte Work-Friendly Restaurants Map"
@@ -69707,6 +71529,38 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69707
71529
  text: '```json\n{"type": "app_skill_use", "embed_id": "5d80260f-35df-4dd9-ac4f-925c37abc955", "app_id": "weather", "skill_id": "forecast", "query": "Berlin weather forecast", "provider": "Deutscher Wetterdienst (DWD) + Open-Meteo"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "15f125e6-cd71-4a54-9b1b-05d4d5502ed3", "app_id": "images", "skill_id": "search", "query": "Berlin street style June clothing", "provider": "Brave Search"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "b2001641-f4c6-4fd5-adfd-660e74df56f3", "app_id": "images", "skill_id": "search", "query": "Berlin bicycle commuting summer", "provider": "Brave Search"}\n```\n\nThe weather in [Berlin](wiki:Berlin) over the next few days will be a mix of warm sunshine and a brief rainy spell, followed by cooler, breezy conditions. Here is the forecast and what it means for your daily routine.\n\n### \u{1F324}\uFE0F Weather Forecast (June 8 \u2013 June 12)\n\n* **Monday (June 8):** The warmest day of the week. Expect a high of **24.3\xB0C** and a low of **12.1\xB0C**. It will be mostly dry and partly cloudy.\n* **Tuesday (June 9):** A noticeable shift. Temperatures drop to a high of **18.3\xB0C** with a **44% chance of rain** throughout the day. Expect roughly 10 hours of light rain and gusty winds up to 40 km/h.\n* **Wednesday \u2013 Friday (June 10-12):** Consistent "Berlin grey" but mostly dry. Highs will hover between **16\xB0C and 19\xB0C**, with chilly mornings around **10\xB0C**. Friday will be particularly breezy with gusts reaching 40 km/h.\n\n[!](embed:berlin-weather-2026-KeQ)\n[!](embed:berlin-weather-2026-ywP)\n[!](embed:berlin-weather-2026-4Gl)\n\n---\n\n### \u{1F9E5} Practical Clothing Advice\n\nThe key for this week is **layering**. Berlin\u2019s temperature swings between early morning and late afternoon can be significant.\n\n1. **Monday:** Standard summer attire like t-shirts and light trousers. Keep a light sweatshirt or denim jacket in your bag for the morning or if you\'re staying out late.\n2. **Tuesday (The Rain Day):** You will need a reliable waterproof shell or raincoat. Since temperatures are mild (18\xB0C), avoid heavy insulated coats; a breathable rain jacket over a light layer is best to prevent overheating while walking.\n3. **Wed-Fri:** Transition back to "spring" mode. A light bomber jacket, windbreaker, or a medium-weight sweater will be necessary. If you\'re sensitive to the cold, a light scarf can help against the constant breeze.\n\n[!](embed:vogue.com-d6E)\n[!](embed:vogue.com-mqs)\n[!](embed:vogue.com-sZU)\n\n---\n\n### \u{1F6B2} Bike-Commute Advice\n\nBicycle culture in Berlin is resilient, but the wind and rain this week require some preparation.\n\n* **Mind the Wind:** Gusts of 40 km/h on Tuesday and Friday can create a significant [wind chill](wiki:Wind_chill) and make pedaling into a headwind much more exhausting. If you have an e-bike, bump up the assistance; if not, leave 5-10 minutes earlier than usual.\n* **The Tuesday Rain:** If you must cycle on Tuesday, full mudguards (fenders) are a lifesaver for your clothes. Wear waterproof trousers or carry a change of pants. Be cautious of "Berlin cobbles" (Pflasterstein) and tram tracks, as they become incredibly slippery when wet.\n* **Visibility:** With cloudier skies and rain, ensure your bike lights are charged. Even during the day, lights can help you stay visible to drivers during grey, rainy spells.\n\n!\n[!](embed:gettyimages.com-Wh8)\n\n**Next Steps:**\n* Would you like me to find a [local bike shop](/#settings/apps/maps) for a quick tune-up before the windy days?\n* I can also [set a reminder](/#settings/apps/reminder) for Tuesday morning to grab your umbrella or rain gear.'
69708
71530
  }
69709
71531
  },
71532
+ books_after_left_hand_of_darkness: {
71533
+ title: {
71534
+ text: "Books to Read After The Left Hand of Darkness"
71535
+ },
71536
+ summary: {
71537
+ text: "Four thoughtful science fiction recommendations for readers who loved Le Guin\u2019s worldbuilding and social questions."
71538
+ },
71539
+ message_1: {
71540
+ text: "I enjoyed The Left Hand of Darkness for its worldbuilding and social questions. What should I read next, and why?"
71541
+ },
71542
+ message_2: {
71543
+ text: '[The Left Hand of Darkness](wiki:The_Left_Hand_of_Darkness) by [Ursula K. Le Guin](wiki:Ursula_K._Le_Guin) stands out because its worldbuilding isn\'t just scenic backdrop; it operates as an anthropological thought experiment. Le Guin famously described science fiction as a laboratory to ask *"what if?"*\u2014examining how human relationships, institutions, and prejudices reshape themselves when a fundamental variable (such as fixed biological sex) is removed.\n\nHere are four books that continue that kind of worldbuilding and social inquiry:\n\n---\n\n### 1. *The Dispossessed* by Ursula K. Le Guin\n* **The Core Question:** Can a society achieve true freedom without possession, and how does mutual obligation survive institutionalization?\n* **Why It Fits:** Set in the same loose [Hainish Cycle](wiki:Hainish_Cycle) universe, this novel contrasts two neighboring worlds: Anarres, an arid moon founded on anarcho-syndicalism and communal solidarity, and Urras, a resource-rich planet split between competitive capitalism and authoritarian socialism. Where *The Left Hand of Darkness* investigated gender and personal trust (the concept of *shifgrethor*), [The Dispossessed](wiki:The_Dispossessed) examines economics, language, and collective responsibility, asking how communities can nurture the individual while remaining devoted to mutual aid.\n\n### 2. *Dawn* (Lilith\'s Brood / Xenogenesis trilogy) by [Octavia E. Butler](wiki:Octavia_E._Butler)\n* **The Core Question:** What defines human nature, and what happens when survival demands surrendering our drive for hierarchy and biological autonomy?\n* **Why It Fits:** Like Le Guin\u2019s Gethenians, the alien Oankali possess three sexes (male, female, and *ooloi*, who mediate reproduction and genetic exchange). Butler challenges the reader\'s assumptions about consent, family structures, and cooperation. The narrative asks whether humanity\u2019s lethal flaw is the combination of high intelligence paired with an innate drive toward hierarchy\u2014and whether we can evolve beyond domination.\n\n### 3. *Ancillary Justice* by [Ann Leckie](wiki:Ann_Leckie)\n* **The Core Question:** How do imperial institutions shape identity, and what does consciousness look like when separated from individual human form?\n* **Why It Fits:** Leckie\u2019s Radch empire does not divide society along gender lines; in fact, the dominant language lacks gender markers entirely, using feminine pronouns universally. Beyond the linguistic parallel to Le Guin\'s exploration of perception, the story\u2014told from the perspective of an artificial intelligence formerly distributed across a warship and thousands of human "ancillary" bodies\u2014delves into complicity, duty, and individual conscience within an expansionist empire.\n\n### 4. *A Half-Built Garden* by [Ruthanna Emrys](wiki:Ruthanna_Emrys)\n* **The Core Question:** How can human communities organize democratic stewardship to survive ecological collapse, and how do we negotiate with cultures built on fundamentally different values?\n* **Why It Fits:** In a 2080s Earth governed by watershed networks and communal ecological cooperatives, first contact occurs with an alien species offering salvation through migration. It focuses intensively on diplomacy, community consensus, parentage, and societal decision-making, offering the same deliberate, anthropological pacing and ethical nuance found in Le Guin\u2019s works.\n\n---\n\n```interactive_question\n{\n "type": "choice",\n "id": "next_read_focus",\n "multiple": false,\n "question": "Which dimension of The Left Hand of Darkness resonated most with you?",\n "options": [\n {\n "id": "politics_economics",\n "text": "Political philosophy, mutual aid, and contrasting economic systems (Lean towards The Dispossessed)"\n },\n {\n "id": "biology_gender",\n "text": "Biology, alien contact, and redefining kinship or consent (Lean towards Dawn)"\n },\n {\n "id": "identity_language",\n "text": "Language, perspective, and challenging imperial hierarchies (Lean towards Ancillary Justice)"\n },\n {\n "id": "diplomacy_ecology",\n "text": "Ecological stewardship, diplomacy, and community decision-making (Lean towards A Half-Built Garden)"\n }\n ]\n}\n```\n\n---\n\n### Suggested Next Steps\n* [Explore themes of The Dispossessed](/#message=Tell%20me%20more%20about%20the%20philosophical%20themes%20of%20The%20Dispossessed%20by%20Ursula%20K.%20Le%20Guin.)\n* [Compare Genly Ai and Estraven\'s relationship](/#message=Analyze%20the%20relationship%20between%20Genly%20Ai%20and%20Estraven%20in%20The%20Left%20Hand%20of%20Darkness.)'
71544
+ },
71545
+ follow_up_1: {
71546
+ text: "Search for reviews and summaries of The Dispossessed"
71547
+ },
71548
+ follow_up_2: {
71549
+ text: "Explain how the Hainish Cycle novels connect to one another"
71550
+ },
71551
+ follow_up_3: {
71552
+ text: "Find awards won by Ancillary Justice by Ann Leckie"
71553
+ },
71554
+ follow_up_4: {
71555
+ text: "Discuss the role of language in shaping political thought in speculative fiction"
71556
+ },
71557
+ follow_up_5: {
71558
+ text: "Find library availability for Dawn by Octavia E Butler"
71559
+ },
71560
+ follow_up_6: {
71561
+ text: "Compare the alien biology of Gethenians and Oankali"
71562
+ }
71563
+ },
69710
71564
  buck_converters_24v_5v: {
69711
71565
  title: {
69712
71566
  text: "Buck converters for 24V to 5V"
@@ -69753,6 +71607,93 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69753
71607
  text: "[reminder-set-reminder] Set a reminder to follow up in 3 days"
69754
71608
  }
69755
71609
  },
71610
+ calm_manager_follow_up: {
71611
+ title: {
71612
+ text: "Plan a Calm Follow-Up with a Manager"
71613
+ },
71614
+ summary: {
71615
+ text: "Work through a tense conversation and draft a clear, accountable follow-up after priorities changed."
71616
+ },
71617
+ message_1: {
71618
+ text: "I had a tense conversation with my manager today and feel unsettled. Can you help me process what happened and plan a calm follow-up?"
71619
+ },
71620
+ message_2: {
71621
+ text: "It is completely normal to feel unsettled after a difficult exchange with a manager. Conversations involving authority, performance, or mismatched expectations often trigger acute stress and disrupt emotional regulation, leaving you replaying words and second-guessing reactions.\n\nTaking time to step back before responding is the healthiest and most strategic approach.\n\nTo help us structure a clear plan for debriefing what happened and drafting an effective follow-up, **what was the core topic of the discussion, and what specific moment or remark felt most tense for you?**\n---\n*\u26A0\uFE0F This is educational information only and not professional psychological advice. For mental health concerns, please consult a qualified therapist or counselor. If you're experiencing a crisis, contact emergency services or a crisis hotline immediately.*"
71622
+ },
71623
+ message_3: {
71624
+ text: "We disagreed about a deadline for updating the support knowledge base. My manager said I should have flagged the risk sooner, and I felt blamed because priorities had changed twice. I want to own my part without accepting all the blame. What could I say in a short follow-up tomorrow?"
71625
+ },
71626
+ message_4: {
71627
+ text: `Navigating this kind of situation requires balancing [assertiveness](wiki:Assertiveness) with collaborative accountability: acknowledging what was in your control (proactive risk escalation) without accepting a narrative that ignores shifting context (changing priorities).
71628
+
71629
+ ### The Psychological Framework: Accountability vs. Blame
71630
+
71631
+ When managers feel caught off guard, their immediate reflex is often: *"Why wasn't I warned?"* When contributors receive shifting instructions, their reflex is often: *"I was only adapting to what you told me to prioritize."* Both perspectives make sense within their own frame of reference.
71632
+
71633
+ To bridge this constructively:
71634
+ 1. **Validate the process improvement**: Agree that earlier visibility is better for everyone.
71635
+ 2. **Contextualize neutrally without defensiveness**: Describe the priority shifts as the operational trigger for the delay, rather than an excuse.
71636
+ 3. **Focus on the shared objective**: Frame future communication around keeping team resources and timelines clear.
71637
+
71638
+ ---
71639
+
71640
+ ### Option 1: Quick In-Person or Slack/Teams Message
71641
+
71642
+ > *"Hi [Manager's Name], I\u2019ve been reflecting on our discussion yesterday about the support knowledge base deadline. You were right that I should have raised the capacity risk sooner once the other priority shifts came in.*
71643
+ >
71644
+ > *I want to make sure we stay aligned when priorities shift in the future, so I\u2019ll proactively flag timeline trade-offs right away. For the knowledge base, here is where things stand today and what I need to get it wrapped up by [Proposed Date]. Let\u2019s touch base briefly if you\u2019d like to adjust that plan."*
71645
+
71646
+ ---
71647
+
71648
+ ### Option 2: Short, Direct Email or 1-on-1 Opening
71649
+
71650
+ > *"Hi [Manager's Name],*
71651
+ >
71652
+ > *Following up on our conversation yesterday: I took your feedback to heart about flagging risks earlier. When priorities shifted over the last couple of weeks, I focused on absorbing those requests rather than explicitly raising how they impacted the knowledge base timeline.*
71653
+ >
71654
+ > *Going forward, whenever competing priorities arise, I\u2019ll immediately send a quick note outlining the impact on existing deadlines so we can decide together what takes precedence.*
71655
+ >
71656
+ > *Current status of the knowledge base:*
71657
+ > *\u2022 [1\u20132 sentence status update or next milestone]*
71658
+ > *\u2022 Target completion: [Date/Time]*
71659
+ >
71660
+ > *Thanks for the feedback\u2014let me know if you\u2019d like to review the remaining items together."*
71661
+
71662
+ ---
71663
+
71664
+ ### Key Points Why This Works
71665
+ * **Eliminates defensive debate:** You aren't arguing about who was right yesterday; you are defining how priority conflicts are handled tomorrow.
71666
+ * **Demonstrates systemic thinking:** You acknowledge that shifting priorities inherently affect capacity, and the fix is an explicit trade-off agreement.
71667
+ * **Refocuses on delivery:** It ends with a clear path to finishing the actual deliverable.
71668
+
71669
+ ---
71670
+
71671
+ ### Next Steps & Suggestions
71672
+
71673
+ How does one of these sound for your manager's communication style?
71674
+
71675
+ - [Draft an email version of this follow-up](/#message=Help%20me%20format%20this%20into%20a%20formal%20email%20draft%20for%20my%20manager.)
71676
+ - [Practice a mock discussion for a 1-on-1](/#message=Let's%20roleplay%20the%201-on-1%20conversation%20with%20my%20manager.)`
71677
+ },
71678
+ follow_up_1: {
71679
+ text: "Draft a more formal email to my manager about our deadline disagreement"
71680
+ },
71681
+ follow_up_2: {
71682
+ text: "Explain how to set better boundaries when priorities change rapidly"
71683
+ },
71684
+ follow_up_3: {
71685
+ text: "Create a task reminder to send the follow-up message tomorrow morning"
71686
+ },
71687
+ follow_up_4: {
71688
+ text: "Help me roleplay the conversation with my manager to build confidence"
71689
+ },
71690
+ follow_up_5: {
71691
+ text: "Search for articles on managing shifting workplace priorities effectively"
71692
+ },
71693
+ follow_up_6: {
71694
+ text: "Review my response for any unintended defensive language or tones"
71695
+ }
71696
+ },
69756
71697
  cancel_test_reminder: {
69757
71698
  title: {
69758
71699
  text: "Cancel a Scheduled Reminder"
@@ -69795,6 +71736,198 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69795
71736
  text: '```json\n{"type": "app_skill_use", "embed_id": "228d2a03-63cb-483a-b495-45489e55bc10", "app_id": "images", "skill_id": "search", "provider": "Brave Search"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "45e9c346-341e-466e-aed1-67ee1412dce5", "app_id": "web", "skill_id": "search", "query": "Mercedes-Benz 300 SL Gullwing visual identification features", "provider": "Brave"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "d7f2f391-7c8f-44e7-beb4-66bd846dd0ae", "app_id": "images", "skill_id": "search", "query": "Mercedes-Benz 300 SL Gullwing", "provider": "Brave Search"}\n```\n\nThe car in the photo is a **[Mercedes-Benz 300 SL Gullwing](wiki:Mercedes-Benz_300_SL)**.\n\nThis legendary model is most easily identified by its signature upward-opening "gullwing" doors, the prominent horizontal chrome bars flanking the large star in the grille, and the distinctive aerodynamic "eyebrows" positioned over the wheel arches.\n\nBased on the current date of June 15, 2026, this vehicle remains one of the most coveted and valuable collector cars in history.\n\n**Would you like to know more about this car?**\n- I can look up the current [market value and auction history](/#settings/apps/web) for the 300 SL.\n- I can find [technical specifications](/#settings/apps/web) or the history of its development as a racing car.'
69796
71737
  }
69797
71738
  },
71739
+ community_garden_budget_review: {
71740
+ title: {
71741
+ text: "Review a community garden budget PDF"
71742
+ },
71743
+ summary: {
71744
+ text: "Read a fictional budget to compare expenses, funding, and likely missing costs."
71745
+ },
71746
+ message_1: {
71747
+ text: "Could you summarize the largest expenses, total funding, funding gap, and likely missing costs in this attached community garden budget PDF?\n[!](embed:fictional-community-garden-budget-pdf-e1-146e58)"
71748
+ },
71749
+ message_2: {
71750
+ text: '```json\n{"type":"app_skill_use","embed_id":"e3d392de-f8d3-4bbd-a115-df4a3bf95b1c","app_id":"pdf","skill_id":"read"}\n```\n\nHere\u2019s a concise summary of the budget in the attached community garden budget PDF.\n\n## 1) Largest expenses\nRanked from highest to lowest:\n\n1. **Raised-bed lumber and hardware** \u2014 **\u20AC420**\n2. **Soil and compost** \u2014 **\u20AC300**\n3. **Shared hand tools** \u2014 **\u20AC140**\n4. **Watering hoses and connectors** \u2014 **\u20AC95**\n5. **Seeds and seedlings** \u2014 **\u20AC85**\n6. **Opening event supplies** \u2014 **\u20AC75**\n\n## 2) Total planned expenses\nAdding the listed expenses:\n\n- 420 + 300 + 85 + 140 + 95 + 75 = **\u20AC1,115**\n\n## 3) Total expected funding\nListed funding sources:\n\n- **Neighborhood grant** \u2014 \u20AC800\n- **Volunteer donations** \u2014 \u20AC200\n\nTotal funding:\n\n- 800 + 200 = **\u20AC1,000**\n\n## 4) Funding gap\n- **Total expenses:** \u20AC1,115\n- **Total funding:** \u20AC1,000\n- **Funding gap:** **\u20AC115**\n\n## 5) Likely missing costs\nFor a real community garden, this draft likely leaves out some common items:\n\n- **Site preparation** \u2014 clearing, leveling, debris removal\n- **Delivery/transport costs** \u2014 for lumber, soil, compost\n- **Storage/security** \u2014 tool box, shed, locks\n- **Water access fees** \u2014 hookup, meter use, usage charges\n- **Protective materials** \u2014 gloves, wheelbarrow, tarps\n- **Fencing/signage** \u2014 to protect plots and inform neighbors\n- **Ongoing maintenance** \u2014 replacement tools, extra soil, pest control\n- **Insurance/permits** \u2014 if required by the municipality or landowner\n- **Contingency reserve** \u2014 usually useful because small community projects often run over budget\n\n## Quick interpretation\nThe budget is **close to balanced**, but a **\u20AC115 gap** already exists even before likely omitted costs are added. So in practice, the project may need either:\n- a bit more fundraising,\n- some donated materials/tools,\n- or a reduced first-phase scope.\n\nIf you want, I can also turn this into:\n- a **one-paragraph summary for a grant meeting**, or\n- a **clean budget table with percentages by category**.\n---\n*\u26A0\uFE0F This is educational information only and not financial advice. Consult a qualified financial professional or tax advisor for financial decisions.*'
71751
+ },
71752
+ follow_up_1: {
71753
+ text: "Search for local community garden grants and funding opportunities"
71754
+ },
71755
+ follow_up_2: {
71756
+ text: "Compare different fundraising ideas to cover the funding gap"
71757
+ },
71758
+ follow_up_3: {
71759
+ text: "Search for sustainable urban agriculture and community garden guides"
71760
+ },
71761
+ follow_up_4: {
71762
+ text: "Create a one-paragraph summary for a grant meeting"
71763
+ },
71764
+ follow_up_5: {
71765
+ text: "Search for community garden tool storage and security options"
71766
+ },
71767
+ follow_up_6: {
71768
+ text: "List recommended contingency reserves for small community projects"
71769
+ }
71770
+ },
71771
+ community_garden_calendar_invitation: {
71772
+ title: {
71773
+ text: "Community Garden Calendar Invitation"
71774
+ },
71775
+ summary: {
71776
+ text: "Create an importable calendar invitation with a Berlin time zone, event agenda, and reminder for a volunteer planting session."
71777
+ },
71778
+ message_1: {
71779
+ text: "Could you make an importable calendar invitation for a fictional community garden volunteer planting session on Saturday, October 17, 2026, from 10:00 to 12:00 in Europe/Berlin? Use Gartenweg 12, Berlin as a fictional example location, include a short agenda and a 24-hour reminder, and give me the iCalendar text to save as an .ics file."
71780
+ },
71781
+ message_2: {
71782
+ text: 'Here is the standard [iCalendar](wiki:ICalendar) (`.ics`) data for your community garden planting session. It includes the Europe/Berlin timezone definition, event details, an agenda, and a 24-hour display reminder (VALARM).\n\nSave the content below into a text file named `community_garden_planting.ics` and import it into your calendar client (such as Google Calendar, Apple Calendar, or Microsoft Outlook).\n\n```json\n{"type": "code", "embed_id": "6deff7cb-4e99-4dd3-9052-3985e09a9cc9"}\n```\n\n### Event Summary\n* **Date & Time:** Saturday, October 17, 2026, 10:00 \u2013 12:00 CEST\n* **Location:** Gartenweg 12, Berlin\n* **Reminder:** 1 day before (`TRIGGER:-P1D`)\n\n***\n\n**Suggested Next Steps:**\n* [Draft an invitation email for volunteers](/#message=Draft%20a%20friendly%20email%20announcing%20the%20community%20garden%20planting%20session%20on%20October%2017%20with%20the%20attached%20calendar%20invite.)\n* [Prepare a planting & tool checklist document](/#message=Create%20a%20volunteer%20checklist%20document%20for%20the%20community%20garden%20session.)'
71783
+ },
71784
+ follow_up_1: {
71785
+ text: "Search for community garden volunteering tips online"
71786
+ },
71787
+ follow_up_2: {
71788
+ text: "Draft a friendly email inviting volunteers to the planting session"
71789
+ },
71790
+ follow_up_3: {
71791
+ text: "Find upcoming gardening workshops in Berlin"
71792
+ },
71793
+ follow_up_4: {
71794
+ text: "Create a comprehensive tool checklist for the gardening event"
71795
+ },
71796
+ follow_up_5: {
71797
+ text: "Search for beginner-friendly perennial plants online"
71798
+ },
71799
+ follow_up_6: {
71800
+ text: "Explain how to import .ics files into Google Calendar"
71801
+ }
71802
+ },
71803
+ community_garden_planning_mindmap: {
71804
+ title: {
71805
+ text: "Community Garden Planning Mind Map"
71806
+ },
71807
+ summary: {
71808
+ text: "Map the volunteers, planting, budget, and events needed to launch a community garden."
71809
+ },
71810
+ message_1: {
71811
+ text: "Could you make a mind map for planning a community garden, with branches for volunteers, planting, budget, and events?"
71812
+ },
71813
+ message_2: {
71814
+ text: 'Here is a structured mind map covering the four core pillars of planning your community garden:\n\n```json\n{"type": "mindmap", "embed_id": "02d212e1-3648-42f5-8c96-700bd34a5070"}\n```\n\n### Key Considerations for Next Steps\n\n1. **Site Assessment:** Before purchasing supplies, checking soil quality for contaminants like lead and confirming access to reliable municipal or rainwater connections is crucial.\n2. **Community Input:** Involving nearby residents early helps establish shared stewardship and ensures the crops match the neighborhood\'s culinary preferences and cultural traditions.\n\nWould you like to explore:\n- [Draft a volunteer sign-up checklist](/#message=Help%20me%20create%20a%20volunteer%20role%20description%20and%20sign-up%20sheet%20for%20our%20community%20garden.)\n- [Outline a starter budget template](/#message=Create%20a%20starter%20budget%20template%20and%20materials%20list%20for%20a%20community%20garden.)'
71815
+ },
71816
+ follow_up_1: {
71817
+ text: "Search for community garden grant funding opportunities and local agricultural programs"
71818
+ },
71819
+ follow_up_2: {
71820
+ text: "Explain how to conduct a basic soil test for community gardens"
71821
+ },
71822
+ follow_up_3: {
71823
+ text: "Create a starter budget template and materials list for a community garden"
71824
+ },
71825
+ follow_up_4: {
71826
+ text: "List best practices for organizing neighborhood meetings for urban farming projects"
71827
+ },
71828
+ follow_up_5: {
71829
+ text: "Help me create a volunteer role description and sign-up sheet for our community garden"
71830
+ },
71831
+ follow_up_6: {
71832
+ text: "Discuss strategies for maintaining community engagement after the initial launch phase"
71833
+ }
71834
+ },
71835
+ community_garden_sunflower_illustration: {
71836
+ title: {
71837
+ text: "Generate a botanical sunflower illustration"
71838
+ },
71839
+ summary: {
71840
+ text: "Create a text-free sunflower illustration for a community garden handout."
71841
+ },
71842
+ message_1: {
71843
+ text: "Please create a warm botanical illustration of a sunflower for a community garden handout, on a clean light background with no text."
71844
+ },
71845
+ message_2: {
71846
+ text: '```json\n{"type":"app_skill_use","embed_id":"6a3857ca-aa90-486f-b481-4e1df6f95faa","app_id":"images","skill_id":"generate"}\n```\n\nI\'m generating that botanical illustration of the sunflower for your community garden handout now; it\'s currently processing and will appear right here in the chat once complete.\n\n### Quick Design Tips for Community Handouts\n\nTo make your garden handout both inviting and easy to read:\n\n- **Visual Hierarchy & Spacing:** Give the illustration breathing room. Placing it along a margin or header leaves clear space for gardening tips or event details without feeling cluttered.\n- **Color Harmony:** Pull warm tones directly from the artwork\u2014like deep honey gold, olive leaf green, or earthy terracotta\u2014for section headings and borders.\n- **Blending Your Own Art:** If community members or local gardeners create sketches, leaf prints, or photos of your actual garden beds, integrating those alongside digital illustrations creates a wonderful grassroots, welcoming touch.\n\n---\n\n**Next Steps & Options:**\n- [Design a handout layout with headings and tips](/#message=Help%20me%20design%20a%20clean%20layout%20and%20copy%20for%20a%20community%20garden%20handout.)\n- [Suggest a color palette based on sunflowers](/#message=Suggest%20a%20warm%20color%20palette%20and%20typography%20pairing%20for%20a%20botanical%20garden%20flyer.)'
71847
+ },
71848
+ follow_up_1: {
71849
+ text: "Search for local community garden events in the area"
71850
+ },
71851
+ follow_up_2: {
71852
+ text: "Help me write friendly introductory text for the garden handout"
71853
+ },
71854
+ follow_up_3: {
71855
+ text: "Find free SVG plant icons for handout decoration"
71856
+ },
71857
+ follow_up_4: {
71858
+ text: "List essential tips to include in a community garden guide"
71859
+ },
71860
+ follow_up_5: {
71861
+ text: "Search for typography pairing ideas for garden flyers"
71862
+ },
71863
+ follow_up_6: {
71864
+ text: "Explain how to arrange visual elements in a print layout"
71865
+ }
71866
+ },
71867
+ community_garden_volunteer_onboarding: {
71868
+ title: {
71869
+ text: "Community Garden Volunteer Onboarding"
71870
+ },
71871
+ summary: {
71872
+ text: "Create a shareable one-page volunteer guide with first-day tasks, safety basics, and help contacts."
71873
+ },
71874
+ message_1: {
71875
+ text: "Please make a shareable, one-page volunteer onboarding document for a community garden. Keep it under 220 words. Cover arrival, first-day tasks, safety, and how to ask for help. This is a general template, so use placeholders where garden-specific contacts or locations are needed."
71876
+ },
71877
+ message_2: {
71878
+ text: '```json\n{"type": "document", "embed_id": "f40fc42f-df5d-4116-bba3-3500b1805eb5"}\n```\n\nThe onboarding document has been generated above in standard `.docx` format with placeholders (such as `[Coordinator Name]`, `[Check-In Location]`, and `[Phone Number]`) for easy customization. At under 170 words, it fits cleanly on a single printable page.\n\n***\n\n### Suggested Next Steps:\n1. [Customize placeholders with your garden\'s specific details](/#message=Help%20me%20fill%20in%20the%20placeholders%20with%20our%20garden\'s%20specific%20details.)\n2. [Add a volunteer code of conduct or photo release section](/#message=Add%20a%20brief%20volunteer%20code%20of%20conduct%20section%20to%20the%20guide.)'
71879
+ },
71880
+ follow_up_1: {
71881
+ text: "Search for community garden volunteer management best practices"
71882
+ },
71883
+ follow_up_2: {
71884
+ text: "Help me add a volunteer code of conduct section"
71885
+ },
71886
+ follow_up_3: {
71887
+ text: "Create a task list for organizing our volunteer orientation day"
71888
+ },
71889
+ follow_up_4: {
71890
+ text: "Explain how to structure a welcoming orientation checklist"
71891
+ },
71892
+ follow_up_5: {
71893
+ text: "Search for volunteer handbook templates online"
71894
+ },
71895
+ follow_up_6: {
71896
+ text: "List essential safety guidelines for outdoor community spaces"
71897
+ }
71898
+ },
71899
+ community_garden_welcome_melody: {
71900
+ title: {
71901
+ text: "A Melody for a Community Garden Welcome"
71902
+ },
71903
+ summary: {
71904
+ text: "Create a gentle instrumental melody for a community garden welcome video."
71905
+ },
71906
+ message_1: {
71907
+ text: "Could you create a short, gentle instrumental melody for a community garden welcome video, without vocals?"
71908
+ },
71909
+ message_2: {
71910
+ text: '```json\n{"type":"app_skill_use","embed_id":"296e122a-cd23-4fc6-9c27-99f21f8e3401","app_id":"music","skill_id":"generate"}\n```\n\nI\'m creating that gentle instrumental track for your community garden welcome video now. It is currently processing and will appear right here once ready.\n\n[Community gardening](wiki:Community_gardening) projects are a wonderful way to bring neighbors together and foster local biodiversity. While the music generates, would you like help planning the narrative or visual flow of the welcome video?\n\n- [Draft an outline for the welcome video](/#message=Help%20me%20draft%20a%20simple%20storyboard%20or%20script%20for%20our%20community%20garden%20welcome%20video.)\n- [Brainstorm introductory text or voiceover tips](/#message=Give%20me%20some%20ideas%20for%20welcoming%20voiceover%20lines%20for%20our%20garden%20video.)'
71911
+ },
71912
+ follow_up_1: {
71913
+ text: "Search for local community garden events and workshops"
71914
+ },
71915
+ follow_up_2: {
71916
+ text: "Help me draft a storyboard for the garden video"
71917
+ },
71918
+ follow_up_3: {
71919
+ text: "Find stock videos of plants and flowers"
71920
+ },
71921
+ follow_up_4: {
71922
+ text: "Write welcoming voiceover lines for the community video"
71923
+ },
71924
+ follow_up_5: {
71925
+ text: "Search for gardening tips for community projects"
71926
+ },
71927
+ follow_up_6: {
71928
+ text: "Suggest ideas for community garden opening day activities"
71929
+ }
71930
+ },
69798
71931
  creativity_drawing_meetups_berlin: {
69799
71932
  title: {
69800
71933
  text: "Creativity Drawing Meetups Berlin"
@@ -69827,6 +71960,38 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
69827
71960
  text: "What live music or performance events are happening in Berlin next week?"
69828
71961
  }
69829
71962
  },
71963
+ damped_sine_decay_plot: {
71964
+ title: {
71965
+ text: "Damped Sine Wave and Its Envelopes"
71966
+ },
71967
+ summary: {
71968
+ text: "Plot a damped sine wave with its upper and lower envelopes, then understand how the oscillation fades."
71969
+ },
71970
+ message_1: {
71971
+ text: "Can you plot y = e^(-0.2x) sin(3x) for x from 0 to 12, including the upper and lower envelopes, and explain what the graph shows?"
71972
+ },
71973
+ message_2: {
71974
+ text: 'Here is the plot of the function along with its upper and lower bounding envelopes:\n\n```json\n{"type": "math-plot", "embed_id": "9ef899d2-4b73-4c4e-88bf-d4fd31d61e79"}\n```\n\n---\n\n### What the Graph Shows\n\nThis graph is a classic representation of a damped harmonic oscillator, commonly encountered in physics and engineering (such as a vibrating guitar string, a shock absorber, or an electrical [RLC circuit](wiki:RLC_circuit)).\n\n#### 1. The Oscillatory Component: $\\sin(3x)$\n* The term $\\sin(3x)$ generates continuous periodic wave motion.\n* The angular frequency is $\\omega = 3\\text{ rad/s}$, which corresponds to a period of:\n $$T = \\frac{2\\pi}{3} \\approx 2.094$$\n* This means the curve crosses zero every $\\frac{\\pi}{3} \\approx 1.05$ units along the $x$-axis.\n\n#### 2. The Damping Factor: $e^{-0.2x}$\n* The exponential factor $e^{-0.2x}$ describes [exponential decay](wiki:Exponential_decay) with a decay rate parameter of $\\alpha = 0.2$.\n* As $x$ increases, energy is lost from the system due to [damping](wiki:Damping) (such as friction or electrical resistance), shrinking the amplitude over time.\n\n#### 3. The Envelopes: $\\pm e^{-0.2x}$\n* Because the sine function is bounded by $-1 \\le \\sin(3x) \\le 1$, multiplying by the positive term $e^{-0.2x}$ yields:\n $$-e^{-0.2x} \\le e^{-0.2x}\\sin(3x) \\le e^{-0.2x}$$\n* **Upper Envelope ($g(x) = e^{-0.2x}$)**: Forms the smooth upper boundary that caps the positive peaks.\n* **Lower Envelope ($h(x) = -e^{-0.2x}$)**: Forms the symmetric boundary that cradles the negative troughs.\n* The oscillating curve touches the upper envelope whenever $\\sin(3x) = 1$ (at $x = \\frac{\\pi}{6} + \\frac{2\\pi k}{3}$) and the lower envelope whenever $\\sin(3x) = -1$.\n\n---\n\n### Suggested Next Steps\n\n- [Calculate the exact local extrema using the derivative](/#message=Find%20the%20exact%20maxima%20and%20minima%20of%20y%20%3D%20exp(-0.2*x)*sin(3*x)%20using%20calculus)\n- [Compare underdamped vs critically damped systems](/#message=Explain%20the%20difference%20between%20underdamped,%20critically%20damped,%20and%20overdamped%20oscillations)'
71975
+ },
71976
+ follow_up_1: {
71977
+ text: "Calculate the local extrema of this function using calculus"
71978
+ },
71979
+ follow_up_2: {
71980
+ text: "Explain how changing the decay rate parameter affects the curve"
71981
+ },
71982
+ follow_up_3: {
71983
+ text: "Find similar physics formulas for harmonic motion"
71984
+ },
71985
+ follow_up_4: {
71986
+ text: "Describe real-world physical systems modeled by this equation"
71987
+ },
71988
+ follow_up_5: {
71989
+ text: "Search for differential equations describing damped oscillations"
71990
+ },
71991
+ follow_up_6: {
71992
+ text: "Compare this wave behavior with undamped simple harmonic motion"
71993
+ }
71994
+ },
69830
71995
  dashboard_sidebar_svg_icons: {
69831
71996
  title: {
69832
71997
  text: "Dashboard Sidebar SVG Icons"
@@ -70370,6 +72535,44 @@ How are you leaning personally on this issue heading into the dinner? Are you ho
70370
72535
  embed_ref: mastodon-today-is-U4M`
70371
72536
  }
70372
72537
  },
72538
+ mastodon_public_post_themes: {
72539
+ title: {
72540
+ text: "Themes in Mastodon\u2019s Public Posts"
72541
+ },
72542
+ summary: {
72543
+ text: "Summarize themes in recent posts from Mastodon\u2019s official account and explore representative examples."
72544
+ },
72545
+ message_1: {
72546
+ text: "Could you summarize the main themes in recent public posts by the official Mastodon account on mastodon.social, with links to a few examples?"
72547
+ },
72548
+ message_2: {
72549
+ text: '```json\n{"type":"app_skill_use","embed_id":"33ebec48-4730-4b4b-b7d7-f967173ac9b6","app_id":"social_media","skill_id":"get-posts"}\n```\n\nThe request to fetch recent public posts from @Mastodon (`@Mastodon@mastodon.social`) is currently still running in the background and will update the chat once it is ready.\n\nWhile we wait for the feed to load:\n- [Check recent Mastodon blog announcements](/#message=Search%20for%20the%20latest%20official%20Mastodon%20blog%20announcements%20and%20releases.)\n- [Explore the Mastodon roadmap](/#message=What%20are%20the%20major%20features%20currently%20on%20the%20Mastodon%20roadmap%3F)'
72550
+ },
72551
+ message_3: {
72552
+ text: "The posts have loaded now. Could you summarize the main themes and link to three representative posts?"
72553
+ },
72554
+ message_4: {
72555
+ text: '```json\n{"type":"app_skill_use","embed_id":"65b92905-0838-46dd-8fff-8e28cdc8789a","app_id":"social_media","skill_id":"get-posts"}\n```\n\nThe official @Mastodon account on `mastodon.social` highlights several core themes in its recent public posts:\n\n### 1. Major Product Evolution & User Research\nA primary focus has been the groundwork for **Mastodon 5.0**, following their community-wide "Discovery Week" research initiative led by their design team. The team shared previews of a redesigned, calmer interface and an updated composer aimed at making the platform more accessible and user-friendly.\n\n### 2. Community Governance, Policies & Staff Updates\nMastodon regularly communicates governance and policy updates, notably releasing clarifying guidelines around their **Trademark Policy** in direct response to fediverse admin and developer feedback. They also announced key leadership transitions, thanking outgoing community director Hannah Aubry for her contributions.\n\n### 3. Server Spotlights & Fediverse Ecosystem\nThe account actively promotes independent fediverse instances and infrastructure initiatives\u2014such as highlighting themed servers (like Earth.Law) and amplifying industry surveys like IFTAS operations research.\n\n### 4. Community Merchandise & Project Funding\nTo support ongoing open-source development, they share official community merchandise updates, including new plush mascot releases ("Plushtodons").\n\n---\n\n### Three Representative Posts\n\n- **Product Roadmap & Visual Refresh:** [Mastodon 5.0 sneak peek announcement](embed:mastodon-after-publishing-D8d) \u2014 shares a preview of the upcoming 5.0 layout and post composer based on discovery findings.\n- **Policy & Community Feedback:** [Trademark policy guidelines update](embed:mastodon-today-we-YqD) \u2014 outlines revised trademark rules adapted from community input.\n- **Project Support & Merch:** [Plushtodon pre-orders announcement](embed:mastodon-new-plushtodon-A57) \u2014 announces new official plush mascots as a way for supporters to fund development.\n\n---\n\nWould you like to explore any specific topic further?\n- [Read more about Mastodon 5.0 features](/#message=What%20new%20features%20and%20changes%20are%20coming%20in%20Mastodon%205.0%3F)\n- [Review the trademark guidelines](/#message=Summarize%20Mastodon\'s%20updated%20trademark%20policy%20guidelines.)'
72556
+ },
72557
+ follow_up_1: {
72558
+ text: "Search for recent Mastodon blog announcements"
72559
+ },
72560
+ follow_up_2: {
72561
+ text: "Explain how decentralized moderation works on Mastodon"
72562
+ },
72563
+ follow_up_3: {
72564
+ text: "Search for updates on Mastodon 5.0 development"
72565
+ },
72566
+ follow_up_4: {
72567
+ text: "Compare Mastodon 5.0 changes with previous releases"
72568
+ },
72569
+ follow_up_5: {
72570
+ text: "Search for community discussions on Fediverse server moderation"
72571
+ },
72572
+ follow_up_6: {
72573
+ text: "List the key challenges faced by open source platforms"
72574
+ }
72575
+ },
70373
72576
  memory_books_currently_reading: {
70374
72577
  title: {
70375
72578
  text: "Memory Books Currently Reading"
@@ -70839,6 +73042,38 @@ Like [Denis Villeneuve](wiki:Denis_Villeneuve)\u2019s work, *Contact* avoids the
70839
73042
  text: '```json\n{"type": "app_skill_use", "embed_id": "3c8e7c97-7502-4407-a07b-79911ca4bbaf", "app_id": "math", "skill_id": "calculate"}\n```\n\n```json\n{"type": "app_skill_use", "embed_id": "965d7fc9-15be-4eba-a774-b0a16bfa2da7", "app_id": "math", "skill_id": "calculate"}\n```\n\nFor a **\u20AC350,000** mortgage with an annual interest rate of **3.8%** over **25 years**, here is the breakdown of your monthly payments and the total interest you would pay.\n\n### 1. The Formula\nTo calculate the monthly payment ($M$), we use the standard [amortization](wiki:Amortization) formula:\n\n$$M = P \\frac{r(1+r)^n}{(1+r)^n - 1}$$\n\n**Where:**\n* **$P$ (Principal):** \u20AC350,000\n* **$r$ (Monthly Interest Rate):** $3.8\\% / 12$ months = $0.00316667$\n* **$n$ (Total Number of Payments):** $25 \\text{ years} \\times 12 \\text{ months} = 300$\n\n### 2. Monthly Payment Calculation\nBased on the values above, your monthly payment would be:\n**\u20AC1,809.00** Calculation result\n\n### 3. Total Interest Paid\nTo find the total interest, we multiply the monthly payment by the number of months and subtract the original loan amount:\n$$\\text{Total Interest} = (M \\times n) - P$$\n\n* **Total Amount Paid:** \u20AC542,699.39\n* **Total Interest:** **\u20AC192,699.39**\n\n***\n\n### Summary Table\n```json\n{"type": "sheet", "embed_id": "551d18d6-164a-41e3-aaa7-f6c92ca882e9"}\n```\n\n\nKeep in mind that this calculation assumes a [fixed-rate mortgage](wiki:Fixed-rate_mortgage) and does not include additional costs like [home insurance](wiki:Home_insurance), property taxes, or potential bank fees.\n\n**Would you like to see how much you could save by increasing your monthly payment or shortening the term to 20 years?**\n\n**Next Steps:**\n- [Explore 20-year mortgage comparison](/#)\n- [Calculate the impact of an extra \u20AC200/month payment](/#)\n---\n*\u26A0\uFE0F This is educational information only and not financial advice. Consult a qualified financial professional or tax advisor for financial decisions.*'
70840
73043
  }
70841
73044
  },
73045
+ net_cash_from_supplied_balances: {
73046
+ title: {
73047
+ text: "Net Cash from Supplied Balances"
73048
+ },
73049
+ summary: {
73050
+ text: "Calculate net cash from three balances provided by the user and explain checking, savings, and credit card debt."
73051
+ },
73052
+ message_1: {
73053
+ text: "Here are my current balances from statements I have in front of me: checking \u20AC1,850, savings \u20AC4,200, credit card balance owed \u20AC640. Can you show my net cash position and explain what each number means?"
73054
+ },
73055
+ message_2: {
73056
+ text: '```json\n{"type":"app_skill_use","embed_id":"04818ed0-8e67-4cb8-9736-45d5c35d393a","app_id":"math","skill_id":"calculate"}\n```\n\n### Your Net Cash Position\n\nYour **net cash position** is **\u20AC5,410**.\n\nHere is the breakdown:\n\n```json\n{"type": "sheet", "embed_id": "3db1b137-abac-48a5-8c18-31ef7821ec04"}\n```\n\n---\n\n### What Each Number Means\n\n1. **Checking Account (\u20AC1,850): Operational Cash (Working Capital)**\n * This is your most liquid [cash](wiki:Cash) pool, meant to cover regular recurring living costs (rent/mortgage, utilities, groceries, subscriptions).\n * Having \u20AC1,850 provides an immediate buffer to prevent overdraft fees or missed payment deadlines while waiting for incoming income.\n\n2. **Savings Account (\u20AC4,200): Safety Margin & Reserves**\n * This represents parked funds intended for an [emergency fund](wiki:Emergency_fund) or medium-term financial goals.\n * Unlike checking, this cash is separated to discourage day-to-day spending and typically earns some interest while remaining easily accessible if unexpected costs arise.\n\n3. **Credit Card Balance (\u20AC640): Short-Term [Debt](wiki:Debt)**\n * This is a liability owed to the card issuer. If paid in full before the statement grace period expires, it incurs zero interest.\n * However, if carried past the due date, credit cards generally carry high interest rates (APR), which quickly erode your net cash.\n\n4. **Net Cash Position (\u20AC5,410): True Immediate Liquidity**\n * This metric measures what would remain in liquid cash if you settled your current short-term credit card debt immediately.\n * A positive figure indicates you are fully liquid and solvent against current card obligations, with \u20AC5,410 remaining in reserve.\n\n---\n\n### Suggested Next Steps\n\nWould you like to explore how this fits into your broader financial plan?\n\n* [Set up an emergency fund plan](/#message=Help%20me%20evaluate%20if%20my%20%E2%82%AC4%2C200%20savings%20is%20an%20adequate%20emergency%20fund%20based%20on%20my%20monthly%20expenses.)\n* [Create a monthly budget framework](/#message=Suggest%20a%20monthly%20budget%20framework%20based%20on%20my%20current%20cash%20position.)\n---\n*\u26A0\uFE0F This is educational information only and not financial advice. Consult a qualified financial professional or tax advisor for financial decisions.*'
73057
+ },
73058
+ follow_up_1: {
73059
+ text: "Search for recommended emergency fund savings benchmarks online"
73060
+ },
73061
+ follow_up_2: {
73062
+ text: "Explain the difference between net cash and net worth"
73063
+ },
73064
+ follow_up_3: {
73065
+ text: "Calculate how long my current savings will cover monthly living expenses"
73066
+ },
73067
+ follow_up_4: {
73068
+ text: "List strategies to pay off short-term credit card debt quickly"
73069
+ },
73070
+ follow_up_5: {
73071
+ text: "Search for credit card interest rate reduction tips"
73072
+ },
73073
+ follow_up_6: {
73074
+ text: "Help me evaluate whether my \u20AC4,200 savings is an adequate emergency fund"
73075
+ }
73076
+ },
70842
73077
  nonprofit_event_planning_use_case: {
70843
73078
  title: {
70844
73079
  text: "Nonprofit Event Planning Use Case"
@@ -71562,6 +73797,38 @@ Since we're starting with a blank slate, is there anything you'd like to get off
71562
73797
  *\u26A0\uFE0F This is educational information only and not professional psychological advice. For mental health concerns, please consult a qualified therapist or counselor. If you're experiencing a crisis, contact emergency services or a crisis hotline immediately.*`
71563
73798
  }
71564
73799
  },
73800
+ urban_heat_island_at_night: {
73801
+ title: {
73802
+ text: "Why Cities Stay Hot at Night"
73803
+ },
73804
+ summary: {
73805
+ text: "A simple explanation of the urban heat island effect and why city streets cool more slowly after sunset."
73806
+ },
73807
+ message_1: {
73808
+ text: "Why do some cities feel much hotter than nearby rural areas at night? Could you explain the urban heat island effect with a simple example?"
73809
+ },
73810
+ message_2: {
73811
+ text: 'The phenomenon you are describing is known as the **[urban heat island](wiki:Urban_heat_island)** (UHI) effect. While cities can be slightly warmer during the day, the temperature difference is often most pronounced after sunset\u2014sometimes keeping cities anywhere from 2\xB0C to over 10\xB0C (4\xB0F to 18\xB0F) warmer than surrounding rural countryside.\n\n---\n\n### A Simple Everyday Analogy: The Cast-Iron Skillet vs. The Garden Bed\n\nImagine you are standing outside on a sunny afternoon with two items:\n1. A **heavy cast-iron skillet**\n2. A **pot of damp garden soil with grass**\n\nDuring a hot afternoon, the sun beats down on both:\n* The **cast-iron skillet** absorbs intense heat, becomes searingly hot, and stores that thermal energy inside its dense metal body.\n* The **damp soil and grass** also absorb sunlight, but the moisture in the soil evaporates and the grass "sweats" through transpiration. That process of [evapotranspiration](wiki:Evapotranspiration) consumes a large portion of the sun\u2019s energy, keeping the plant and soil significantly cooler.\n\nNow, take both inside a cooler room or wait until nightfall:\n* The garden bed cools down almost immediately because it didn\'t hold onto excess heat and continues to lose moisture.\n* The cast-iron skillet, however, acts as a **thermal battery**. Long after the sun goes down, it slowly radiates all that trapped heat into the surrounding air, keeping the immediate space warm for hours.\n\nA **city** acts like millions of interconnected cast-iron skillets; the **rural countryside** behaves like the damp garden bed.\n\n---\n\n### The Science Behind Why Cities Stay Hot at Night\n\nThe nighttime disparity comes down to several key thermodynamic and physical factors:\n\n#### 1. High Thermal Mass (Heat Retention)\nUrban environments are built out of asphalt, concrete, brick, and stone. These materials have a high [volumetric heat capacity](wiki:Volumetric_heat_capacity) and thermal conductivity. During the day, they soak up solar radiation deep into structures and pavements. At night, as the ambient air cools, these materials release that stored heat back into the lower atmosphere via longwave thermal radiation.\n\n#### 2. Loss of Evaporative Cooling\nRural landscapes are covered in trees, crops, and moist soil. Plants draw water from the ground and release water vapor into the air through transpiration. Because converting liquid water into vapor requires a significant amount of energy (the [latent heat](wiki:Latent_heat) of vaporization), this naturally cools the surrounding environment. In cities, rain is quickly diverted into storm drains via impermeable surfaces, leaving very little moisture available for evaporative cooling.\n\n#### 3. Urban Canyon Geometry\nIn dense cities with tall buildings, streets form "urban canyons." During the day, multiple reflective surfaces bounce sunlight deeper into the street rather than reflecting it back to space. At night, the buildings partially block the sky (reducing what meteorologists call the sky view factor). Instead of escaping freely into the upper atmosphere, heat radiated from the street gets absorbed or reflected back by the walls of adjacent buildings.\n\n#### 4. Anthropogenic Heat (Human-Generated Energy)\nCities continuously produce their own heat independent of the sun. Air conditioning units, vehicle engines, data centers, factories, and building lighting all expel waste heat directly into the street-level atmosphere, reinforcing nighttime warmth.\n\n---\n\n### Mitigating the Effect\n\nCommunities and urban planners frequently adopt strategies that counter these mechanisms:\n* **Cool Pavements & Roofs:** Using high-[albedo](wiki:Albedo) (reflective) coatings so surfaces reflect sunlight rather than absorbing it.\n* **Urban Greening & Tree Canopies:** Planting street trees and creating parks to restore shade and evapotranspiration.\n* **Green Roofs:** Installing vegetation on rooftops to insulate buildings and cool the local microclimate.\n\n---\n\n```interactive_question\n{\n "type": "choice",\n "id": "uhi_interest_followup",\n "multiple": false,\n "question": "Which aspect of the urban heat island effect would you like to explore next?",\n "options": [\n { "id": "solutions", "text": "Architectural and urban design solutions (e.g., green roofs, cool materials)" },\n { "id": "climate_health", "text": "Impacts on public health, air quality, and climate resilience" },\n { "id": "measurement", "text": "How scientists measure and map surface vs. atmospheric heat islands" }\n ]\n}\n```\n\nWould you like to examine how specific urban planning choices in your local area affect nighttime cooling, or explore one of the topics above?'
73812
+ },
73813
+ follow_up_1: {
73814
+ text: "Search for urban planning strategies that reduce heat islands"
73815
+ },
73816
+ follow_up_2: {
73817
+ text: "Explain how scientists distinguish between surface and atmospheric heat islands"
73818
+ },
73819
+ follow_up_3: {
73820
+ text: "Find academic papers measuring urban surface temperature anomalies"
73821
+ },
73822
+ follow_up_4: {
73823
+ text: "Discuss the public health impacts of extreme nighttime urban temperatures"
73824
+ },
73825
+ follow_up_5: {
73826
+ text: "Search for green roof design case studies in cities"
73827
+ },
73828
+ follow_up_6: {
73829
+ text: "Describe how urban canyon geometry traps radiated heat at night"
73830
+ }
73831
+ },
71565
73832
  us_egg_prices_deep_research: {
71566
73833
  title: {
71567
73834
  text: "Why US Egg Prices Stayed High"
@@ -71704,6 +73971,48 @@ As of mid-2026, the severe supply shocks from the 2024\u20132025 avian flu have
71704
73971
  follow_up_6: {
71705
73972
  text: "Summarize key financial metrics for VITL"
71706
73973
  }
73974
+ },
73975
+ voice_note_transcription_action_item: {
73976
+ title: {
73977
+ text: "Transcribe a Short Voice Note"
73978
+ },
73979
+ summary: {
73980
+ text: "Transcribe a short recording and check whether it contains a task to follow up."
73981
+ },
73982
+ message_1: {
73983
+ text: "Could you transcribe this short recording and tell me whether it includes an action item?\n[!](embed:transcription-demo-voice-note-wav-ab2ed0-823c8695-2632-495a-9bff-9e66a805d114)"
73984
+ },
73985
+ message_2: {
73986
+ text: `Here is the transcription of your recording:
73987
+
73988
+ > *"Real-time transcription is working correctly in OpenMates."*
73989
+
73990
+ ### Does it contain an action item?
73991
+ **No.** The recording is simply an informational status update confirming that the transcription feature is functional. It does not mention any tasks, deadlines, or requested follow-up actions.
73992
+
73993
+ ---
73994
+
73995
+ **Next steps you might consider:**
73996
+ - If you'd like to test a recording that does contain tasks, feel free to share another voice note!`
73997
+ },
73998
+ follow_up_1: {
73999
+ text: "Search for voice memo transcription apps with task extraction features"
74000
+ },
74001
+ follow_up_2: {
74002
+ text: "Explain how automatic action item detection works in AI models"
74003
+ },
74004
+ follow_up_3: {
74005
+ text: "Transcribe another audio file to test task detection"
74006
+ },
74007
+ follow_up_4: {
74008
+ text: "List tips for recording clear voice notes with actionable steps"
74009
+ },
74010
+ follow_up_5: {
74011
+ text: "Create a new task for reviewing voice recording features"
74012
+ },
74013
+ follow_up_6: {
74014
+ text: "Compare different methods for turning spoken ideas into organized tasks"
74015
+ }
71707
74016
  }
71708
74017
  },
71709
74018
  focus_modes: {
@@ -89170,10 +91479,29 @@ var TuiTerminal = class {
89170
91479
  active = false;
89171
91480
  suspended = false;
89172
91481
  selectingText = false;
91482
+ paintedSelection = false;
91483
+ paintedRows = null;
91484
+ paintedCursor = null;
91485
+ paintedWidth = 0;
91486
+ paintedHeight = 0;
91487
+ outputBlocked = false;
91488
+ pendingFrame = null;
91489
+ outputDrained = () => {
91490
+ this.output.off("drain", this.outputDrained);
91491
+ this.outputBlocked = false;
91492
+ const pending = this.pendingFrame;
91493
+ this.pendingFrame = null;
91494
+ if (pending && this.active && !this.suspended) this.paint(pending);
91495
+ };
91496
+ resized = () => {
91497
+ this.paintedRows = null;
91498
+ };
89173
91499
  keyInput = new PassThrough();
89174
91500
  decoder = new StringDecoder("utf8");
89175
91501
  pendingInput = "";
91502
+ pendingInputBlocked = false;
89176
91503
  pendingMouse = "";
91504
+ pendingMouseBlocked = false;
89177
91505
  discardingMouse = false;
89178
91506
  paste = false;
89179
91507
  pasteText = "";
@@ -89203,10 +91531,14 @@ var TuiTerminal = class {
89203
91531
  }
89204
91532
  enter() {
89205
91533
  if (this.active) return;
91534
+ this.resetPaint();
91535
+ this.selectingText = false;
91536
+ this.paintedSelection = false;
89206
91537
  this.active = true;
89207
91538
  this.rawWasEnabled = Boolean(this.input.isRaw);
89208
91539
  emitKeypressEvents(this.keyInput);
89209
91540
  this.input.on("data", this.rawInput);
91541
+ this.output.on("resize", this.resized);
89210
91542
  if (typeof this.input.setRawMode === "function") {
89211
91543
  this.input.setRawMode(true);
89212
91544
  }
@@ -89219,6 +91551,7 @@ var TuiTerminal = class {
89219
91551
  }
89220
91552
  leave() {
89221
91553
  if (!this.active) return;
91554
+ this.resetPaint();
89222
91555
  this.removeListeners();
89223
91556
  this.output.write("\x1B[?25h");
89224
91557
  this.output.write("\x1B[?2004l");
@@ -89229,17 +91562,23 @@ var TuiTerminal = class {
89229
91562
  }
89230
91563
  this.input.pause();
89231
91564
  this.active = false;
91565
+ this.selectingText = false;
91566
+ this.paintedSelection = false;
89232
91567
  }
89233
91568
  async suspend(run) {
89234
91569
  this.suspended = true;
91570
+ this.resetPaint();
89235
91571
  this.input.off("data", this.rawInput);
91572
+ this.output.off("resize", this.resized);
89236
91573
  if (this.resizeHandler) this.output.off("resize", this.resizeHandler);
89237
91574
  if (this.inputTimer) clearTimeout(this.inputTimer);
89238
91575
  if (this.mouseTimer) clearTimeout(this.mouseTimer);
89239
91576
  this.mouseTimer = null;
89240
91577
  this.inputTimer = null;
89241
91578
  this.pendingInput = "";
91579
+ this.pendingInputBlocked = false;
89242
91580
  this.pendingMouse = "";
91581
+ this.pendingMouseBlocked = false;
89243
91582
  this.discardingMouse = false;
89244
91583
  this.paste = false;
89245
91584
  this.pasteText = "";
@@ -89258,6 +91597,7 @@ var TuiTerminal = class {
89258
91597
  while (this.input.read() !== null) {
89259
91598
  }
89260
91599
  this.input.on("data", this.rawInput);
91600
+ this.output.on("resize", this.resized);
89261
91601
  if (this.resizeHandler) this.output.on("resize", this.resizeHandler);
89262
91602
  if (typeof this.input.setRawMode === "function") {
89263
91603
  this.input.setRawMode(true);
@@ -89268,6 +91608,7 @@ var TuiTerminal = class {
89268
91608
  this.output.write("\x1B[?2004h");
89269
91609
  this.output.write(this.selectingText ? "\x1B[?1000l\x1B[?1006l" : "\x1B[?1000h\x1B[?1006h");
89270
91610
  this.output.write("\x1B[2J\x1B[H");
91611
+ this.paintedSelection = this.selectingText;
89271
91612
  }
89272
91613
  }
89273
91614
  }
@@ -89283,18 +91624,51 @@ var TuiTerminal = class {
89283
91624
  }
89284
91625
  render(frame, cursor = null, selectingText = false) {
89285
91626
  if (!this.active || this.suspended) return;
89286
- if (selectingText && this.selectingText) return;
89287
- const mouse = selectingText ? "\x1B[?1000l\x1B[?1006l" : this.selectingText ? "\x1B[?1000h\x1B[?1006h" : "";
91627
+ if (selectingText && this.selectingText && this.paintedRows !== null) return;
89288
91628
  this.selectingText = selectingText;
89289
- const rows2 = frame.split("\n").slice(0, this.height);
89290
- const body = rows2.map((row3, index) => `\x1B[${index + 1};1H\x1B[2K${row3}`).join("");
89291
- const tail = rows2.length < this.height ? `\x1B[${rows2.length + 1};1H\x1B[J` : "";
89292
- const caret = cursor && !selectingText && cursor.row >= 0 && cursor.row < this.height && cursor.column >= 0 && cursor.column < this.width ? `\x1B[${cursor.row + 1};${cursor.column + 1}H\x1B[?25h` : "";
89293
- this.output.write(`\x1B[?2026h\x1B[?25l${mouse}${body}${tail}${caret}\x1B[?2026l`);
91629
+ const next = { frame, cursor, selectingText };
91630
+ if (this.outputBlocked) {
91631
+ this.pendingFrame = next;
91632
+ return;
91633
+ }
91634
+ this.paint(next);
91635
+ }
91636
+ paint({ frame, cursor, selectingText }) {
91637
+ const width = this.width;
91638
+ const height = this.height;
91639
+ const rows2 = frame.split("\n").slice(0, height);
91640
+ const repaint = this.paintedRows === null || width !== this.paintedWidth || height !== this.paintedHeight;
91641
+ const body = rows2.map((row3, index) => repaint || row3 !== this.paintedRows?.[index] ? `\x1B[${index + 1};1H\x1B[2K${row3}` : "").join("");
91642
+ const tail = !repaint && this.paintedRows !== null && rows2.length < this.paintedRows.length ? `\x1B[${rows2.length + 1};1H\x1B[J` : "";
91643
+ const nextCursor = cursor && !selectingText && cursor.row >= 0 && cursor.row < height && cursor.column >= 0 && cursor.column < width ? cursor : null;
91644
+ const cursorChanged = nextCursor?.row !== this.paintedCursor?.row || nextCursor?.column !== this.paintedCursor?.column;
91645
+ const mouse = selectingText !== this.paintedSelection ? selectingText ? "\x1B[?1000l\x1B[?1006l" : "\x1B[?1000h\x1B[?1006h" : "";
91646
+ if (!body && !tail && !cursorChanged && !mouse) return;
91647
+ const caret = nextCursor ? `\x1B[${nextCursor.row + 1};${nextCursor.column + 1}H\x1B[?25h` : "";
91648
+ const accepted = this.output.write(`\x1B[?2026h\x1B[?25l${mouse}${repaint ? "\x1B[2J" : ""}${body}${tail}${caret}\x1B[?2026l`);
91649
+ this.paintedRows = rows2;
91650
+ this.paintedWidth = width;
91651
+ this.paintedHeight = height;
91652
+ this.paintedCursor = nextCursor;
91653
+ this.paintedSelection = selectingText;
91654
+ if (!accepted) {
91655
+ this.outputBlocked = true;
91656
+ this.output.on("drain", this.outputDrained);
91657
+ }
91658
+ }
91659
+ resetPaint() {
91660
+ this.output.off("drain", this.outputDrained);
91661
+ this.outputBlocked = false;
91662
+ this.pendingFrame = null;
91663
+ this.paintedRows = null;
91664
+ this.paintedCursor = null;
91665
+ this.paintedWidth = 0;
91666
+ this.paintedHeight = 0;
89294
91667
  }
89295
91668
  receiveInput(text7) {
89296
91669
  if (this.inputTimer) clearTimeout(this.inputTimer);
89297
91670
  this.inputTimer = null;
91671
+ const blockedAtStart = this.pendingInputBlocked || this.outputBlocked;
89298
91672
  this.pendingInput += text7;
89299
91673
  const marker = this.paste ? "\x1B[201~" : "\x1B[200~";
89300
91674
  const found = this.pendingInput.indexOf(marker);
@@ -89305,14 +91679,16 @@ var TuiTerminal = class {
89305
91679
  this.keyHandler?.(this.pasteText, { name: "paste" });
89306
91680
  this.pasteText = "";
89307
91681
  } else {
89308
- this.dispatchInput(before);
91682
+ this.dispatchInput(before, blockedAtStart);
89309
91683
  if (this.mouseTimer) clearTimeout(this.mouseTimer);
89310
91684
  this.mouseTimer = null;
89311
91685
  this.pendingMouse = "";
91686
+ this.pendingMouseBlocked = false;
89312
91687
  this.discardingMouse = false;
89313
91688
  }
89314
91689
  this.paste = !this.paste;
89315
91690
  this.pendingInput = this.pendingInput.slice(found + marker.length);
91691
+ this.pendingInputBlocked = false;
89316
91692
  this.receiveInput("");
89317
91693
  return;
89318
91694
  }
@@ -89320,20 +91696,24 @@ var TuiTerminal = class {
89320
91696
  for (let i = 1; i < marker.length; i++) if (this.pendingInput.endsWith(marker.slice(0, i))) trailing = i;
89321
91697
  const ready2 = this.pendingInput.slice(0, this.pendingInput.length - trailing);
89322
91698
  this.pendingInput = trailing ? this.pendingInput.slice(-trailing) : "";
91699
+ this.pendingInputBlocked = Boolean(trailing) && blockedAtStart;
89323
91700
  if (this.paste) this.pasteText = (this.pasteText + ready2).slice(0, 131072);
89324
- else if (ready2) this.dispatchInput(ready2);
91701
+ else if (ready2) this.dispatchInput(ready2, blockedAtStart);
89325
91702
  if (trailing && !this.paste) this.inputTimer = setTimeout(() => {
89326
- this.dispatchInput(this.pendingInput);
91703
+ this.dispatchInput(this.pendingInput, this.pendingInputBlocked);
89327
91704
  this.pendingInput = "";
91705
+ this.pendingInputBlocked = false;
89328
91706
  this.inputTimer = null;
89329
91707
  }, 30);
89330
91708
  }
89331
91709
  /** Keep SGR mouse bytes out of readline, including malformed and split reports. */
89332
- dispatchInput(text7) {
91710
+ dispatchInput(text7, blockedAtStart = false) {
89333
91711
  if (this.mouseTimer) clearTimeout(this.mouseTimer);
89334
91712
  this.mouseTimer = null;
89335
91713
  const input = this.pendingMouse + text7;
89336
91714
  this.pendingMouse = "";
91715
+ const blockedMouse = blockedAtStart || this.pendingMouseBlocked || this.outputBlocked;
91716
+ this.pendingMouseBlocked = false;
89337
91717
  let offset = 0;
89338
91718
  if (this.discardingMouse) {
89339
91719
  const end = input.search(/[mM\x1b]/);
@@ -89347,7 +91727,7 @@ var TuiTerminal = class {
89347
91727
  const rest = input.slice(offset);
89348
91728
  const prefix = rest.endsWith("\x1B[") ? "\x1B[" : rest.endsWith("\x1B") ? "\x1B" : "";
89349
91729
  this.keyInput.write(prefix ? rest.slice(0, -prefix.length) : rest);
89350
- if (prefix) this.holdMousePrefix(prefix);
91730
+ if (prefix) this.holdMousePrefix(prefix, blockedMouse);
89351
91731
  break;
89352
91732
  }
89353
91733
  this.keyInput.write(input.slice(offset, start));
@@ -89360,13 +91740,13 @@ var TuiTerminal = class {
89360
91740
  offset = nextEscape;
89361
91741
  continue;
89362
91742
  }
89363
- if (input.length - start < 128) this.holdMousePrefix(input.slice(start));
91743
+ if (input.length - start < 128) this.holdMousePrefix(input.slice(start), blockedMouse);
89364
91744
  else this.discardingMouse = true;
89365
91745
  break;
89366
91746
  }
89367
91747
  const sequence = input.slice(start, end + 1);
89368
91748
  const report = /^\x1b\[<(\d+);(\d+);(\d+)([mM])$/.exec(sequence);
89369
- if (report) {
91749
+ if (report && !blockedMouse && !this.outputBlocked) {
89370
91750
  const button = Number(report[1]);
89371
91751
  const column = Number(report[2]);
89372
91752
  const row3 = Number(report[3]);
@@ -89382,11 +91762,13 @@ var TuiTerminal = class {
89382
91762
  offset = end + 1;
89383
91763
  }
89384
91764
  }
89385
- holdMousePrefix(prefix) {
91765
+ holdMousePrefix(prefix, blocked) {
89386
91766
  this.pendingMouse = prefix;
91767
+ this.pendingMouseBlocked = blocked;
89387
91768
  this.mouseTimer = setTimeout(() => {
89388
91769
  const pending = this.pendingMouse;
89389
91770
  this.pendingMouse = "";
91771
+ this.pendingMouseBlocked = false;
89390
91772
  this.mouseTimer = null;
89391
91773
  if (pending === "\x1B") this.keyHandler?.("\x1B", { name: "escape", sequence: pending });
89392
91774
  else if (pending === "\x1B[") this.keyInput.write(pending);
@@ -89399,12 +91781,15 @@ var TuiTerminal = class {
89399
91781
  this.keyHandler = null;
89400
91782
  }
89401
91783
  this.input.off("data", this.rawInput);
91784
+ this.output.off("resize", this.resized);
89402
91785
  if (this.inputTimer) clearTimeout(this.inputTimer);
89403
91786
  if (this.mouseTimer) clearTimeout(this.mouseTimer);
89404
91787
  this.mouseTimer = null;
89405
91788
  this.inputTimer = null;
89406
91789
  this.pendingInput = "";
91790
+ this.pendingInputBlocked = false;
89407
91791
  this.pendingMouse = "";
91792
+ this.pendingMouseBlocked = false;
89408
91793
  this.discardingMouse = false;
89409
91794
  this.paste = false;
89410
91795
  this.pasteText = "";
@@ -93410,13 +95795,16 @@ var ACCENT = "#80caff";
93410
95795
  var LINK = "#85c9e8";
93411
95796
  var CODE = "#b8b8b8";
93412
95797
  var segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
93413
- function append(out, value, style = {}) {
93414
- const text7 = terminalText(value);
95798
+ var INLINE_BOUNDARY = /[\\`[*_\x1b]/;
95799
+ function appendSanitized(out, text7, style = {}) {
93415
95800
  if (!text7) return;
93416
95801
  const last = out.at(-1);
93417
- if (last && last.bold === style.bold && last.color === style.color && last.background === style.background && JSON.stringify(last.action) === JSON.stringify(style.action)) last.text += text7;
95802
+ if (last && last.bold === style.bold && last.color === style.color && last.background === style.background && (last.action === style.action || !last.action && !style.action || Boolean(last.action && style.action && JSON.stringify(last.action) === JSON.stringify(style.action)))) last.text += text7;
93418
95803
  else out.push({ text: text7, bold: style.bold, color: style.color, background: style.background, action: style.action });
93419
95804
  }
95805
+ function append(out, value, style = {}) {
95806
+ appendSanitized(out, terminalText(value), style);
95807
+ }
93420
95808
  function closing(source, from, delimiter) {
93421
95809
  for (let i = from; i <= source.length - delimiter.length; i++) {
93422
95810
  if (source[i] === "\\") {
@@ -93460,6 +95848,13 @@ function safeReference(value) {
93460
95848
  function inline(source, options, base = {}) {
93461
95849
  const out = [];
93462
95850
  for (let i = 0; i < source.length; ) {
95851
+ if (!INLINE_BOUNDARY.test(source[i])) {
95852
+ let end = i + 1;
95853
+ while (end < source.length && !INLINE_BOUNDARY.test(source[end])) end++;
95854
+ append(out, source.slice(i, end), base);
95855
+ i = end;
95856
+ continue;
95857
+ }
93463
95858
  if (source[i] === "\\" && i + 1 < source.length) {
93464
95859
  append(out, source[i + 1], base);
93465
95860
  i += 2;
@@ -93498,7 +95893,7 @@ function inline(source, options, base = {}) {
93498
95893
  if (delimiter && source[i + delimiter.length] && !/\s/.test(source[i + delimiter.length])) {
93499
95894
  const end = closing(source, i + delimiter.length, delimiter);
93500
95895
  if (end > i + delimiter.length && !/\s/.test(source[end - 1])) {
93501
- for (const span of inline(source.slice(i + delimiter.length, end), options, { ...base, bold: delimiter.length === 2 || base.bold })) append(out, span.text, span);
95896
+ for (const span of inline(source.slice(i + delimiter.length, end), options, { ...base, bold: delimiter.length === 2 || base.bold })) appendSanitized(out, span.text, span);
93502
95897
  i = end + delimiter.length;
93503
95898
  continue;
93504
95899
  }
@@ -93517,14 +95912,14 @@ function wrapped(spans, width, lineStyle = {}) {
93517
95912
  used = 0;
93518
95913
  };
93519
95914
  for (const span of spans) for (const { segment } of segmenter.segment(span.text)) {
93520
- const size = cells(segment);
95915
+ const size = graphemeCellWidth(segment);
93521
95916
  if (used && used + size > width) flush();
93522
95917
  if (size > width) {
93523
- append(parts, "?", span);
95918
+ appendSanitized(parts, "?", span);
93524
95919
  used += 1;
93525
95920
  continue;
93526
95921
  }
93527
- append(parts, segment, span);
95922
+ appendSanitized(parts, segment, span);
93528
95923
  used += size;
93529
95924
  }
93530
95925
  flush();
@@ -97688,6 +100083,61 @@ function readableLabel(key) {
97688
100083
  return label3 ? label3[0].toUpperCase() + label3.slice(1) : "Value";
97689
100084
  }
97690
100085
 
100086
+ // src/tuiRenderCache.ts
100087
+ var CHAT_RENDER_CACHE_MAX_MESSAGES = 512;
100088
+ var CHAT_RENDER_CACHE_MAX_CHARS = 2e6;
100089
+ var stores = /* @__PURE__ */ new WeakMap();
100090
+ function sameEmbeds(previous, current2) {
100091
+ if (previous.size !== current2.size) return false;
100092
+ for (const [id, value] of current2) if (previous.get(id) !== value) return false;
100093
+ return true;
100094
+ }
100095
+ function cachedChatLayout(state, message, content, context, create) {
100096
+ let store = stores.get(state);
100097
+ if (!store || store.frame !== context.frame && (store.owner !== context.owner || store.width !== context.width || store.aliases !== context.aliases || !sameEmbeds(store.embeds, context.embeds))) {
100098
+ store = {
100099
+ owner: context.owner,
100100
+ width: context.width,
100101
+ aliases: context.aliases,
100102
+ embeds: new Map(context.embeds),
100103
+ frame: context.frame,
100104
+ entries: /* @__PURE__ */ new Map(),
100105
+ chars: 0
100106
+ };
100107
+ stores.set(state, store);
100108
+ }
100109
+ store.frame = context.frame;
100110
+ const hit = store.entries.get(message);
100111
+ if (hit && hit.content === content && hit.variant === context.variant) {
100112
+ store.entries.delete(message);
100113
+ store.entries.set(message, hit);
100114
+ return hit.value;
100115
+ }
100116
+ if (hit) {
100117
+ store.entries.delete(message);
100118
+ store.chars -= hit.size;
100119
+ }
100120
+ const value = create();
100121
+ const size = chatLayoutWeight(content);
100122
+ if (!context.cacheable || size > CHAT_RENDER_CACHE_MAX_CHARS / 4) return value;
100123
+ while (store.entries.size >= CHAT_RENDER_CACHE_MAX_MESSAGES || store.chars + size > CHAT_RENDER_CACHE_MAX_CHARS) {
100124
+ const oldest = store.entries.keys().next().value;
100125
+ if (!oldest) break;
100126
+ const removed = store.entries.get(oldest);
100127
+ store.entries.delete(oldest);
100128
+ store.chars -= removed.size;
100129
+ }
100130
+ store.entries.set(message, { content, variant: context.variant, value, size });
100131
+ store.chars += size;
100132
+ return value;
100133
+ }
100134
+ function chatLayoutWeight(content) {
100135
+ return content.length * 4 + 128;
100136
+ }
100137
+ function clearChatRenderCache(state) {
100138
+ stores.delete(state);
100139
+ }
100140
+
97691
100141
  // src/tuiSettingsShell.ts
97692
100142
  import { createHash as createHash24 } from "crypto";
97693
100143
  function ownerIdentity(context) {
@@ -98102,6 +100552,7 @@ function rankExamples(examples, interests) {
98102
100552
  var TUI_SESSION_ENDED_STATUS = "Session ended. Sign in to reopen your work.";
98103
100553
  function resetEndedTuiSession(state, hasSession) {
98104
100554
  if (!state.signedIn || hasSession) return false;
100555
+ clearChatRenderCache(state);
98105
100556
  state.homeAbortController?.abort();
98106
100557
  Object.values(state.chatContextAuthoringControls).forEach((control) => control.stop());
98107
100558
  const routeVersion = state.routeVersion + 1, homeLoadVersion = state.homeLoadVersion + 1;
@@ -98109,6 +100560,7 @@ function resetEndedTuiSession(state, hasSession) {
98109
100560
  return true;
98110
100561
  }
98111
100562
  function renderTuiFrame(state, width, height, options = {}) {
100563
+ if (state.screen !== "chat") clearChatRenderCache(state);
98112
100564
  fenceTuiSettingsView(state);
98113
100565
  beginPointerFrame(state, width, height);
98114
100566
  if (state.startup || state.privacyOffer) return renderStartupFrame(state, width, height, options.colorMode ?? "none");
@@ -98418,8 +100870,33 @@ function renderExampleChat(state, width, height) {
98418
100870
  }
98419
100871
  function renderChat(state, width, height) {
98420
100872
  const lines = renderChatHeader(state, width, height);
100873
+ const embeds = new Map(Object.entries(state.chatEmbeds));
100874
+ const cacheContext = {
100875
+ owner: JSON.stringify([state.signedIn, state.currentUserHash, state.activeTeamId, state.activeChatId, state.routeVersion]),
100876
+ width,
100877
+ aliases: JSON.stringify(state.embedAliases),
100878
+ embeds,
100879
+ frame: {}
100880
+ };
100881
+ const cacheable = /* @__PURE__ */ new Set();
100882
+ let cachedWeight = 0;
100883
+ for (let index = state.messages.length - 1; index >= 0 && cacheable.size < CHAT_RENDER_CACHE_MAX_MESSAGES; index--) {
100884
+ const weight = chatLayoutWeight(state.messages[index].content);
100885
+ if (weight > CHAT_RENDER_CACHE_MAX_CHARS / 4) continue;
100886
+ if (cachedWeight + weight > CHAT_RENDER_CACHE_MAX_CHARS) break;
100887
+ cachedWeight += weight;
100888
+ cacheable.add(index);
100889
+ }
100890
+ let firstEmbedId, firstEmbedChecked = false;
100891
+ const defaultEmbedId = () => {
100892
+ if (!firstEmbedChecked) {
100893
+ firstEmbedId = chatEmbedReferences(state)[0]?.value;
100894
+ firstEmbedChecked = true;
100895
+ }
100896
+ return firstEmbedId;
100897
+ };
98421
100898
  let contextIndex2 = 0, viewOffset = 0, questionOffset = 0;
98422
- for (const message of state.messages) {
100899
+ for (const [index, message] of state.messages.entries()) {
98423
100900
  const event = message.role === "system" ? parseChatContextContent(message.content) : null;
98424
100901
  if (event) {
98425
100902
  contextIndex2++;
@@ -98432,10 +100909,26 @@ function renderChat(state, width, height) {
98432
100909
  continue;
98433
100910
  }
98434
100911
  lines.push({ text: messageLabel(message.role, message.title, message.category, state.activeChat, message.remoteUser), color: "#5a85eb", bold: true });
98435
- const embeds = new Map(Object.entries(state.chatEmbeds));
98436
- lines.push(...renderMessageContentStyled(message.content, width, embeds, state, message.role === "assistant" ? message.embedIds : void 0, viewOffset, questionOffset, message.role === "assistant"));
98437
- viewOffset += messageResultsViews(message.content).length;
98438
- if (message.role === "assistant") questionOffset += messageQuestions(message.content).length;
100912
+ const questionBlocks = message.role === "assistant";
100913
+ const prepared = cachedChatLayout(
100914
+ state,
100915
+ message,
100916
+ message.content,
100917
+ { ...cacheContext, variant: questionBlocks ? "questions" : "literal-questions", cacheable: cacheable.has(index) },
100918
+ () => prepareMessageContent(message.content, width, state, questionBlocks, true)
100919
+ );
100920
+ lines.push(...renderPreparedMessageContent(
100921
+ prepared,
100922
+ width,
100923
+ embeds,
100924
+ state,
100925
+ questionBlocks ? message.embedIds : void 0,
100926
+ viewOffset,
100927
+ questionOffset,
100928
+ defaultEmbedId
100929
+ ));
100930
+ viewOffset += prepared.viewCount;
100931
+ if (questionBlocks) questionOffset += prepared.questionCount;
98439
100932
  lines.push("");
98440
100933
  }
98441
100934
  if (state.projectFocusPending) lines.push("Project access starts after the countdown. /project-focus-reject to cancel.");
@@ -98496,13 +100989,36 @@ function relativeTime(timestamp) {
98496
100989
  function renderStatus(state, width) {
98497
100990
  return ["OpenMates", "", state.status ?? "Working..."].flatMap((line3) => wrap(line3, width));
98498
100991
  }
100992
+ function prepareMessageContent(content, width, state, questionBlocks = true, countQuestions = false) {
100993
+ const segments2 = parseMessageSegments(content, { preserveCodeFences: true }).map((segment) => segment.type === "embed" ? segment : {
100994
+ type: "text",
100995
+ value: segment.value,
100996
+ blocks: parseTuiMarkdown(segment.value, width, { resolveEmbedAlias: (id) => state ? aliasForEmbed(state, id) : id, questionBlocks })
100997
+ });
100998
+ return {
100999
+ segments: segments2,
101000
+ viewCount: segments2.reduce((count, segment) => count + (segment.type === "text" ? segment.blocks.filter((block) => block.type === "results-view").length : 0), 0),
101001
+ questionCount: countQuestions && questionBlocks ? messageQuestions(content).length : 0
101002
+ };
101003
+ }
98499
101004
  function renderMessageContentStyled(content, width, embeds = /* @__PURE__ */ new Map(), state, extraIds = [], viewOffset = 0, questionOffset = 0, questionBlocks = true) {
98500
- const lines = [], segments2 = parseMessageSegments(content, { preserveCodeFences: true });
101005
+ return renderPreparedMessageContent(
101006
+ prepareMessageContent(content, width, state, questionBlocks),
101007
+ width,
101008
+ embeds,
101009
+ state,
101010
+ extraIds,
101011
+ viewOffset,
101012
+ questionOffset
101013
+ );
101014
+ }
101015
+ function renderPreparedMessageContent(prepared, width, embeds, state, extraIds = [], viewOffset = 0, questionOffset = 0, getDefaultEmbedId) {
101016
+ const lines = [], segments2 = prepared.segments;
98501
101017
  let pending = [], viewIndex = viewOffset, questionIndex = questionOffset;
98502
101018
  const flush = () => {
98503
101019
  if (!pending.length) return;
98504
101020
  const unique4 = pending.filter((ref, index) => pending.findIndex((other) => other.value === ref.value) === index);
98505
- const id = state?.chatSelectedEmbedId ?? (state ? chatEmbedReferences(state)[0]?.value : void 0);
101021
+ const id = state?.chatSelectedEmbedId ?? (state ? getDefaultEmbedId ? getDefaultEmbedId() : chatEmbedReferences(state)[0]?.value : void 0);
98506
101022
  const selected = unique4.findIndex((ref) => ref.value === id), cardWidth = Math.min(width, 62);
98507
101023
  const rawCards = unique4.map((ref) => renderEmbedReference(ref, cardWidth, embeds, state));
98508
101024
  const height = Math.max(...rawCards.map((card2) => card2.length));
@@ -98518,8 +101034,8 @@ function renderMessageContentStyled(content, width, embeds = /* @__PURE__ */ new
98518
101034
  ));
98519
101035
  pending = [];
98520
101036
  };
98521
- const text7 = (value) => {
98522
- for (const block of parseTuiMarkdown(value, width, { resolveEmbedAlias: (id) => state ? aliasForEmbed(state, id) : id, questionBlocks })) {
101037
+ const text7 = (blocks) => {
101038
+ for (const block of blocks) {
98523
101039
  if (block.type === "line") lines.push(block.line);
98524
101040
  else if (block.type === "question") {
98525
101041
  const key = ++questionIndex;
@@ -98536,8 +101052,8 @@ function renderMessageContentStyled(content, width, embeds = /* @__PURE__ */ new
98536
101052
  if (segment.type === "embed") pending.push(segment);
98537
101053
  else if (segment.value.trim()) {
98538
101054
  flush();
98539
- text7(segment.value);
98540
- } else if (!pending.length) text7(segment.value);
101055
+ text7(segment.blocks);
101056
+ } else if (!pending.length) text7(segment.blocks);
98541
101057
  }
98542
101058
  const inline2 = new Set(segments2.filter((segment) => segment.type === "embed").map((segment) => segment.value));
98543
101059
  pending.push(...extraIds.filter((id) => !inline2.has(id)).map((value) => ({ value })));