diff --git a/config/biome.config.json b/config/biome.config.json index be436f175..f7a5b6517 100644 --- a/config/biome.config.json +++ b/config/biome.config.json @@ -32,7 +32,8 @@ "!**/apps/**", "!**/scripts/lobu/**", "!**/benchmarks/**", - "!**/skills/**" + "!**/skills/**", + "!**/packages/landing/public/**" ] }, "formatter": { diff --git a/examples/agent-community/connectors/discourse-posts.connector.ts b/examples/agent-community/connectors/discourse-posts.connector.ts new file mode 100644 index 000000000..c7219a754 --- /dev/null +++ b/examples/agent-community/connectors/discourse-posts.connector.ts @@ -0,0 +1,33 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + +export default class DiscoursePostsConnector extends ConnectorRuntime { + readonly definition = { + key: "discourse-posts", + name: "Discourse posts", + version: "1.0.0", + authSchema: { methods: [{ type: "env" as const, fields: [{ name: "api_key" }] }] }, + feeds: { posts: { key: "posts", name: "Forum posts" } }, + }; + + async sync(ctx: SyncContext) { + const cursor = (ctx.checkpoint as any)?.last_post_id ?? 0; + const r = await fetch(`${ctx.config.base_url}/posts.json?before=${cursor + 50}`); + const posts: any[] = ((await r.json() as any).latest_posts ?? []).filter((p: any) => p.id > cursor).sort((a: any, b: any) => a.id - b.id); + return { + events: posts.map((p) => ({ + origin_id: String(p.id), + origin_type: "post_created", + title: p.topic_title ?? `Post by ${p.username}`, + author_name: p.username, + source_url: `${ctx.config.base_url}/t/${p.topic_slug}/${p.topic_id}/${p.id}`, + occurred_at: new Date(p.created_at), + })), + checkpoint: { last_post_id: posts.at(-1)?.id ?? cursor }, + }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/examples/delivery/connectors/shopify-orders.connector.ts b/examples/delivery/connectors/shopify-orders.connector.ts new file mode 100644 index 000000000..8be154279 --- /dev/null +++ b/examples/delivery/connectors/shopify-orders.connector.ts @@ -0,0 +1,32 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + +export default class ShopifyOrdersConnector extends ConnectorRuntime { + readonly definition = { + key: "shopify-orders", + name: "Shopify orders", + version: "1.0.0", + authSchema: { methods: [{ type: "env" as const, fields: [{ name: "access_token" }] }] }, + feeds: { orders: { key: "orders", name: "Order updates" } }, + }; + + async sync(ctx: SyncContext) { + const since = (ctx.checkpoint as any)?.updated_at_min ?? "2000-01-01T00:00:00Z"; + const r = await fetch(`https://${ctx.config.shop}/admin/api/2024-10/orders.json?status=any&updated_at_min=${encodeURIComponent(since)}&limit=100`); + const orders: any[] = ((await r.json() as any).orders ?? []).sort((a: any, b: any) => new Date(a.updated_at).getTime() - new Date(b.updated_at).getTime()); + return { + events: orders.map((o) => ({ + origin_id: `${o.id}:${o.updated_at}`, + origin_type: "order_updated", + title: `Order ${o.name} — ${o.fulfillment_status ?? "unfulfilled"}`, + source_url: `https://${ctx.config.shop}/admin/orders/${o.id}`, + occurred_at: new Date(o.updated_at), + })), + checkpoint: { updated_at_min: orders.at(-1)?.updated_at ?? since }, + }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/examples/ecommerce/connectors/stripe-charges.connector.ts b/examples/ecommerce/connectors/stripe-charges.connector.ts new file mode 100644 index 000000000..81cfbc769 --- /dev/null +++ b/examples/ecommerce/connectors/stripe-charges.connector.ts @@ -0,0 +1,39 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type ConnectorDefinition, type EventEnvelope, type SyncContext, type SyncResult } from "@lobu/connector-sdk"; + +interface StripeCharge { id: string; amount: number; currency: string; created: number; refunded: boolean } +interface Checkpoint { last_created: number } + +export default class StripeChargesConnector extends ConnectorRuntime { + readonly definition: ConnectorDefinition = { + key: "stripe-charges", + name: "Stripe charges", + version: "1.0.0", + // Stripe secret key collected per connection; exposed to sync() as ctx.config.secret_key. + authSchema: { methods: [{ type: "env_keys", fields: [{ key: "secret_key", label: "Stripe secret key", secret: true, required: true }] }] }, + feeds: { charges: { key: "charges", name: "Charges" } }, + }; + + async sync(ctx: SyncContext): Promise { + const cursor = ((ctx.checkpoint ?? {}) as Partial).last_created ?? 0; + const secretKey = String(ctx.config.secret_key ?? ""); + const r = await fetch(`https://api.stripe.com/v1/charges?limit=100&created[gt]=${cursor}`, { + headers: { Authorization: `Bearer ${secretKey}` }, + }); + if (!r.ok) throw new Error(`Stripe ${r.status}: ${await r.text()}`); + const data = (((await r.json()) as { data?: StripeCharge[] }).data ?? []).sort((a, b) => a.created - b.created); + const events: EventEnvelope[] = data.map((c) => ({ + origin_id: c.refunded ? `${c.id}:refund` : c.id, + origin_type: c.refunded ? "charge_refunded" : "charge_succeeded", + title: `${c.refunded ? "Refund" : "Charge"} — ${(c.amount / 100).toFixed(2)} ${c.currency.toUpperCase()}`, + payload_text: `${c.refunded ? "Refund" : "Charge"} of ${(c.amount / 100).toFixed(2)} ${c.currency.toUpperCase()} (stripe id ${c.id})`, + source_url: `https://dashboard.stripe.com/payments/${c.id}`, + occurred_at: new Date(c.created * 1000), + })); + return { events, checkpoint: { last_created: data.at(-1)?.created ?? cursor } satisfies Checkpoint }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/examples/finance/connectors/quickbooks-transactions.connector.ts b/examples/finance/connectors/quickbooks-transactions.connector.ts new file mode 100644 index 000000000..9f3cdba1f --- /dev/null +++ b/examples/finance/connectors/quickbooks-transactions.connector.ts @@ -0,0 +1,32 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + +export default class QuickBooksTransactionsConnector extends ConnectorRuntime { + readonly definition = { + key: "quickbooks-transactions", + name: "QuickBooks transactions", + version: "1.0.0", + authSchema: { methods: [{ type: "oauth" as const, provider: "intuit" }] }, + feeds: { transactions: { key: "transactions", name: "Posted transactions" } }, + }; + + async sync(ctx: SyncContext) { + const since = (ctx.checkpoint as any)?.last_txn_date ?? "1970-01-01"; + const q = `SELECT * FROM Transaction WHERE TxnDate > '${since}' ORDERBY TxnDate ASC MAXRESULTS 500`; + const r = await fetch(`https://quickbooks.api.intuit.com/v3/company/${ctx.config.realm_id}/query?query=${encodeURIComponent(q)}`); + const txns: any[] = (await r.json() as any).QueryResponse?.Transaction ?? []; + return { + events: txns.map((t) => ({ + origin_id: t.Id, + origin_type: "transaction_posted", + title: `${t.AccountRef?.name ?? "Bank"} — $${t.Amount.toFixed(2)}`, + occurred_at: new Date(`${t.TxnDate}T00:00:00Z`), + })), + checkpoint: { last_txn_date: txns.at(-1)?.TxnDate ?? since }, + }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/examples/leadership/connectors/linear-cycles.connector.ts b/examples/leadership/connectors/linear-cycles.connector.ts new file mode 100644 index 000000000..6bcd277fd --- /dev/null +++ b/examples/leadership/connectors/linear-cycles.connector.ts @@ -0,0 +1,34 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + +const QUERY = `query($t:ID!,$a:DateTimeOrDuration!){issues(first:100,filter:{team:{id:{eq:$t}},updatedAt:{gt:$a},cycle:{isActive:{eq:true}}},orderBy:updatedAt){nodes{id identifier title url updatedAt state{name}}}}`; + +export default class LinearCyclesConnector extends ConnectorRuntime { + readonly definition = { + key: "linear-cycles", + name: "Linear cycles", + version: "1.0.0", + authSchema: { methods: [{ type: "oauth" as const, provider: "linear" }] }, + feeds: { cycle_issues: { key: "cycle_issues", name: "Cycle issues" } }, + }; + + async sync(ctx: SyncContext) { + const since = (ctx.checkpoint as any)?.updated_at ?? "2000-01-01T00:00:00Z"; + const r = await fetch("https://api.linear.app/graphql", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: QUERY, variables: { t: ctx.config.team_id, a: since } }) }); + const issues: any[] = ((await r.json()) as any).data?.issues?.nodes ?? []; + return { + events: issues.map((i) => ({ + origin_id: `${i.id}:${i.state.name}`, + origin_type: "issue_state_changed", + title: `${i.identifier} ${i.title} → ${i.state.name}`, + source_url: i.url, + occurred_at: new Date(i.updatedAt), + })), + checkpoint: { updated_at: issues.at(-1)?.updatedAt ?? since }, + }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/examples/legal/connectors/docusign-envelopes.connector.ts b/examples/legal/connectors/docusign-envelopes.connector.ts new file mode 100644 index 000000000..37f4a9e7f --- /dev/null +++ b/examples/legal/connectors/docusign-envelopes.connector.ts @@ -0,0 +1,32 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + +export default class DocuSignEnvelopesConnector extends ConnectorRuntime { + readonly definition = { + key: "docusign-envelopes", + name: "DocuSign envelopes", + version: "1.0.0", + authSchema: { methods: [{ type: "oauth" as const, provider: "docusign" }] }, + feeds: { envelopes: { key: "envelopes", name: "Envelope status changes" } }, + }; + + async sync(ctx: SyncContext) { + const since = (ctx.checkpoint as any)?.last_status_changed ?? "2000-01-01T00:00:00Z"; + const base = String(ctx.config.base_path ?? "https://www.docusign.net/restapi").replace(/\/$/, ""); + const r = await fetch(`${base}/v2.1/accounts/${ctx.config.account_id}/envelopes?from_date=${encodeURIComponent(since)}&count=100`); + const envelopes: any[] = ((await r.json() as any).envelopes ?? []).sort((a: any, b: any) => new Date(a.statusChangedDateTime).getTime() - new Date(b.statusChangedDateTime).getTime()); + return { + events: envelopes.map((e) => ({ + origin_id: `${e.envelopeId}:${e.status}`, + origin_type: "envelope_status_changed", + title: `${e.emailSubject ?? e.envelopeId} → ${e.status}`, + occurred_at: new Date(e.statusChangedDateTime), + })), + checkpoint: { last_status_changed: envelopes.at(-1)?.statusChangedDateTime ?? since }, + }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/examples/lobu-crm/connectors/funnel-form.connector.ts b/examples/lobu-crm/connectors/funnel-form.connector.ts index 06eb81146..51c841791 100644 --- a/examples/lobu-crm/connectors/funnel-form.connector.ts +++ b/examples/lobu-crm/connectors/funnel-form.connector.ts @@ -1,179 +1,39 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + /** - * Funnel-form connector — pulls demo-request form submissions from a small - * JSON API (`config.endpoint` returns `{ submissions: [...] }`) and emits one - * event per new submission. Modeled on packages/connectors/src/rss.ts. - * - * No auth (`authSchema: { methods: [{ type: 'none' }] }`); a single - * `submissions` feed; dedup via a checkpoint of seen submission IDs. - * - * Auto-discovered by `lobu apply` because the filename ends in - * `.connector.ts` — the CLI ships the raw source to the server, which - * compiles it and reads `definition.key` (`funnel-form`). + * Funnel-form connector — polls a small JSON API (`config.endpoint` returns + * `{ submissions: [...] }`) and emits one event per new submission. Dedup + * via a rolling checkpoint of seen IDs. Auto-discovered by `lobu apply`. */ - -import { - type ActionContext, - type ActionResult, - type ConnectorDefinition, - ConnectorRuntime, - type EventEnvelope, - type SyncContext, - type SyncResult, -} from "@lobu/connector-sdk"; - -interface FunnelFormConfig { - endpoint: string; -} - -interface FunnelFormCheckpoint { - seen_ids: string[]; -} - -interface FunnelSubmission { - id: string; - name?: string; - email?: string; - company?: string; - message?: string; - submitted_at?: string; - source_url?: string; -} - -const MAX_DEDUP_IDS = 1000; -const FETCH_TIMEOUT_MS = 15_000; - export default class FunnelFormConnector extends ConnectorRuntime { - readonly definition: ConnectorDefinition = { + readonly definition = { key: "funnel-form", name: "Funnel form", - description: - "Collects demo-request form submissions from a JSON API endpoint.", version: "1.0.0", - authSchema: { methods: [{ type: "none" }] }, - feeds: { - submissions: { - key: "submissions", - name: "Form submissions", - description: "New submissions to the demo-request form.", - configSchema: { - type: "object", - required: ["endpoint"], - properties: { - endpoint: { - type: "string", - format: "uri", - description: - "JSON API URL returning { submissions: [{ id, name, email, company, message, submitted_at }] }.", - }, - }, - }, - eventKinds: { - form_submission: { - description: "A demo-request form submission.", - metadataSchema: { - type: "object", - properties: { - company: { type: "string" }, - email: { type: "string" }, - }, - }, - }, - }, - }, - }, - optionsSchema: { - type: "object", - required: ["endpoint"], - properties: { - endpoint: { - type: "string", - format: "uri", - description: "JSON API URL returning { submissions: [...] }.", - }, - }, - }, + authSchema: { methods: [{ type: "none" as const }] }, + feeds: { submissions: { key: "submissions", name: "Form submissions" } }, }; - async sync(ctx: SyncContext): Promise { - const config = ctx.config as unknown as FunnelFormConfig; - if (!config?.endpoint) { - throw new Error("funnel-form: `endpoint` is required"); - } - - const checkpoint = (ctx.checkpoint as FunnelFormCheckpoint | null) ?? { - seen_ids: [], - }; - const seen = new Set(checkpoint.seen_ids ?? []); - - const submissions = await this.fetchSubmissions(config.endpoint); - submissions.sort( - (a, b) => - this.toTime(b.submitted_at).getTime() - - this.toTime(a.submitted_at).getTime() - ); - - const events: EventEnvelope[] = []; - const newIds: string[] = []; - for (const submission of submissions) { - if (!submission?.id || seen.has(submission.id)) continue; - seen.add(submission.id); - newIds.push(submission.id); - events.push({ - origin_id: submission.id, - origin_type: "form_submission", - title: submission.company - ? `Demo request — ${submission.company}` - : `Demo request — ${submission.name ?? submission.email ?? submission.id}`, - payload_text: submission.message ?? "", - author_name: submission.name || undefined, - source_url: submission.source_url || config.endpoint, - occurred_at: this.toTime(submission.submitted_at), - metadata: { - company: submission.company, - email: submission.email, - }, - }); - } - - const allKnown = [...(checkpoint.seen_ids ?? []), ...newIds]; - const trimmed = allKnown.slice(-MAX_DEDUP_IDS); - + async sync(ctx: SyncContext) { + const seen = new Set((ctx.checkpoint as any)?.seen_ids ?? []); + const subs: any[] = (await (await fetch(String(ctx.config.endpoint))).json()).submissions ?? []; + const fresh = subs.filter((s) => s?.id && !seen.has(s.id)); return { - events, - checkpoint: { seen_ids: trimmed } as unknown as Record, - metadata: { items_found: events.length }, + events: fresh.map((s) => ({ + origin_id: s.id, + origin_type: "form_submission", + title: s.company ? `Demo request — ${s.company}` : `Demo request — ${s.name ?? s.email ?? s.id}`, + payload_text: s.message ?? "", + author_name: s.name, + occurred_at: s.submitted_at ? new Date(s.submitted_at) : new Date(), + metadata: { company: s.company, email: s.email }, + })), + checkpoint: { seen_ids: [...seen, ...fresh.map((s) => s.id)].slice(-1000) }, }; } - async execute(_ctx: ActionContext): Promise { - return { success: false, error: "Actions not supported" }; - } - - private async fetchSubmissions( - endpoint: string - ): Promise { - const controller = new AbortController(); - const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS); - try { - const response = await fetch(endpoint, { - signal: controller.signal, - headers: { Accept: "application/json" }, - }); - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - const body = (await response.json()) as { - submissions?: FunnelSubmission[]; - }; - return Array.isArray(body?.submissions) ? body.submissions : []; - } finally { - clearTimeout(timer); - } - } - - private toTime(value: string | undefined): Date { - if (!value) return new Date(); - const parsed = new Date(value); - return Number.isNaN(parsed.getTime()) ? new Date() : parsed; + async execute() { + return { success: false, error: "no actions" }; } } diff --git a/examples/market/connectors/exa-news-feed.connector.ts b/examples/market/connectors/exa-news-feed.connector.ts new file mode 100644 index 000000000..8d3b953f4 --- /dev/null +++ b/examples/market/connectors/exa-news-feed.connector.ts @@ -0,0 +1,33 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + +export default class ExaNewsFeedConnector extends ConnectorRuntime { + readonly definition = { + key: "exa-news-feed", + name: "Exa news feed", + version: "1.0.0", + authSchema: { methods: [{ type: "env" as const, fields: [{ name: "api_key" }] }] }, + feeds: { articles: { key: "articles", name: "Articles" } }, + }; + + async sync(ctx: SyncContext) { + const seen = new Set((ctx.checkpoint as any)?.seen_ids ?? []); + const r = await fetch("https://api.exa.ai/search", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: ctx.config.query, numResults: ctx.config.num_results ?? 20 }) }); + const fresh: any[] = ((await r.json() as any).results ?? []).filter((x: any) => x.id && !seen.has(x.id)); + return { + events: fresh.map((x) => ({ + origin_id: x.id, + origin_type: "article_published", + title: x.title ?? x.url, + author_name: x.author, + source_url: x.url, + occurred_at: x.publishedDate ? new Date(x.publishedDate) : new Date(), + })), + checkpoint: { seen_ids: [...seen, ...fresh.map((x) => x.id)].slice(-1000) }, + }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/examples/sales/connectors/salesforce-pipeline.connector.ts b/examples/sales/connectors/salesforce-pipeline.connector.ts new file mode 100644 index 000000000..307e1457e --- /dev/null +++ b/examples/sales/connectors/salesforce-pipeline.connector.ts @@ -0,0 +1,32 @@ +// biome-ignore-all format: stays compact for the landing-page code panel +import { ConnectorRuntime, type SyncContext } from "@lobu/connector-sdk"; + +export default class SalesforcePipelineConnector extends ConnectorRuntime { + readonly definition = { + key: "salesforce-pipeline", + name: "Salesforce pipeline", + version: "1.0.0", + authSchema: { methods: [{ type: "oauth" as const, provider: "salesforce" }] }, + feeds: { opportunities: { key: "opportunities", name: "Opportunities" } }, + }; + + async sync(ctx: SyncContext) { + const since = (ctx.checkpoint as any)?.last_modified ?? "2000-01-01T00:00:00Z"; + const q = `SELECT Id,Name,StageName,LastModifiedDate FROM Opportunity WHERE LastModifiedDate > ${since} LIMIT 200`; + const r = await fetch(`${ctx.config.instance_url}/services/data/v60.0/query?q=${encodeURIComponent(q)}`); + const records: any[] = (await r.json() as any).records ?? []; + return { + events: records.map((o) => ({ + origin_id: o.Id, + origin_type: "opportunity_updated", + title: `${o.Name} → ${o.StageName}`, + occurred_at: new Date(o.LastModifiedDate), + })), + checkpoint: { last_modified: records.at(-1)?.LastModifiedDate ?? since }, + }; + } + + async execute() { + return { success: false, error: "no actions" }; + } +} diff --git a/packages/landing/astro.config.mjs b/packages/landing/astro.config.mjs index 7919dcb9f..859c44727 100644 --- a/packages/landing/astro.config.mjs +++ b/packages/landing/astro.config.mjs @@ -66,6 +66,8 @@ export default defineConfig({ { label: "Comparison", link: "/getting-started/comparison/" }, { label: "Skills", link: "/getting-started/skills/" }, { label: "Memory", link: "/getting-started/memory/" }, + { label: "Connector SDK", link: "/getting-started/connector-sdk/" }, + { label: "Reactions", link: "/getting-started/reaction-sdk/" }, ], }, { label: "Deployment", autogenerate: { directory: "deployment" } }, @@ -98,7 +100,9 @@ export default defineConfig({ { label: "Providers", link: "/reference/providers/" }, { label: "CLI", link: "/reference/cli/" }, { label: "Lobu memory CLI", link: "/reference/lobu-memory/" }, - { label: "API Reference", link: "/reference/api-reference/" }, + { label: "@lobu/connector-sdk", link: "/reference/connector-sdk/" }, + { label: "Reactions", link: "/reference/reaction-sdk/" }, + { label: "REST API", link: "/reference/api-reference/" }, ], }, ], @@ -115,6 +119,12 @@ export default defineConfig({ sitemap(), ], vite: { + // Read .env from the repo root so PUBLIC_POSTHOG_KEY (and any other + // workspace-wide env we add later) reaches the build / dev server. + // Without this, Vite scopes envDir to this package and the repo-root + // .env is invisible — PosthogAnalytics then silently no-ops because + // posthogKey is undefined. + envDir: resolve(__dirname, "../.."), plugins: [settingsMockPlugin(), tailwindcss()], resolve: { alias: { diff --git a/packages/landing/package.json b/packages/landing/package.json index fa6a65330..158e37deb 100644 --- a/packages/landing/package.json +++ b/packages/landing/package.json @@ -4,8 +4,9 @@ "version": "3.0.8", "type": "module", "scripts": { + "predev": "bun scripts/gen-landing-snippets.ts", "dev": "astro dev", - "prebuild": "bun scripts/gen-platform-configs.ts && bun scripts/gen-markdown-twins.ts", + "prebuild": "bun scripts/gen-platform-configs.ts && bun scripts/gen-markdown-twins.ts && bun scripts/gen-landing-snippets.ts", "build": "astro build", "preview": "astro preview" }, diff --git a/packages/landing/public/asciinema-player/asciinema-player-ui.min.js b/packages/landing/public/asciinema-player/asciinema-player-ui.min.js new file mode 100644 index 000000000..1d841b5b8 --- /dev/null +++ b/packages/landing/public/asciinema-player/asciinema-player-ui.min.js @@ -0,0 +1 @@ +var AsciinemaPlayer=function(e){"use strict";const t=/^#[0-9a-f]{6}$/,n=/^#[0-9a-f]{3}$/;function r(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if("string"!=typeof e)return r;const l=e.trim().toLowerCase();return t.test(l)?l:n.test(l)?`#${l[1]}${l[1]}${l[2]}${l[2]}${l[3]}${l[3]}`:r}function l(e,t,n){return[t[0]+e*(n[0]-t[0]),t[1]+e*(n[1]-t[1]),t[2]+e*(n[2]-t[2])]}function o(e){const[t,n,r]=function(e){return[Number.parseInt(e.slice(1,3),16)/255,Number.parseInt(e.slice(3,5),16)/255,Number.parseInt(e.slice(5,7),16)/255]}(e).map(u),l=.4122214708*t+.5363325363*n+.0514459929*r,o=.2119034982*t+.6806995451*n+.1073969566*r,i=.0883024619*t+.2817188376*n+.6299787005*r,s=Math.cbrt(l),a=Math.cbrt(o),c=Math.cbrt(i);return[.2104542553*s+.793617785*a-.0040720468*c,1.9779984951*s-2.428592205*a+.4505937099*c,.0259040371*s+.7827717662*a-.808675766*c]}function i(e){const t=s(e);if(d(t))return c(t);const[n,r,l]=function(e){let[t,n,r]=e;return[t,Math.hypot(n,r),Math.atan2(r,n)]}(e);let o=0,i=r,u=[n,0,l];for(let e=0;e<24;e+=1){const e=(o+i)/2,t=[n,e,l];d(s(a(t)))?(o=e,u=t):i=e}return c(s(a(u)))}function s(e){const t=p(e[0],0,1),n=e[1],r=e[2],l=(t+.3963377774*n+.2158037573*r)**3,o=(t-.1055613458*n-.0638541728*r)**3,i=(t-.0894841775*n-1.291485548*r)**3,s=-1.2684380046*l+2.6097574011*o-.3413193965*i,a=-.0041960863*l-.7034186147*o+1.707614701*i;return[f(4.0767416621*l-3.3077115913*o+.2309699292*i),f(s),f(a)]}function a(e){let[t,n,r]=e;return[t,n*Math.cos(r),n*Math.sin(r)]}function c(e){const t=e=>Math.round(255*p(e,0,1)).toString(16).padStart(2,"0");return`#${t(e[0])}${t(e[1])}${t(e[2])}`}function u(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function f(e){return e<=.0031308?12.92*e:1.055*e**(1/2.4)-.055}function d(e){let[t,n,r]=e;return t>=0&&t<=1&&n>=0&&n<=1&&r>=0&&r<=1}function p(e,t,n){return Math.max(t,Math.min(n,e))}class h{log(){}debug(){}info(){}warn(){}error(){}}const g=Symbol("solid-proxy"),L=Symbol("solid-track"),v={equals:(e,t)=>e===t};let m=V;const b=1,y=2,k={owned:null,cleanups:null,context:null,owner:null};var w=null;let $=null,M=null,R=null,C=null,Z=0;function A(e,t){const n=M,r=w,l=0===e.length,o=void 0===t?r:t,i=l?k:{owned:null,cleanups:null,context:o?o.context:null,owner:o},s=l?e:()=>e((()=>T((()=>Q(i)))));w=i,M=null;try{return I(s,!0)}finally{M=n,w=r}}function x(e,t){const n={value:e,observers:null,observerSlots:null,comparator:(t=t?Object.assign({},v,t):v).equals||void 0};return[U.bind(n),e=>("function"==typeof e&&(e=e(n.value)),B(n,e))]}function E(e,t,n){W(K(e,t,!1,b))}function S(e,t,n){m=X;const r=K(e,t,!1,b);r.user=!0,C?C.push(r):W(r)}function P(e,t,n){n=n?Object.assign({},v,n):v;const r=K(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,W(r),U.bind(r)}function _(e){return I(e,!1)}function T(e){if(null===M)return e();const t=M;M=null;try{return e()}finally{M=t}}function N(e){S((()=>T(e)))}function F(e){return null===w||(null===w.cleanups?w.cleanups=[e]:w.cleanups.push(e)),e}function z(){return M}function O(e){const t=M,n=w;return Promise.resolve().then((()=>{M=t,w=n,I(e,!1),M=w=null}))}const[j,H]=x(!1);function D(e){const t=P(e),n=P((()=>ee(t())));return n.toArray=()=>{const e=n();return Array.isArray(e)?e:null!=e?[e]:[]},n}function U(){if(this.sources&&this.state)if(this.state===b)W(this);else{const e=R;R=null,I((()=>G(this)),!1),R=e}if(M){const e=this.observers?this.observers.length:0;M.sources?(M.sources.push(this),M.sourceSlots.push(e)):(M.sources=[this],M.sourceSlots=[e]),this.observers?(this.observers.push(M),this.observerSlots.push(M.sources.length-1)):(this.observers=[M],this.observerSlots=[M.sources.length-1])}return this.value}function B(e,t,n){let r=e.value;return e.comparator&&e.comparator(r,t)||(e.value=t,e.observers&&e.observers.length&&I((()=>{for(let t=0;t1e6)throw R=[],new Error}),!1)),t}function W(e){if(!e.fn)return;Q(e);const t=Z;!function(e,t,n){let r;const l=w,o=M;M=w=e;try{r=e.fn(t)}catch(t){return e.pure&&(e.state=b,e.owned&&e.owned.forEach(Q),e.owned=null),e.updatedAt=n+1,Y(t)}finally{M=o,w=l}(!e.updatedAt||e.updatedAt<=n)&&(null!=e.updatedAt&&"observers"in e?B(e,r):e.value=r,e.updatedAt=n)}(e,e.value,t)}function K(e,t,n,r=b,l){const o={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:w,context:w?w.context:null,pure:n};return null===w||w!==k&&(w.owned?w.owned.push(o):w.owned=[o]),o}function q(e){if(0===e.state)return;if(e.state===y)return G(e);if(e.suspense&&T(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt=0;n--)if((e=t[n]).state===b)W(e);else if(e.state===y){const n=R;R=null,I((()=>G(e,t[0])),!1),R=n}}function I(e,t){if(R)return e();let n=!1;t||(R=[]),C?n=!0:C=[],Z++;try{const t=e();return function(e){R&&(V(R),R=null);if(e)return;const t=C;C=null,t.length&&I((()=>m(t)),!1)}(n),t}catch(e){n||(C=null),R=null,Y(e)}}function V(e){for(let t=0;t=0;t--)Q(e.tOwned[t]);delete e.tOwned}if(e.owned){for(t=e.owned.length-1;t>=0;t--)Q(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}e.state=0}function Y(e,t=w){const n=function(e){return e instanceof Error?e:new Error("string"==typeof e?e:"Unknown error",{cause:e})}(e);throw n}function ee(e){if("function"==typeof e&&!e.length)return ee(e());if(Array.isArray(e)){const t=[];for(let n=0;ne(t||{})))}const le=e=>`Stale read from <${e}>.`;function oe(e){const t="fallback"in e&&{fallback:()=>e.fallback};return P(function(e,t,n={}){let r=[],l=[],o=[],i=0,s=t.length>1?[]:null;return F((()=>ne(o))),()=>{let a,c,u=e()||[],f=u.length;return u[L],T((()=>{let e,t,p,h,g,L,v,m,b;if(0===f)0!==i&&(ne(o),o=[],r=[],l=[],i=0,s&&(s=[])),n.fallback&&(r=[te],l[0]=A((e=>(o[0]=e,n.fallback()))),i=1);else if(0===i){for(l=new Array(f),c=0;c=L&&m>=L&&r[v]===u[m];v--,m--)p[m]=l[v],h[m]=o[v],s&&(g[m]=s[v]);for(e=new Map,t=new Array(m+1),c=m;c>=L;c--)b=u[c],a=e.get(b),t[c]=void 0===a?-1:a,e.set(b,c);for(a=L;a<=v;a++)b=r[a],c=e.get(b),void 0!==c&&-1!==c?(p[c]=l[a],h[c]=o[a],s&&(g[c]=s[a]),c=t[c],e.set(b,c)):o[a]();for(c=L;ce.each),e.children,t||void 0))}function ie(e){const t=e.keyed,n=P((()=>e.when),void 0,void 0),r=t?n:P(n,void 0,{equals:(e,t)=>!e==!t});return P((()=>{const l=r();if(l){const o=e.children;return"function"==typeof o&&o.length>0?T((()=>o(t?l:()=>{if(!T(r))throw le("Show");return n()}))):o}return e.fallback}),void 0,void 0)}function se(e){const t=D((()=>e.children)),n=P((()=>{const e=t(),n=Array.isArray(e)?e:[e];let r=()=>{};for(let e=0;eo()?void 0:l.when),void 0,void 0),s=l.keyed?i:P(i,void 0,{equals:(e,t)=>!e==!t});r=()=>o()||(s()?[t,i,l]:void 0)}return r}));return P((()=>{const t=n()();if(!t)return e.fallback;const[r,l,o]=t,i=o.children;return"function"==typeof i&&i.length>0?T((()=>i(o.keyed?l():()=>{if(T(n)()?.[0]!==r)throw le("Match");return l()}))):i}),void 0,void 0)}function ae(e){return e}const ce="_$DX_DELEGATE";function ue(e,t,n,r){let l;const o=()=>{const t=document.createElement("template");return t.innerHTML=e,t.content.firstChild},i=t?()=>T((()=>document.importNode(l||(l=o()),!0))):()=>(l||(l=o())).cloneNode(!0);return i.cloneNode=i,i}function fe(e,t=window.document){const n=t[ce]||(t[ce]=new Set);for(let r=0,l=e.length;re(t,n)))}function Le(e,t,n,r){if(void 0===n||r||(r=[]),"function"!=typeof t)return me(e,t,r,n);E((r=>me(e,t(),r,n)),r)}function ve(e){let t=e.target;const n=`$$${e.type}`,r=e.target,l=e.currentTarget,o=t=>Object.defineProperty(e,"target",{configurable:!0,value:t}),i=()=>{const r=t[n];if(r&&!t.disabled){const l=t[`${n}Data`];if(void 0!==l?r.call(t,l,e):r.call(t,e),e.cancelBubble)return}return t.host&&"string"!=typeof t.host&&!t.host._$host&&t.contains(e.target)&&o(t.host),!0},s=()=>{for(;i()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get:()=>t||document}),e.composedPath){const n=e.composedPath();o(n[0]);for(let e=0;e{let l=t();for(;"function"==typeof l;)l=l();n=me(e,l,n,r)})),()=>n;if(Array.isArray(t)){const o=[],s=n&&Array.isArray(n);if(be(o,t,n,l))return E((()=>n=me(e,o,n,r,!0))),()=>n;if(0===o.length){if(n=ke(e,n,r),i)return n}else s?0===n.length?ye(e,o,r):function(e,t,n){let r=n.length,l=t.length,o=r,i=0,s=0,a=t[l-1].nextSibling,c=null;for(;ir-s){const l=t[i];for(;s=0;o--){const i=t[o];if(l!==i){const t=i.parentNode===e;r||o?t&&i.remove():t?e.replaceChild(l,i):e.insertBefore(l,n)}else r=!0}}else e.insertBefore(l,n);return[l]}const we=Symbol("store-raw"),$e=Symbol("store-node"),Me=Symbol("store-has"),Re=Symbol("store-self");function Ce(e){let t=e[g];if(!t&&(Object.defineProperty(e,g,{value:t=new Proxy(e,Pe)}),!Array.isArray(e))){const n=Object.keys(e),r=Object.getOwnPropertyDescriptors(e);for(let l=0,o=n.length;lt===we||t===g||t===L||t===$e||t===Me||"__proto__"===t||(z()&&Ee(xe(e,Me),t)(),t in e),set:()=>!0,deleteProperty:()=>!0,ownKeys:function(e){return Se(e),Reflect.ownKeys(e)},getOwnPropertyDescriptor:function(e,t){const n=Reflect.getOwnPropertyDescriptor(e,t);return n&&!n.get&&n.configurable&&t!==g&&t!==$e?(delete n.value,delete n.writable,n.get=()=>e[g][t],n):n}};function _e(e,t,n,r=!1){if(!r&&e[t]===n)return;const l=e[t],o=e.length;void 0===n?(delete e[t],e[Me]&&e[Me][t]&&void 0!==l&&e[Me][t].$()):(e[t]=n,e[Me]&&e[Me][t]&&void 0===l&&e[Me][t].$());let i,s=xe(e,$e);if((i=Ee(s,t,l))&&i.$((()=>n)),Array.isArray(e)&&e.length!==o){for(let t=e.length;t1){r=t.shift();const o=typeof r,i=Array.isArray(e);if(Array.isArray(r)){for(let l=0;l1)return void Ne(e[r],t,[r].concat(n));l=e[r],n=[r].concat(n)}let o=t[0];"function"==typeof o&&(o=o(l,n),o===l)||void 0===r&&null==o||(o=Ae(o),void 0===r||Ze(l)&&Ze(o)&&!Array.isArray(o)?Te(l,o):_e(e,r,o))}function Fe(...[e,t]){const n=Ae(e||{}),r=Array.isArray(n);return[Ce(n),function(...e){_((()=>{r&&1===e.length?function(e,t){if("function"==typeof t&&(t=t(e)),t=Ae(t),Array.isArray(t)){if(e===t)return;let n=0,r=t.length;for(;n{},Oe=(e,t)=>t();function je(e,t){const n=T(e),r=n?[n]:[],{onEnter:l=Oe,onExit:o=Oe}=t,[i,s]=x(t.appear?[]:r),[a]=[j,O];let c,u=!1;function f(e,t){if(!e)return t&&t();u=!0,o(e,(()=>{_((()=>{u=!1,s((t=>t.filter((t=>t!==e)))),t&&t()}))}))}function d(e){const t=c;if(!t)return e&&e();c=void 0,s((e=>[t,...e])),l(t,e??ze)}const p="out-in"===t.mode?e=>u||f(e,d):"in-out"===t.mode?e=>d((()=>f(e))):e=>{f(e),d()};var h,g;return h=t=>{const n=e();return T(a)?(a(),t):(n!==t&&(c=n,_((()=>T((()=>p(t)))))),n)},g=t.appear?void 0:n,W(K(h,g,!0,b)),i}const He=e=>e instanceof Element;function De(e,t){if(t(e))return e;if("function"==typeof e&&!e.length)return De(e(),t);if(Array.isArray(e))for(const n of e){const e=De(n,t);if(e)return e}return null}function Ue(e,t=He,n=He){const r=P(e);return P((()=>De(r(),t)))}function Be(e){requestAnimationFrame((()=>requestAnimationFrame(e)))}var We={inout:"in-out",outin:"out-in"},Ke=e=>{const t=function(e){return P((()=>{const t=e.name||"s";return{enterActive:(e.enterActiveClass||t+"-enter-active").split(" "),enter:(e.enterClass||t+"-enter").split(" "),enterTo:(e.enterToClass||t+"-enter-to").split(" "),exitActive:(e.exitActiveClass||t+"-exit-active").split(" "),exit:(e.exitClass||t+"-exit").split(" "),exitTo:(e.exitToClass||t+"-exit-to").split(" "),move:(e.moveClass||t+"-move").split(" ")}}))}(e);return je(Ue((()=>e.children)),{mode:We[e.mode],appear:e.appear,onEnter(n,r){!function(e,t,n,r){const{onBeforeEnter:l,onEnter:o,onAfterEnter:i}=t;function s(t){t&&t.target!==n||(r?.(),n.removeEventListener("transitionend",s),n.removeEventListener("animationend",s),n.classList.remove(...e.enterActive),n.classList.remove(...e.enterTo),i?.(n))}l?.(n),n.classList.add(...e.enter),n.classList.add(...e.enterActive),queueMicrotask((()=>{if(!n.parentNode)return r?.();o?.(n,(()=>s()))})),Be((()=>{n.classList.remove(...e.enter),n.classList.add(...e.enterTo),(!o||o.length<2)&&(n.addEventListener("transitionend",s),n.addEventListener("animationend",s))}))}(t(),e,n,r)},onExit(n,r){!function(e,t,n,r){const{onBeforeExit:l,onExit:o,onAfterExit:i}=t;if(!n.parentNode)return r?.();function s(t){t&&t.target!==n||(r?.(),n.removeEventListener("transitionend",s),n.removeEventListener("animationend",s),n.classList.remove(...e.exitActive),n.classList.remove(...e.exitTo),i?.(n))}l?.(n),n.classList.add(...e.exit),n.classList.add(...e.exitActive),o?.(n,(()=>s())),Be((()=>{n.classList.remove(...e.exit),n.classList.add(...e.exitTo),(!o||o.length<2)&&(n.addEventListener("transitionend",s),n.addEventListener("animationend",s))}))}(t(),e,n,r)}})};const qe=ue('
',12),Ie="http://www.w3.org/2000/svg",Ve=24;var Xe=e=>{const t=e.core,n=[],l=[],o=[],i=new Set,s=new Map,a=new Map,[c,u]=x({cols:e.cols,rows:e.rows},{equals:(e,t)=>e.cols===t.cols&&e.rows===t.rows}),[f,d]=x(Ge(rt)),p=()=>e.lineHeight??1.3333333333,[h,g]=x(!0),L=P((()=>h()||z)),v=P((()=>({width:`${c().cols}ch`,height:p()*c().rows+"em","font-size":100*(e.scale||1)+"%","--term-line-height":`${p()}em`,"--term-cols":c().cols,"--term-rows":c().rows})));let m,b,y,k,w,$,M,R,C,Z,A={col:0,row:0,visible:!1},T={size:void 0,theme:void 0,rows:new Set},z=!1;function O(n){let{size:r,theme:l,changedRows:o}=n,i=!1;if(void 0!==o)for(const e of o)T.rows.add(e),z=!0,i=!0;if(void 0!==l&&e.preferEmbeddedTheme){T.theme=l;for(let e=0;e=r.rows&&T.rows.delete(e)}i&&A.visible&&T.rows.add(A.row),H()}function j(){g((e=>(e||(z=!1),!e)))}function H(){void 0===R&&(R=requestAnimationFrame(D))}function D(){R=void 0;const{size:t,theme:n,rows:r}=T;_((function(){void 0!==t&&(!function(e){let{cols:t,rows:n}=e;b.width=8*t,b.height=n*Ve,y.imageSmoothingEnabled=!1}(t),K(t.rows),q(t.rows),u(t)),void 0!==n&&(d(Ge(null===n?Z:n)),s.clear());const e=f(),l=h()||z;for(const t of r)U(t,e,l)})),T.size=void 0,T.theme=void 0,T.rows.clear(),e.stats.renders+=1}function U(e,n,r){const l=t.getLine(e,r);!function(e){y.clearRect(0,e*Ve,8*c().cols,Ve)}(e),function(e,n,r){const l=t.getDataView(n,8),o=e*Ve;let i=0;for(;ie;){const e=k.lastElementChild;k.removeChild(e),n.push(e)}}function q(e){let t=M.children.length;if(te;){const e=M.lastElementChild;M.removeChild(e),l.push(e)}}function I(){let e=n.pop();return void 0===e&&(e=document.createElement("span"),e.className="ap-line"),e}function V(){let e=l.pop();return void 0===e&&(e=document.createElementNS(Ie,"g"),e.setAttribute("class","ap-symbol-line")),e}function X(e,t,n,r){if(!function(e){const t=function(e){const t=`stroke="currentColor" stroke-width="${Ye}" stroke-linejoin="miter" stroke-linecap="square"`,n=`stroke="currentColor" stroke-width="${Ye}" stroke-linejoin="miter" stroke-linecap="butt"`,r=e=>``,l=1/3,o=2/3;switch(e){case 9698:return''+r("M1,1 L1,0 L0,1 Z");case 9699:return''+r("M0,1 L0,0 L1,1 Z");case 9700:return''+r("M0,0 L1,0 L0,1 Z");case 9701:return''+r("M1,0 L1,1 L0,0 Z");case 9871:{const e=.17,t=.15/2,n=.2/2,r=e=>.5+e*et,l=.5-t,o=.5+t,i=1.02,s=r(-n-e),a=r(-n),c=r(n),u=r(n+e),f=(e,t,n,r)=>`M${e},${n} L${t},${n} L${t},${r} L${e},${r} Z`;return``}case 129852:return``+r(`M0,${o} L0,1 L0.5,1 Z`);case 129853:return``+r(`M0,${o} L0,1 L1,1 Z`);case 129854:return``+r(`M0,${l} L0.5,1 L0,1 Z`);case 129855:return``+r(`M0,${l} L1,1 L0,1 Z`);case 129856:return''+r("M0,0 L0.5,1 L0,1 Z");case 129857:return``+r(`M0,${l} L0,1 L1,1 L1,0 L0.5,0 Z`);case 129858:return``+r(`M0,${l} L0,1 L1,1 L1,0 Z`);case 129859:return``+r(`M0,${o} L0,1 L1,1 L1,0 L0.5,0 Z`);case 129860:return``+r(`M0,${o} L0,1 L1,1 L1,0 Z`);case 129861:return''+r("M0.5,0 L1,0 L1,1 L0,1 Z");case 129862:return``+r(`M0,${o} L0,1 L1,1 L1,${l} Z`);case 129863:return``+r(`M0.5,1 L1,1 L1,${o} Z`);case 129864:return``+r(`M0,1 L1,1 L1,${o} Z`);case 129865:return``+r(`M0.5,1 L1,1 L1,${l} Z`);case 129866:return``+r(`M0,1 L1,1 L1,${l} Z`);case 129867:return''+r("M0.5,1 L1,0 L1,1 Z");case 129868:return``+r(`M0,0 L0.5,0 L1,${l} L1,1 L0,1 Z`);case 129869:return``+r(`M0,0 L0,1 L1,1 L1,${l} Z`);case 129870:return``+r(`M0,0 L0.5,0 L1,${o} L1,1 L0,1 Z`);case 129871:return``+r(`M0,0 L1,${o} L1,1 L0,1 Z`);case 129872:return''+r("M0,0 L0.5,0 L1,1 L0,1 Z");case 129873:return``+r(`M0,${l} L1,${o} L1,1 L0,1 Z`);case 129874:return``+r(`M0,${o} L0,0 L1,0 L1,1 L0.5,1 Z`);case 129875:return``+r(`M0,${o} L0,0 L1,0 L1,1 Z`);case 129876:return``+r(`M0,${l} L0,0 L1,0 L1,1 L0.5,1 Z`);case 129877:return``+r(`M0,${l} L0,0 L1,0 L1,1 Z`);case 129878:return''+r("M0,0 L1,0 L1,1 L0.5,1 Z");case 129879:return``+r(`M0,${l} L0.5,0 L0,0 Z`);case 129880:return``+r(`M0,0 L1,0 L0,${l} Z`);case 129881:return``+r(`M0,0 L0.5,0 L0,${o} Z`);case 129882:return``+r(`M0,0 L1,0 L0,${o} Z`);case 129883:return''+r("M0,0 L0.5,0 L0,1 Z");case 129884:return``+r(`M0,0 L1,0 L1,${l} L0,${o} Z`);case 129885:return``+r(`M0,0 L1,0 L1,${o} L0.5,1 L0,1 Z`);case 129886:return``+r(`M0,0 L1,0 L1,${o} L0,1 Z`);case 129887:return``+r(`M0,0 L1,0 L1,${l} L0.5,1 L0,1 Z`);case 129888:return``+r(`M0,0 L1,0 L1,${l} L0,1 Z`);case 129889:return''+r("M0,0 L1,0 L0.5,1 L0,1 Z");case 129890:return``+r(`M0.5,0 L1,0 L1,${l} Z`);case 129891:return``+r(`M0,0 L1,0 L1,${l} Z`);case 129892:return``+r(`M0.5,0 L1,0 L1,${o} Z`);case 129893:return``+r(`M0,0 L1,0 L1,${o} Z`);case 129894:return''+r("M0.5,0 L1,0 L1,1 Z");case 129895:return``+r(`M0,${l} L0,0 L1,0 L1,${o} Z`);case 129896:return``;case 129897:return``;case 129898:return``;case 129899:return``;case 129900:return''+r("M0,0 L0,1 L0.5,0.5 Z");case 57520:return'';case 57521:return'';case 57522:return'';case 57523:return'';default:return null}}(e);if(!t)return!1;if(i.has(e))return!0;const n=`sym-${e}`,r=document.createElementNS(Ie,"symbol");return r.setAttribute("id",n),r.setAttribute("viewBox","0 0 1 1"),r.setAttribute("preserveAspectRatio","none"),r.setAttribute("overflow","visible"),r.innerHTML=t,$.appendChild(r),i.add(e),!0}(e))return null;const l=tt.has(e),s=l?t-nt:t,a=l?1+2*nt:1,c=function(){let e=o.pop();void 0===e&&(e=document.createElementNS(Ie,"use"));return e}();return c.setAttribute("href",`#sym-${e}`),c.setAttribute("x",s),c.setAttribute("y",0),c.setAttribute("width",a),c.setAttribute("height","1"),n?c.style.setProperty("color",n):c.style.removeProperty("color"),r?c.classList.add("ap-blink"):c.classList.remove("ap-blink"),c}return N((()=>{!function(){if(y=b.getContext("2d"),!y)throw new Error("2D ctx not available");const{cols:e,rows:t}=c();b.width=8*e,b.height=t*Ve,b.style.imageRendering="pixelated",y.imageSmoothingEnabled=!1}(),Z=function(e){const t=getComputedStyle(e),n=r(t.getPropertyValue("--term-color-foreground"),rt.foreground),l=r(t.getPropertyValue("--term-color-background"),rt.background),o=[];for(let e=0;e<16;e++){const n=e>=8?o[e-8]:rt.palette[e];o[e]=r(t.getPropertyValue(`--term-color-${e}`),n)}return{foreground:n,background:l,palette:o}}(m),T.theme=Z,K(c().rows),q(c().rows),t.addEventListener("vtUpdate",O)})),F((()=>{t.removeEventListener("vtUpdate",O),clearInterval(C),cancelAnimationFrame(R)})),S((()=>{e.blinking&&void 0===C?C=setInterval(j,600):(clearInterval(C),C=void 0,g(!0))})),S((()=>{L(),A.visible&&(T.rows.add(A.row),H())})),(()=>{const e=qe.cloneNode(!0),t=e.firstChild,n=t.nextSibling,r=n.firstChild,l=r.nextSibling,o=n.nextSibling;"function"==typeof m?ge(m,e):m=e;"function"==typeof b?ge(b,t):b=t;"function"==typeof w?ge(w,n):w=n;"function"==typeof $?ge($,r):$=r;"function"==typeof M?ge(M,l):M=l;return"function"==typeof k?ge(k,o):k=o,E((t=>{const r=v(),l=`0 0 ${c().cols} ${c().rows}`,i=!!h(),s=!!h();return t._v$=he(e,r,t._v$),l!==t._v$2&&de(n,"viewBox",t._v$2=l),i!==t._v$3&&n.classList.toggle("ap-blink",t._v$3=i),s!==t._v$4&&o.classList.toggle("ap-blink",t._v$4=s),t}),{_v$:void 0,_v$2:void 0,_v$3:void 0,_v$4:void 0}),e})()};function Ge(e){return{fg:e.foreground,bg:e.background,palette:Je(e.palette,e.background,e.foreground)}}function Je(e,t,n){const r=o(t),s=o(n),a=o(e[1]),c=o(e[2]),u=o(e[3]),f=o(e[4]),d=o(e[5]),p=o(e[6]),h=[...e];for(let e=0;e<6;e+=1){const t=e/5,n=l(t,r,a),o=l(t,c,u),g=l(t,f,d),L=l(t,p,s);for(let e=0;e<6;e+=1){const t=e/5,r=l(t,n,o),s=l(t,g,L);for(let e=0;e<6;e+=1){const t=l(e/5,r,s);h.push(i(t))}}}for(let e=0;e<24;e+=1){const t=(e+1)/25;h.push(i(l(t,r,s)))}return h}function Qe(e,t,n,r){const l=12;switch(t){case 9600:e.fillRect(n,r,8,l);break;case 9601:e.fillRect(n,r+21,8,3);break;case 9602:e.fillRect(n,r+18,8,6);break;case 9603:e.fillRect(n,r+15,8,9);break;case 9604:e.fillRect(n,r+l,8,l);break;case 9605:e.fillRect(n,r+9,8,15);break;case 9606:e.fillRect(n,r+6,8,18);break;case 9607:e.fillRect(n,r+3,8,21);break;case 9608:e.fillRect(n,r,8,Ve);break;case 9632:e.fillRect(n,r+6,8,12);break;case 9609:e.fillRect(n,r,7,Ve);break;case 9610:e.fillRect(n,r,6,Ve);break;case 9611:e.fillRect(n,r,5,Ve);break;case 9612:e.fillRect(n,r,4,Ve);break;case 9613:e.fillRect(n,r,3,Ve);break;case 9614:e.fillRect(n,r,2,Ve);break;case 9615:e.fillRect(n,r,1,Ve);break;case 9616:e.fillRect(n+4,r,4,Ve);break;case 9617:e.save(),e.globalAlpha=.25,e.fillRect(n,r,8,Ve),e.restore();break;case 9618:e.save(),e.globalAlpha=.5,e.fillRect(n,r,8,Ve),e.restore();break;case 9619:e.save(),e.globalAlpha=.75,e.fillRect(n,r,8,Ve),e.restore();break;case 9620:e.fillRect(n,r,8,3);break;case 9621:e.fillRect(n+7,r,1,Ve);break;case 9622:e.fillRect(n,r+l,4,l);break;case 9623:e.fillRect(n+4,r+l,4,l);break;case 9624:e.fillRect(n,r,4,l);break;case 9625:e.fillRect(n,r,4,Ve),e.fillRect(n+4,r+l,4,l);break;case 9626:e.fillRect(n,r,4,l),e.fillRect(n+4,r+l,4,l);break;case 9627:e.fillRect(n,r,8,l),e.fillRect(n,r+l,4,l);break;case 9628:e.fillRect(n,r,8,l),e.fillRect(n+4,r+l,4,l);break;case 9629:e.fillRect(n+4,r,4,l);break;case 9630:e.fillRect(n+4,r,4,l),e.fillRect(n,r+l,4,l);break;case 9631:e.fillRect(n+4,r,4,Ve),e.fillRect(n,r+l,4,l);break;case 129792:e.fillRect(n,r,4,8);break;case 129793:e.fillRect(n+4,r,4,8);break;case 129794:e.fillRect(n,r,8,8);break;case 129795:e.fillRect(n,r+8,4,8);break;case 129796:e.fillRect(n,r,4,8),e.fillRect(n,r+8,4,8);break;case 129797:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,4,8);break;case 129798:e.fillRect(n,r,8,8),e.fillRect(n,r+8,4,8);break;case 129799:e.fillRect(n+4,r+8,4,8);break;case 129800:e.fillRect(n,r,4,8),e.fillRect(n+4,r+8,4,8);break;case 129801:e.fillRect(n+4,r,4,8),e.fillRect(n+4,r+8,4,8);break;case 129802:e.fillRect(n,r,8,8),e.fillRect(n+4,r+8,4,8);break;case 129803:e.fillRect(n,r+8,8,8);break;case 129804:e.fillRect(n,r,4,8),e.fillRect(n,r+8,8,8);break;case 129805:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,8,8);break;case 129806:e.fillRect(n,r,8,8),e.fillRect(n,r+8,8,8);break;case 129807:e.fillRect(n,r+16,4,8);break;case 129808:e.fillRect(n,r,4,8),e.fillRect(n,r+16,4,8);break;case 129809:e.fillRect(n+4,r,4,8),e.fillRect(n,r+16,4,8);break;case 129810:e.fillRect(n,r,8,8),e.fillRect(n,r+16,4,8);break;case 129811:e.fillRect(n,r+8,4,16);break;case 129812:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,4,16);break;case 129813:e.fillRect(n,r,8,8),e.fillRect(n,r+8,4,16);break;case 129814:e.fillRect(n+4,r+8,4,8),e.fillRect(n,r+16,4,8);break;case 129815:e.fillRect(n,r,4,8),e.fillRect(n+4,r+8,4,8),e.fillRect(n,r+16,4,8);break;case 129816:e.fillRect(n+4,r,4,16),e.fillRect(n,r+16,4,8);break;case 129817:e.fillRect(n,r,8,8),e.fillRect(n+4,r+8,4,8),e.fillRect(n,r+16,4,8);break;case 129818:e.fillRect(n,r+8,8,8),e.fillRect(n,r+16,4,8);break;case 129819:e.fillRect(n,r,4,24),e.fillRect(n+4,r+8,4,8);break;case 129820:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,8,8),e.fillRect(n,r+16,4,8);break;case 129821:e.fillRect(n,r,8,16),e.fillRect(n,r+16,4,8);break;case 129822:e.fillRect(n+4,r+16,4,8);break;case 129823:e.fillRect(n,r,4,8),e.fillRect(n+4,r+16,4,8);break;case 129824:e.fillRect(n+4,r,4,8),e.fillRect(n+4,r+16,4,8);break;case 129825:e.fillRect(n,r,8,8),e.fillRect(n+4,r+16,4,8);break;case 129826:e.fillRect(n,r+8,4,8),e.fillRect(n+4,r+16,4,8);break;case 129827:e.fillRect(n,r,4,16),e.fillRect(n+4,r+16,4,8);break;case 129828:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,4,8),e.fillRect(n+4,r+16,4,8);break;case 129829:e.fillRect(n,r,8,8),e.fillRect(n,r+8,4,8),e.fillRect(n+4,r+16,4,8);break;case 129830:e.fillRect(n+4,r+8,4,16);break;case 129831:e.fillRect(n,r,4,8),e.fillRect(n+4,r+8,4,16);break;case 129832:e.fillRect(n,r,8,8),e.fillRect(n+4,r+8,4,16);break;case 129833:e.fillRect(n,r+8,8,8),e.fillRect(n+4,r+16,4,8);break;case 129834:e.fillRect(n,r,4,16),e.fillRect(n+4,r+8,4,16);break;case 129835:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,8,8),e.fillRect(n+4,r+16,4,8);break;case 129836:e.fillRect(n,r,8,16),e.fillRect(n+4,r+16,4,8);break;case 129837:e.fillRect(n,r+16,8,8);break;case 129838:e.fillRect(n,r,4,8),e.fillRect(n,r+16,8,8);break;case 129839:e.fillRect(n+4,r,4,8),e.fillRect(n,r+16,8,8);break;case 129840:e.fillRect(n,r,8,8),e.fillRect(n,r+16,8,8);break;case 129841:e.fillRect(n,r+8,4,8),e.fillRect(n,r+16,8,8);break;case 129842:e.fillRect(n,r,4,16),e.fillRect(n,r+16,8,8);break;case 129843:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,4,8),e.fillRect(n,r+16,8,8);break;case 129844:e.fillRect(n,r,8,8),e.fillRect(n,r+8,4,8),e.fillRect(n,r+16,8,8);break;case 129845:e.fillRect(n+4,r+8,4,8),e.fillRect(n,r+16,8,8);break;case 129846:e.fillRect(n,r,4,8),e.fillRect(n+4,r+8,4,8),e.fillRect(n,r+16,8,8);break;case 129847:e.fillRect(n+4,r,4,16),e.fillRect(n,r+16,8,8);break;case 129848:e.fillRect(n,r,8,8),e.fillRect(n+4,r+8,4,8),e.fillRect(n,r+16,8,8);break;case 129849:e.fillRect(n,r+8,8,16);break;case 129850:e.fillRect(n,r,4,24),e.fillRect(n+4,r+8,4,8),e.fillRect(n+4,r+16,4,8);break;case 129851:e.fillRect(n+4,r,4,8),e.fillRect(n,r+8,8,16)}}const Ye=.05,et=9.0375/20;const tt=new Set([57520,57521,57522,57523]),nt=.02,rt={foreground:"#000000",background:"#000000",palette:["#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000"]},lt=ue('',6);var ot=e=>lt.cloneNode(!0);const it=ue('',4);var st=e=>it.cloneNode(!0);const at=ue('',6);var ct=e=>at.cloneNode(!0);const ut=ue('',4);var ft=e=>ut.cloneNode(!0);const dt=ue('',6);var pt=e=>dt.cloneNode(!0);const ht=ue('',6);var gt=e=>ht.cloneNode(!0);const Lt=ue('',4);var vt=e=>Lt.cloneNode(!0);const mt=ue('',2),bt=ue('',6),yt=ue('Unmute (m)',2),kt=ue('Mute (m)',2),wt=ue('',2),$t=ue('
Keyboard shortcuts (?)Fullscreen (f)
',18),Mt=ue('',6);function Rt(e){let t=Math.floor(e);const n=Math.floor(t/86400);t%=86400;const r=Math.floor(t/3600);t%=3600;const l=Math.floor(t/60);return t%=60,n>0?`${Ct(n)}:${Ct(r)}:${Ct(l)}:${Ct(t)}`:r>0?`${Ct(r)}:${Ct(l)}:${Ct(t)}`:`${Ct(l)}:${Ct(t)}`}function Ct(e){return e<10?`0${e}`:e.toString()}var Zt=e=>{const t=e=>t=>{t.preventDefault(),e(t)},n=()=>"number"==typeof e.currentTime?Rt(e.currentTime):"--:--",r=()=>"number"==typeof e.remainingTime?"-"+Rt(e.remainingTime):n(),l=P((()=>"number"==typeof e.duration?e.markers.filter((t=>t[0]{const t=e.currentTarget.offsetWidth,n=e.currentTarget.getBoundingClientRect(),r=e.clientX-n.left;return 100*Math.max(0,r/t)+"%"},[i,s]=x(!1),a=function(e,t){let n=!0;return function(){if(n){n=!1;for(var r=arguments.length,l=new Array(r),o=0;on=!0),t)}}}(e.onSeekClick,50),c=t=>{t._marker||t.altKey||t.shiftKey||t.metaKey||t.ctrlKey||0!==t.button||(s(!0),e.onSeekClick(o(t)))},u=e=>{e.altKey||e.shiftKey||e.metaKey||e.ctrlKey||i()&&a(o(e))},f=()=>{s(!1)};return document.addEventListener("mouseup",f),F((()=>{document.removeEventListener("mouseup",f)})),(()=>{const o=$t.cloneNode(!0),i=o.firstChild,s=i.firstChild,a=s.nextSibling,f=i.nextSibling,d=f.nextSibling,p=d.firstChild,h=d.nextSibling,g=h.firstChild,L=e.ref;return"function"==typeof L?ge(L,o):e.ref=o,Le(o,re(ie,{get when(){return e.isPausable},get children(){const n=mt.cloneNode(!0);return pe(n,"click",t(e.onPlayClick)),Le(n,re(se,{get children(){return[re(ae,{get when(){return e.isPlaying},get children(){return re(ct,{})}}),re(ae,{when:!0,get children(){return re(ft,{})}})]}})),n}}),i),Le(s,n),Le(a,r),Le(f,re(ie,{get when(){return"number"==typeof e.progress||e.isSeekable},get children(){const n=bt.cloneNode(!0),r=n.firstChild.nextSibling;return n.$$mousemove=u,n.$$mousedown=c,Le(n,re(oe,{get each(){return l()},children:(n,r)=>(()=>{const l=Mt.cloneNode(!0),o=l.firstChild,i=o.nextSibling;var s;return l.$$mousedown=e=>{e._marker=!0},pe(l,"click",(s=r(),t((()=>{e.onSeekClick({marker:s})})))),Le(i,(()=>(e=>""===e[1]?Rt(e[0]):`${Rt(e[0])} - ${e[1]}`)(n))),E((t=>{const r=(t=>t[0]/e.duration*100+"%")(n),i=!!(t=>"number"==typeof e.currentTime&&t[0]<=e.currentTime)(n);return r!==t._v$&&l.style.setProperty("left",t._v$=r),i!==t._v$2&&o.classList.toggle("ap-marker-past",t._v$2=i),t}),{_v$:void 0,_v$2:void 0}),l})()}),null),E((t=>he(r,{transform:`scaleX(${e.progress||0}`},t))),n}})),Le(o,re(ie,{get when(){return void 0!==e.isMuted},get children(){const n=wt.cloneNode(!0);return pe(n,"click",t(e.onMuteClick)),Le(n,re(se,{get children(){return[re(ae,{get when(){return!0===e.isMuted},get children(){return[re(vt,{}),yt.cloneNode(!0)]}}),re(ae,{get when(){return!1===e.isMuted},get children(){return[re(gt,{}),kt.cloneNode(!0)]}})]}})),n}}),d),pe(d,"click",t(e.onHelpClick)),Le(d,re(st,{}),p),pe(h,"click",t(e.onFullscreenClick)),Le(h,re(pt,{}),g),Le(h,re(ot,{}),g),E((()=>o.classList.toggle("ap-seekable",!!e.isSeekable))),o})()};fe(["click","mousedown","mousemove"]);const At=ue('
💥
',4);var xt=e=>At.cloneNode(!0);const Et=ue('
',4);var St=e=>Et.cloneNode(!0);const Pt=ue('
',4);var _t=e=>(()=>{const t=Pt.cloneNode(!0);return Le(t.firstChild,(()=>e.message)),E((()=>t.classList.toggle("ap-was-playing",!!e.wasPlaying))),t})();const Tt=ue('
',22);var Nt=e=>(()=>{const t=Tt.cloneNode(!0);var n;return pe(t,"click",(n=e.onClick,e=>{e.preventDefault(),n(e)})),t})();fe(["click"]);const Ft=ue("
  • space - pause / resume
  • ",4),zt=ue("
  • / - rewind / fast-forward by 5 seconds
  • ",6),Ot=ue("
  • Shift + / - rewind / fast-forward by 10%
  • ",8),jt=ue("
  • [ / ] - jump to the previous / next marker
  • ",6),Ht=ue("
  • 0, 1, 2 ... 9 - jump to 0%, 10%, 20% ... 90%
  • ",10),Dt=ue("
  • , / . - step back / forward, a frame at a time (when paused)
  • ",6),Ut=ue("
  • m - mute / unmute audio
  • ",4),Bt=ue('

    Keyboard shortcuts

    • f - toggle fullscreen mode
    • ? - show this help popup
    ',18);var Wt=e=>(()=>{const t=Bt.cloneNode(!0),n=t.firstChild,r=n.firstChild.firstChild.nextSibling,l=r.firstChild,o=l.nextSibling;var i;return pe(t,"click",(i=e.onClose,e=>{e.preventDefault(),i(e)})),n.$$click=e=>{e.stopPropagation()},Le(r,re(ie,{get when(){return e.isPausable},get children(){return Ft.cloneNode(!0)}}),l),Le(r,re(ie,{get when(){return e.isSeekable},get children(){return[zt.cloneNode(!0),Ot.cloneNode(!0),jt.cloneNode(!0),Ht.cloneNode(!0),Dt.cloneNode(!0)]}}),l),Le(r,re(ie,{get when(){return e.hasAudio},get children(){return Ut.cloneNode(!0)}}),o),t})();fe(["click"]);const Kt=ue('
    ',4);var qt=e=>{const t=e.logger,n=e.core,r=e.autoPlay,l=e.charW,o=e.charH,i=e.bordersW,s=e.bordersH,a=e.theme??"auto/asciinema",c="auto/"===a.slice(0,5),u=c?a.slice(5):a,[f,d]=Fe({containerW:0,containerH:0,isPausable:!0,isSeekable:!0,isFullscreen:!1,currentTime:null,remainingTime:null,progress:null}),[p,h]=x(!1),[g,L]=x(void 0),[v,m]=x(!1),[b,y]=x(r?null:"start"),[k,w]=x(null),[$,M]=x(!1),[R,C]=x({cols:e.cols,rows:e.rows},{equals:(e,t)=>e.cols===t.cols&&e.rows===t.rows}),[Z,A]=x(null),[S,T]=Fe([]),[z,O]=x(!1),[j,H]=x(!1),[D,U]=x(null),B=P((()=>R().cols||80)),W=P((()=>R().rows||24)),K=()=>!1===e.controls?0:32;let q,I,V,X,G,J,Q;function Y(){M(!1),xe(),Ee()}const ee=new Promise((e=>{Q=e})),te=e=>{let{isPausable:t,isSeekable:n}=e;d({isPausable:t,isSeekable:n}),Q()},ne=e=>{_((()=>{void 0!==e.duration&&A(e.duration),void 0!==e.markers&&T(e.markers),void 0!==e.hasAudio&&L(!e.hasAudio&&void 0),void 0!==e.size&&C(e.size),void 0!==e.theme&&U(e.theme)}))},le=()=>{y(null)},oe=()=>{_((()=>{h(!0),m(!0),y(null),M(!0),Ae()}))},ce=()=>{_((()=>{h(!1),Y()}))},ue=()=>{_((()=>{h(!1),Y(),y("loader")}))},fe=e=>{let{message:t}=e;_((()=>{h(!1),Y(),void 0!==t&&(w(t),y("info"))}))},de=e=>{L(e)},pe={renders:0},ve=e=>{let{message:n}=e;_((()=>{h(!1),Y(),void 0!==n&&(w(n),y("info"))})),t.debug("stats",pe)},me=()=>{y("error")},be=()=>{Ee()};n.addEventListener("ready",te),n.addEventListener("metadata",ne),n.addEventListener("play",le),n.addEventListener("playing",oe),n.addEventListener("idle",ce),n.addEventListener("loading",ue),n.addEventListener("offline",fe),n.addEventListener("muted",de),n.addEventListener("ended",ve),n.addEventListener("errored",me),n.addEventListener("seeked",be);const ye=()=>{J=new ResizeObserver(function(e,t){let n;return function(){for(var r=arguments.length,l=new Array(r),o=0;oe.apply(this,l)),t)}}((e=>{d({containerW:V.offsetWidth,containerH:V.offsetHeight}),V.dispatchEvent(new CustomEvent("resize",{detail:{el:X}}))}),10)),J.observe(V)};N((async()=>{t.info("view: mounted"),t.debug("view: font measurements",{charW:l,charH:o}),ye(),d({containerW:V.offsetWidth,containerH:V.offsetHeight})})),F((()=>{n.removeEventListener("ready",te),n.removeEventListener("metadata",ne),n.removeEventListener("play",le),n.removeEventListener("playing",oe),n.removeEventListener("idle",ce),n.removeEventListener("loading",ue),n.removeEventListener("offline",fe),n.removeEventListener("muted",de),n.removeEventListener("ended",ve),n.removeEventListener("errored",me),n.removeEventListener("seeked",be),n.stop(),xe(),J.disconnect()}));const ke=P((()=>{const t=l*B()+i,n=o*W()+s;let r=e.fit??"width";if("both"===r||f.isFullscreen){r=f.containerW/(f.containerH-K())>t/n?"height":"width"}if(!1===r||"none"===r)return{};if("width"===r){const e=f.containerW/t;return{scale:e,width:f.containerW,height:n*e+K()}}if("height"===r){const e=(f.containerH-K())/n;return{scale:e,width:t*e,height:f.containerH}}throw new Error(`unsupported fit mode: ${r}`)})),we=()=>{d("isFullscreen",document.fullscreenElement??document.webkitFullscreenElement)},$e=()=>{f.isFullscreen?(document.exitFullscreen??document.webkitExitFullscreen??(()=>{})).apply(document):(V.requestFullscreen??V.webkitRequestFullscreen??(()=>{})).apply(V)},Me=()=>{j()?H(!1):(n.pause(),H(!0))},Re=e=>{if(!(e.altKey||e.metaKey||e.ctrlKey)){if(" "==e.key)n.togglePlay();else if(","==e.key)n.step(-1).then(Ee);else if("."==e.key)n.step().then(Ee);else if("f"==e.key)$e();else if("m"==e.key)Ne();else if("["==e.key)n.seek({marker:"prev"});else if("]"==e.key)n.seek({marker:"next"});else if(e.key.charCodeAt(0)>=48&&e.key.charCodeAt(0)<=57){const t=(e.key.charCodeAt(0)-48)/10;n.seek(100*t+"%")}else if("?"==e.key)Me();else if("ArrowLeft"==e.key)e.shiftKey?n.seek("<<<"):n.seek("<<");else if("ArrowRight"==e.key)e.shiftKey?n.seek(">>>"):n.seek(">>");else{if("Escape"!=e.key)return;H(!1)}e.stopPropagation(),e.preventDefault()}},Ce=()=>{f.isFullscreen&&Se(!0)},Ze=()=>{f.isFullscreen||Se(!1)},Ae=()=>{I=setInterval(Ee,100)},xe=()=>{clearInterval(I)},Ee=async()=>{const e=await n.getCurrentTime(),t=await n.getRemainingTime(),r=await n.getProgress();d({currentTime:e,remainingTime:t,progress:r})},Se=e=>{clearTimeout(q),e&&(q=setTimeout((()=>Se(!1)),2e3)),O(e)},Pe=P((()=>c?D():null)),_e=()=>{ee.then((()=>n.play()))},Te=()=>{ee.then((()=>n.togglePlay()))},Ne=()=>{ee.then((()=>{!0===g()?n.unmute():n.mute()}))},ze=e=>{ee.then((()=>n.seek(e)))},Oe=(()=>{const t=Kt.cloneNode(!0),r=t.firstChild;"function"==typeof V?ge(V,t):V=t,t.addEventListener("webkitfullscreenchange",we),t.addEventListener("fullscreenchange",we),t.$$mousemove=Ce,t.$$keydown=Re;return"function"==typeof X?ge(X,r):X=r,r.$$mousemove=()=>Se(!0),r.addEventListener("mouseleave",Ze),Le(r,re(Xe,{get cols(){return B()},get rows(){return W()},get scale(){return ke()?.scale},get blinking(){return $()},get lineHeight(){return e.terminalLineHeight},preferEmbeddedTheme:c,core:n,get stats(){return pe}}),null),Le(r,re(ie,{get when(){return!1!==e.controls},get children(){return re(Zt,{get duration(){return Z()},get currentTime(){return f.currentTime},get remainingTime(){return f.remainingTime},get progress(){return f.progress},markers:S,get isPlaying(){return p()||"loader"==b()},get isPausable(){return f.isPausable},get isSeekable(){return f.isSeekable},get isMuted(){return g()},onPlayClick:Te,onFullscreenClick:$e,onHelpClick:Me,onSeekClick:ze,onMuteClick:Ne,ref(e){"function"==typeof G?G(e):G=e}})}}),null),Le(r,re(se,{get children(){return[re(ae,{get when(){return"start"==b()},get children(){return re(Nt,{onClick:_e})}}),re(ae,{get when(){return"loader"==b()},get children(){return re(St,{})}}),re(ae,{get when(){return"error"==b()},get children(){return re(xt,{})}})]}}),null),Le(r,re(Ke,{name:"slide",get children(){return re(ie,{get when(){return"info"==b()},get children(){return re(_t,{get message(){return k()},get wasPlaying(){return v()}})}})}}),null),Le(r,re(ie,{get when(){return j()},get children(){return re(Wt,{onClose:()=>H(!1),get isPausable(){return f.isPausable},get isSeekable(){return f.isSeekable},get hasAudio(){return void 0!==g()}})}}),null),E((n=>{const l=!!(!0===e.controls||"auto"===e.controls&&z()),o=`ap-player ap-default-term-ff asciinema-player-theme-${u}`,i=(()=>{const t={};!1!==e.fit&&"none"!==e.fit||void 0===e.terminalFontSize||("small"===e.terminalFontSize?t["font-size"]="12px":"medium"===e.terminalFontSize?t["font-size"]="18px":"big"===e.terminalFontSize?t["font-size"]="24px":t["font-size"]=e.terminalFontSize);const n=ke();void 0!==n.width&&(t.width=`${n.width}px`,t.height=`${n.height}px`),void 0!==e.terminalFontFamily&&(t["--term-font-family"]=e.terminalFontFamily);const r=Pe();return r&&(t["--term-color-foreground"]=r.foreground,t["--term-color-background"]=r.background),t})();var s,a;return l!==n._v$&&t.classList.toggle("ap-hud",n._v$=l),o!==n._v$2&&(s=r,null==(a=n._v$2=o)?s.removeAttribute("class"):s.className=a),n._v$3=he(r,i,n._v$3),n}),{_v$:void 0,_v$2:void 0,_v$3:void 0}),t})();return Oe};function It(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const r=function(e,t){const n=80,r=24,l=document.createElement("div");l.className="ap-default-term-ff",l.style.height="0px",l.style.overflow="hidden",l.style.fontSize="15px",void 0!==e&&l.style.setProperty("--term-font-family",e);const o=document.createElement("div");o.className="ap-term",o.style.width=`${n}ch`,o.style.height=r*(t??1.3333333333)+"em",o.style.fontSize="100%",l.appendChild(o),document.body.appendChild(l);const i={charW:o.clientWidth/n,charH:o.clientHeight/r,bordersW:o.offsetWidth-o.clientWidth,bordersH:o.offsetHeight-o.clientHeight};return document.body.removeChild(l),i}(n.terminalFontFamily,n.terminalLineHeight),l={core:e,logger:n.logger,cols:n.cols,rows:n.rows,fit:n.fit,controls:n.controls,autoPlay:n.autoPlay,terminalFontSize:n.terminalFontSize,terminalFontFamily:n.terminalFontFamily,terminalLineHeight:n.terminalLineHeight,theme:n.theme,...r};let o;const i=function(e,t,n,r={}){let l;return A((r=>{l=r,t===document?e():Le(t,e(),t.firstChild?null:void 0,n)}),r.owner),()=>{l(),t.textContent=""}}((()=>(o=re(qt,l),o)),t);return{el:o,dispose:i}}fe(["keydown","mousemove"]);const Vt=["audioUrl","autoPlay","autoplay","boldIsBright","cols","idleTimeLimit","loop","markers","pauseOnMarkers","poster","preload","rows","speed","startAt"],Xt=["autoPlay","autoplay","cols","controls","fit","rows","terminalFontFamily","terminalFontSize","terminalLineHeight","theme"];class Gt{constructor(e,t,n){this.worker=new Worker(e),this.worker.onmessage=this._onMessage.bind(this),this.nextId=1,this.eventHandlers=new Map([["ended",[]],["errored",[]],["idle",[]],["input",[]],["loading",[]],["marker",[]],["metadata",[]],["offline",[]],["pause",[]],["play",[]],["playing",[]],["ready",[]],["reset",[]],["resize",[]],["seeked",[]],["vtUpdate",[]]]),this.resolves=new Map,this._sendCommand("new",[t,n])}async init(){return this._sendCommand("init")}play(){return this._sendCommand("play")}pause(){return this._sendCommand("pause")}togglePlay(){return this._sendCommand("togglePlay")}seek(e){return this._sendCommand("seek",e)}step(e){return this._sendCommand("step",e)}stop(){return this._sendCommand("stop")}getChanges(){return this._sendCommand("getChanges")}getCurrentTime(){return this._sendCommand("getCurrentTime")}getRemainingTime(){return this._sendCommand("getRemainingTime")}getProgress(){return this._sendCommand("getProgress")}getDuration(){return this._sendCommand("getDuration")}addEventListener(e,t){const n=this.eventHandlers.get(e);0===n.length&&this._sendNotification("addEventListener",[e]),n.push(t)}_dispatchEvent(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(const n of this.eventHandlers.get(e))n(t)}_sendCommand(e,t){let n;const r=new Promise((e=>{n=e}));return this.resolves.set(this.nextId,n),this.worker.postMessage({method:e,params:t,id:this.nextId}),this.nextId++,r}_sendNotification(e,t){this.worker.postMessage({method:e,params:t})}_onMessage(e){void 0!==e.data.id?(this.resolves.get(e.data.id)(e.data.result),this.resolves.delete(e.data.id)):"onEvent"===e.data.method&&this._dispatchEvent(e.data.params.name,e.data.params.event)}}return e.create=function(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const l=r.logger===console||void 0,o=new Gt(n,e,function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=Object.fromEntries(Object.entries(e).filter((e=>{let[t]=e;return Vt.includes(t)})));return n.autoPlay??=n.autoplay,n.speed??=1,{...n,...t}}(r,{logger:l})),i=r.logger??new h,{el:s,dispose:a}=It(o,t,function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=Object.fromEntries(Object.entries(e).filter((e=>{let[t]=e;return Xt.includes(t)})));return n.autoPlay??=n.autoplay,n.controls??="auto",{...n,...t}}(r,{logger:i})),c=o.init(),u={el:s,dispose:a,getCurrentTime:()=>c.then(o.getCurrentTime.bind(o)),getDuration:()=>c.then(o.getDuration.bind(o)),play:()=>c.then(o.play.bind(o)),pause:()=>c.then(o.pause.bind(o)),seek:e=>c.then((()=>o.seek(e))),addEventListener:(e,t)=>o.addEventListener(e,t.bind(u))};return u},e}({}); diff --git a/packages/landing/public/asciinema-player/asciinema-player-worker.min.js b/packages/landing/public/asciinema-player/asciinema-player-worker.min.js new file mode 100644 index 000000000..53014d92b --- /dev/null +++ b/packages/landing/public/asciinema-player/asciinema-player-worker.min.js @@ -0,0 +1 @@ +!function(){"use strict";function A(A){return"number"==typeof A?A:"string"==typeof A?A.split(":").reverse().map(parseFloat).reduce(((A,V,g)=>A+V*Math.pow(60,g))):void 0}const V=/^#[0-9a-f]{6}$/,g=/^#[0-9a-f]{3}$/;function I(A){let I=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if("string"!=typeof A)return I;const B=A.trim().toLowerCase();return V.test(B)?B:g.test(B)?`#${B[1]}${B[1]}${B[2]}${B[2]}${B[3]}${B[3]}`:I}class B{constructor(A,V){this.logger=A,this.prefix=V}log(A){for(var V=arguments.length,g=new Array(V>1?V-1:0),I=1;I1?V-1:0),I=1;I1?V-1:0),I=1;I1?V-1:0),I=1;I1?V-1:0),I=1;I0?`Function(${V})`:"Function"}if(Array.isArray(A)){const V=A.length;let g="[";V>0&&(g+=E(A[0]));for(let I=1;I1))return toString.call(A);if(I=g[1],"Object"==I)try{return"Object("+JSON.stringify(A)+")"}catch(A){return"Object"}return A instanceof Error?`${A.name}: ${A.message}\n${A.stack}`:I}function e(A,V){return A>>>=0,function(){null!==s&&0!==s.byteLength||(s=new Uint32Array(Q.memory.buffer));return s}().subarray(A/4,A/4+V)}let t=null;function i(){return(null===t||!0===t.buffer.detached||void 0===t.buffer.detached&&t.buffer!==Q.memory.buffer)&&(t=new DataView(Q.memory.buffer)),t}function o(A,V){return function(A,V){F+=V,F>=y&&(h=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),h.decode(),F=V);return h.decode(n().subarray(A,A+V))}(A>>>=0,V)}let s=null;let r=null;function n(){return null!==r&&0!==r.byteLength||(r=new Uint8Array(Q.memory.buffer)),r}function a(A){return w[A]}let w=new Array(128).fill(void 0);w.push(void 0,null,!0,!1);let D=w.length;function c(A,V,g){if(void 0===g){const g=l.encode(A),I=V(g.length,1)>>>0;return n().subarray(I,I+g.length).set(g),d=g.length,I}let I=A.length,B=V(I,1)>>>0;const Q=n();let C=0;for(;C127)break;Q[B+C]=V}if(C!==I){0!==C&&(A=A.slice(C)),B=g(B,I,I=C+3*A.length,1)>>>0;const V=n().subarray(B+C,B+I);C+=l.encodeInto(A,V).written,B=g(B,I,C,1)>>>0}return d=C,B}function q(A){const V=a(A);return function(A){A<132||(w[A]=D,D=A)}(A),V}let h=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});h.decode();const y=2146435072;let F=0;const l=new TextEncoder;"encodeInto"in l||(l.encodeInto=function(A,V){const g=l.encode(A);return V.set(g),{read:A.length,written:g.length}});let d=0;const k="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry((A=>Q.__wbg_vt_free(A>>>0,1)));class G{static __wrap(A){A>>>=0;const V=Object.create(G.prototype);return V.__wbg_ptr=A,k.register(V,V.__wbg_ptr,V),V}__destroy_into_raw(){const A=this.__wbg_ptr;return this.__wbg_ptr=0,k.unregister(this),A}free(){const A=this.__destroy_into_raw();Q.__wbg_vt_free(A,0)}feed(A){const V=c(A,Q.__wbindgen_export,Q.__wbindgen_export2),g=d;return q(Q.vt_feed(this.__wbg_ptr,V,g))}resize(A,V){return q(Q.vt_resize(this.__wbg_ptr,A,V))}getSize(){try{const I=Q.__wbindgen_add_to_stack_pointer(-16);Q.vt_getSize(I,this.__wbg_ptr);var A=i().getInt32(I+0,!0),V=i().getInt32(I+4,!0),g=e(A,V).slice();return Q.__wbindgen_export3(A,4*V,4),g}finally{Q.__wbindgen_add_to_stack_pointer(16)}}getLine(A,V){return q(Q.vt_getLine(this.__wbg_ptr,A,V))}getCursor(){return q(Q.vt_getCursor(this.__wbg_ptr))}}Symbol.dispose&&(G.prototype[Symbol.dispose]=G.prototype.free);const u=new Set(["basic","cors","default"]);function N(){const A={wbg:{}};return A.wbg.__wbg___wbindgen_debug_string_adfb662ae34724b6=function(A,V){const g=c(E(a(V)),Q.__wbindgen_export,Q.__wbindgen_export2),I=d;i().setInt32(A+4,I,!0),i().setInt32(A+0,g,!0)},A.wbg.__wbg___wbindgen_throw_dd24417ed36fc46e=function(A,V){throw new Error(o(A,V))},A.wbg.__wbg_new_13317ed16189158e=function(){return C(new Array)},A.wbg.__wbg_new_4ceb6a766bf78b04=function(){return C(new Object)},A.wbg.__wbg_set_3f1d0b984ed272ed=function(A,V,g){a(A)[q(V)]=q(g)},A.wbg.__wbg_set_8b6a9a61e98a8881=function(A,V,g){a(A)[V>>>0]=q(g)},A.wbg.__wbindgen_cast_2241b6af4c4b2941=function(A,V){return C(o(A,V))},A.wbg.__wbindgen_cast_4625c577ab2ec9ee=function(A){return C(BigInt.asUintN(64,A))},A.wbg.__wbindgen_cast_d6cd19b81560fd6e=function(A){return C(A)},A.wbg.__wbindgen_object_clone_ref=function(A){return C(a(A))},A.wbg.__wbindgen_object_drop_ref=function(A){q(A)},A}function U(A,V){return Q=A.exports,f.__wbindgen_wasm_module=V,t=null,s=null,r=null,Q}async function f(A){if(void 0!==Q)return Q;void 0!==A&&(Object.getPrototypeOf(A)===Object.prototype?({module_or_path:A}=A):console.warn("using deprecated parameters for the initialization function; pass a single object instead"));const V=N();("string"==typeof A||"function"==typeof Request&&A instanceof Request||"function"==typeof URL&&A instanceof URL)&&(A=fetch(A));const{instance:g,module:I}=await async function(A,V){if("function"==typeof Response&&A instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(A,V)}catch(V){if(!A.ok||!u.has(A.type)||"application/wasm"===A.headers.get("Content-Type"))throw V;console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",V)}const g=await A.arrayBuffer();return await WebAssembly.instantiate(g,V)}{const g=await WebAssembly.instantiate(A,V);return g instanceof WebAssembly.Instance?{instance:g,module:A}:g}}(await A,V);return U(g,I)}var M=Object.freeze({__proto__:null,Vt:G,create:function(A,V,g,I){const B=Q.create(A,V,g,I);return G.__wrap(B)},default:f,initSync:function(A){if(void 0!==Q)return Q;void 0!==A&&(Object.getPrototypeOf(A)===Object.prototype?({module:A}=A):console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const V=N();return A instanceof WebAssembly.Module||(A=new WebAssembly.Module(A)),U(new WebAssembly.Instance(A,V),A)}});const J=[62,0,0,0,63,52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];function R(A){return J[A-43]}var L=function(A){let V,g=A.endsWith("==")?2:A.endsWith("=")?1:0,I=A.length,B=new Uint8Array(I/4*3);for(let g=0,Q=0;g>16,B[Q+1]=V>>8&255,B[Q+2]=255&V;return B.subarray(0,B.length-g)}("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CAgJCgsODA4NDgsgAkGoAWpBASABKAIAIAEoAgRB1NzAABCBASABIAIpA6gBNwIAIABBADoAAAwYCyACQbABakEBIAEoAgAgASgCBEHk3MAAEIEBIAEgAikDsAE3AgAgAEEBOgAADBcLIAJBuAFqQQEgASgCACABKAIEQfTcwAAQgQEgASACKQO4ATcCACAAQQI6AAAMFgsgAkHAAWpBASABKAIAIAEoAgRBhN3AABCBASABIAIpA8ABNwIAIABBAzoAAAwVCyACQcgBakEBIAEoAgAgASgCBEGU3cAAEIEBIAEgAikDyAE3AgAgAEEEOgAADBQLIAJB0AFqQQEgASgCACABKAIEQaTdwAAQgQEgASACKQPQATcCACAAQQU6AAAMEwsgAkHYAWpBASABKAIAIAEoAgRBtN3AABCBASABIAIpA9gBNwIAIABBBjoAAAwSCyACQeABakEBIAEoAgAgASgCBEHE3cAAEIEBIAEgAikD4AE3AgAgAEEHOgAADBELIAJB6AFqQQEgASgCACABKAIEQdTdwAAQgQEgASACKQPoATcCACAAQQg6AAAMEAsgAkHwAWpBASABKAIAIAEoAgRB5N3AABCBASABIAIpA/ABNwIAIABBCToAAAwPCyACQfgBakEBIAEoAgAgASgCBEH03cAAEIEBIAEgAikD+AE3AgAgAEEKOgAADA4LIAJBgAJqQQEgASgCACABKAIEQYTewAAQgQEgASACKQOAAjcCACAAQQs6AAAMDQsgAkGIAmpBASABKAIAIAEoAgRBlN7AABCBASABIAIpA4gCNwIAIABBDDoAAAwMCyACQZACakEBIAEoAgAgASgCBEGk3sAAEIEBIAEgAikDkAI3AgAgAEENOgAADAsLAkACQCADQR5rQf//A3FBCE8EQCADQSZrDgIBCAILIAJBCGpBASABKAIAIAEoAgRBxODAABCBASABIAIpAwg3AgAgACADQR5rOgACIABBDjsAAAwMCwJAIAEoAgQiA0ECTwRAIAJBmAFqIAEoAgBBEGoQaSACKAKYASIDDQEgASgCBCEDCyACQegAakEBIAEoAgAgA0G03sAAEIEBIAIoAmwhAyACKAJoIQQMDQsCQAJAAkAgAigCnAFBAUcNACADLwEAQQJrDgQBAAACAAsgAkHwAGpBASABKAIAIAEoAgRBhN/AABCB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ACABQQRqIQwgAkFAayENIAJBJWohDiACQRxqIQ8gASgCJCEFIAEoAhQhECABKAIQIQMCQAJAAn8CQANAIAEoAgAhBiABQYCAgIB4NgIAIAEoAgQhCwJAAkACQAJAAkAgBkGAgICAeEcEQCABKQIIIREgCyEHDAELAkAgAyAQRgRAQYCAgIB4IQYMAQsgASADQRBqIgg2AhAgAykCCCERIAMoAgQhByADKAIAIQYgCCEDC0GAgICAeCALEKMBIAZBgICAgHhGDQELIAIgBzYCDCACIAY2AgggAiARNwIQIBFCIIghEkF/IAUgEaciBEcgBCAFSxtB/wFxDgICAwELQYCAgIB4IAcQowEgAEGAgICAeDYCACABQYCAgIB4NgIADAcLAkAgEqdBAXENACAFIAQgByAEEDRrIgMgAyAFSRsiAyAESw0AIAIgAzYCECADIQQLAn9BgICAgHggBCAFTQ0AGgJAAkAgByAEIAVBuNrAABCQASgCBEUEQCACQThqIgMgAkEIaiIIIAVBAWsQPyACQTBqIANBCGooAgA2AgAgAiACKQI4NwMoIAItABQhBCADQRBqIAIoAgwgAigCECIHIAdBAWtB2NrAABCQASIHQRBqLwEAOwEAIAJCoICAgBA3AjggAiAHKQIINwJAIAggA0Ho2sAAEFcgAiAEOgA0IAItABRBAXFFDQEMAgsgAkE4aiIDIAJBCGogBRA/IAJBMGogA0EIaigCADYCACACIAIpAjg3AyggAiACLQAUIgM6ADQgAw0BCyACQShqEIsBCyACKAIwBEAgAkFAayACQTRqKAIANgIAIAJBAToAFCACIAIpAiw3AzggAigCKAwBCyACKAIoIAIoAixBBEEUEJ8BQYCAgIB4CyEDQYCAgIB4IAsQowEgASADNgIAIAwgAikDODcCACAMQQhqIAJBQGsoAgA2AgAgAEEIaiACQRBqKQIANwIAIAAgAikCCDcCAAwGCyAAIBE3AgggACAHNgIEIAAgBjYCAAwFCwJAIAMgEEcEQCABIANBEGoiCDYCECADKAIAIgZBgICAgHhHDQELIAJBADsAQCACQQI6ADwgAkECOgA4IAJBCGoiASAFIAJBOGoQQSAAIAIpAgg3AgAgAkEAOgAUIABBCGogAUEIaikCADcCAAwFCyADQQxqKAIAIQkgDyADKQIENwIAIA9BCGogCTYCACACIAY2AhggBSAEayIJRQ0BIBKnQQFxRQRAIAJBADsAQCACQQI6ADwgAkECOgA4IAJBCGogBSACQThqEEEMAgsgAi0AJEUEQCACQRhqEIsBCyACKAIcIQMgAigCICIKIAlNBEAgAkEIaiIEIAMgChCAAQJAIAItACQiBg0AIAJBADoAFCACKAIQIAVPDQAgAkEAOwBAIAJBAjoAPCACQQI6ADggBCAFIAJBOGoQQQsgAigCGCADQQRBFBCfASAGRQ0EQYCAgIB4IAsQowEgAUEIaiACQRBqKQIANwIAIAEgAikCCDcCAEGAgICAeCACEKMBIAghAwwBCwsgAyAKIAlB+NnAABCQASgCBEUEQCANQQhqIAcgBCAEQQFrQYjawAAQkAEiCEEQai8BADsBACANIAgpAgg3AgAgAkKggICAEDcCOCACQQhqIAJBOGpBmNrAABBXIAlBAWshCQsgCSAKTQRAIAJBCGogAyAJEIABIAIoAhghBiADIAogCRCIASAGQYCAgIB4Rg0DIAogCiAJayIIIAggCksbIQQgAi0AJAwCCyAJIApBqNrAABCzAQALIAJBKmogDkECai0AADoAACACIA4vAAA7ASggAigCICEEIAIoAhwhAyACLQAkCyEIQYCAgIB4IAsQowEgASAIOgAMIAEgBDYCCCABIAM2AgQgASAGNgIAIAEgAi8BKDsADSABQQ9qIAJBKmotAAA6AAALIAAgAikCCDcCACAAQQhqIAJBEGopAgA3AgALIAJB0ABqJAAL5QoCEH8BfiMAQZABayICJAAgACgCbCIFIAAoAhwiBmsiAUEAIAEgACgCFCIHIAZrIAVqTRshDSAFIAdqIQMgB0EEdCIBIAAoAhAiCmohDyAAKAIYIQwgACgCaCEOIAAoAqABIQsgACgCnAEhCCAKIQQDQAJAIAMgBkYNACABRQ0AIAkgDGpBACAELQAMIhAbIQkgA0EBayEDIAFBEGshASAEQRBqIQQgDSAQQQFzaiENDAELCyAIIAxHBEBBACEFIABBADYCFCACIAg2AjggAkEANgI0IAIgBzYCMCACIABBDGoiDDYCLCACIA82AiggAiAKNgIkIAJBgICAgHg2AhQgAkHIAGogAkEUaiIBEBACfyACKAJIQYCAgIB4RgRAIAEQoQFBBCEEQQAMAQsgAkEIakEE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QQlJDQEgA0UEQCABIQMDQCADIAVqIgEgAyACEGogASEDIAIgACACayIATQ0ACwwBCwtBACAAQQR0IgNrIQUDQCABIAVqIAEgABBqIAEgA2ohASACIABrIgIgAE8NAAsMAQsLIAEgAEEEdCIFayIDIAJBBHQiBmohByAAIAJLDQEgBEEQaiIAIAMgBRAWGiADIAEgBhASIAcgACAFEBYaDAILIARBCGoiByABIABBBHRrIgZBCGopAgA3AwAgBCAGKQIANwMAIAJBBHQhCCACIgUhAQNAIAYgAUEEdGohAwNAIARBGGoiCSADQQhqIgopAgA3AwAgBCADKQIANwMQIAcpAwAhDSADIAQpAwA3AgAgCiANNwIAIAcgCSkDADcDACAEIAQpAxA3AwAgACABSwRAIAMgCGohAyABIAJqIQEMAQsLIAEgAGsiAQRAIAEgBSABIAVJGyEFDAEFIAQpAwAhDSAGQQhqIARBCGoiBykDADcCACAGIA03AgBBASAFIAVBAU0bIQlBASEBA0AgASAJRg0EIAYgAUEEdGoiBSkCACENIAcgBUEIaiIKKQIANwMAIAQgDTcDACABIAJqIQMDQCAEQRhqIgsgBiADQQR0aiIIQQhqIgwpAgA3AwAgBCAIKQIANwMQIAcpAwAhDSAIIAQpAwA3AgAgDCANNwIAIAcgCykDADcDACAEIAQpAxA3AwAgACADSwRAIAIgA2ohAwwBCyADIABrIgMgAUcNAAsgBCkDACENIAogBykDADcCACAFIA03AgAgAUEBaiEBDAALAAsACwALIARBEGoiACABIAYQFhogByADIAUQEiADIAAgBhAWGgsgBEGQAWokAAuQBQEIfwJAIAJBEEkEQCAAIQMMAQsCQEEAIABrQQNxIgYgAGoiBSAATQ0AIAZBAWsgACEDIAEhBCAGBEAgBiEHA0AgAyAELQAAOgAAIARBAWohBCADQQFqIQMgB0EBayIHDQALC0EHSQ0AA0AgAyAELQAAOgAAIANBAWogBEEBai0AADoAACADQQJqIARBAmotAAA6AAAgA0EDaiAEQQNqLQAAOgAAIANBBGogBEEEai0AADoAACADQQVqIARBBWotAAA6AAAgA0EGaiAEQQZqLQAAOgAAIANBB2ogBEEHai0AADoAACAEQQhqIQQgBSADQQhqIgNHDQALCyACIAZr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AygCHCIAIAEgAhAlIANBKGogAEHgAGooAgAgAEHkAGooAgAQIyADQRBqIAAQJCADIAMpAxA3AjQgA0EIaiADKAIsIAMoAjAQWyADKAIMIQAgAygCCEEBcQRAIAMgADYCPCADQTxqQezCwAAQQgALIANBKGoQbiADKAIgIAMoAiQQsgEgA0FAayQAIAALmQEBA38gAUFsbCECIAFB/////wNxIQMgACABQRRsaiEBQQAhAAJAA0AgAkUNAQJAIAFBFGsiBCgCAEEgRw0AIAFBEGsoAgBBAUcNACABQQxrLQAAQQJHDQAgAUEIay0AAEECRw0AIAFBBGstAAANACABQQNrLQAAQR9xDQAgAkEUaiECIABBAWohACAEIQEMAQsLIAAhAwsgAwuxAQECfyMAQRBrIgIkAAJAIAFFDQAgAUEDakECdiEBAkAgAEEETQRAIAFBAWsiA0GAAkkNAQsgAkGsssEAKAIANgIIIAEgACACQQhqQaiqwQBBBEEFEE8hAEGsssEAIAIoAgg2AgAMAQsgAkGsssEANgIEIAIgA0ECdEGsqsEAaiIDKAIANgIMIAEgACACQQxqIAJBBGpBBkEHEE8hACADIAIoAgw2AgALIAJBEGokACAAC6ABAQN/IwBBEGsiBSQAIAVBCGogACABIAJB4M7AABBnIAUoAgwiBiADIAIgAWsiByADIAdJGyIDTwRAIAYgA2siBiAFKAIIIAZBBHRqIAMQFSAAIAEgASADaiAEECogAQRAIAAgAUEBa0HwzsAAEGJBADoADAsgACACQQFrQYDPwAAQYkEAOgAMIAVBEGokAA8LQczJwABBIUHwycAAEHEAC6gBAQF/IwBBQGoiAyQAIANBCGogACgCABACIAMoAgghACADIAMoAgw2AgQgAyAANgIAIANBATYCMCADQQI2AhggA0GYqsEANgIUIANCATcCICADIAMoAgQiADYCPCADIAMoAgA2AjggAyAANgI0IAMgA0E0ajYCLCADIANBLGo2AhwgASACIANBFGoQFyADKAI0IgEEQCADKAI4QQEgARA4CyADQUBrJAALpAEBAX8jAEEQayIDJAACQCAARQ0AIAJFDQACQCABQQRNBEAgAkEDakECdkEBayIBQYACSQ0BCyADQayywQAoAgA2AgggACADQQhqQaiqwQBBAhAxQayywQAgAygC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BDYCBCAAIAE2AgALOAACQCABaUEBRw0AQYCAgIB4IAFrIABJDQAgAARAQeyywQAtAAAaIAEgABA1IgFFDQELIAEPCwALOAACQCACQYCAxABGDQAgACACIAEoAhARAgBFDQBBAQ8LIANFBEBBAA8LIAAgA0EAIAEoAgwRAwALLQEBfyABIAAoAgBPBH8gACgCBCECIAAtAAhFBEAgASACTQ8LIAEgAkkFQQALC3ABA38gACgCACIEIAAoAggiBUYEQCMAQRBrIgMkACADQQhqIAAgBEEBQQJBCBAmIAMoAggiBEGBgICAeEcEQCADKAIMGiAEIAIQrgEACyADQRBqJAALIAAgBUEBajYCCCAAKAIEIAVBA3RqIAE3AQALNAEBfyAAKAIIIgMgACgCAEYEQCAAIAIQawsgACADQQFqNgIIIAAoAgQgA0ECdGogATYCAAsuAQF/IwBBEGsiAiQAIAJBCGogASAAEIwBIAIoAggiAARAIAJBEGokACAADwsACzcBAX8jAEEgayIBJAAgAUEANgIYIAFBATYCDCABQYzpwAA2AgggAUIENwIQIAFBCGogABCKAQALKgEBfyACIAMQNSIEBEAgBCAAIAEgAyABIANJGxAWGiAAIAIgARA4CyAECysAIAIgA0kEQCADIAIgBBC0AQALIAAgAiADazYCBCAAIAEgA0EUbGo2AgALLwEBfyAAIAIQjgEgACgCBCAAKAIIIgNBFGxqIAEgAkEUbBAWGiAAIAIgA2o2AggLKwAgASADSwRAIAEgAyAEELQBAAsgACADIAFrNgIEIAAgAiABQQR0ajYCAAsvAAJAAkAgA2lBAUcNAEGAgICAeCADayABSQ0AIAAgASADIAIQfiIADQELAAsgAAsuAANAIAEEQCAAKAIAIABBBGooAgBBBEEUEJ8BIAFBAWshASAAQRBqIQAMAQsLCzIBAX8gACgCCCECIAEgACgCAEECai0AABCbASEBIAAoAgQgAiABEAEgACACQQFqNgIICyoAIAAgACgCaCABaiIBIAAoApwBIgBBAWsgACABSxtBACABQQBOGzYCaAszAQJ/IAAgACgCqAEiAiAAKAKsAUEBaiIDIAEgAEGyAWoQNiAAKAJgIAAoAmQgAiADEFMLMwECfyAAIAAoAqgBIgIgACgCrAFBAWoiAyABIABBsgFqEB0gACgCYCAAKAJkIAIgAxBTCyoAIAEgAkkEQEGkyMAAQSNBvMnAABBxAAsgAiAAIAJBFGxqIAEgAmsQGQs1ACAAIAApAnQ3AmggACAAKQF8NwGyASAAIAAvAYYBOwG+ASAAQboBaiAAQYQBai8BADsBAAvsAQICfwF+IwBBEGsiAiQAIAJBATsBDCACIAE2AgggAiAANgIEIwBBEGsiASQAIAJBBGoiACkCACEEIAEgADYCDCABIAQ3AgQjAEEQayIAJAAgAUEEaiIBKAIAIgIoAgwhAwJAAkACQAJAIAIoAgQOAgABAgsgAw0BQQEhAkEAIQMMAgsgAw0AIAIoAgAiAigCBCEDIAIoAgAhAgwBCyAAQYCAgIB4NgIAIAAgATYCDCABKAIIIgEtAAkaIABBGyABLQAIEEoACyAAIAM2AgQgACACNgIAIAEoAggiAS0ACRogAEEcIAEtAAgQSgALKwECfwJAIAAoAgQgACgCCCIBEDQiAkUNACABIAJJDQAgACABIAJrNgIICwsmACACBEBB7LLBAC0AABogASACEDUhAQsgACACNgIEIAAgATYCAAsjAQF/IAEgACgCACAAKAIIIgJrSwRAIAAgAiABQQRBEBBtCwsjAQF/IAEgACgCACAAKAIIIgJrSwRAIAAgAiABQQRBFBBtCwslACAAQQE2AgQgACABKAIEIAEoAgBrQQR2IgE2AgggACABNgIACxsAIAEgAk0EQCACIAEgAxBLAAsgACACQRRsagsgACABIAJNBEAgAiABQeTjwAAQSwALIAAgAmpBAToAAAsbACABIAJNBEAgAiABIAMQSwALIAAgAkEEdGoLAwAACwMAAAsDAAALAwAACwMAAAsDAAALGgBB7LLBAC0AABpBBCAAEDUiAARAIAAPCwALIQAgAEUEQEGc68AAQTIQuQEACyAAIAIgAyABKAIQEQEACxYAIAFBAXFFBEAgALgQCQ8LIACtEAoLRgEBfyAAIAAoAgBBAWsiATYCACABRQRAIABBDGoQRwJAIABBf0YNACAAIAAoAgRBAWsiATYCBCABDQAgAEEEQZwGEDgLCwsfACAARQRAQZzrwABBMhC5AQALIAAgAiABKAIQEQIACyEBAX8gACgCECIBIAAoAhQQgwEgACgCDCABQQRBEBCfAQsSACAABEAgASACIAAgA2wQOAsLIQEBfyAAKAIEIgEgACgCCBCDASAAKAIAIAFBBEEQEJ8BCxYAIABBEGoQWCAAKAIAIAAoAgQQowELFAAgACAAKAIAQQFrNgIAIAEQnAELGQAgAEGAgICAeEcEQCAAIAFBBEEUEJ8BCwsUACABBEBBgICAgHggARCjAQsgAQsZACABKAIcQcjlwABBDiABKAIgKAIMEQMACw8AIAIEQCAAIAEgAhA4CwsPACABBEAgACACIAEQOAsLEwAgAARADwtBpKnBAEEbELkBAAsPACAAQYQBTwRAIAAQAwsLEwAgACgCCCAAKAIAQQJBAhCfAQsVACACIAIQpAEaIABBgICAgHg2AgALFAAgACgCACABIAAoAgQoAgwRAgALEAAgASAAKAIEIAAoAggQDws8ACAARQRAIwBBIGsiACQAIABBADYCGCAAQQE2AgwgAEHQxMAANgIIIABCBDcCECAAQQhqIAEQigEACwALFAAgAEEANgIIIABCgICAgBA3AgALEgAgACABQZDNwAAQYkEBOgAMCxAAIAEgACgCACAAKAIEEA8LDgAgAEEANgIAIAEQnAELawEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQejpwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgOABhDcDKCADIAOtQoCAgIDgAYQ3AyAgAyADQSBqNgIQIANBCGogAhCKAQALawEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQcjpwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgOABhDcDKCADIAOtQoCAgIDgAYQ3AyAgAyADQSBqNgIQIANBCGogAhCKAQALawEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQZzqwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgOABhDcDKCADIAOtQoCAgIDgAYQ3AyAgAyADQSBqNgIQIANBCGogAhCKAQALDgBB8OXAAEErIAAQcQALCwAgACMAaiQAIwALDgBBv6nBAEHPABC5AQALCQAgACABEAcACw0AIABB9ObAACABEBcLDAAgACABKQIANwMACwoAIAAoAgAQqQELDQAgAEGAgICAeDYCAAsJACAAQQA2AgALBgAgABBYCwUAQYAECwQAQQELBAAgAQsEAEEACwvSbSAAQYCAwAALQB0AAAAEAAAABAAAAB4AAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlRXJyb3IAQb+JwAALAXgAQeCJwAALEP////////////////////8AQYaKwAALDwEAAAAAACAAAAAAAAAAAgBBwIrAAAsg//////////////////////////////////////////8AQaSLwAALCBAAAAAAAAABAEHAuMAACwL/BwBB1LjAAAsHDwD////1/wBBgLnAAAsW////////////////////////////AwBBoLnAAAsd/////////////////////////////////////w8AQf+5wAALGPz//////////////////////////////wBBoLrAAAs+//////////////////////////////////////////////////////////////////////////////////8AQYy7wAALOP////////////////////////////////////////////////////////////////////////9/AEHgu8AAC9EB/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMAQcC9wAALJ///////////////////////////////////////////////////DwBBwMDAAAvBI3NyYy9saWIucnMAAAEADwDwGg8AAAAAAOIlAADlJQAAAAAAALDgAACz4AAAAAAAADz7AQBp+wEAAAAAAGr7AQBs+wEAAAAAAIAlAACfJQAAAAAAAAD7AQA7+wEAAAAAAGF0dGVtcHRlZCB0byB0YWtlIG93bmVyc2hpcCBvZiBSdXN0IHZhbHVlIHdoaWxlIGl0IHdhcyBib3Jyb3dlZGJndGV4dGNvZGVwb2ludHNyYXN0ZXJfc3ltYm9s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FVFVVVVVVVVVAAAAAAAAQFVVVVVVVVVVVdVXVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVVVVRUAAFVVUVVVVVVVBRAAAAEBUFVVVVVVVVVVVVUBVVVVVVX/////f1VVVVBVAABVVVVVVVVVVVVVBQBBwPzAAAuYBEBVVVVVVVVVVVVVVVVVRVQBAFRRAQBVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVRAFUVVFVFVVVBVVVVVVVVUVBVVVVVVVVVVVVVVVVVVVUQRUUUFFVVVVVVVVVUFFVVUFVVVVVVVVVVVVVVVVVVVQBEFRRVVVVVQVVVVVVVQUAUVVVVVVVVVVVVVVVVVVVBAFUVVFVAVVVBVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVFVFVVUVUVVVVVVVVVVVVVVVRUVVVVVVVVVVVVVVVVVQRUBQRQVUFVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVFEQFBFBVQVVVBVVVVVVVVVVQVVVVVVVVVVVVVVVVVRVEAVRVQVUVVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVUUVBURVFVVVVVVVVVVVVVVVVVVVVVVVVVVVUQBAVVUVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAABUVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVURUVVVVVVVVVVVVVVVVVUBAABAAARVAQAAAQAAAAAAAAAAVFVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQEEAEFBVVVVVVVVUAVUVVVVAVRVVUVBVVFVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAEGAgcEAC5ADVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVBVRVVVVVVVUFVVVVVVVVVQVVVVVVVVVVBVVVVX///ff//ddfd9bV11UQAFBVRQEAAFVXUVVVVVVVVVVVVVUVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVUVUVVAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcVFFVVVVVVVVVVVVVVVVVVRQBARAEAVBUAABRVVVVVVVVVVVVVVVUAAAAAAAAAQFVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVUAAFAFVVVVVVVVVVVVFQAAVVVVUFVVVVVVVVUFUBBQVVVVVVVVVVVVVVVVVUVQEVBVVVVVVVVVVVVVVVVVVQAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAQAVFFVVFBVVVVVVVVVVVVVVVVVVVVVVQBBoITBAAuTCFVVFQBVVVVVVVUFQFVVVVVVVVVVVVVVVQAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAFRVVVVVVVVVVVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/VfXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX1VVVVVVV9VVVVVVVVVVVVVVVX///9VVVVVVVVVVVVV1VVVVVXVVVVVXVX1VVVVVX1VX1V1VVdVVVVVdVX1XXVdVV31VVVVVVVVVVdVVVVVVVVVVXfV31VVVVVVVVVVVVVVVVVVVf1VVVVVVVVXVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVV11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVBVVVVVVVVVVVVVVVVVVVX9////////////////X1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWpqqqqqqqqqqqqqqmqqqqqqqqqqqqqqqqoqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVlaqqqqqqqqqqqqqqaqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVVVVVVVVVVVVVVVVVVVqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVV9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVQAAAUFVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVRUUVVVVVVVVVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAUFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUUVVVVVWqqqqqqqqqqqpVVVUAAAAAAEAVAEG/jMEAC+EMVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAA8KqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFamqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlZVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQFUBQVUAVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEAFVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUARVRVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUVAEBVVVVVVVBVVVVVVVVVVVVVVVVVFURUVVVVVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBRAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVAABBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRUEEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAFVVRVVVVVVVVVAQBAVVVVVVVVVVVVFQAEQFUVVVUBQAFVVVVVVVVVVVVVAAAAAEBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAABBVVVVVVVVVVVVVVVVVVVVVVVVVVQUAAAAAAAUABEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBQEUQAABVVVVVVVVVVVVVVVVVVVVVVVVQEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVUVVVAVVVVVVVVVVVVVVVVBUBVRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQAAAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBUVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVVpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVVVqqpWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqmqaaqqqqqqqqqqalVVVWVVVVVVVVVVallVVVWqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBBq5nBAAt1UAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRFQBQAAAABAAQBVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVAEGtmsEACwJAFQBBu5rBAAvFBlRVUVVVVVRVVVVVFQABAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAAAAAUABAEQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVdf3/f1VVVVVVVVVVVVVVVVVVVVVVVfX///////9uVVVVqqq6qqqqqur6v79VqqpWVV9VVVWqWlVVVVVVVf//////////V1VV/f/f///////////////////////3//////9VVVX/////////////f9X/VVVV/////1dX//////////////////////9/9//////////////////////////////////////////////////////////////X////////////////////X1VV1X////////9VVVVVdVVVVVVVVX1VVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVXV////////////////////////////VVVVVVVVVVVVVVVV//////////////////////9fVVd//VX/VVXVV1X//1dVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9VV1VVVVVVVf//////////////f///3/////////////////////////////////////////////////////////////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////V///V1X//////////////9//X1X1////Vf//V1X//1dVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVmWVWGqpVmqVVVVVVWVVVVVVVVVVZVVVQBBjqHBAAsBAwBBnKHBAAuJCVVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVZVWlWqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqqqqqqqqqqqqVVVVqqqqqqVaVVWaqlpVpaVVWlqllqVaVVVVpVpVlVVVVX1VaVmlVV9VZlVVVVVVVVVVZlX///9VVVWammqaVVVV1VVVVVXVVVWlXVX1VVVVVb1Vr6q6qquqqppVuqr6rrquVV31VVVVVVVVVVdVVVVVWVVVVXfV31VVVVVVVVWlqqpVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqalWqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////8vbml4L3N0b3JlLzI4aHl6ZmwzMzhrczRhbWhhN3ZwcG5sYnExczFucWF2LXJ1c3QtZGVmYXVsdC0xLjg1LjAvbGliL3J1c3RsaWIvc3JjL3J1c3QvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy5ycy9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTA2L3NyYy9jb252ZXJ0L3NsaWNlcy5ycy9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTA2L3NyYy9leHRlcm5yZWYucnMdVBAAZwAAAH8AAAARAAAAHVQQAGcAAACMAAAAEQAAAG51bGwgcG9pbnRlciBwYXNzZWQgdG8gcnVzdHJlY3Vyc2l2ZSB1c2Ugb2YgYW4gb2JqZWN0IGRldGVjdGVkIHdoaWNoIHdvdWxkIGxlYWQgdG8gdW5zYWZlIGFsaWFzaW5nIGluIHJ1c3RKc1ZhbHVlKCkADlUQAAgAAAAWVRAAAQBBqKrBAAsBBABICXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AgZ3YWxydXMGMC4yNC40DHdhc20tYmluZGdlbhMwLjIuMTA2ICgxMTgzMWZiODkp");class S{constructor(){let A=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.speed=A,this.startTime=performance.now()}getTime(){return this.speed*(performance.now()-this.startTime)/1e3}setTime(A){this.startTime=performance.now()-A/this.speed*1e3}}class Y{constructor(){}getTime(A){}setTime(A){}}class p{constructor(A,V){this.input="function"==typeof A.next?A:A[Symbol.iterator](),this.xfs=V??[]}map(A){return this.transform(function(A){return V=>g=>{V(A(g))}}(A))}flatMap(A){return this.transform(function(A){return V=>g=>{A(g).forEach(V)}}(A))}filter(A){return this.transform(function(A){return V=>g=>{A(g)&&V(g)}}(A))}take(A){return this.transform(function(A){let V=0;return g=>I=>{VI=>{V+=1,V>A&&g(I)}}(A))}transform(A){return new p(this.input,this.xfs.concat([A]))}multiplex(A,V){return new p(new K(this[Symbol.iterator](),A[Symbol.iterator](),V))}toArray(){return Array.from(this)}[Symbol.iterator](){let A=0,V=[],g=!1;const I=(B=this.xfs,Q=A=>V.push(A),B.reverse().reduce(((A,V)=>{const g=m(V(A.step));return{step:g.step,flush:()=>{g.flush(),A.flush()}}}),m(Q)));var B,Q;return{next:()=>{for(A===V.length&&(V=[],A=0);0===V.length;){const A=this.input.next();if(A.done)break;I.step(A.value)}return 0!==V.length||g||(I.flush(),g=!0),V.length>0?{done:!1,value:V[A++]}:{done:!0}}}}}function m(A){return"function"==typeof A?{step:A,flush:()=>{}}:A}class K{constructor(A,V,g){this.left=A,this.right=V,this.comparator=g}[Symbol.iterator](){let A,V;return{next:()=>{if(void 0===A&&void 0!==this.left){const V=this.left.next();V.done?this.left=void 0:A=V.value}if(void 0===V&&void 0!==this.right){const A=this.right.next();A.done?this.right=void 0:V=A.value}if(void 0===A&&void 0===V)return{done:!0};if(void 0===A){const A=V;return V=void 0,{done:!1,value:A}}if(void 0===V){const V=A;return A=void 0,{done:!1,value:V}}if(this.comparator(A,V)){const V=A;return A=void 0,{done:!1,value:V}}{const A=V;return V=void 0,{done:!1,value:A}}}}}}function T(A){const V=I(A.foreground),g=I(A.background),B=A.palette;if(void 0===B)return;if(!V||!g||B.length<8)return;const Q=[],C=Math.min(B.length,16);for(let A=0;A"["===A[0])).map(JSON.parse);return{header:g,events:I}}(V);if(void 0!==g){const{header:A,events:V}=g;if(2===A.version)return v(A,V);if(3===A.version)return b(A,V);throw new Error(`asciicast v${A.version} format not supported`)}{const A=JSON.parse(V);if(1===A.version)return H(A)}}else{if("object"==typeof A&&1===A.version)return H(A);if(Array.isArray(A)){const V=A[0];if(2===V.version){return v(V,A.slice(1,A.length))}if(3===V.version){return b(V,A.slice(1,A.length))}throw new Error(`asciicast v${V.version} format not supported`)}}throw new Error("invalid data")}function H(A){let V=0;const g=new p(A.stdout).map((A=>(V+=A[0],[V,"o",A[1]])));return{cols:A.width,rows:A.height,events:g}}function v(A,V){return{cols:A.width,rows:A.height,theme:W(A.theme),events:V,idleTimeLimit:A.idle_time_limit}}function b(A,V){V instanceof p||(V=new p(V));let g=0;return V=V.map((A=>(g+=A[0],[g,A[1],A[2]]))),{cols:A.term.cols,rows:A.term.rows,theme:W(A.term?.theme),events:V,idleTimeLimit:A.idle_time_limit}}function W(A){const V="string"==typeof A?.palette?A.palette.split(":"):void 0;return T({foreground:A?.fg,background:A?.bg,palette:V})}function x(A){return"number"==typeof A?[A,"m",""]:[A[0],"m",A[1]]}function Z(){let A=0;return function(V){return"m"===V[1]?[V[0],V[1],{index:A++,time:V[0],label:V[2]}]:V}}class X{constructor(){this.items=[],this.onPush=void 0}push(A){this.items.push(A),void 0!==this.onPush&&(this.onPush(this.popAll()),this.onPush=void 0)}popAll(){if(this.items.length>0){const A=this.items;return this.items=[],A}{const A=this;return new Promise((V=>{A.onPush=V}))}}}function z(A,V,g,I,B,Q,C,E,e){const t=function(A,V,g,I){return function(B,Q){"o"===B?A(Q):"i"===B?g(Q):"r"===B?V(Q.cols,Q.rows):"m"===B&&I(Q)}}(V,g,I,B);if(0===A)return e.debug("using no buffer"),function(A){return{pushEvent(V){A(V[1],V[2])},pushText(V){A("o",V)},stop(){}}}(t);{let V;return"number"==typeof(A=A??{})?(e.debug(`using fixed time buffer (${A} ms)`),V=V=>A):"function"==typeof A?(e.debug("using custom dynamic buffer"),V=A({logger:e})):(e.debug("using adaptive buffer",A),V=function(){let{logger:A}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{minBufferTime:V=50,bufferLevelStep:g=100,maxBufferLevel:I=50,transitionDuration:B=500,peakHalfLifeUp:Q=100,peakHalfLifeDown:C=1e4,floorHalfLifeUp:E=5e3,floorHalfLifeDown:e=100,idealHalfLifeUp:t=1e3,idealHalfLifeDown:i=5e3,safetyMultiplier:o=1.2,minImprovementDuration:s=3e3}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};function r(A){return 0===A?V:g*A}let n=1,a=r(n),w=performance.now(),D=null,c=null,q=null,h=null,y=null,F=null;return function(l){const d=performance.now(),k=Math.max(0,d-w);if(w=d,null===D)D=l;else if(l>D){const A=1-Math.pow(2,-k/Q);D+=A*(l-D)}else{const A=1-Math.pow(2,-k/C);D+=A*(l-D)}if(D=Math.max(D,0),null===c)c=l;else if(l>c){const A=1-Math.pow(2,-k/E);c+=A*(l-c)}else{const A=1-Math.pow(2,-k/e);c+=A*(l-c)}c=Math.max(c,0);const G=o*(D+(D-c));if(null===q)q=G;else if(G>q){const A=1-Math.pow(2,-k/t);q+=+A*(G-q)}else{const A=1-Math.pow(2,-k/i);q+=+A*(G-q)}let u;var N,U,f;return q<=V?u=0:(N=Math.ceil(q/g),U=1,f=I,u=Math.min(f,Math.max(U,N))),l>a&&A.debug("buffer underrun",{latency:l,bufferTime:a}),u>n?(l>a?n=Math.min(u,n+3):n+=1,y=r(n),F=(y-a)/B,h=null,A.debug("raising buffer",{latency:l,bufferTime:a,targetBufferTime:y})):u=s&&(n-=1,y=r(n),F=(y-a)/B,h=d,A.debug("lowering buffer",{latency:l,bufferTime:a,targetBufferTime:y}))):h=null,null!==y&&(a+=F*k,(F>=0&&a>y||F<0&&a5&&void 0!==arguments[5]?arguments[5]:1/60,C=performance.now()-1e3*B,E=A(0);const e=new X;Q*=1e3;let t=-Q,i=!1;function o(){return performance.now()-C}return setTimeout((async()=>{for(;!i;){const A=await e.popAll();if(i)return;for(const I of A){const A=1e3*I[0]+E;if(A-t0&&(await j(B),i))return;g(I[0]),V(I[1],I[2]),t=A}}}),0),{pushEvent(V){let g=o()-1e3*V[0];g<0&&(I.debug(`correcting epoch by ${g} ms`),C+=g,g=0),E=A(g),e.push(V)},pushText(A){e.push([o()/1e3,"o",A])},stop(){i=!0,e.push(void 0)}}}(V,t,Q,e,C??0,E)}}function j(A){return new Promise((V=>{setTimeout(V,A)}))}const _=1e6;function P(A){const V=new TextDecoder,g=new TextDecoder;let I,B=function(A){const V=(new TextDecoder).decode(A);if("ALiS"!==V)throw new Error("not an ALiS v1 live stream");B=C},Q=0;function C(A){const V=new gA(new DataView(A)),g=V.getUint8();if(1!==g)throw new Error(`expected reset (0x01) frame, got ${g}`);return E(V,A)}function E(A,g){A.decodeVarUint();let C=A.decodeVarUint();I=C,C/=_,Q=0;const E=A.decodeVarUint(),t=A.decodeVarUint(),i=A.getUint8();let o;if(8===i){const V=30;o=$(new Uint8Array(g,A.offset,V)),A.forward(V)}else if(16===i){const V=54;o=$(new Uint8Array(g,A.offset,V)),A.forward(V)}else if(0!==i)throw new Error(`alis: invalid theme format (${i})`);const s=A.decodeVarUint();let r;return s>0&&(r=V.decode(new Uint8Array(g,A.offset,s))),B=e,{time:C,term:{size:{cols:E,rows:t},theme:o,init:r}}}function e(e){const t=new gA(new DataView(e)),i=t.getUint8();return 1===i?E(t,e):111===i?function(A,g){A.decodeVarUint();const B=A.decodeVarUint();I+=B;const Q=A.decodeVarUint(),C=V.decode(new Uint8Array(g,A.offset,Q));return[I/_,"o",C]}(t,e):105===i?function(A,V){A.decodeVarUint();const B=A.decodeVarUint();I+=B;const Q=A.decodeVarUint(),C=g.decode(new Uint8Array(V,A.offset,Q));return[I/_,"i",C]}(t,e):114===i?function(A){A.decodeVarUint();const V=A.decodeVarUint();I+=V;const g=A.decodeVarUint(),B=A.decodeVarUint();return[I/_,"r",{cols:g,rows:B}]}(t):109===i?function(A,V){A.decodeVarUint();const g=A.decodeVarUint();I+=g;const B=A.decodeVarUint(),C=new TextDecoder,E=Q++,e=I/_,t=C.decode(new Uint8Array(V,A.offset,B));return[e,"m",{index:E,time:e,label:t}]}(t,e):120===i?function(A){A.decodeVarUint();const V=A.decodeVarUint();I+=V;const g=A.decodeVarUint();return[I/_,"x",{status:g}]}(t):4===i?(B=C,!1):void A.debug(`alis: unknown frame type: ${i}`)}return function(A){return B(A)}}function $(A){const V=A.length/3,g=AA(A[0],A[1],A[2]),I=AA(A[3],A[4],A[5]),B=[];for(let g=2;g1&&void 0!==arguments[1]?arguments[1]:0;this.inner=A,this.offset=V}forward(A){this.offset+=A}getUint8(){const A=this.inner.getUint8(this.offset);return this.offset+=1,A}decodeVarUint(){let A=BigInt(0),V=BigInt(0),g=this.getUint8();for(;g>127;)g&=127,A+=BigInt(g)<V(A,g,I)}throw new Error(`unsupported driver: ${JSON.stringify(A)}`)}(V),this.changedLines=new Set,this.duration=void 0,this.cols=g.cols,this.rows=g.rows,this.speed=g.speed,this.loop=g.loop,this.autoPlay=g.autoPlay,this.idleTimeLimit=g.idleTimeLimit,this.preload=g.preload,this.startAt=A(g.startAt),this.poster=this._parsePoster(g.poster),this.markers=this._normalizeMarkers(g.markers),this.pauseOnMarkers=g.pauseOnMarkers,this.audioUrl=g.audioUrl,this.boldIsBright=g.boldIsBright??!1,this.commandQueue=Promise.resolve(),this.needsClear=!1,this.eventHandlers=new Map([["ended",[]],["errored",[]],["idle",[]],["input",[]],["loading",[]],["marker",[]],["metadata",[]],["muted",[]],["offline",[]],["pause",[]],["play",[]],["playing",[]],["ready",[]],["seeked",[]],["vtUpdate",[]]])}async init(){this.wasm=await EA;const{memory:A}=await this.wasm.default();this.memory=A,this._initializeVt(this.cols??80,this.rows??24);const V=this._feed.bind(this),g=this._resetVt.bind(this),I=this._resizeVt.bind(this),B=this._setState.bind(this),Q="npt"!==this.poster.type||this.autoPlay?void 0:this.poster.value;this.driver=this.driver({feed:V,onInput:A=>{this._dispatchEvent("input",{data:A})},onMarker:A=>{let{index:V,time:g,label:I}=A;this._dispatchEvent("marker",{index:V,time:g,label:I})},reset:g,resize:I,setState:B,logger:this.logger},{cols:this.cols,rows:this.rows,speed:this.speed,idleTimeLimit:this.idleTimeLimit,startAt:this.startAt,loop:this.loop,posterTime:Q,markers:this.markers,pauseOnMarkers:this.pauseOnMarkers,audioUrl:this.audioUrl}),"function"==typeof this.driver&&(this.driver={play:this.driver}),(this.preload||void 0!==Q)&&this._withState((A=>A.init()));const C={isPausable:!!this.driver.pause,isSeekable:!!this.driver.seek};if(void 0===this.driver.init&&(this.driver.init=()=>({})),void 0===this.driver.pause&&(this.driver.pause=()=>{}),void 0===this.driver.seek&&(this.driver.seek=A=>!1),void 0===this.driver.step&&(this.driver.step=A=>{}),void 0===this.driver.stop&&(this.driver.stop=()=>{}),void 0===this.driver.restart&&(this.driver.restart=()=>{}),void 0===this.driver.mute&&(this.driver.mute=()=>{}),void 0===this.driver.unmute&&(this.driver.unmute=()=>{}),void 0===this.driver.getCurrentTime){const A=this.driver.play;let V=new Y;this.driver.play=()=>(V=new S(this.speed),A()),this.driver.getCurrentTime=()=>V.getTime()}this._dispatchEvent("ready",C),this.autoPlay?this.play():"text"===this.poster.type&&(this._feed(this.poster.value),this.needsClear=!0)}play(){return this._clearIfNeeded(),this._withState((A=>A.play()))}pause(){return this._withState((A=>A.pause()))}togglePlay(){return this._clearIfNeeded(),this._withState((A=>A.togglePlay()))}seek(A){return this._clearIfNeeded(),this._withState((async V=>{await V.seek(A)&&this._dispatchEvent("seeked")}))}step(A){return this._clearIfNeeded(),this._withState((V=>V.step(A)))}stop(){return this._withState((A=>A.stop()))}mute(){return this._withState((A=>A.mute()))}unmute(){return this._withState((A=>A.unmute()))}getLine(A,V){return this.vt.getLine(A,V)}getDataView(A,V){let[g,I]=A;return new DataView(this.memory.buffer,g,I*V)}getUint32Array(A){let[V,g]=A;return new Uint32Array(this.memory.buffer,V,g)}getCursor(){const A=this.vt.getCursor();return A?{col:A[0],row:A[1],visible:!0}:{col:0,row:0,visible:!1}}getCurrentTime(){return this.driver.getCurrentTime()}getRemainingTime(){if("number"==typeof this.duration)return this.duration-Math.min(this.getCurrentTime(),this.duration)}getProgress(){if("number"==typeof this.duration)return Math.min(this.getCurrentTime(),this.duration)/this.duration}getDuration(){return this.duration}addEventListener(A,V){this.eventHandlers.get(A).push(V)}removeEventListener(A,V){const g=this.eventHandlers.get(A);if(!g)return;const I=g.indexOf(V);-1!==I&&g.splice(I,1)}_dispatchEvent(A){let V=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(const g of this.eventHandlers.get(A))g(V)}_withState(A){return this._enqueueCommand((()=>A(this.state)))}_enqueueCommand(A){return this.commandQueue=this.commandQueue.then(A),this.commandQueue}_setState(A){let V=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.stateName===A)return this.state;if(this.stateName=A,"playing"===A)this.state=new oA(this);else if("idle"===A)this.state=new iA(this);else if("loading"===A)this.state=new sA(this);else if("ended"===A)this.state=new nA(this);else if("offline"===A)this.state=new rA(this);else{if("errored"!==A)throw new Error(`invalid state: ${A}`);this.state=new aA(this)}return this.state.onEnter(V),this.state}_feed(A){const V=this.vt.feed(A);this._dispatchEvent("vtUpdate",{changedRows:V})}async _initializeDriver(){const A=await this.driver.init();this.cols=this.cols??A.cols??80,this.rows=this.rows??A.rows??24,this.duration=this.duration??A.duration,this.markers=this._normalizeMarkers(A.markers)??this.markers??[],0===this.cols&&(this.cols=80),0===this.rows&&(this.rows=24),this._initializeVt(this.cols,this.rows),void 0!==A.poster?(A.poster.forEach((A=>this.vt.feed(A))),this.needsClear=!0):"text"===this.poster.type&&(this.vt.feed(this.poster.value),this.needsClear=!0),this._dispatchEvent("metadata",{size:{cols:this.cols,rows:this.rows},theme:A.theme??null,duration:this.duration,markers:this.markers,hasAudio:A.hasAudio}),this._dispatchEvent("vtUpdate",{size:{cols:this.cols,rows:this.rows},theme:A.theme??null,changedRows:Array.from({length:this.rows},((A,V)=>V))})}_clearIfNeeded(){this.needsClear&&(this._feed("c"),this.needsClear=!1)}_resetVt(A,V){let g=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,I=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;this.logger.debug(`core: vt reset (${A}x${V})`),this.cols=A,this.rows=V,this._initializeVt(A,V),void 0!==g&&""!==g&&this.vt.feed(g),this._dispatchEvent("metadata",{size:{cols:A,rows:V},theme:I??null}),this._dispatchEvent("vtUpdate",{size:{cols:A,rows:V},theme:I??null,changedRows:Array.from({length:V},((A,V)=>V))})}_resizeVt(A,V){if(A===this.vt.cols&&V===this.vt.rows)return;const g=this.vt.resize(A,V);this.vt.cols=A,this.vt.rows=V,this.logger.debug(`core: vt resize (${A}x${V})`),this._dispatchEvent("metadata",{size:{cols:A,rows:V}}),this._dispatchEvent("vtUpdate",{size:{cols:A,rows:V},changedRows:g})}_initializeVt(A,V){this.logger.debug("vt init",{cols:A,rows:V}),this.vt=this.wasm.create(A,V,100,this.boldIsBright),this.vt.cols=A,this.vt.rows=V}_parsePoster(V){return"string"!=typeof V?{}:"data:text/plain,"==V.substring(0,16)?{type:"text",value:V.substring(16)}:"npt:"==V.substring(0,4)?{type:"npt",value:A(V.substring(4))}:{}}_normalizeMarkers(A){if(Array.isArray(A))return A.map((A=>"number"==typeof A?[A,""]:A))}}const DA=new Map([["benchmark",function(A,V){let g,{url:I,iterations:B=10}=A,{feed:Q,setState:C}=V,E=0;return{async init(){const A=await O(await fetch(I)),{cols:V,rows:B,events:Q}=A;g=Array.from(Q).filter((A=>{let[V,g,I]=A;return"o"===g})).map((A=>{let[V,g,I]=A;return[V,I]}));const C=g[g.length-1][0];for(const[A,V]of g)E+=new Blob([V]).size;return{cols:V,rows:B,duration:C}},play(){const A=performance.now();for(let A=0;A{C("stopped",{reason:"ended"})}),0),!0}}}],["clock",function(A,V,g){let{hourColor:I=3,minuteColor:B=4,separatorColor:Q=9}=A,{feed:C}=V,{cols:E=5,rows:e=1}=g;const t=Math.floor(e/2),i=Math.floor(E/2)-2,o=`[?25l[${t}B`;let s;const r=()=>{const A=new Date,V=A.getHours(),g=A.getMinutes(),C=[];C.push("\r");for(let A=0;A{r().forEach(C)};return{init:()=>{const A=[o].concat(r());return{cols:E,rows:e,duration:1440,poster:A}},play:()=>(C(o),n(),s=setInterval(n,1e3),!0),stop:()=>{clearInterval(s)},getCurrentTime:()=>{const A=new Date;return 60*A.getHours()+A.getMinutes()}}}],["eventsource",function(A,V){let g,I,{url:Q,bufferTime:C,minFrameTime:E}=A,{feed:e,reset:t,resize:i,onInput:o,onMarker:s,setState:r,logger:n}=V;n=new B(n,"eventsource: ");let a=new Y;function w(A){void 0!==I&&I.stop(),I=z(C,e,i,o,s,(A=>a.setTime(A)),A,E,n)}return{play:()=>{g=new EventSource(Q),g.addEventListener("open",(()=>{n.info("opened"),w()})),g.addEventListener("error",(A=>{n.info("errored"),n.debug({e:A}),r("loading")})),g.addEventListener("message",(A=>{const V=JSON.parse(A.data);if(Array.isArray(V))I.pushEvent(V);else if(void 0!==V.cols||void 0!==V.width){const A=V.cols??V.width,g=V.rows??V.height;n.debug(`vt reset (${A}x${g})`),r("playing"),w(V.time),t(A,g,V.init??void 0),a=new S,"number"==typeof V.time&&a.setTime(V.time)}else"offline"===V.state&&(n.info("stream offline"),r("offline",{message:"Stream offline"}),a=new Y)})),g.addEventListener("done",(()=>{n.info("closed"),g.close(),r("ended",{message:"Stream ended"})}))},stop:()=>{void 0!==I&&I.stop(),void 0!==g&&g.close()},getCurrentTime:()=>a.getTime()}}],["random",function(A,V,g){let{feed:I}=V,{speed:B}=g;const Q=" ".charCodeAt(0),C="~".charCodeAt(0)-Q;let E;const e=()=>{const A=Math.pow(5,4*Math.random());E=setTimeout(t,A/B)},t=()=>{e();const A=String.fromCharCode(Q+Math.floor(Math.random()*C));I(A)};return()=>(e(),()=>clearInterval(E))}],["recording",function(A,V,g){let I,B,Q,C,E,e,t,i,o,s,r,n,{feed:a,resize:w,onInput:D,onMarker:c,setState:q,logger:h}=V,{speed:y,idleTimeLimit:F,startAt:l,loop:d,posterTime:k,markers:G,pauseOnMarkers:u,cols:N,rows:U,audioUrl:f}=g,M=0,J=0,R=0,L=!1,S=!1,Y=()=>performance.now()*y,m=!1;async function K(A,V){const g=await fetch(A,V);if(!g.ok)throw new Error(`failed fetching recording from ${A}: ${g.status} ${g.statusText}`);return g}function T(){const A=Q[M];A?t=function(A,V){let g=(1e3*V-(Y()-i))/y;g<0&&(g=0);return setTimeout(A,g)}(O,A[0]):b()}function O(){let A,V=Q[M];do{J=V[0],M++;if(v(V))return;V=Q[M],A=Y()-i}while(V&&A>1e3*V[0]);T()}function H(){clearTimeout(t),t=null}function v(A){const[V,g,I]=A;if("o"===g)a(I);else if("i"===g)D(I);else if("r"===g){const[A,V]=I.split("x");w(A,V)}else if("m"===g&&(c(I),u))return W(),o=1e3*V,q("idle",{reason:"paused"}),!0;return!1}function b(){H(),R++,!0===d||"number"==typeof d&&R>"===A?A=g+5:"<<<"===A?A=g-.1*E:">>>"===A?A=g+.1*E:"%"===A[A.length-1]&&(A=parseFloat(A.substring(0,A.length-1))/100*E);else if("object"==typeof A)if("prev"===A.marker)A=j(g)??0,V&&g-A<1&&(A=j(A)??0);else if("next"===A.marker)A=function(A){if(0==C.length)return;let V,g=C.length-1,I=C[g];for(;I&&I[0]>A;)V=I[0],I=C[--g];return V}(g)??E;else if("number"==typeof A.marker){const V=C[A.marker];if(void 0===V)throw new Error(`invalid marker index: ${A.marker}`);A=V[0]}const I=Math.min(Math.max(A,0),E);if(1e3*I===o)return!1;Iq("loading")),1e3),!t)return!0;h.debug("pausing session playback"),H(),o=Y()-i}function AA(){h.debug("audio resumed"),clearTimeout(s),q("playing"),L&&(L=!1,S&&(h.debug("resuming session playback"),i=Y()-o,o=null,T()))}return{init:async function(){const V=setTimeout((()=>{q("loading")}),3e3);try{let V=async function(A,V,g){const{parser:t,minFrameTime:i,inputOffset:o,dumpFilename:s,encoding:r="utf-8"}=A,n=await async function(A){let{url:V,data:g,fetchOpts:I={}}=A;if("string"==typeof V)return await K(V,I);if(Array.isArray(V))return await Promise.all(V.map((A=>K(A,I))));if(void 0!==g){"function"==typeof g&&(g=g()),g instanceof Promise||(g=Promise.resolve(g));const A=await g;return"string"==typeof A||A instanceof ArrayBuffer?new Response(A):A}throw new Error("failed fetching recording file: url/data missing in src")}(A),a=function(A,V,g){let{startAt:I=0,idleTimeLimit:B,minFrameTime:Q,inputOffset:C,markers_:E}=g,{events:e}=A;e instanceof p||(e=new p(e));B=B??A.idleTimeLimit??1/0;const t={offset:0};e=e.transform(function(A){let V,g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/60;return I=>{let B=0,Q=0;return{step:A=>{B++,void 0!==V?"o"===A[1]&&"o"===V[1]&&A[0]-V[0]{void 0!==V&&(I(V),Q++),A.debug(`batched ${B} frames to ${Q} frames`)}}}}(V,Q)).map(function(A,V,g){let I=0,B=0;return function(Q){const C=Q[0]-I-A;return I=Q[0],C>0&&(B+=C,Q[0]"m"!==A[1])).multiplex(E,((A,V)=>A[0]"i"===A[1]?[A[0]+C,A[1],A[2]]:A)),e.sort(((A,V)=>A[0]-V[0])));const i=e[e.length-1][0],o=I-t.offset;return{...A,events:e,duration:i,effectiveStartAt:o}}(await t(n,{encoding:r}),V,{...g,minFrameTime:i,inputOffset:o});if(({cols:I,rows:B,events:Q,duration:E,effectiveStartAt:e}=a),N=N??I,U=U??B,0===Q.length)throw new Error("recording is missing events");void 0!==s&&function(A,V){const g=document.createElement("a"),I=A.events.map((A=>"m"===A[1]?[A[0],A[1],A[2].label]:A)),B=function(A){return`${JSON.stringify({version:2,width:A.cols,height:A.rows})}\n${A.events.map(JSON.stringify).join("\n")}\n`}({...A,events:I});g.href=URL.createObjectURL(new Blob([B],{type:"text/plain"})),g.download=V,g.click()}(a,s);const w=void 0!==k?(D=k,Q.filter((A=>A[0]A[2]))):void 0;var D;return C=Q.filter((A=>"m"===A[1])).map((A=>[A[0],A[2].label])),{cols:I,rows:B,duration:E,theme:a.theme,poster:w,markers:C}}(A,h,{idleTimeLimit:F,startAt:l,markers_:G});const g=await async function(A){if(!A)return!1;n=await async function(A){const V=new Audio;let g;V.preload="metadata",V.loop=!1,V.crossOrigin="anonymous";const I=new Promise((A=>{g=A}));function B(){g(),V.removeEventListener("canplay",B)}return V.addEventListener("canplay",B),V.src=A,V.load(),await I,V}(A),m=!Number.isNaN(n.duration)&&n.duration!==1/0&&n.seekable.length>0&&n.seekable.end(n.seekable.length-1)===n.duration,m?(n.addEventListener("playing",AA),n.addEventListener("waiting",$)):h.warn(`audio is not seekable - you must enable range request support on the server providing ${n.src} for audio seeking to work`);return!0}(f);return V=await V,{...V,hasAudio:g}}finally{clearTimeout(V)}},play:async function(){if(t)throw new Error("already playing");if(void 0===Q[M])throw new Error("already ended");return null!==e&&z(e),await X(),!0},pause:W,seek:z,step:function(A){let V,g;if(void 0===A&&(A=1),A>0){let I=M;V=Q[I];for(let B=0;B{A=I.protocol||"raw",w.info("opened"),w.info(`activating ${A} protocol handler`),"v1.alis"===A?I.onmessage=N(P(w)):"v2.asciicast"===A?I.onmessage=N(function(){let A=function(g){const I=JSON.parse(g);if(2!==I.version)throw new Error("not an asciicast v2 stream");return A=V,{time:0,term:{size:{cols:I.width,rows:I.height}}}};function V(A){const V=JSON.parse(A);if("r"===V[1]){const[A,g]=V[2].split("x");return[V[0],"r",{cols:parseInt(A,10),rows:parseInt(g,10)}]}return V}return function(V){return A(V)}}()):"v3.asciicast"===A?I.onmessage=N(function(){let A=function(V){const I=JSON.parse(V);if(3!==I.version)throw new Error("not an asciicast v3 stream");A=g;const B={size:{cols:I.term.cols,rows:I.term.rows}};if(I.term.theme){const A="string"==typeof I.term.theme.palette?I.term.theme.palette.split(":"):void 0,V=T({foreground:I.term.theme.fg,background:I.term.theme.bg,palette:A});V&&(B.theme=V)}return{time:0,term:B}},V=0;function g(A){const g=JSON.parse(A),[I,B,Q]=g;if(V+=I,"r"===B){const[A,g]=Q.split("x");return[V,"r",{cols:parseInt(A,10),rows:parseInt(g,10)}]}return[V,B,Q]}return function(V){return A(V)}}()):"raw"===A&&(I.onmessage=N(IA())),c=setTimeout((()=>{F=0}),1e3)},I.onclose=V=>{if(clearTimeout(q),M(),l)return;let g=!1,I="Stream ended";if("v1.alis"===A?(G||V.code>=4e3&&V.code<=4100)&&(g=!0,I=V.reason||I):(k||1e3===V.code||1005===V.code)&&(g=!0),g)w.info("closed"),a("ended",{message:I});else if(1002===V.code)w.debug(`close reason: ${V.reason}`),a("ended",{message:"Err: Player not compatible with the server"});else{clearTimeout(c);const A=e(F++);w.info(`unexpected close, reconnecting in ${A}...`),a("loading"),setTimeout(u,A)}},d=!1}function N(A){return q=setTimeout(f,5e3),function(V){try{const g=A(V.data);if(Q)if(Array.isArray(g))Q.pushEvent(g),"x"===g[1]&&(k=!0);else if("string"==typeof g)Q.pushText(g);else if("object"!=typeof g||Array.isArray(g)){if(!1===g)f(),G=!0;else if(void 0!==g)throw new Error(`unexpected value from protocol handler: ${g}`)}else U(g);else if("object"!=typeof g||Array.isArray(g)){if(void 0!==g)throw clearTimeout(q),new Error(`unexpected value from protocol handler: ${g}`);clearTimeout(q),q=setTimeout(f,1e3)}else U(g),clearTimeout(q)}catch(A){throw I.close(),A}}}function U(A){let{time:V,term:g}=A;const{size:I,init:B,theme:C}=g,{cols:e,rows:D}=I;w.info(`stream reset (${e}x${D} @${V})`),a("playing"),M(),Q=z(E,i,s,r,n,(A=>y.setTime(A)),V,t,w),o(e,D,B,C),y=new S,d=!0,k=!1,G=!1,"number"==typeof V&&y.setTime(V)}function f(){M(),d?(w.info("stream ended"),a("offline",{message:"Stream ended"})):(w.info("stream offline"),a("offline",{message:"Stream offline"})),y=new Y}function M(){Q&&Q.stop(),Q=null}return{init:()=>({hasAudio:!!D}),play:()=>{u(),D&&(h=new Audio,h.preload="auto",h.crossOrigin="anonymous",h.src=D,h.play())},stop:()=>{l=!0,M(),void 0!==I&&I.close(),h&&h.pause()},mute:function(){if(h)return h.muted=!0,!0},unmute:function(){if(h)return h.muted=!1,!0},getCurrentTime:()=>y.getTime()}}]]),cA=new Map([["asciicast",O],["typescript",async function(A,V){let{encoding:g}=V;const I=new TextDecoder(g);let B,Q,C=(await A[0].text()).split("\n").filter((A=>A.length>0)).map((A=>A.split(" ")));C[0].length<3&&(C=C.map((A=>["O",A[0],A[1]])));const E=await A[1].arrayBuffer(),e=new Uint8Array(E),t=e.findIndex((A=>10==A))+1,i=I.decode(e.subarray(0,t)).match(/COLUMNS="(\d+)" LINES="(\d+)"/);null!==i&&(B=parseInt(i[1],10),Q=parseInt(i[2],10));const o={array:e,cursor:t};let s=o;if(void 0!==A[2]){const V=await A[2].arrayBuffer();s={array:new Uint8Array(V),cursor:t}}const r=[];let n=0;for(const A of C)if(n+=parseFloat(A[1]),"O"===A[0]){const V=parseInt(A[2],10),g=o.array.subarray(o.cursor,o.cursor+V),B=I.decode(g);r.push([n,"o",B]),o.cursor+=V}else if("I"===A[0]){const V=parseInt(A[2],10),g=s.array.subarray(s.cursor,s.cursor+V),B=I.decode(g);r.push([n,"i",B]),s.cursor+=V}else if("S"===A[0]&&"SIGWINCH"===A[2]){const V=parseInt(A[4].slice(5),10),g=parseInt(A[3].slice(5),10);r.push([n,"r",`${V}x${g}`])}else"H"===A[0]&&"COLUMNS"===A[2]?B=parseInt(A[3],10):"H"===A[0]&&"LINES"===A[2]&&(Q=parseInt(A[3],10));return B=B??80,Q=Q??24,{cols:B,rows:Q,events:r}}],["ttyrec",async function(A,V){let{encoding:g}=V;const I=new TextDecoder(g),B=await A.arrayBuffer(),Q=new Uint8Array(B),C=QA(Q),E=C.time,e=I.decode(C.data).match(/\x1b\[8;(\d+);(\d+)t/),t=[];let i=80,o=24;null!==e&&(i=parseInt(e[2],10),o=parseInt(e[1],10));let s=0,r=QA(Q);for(;void 0!==r;){const A=r.time-E,V=I.decode(r.data);t.push([A,"o",V]),s+=r.len,r=QA(Q.subarray(s))}return{cols:i,rows:o,events:t}}]]);let qA,hA=new class{log(){}debug(){}info(){}warn(){}error(){}};onmessage=async function(A){const V=function(A,V){switch(A){case"getChanges":return qA.getChanges();case"new":const g=V[1];return!0===g.logger&&(hA=console),g.logger=hA,void(qA=new wA(V[0],g));case"init":return qA.init();case"play":return qA.play();case"pause":return qA.pause();case"togglePlay":return qA.togglePlay();case"stop":return qA.stop();case"seek":return qA.seek(V);case"step":return qA.step(V);case"getCurrentTime":return qA.getCurrentTime();case"getRemainingTime":return qA.getRemainingTime();case"getProgress":return qA.getProgress();case"addEventListener":return void qA.addEventListener(V[0],(A=>{postMessage({method:"onEvent",params:{name:V[0],event:A}})}));default:throw new Error(`invalid method ${A}`)}}(A.data.method,A.data.params);if(void 0!==A.data.id){const g=await V;postMessage({result:g,id:A.data.id})}}}(); diff --git a/packages/landing/public/asciinema-player/asciinema-player.css b/packages/landing/public/asciinema-player/asciinema-player.css new file mode 100644 index 000000000..ee479ce93 --- /dev/null +++ b/packages/landing/public/asciinema-player/asciinema-player.css @@ -0,0 +1,711 @@ +.ap-default-term-ff { + --term-font-family: "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace, "Symbols Nerd Font"; +} +div.ap-wrapper { + outline: none; + height: 100%; + display: flex; + justify-content: center; +} +div.ap-wrapper .title-bar { + display: none; + top: -78px; + transition: top 0.15s linear; + position: absolute; + left: 0; + right: 0; + box-sizing: content-box; + font-size: 20px; + line-height: 1em; + padding: 15px; + font-family: sans-serif; + color: white; + background-color: rgba(0, 0, 0, 0.8); +} +div.ap-wrapper .title-bar img { + vertical-align: middle; + height: 48px; + margin-right: 16px; +} +div.ap-wrapper .title-bar a { + color: white; + text-decoration: underline; +} +div.ap-wrapper .title-bar a:hover { + text-decoration: none; +} +div.ap-wrapper:fullscreen { + background-color: #000; + width: 100%; + align-items: center; +} +div.ap-wrapper:fullscreen .title-bar { + display: initial; +} +div.ap-wrapper:fullscreen.hud .title-bar { + top: 0; +} +div.ap-wrapper div.ap-player { + text-align: left; + display: inline-block; + padding: 0px; + position: relative; + box-sizing: content-box; + overflow: hidden; + max-width: 100%; + border-radius: 4px; + font-size: 15px; + background-color: var(--term-color-background); +} +.ap-player { + --term-color-foreground: #ffffff; + --term-color-background: #000000; + --term-color-0: var(--term-color-foreground); + --term-color-1: var(--term-color-foreground); + --term-color-2: var(--term-color-foreground); + --term-color-3: var(--term-color-foreground); + --term-color-4: var(--term-color-foreground); + --term-color-5: var(--term-color-foreground); + --term-color-6: var(--term-color-foreground); + --term-color-7: var(--term-color-foreground); + --term-color-8: var(--term-color-0); + --term-color-9: var(--term-color-1); + --term-color-10: var(--term-color-2); + --term-color-11: var(--term-color-3); + --term-color-12: var(--term-color-4); + --term-color-13: var(--term-color-5); + --term-color-14: var(--term-color-6); + --term-color-15: var(--term-color-7); +} +div.ap-term { + position: relative; + font-family: var(--term-font-family); + border-width: 0.75em; + border-radius: 0; + border-style: solid; + border-color: var(--term-color-background); + box-sizing: content-box; +} +div.ap-term canvas { + position: absolute; + inset: 0; + display: block; + width: 100%; + height: 100%; +} +div.ap-term svg.ap-term-symbols { + position: absolute; + inset: 0; + display: block; + width: 100%; + height: 100%; + overflow: hidden; + pointer-events: none; +} +div.ap-term svg.ap-term-symbols use { + color: var(--term-color-foreground); +} +div.ap-term svg.ap-term-symbols:not(.ap-blink) .ap-blink { + opacity: 0; +} +div.ap-term pre.ap-term-text { + position: absolute; + inset: 0; + box-sizing: content-box; + overflow: hidden; + padding: 0; + margin: 0px; + display: block; + white-space: pre; + word-wrap: normal; + word-break: normal; + cursor: text; + color: var(--term-color-foreground); + outline: none; + line-height: var(--term-line-height); + font-family: inherit; + font-size: inherit; + font-variant-ligatures: none; + border: 0; + border-radius: 0; + background-color: transparent !important; +} +pre.ap-term-text .ap-line { + display: block; + width: 100%; + height: var(--term-line-height); + position: absolute; + top: calc(100% * var(--row) / var(--term-rows)); + letter-spacing: normal; + overflow: hidden; +} +pre.ap-term-text .ap-line span { + position: absolute; + left: calc(100% * var(--offset) / var(--term-cols)); + padding: 0; + display: inline-block; + height: 100%; +} +pre.ap-term-text:not(.ap-blink) .ap-line .ap-blink { + color: transparent; + border-color: transparent; +} +pre.ap-term-text .ap-bold { + font-weight: bold; +} +pre.ap-term-text .ap-faint { + opacity: 0.5; +} +pre.ap-term-text .ap-underline { + text-decoration: underline; +} +pre.ap-term-text .ap-italic { + font-style: italic; +} +pre.ap-term-text .ap-strike { + text-decoration: line-through; +} +.ap-line span { + color: var(--term-color-foreground); +} +div.ap-player div.ap-control-bar { + width: 100%; + height: 32px; + display: flex; + justify-content: space-between; + align-items: stretch; + color: var(--term-color-foreground); + box-sizing: content-box; + line-height: 1; + position: absolute; + bottom: 0; + left: 0; + opacity: 0; + transition: opacity 0.15s linear; + user-select: none; + border-top: 2px solid color-mix(in oklab, var(--term-color-background) 80%, var(--term-color-foreground)); + z-index: 30; +} +div.ap-player div.ap-control-bar * { + box-sizing: inherit; +} +div.ap-control-bar svg.ap-icon path { + fill: var(--term-color-foreground); +} +div.ap-control-bar span.ap-button { + display: flex; + flex: 0 0 auto; + cursor: pointer; +} +div.ap-control-bar span.ap-playback-button { + width: 12px; + height: 12px; + padding: 10px; + margin: 0 0 0 2px; +} +div.ap-control-bar span.ap-playback-button svg { + height: 12px; + width: 12px; +} +div.ap-control-bar span.ap-timer { + display: flex; + flex: 0 0 auto; + min-width: 50px; + margin: 0 10px; + height: 100%; + text-align: center; + font-size: 13px; + line-height: 100%; + cursor: default; +} +div.ap-control-bar span.ap-timer span { + font-family: var(--term-font-family); + font-size: inherit; + font-weight: 600; + margin: auto; +} +div.ap-control-bar span.ap-timer .ap-time-remaining { + display: none; +} +div.ap-control-bar span.ap-timer:hover .ap-time-elapsed { + display: none; +} +div.ap-control-bar span.ap-timer:hover .ap-time-remaining { + display: flex; +} +div.ap-control-bar .ap-progressbar { + display: block; + flex: 1 1 auto; + height: 100%; + padding: 0 10px; +} +div.ap-control-bar .ap-progressbar .ap-bar { + display: block; + position: relative; + cursor: default; + height: 100%; + font-size: 0; +} +div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter { + display: block; + position: absolute; + top: 15px; + left: 0; + right: 0; + height: 3px; +} +div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter-empty { + background-color: color-mix(in oklab, var(--term-color-foreground) 20%, var(--term-color-background)); +} +div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter-full { + width: 100%; + transform-origin: left center; + background-color: var(--term-color-foreground); + border-radius: 3px; +} +div.ap-control-bar.ap-seekable .ap-progressbar .ap-bar { + cursor: pointer; +} +div.ap-control-bar .ap-fullscreen-button { + width: 14px; + height: 14px; + padding: 9px; + margin: 0 2px 0 4px; +} +div.ap-control-bar .ap-fullscreen-button svg { + width: 14px; + height: 14px; +} +div.ap-control-bar .ap-fullscreen-button svg.ap-icon-fullscreen-on { + display: inline; +} +div.ap-control-bar .ap-fullscreen-button svg.ap-icon-fullscreen-off { + display: none; +} +div.ap-control-bar .ap-fullscreen-button .ap-tooltip { + right: 5px; + left: initial; + transform: none; +} +div.ap-control-bar .ap-kbd-button { + height: 14px; + padding: 9px; + margin: 0 0 0 4px; +} +div.ap-control-bar .ap-kbd-button svg { + width: 26px; + height: 14px; +} +div.ap-control-bar .ap-kbd-button .ap-tooltip { + right: 5px; + left: initial; + transform: none; +} +div.ap-control-bar .ap-speaker-button { + width: 19px; + padding: 6px 9px; + margin: 0 0 0 4px; + position: relative; +} +div.ap-control-bar .ap-speaker-button svg { + width: 19px; +} +div.ap-control-bar .ap-speaker-button .ap-tooltip { + left: -50%; + transform: none; +} +div.ap-wrapper.ap-hud .ap-control-bar { + opacity: 1; +} +div.ap-wrapper:fullscreen .ap-fullscreen-button svg.ap-icon-fullscreen-on { + display: none; +} +div.ap-wrapper:fullscreen .ap-fullscreen-button svg.ap-icon-fullscreen-off { + display: inline; +} +span.ap-progressbar span.ap-marker-container { + display: block; + top: 0; + bottom: 0; + width: 21px; + position: absolute; + margin-left: -10px; +} +span.ap-marker-container span.ap-marker { + display: block; + top: 13px; + bottom: 12px; + left: 7px; + right: 7px; + background-color: color-mix(in oklab, var(--term-color-foreground) 33%, var(--term-color-background)); + position: absolute; + transition: top 0.1s, bottom 0.1s, left 0.1s, right 0.1s, background-color 0.1s; + border-radius: 50%; +} +span.ap-marker-container span.ap-marker.ap-marker-past { + background-color: var(--term-color-foreground); +} +span.ap-marker-container span.ap-marker:hover, +span.ap-marker-container:hover span.ap-marker { + background-color: var(--term-color-foreground); + top: 11px; + bottom: 10px; + left: 5px; + right: 5px; +} +.ap-tooltip-container span.ap-tooltip { + visibility: hidden; + background-color: var(--term-color-foreground); + color: var(--term-color-background); + font-family: var(--term-font-family); + font-weight: bold; + text-align: center; + padding: 0 0.5em; + border-radius: 4px; + position: absolute; + z-index: 1; + white-space: nowrap; + /* Prevents the text from wrapping and makes sure the tooltip width adapts to the text length */ + font-size: 13px; + line-height: 2em; + bottom: 100%; + left: 50%; + transform: translateX(-50%); +} +.ap-tooltip-container:hover span.ap-tooltip { + visibility: visible; +} +.ap-player .ap-overlay { + z-index: 10; + background-repeat: no-repeat; + background-position: center; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + justify-content: center; + align-items: center; +} +.ap-player .ap-overlay-start { + cursor: pointer; +} +.ap-player .ap-overlay-start .ap-play-button { + font-size: 0px; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + text-align: center; + color: white; + height: 80px; + max-height: 66%; + margin: auto; +} +.ap-player .ap-overlay-start .ap-play-button div { + height: 100%; +} +.ap-player .ap-overlay-start .ap-play-button div span { + height: 100%; + display: block; +} +.ap-player .ap-overlay-start .ap-play-button div span svg { + height: 100%; + display: inline-block; +} +.ap-player .ap-overlay-start .ap-play-button svg { + filter: drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.4)); +} +.ap-player .ap-overlay-loading .ap-loader { + width: 48px; + height: 48px; + border-radius: 50%; + display: inline-block; + position: relative; + border: 10px solid; + border-color: rgba(255, 255, 255, 0.3) rgba(255, 255, 255, 0.5) rgba(255, 255, 255, 0.7) #ffffff; + border-color: color-mix(in srgb, var(--term-color-foreground) 30%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 50%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 70%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 100%, var(--term-color-background)); + box-sizing: border-box; + animation: ap-loader-rotation 1s linear infinite; +} +.ap-player .ap-overlay-info { + background-color: var(--term-color-background); +} +.ap-player .ap-overlay-info span { + font-family: var(--term-font-family); + font-size: 2em; + font-weight: bold; + color: var(--term-color-background); + background-color: var(--term-color-foreground); + padding: 0.5em 0.75em; + text-transform: uppercase; +} +.ap-player .ap-overlay-help { + background-color: rgba(0, 0, 0, 0.8); + container-type: inline-size; +} +.ap-player .ap-overlay-help > div { + font-family: var(--term-font-family); + max-width: 85%; + max-height: 85%; + font-size: 18px; + color: var(--term-color-foreground); + box-sizing: border-box; + margin-bottom: 32px; +} +.ap-player .ap-overlay-help > div div { + padding: calc(min(4cqw, 40px)); + font-size: calc(min(1.9cqw, 18px)); + background-color: var(--term-color-background); + border: 1px solid color-mix(in oklab, var(--term-color-background) 90%, var(--term-color-foreground)); + border-radius: 6px; +} +.ap-player .ap-overlay-help > div div p { + font-weight: bold; + margin: 0 0 2em 0; +} +.ap-player .ap-overlay-help > div div ul { + list-style: none; + padding: 0; +} +.ap-player .ap-overlay-help > div div ul li { + margin: 0 0 0.75em 0; +} +.ap-player .ap-overlay-help > div div kbd { + color: var(--term-color-background); + background-color: var(--term-color-foreground); + padding: 0.2em 0.5em; + border-radius: 0.2em; + font-family: inherit; + font-size: 0.85em; + border: none; + margin: 0; +} +.ap-player .ap-overlay-error span { + font-size: 8em; +} +.ap-player .slide-enter-active { + transition: opacity 0.2s; +} +.ap-player .slide-enter-active.ap-was-playing { + transition: top 0.2s ease-out, opacity 0.2s; +} +.ap-player .slide-exit-active { + transition: top 0.2s ease-in, opacity 0.2s; +} +.ap-player .slide-enter { + top: -50%; + opacity: 0; +} +.ap-player .slide-enter-to { + top: 0%; +} +.ap-player .slide-enter, +.ap-player .slide-enter-to, +.ap-player .slide-exit, +.ap-player .slide-exit-to { + bottom: auto; + height: 100%; +} +.ap-player .slide-exit { + top: 0%; +} +.ap-player .slide-exit-to { + top: -50%; + opacity: 0; +} +@keyframes ap-loader-rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +.asciinema-player-theme-asciinema { + --term-color-foreground: #cccccc; + --term-color-background: #121314; + --term-color-0: #000000; + --term-color-1: #dd3c69; + --term-color-2: #4ebf22; + --term-color-3: #ddaf3c; + --term-color-4: #26b0d7; + --term-color-5: #b954e1; + --term-color-6: #54e1b9; + --term-color-7: #d9d9d9; + --term-color-8: #4d4d4d; + --term-color-9: #dd3c69; + --term-color-10: #4ebf22; + --term-color-11: #ddaf3c; + --term-color-12: #26b0d7; + --term-color-13: #b954e1; + --term-color-14: #54e1b9; + --term-color-15: #ffffff; +} +/* + Based on Dracula: https://draculatheme.com + */ +.asciinema-player-theme-dracula { + --term-color-foreground: #f8f8f2; + --term-color-background: #282a36; + --term-color-0: #21222c; + --term-color-1: #ff5555; + --term-color-2: #50fa7b; + --term-color-3: #f1fa8c; + --term-color-4: #bd93f9; + --term-color-5: #ff79c6; + --term-color-6: #8be9fd; + --term-color-7: #f8f8f2; + --term-color-8: #6272a4; + --term-color-9: #ff6e6e; + --term-color-10: #69ff94; + --term-color-11: #ffffa5; + --term-color-12: #d6acff; + --term-color-13: #ff92df; + --term-color-14: #a4ffff; + --term-color-15: #ffffff; +} +/* Based on Monokai from base16 collection - https://github.com/chriskempson/base16 */ +.asciinema-player-theme-monokai { + --term-color-foreground: #f8f8f2; + --term-color-background: #272822; + --term-color-0: #272822; + --term-color-1: #f92672; + --term-color-2: #a6e22e; + --term-color-3: #f4bf75; + --term-color-4: #66d9ef; + --term-color-5: #ae81ff; + --term-color-6: #a1efe4; + --term-color-7: #f8f8f2; + --term-color-8: #75715e; + --term-color-15: #f9f8f5; +} +/* + Based on Nord: https://github.com/arcticicestudio/nord + Via: https://github.com/neilotoole/asciinema-theme-nord + */ +.asciinema-player-theme-nord { + --term-color-foreground: #eceff4; + --term-color-background: #2e3440; + --term-color-0: #3b4252; + --term-color-1: #bf616a; + --term-color-2: #a3be8c; + --term-color-3: #ebcb8b; + --term-color-4: #81a1c1; + --term-color-5: #b48ead; + --term-color-6: #88c0d0; + --term-color-7: #eceff4; +} +.asciinema-player-theme-seti { + --term-color-foreground: #cacecd; + --term-color-background: #111213; + --term-color-0: #323232; + --term-color-1: #c22832; + --term-color-2: #8ec43d; + --term-color-3: #e0c64f; + --term-color-4: #43a5d5; + --term-color-5: #8b57b5; + --term-color-6: #8ec43d; + --term-color-7: #eeeeee; + --term-color-15: #ffffff; +} +/* + Based on Solarized Dark: https://ethanschoonover.com/solarized/ + */ +.asciinema-player-theme-solarized-dark { + --term-color-foreground: #839496; + --term-color-background: #002b36; + --term-color-0: #073642; + --term-color-1: #dc322f; + --term-color-2: #859900; + --term-color-3: #b58900; + --term-color-4: #268bd2; + --term-color-5: #d33682; + --term-color-6: #2aa198; + --term-color-7: #eee8d5; + --term-color-8: #002b36; + --term-color-9: #cb4b16; + --term-color-10: #586e75; + --term-color-11: #657b83; + --term-color-12: #839496; + --term-color-13: #6c71c4; + --term-color-14: #93a1a1; + --term-color-15: #fdf6e3; +} +/* + Based on Solarized Light: https://ethanschoonover.com/solarized/ + */ +.asciinema-player-theme-solarized-light { + --term-color-foreground: #657b83; + --term-color-background: #fdf6e3; + --term-color-0: #073642; + --term-color-1: #dc322f; + --term-color-2: #859900; + --term-color-3: #b58900; + --term-color-4: #268bd2; + --term-color-5: #d33682; + --term-color-6: #2aa198; + --term-color-7: #eee8d5; + --term-color-8: #002b36; + --term-color-9: #cb4b16; + --term-color-10: #586e75; + --term-color-11: #657c83; + --term-color-12: #839496; + --term-color-13: #6c71c4; + --term-color-14: #93a1a1; + --term-color-15: #fdf6e3; +} +.asciinema-player-theme-solarized-light .ap-overlay-start .ap-play-button svg .ap-play-btn-fill { + fill: var(--term-color-1); +} +.asciinema-player-theme-solarized-light .ap-overlay-start .ap-play-button svg .ap-play-btn-stroke { + stroke: var(--term-color-1); +} +/* + Based on Tango: https://en.wikipedia.org/wiki/Tango_Desktop_Project + */ +.asciinema-player-theme-tango { + --term-color-foreground: #cccccc; + --term-color-background: #121314; + --term-color-0: #000000; + --term-color-1: #cc0000; + --term-color-2: #4e9a06; + --term-color-3: #c4a000; + --term-color-4: #3465a4; + --term-color-5: #75507b; + --term-color-6: #06989a; + --term-color-7: #d3d7cf; + --term-color-8: #555753; + --term-color-9: #ef2929; + --term-color-10: #8ae234; + --term-color-11: #fce94f; + --term-color-12: #729fcf; + --term-color-13: #ad7fa8; + --term-color-14: #34e2e2; + --term-color-15: #eeeeec; +} +/* + Based on gruvbox: https://github.com/morhetz/gruvbox + */ +.asciinema-player-theme-gruvbox-dark { + --term-color-foreground: #fbf1c7; + --term-color-background: #282828; + --term-color-0: #282828; + --term-color-1: #cc241d; + --term-color-2: #98971a; + --term-color-3: #d79921; + --term-color-4: #458588; + --term-color-5: #b16286; + --term-color-6: #689d6a; + --term-color-7: #a89984; + --term-color-8: #7c6f65; + --term-color-9: #fb4934; + --term-color-10: #b8bb26; + --term-color-11: #fabd2f; + --term-color-12: #83a598; + --term-color-13: #d3869b; + --term-color-14: #8ec07c; + --term-color-15: #fbf1c7; +} diff --git a/packages/landing/public/asciinema-player/asciinema-player.min.js b/packages/landing/public/asciinema-player/asciinema-player.min.js new file mode 100644 index 000000000..2979ede6c --- /dev/null +++ b/packages/landing/public/asciinema-player/asciinema-player.min.js @@ -0,0 +1 @@ +var AsciinemaPlayer=function(A){"use strict";function e(A){return"number"==typeof A?A:"string"==typeof A?A.split(":").reverse().map(parseFloat).reduce(((A,e,g)=>A+e*Math.pow(60,g))):void 0}const g=/^#[0-9a-f]{6}$/,V=/^#[0-9a-f]{3}$/;function t(A){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if("string"!=typeof A)return e;const t=A.trim().toLowerCase();return g.test(t)?t:V.test(t)?`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`:e}function I(A,e,g){return[e[0]+A*(g[0]-e[0]),e[1]+A*(g[1]-e[1]),e[2]+A*(g[2]-e[2])]}function B(A){const[e,g,V]=function(A){return[Number.parseInt(A.slice(1,3),16)/255,Number.parseInt(A.slice(3,5),16)/255,Number.parseInt(A.slice(5,7),16)/255]}(A).map(r),t=.4122214708*e+.5363325363*g+.0514459929*V,I=.2119034982*e+.6806995451*g+.1073969566*V,B=.0883024619*e+.2817188376*g+.6299787005*V,Q=Math.cbrt(t),C=Math.cbrt(I),i=Math.cbrt(B);return[.2104542553*Q+.793617785*C-.0040720468*i,1.9779984951*Q-2.428592205*C+.4505937099*i,.0259040371*Q+.7827717662*C-.808675766*i]}function Q(A){const e=C(A);if(E(e))return o(e);const[g,V,t]=function(A){let[e,g,V]=A;return[e,Math.hypot(g,V),Math.atan2(V,g)]}(A);let I=0,B=V,Q=[g,0,t];for(let A=0;A<24;A+=1){const A=(I+B)/2,e=[g,A,t];E(C(i(e)))?(I=A,Q=e):B=A}return o(C(i(Q)))}function C(A){const e=s(A[0],0,1),g=A[1],V=A[2],t=(e+.3963377774*g+.2158037573*V)**3,I=(e-.1055613458*g-.0638541728*V)**3,B=(e-.0894841775*g-1.291485548*V)**3,Q=-1.2684380046*t+2.6097574011*I-.3413193965*B,C=-.0041960863*t-.7034186147*I+1.707614701*B;return[n(4.0767416621*t-3.3077115913*I+.2309699292*B),n(Q),n(C)]}function i(A){let[e,g,V]=A;return[e,g*Math.cos(V),g*Math.sin(V)]}function o(A){const e=A=>Math.round(255*s(A,0,1)).toString(16).padStart(2,"0");return`#${e(A[0])}${e(A[1])}${e(A[2])}`}function r(A){return A<=.04045?A/12.92:((A+.055)/1.055)**2.4}function n(A){return A<=.0031308?12.92*A:1.055*A**(1/2.4)-.055}function E(A){let[e,g,V]=A;return e>=0&&e<=1&&g>=0&&g<=1&&V>=0&&V<=1}function s(A,e,g){return Math.max(e,Math.min(g,A))}class a{log(){}debug(){}info(){}warn(){}error(){}}class c{constructor(A,e){this.logger=A,this.prefix=e}log(A){for(var e=arguments.length,g=new Array(e>1?e-1:0),V=1;V1?e-1:0),V=1;V1?e-1:0),V=1;V1?e-1:0),V=1;V1?e-1:0),V=1;V0?`Function(${e})`:"Function"}if(Array.isArray(A)){const e=A.length;let g="[";e>0&&(g+=w(A[0]));for(let V=1;V1))return toString.call(A);if(V=g[1],"Object"==V)try{return"Object("+JSON.stringify(A)+")"}catch(A){return"Object"}return A instanceof Error?`${A.name}: ${A.message}\n${A.stack}`:V}function h(A,e){return A>>>=0,function(){null!==y&&0!==y.byteLength||(y=new Uint32Array(l.memory.buffer));return y}().subarray(A/4,A/4+e)}let d=null;function f(){return(null===d||!0===d.buffer.detached||void 0===d.buffer.detached&&d.buffer!==l.memory.buffer)&&(d=new DataView(l.memory.buffer)),d}function D(A,e){return function(A,e){G+=e,G>=N&&(R=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),R.decode(),G=e);return R.decode(k().subarray(A,A+e))}(A>>>=0,e)}let y=null;let q=null;function k(){return null!==q&&0!==q.byteLength||(q=new Uint8Array(l.memory.buffer)),q}function p(A){return L[A]}let L=new Array(128).fill(void 0);L.push(void 0,null,!0,!1);let F=L.length;function M(A,e,g){if(void 0===g){const g=U.encode(A),V=e(g.length,1)>>>0;return k().subarray(V,V+g.length).set(g),J=g.length,V}let V=A.length,t=e(V,1)>>>0;const I=k();let B=0;for(;B127)break;I[t+B]=e}if(B!==V){0!==B&&(A=A.slice(B)),t=g(t,V,V=B+3*A.length,1)>>>0;const e=k().subarray(t+B,t+V);B+=U.encodeInto(A,e).written,t=g(t,V,B,1)>>>0}return J=B,t}function m(A){const e=p(A);return function(A){A<132||(L[A]=F,F=A)}(A),e}let R=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});R.decode();const N=2146435072;let G=0;const U=new TextEncoder;"encodeInto"in U||(U.encodeInto=function(A,e){const g=U.encode(A);return e.set(g),{read:A.length,written:g.length}});let J=0;const v="undefined"==typeof FinalizationRegistry?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry((A=>l.__wbg_vt_free(A>>>0,1)));class b{static __wrap(A){A>>>=0;const e=Object.create(b.prototype);return e.__wbg_ptr=A,v.register(e,e.__wbg_ptr,e),e}__destroy_into_raw(){const A=this.__wbg_ptr;return this.__wbg_ptr=0,v.unregister(this),A}free(){const A=this.__destroy_into_raw();l.__wbg_vt_free(A,0)}feed(A){const e=M(A,l.__wbindgen_export,l.__wbindgen_export2),g=J;return m(l.vt_feed(this.__wbg_ptr,e,g))}resize(A,e){return m(l.vt_resize(this.__wbg_ptr,A,e))}getSize(){try{const V=l.__wbindgen_add_to_stack_pointer(-16);l.vt_getSize(V,this.__wbg_ptr);var A=f().getInt32(V+0,!0),e=f().getInt32(V+4,!0),g=h(A,e).slice();return l.__wbindgen_export3(A,4*e,4),g}finally{l.__wbindgen_add_to_stack_pointer(16)}}getLine(A,e){return m(l.vt_getLine(this.__wbg_ptr,A,e))}getCursor(){return m(l.vt_getCursor(this.__wbg_ptr))}}Symbol.dispose&&(b.prototype[Symbol.dispose]=b.prototype.free);const S=new Set(["basic","cors","default"]);function Y(){const A={wbg:{}};return A.wbg.__wbg___wbindgen_debug_string_adfb662ae34724b6=function(A,e){const g=M(w(p(e)),l.__wbindgen_export,l.__wbindgen_export2),V=J;f().setInt32(A+4,V,!0),f().setInt32(A+0,g,!0)},A.wbg.__wbg___wbindgen_throw_dd24417ed36fc46e=function(A,e){throw new Error(D(A,e))},A.wbg.__wbg_new_13317ed16189158e=function(){return u(new Array)},A.wbg.__wbg_new_4ceb6a766bf78b04=function(){return u(new Object)},A.wbg.__wbg_set_3f1d0b984ed272ed=function(A,e,g){p(A)[m(e)]=m(g)},A.wbg.__wbg_set_8b6a9a61e98a8881=function(A,e,g){p(A)[e>>>0]=m(g)},A.wbg.__wbindgen_cast_2241b6af4c4b2941=function(A,e){return u(D(A,e))},A.wbg.__wbindgen_cast_4625c577ab2ec9ee=function(A){return u(BigInt.asUintN(64,A))},A.wbg.__wbindgen_cast_d6cd19b81560fd6e=function(A){return u(A)},A.wbg.__wbindgen_object_clone_ref=function(A){return u(p(A))},A.wbg.__wbindgen_object_drop_ref=function(A){m(A)},A}function K(A,e){return l=A.exports,T.__wbindgen_wasm_module=e,d=null,y=null,q=null,l}async function T(A){if(void 0!==l)return l;void 0!==A&&(Object.getPrototypeOf(A)===Object.prototype?({module_or_path:A}=A):console.warn("using deprecated parameters for the initialization function; pass a single object instead"));const e=Y();("string"==typeof A||"function"==typeof Request&&A instanceof Request||"function"==typeof URL&&A instanceof URL)&&(A=fetch(A));const{instance:g,module:V}=await async function(A,e){if("function"==typeof Response&&A instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(A,e)}catch(e){if(!A.ok||!S.has(A.type)||"application/wasm"===A.headers.get("Content-Type"))throw e;console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}const g=await A.arrayBuffer();return await WebAssembly.instantiate(g,e)}{const g=await WebAssembly.instantiate(A,e);return g instanceof WebAssembly.Instance?{instance:g,module:A}:g}}(await A,e);return K(g,V)}var O=Object.freeze({__proto__:null,Vt:b,create:function(A,e,g,V){const t=l.create(A,e,g,V);return b.__wrap(t)},default:T,initSync:function(A){if(void 0!==l)return l;void 0!==A&&(Object.getPrototypeOf(A)===Object.prototype?({module:A}=A):console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=Y();return A instanceof WebAssembly.Module||(A=new WebAssembly.Module(A)),K(new WebAssembly.Instance(A,e),A)}});const H=[62,0,0,0,63,52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];function Z(A){return H[A-43]}var x=function(A){let e,g=A.endsWith("==")?2:A.endsWith("=")?1:0,V=A.length,t=new Uint8Array(V/4*3);for(let g=0,I=0;g>16,t[I+1]=e>>8&255,t[I+2]=255&e;return t.subarray(0,t.length-g)}("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CAgJCgsODA4NDgsgAkGoAWpBASABKAIAIAEoAgRB1NzAABCBASABIAIpA6gBNwIAIABBADoAAAwYCyACQbABakEBIAEoAgAgASgCBEHk3MAAEIEBIAEgAikDsAE3AgAgAEEBOgAADBcLIAJBuAFqQQEgASgCACABKAIEQfTcwAAQgQEgASACKQO4ATcCACAAQQI6AAAMFgsgAkHAAWpBASABKAIAIAEoAgRBhN3AABCBASABIAIpA8ABNwIAIABBAzoAAAwVCyACQcgBakEBIAEoAgAgASgCBEGU3cAAEIEBIAEgAikDyAE3AgAgAEEEOgAADBQLIAJB0AFqQQEgASgCACABKAIEQaTdwAAQgQEgASACKQPQATcCACAAQQU6AAAMEwsgAkHYAWpBASABKAIAIAEoAgRBtN3AABCBASABIAIpA9gBNwIAIABBBjoAAAwSCyACQeABakEBIAEoAgAgASgCBEHE3cAAEIEBIAEgAikD4AE3AgAgAEEHOgAADBELIAJB6AFqQQEgASgCACABKAIEQdTdwAAQgQEgASACKQPoATcCACAAQQg6AAAMEAsgAkHwAWpBASABKAIAIAEoAgRB5N3AABCBASABIAIpA/ABNwIAIABBCToAAAwPCyACQfgBakEBIAEoAgAgASgCBEH03cAAEIEBIAEgAikD+AE3AgAgAEEKOgAADA4LIAJBgAJqQQEgASgCACABKAIEQYTewAAQgQEgASACKQOAAjcCACAAQQs6AAAMDQsgAkGIAmpBASABKAIAIAEoAgRBlN7AABCBASABIAIpA4gCNwIAIABBDDoAAAwMCyACQZACakEBIAEoAgAgASgCBEGk3sAAEIEBIAEgAikDkAI3AgAgAEENOgAADAsLAkACQCADQR5rQf//A3FBCE8EQCADQSZrDgIBCAILIAJBCGpBASABKAIAIAEoAgRBxODAABCBASABIAIpAwg3AgAgACADQR5rOgACIABBDjsAAAwMCwJAIAEoAgQiA0ECTwRAIAJBmAFqIAEoAgBBEGoQaSACKAKYASIDDQEgASgCBCEDCyACQegAakEBIAEoAgAgA0G03sAAEIEBIAIoAmwhAyACKAJoIQQMDQsCQAJAAkAgAigCnAFBAUcNACADLwEAQQJrDgQBAAACAAsgAkHwAGpBASABKAIAIAEoAgRBhN/AABCB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ACABQQRqIQwgAkFAayENIAJBJWohDiACQRxqIQ8gASgCJCEFIAEoAhQhECABKAIQIQMCQAJAAn8CQANAIAEoAgAhBiABQYCAgIB4NgIAIAEoAgQhCwJAAkACQAJAAkAgBkGAgICAeEcEQCABKQIIIREgCyEHDAELAkAgAyAQRgRAQYCAgIB4IQYMAQsgASADQRBqIgg2AhAgAykCCCERIAMoAgQhByADKAIAIQYgCCEDC0GAgICAeCALEKMBIAZBgICAgHhGDQELIAIgBzYCDCACIAY2AgggAiARNwIQIBFCIIghEkF/IAUgEaciBEcgBCAFSxtB/wFxDgICAwELQYCAgIB4IAcQowEgAEGAgICAeDYCACABQYCAgIB4NgIADAcLAkAgEqdBAXENACAFIAQgByAEEDRrIgMgAyAFSRsiAyAESw0AIAIgAzYCECADIQQLAn9BgICAgHggBCAFTQ0AGgJAAkAgByAEIAVBuNrAABCQASgCBEUEQCACQThqIgMgAkEIaiIIIAVBAWsQPyACQTBqIANBCGooAgA2AgAgAiACKQI4NwMoIAItABQhBCADQRBqIAIoAgwgAigCECIHIAdBAWtB2NrAABCQASIHQRBqLwEAOwEAIAJCoICAgBA3AjggAiAHKQIINwJAIAggA0Ho2sAAEFcgAiAEOgA0IAItABRBAXFFDQEMAgsgAkE4aiIDIAJBCGogBRA/IAJBMGogA0EIaigCADYCACACIAIpAjg3AyggAiACLQAUIgM6ADQgAw0BCyACQShqEIsBCyACKAIwBEAgAkFAayACQTRqKAIANgIAIAJBAToAFCACIAIpAiw3AzggAigCKAwBCyACKAIoIAIoAixBBEEUEJ8BQYCAgIB4CyEDQYCAgIB4IAsQowEgASADNgIAIAwgAikDODcCACAMQQhqIAJBQGsoAgA2AgAgAEEIaiACQRBqKQIANwIAIAAgAikCCDcCAAwGCyAAIBE3AgggACAHNgIEIAAgBjYCAAwFCwJAIAMgEEcEQCABIANBEGoiCDYCECADKAIAIgZBgICAgHhHDQELIAJBADsAQCACQQI6ADwgAkECOgA4IAJBCGoiASAFIAJBOGoQQSAAIAIpAgg3AgAgAkEAOgAUIABBCGogAUEIaikCADcCAAwFCyADQQxqKAIAIQkgDyADKQIENwIAIA9BCGogCTYCACACIAY2AhggBSAEayIJRQ0BIBKnQQFxRQRAIAJBADsAQCACQQI6ADwgAkECOgA4IAJBCGogBSACQThqEEEMAgsgAi0AJEUEQCACQRhqEIsBCyACKAIcIQMgAigCICIKIAlNBEAgAkEIaiIEIAMgChCAAQJAIAItACQiBg0AIAJBADoAFCACKAIQIAVPDQAgAkEAOwBAIAJBAjoAPCACQQI6ADggBCAFIAJBOGoQQQsgAigCGCADQQRBFBCfASAGRQ0EQYCAgIB4IAsQowEgAUEIaiACQRBqKQIANwIAIAEgAikCCDcCAEGAgICAeCACEKMBIAghAwwBCwsgAyAKIAlB+NnAABCQASgCBEUEQCANQQhqIAcgBCAEQQFrQYjawAAQkAEiCEEQai8BADsBACANIAgpAgg3AgAgAkKggICAEDcCOCACQQhqIAJBOGpBmNrAABBXIAlBAWshCQsgCSAKTQRAIAJBCGogAyAJEIABIAIoAhghBiADIAogCRCIASAGQYCAgIB4Rg0DIAogCiAJayIIIAggCksbIQQgAi0AJAwCCyAJIApBqNrAABCzAQALIAJBKmogDkECai0AADoAACACIA4vAAA7ASggAigCICEEIAIoAhwhAyACLQAkCyEIQYCAgIB4IAsQowEgASAIOgAMIAEgBDYCCCABIAM2AgQgASAGNgIAIAEgAi8BKDsADSABQQ9qIAJBKmotAAA6AAALIAAgAikCCDcCACAAQQhqIAJBEGopAgA3AgALIAJB0ABqJAAL5QoCEH8BfiMAQZABayICJAAgACgCbCIFIAAoAhwiBmsiAUEAIAEgACgCFCIHIAZrIAVqTRshDSAFIAdqIQMgB0EEdCIBIAAoAhAiCmohDyAAKAIYIQwgACgCaCEOIAAoAqABIQsgACgCnAEhCCAKIQQDQAJAIAMgBkYNACABRQ0AIAkgDGpBACAELQAMIhAbIQkgA0EBayEDIAFBEGshASAEQRBqIQQgDSAQQQFzaiENDAELCyAIIAxHBEBBACEFIABBADYCFCACIAg2AjggAkEANgI0IAIgBzYCMCACIABBDGoiDDYCLCACIA82AiggAiAKNgIkIAJBgICAgHg2AhQgAkHIAGogAkEUaiIBEBACfyACKAJIQYCAgIB4RgRAIAEQoQFBBCEEQQAMAQsgAkEIakEE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QQlJDQEgA0UEQCABIQMDQCADIAVqIgEgAyACEGogASEDIAIgACACayIATQ0ACwwBCwtBACAAQQR0IgNrIQUDQCABIAVqIAEgABBqIAEgA2ohASACIABrIgIgAE8NAAsMAQsLIAEgAEEEdCIFayIDIAJBBHQiBmohByAAIAJLDQEgBEEQaiIAIAMgBRAWGiADIAEgBhASIAcgACAFEBYaDAILIARBCGoiByABIABBBHRrIgZBCGopAgA3AwAgBCAGKQIANwMAIAJBBHQhCCACIgUhAQNAIAYgAUEEdGohAwNAIARBGGoiCSADQQhqIgopAgA3AwAgBCADKQIANwMQIAcpAwAhDSADIAQpAwA3AgAgCiANNwIAIAcgCSkDADcDACAEIAQpAxA3AwAgACABSwRAIAMgCGohAyABIAJqIQEMAQsLIAEgAGsiAQRAIAEgBSABIAVJGyEFDAEFIAQpAwAhDSAGQQhqIARBCGoiBykDADcCACAGIA03AgBBASAFIAVBAU0bIQlBASEBA0AgASAJRg0EIAYgAUEEdGoiBSkCACENIAcgBUEIaiIKKQIANwMAIAQgDTcDACABIAJqIQMDQCAEQRhqIgsgBiADQQR0aiIIQQhqIgwpAgA3AwAgBCAIKQIANwMQIAcpAwAhDSAIIAQpAwA3AgAgDCANNwIAIAcgCykDADcDACAEIAQpAxA3AwAgACADSwRAIAIgA2ohAwwBCyADIABrIgMgAUcNAAsgBCkDACENIAogBykDADcCACAFIA03AgAgAUEBaiEBDAALAAsACwALIARBEGoiACABIAYQFhogByADIAUQEiADIAAgBhAWGgsgBEGQAWokAAuQBQEIfwJAIAJBEEkEQCAAIQMMAQsCQEEAIABrQQNxIgYgAGoiBSAATQ0AIAZBAWsgACEDIAEhBCAGBEAgBiEHA0AgAyAELQAAOgAAIARBAWohBCADQQFqIQMgB0EBayIHDQALC0EHSQ0AA0AgAyAELQAAOgAAIANBAWogBEEBai0AADoAACADQQJqIARBAmotAAA6AAAgA0EDaiAEQQNqLQAAOgAAIANBBGogBEEEai0AADoAACADQQVqIARBBWotAAA6AAAgA0EGaiAEQQZqLQAAOgAAIANBB2ogBEEHai0AADoAACAEQQhqIQQgBSADQQhqIgNHDQALCyACIAZr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AygCHCIAIAEgAhAlIANBKGogAEHgAGooAgAgAEHkAGooAgAQIyADQRBqIAAQJCADIAMpAxA3AjQgA0EIaiADKAIsIAMoAjAQWyADKAIMIQAgAygCCEEBcQRAIAMgADYCPCADQTxqQezCwAAQQgALIANBKGoQbiADKAIgIAMoAiQQsgEgA0FAayQAIAALmQEBA38gAUFsbCECIAFB/////wNxIQMgACABQRRsaiEBQQAhAAJAA0AgAkUNAQJAIAFBFGsiBCgCAEEgRw0AIAFBEGsoAgBBAUcNACABQQxrLQAAQQJHDQAgAUEIay0AAEECRw0AIAFBBGstAAANACABQQNrLQAAQR9xDQAgAkEUaiECIABBAWohACAEIQEMAQsLIAAhAwsgAwuxAQECfyMAQRBrIgIkAAJAIAFFDQAgAUEDakECdiEBAkAgAEEETQRAIAFBAWsiA0GAAkkNAQsgAkGsssEAKAIANgIIIAEgACACQQhqQaiqwQBBBEEFEE8hAEGsssEAIAIoAgg2AgAMAQsgAkGsssEANgIEIAIgA0ECdEGsqsEAaiIDKAIANgIMIAEgACACQQxqIAJBBGpBBkEHEE8hACADIAIoAgw2AgALIAJBEGokACAAC6ABAQN/IwBBEGsiBSQAIAVBCGogACABIAJB4M7AABBnIAUoAgwiBiADIAIgAWsiByADIAdJGyIDTwRAIAYgA2siBiAFKAIIIAZBBHRqIAMQFSAAIAEgASADaiAEECogAQRAIAAgAUEBa0HwzsAAEGJBADoADAsgACACQQFrQYDPwAAQYkEAOgAMIAVBEGokAA8LQczJwABBIUHwycAAEHEAC6gBAQF/IwBBQGoiAyQAIANBCGogACgCABACIAMoAgghACADIAMoAgw2AgQgAyAANgIAIANBATYCMCADQQI2AhggA0GYqsEANgIUIANCATcCICADIAMoAgQiADYCPCADIAMoAgA2AjggAyAANgI0IAMgA0E0ajYCLCADIANBLGo2AhwgASACIANBFGoQFyADKAI0IgEEQCADKAI4QQEgARA4CyADQUBrJAALpAEBAX8jAEEQayIDJAACQCAARQ0AIAJFDQACQCABQQRNBEAgAkEDakECdkEBayIBQYACSQ0BCyADQayywQAoAgA2AgggACADQQhqQaiqwQBBAhAxQayywQAgAygC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BDYCBCAAIAE2AgALOAACQCABaUEBRw0AQYCAgIB4IAFrIABJDQAgAARAQeyywQAtAAAaIAEgABA1IgFFDQELIAEPCwALOAACQCACQYCAxABGDQAgACACIAEoAhARAgBFDQBBAQ8LIANFBEBBAA8LIAAgA0EAIAEoAgwRAwALLQEBfyABIAAoAgBPBH8gACgCBCECIAAtAAhFBEAgASACTQ8LIAEgAkkFQQALC3ABA38gACgCACIEIAAoAggiBUYEQCMAQRBrIgMkACADQQhqIAAgBEEBQQJBCBAmIAMoAggiBEGBgICAeEcEQCADKAIMGiAEIAIQrgEACyADQRBqJAALIAAgBUEBajYCCCAAKAIEIAVBA3RqIAE3AQALNAEBfyAAKAIIIgMgACgCAEYEQCAAIAIQawsgACADQQFqNgIIIAAoAgQgA0ECdGogATYCAAsuAQF/IwBBEGsiAiQAIAJBCGogASAAEIwBIAIoAggiAARAIAJBEGokACAADwsACzcBAX8jAEEgayIBJAAgAUEANgIYIAFBATYCDCABQYzpwAA2AgggAUIENwIQIAFBCGogABCKAQALKgEBfyACIAMQNSIEBEAgBCAAIAEgAyABIANJGxAWGiAAIAIgARA4CyAECysAIAIgA0kEQCADIAIgBBC0AQALIAAgAiADazYCBCAAIAEgA0EUbGo2AgALLwEBfyAAIAIQjgEgACgCBCAAKAIIIgNBFGxqIAEgAkEUbBAWGiAAIAIgA2o2AggLKwAgASADSwRAIAEgAyAEELQBAAsgACADIAFrNgIEIAAgAiABQQR0ajYCAAsvAAJAAkAgA2lBAUcNAEGAgICAeCADayABSQ0AIAAgASADIAIQfiIADQELAAsgAAsuAANAIAEEQCAAKAIAIABBBGooAgBBBEEUEJ8BIAFBAWshASAAQRBqIQAMAQsLCzIBAX8gACgCCCECIAEgACgCAEECai0AABCbASEBIAAoAgQgAiABEAEgACACQQFqNgIICyoAIAAgACgCaCABaiIBIAAoApwBIgBBAWsgACABSxtBACABQQBOGzYCaAszAQJ/IAAgACgCqAEiAiAAKAKsAUEBaiIDIAEgAEGyAWoQNiAAKAJgIAAoAmQgAiADEFMLMwECfyAAIAAoAqgBIgIgACgCrAFBAWoiAyABIABBsgFqEB0gACgCYCAAKAJkIAIgAxBTCyoAIAEgAkkEQEGkyMAAQSNBvMnAABBxAAsgAiAAIAJBFGxqIAEgAmsQGQs1ACAAIAApAnQ3AmggACAAKQF8NwGyASAAIAAvAYYBOwG+ASAAQboBaiAAQYQBai8BADsBAAvsAQICfwF+IwBBEGsiAiQAIAJBATsBDCACIAE2AgggAiAANgIEIwBBEGsiASQAIAJBBGoiACkCACEEIAEgADYCDCABIAQ3AgQjAEEQayIAJAAgAUEEaiIBKAIAIgIoAgwhAwJAAkACQAJAIAIoAgQOAgABAgsgAw0BQQEhAkEAIQMMAgsgAw0AIAIoAgAiAigCBCEDIAIoAgAhAgwBCyAAQYCAgIB4NgIAIAAgATYCDCABKAIIIgEtAAkaIABBGyABLQAIEEoACyAAIAM2AgQgACACNgIAIAEoAggiAS0ACRogAEEcIAEtAAgQSgALKwECfwJAIAAoAgQgACgCCCIBEDQiAkUNACABIAJJDQAgACABIAJrNgIICwsmACACBEBB7LLBAC0AABogASACEDUhAQsgACACNgIEIAAgATYCAAsjAQF/IAEgACgCACAAKAIIIgJrSwRAIAAgAiABQQRBEBBtCwsjAQF/IAEgACgCACAAKAIIIgJrSwRAIAAgAiABQQRBFBBtCwslACAAQQE2AgQgACABKAIEIAEoAgBrQQR2IgE2AgggACABNgIACxsAIAEgAk0EQCACIAEgAxBLAAsgACACQRRsagsgACABIAJNBEAgAiABQeTjwAAQSwALIAAgAmpBAToAAAsbACABIAJNBEAgAiABIAMQSwALIAAgAkEEdGoLAwAACwMAAAsDAAALAwAACwMAAAsDAAALGgBB7LLBAC0AABpBBCAAEDUiAARAIAAPCwALIQAgAEUEQEGc68AAQTIQuQEACyAAIAIgAyABKAIQEQEACxYAIAFBAXFFBEAgALgQCQ8LIACtEAoLRgEBfyAAIAAoAgBBAWsiATYCACABRQRAIABBDGoQRwJAIABBf0YNACAAIAAoAgRBAWsiATYCBCABDQAgAEEEQZwGEDgLCwsfACAARQRAQZzrwABBMhC5AQALIAAgAiABKAIQEQIACyEBAX8gACgCECIBIAAoAhQQgwEgACgCDCABQQRBEBCfAQsSACAABEAgASACIAAgA2wQOAsLIQEBfyAAKAIEIgEgACgCCBCDASAAKAIAIAFBBEEQEJ8BCxYAIABBEGoQWCAAKAIAIAAoAgQQowELFAAgACAAKAIAQQFrNgIAIAEQnAELGQAgAEGAgICAeEcEQCAAIAFBBEEUEJ8BCwsUACABBEBBgICAgHggARCjAQsgAQsZACABKAIcQcjlwABBDiABKAIgKAIMEQMACw8AIAIEQCAAIAEgAhA4CwsPACABBEAgACACIAEQOAsLEwAgAARADwtBpKnBAEEbELkBAAsPACAAQYQBTwRAIAAQAwsLEwAgACgCCCAAKAIAQQJBAhCfAQsVACACIAIQpAEaIABBgICAgHg2AgALFAAgACgCACABIAAoAgQoAgwRAgALEAAgASAAKAIEIAAoAggQDws8ACAARQRAIwBBIGsiACQAIABBADYCGCAAQQE2AgwgAEHQxMAANgIIIABCBDcCECAAQQhqIAEQigEACwALFAAgAEEANgIIIABCgICAgBA3AgALEgAgACABQZDNwAAQYkEBOgAMCxAAIAEgACgCACAAKAIEEA8LDgAgAEEANgIAIAEQnAELawEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQejpwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgOABhDcDKCADIAOtQoCAgIDgAYQ3AyAgAyADQSBqNgIQIANBCGogAhCKAQALawEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQcjpwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgOABhDcDKCADIAOtQoCAgIDgAYQ3AyAgAyADQSBqNgIQIANBCGogAhCKAQALawEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQZzqwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgOABhDcDKCADIAOtQoCAgIDgAYQ3AyAgAyADQSBqNgIQIANBCGogAhCKAQALDgBB8OXAAEErIAAQcQALCwAgACMAaiQAIwALDgBBv6nBAEHPABC5AQALCQAgACABEAcACw0AIABB9ObAACABEBcLDAAgACABKQIANwMACwoAIAAoAgAQqQELDQAgAEGAgICAeDYCAAsJACAAQQA2AgALBgAgABBYCwUAQYAECwQAQQELBAAgAQsEAEEACwvSbSAAQYCAwAALQB0AAAAEAAAABAAAAB4AAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlRXJyb3IAQb+JwAALAXgAQeCJwAALEP////////////////////8AQYaKwAALDwEAAAAAACAAAAAAAAAAAgBBwIrAAAsg//////////////////////////////////////////8AQaSLwAALCBAAAAAAAAABAEHAuMAACwL/BwBB1LjAAAsHDwD////1/wBBgLnAAAsW////////////////////////////AwBBoLnAAAsd/////////////////////////////////////w8AQf+5wAALGPz//////////////////////////////wBBoLrAAAs+//////////////////////////////////////////////////////////////////////////////////8AQYy7wAALOP////////////////////////////////////////////////////////////////////////9/AEHgu8AAC9EB/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wMAQcC9wAALJ///////////////////////////////////////////////////DwBBwMDAAAvBI3NyYy9saWIucnMAAAEADwDwGg8AAAAAAOIlAADlJQAAAAAAALDgAACz4AAAAAAAADz7AQBp+wEAAAAAAGr7AQBs+wEAAAAAAIAlAACfJQAAAAAAAAD7AQA7+wEAAAAAAGF0dGVtcHRlZCB0byB0YWtlIG93bmVyc2hpcCBvZiBSdXN0IHZhbHVlIHdoaWxlIGl0IHdhcyBib3Jyb3dlZGJndGV4dGNvZGVwb2ludHNyYXN0ZXJfc3ltYm9s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FVFVVVVVVVVVAAAAAAAAQFVVVVVVVVVVVdVXVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVVVVRUAAFVVUVVVVVVVBRAAAAEBUFVVVVVVVVVVVVUBVVVVVVX/////f1VVVVBVAABVVVVVVVVVVVVVBQBBwPzAAAuYBEBVVVVVVVVVVVVVVVVVRVQBAFRRAQBVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVRAFUVVFVFVVVBVVVVVVVVUVBVVVVVVVVVVVVVVVVVVVUQRUUUFFVVVVVVVVVUFFVVUFVVVVVVVVVVVVVVVVVVVQBEFRRVVVVVQVVVVVVVQUAUVVVVVVVVVVVVVVVVVVVBAFUVVFVAVVVBVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVFVFVVUVUVVVVVVVVVVVVVVVRUVVVVVVVVVVVVVVVVVQRUBQRQVUFVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVFEQFBFBVQVVVBVVVVVVVVVVQVVVVVVVVVVVVVVVVVRVEAVRVQVUVVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVUUVBURVFVVVVVVVVVVVVVVVVVVVVVVVVVVVUQBAVVUVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAABUVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVURUVVVVVVVVVVVVVVVVVUBAABAAARVAQAAAQAAAAAAAAAAVFVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQEEAEFBVVVVVVVVUAVUVVVVAVRVVUVBVVFVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAEGAgcEAC5ADVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVBVRVVVVVVVUFVVVVVVVVVQVVVVVVVVVVBVVVVX///ff//ddfd9bV11UQAFBVRQEAAFVXUVVVVVVVVVVVVVUVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVUVUVVAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcVFFVVVVVVVVVVVVVVVVVVRQBARAEAVBUAABRVVVVVVVVVVVVVVVUAAAAAAAAAQFVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVUAAFAFVVVVVVVVVVVVFQAAVVVVUFVVVVVVVVUFUBBQVVVVVVVVVVVVVVVVVUVQEVBVVVVVVVVVVVVVVVVVVQAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAQAVFFVVFBVVVVVVVVVVVVVVVVVVVVVVQBBoITBAAuTCFVVFQBVVVVVVVUFQFVVVVVVVVVVVVVVVQAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAFRVVVVVVVVVVVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/VfXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX1VVVVVVV9VVVVVVVVVVVVVVVX///9VVVVVVVVVVVVV1VVVVVXVVVVVXVX1VVVVVX1VX1V1VVdVVVVVdVX1XXVdVV31VVVVVVVVVVdVVVVVVVVVVXfV31VVVVVVVVVVVVVVVVVVVf1VVVVVVVVXVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVV11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVBVVVVVVVVVVVVVVVVVVVX9////////////////X1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWpqqqqqqqqqqqqqqmqqqqqqqqqqqqqqqqoqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVlaqqqqqqqqqqqqqqaqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVVVVVVVVVVVVVVVVVVVqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVV9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVQAAAUFVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVRUUVVVVVVVVVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAUFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUUVVVVVWqqqqqqqqqqqpVVVUAAAAAAEAVAEG/jMEAC+EMVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAA8KqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFamqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlZVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQFUBQVUAVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEAFVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUARVRVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUVAEBVVVVVVVBVVVVVVVVVVVVVVVVVFURUVVVVVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBRAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVAABBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRUEEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAFVVRVVVVVVVVVAQBAVVVVVVVVVVVVFQAEQFUVVVUBQAFVVVVVVVVVVVVVAAAAAEBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAABBVVVVVVVVVVVVVVVVVVVVVVVVVVQUAAAAAAAUABEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBQEUQAABVVVVVVVVVVVVVVVVVVVVVVVVQEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVUVVVAVVVVVVVVVVVVVVVVBUBVRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQAAAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBUVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVVpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVVVqqpWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqmqaaqqqqqqqqqqalVVVWVVVVVVVVVVallVVVWqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBBq5nBAAt1UAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRFQBQAAAABAAQBVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVAEGtmsEACwJAFQBBu5rBAAvFBlRVUVVVVVRVVVVVFQABAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAAAAAUABAEQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVdf3/f1VVVVVVVVVVVVVVVVVVVVVVVfX///////9uVVVVqqq6qqqqqur6v79VqqpWVV9VVVWqWlVVVVVVVf//////////V1VV/f/f///////////////////////3//////9VVVX/////////////f9X/VVVV/////1dX//////////////////////9/9//////////////////////////////////////////////////////////////X////////////////////X1VV1X////////9VVVVVdVVVVVVVVX1VVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVXV////////////////////////////VVVVVVVVVVVVVVVV//////////////////////9fVVd//VX/VVXVV1X//1dVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9VV1VVVVVVVf//////////////f///3/////////////////////////////////////////////////////////////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////V///V1X//////////////9//X1X1////Vf//V1X//1dVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVmWVWGqpVmqVVVVVVWVVVVVVVVVVZVVVQBBjqHBAAsBAwBBnKHBAAuJCVVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVZVWlWqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqqqqqqqqqqqqVVVVqqqqqqVaVVWaqlpVpaVVWlqllqVaVVVVpVpVlVVVVX1VaVmlVV9VZlVVVVVVVVVVZlX///9VVVWammqaVVVV1VVVVVXVVVWlXVX1VVVVVb1Vr6q6qquqqppVuqr6rrquVV31VVVVVVVVVVdVVVVVWVVVVXfV31VVVVVVVVWlqqpVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqalWqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////8vbml4L3N0b3JlLzI4aHl6ZmwzMzhrczRhbWhhN3ZwcG5sYnExczFucWF2LXJ1c3QtZGVmYXVsdC0xLjg1LjAvbGliL3J1c3RsaWIvc3JjL3J1c3QvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy5ycy9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTA2L3NyYy9jb252ZXJ0L3NsaWNlcy5ycy9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTA2L3NyYy9leHRlcm5yZWYucnMdVBAAZwAAAH8AAAARAAAAHVQQAGcAAACMAAAAEQAAAG51bGwgcG9pbnRlciBwYXNzZWQgdG8gcnVzdHJlY3Vyc2l2ZSB1c2Ugb2YgYW4gb2JqZWN0IGRldGVjdGVkIHdoaWNoIHdvdWxkIGxlYWQgdG8gdW5zYWZlIGFsaWFzaW5nIGluIHJ1c3RKc1ZhbHVlKCkADlUQAAgAAAAWVRAAAQBBqKrBAAsBBABICXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AgZ3YWxydXMGMC4yNC40DHdhc20tYmluZGdlbhMwLjIuMTA2ICgxMTgzMWZiODkp");class W{constructor(){let A=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.speed=A,this.startTime=performance.now()}getTime(){return this.speed*(performance.now()-this.startTime)/1e3}setTime(A){this.startTime=performance.now()-A/this.speed*1e3}}class z{constructor(){}getTime(A){}setTime(A){}}class X{constructor(A,e){this.input="function"==typeof A.next?A:A[Symbol.iterator](),this.xfs=e??[]}map(A){return this.transform(function(A){return e=>g=>{e(A(g))}}(A))}flatMap(A){return this.transform(function(A){return e=>g=>{A(g).forEach(e)}}(A))}filter(A){return this.transform(function(A){return e=>g=>{A(g)&&e(g)}}(A))}take(A){return this.transform(function(A){let e=0;return g=>V=>{eV=>{e+=1,e>A&&g(V)}}(A))}transform(A){return new X(this.input,this.xfs.concat([A]))}multiplex(A,e){return new X(new $(this[Symbol.iterator](),A[Symbol.iterator](),e))}toArray(){return Array.from(this)}[Symbol.iterator](){let A=0,e=[],g=!1;const V=(t=this.xfs,I=A=>e.push(A),t.reverse().reduce(((A,e)=>{const g=j(e(A.step));return{step:g.step,flush:()=>{g.flush(),A.flush()}}}),j(I)));var t,I;return{next:()=>{for(A===e.length&&(e=[],A=0);0===e.length;){const A=this.input.next();if(A.done)break;V.step(A.value)}return 0!==e.length||g||(V.flush(),g=!0),e.length>0?{done:!1,value:e[A++]}:{done:!0}}}}}function j(A){return"function"==typeof A?{step:A,flush:()=>{}}:A}class ${constructor(A,e,g){this.left=A,this.right=e,this.comparator=g}[Symbol.iterator](){let A,e;return{next:()=>{if(void 0===A&&void 0!==this.left){const e=this.left.next();e.done?this.left=void 0:A=e.value}if(void 0===e&&void 0!==this.right){const A=this.right.next();A.done?this.right=void 0:e=A.value}if(void 0===A&&void 0===e)return{done:!0};if(void 0===A){const A=e;return e=void 0,{done:!1,value:A}}if(void 0===e){const e=A;return A=void 0,{done:!1,value:e}}if(this.comparator(A,e)){const e=A;return A=void 0,{done:!1,value:e}}{const A=e;return e=void 0,{done:!1,value:A}}}}}}function _(A){const e=t(A.foreground),g=t(A.background),V=A.palette;if(void 0===V)return;if(!e||!g||V.length<8)return;const I=[],B=Math.min(V.length,16);for(let A=0;A"["===A[0])).map(JSON.parse);return{header:g,events:V}}(e);if(void 0!==g){const{header:A,events:e}=g;if(2===A.version)return eA(A,e);if(3===A.version)return gA(A,e);throw new Error(`asciicast v${A.version} format not supported`)}{const A=JSON.parse(e);if(1===A.version)return AA(A)}}else{if("object"==typeof A&&1===A.version)return AA(A);if(Array.isArray(A)){const e=A[0];if(2===e.version){return eA(e,A.slice(1,A.length))}if(3===e.version){return gA(e,A.slice(1,A.length))}throw new Error(`asciicast v${e.version} format not supported`)}}throw new Error("invalid data")}function AA(A){let e=0;const g=new X(A.stdout).map((A=>(e+=A[0],[e,"o",A[1]])));return{cols:A.width,rows:A.height,events:g}}function eA(A,e){return{cols:A.width,rows:A.height,theme:VA(A.theme),events:e,idleTimeLimit:A.idle_time_limit}}function gA(A,e){e instanceof X||(e=new X(e));let g=0;return e=e.map((A=>(g+=A[0],[g,A[1],A[2]]))),{cols:A.term.cols,rows:A.term.rows,theme:VA(A.term?.theme),events:e,idleTimeLimit:A.idle_time_limit}}function VA(A){const e="string"==typeof A?.palette?A.palette.split(":"):void 0;return _({foreground:A?.fg,background:A?.bg,palette:e})}function tA(A){return"number"==typeof A?[A,"m",""]:[A[0],"m",A[1]]}function IA(){let A=0;return function(e){return"m"===e[1]?[e[0],e[1],{index:A++,time:e[0],label:e[2]}]:e}}class BA{constructor(){this.items=[],this.onPush=void 0}push(A){this.items.push(A),void 0!==this.onPush&&(this.onPush(this.popAll()),this.onPush=void 0)}popAll(){if(this.items.length>0){const A=this.items;return this.items=[],A}{const A=this;return new Promise((e=>{A.onPush=e}))}}}function QA(A,e,g,V,t,I,B,Q,C){const i=function(A,e,g,V){return function(t,I){"o"===t?A(I):"i"===t?g(I):"r"===t?e(I.cols,I.rows):"m"===t&&V(I)}}(e,g,V,t);if(0===A)return C.debug("using no buffer"),function(A){return{pushEvent(e){A(e[1],e[2])},pushText(e){A("o",e)},stop(){}}}(i);{let e;return"number"==typeof(A=A??{})?(C.debug(`using fixed time buffer (${A} ms)`),e=e=>A):"function"==typeof A?(C.debug("using custom dynamic buffer"),e=A({logger:C})):(C.debug("using adaptive buffer",A),e=function(){let{logger:A}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{minBufferTime:e=50,bufferLevelStep:g=100,maxBufferLevel:V=50,transitionDuration:t=500,peakHalfLifeUp:I=100,peakHalfLifeDown:B=1e4,floorHalfLifeUp:Q=5e3,floorHalfLifeDown:C=100,idealHalfLifeUp:i=1e3,idealHalfLifeDown:o=5e3,safetyMultiplier:r=1.2,minImprovementDuration:n=3e3}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};function E(A){return 0===A?e:g*A}let s=1,a=E(s),c=performance.now(),l=null,u=null,w=null,h=null,d=null,f=null;return function(D){const y=performance.now(),q=Math.max(0,y-c);if(c=y,null===l)l=D;else if(D>l){const A=1-Math.pow(2,-q/I);l+=A*(D-l)}else{const A=1-Math.pow(2,-q/B);l+=A*(D-l)}if(l=Math.max(l,0),null===u)u=D;else if(D>u){const A=1-Math.pow(2,-q/Q);u+=A*(D-u)}else{const A=1-Math.pow(2,-q/C);u+=A*(D-u)}u=Math.max(u,0);const k=r*(l+(l-u));if(null===w)w=k;else if(k>w){const A=1-Math.pow(2,-q/i);w+=+A*(k-w)}else{const A=1-Math.pow(2,-q/o);w+=+A*(k-w)}let p;var L,F,M;return w<=e?p=0:(L=Math.ceil(w/g),F=1,M=V,p=Math.min(M,Math.max(F,L))),D>a&&A.debug("buffer underrun",{latency:D,bufferTime:a}),p>s?(D>a?s=Math.min(p,s+3):s+=1,d=E(s),f=(d-a)/t,h=null,A.debug("raising buffer",{latency:D,bufferTime:a,targetBufferTime:d})):p=n&&(s-=1,d=E(s),f=(d-a)/t,h=y,A.debug("lowering buffer",{latency:D,bufferTime:a,targetBufferTime:d}))):h=null,null!==d&&(a+=f*q,(f>=0&&a>d||f<0&&a5&&void 0!==arguments[5]?arguments[5]:1/60,B=performance.now()-1e3*t,Q=A(0);const C=new BA;I*=1e3;let i=-I,o=!1;function r(){return performance.now()-B}return setTimeout((async()=>{for(;!o;){const A=await C.popAll();if(o)return;for(const V of A){const A=1e3*V[0]+Q;if(A-i0&&(await CA(t),o))return;g(V[0]),e(V[1],V[2]),i=A}}}),0),{pushEvent(e){let g=r()-1e3*e[0];g<0&&(V.debug(`correcting epoch by ${g} ms`),B+=g,g=0),Q=A(g),C.push(e)},pushText(A){C.push([r()/1e3,"o",A])},stop(){o=!0,C.push(void 0)}}}(e,i,I,C,B??0,Q)}}function CA(A){return new Promise((e=>{setTimeout(e,A)}))}const iA=1e6;function oA(A){const e=new TextDecoder,g=new TextDecoder;let V,t=function(A){const e=(new TextDecoder).decode(A);if("ALiS"!==e)throw new Error("not an ALiS v1 live stream");t=B},I=0;function B(A){const e=new sA(new DataView(A)),g=e.getUint8();if(1!==g)throw new Error(`expected reset (0x01) frame, got ${g}`);return Q(e,A)}function Q(A,g){A.decodeVarUint();let B=A.decodeVarUint();V=B,B/=iA,I=0;const Q=A.decodeVarUint(),i=A.decodeVarUint(),o=A.getUint8();let r;if(8===o){const e=30;r=rA(new Uint8Array(g,A.offset,e)),A.forward(e)}else if(16===o){const e=54;r=rA(new Uint8Array(g,A.offset,e)),A.forward(e)}else if(0!==o)throw new Error(`alis: invalid theme format (${o})`);const n=A.decodeVarUint();let E;return n>0&&(E=e.decode(new Uint8Array(g,A.offset,n))),t=C,{time:B,term:{size:{cols:Q,rows:i},theme:r,init:E}}}function C(C){const i=new sA(new DataView(C)),o=i.getUint8();return 1===o?Q(i,C):111===o?function(A,g){A.decodeVarUint();const t=A.decodeVarUint();V+=t;const I=A.decodeVarUint(),B=e.decode(new Uint8Array(g,A.offset,I));return[V/iA,"o",B]}(i,C):105===o?function(A,e){A.decodeVarUint();const t=A.decodeVarUint();V+=t;const I=A.decodeVarUint(),B=g.decode(new Uint8Array(e,A.offset,I));return[V/iA,"i",B]}(i,C):114===o?function(A){A.decodeVarUint();const e=A.decodeVarUint();V+=e;const g=A.decodeVarUint(),t=A.decodeVarUint();return[V/iA,"r",{cols:g,rows:t}]}(i):109===o?function(A,e){A.decodeVarUint();const g=A.decodeVarUint();V+=g;const t=A.decodeVarUint(),B=new TextDecoder,Q=I++,C=V/iA,i=B.decode(new Uint8Array(e,A.offset,t));return[C,"m",{index:Q,time:C,label:i}]}(i,C):120===o?function(A){A.decodeVarUint();const e=A.decodeVarUint();V+=e;const g=A.decodeVarUint();return[V/iA,"x",{status:g}]}(i):4===o?(t=B,!1):void A.debug(`alis: unknown frame type: ${o}`)}return function(A){return t(A)}}function rA(A){const e=A.length/3,g=nA(A[0],A[1],A[2]),V=nA(A[3],A[4],A[5]),t=[];for(let g=2;g1&&void 0!==arguments[1]?arguments[1]:0;this.inner=A,this.offset=e}forward(A){this.offset+=A}getUint8(){const A=this.inner.getUint8(this.offset);return this.offset+=1,A}decodeVarUint(){let A=BigInt(0),e=BigInt(0),g=this.getUint8();for(;g>127;)g&=127,A+=BigInt(g)<e(A,g,V)}throw new Error(`unsupported driver: ${JSON.stringify(A)}`)}(A),this.changedLines=new Set,this.duration=void 0,this.cols=g.cols,this.rows=g.rows,this.speed=g.speed,this.loop=g.loop,this.autoPlay=g.autoPlay,this.idleTimeLimit=g.idleTimeLimit,this.preload=g.preload,this.startAt=e(g.startAt),this.poster=this._parsePoster(g.poster),this.markers=this._normalizeMarkers(g.markers),this.pauseOnMarkers=g.pauseOnMarkers,this.audioUrl=g.audioUrl,this.boldIsBright=g.boldIsBright??!1,this.commandQueue=Promise.resolve(),this.needsClear=!1,this.eventHandlers=new Map([["ended",[]],["errored",[]],["idle",[]],["input",[]],["loading",[]],["marker",[]],["metadata",[]],["muted",[]],["offline",[]],["pause",[]],["play",[]],["playing",[]],["ready",[]],["seeked",[]],["vtUpdate",[]]])}async init(){this.wasm=await wA;const{memory:A}=await this.wasm.default();this.memory=A,this._initializeVt(this.cols??80,this.rows??24);const e=this._feed.bind(this),g=this._resetVt.bind(this),V=this._resizeVt.bind(this),t=this._setState.bind(this),I="npt"!==this.poster.type||this.autoPlay?void 0:this.poster.value;this.driver=this.driver({feed:e,onInput:A=>{this._dispatchEvent("input",{data:A})},onMarker:A=>{let{index:e,time:g,label:V}=A;this._dispatchEvent("marker",{index:e,time:g,label:V})},reset:g,resize:V,setState:t,logger:this.logger},{cols:this.cols,rows:this.rows,speed:this.speed,idleTimeLimit:this.idleTimeLimit,startAt:this.startAt,loop:this.loop,posterTime:I,markers:this.markers,pauseOnMarkers:this.pauseOnMarkers,audioUrl:this.audioUrl}),"function"==typeof this.driver&&(this.driver={play:this.driver}),(this.preload||void 0!==I)&&this._withState((A=>A.init()));const B={isPausable:!!this.driver.pause,isSeekable:!!this.driver.seek};if(void 0===this.driver.init&&(this.driver.init=()=>({})),void 0===this.driver.pause&&(this.driver.pause=()=>{}),void 0===this.driver.seek&&(this.driver.seek=A=>!1),void 0===this.driver.step&&(this.driver.step=A=>{}),void 0===this.driver.stop&&(this.driver.stop=()=>{}),void 0===this.driver.restart&&(this.driver.restart=()=>{}),void 0===this.driver.mute&&(this.driver.mute=()=>{}),void 0===this.driver.unmute&&(this.driver.unmute=()=>{}),void 0===this.driver.getCurrentTime){const A=this.driver.play;let e=new z;this.driver.play=()=>(e=new W(this.speed),A()),this.driver.getCurrentTime=()=>e.getTime()}this._dispatchEvent("ready",B),this.autoPlay?this.play():"text"===this.poster.type&&(this._feed(this.poster.value),this.needsClear=!0)}play(){return this._clearIfNeeded(),this._withState((A=>A.play()))}pause(){return this._withState((A=>A.pause()))}togglePlay(){return this._clearIfNeeded(),this._withState((A=>A.togglePlay()))}seek(A){return this._clearIfNeeded(),this._withState((async e=>{await e.seek(A)&&this._dispatchEvent("seeked")}))}step(A){return this._clearIfNeeded(),this._withState((e=>e.step(A)))}stop(){return this._withState((A=>A.stop()))}mute(){return this._withState((A=>A.mute()))}unmute(){return this._withState((A=>A.unmute()))}getLine(A,e){return this.vt.getLine(A,e)}getDataView(A,e){let[g,V]=A;return new DataView(this.memory.buffer,g,V*e)}getUint32Array(A){let[e,g]=A;return new Uint32Array(this.memory.buffer,e,g)}getCursor(){const A=this.vt.getCursor();return A?{col:A[0],row:A[1],visible:!0}:{col:0,row:0,visible:!1}}getCurrentTime(){return this.driver.getCurrentTime()}getRemainingTime(){if("number"==typeof this.duration)return this.duration-Math.min(this.getCurrentTime(),this.duration)}getProgress(){if("number"==typeof this.duration)return Math.min(this.getCurrentTime(),this.duration)/this.duration}getDuration(){return this.duration}addEventListener(A,e){this.eventHandlers.get(A).push(e)}removeEventListener(A,e){const g=this.eventHandlers.get(A);if(!g)return;const V=g.indexOf(e);-1!==V&&g.splice(V,1)}_dispatchEvent(A){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(const g of this.eventHandlers.get(A))g(e)}_withState(A){return this._enqueueCommand((()=>A(this.state)))}_enqueueCommand(A){return this.commandQueue=this.commandQueue.then(A),this.commandQueue}_setState(A){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.stateName===A)return this.state;if(this.stateName=A,"playing"===A)this.state=new DA(this);else if("idle"===A)this.state=new fA(this);else if("loading"===A)this.state=new yA(this);else if("ended"===A)this.state=new kA(this);else if("offline"===A)this.state=new qA(this);else{if("errored"!==A)throw new Error(`invalid state: ${A}`);this.state=new pA(this)}return this.state.onEnter(e),this.state}_feed(A){const e=this.vt.feed(A);this._dispatchEvent("vtUpdate",{changedRows:e})}async _initializeDriver(){const A=await this.driver.init();this.cols=this.cols??A.cols??80,this.rows=this.rows??A.rows??24,this.duration=this.duration??A.duration,this.markers=this._normalizeMarkers(A.markers)??this.markers??[],0===this.cols&&(this.cols=80),0===this.rows&&(this.rows=24),this._initializeVt(this.cols,this.rows),void 0!==A.poster?(A.poster.forEach((A=>this.vt.feed(A))),this.needsClear=!0):"text"===this.poster.type&&(this.vt.feed(this.poster.value),this.needsClear=!0),this._dispatchEvent("metadata",{size:{cols:this.cols,rows:this.rows},theme:A.theme??null,duration:this.duration,markers:this.markers,hasAudio:A.hasAudio}),this._dispatchEvent("vtUpdate",{size:{cols:this.cols,rows:this.rows},theme:A.theme??null,changedRows:Array.from({length:this.rows},((A,e)=>e))})}_clearIfNeeded(){this.needsClear&&(this._feed("c"),this.needsClear=!1)}_resetVt(A,e){let g=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,V=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;this.logger.debug(`core: vt reset (${A}x${e})`),this.cols=A,this.rows=e,this._initializeVt(A,e),void 0!==g&&""!==g&&this.vt.feed(g),this._dispatchEvent("metadata",{size:{cols:A,rows:e},theme:V??null}),this._dispatchEvent("vtUpdate",{size:{cols:A,rows:e},theme:V??null,changedRows:Array.from({length:e},((A,e)=>e))})}_resizeVt(A,e){if(A===this.vt.cols&&e===this.vt.rows)return;const g=this.vt.resize(A,e);this.vt.cols=A,this.vt.rows=e,this.logger.debug(`core: vt resize (${A}x${e})`),this._dispatchEvent("metadata",{size:{cols:A,rows:e}}),this._dispatchEvent("vtUpdate",{size:{cols:A,rows:e},changedRows:g})}_initializeVt(A,e){this.logger.debug("vt init",{cols:A,rows:e}),this.vt=this.wasm.create(A,e,100,this.boldIsBright),this.vt.cols=A,this.vt.rows=e}_parsePoster(A){return"string"!=typeof A?{}:"data:text/plain,"==A.substring(0,16)?{type:"text",value:A.substring(16)}:"npt:"==A.substring(0,4)?{type:"npt",value:e(A.substring(4))}:{}}_normalizeMarkers(A){if(Array.isArray(A))return A.map((A=>"number"==typeof A?[A,""]:A))}}const FA=new Map([["benchmark",function(A,e){let g,{url:V,iterations:t=10}=A,{feed:I,setState:B}=e,Q=0;return{async init(){const A=await P(await fetch(V)),{cols:e,rows:t,events:I}=A;g=Array.from(I).filter((A=>{let[e,g,V]=A;return"o"===g})).map((A=>{let[e,g,V]=A;return[e,V]}));const B=g[g.length-1][0];for(const[A,e]of g)Q+=new Blob([e]).size;return{cols:e,rows:t,duration:B}},play(){const A=performance.now();for(let A=0;A{B("stopped",{reason:"ended"})}),0),!0}}}],["clock",function(A,e,g){let{hourColor:V=3,minuteColor:t=4,separatorColor:I=9}=A,{feed:B}=e,{cols:Q=5,rows:C=1}=g;const i=Math.floor(C/2),o=Math.floor(Q/2)-2,r=`[?25l[${i}B`;let n;const E=()=>{const A=new Date,e=A.getHours(),g=A.getMinutes(),B=[];B.push("\r");for(let A=0;A{E().forEach(B)};return{init:()=>{const A=[r].concat(E());return{cols:Q,rows:C,duration:1440,poster:A}},play:()=>(B(r),s(),n=setInterval(s,1e3),!0),stop:()=>{clearInterval(n)},getCurrentTime:()=>{const A=new Date;return 60*A.getHours()+A.getMinutes()}}}],["eventsource",function(A,e){let g,V,{url:t,bufferTime:I,minFrameTime:B}=A,{feed:Q,reset:C,resize:i,onInput:o,onMarker:r,setState:n,logger:E}=e;E=new c(E,"eventsource: ");let s=new z;function a(A){void 0!==V&&V.stop(),V=QA(I,Q,i,o,r,(A=>s.setTime(A)),A,B,E)}return{play:()=>{g=new EventSource(t),g.addEventListener("open",(()=>{E.info("opened"),a()})),g.addEventListener("error",(A=>{E.info("errored"),E.debug({e:A}),n("loading")})),g.addEventListener("message",(A=>{const e=JSON.parse(A.data);if(Array.isArray(e))V.pushEvent(e);else if(void 0!==e.cols||void 0!==e.width){const A=e.cols??e.width,g=e.rows??e.height;E.debug(`vt reset (${A}x${g})`),n("playing"),a(e.time),C(A,g,e.init??void 0),s=new W,"number"==typeof e.time&&s.setTime(e.time)}else"offline"===e.state&&(E.info("stream offline"),n("offline",{message:"Stream offline"}),s=new z)})),g.addEventListener("done",(()=>{E.info("closed"),g.close(),n("ended",{message:"Stream ended"})}))},stop:()=>{void 0!==V&&V.stop(),void 0!==g&&g.close()},getCurrentTime:()=>s.getTime()}}],["random",function(A,e,g){let{feed:V}=e,{speed:t}=g;const I=" ".charCodeAt(0),B="~".charCodeAt(0)-I;let Q;const C=()=>{const A=Math.pow(5,4*Math.random());Q=setTimeout(i,A/t)},i=()=>{C();const A=String.fromCharCode(I+Math.floor(Math.random()*B));V(A)};return()=>(C(),()=>clearInterval(Q))}],["recording",function(A,e,g){let V,t,I,B,Q,C,i,o,r,n,E,s,{feed:a,resize:c,onInput:l,onMarker:u,setState:w,logger:h}=e,{speed:d,idleTimeLimit:f,startAt:D,loop:y,posterTime:q,markers:k,pauseOnMarkers:p,cols:L,rows:F,audioUrl:M}=g,m=0,R=0,N=0,G=!1,U=!1,J=()=>performance.now()*d,v=!1;async function b(A,e){const g=await fetch(A,e);if(!g.ok)throw new Error(`failed fetching recording from ${A}: ${g.status} ${g.statusText}`);return g}function S(){const A=I[m];A?i=function(A,e){let g=(1e3*e-(J()-o))/d;g<0&&(g=0);return setTimeout(A,g)}(Y,A[0]):O()}function Y(){let A,e=I[m];do{R=e[0],m++;if(T(e))return;e=I[m],A=J()-o}while(e&&A>1e3*e[0]);S()}function K(){clearTimeout(i),i=null}function T(A){const[e,g,V]=A;if("o"===g)a(V);else if("i"===g)l(V);else if("r"===g){const[A,e]=V.split("x");c(A,e)}else if("m"===g&&(u(V),p))return H(),r=1e3*e,w("idle",{reason:"paused"}),!0;return!1}function O(){K(),N++,!0===y||"number"==typeof y&&N>"===A?A=g+5:"<<<"===A?A=g-.1*Q:">>>"===A?A=g+.1*Q:"%"===A[A.length-1]&&(A=parseFloat(A.substring(0,A.length-1))/100*Q);else if("object"==typeof A)if("prev"===A.marker)A=W(g)??0,e&&g-A<1&&(A=W(A)??0);else if("next"===A.marker)A=function(A){if(0==B.length)return;let e,g=B.length-1,V=B[g];for(;V&&V[0]>A;)e=V[0],V=B[--g];return e}(g)??Q;else if("number"==typeof A.marker){const e=B[A.marker];if(void 0===e)throw new Error(`invalid marker index: ${A.marker}`);A=e[0]}const V=Math.min(Math.max(A,0),Q);if(1e3*V===r)return!1;Vw("loading")),1e3),!i)return!0;h.debug("pausing session playback"),K(),r=J()-o}function _(){h.debug("audio resumed"),clearTimeout(n),w("playing"),G&&(G=!1,U&&(h.debug("resuming session playback"),o=J()-r,r=null,S()))}return{init:async function(){const e=setTimeout((()=>{w("loading")}),3e3);try{let e=async function(A,e,g){const{parser:i,minFrameTime:o,inputOffset:r,dumpFilename:n,encoding:E="utf-8"}=A,s=await async function(A){let{url:e,data:g,fetchOpts:V={}}=A;if("string"==typeof e)return await b(e,V);if(Array.isArray(e))return await Promise.all(e.map((A=>b(A,V))));if(void 0!==g){"function"==typeof g&&(g=g()),g instanceof Promise||(g=Promise.resolve(g));const A=await g;return"string"==typeof A||A instanceof ArrayBuffer?new Response(A):A}throw new Error("failed fetching recording file: url/data missing in src")}(A),a=function(A,e,g){let{startAt:V=0,idleTimeLimit:t,minFrameTime:I,inputOffset:B,markers_:Q}=g,{events:C}=A;C instanceof X||(C=new X(C));t=t??A.idleTimeLimit??1/0;const i={offset:0};C=C.transform(function(A){let e,g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/60;return V=>{let t=0,I=0;return{step:A=>{t++,void 0!==e?"o"===A[1]&&"o"===e[1]&&A[0]-e[0]{void 0!==e&&(V(e),I++),A.debug(`batched ${t} frames to ${I} frames`)}}}}(e,I)).map(function(A,e,g){let V=0,t=0;return function(I){const B=I[0]-V-A;return V=I[0],B>0&&(t+=B,I[0]"m"!==A[1])).multiplex(Q,((A,e)=>A[0]"i"===A[1]?[A[0]+B,A[1],A[2]]:A)),C.sort(((A,e)=>A[0]-e[0])));const o=C[C.length-1][0],r=V-i.offset;return{...A,events:C,duration:o,effectiveStartAt:r}}(await i(s,{encoding:E}),e,{...g,minFrameTime:o,inputOffset:r});if(({cols:V,rows:t,events:I,duration:Q,effectiveStartAt:C}=a),L=L??V,F=F??t,0===I.length)throw new Error("recording is missing events");void 0!==n&&function(A,e){const g=document.createElement("a"),V=A.events.map((A=>"m"===A[1]?[A[0],A[1],A[2].label]:A)),t=function(A){return`${JSON.stringify({version:2,width:A.cols,height:A.rows})}\n${A.events.map(JSON.stringify).join("\n")}\n`}({...A,events:V});g.href=URL.createObjectURL(new Blob([t],{type:"text/plain"})),g.download=e,g.click()}(a,n);const c=void 0!==q?(l=q,I.filter((A=>A[0]A[2]))):void 0;var l;return B=I.filter((A=>"m"===A[1])).map((A=>[A[0],A[2].label])),{cols:V,rows:t,duration:Q,theme:a.theme,poster:c,markers:B}}(A,h,{idleTimeLimit:f,startAt:D,markers_:k});const g=await async function(A){if(!A)return!1;s=await async function(A){const e=new Audio;let g;e.preload="metadata",e.loop=!1,e.crossOrigin="anonymous";const V=new Promise((A=>{g=A}));function t(){g(),e.removeEventListener("canplay",t)}return e.addEventListener("canplay",t),e.src=A,e.load(),await V,e}(A),v=!Number.isNaN(s.duration)&&s.duration!==1/0&&s.seekable.length>0&&s.seekable.end(s.seekable.length-1)===s.duration,v?(s.addEventListener("playing",_),s.addEventListener("waiting",$)):h.warn(`audio is not seekable - you must enable range request support on the server providing ${s.src} for audio seeking to work`);return!0}(M);return e=await e,{...e,hasAudio:g}}finally{clearTimeout(e)}},play:async function(){if(i)throw new Error("already playing");if(void 0===I[m])throw new Error("already ended");return null!==C&&x(C),await Z(),!0},pause:H,seek:x,step:function(A){let e,g;if(void 0===A&&(A=1),A>0){let V=m;e=I[V];for(let t=0;t{A=V.protocol||"raw",a.info("opened"),a.info(`activating ${A} protocol handler`),"v1.alis"===A?V.onmessage=L(oA(a)):"v2.asciicast"===A?V.onmessage=L(function(){let A=function(g){const V=JSON.parse(g);if(2!==V.version)throw new Error("not an asciicast v2 stream");return A=e,{time:0,term:{size:{cols:V.width,rows:V.height}}}};function e(A){const e=JSON.parse(A);if("r"===e[1]){const[A,g]=e[2].split("x");return[e[0],"r",{cols:parseInt(A,10),rows:parseInt(g,10)}]}return e}return function(e){return A(e)}}()):"v3.asciicast"===A?V.onmessage=L(function(){let A=function(e){const V=JSON.parse(e);if(3!==V.version)throw new Error("not an asciicast v3 stream");A=g;const t={size:{cols:V.term.cols,rows:V.term.rows}};if(V.term.theme){const A="string"==typeof V.term.theme.palette?V.term.theme.palette.split(":"):void 0,e=_({foreground:V.term.theme.fg,background:V.term.theme.bg,palette:A});e&&(t.theme=e)}return{time:0,term:t}},e=0;function g(A){const g=JSON.parse(A),[V,t,I]=g;if(e+=V,"r"===t){const[A,g]=I.split("x");return[e,"r",{cols:parseInt(A,10),rows:parseInt(g,10)}]}return[e,t,I]}return function(e){return A(e)}}()):"raw"===A&&(V.onmessage=L(aA())),u=setTimeout((()=>{f=0}),1e3)},V.onclose=e=>{if(clearTimeout(w),m(),D)return;let g=!1,V="Stream ended";if("v1.alis"===A?(k||e.code>=4e3&&e.code<=4100)&&(g=!0,V=e.reason||V):(q||1e3===e.code||1005===e.code)&&(g=!0),g)a.info("closed"),s("ended",{message:V});else if(1002===e.code)a.debug(`close reason: ${e.reason}`),s("ended",{message:"Err: Player not compatible with the server"});else{clearTimeout(u);const A=Q(f++);a.info(`unexpected close, reconnecting in ${A}...`),s("loading"),setTimeout(p,A)}},y=!1}function L(A){return w=setTimeout(M,5e3),function(e){try{const g=A(e.data);if(t)if(Array.isArray(g))t.pushEvent(g),"x"===g[1]&&(q=!0);else if("string"==typeof g)t.pushText(g);else if("object"!=typeof g||Array.isArray(g)){if(!1===g)M(),k=!0;else if(void 0!==g)throw new Error(`unexpected value from protocol handler: ${g}`)}else F(g);else if("object"!=typeof g||Array.isArray(g)){if(void 0!==g)throw clearTimeout(w),new Error(`unexpected value from protocol handler: ${g}`);clearTimeout(w),w=setTimeout(M,1e3)}else F(g),clearTimeout(w)}catch(A){throw V.close(),A}}}function F(A){let{time:e,term:g}=A;const{size:V,init:I,theme:Q}=g,{cols:c,rows:l}=V;a.info(`stream reset (${c}x${l} @${e})`),s("playing"),m(),t=QA(B,i,r,n,E,(A=>d.setTime(A)),e,C,a),o(c,l,I,Q),d=new W,y=!0,q=!1,k=!1,"number"==typeof e&&d.setTime(e)}function M(){m(),y?(a.info("stream ended"),s("offline",{message:"Stream ended"})):(a.info("stream offline"),s("offline",{message:"Stream offline"})),d=new z}function m(){t&&t.stop(),t=null}return{init:()=>({hasAudio:!!l}),play:()=>{p(),l&&(h=new Audio,h.preload="auto",h.crossOrigin="anonymous",h.src=l,h.play())},stop:()=>{D=!0,m(),void 0!==V&&V.close(),h&&h.pause()},mute:function(){if(h)return h.muted=!0,!0},unmute:function(){if(h)return h.muted=!1,!0},getCurrentTime:()=>d.getTime()}}]]),MA=new Map([["asciicast",P],["typescript",async function(A,e){let{encoding:g}=e;const V=new TextDecoder(g);let t,I,B=(await A[0].text()).split("\n").filter((A=>A.length>0)).map((A=>A.split(" ")));B[0].length<3&&(B=B.map((A=>["O",A[0],A[1]])));const Q=await A[1].arrayBuffer(),C=new Uint8Array(Q),i=C.findIndex((A=>10==A))+1,o=V.decode(C.subarray(0,i)).match(/COLUMNS="(\d+)" LINES="(\d+)"/);null!==o&&(t=parseInt(o[1],10),I=parseInt(o[2],10));const r={array:C,cursor:i};let n=r;if(void 0!==A[2]){const e=await A[2].arrayBuffer();n={array:new Uint8Array(e),cursor:i}}const E=[];let s=0;for(const A of B)if(s+=parseFloat(A[1]),"O"===A[0]){const e=parseInt(A[2],10),g=r.array.subarray(r.cursor,r.cursor+e),t=V.decode(g);E.push([s,"o",t]),r.cursor+=e}else if("I"===A[0]){const e=parseInt(A[2],10),g=n.array.subarray(n.cursor,n.cursor+e),t=V.decode(g);E.push([s,"i",t]),n.cursor+=e}else if("S"===A[0]&&"SIGWINCH"===A[2]){const e=parseInt(A[4].slice(5),10),g=parseInt(A[3].slice(5),10);E.push([s,"r",`${e}x${g}`])}else"H"===A[0]&&"COLUMNS"===A[2]?t=parseInt(A[3],10):"H"===A[0]&&"LINES"===A[2]&&(I=parseInt(A[3],10));return t=t??80,I=I??24,{cols:t,rows:I,events:E}}],["ttyrec",async function(A,e){let{encoding:g}=e;const V=new TextDecoder(g),t=await A.arrayBuffer(),I=new Uint8Array(t),B=lA(I),Q=B.time,C=V.decode(B.data).match(/\x1b\[8;(\d+);(\d+)t/),i=[];let o=80,r=24;null!==C&&(o=parseInt(C[2],10),r=parseInt(C[1],10));let n=0,E=lA(I);for(;void 0!==E;){const A=E.time-Q,e=V.decode(E.data);i.push([A,"o",e]),n+=E.len,E=lA(I.subarray(n))}return{cols:o,rows:r,events:i}}]]);const mA=Symbol("solid-proxy"),RA=Symbol("solid-track"),NA={equals:(A,e)=>A===e};let GA=oe;const UA=1,JA=2,vA={owned:null,cleanups:null,context:null,owner:null};var bA=null;let SA=null,YA=null,KA=null,TA=null,OA=0;function HA(A,e){const g=YA,V=bA,t=0===A.length,I=void 0===e?V:e,B=t?vA:{owned:null,cleanups:null,context:I?I.context:null,owner:I},Q=t?A:()=>A((()=>jA((()=>se(B)))));bA=B,YA=null;try{return ie(Q,!0)}finally{YA=g,bA=V}}function ZA(A,e){const g={value:A,observers:null,observerSlots:null,comparator:(e=e?Object.assign({},NA,e):NA).equals||void 0};return[te.bind(g),A=>("function"==typeof A&&(A=A(g.value)),Ie(g,A))]}function xA(A,e,g){Be(Qe(A,e,!1,UA))}function WA(A,e,g){GA=re;const V=Qe(A,e,!1,UA);V.user=!0,TA?TA.push(V):Be(V)}function zA(A,e,g){g=g?Object.assign({},NA,g):NA;const V=Qe(A,e,!0,0);return V.observers=null,V.observerSlots=null,V.comparator=g.equals||void 0,Be(V),te.bind(V)}function XA(A){return ie(A,!1)}function jA(A){if(null===YA)return A();const e=YA;YA=null;try{return A()}finally{YA=e}}function $A(A){WA((()=>jA(A)))}function _A(A){return null===bA||(null===bA.cleanups?bA.cleanups=[A]:bA.cleanups.push(A)),A}function PA(){return YA}function Ae(A){const e=YA,g=bA;return Promise.resolve().then((()=>{YA=e,bA=g,ie(A,!1),YA=bA=null}))}const[ee,ge]=ZA(!1);function Ve(A){const e=zA(A),g=zA((()=>ce(e())));return g.toArray=()=>{const A=g();return Array.isArray(A)?A:null!=A?[A]:[]},g}function te(){if(this.sources&&this.state)if(this.state===UA)Be(this);else{const A=KA;KA=null,ie((()=>ne(this)),!1),KA=A}if(YA){const A=this.observers?this.observers.length:0;YA.sources?(YA.sources.push(this),YA.sourceSlots.push(A)):(YA.sources=[this],YA.sourceSlots=[A]),this.observers?(this.observers.push(YA),this.observerSlots.push(YA.sources.length-1)):(this.observers=[YA],this.observerSlots=[YA.sources.length-1])}return this.value}function Ie(A,e,g){let V=A.value;return A.comparator&&A.comparator(V,e)||(A.value=e,A.observers&&A.observers.length&&ie((()=>{for(let e=0;e1e6)throw KA=[],new Error}),!1)),e}function Be(A){if(!A.fn)return;se(A);const e=OA;!function(A,e,g){let V;const t=bA,I=YA;YA=bA=A;try{V=A.fn(e)}catch(e){return A.pure&&(A.state=UA,A.owned&&A.owned.forEach(se),A.owned=null),A.updatedAt=g+1,ae(e)}finally{YA=I,bA=t}(!A.updatedAt||A.updatedAt<=g)&&(null!=A.updatedAt&&"observers"in A?Ie(A,V):A.value=V,A.updatedAt=g)}(A,A.value,e)}function Qe(A,e,g,V=UA,t){const I={fn:A,state:V,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:e,owner:bA,context:bA?bA.context:null,pure:g};return null===bA||bA!==vA&&(bA.owned?bA.owned.push(I):bA.owned=[I]),I}function Ce(A){if(0===A.state)return;if(A.state===JA)return ne(A);if(A.suspense&&jA(A.suspense.inFallback))return A.suspense.effects.push(A);const e=[A];for(;(A=A.owner)&&(!A.updatedAt||A.updatedAt=0;g--)if((A=e[g]).state===UA)Be(A);else if(A.state===JA){const g=KA;KA=null,ie((()=>ne(A,e[0])),!1),KA=g}}function ie(A,e){if(KA)return A();let g=!1;e||(KA=[]),TA?g=!0:TA=[],OA++;try{const e=A();return function(A){KA&&(oe(KA),KA=null);if(A)return;const e=TA;TA=null,e.length&&ie((()=>GA(e)),!1)}(g),e}catch(A){g||(TA=null),KA=null,ae(A)}}function oe(A){for(let e=0;e=0;e--)se(A.tOwned[e]);delete A.tOwned}if(A.owned){for(e=A.owned.length-1;e>=0;e--)se(A.owned[e]);A.owned=null}if(A.cleanups){for(e=A.cleanups.length-1;e>=0;e--)A.cleanups[e]();A.cleanups=null}A.state=0}function ae(A,e=bA){const g=function(A){return A instanceof Error?A:new Error("string"==typeof A?A:"Unknown error",{cause:A})}(A);throw g}function ce(A){if("function"==typeof A&&!A.length)return ce(A());if(Array.isArray(A)){const e=[];for(let g=0;gA(e||{})))}const he=A=>`Stale read from <${A}>.`;function de(A){const e="fallback"in A&&{fallback:()=>A.fallback};return zA(function(A,e,g={}){let V=[],t=[],I=[],B=0,Q=e.length>1?[]:null;return _A((()=>ue(I))),()=>{let C,i,o=A()||[],r=o.length;return o[RA],jA((()=>{let A,e,E,s,a,c,l,u,w;if(0===r)0!==B&&(ue(I),I=[],V=[],t=[],B=0,Q&&(Q=[])),g.fallback&&(V=[le],t[0]=HA((A=>(I[0]=A,g.fallback()))),B=1);else if(0===B){for(t=new Array(r),i=0;i=c&&u>=c&&V[l]===o[u];l--,u--)E[u]=t[l],s[u]=I[l],Q&&(a[u]=Q[l]);for(A=new Map,e=new Array(u+1),i=u;i>=c;i--)w=o[i],C=A.get(w),e[i]=void 0===C?-1:C,A.set(w,i);for(C=c;C<=l;C++)w=V[C],i=A.get(w),void 0!==i&&-1!==i?(E[i]=t[C],s[i]=I[C],Q&&(a[i]=Q[C]),i=e[i],A.set(w,i)):I[C]();for(i=c;iA.each),A.children,e||void 0))}function fe(A){const e=A.keyed,g=zA((()=>A.when),void 0,void 0),V=e?g:zA(g,void 0,{equals:(A,e)=>!A==!e});return zA((()=>{const t=V();if(t){const I=A.children;return"function"==typeof I&&I.length>0?jA((()=>I(e?t:()=>{if(!jA(V))throw he("Show");return g()}))):I}return A.fallback}),void 0,void 0)}function De(A){const e=Ve((()=>A.children)),g=zA((()=>{const A=e(),g=Array.isArray(A)?A:[A];let V=()=>{};for(let A=0;AI()?void 0:t.when),void 0,void 0),Q=t.keyed?B:zA(B,void 0,{equals:(A,e)=>!A==!e});V=()=>I()||(Q()?[e,B,t]:void 0)}return V}));return zA((()=>{const e=g()();if(!e)return A.fallback;const[V,t,I]=e,B=I.children;return"function"==typeof B&&B.length>0?jA((()=>B(I.keyed?t():()=>{if(jA(g)()?.[0]!==V)throw he("Match");return t()}))):B}),void 0,void 0)}function ye(A){return A}const qe="_$DX_DELEGATE";function ke(A,e,g,V){let t;const I=()=>{const e=document.createElement("template");return e.innerHTML=A,e.content.firstChild},B=e?()=>jA((()=>document.importNode(t||(t=I()),!0))):()=>(t||(t=I())).cloneNode(!0);return B.cloneNode=B,B}function pe(A,e=window.document){const g=e[qe]||(e[qe]=new Set);for(let V=0,t=A.length;VA(e,g)))}function Re(A,e,g,V){if(void 0===g||V||(V=[]),"function"!=typeof e)return Ge(A,e,V,g);xA((V=>Ge(A,e(),V,g)),V)}function Ne(A){let e=A.target;const g=`$$${A.type}`,V=A.target,t=A.currentTarget,I=e=>Object.defineProperty(A,"target",{configurable:!0,value:e}),B=()=>{const V=e[g];if(V&&!e.disabled){const t=e[`${g}Data`];if(void 0!==t?V.call(e,t,A):V.call(e,A),A.cancelBubble)return}return e.host&&"string"!=typeof e.host&&!e.host._$host&&e.contains(A.target)&&I(e.host),!0},Q=()=>{for(;B()&&(e=e._$host||e.parentNode||e.host););};if(Object.defineProperty(A,"currentTarget",{configurable:!0,get:()=>e||document}),A.composedPath){const g=A.composedPath();I(g[0]);for(let A=0;A{let t=e();for(;"function"==typeof t;)t=t();g=Ge(A,t,g,V)})),()=>g;if(Array.isArray(e)){const I=[],Q=g&&Array.isArray(g);if(Ue(I,e,g,t))return xA((()=>g=Ge(A,I,g,V,!0))),()=>g;if(0===I.length){if(g=ve(A,g,V),B)return g}else Q?0===g.length?Je(A,I,V):function(A,e,g){let V=g.length,t=e.length,I=V,B=0,Q=0,C=e[t-1].nextSibling,i=null;for(;BV-Q){const t=e[B];for(;Q=0;I--){const B=e[I];if(t!==B){const e=B.parentNode===A;V||I?e&&B.remove():e?A.replaceChild(t,B):A.insertBefore(t,g)}else V=!0}}else A.insertBefore(t,g);return[t]}const be=Symbol("store-raw"),Se=Symbol("store-node"),Ye=Symbol("store-has"),Ke=Symbol("store-self");function Te(A){let e=A[mA];if(!e&&(Object.defineProperty(A,mA,{value:e=new Proxy(A,ze)}),!Array.isArray(A))){const g=Object.keys(A),V=Object.getOwnPropertyDescriptors(A);for(let t=0,I=g.length;te===be||e===mA||e===RA||e===Se||e===Ye||"__proto__"===e||(PA()&&xe(Ze(A,Ye),e)(),e in A),set:()=>!0,deleteProperty:()=>!0,ownKeys:function(A){return We(A),Reflect.ownKeys(A)},getOwnPropertyDescriptor:function(A,e){const g=Reflect.getOwnPropertyDescriptor(A,e);return g&&!g.get&&g.configurable&&e!==mA&&e!==Se?(delete g.value,delete g.writable,g.get=()=>A[mA][e],g):g}};function Xe(A,e,g,V=!1){if(!V&&A[e]===g)return;const t=A[e],I=A.length;void 0===g?(delete A[e],A[Ye]&&A[Ye][e]&&void 0!==t&&A[Ye][e].$()):(A[e]=g,A[Ye]&&A[Ye][e]&&void 0===t&&A[Ye][e].$());let B,Q=Ze(A,Se);if((B=xe(Q,e,t))&&B.$((()=>g)),Array.isArray(A)&&A.length!==I){for(let e=A.length;e1){V=e.shift();const I=typeof V,B=Array.isArray(A);if(Array.isArray(V)){for(let t=0;t1)return void $e(A[V],e,[V].concat(g));t=A[V],g=[V].concat(g)}let I=e[0];"function"==typeof I&&(I=I(t,g),I===t)||void 0===V&&null==I||(I=He(I),void 0===V||Oe(t)&&Oe(I)&&!Array.isArray(I)?je(t,I):Xe(A,V,I))}function _e(...[A,e]){const g=He(A||{}),V=Array.isArray(g);return[Te(g),function(...A){XA((()=>{V&&1===A.length?function(A,e){if("function"==typeof e&&(e=e(A)),e=He(e),Array.isArray(e)){if(A===e)return;let g=0,V=e.length;for(;g{},Ag=(A,e)=>e();function eg(A,e){const g=jA(A),V=g?[g]:[],{onEnter:t=Ag,onExit:I=Ag}=e,[B,Q]=ZA(e.appear?[]:V),[C]=[ee,Ae];let i,o=!1;function r(A,e){if(!A)return e&&e();o=!0,I(A,(()=>{XA((()=>{o=!1,Q((e=>e.filter((e=>e!==A)))),e&&e()}))}))}function n(A){const e=i;if(!e)return A&&A();i=void 0,Q((A=>[e,...A])),t(e,A??Pe)}const E="out-in"===e.mode?A=>o||r(A,n):"in-out"===e.mode?A=>n((()=>r(A))):A=>{r(A),n()};var s,a;return s=e=>{const g=A();return jA(C)?(C(),e):(g!==e&&(i=g,XA((()=>jA((()=>E(e)))))),g)},a=e.appear?void 0:g,Be(Qe(s,a,!0,UA)),B}const gg=A=>A instanceof Element;function Vg(A,e){if(e(A))return A;if("function"==typeof A&&!A.length)return Vg(A(),e);if(Array.isArray(A))for(const g of A){const A=Vg(g,e);if(A)return A}return null}function tg(A,e=gg,g=gg){const V=zA(A);return zA((()=>Vg(V(),e)))}function Ig(A){requestAnimationFrame((()=>requestAnimationFrame(A)))}var Bg={inout:"in-out",outin:"out-in"},Qg=A=>{const e=function(A){return zA((()=>{const e=A.name||"s";return{enterActive:(A.enterActiveClass||e+"-enter-active").split(" "),enter:(A.enterClass||e+"-enter").split(" "),enterTo:(A.enterToClass||e+"-enter-to").split(" "),exitActive:(A.exitActiveClass||e+"-exit-active").split(" "),exit:(A.exitClass||e+"-exit").split(" "),exitTo:(A.exitToClass||e+"-exit-to").split(" "),move:(A.moveClass||e+"-move").split(" ")}}))}(A);return eg(tg((()=>A.children)),{mode:Bg[A.mode],appear:A.appear,onEnter(g,V){!function(A,e,g,V){const{onBeforeEnter:t,onEnter:I,onAfterEnter:B}=e;function Q(e){e&&e.target!==g||(V?.(),g.removeEventListener("transitionend",Q),g.removeEventListener("animationend",Q),g.classList.remove(...A.enterActive),g.classList.remove(...A.enterTo),B?.(g))}t?.(g),g.classList.add(...A.enter),g.classList.add(...A.enterActive),queueMicrotask((()=>{if(!g.parentNode)return V?.();I?.(g,(()=>Q()))})),Ig((()=>{g.classList.remove(...A.enter),g.classList.add(...A.enterTo),(!I||I.length<2)&&(g.addEventListener("transitionend",Q),g.addEventListener("animationend",Q))}))}(e(),A,g,V)},onExit(g,V){!function(A,e,g,V){const{onBeforeExit:t,onExit:I,onAfterExit:B}=e;if(!g.parentNode)return V?.();function Q(e){e&&e.target!==g||(V?.(),g.removeEventListener("transitionend",Q),g.removeEventListener("animationend",Q),g.classList.remove(...A.exitActive),g.classList.remove(...A.exitTo),B?.(g))}t?.(g),g.classList.add(...A.exit),g.classList.add(...A.exitActive),I?.(g,(()=>Q())),Ig((()=>{g.classList.remove(...A.exit),g.classList.add(...A.exitTo),(!I||I.length<2)&&(g.addEventListener("transitionend",Q),g.addEventListener("animationend",Q))}))}(e(),A,g,V)}})};const Cg=ke('
    ',12),ig="http://www.w3.org/2000/svg",og=24;var rg=A=>{const e=A.core,g=[],V=[],I=[],B=new Set,Q=new Map,C=new Map,[i,o]=ZA({cols:A.cols,rows:A.rows},{equals:(A,e)=>A.cols===e.cols&&A.rows===e.rows}),[r,n]=ZA(ng(wg)),E=()=>A.lineHeight??1.3333333333,[s,a]=ZA(!0),c=zA((()=>s()||M)),l=zA((()=>({width:`${i().cols}ch`,height:E()*i().rows+"em","font-size":100*(A.scale||1)+"%","--term-line-height":`${E()}em`,"--term-cols":i().cols,"--term-rows":i().rows})));let u,w,h,d,f,D,y,q,k,p,L={col:0,row:0,visible:!1},F={size:void 0,theme:void 0,rows:new Set},M=!1;function m(g){let{size:V,theme:t,changedRows:I}=g,B=!1;if(void 0!==I)for(const A of I)F.rows.add(A),M=!0,B=!0;if(void 0!==t&&A.preferEmbeddedTheme){F.theme=t;for(let A=0;A=V.rows&&F.rows.delete(A)}B&&L.visible&&F.rows.add(L.row),N()}function R(){a((A=>(A||(M=!1),!A)))}function N(){void 0===q&&(q=requestAnimationFrame(G))}function G(){q=void 0;const{size:e,theme:g,rows:V}=F;XA((function(){void 0!==e&&(!function(A){let{cols:e,rows:g}=A;w.width=8*e,w.height=g*og,h.imageSmoothingEnabled=!1}(e),b(e.rows),S(e.rows),o(e)),void 0!==g&&(n(ng(null===g?p:g)),Q.clear());const A=r(),t=s()||M;for(const e of V)U(e,A,t)})),F.size=void 0,F.theme=void 0,F.rows.clear(),A.stats.renders+=1}function U(A,g,V){const t=e.getLine(A,V);!function(A){h.clearRect(0,A*og,8*i().cols,og)}(A),function(A,g,V){const t=e.getDataView(g,8),I=A*og;let B=0;for(;BA;){const A=d.lastElementChild;d.removeChild(A),g.push(A)}}function S(A){let e=y.children.length;if(eA;){const A=y.lastElementChild;y.removeChild(A),V.push(A)}}function Y(){let A=g.pop();return void 0===A&&(A=document.createElement("span"),A.className="ap-line"),A}function K(){let A=V.pop();return void 0===A&&(A=document.createElementNS(ig,"g"),A.setAttribute("class","ap-symbol-line")),A}function T(A,e,g,V){if(!function(A){const e=function(A){const e=`stroke="currentColor" stroke-width="${ag}" stroke-linejoin="miter" stroke-linecap="square"`,g=`stroke="currentColor" stroke-width="${ag}" stroke-linejoin="miter" stroke-linecap="butt"`,V=A=>``,t=1/3,I=2/3;switch(A){case 9698:return''+V("M1,1 L1,0 L0,1 Z");case 9699:return''+V("M0,1 L0,0 L1,1 Z");case 9700:return''+V("M0,0 L1,0 L0,1 Z");case 9701:return''+V("M1,0 L1,1 L0,0 Z");case 9871:{const A=.17,e=.15/2,g=.2/2,V=A=>.5+A*cg,t=.5-e,I=.5+e,B=1.02,Q=V(-g-A),C=V(-g),i=V(g),o=V(g+A),r=(A,e,g,V)=>`M${A},${g} L${e},${g} L${e},${V} L${A},${V} Z`;return``}case 129852:return``+V(`M0,${I} L0,1 L0.5,1 Z`);case 129853:return``+V(`M0,${I} L0,1 L1,1 Z`);case 129854:return``+V(`M0,${t} L0.5,1 L0,1 Z`);case 129855:return``+V(`M0,${t} L1,1 L0,1 Z`);case 129856:return''+V("M0,0 L0.5,1 L0,1 Z");case 129857:return``+V(`M0,${t} L0,1 L1,1 L1,0 L0.5,0 Z`);case 129858:return``+V(`M0,${t} L0,1 L1,1 L1,0 Z`);case 129859:return``+V(`M0,${I} L0,1 L1,1 L1,0 L0.5,0 Z`);case 129860:return``+V(`M0,${I} L0,1 L1,1 L1,0 Z`);case 129861:return''+V("M0.5,0 L1,0 L1,1 L0,1 Z");case 129862:return``+V(`M0,${I} L0,1 L1,1 L1,${t} Z`);case 129863:return``+V(`M0.5,1 L1,1 L1,${I} Z`);case 129864:return``+V(`M0,1 L1,1 L1,${I} Z`);case 129865:return``+V(`M0.5,1 L1,1 L1,${t} Z`);case 129866:return``+V(`M0,1 L1,1 L1,${t} Z`);case 129867:return''+V("M0.5,1 L1,0 L1,1 Z");case 129868:return``+V(`M0,0 L0.5,0 L1,${t} L1,1 L0,1 Z`);case 129869:return``+V(`M0,0 L0,1 L1,1 L1,${t} Z`);case 129870:return``+V(`M0,0 L0.5,0 L1,${I} L1,1 L0,1 Z`);case 129871:return``+V(`M0,0 L1,${I} L1,1 L0,1 Z`);case 129872:return''+V("M0,0 L0.5,0 L1,1 L0,1 Z");case 129873:return``+V(`M0,${t} L1,${I} L1,1 L0,1 Z`);case 129874:return``+V(`M0,${I} L0,0 L1,0 L1,1 L0.5,1 Z`);case 129875:return``+V(`M0,${I} L0,0 L1,0 L1,1 Z`);case 129876:return``+V(`M0,${t} L0,0 L1,0 L1,1 L0.5,1 Z`);case 129877:return``+V(`M0,${t} L0,0 L1,0 L1,1 Z`);case 129878:return''+V("M0,0 L1,0 L1,1 L0.5,1 Z");case 129879:return``+V(`M0,${t} L0.5,0 L0,0 Z`);case 129880:return``+V(`M0,0 L1,0 L0,${t} Z`);case 129881:return``+V(`M0,0 L0.5,0 L0,${I} Z`);case 129882:return``+V(`M0,0 L1,0 L0,${I} Z`);case 129883:return''+V("M0,0 L0.5,0 L0,1 Z");case 129884:return``+V(`M0,0 L1,0 L1,${t} L0,${I} Z`);case 129885:return``+V(`M0,0 L1,0 L1,${I} L0.5,1 L0,1 Z`);case 129886:return``+V(`M0,0 L1,0 L1,${I} L0,1 Z`);case 129887:return``+V(`M0,0 L1,0 L1,${t} L0.5,1 L0,1 Z`);case 129888:return``+V(`M0,0 L1,0 L1,${t} L0,1 Z`);case 129889:return''+V("M0,0 L1,0 L0.5,1 L0,1 Z");case 129890:return``+V(`M0.5,0 L1,0 L1,${t} Z`);case 129891:return``+V(`M0,0 L1,0 L1,${t} Z`);case 129892:return``+V(`M0.5,0 L1,0 L1,${I} Z`);case 129893:return``+V(`M0,0 L1,0 L1,${I} Z`);case 129894:return''+V("M0.5,0 L1,0 L1,1 Z");case 129895:return``+V(`M0,${t} L0,0 L1,0 L1,${I} Z`);case 129896:return``;case 129897:return``;case 129898:return``;case 129899:return``;case 129900:return''+V("M0,0 L0,1 L0.5,0.5 Z");case 57520:return'';case 57521:return'';case 57522:return'';case 57523:return'';default:return null}}(A);if(!e)return!1;if(B.has(A))return!0;const g=`sym-${A}`,V=document.createElementNS(ig,"symbol");return V.setAttribute("id",g),V.setAttribute("viewBox","0 0 1 1"),V.setAttribute("preserveAspectRatio","none"),V.setAttribute("overflow","visible"),V.innerHTML=e,D.appendChild(V),B.add(A),!0}(A))return null;const t=lg.has(A),Q=t?e-ug:e,C=t?1+2*ug:1,i=function(){let A=I.pop();void 0===A&&(A=document.createElementNS(ig,"use"));return A}();return i.setAttribute("href",`#sym-${A}`),i.setAttribute("x",Q),i.setAttribute("y",0),i.setAttribute("width",C),i.setAttribute("height","1"),g?i.style.setProperty("color",g):i.style.removeProperty("color"),V?i.classList.add("ap-blink"):i.classList.remove("ap-blink"),i}return $A((()=>{!function(){if(h=w.getContext("2d"),!h)throw new Error("2D ctx not available");const{cols:A,rows:e}=i();w.width=8*A,w.height=e*og,w.style.imageRendering="pixelated",h.imageSmoothingEnabled=!1}(),p=function(A){const e=getComputedStyle(A),g=t(e.getPropertyValue("--term-color-foreground"),wg.foreground),V=t(e.getPropertyValue("--term-color-background"),wg.background),I=[];for(let A=0;A<16;A++){const g=A>=8?I[A-8]:wg.palette[A];I[A]=t(e.getPropertyValue(`--term-color-${A}`),g)}return{foreground:g,background:V,palette:I}}(u),F.theme=p,b(i().rows),S(i().rows),e.addEventListener("vtUpdate",m)})),_A((()=>{e.removeEventListener("vtUpdate",m),clearInterval(k),cancelAnimationFrame(q)})),WA((()=>{A.blinking&&void 0===k?k=setInterval(R,600):(clearInterval(k),k=void 0,a(!0))})),WA((()=>{c(),L.visible&&(F.rows.add(L.row),N())})),(()=>{const A=Cg.cloneNode(!0),e=A.firstChild,g=e.nextSibling,V=g.firstChild,t=V.nextSibling,I=g.nextSibling;"function"==typeof u?me(u,A):u=A;"function"==typeof w?me(w,e):w=e;"function"==typeof f?me(f,g):f=g;"function"==typeof D?me(D,V):D=V;"function"==typeof y?me(y,t):y=t;return"function"==typeof d?me(d,I):d=I,xA((e=>{const V=l(),t=`0 0 ${i().cols} ${i().rows}`,B=!!s(),Q=!!s();return e._v$=Me(A,V,e._v$),t!==e._v$2&&Le(g,"viewBox",e._v$2=t),B!==e._v$3&&g.classList.toggle("ap-blink",e._v$3=B),Q!==e._v$4&&I.classList.toggle("ap-blink",e._v$4=Q),e}),{_v$:void 0,_v$2:void 0,_v$3:void 0,_v$4:void 0}),A})()};function ng(A){return{fg:A.foreground,bg:A.background,palette:Eg(A.palette,A.background,A.foreground)}}function Eg(A,e,g){const V=B(e),t=B(g),C=B(A[1]),i=B(A[2]),o=B(A[3]),r=B(A[4]),n=B(A[5]),E=B(A[6]),s=[...A];for(let A=0;A<6;A+=1){const e=A/5,g=I(e,V,C),B=I(e,i,o),a=I(e,r,n),c=I(e,E,t);for(let A=0;A<6;A+=1){const e=A/5,V=I(e,g,B),t=I(e,a,c);for(let A=0;A<6;A+=1){const e=I(A/5,V,t);s.push(Q(e))}}}for(let A=0;A<24;A+=1){const e=(A+1)/25;s.push(Q(I(e,V,t)))}return s}function sg(A,e,g,V){const t=12;switch(e){case 9600:A.fillRect(g,V,8,t);break;case 9601:A.fillRect(g,V+21,8,3);break;case 9602:A.fillRect(g,V+18,8,6);break;case 9603:A.fillRect(g,V+15,8,9);break;case 9604:A.fillRect(g,V+t,8,t);break;case 9605:A.fillRect(g,V+9,8,15);break;case 9606:A.fillRect(g,V+6,8,18);break;case 9607:A.fillRect(g,V+3,8,21);break;case 9608:A.fillRect(g,V,8,og);break;case 9632:A.fillRect(g,V+6,8,12);break;case 9609:A.fillRect(g,V,7,og);break;case 9610:A.fillRect(g,V,6,og);break;case 9611:A.fillRect(g,V,5,og);break;case 9612:A.fillRect(g,V,4,og);break;case 9613:A.fillRect(g,V,3,og);break;case 9614:A.fillRect(g,V,2,og);break;case 9615:A.fillRect(g,V,1,og);break;case 9616:A.fillRect(g+4,V,4,og);break;case 9617:A.save(),A.globalAlpha=.25,A.fillRect(g,V,8,og),A.restore();break;case 9618:A.save(),A.globalAlpha=.5,A.fillRect(g,V,8,og),A.restore();break;case 9619:A.save(),A.globalAlpha=.75,A.fillRect(g,V,8,og),A.restore();break;case 9620:A.fillRect(g,V,8,3);break;case 9621:A.fillRect(g+7,V,1,og);break;case 9622:A.fillRect(g,V+t,4,t);break;case 9623:A.fillRect(g+4,V+t,4,t);break;case 9624:A.fillRect(g,V,4,t);break;case 9625:A.fillRect(g,V,4,og),A.fillRect(g+4,V+t,4,t);break;case 9626:A.fillRect(g,V,4,t),A.fillRect(g+4,V+t,4,t);break;case 9627:A.fillRect(g,V,8,t),A.fillRect(g,V+t,4,t);break;case 9628:A.fillRect(g,V,8,t),A.fillRect(g+4,V+t,4,t);break;case 9629:A.fillRect(g+4,V,4,t);break;case 9630:A.fillRect(g+4,V,4,t),A.fillRect(g,V+t,4,t);break;case 9631:A.fillRect(g+4,V,4,og),A.fillRect(g,V+t,4,t);break;case 129792:A.fillRect(g,V,4,8);break;case 129793:A.fillRect(g+4,V,4,8);break;case 129794:A.fillRect(g,V,8,8);break;case 129795:A.fillRect(g,V+8,4,8);break;case 129796:A.fillRect(g,V,4,8),A.fillRect(g,V+8,4,8);break;case 129797:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,4,8);break;case 129798:A.fillRect(g,V,8,8),A.fillRect(g,V+8,4,8);break;case 129799:A.fillRect(g+4,V+8,4,8);break;case 129800:A.fillRect(g,V,4,8),A.fillRect(g+4,V+8,4,8);break;case 129801:A.fillRect(g+4,V,4,8),A.fillRect(g+4,V+8,4,8);break;case 129802:A.fillRect(g,V,8,8),A.fillRect(g+4,V+8,4,8);break;case 129803:A.fillRect(g,V+8,8,8);break;case 129804:A.fillRect(g,V,4,8),A.fillRect(g,V+8,8,8);break;case 129805:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,8,8);break;case 129806:A.fillRect(g,V,8,8),A.fillRect(g,V+8,8,8);break;case 129807:A.fillRect(g,V+16,4,8);break;case 129808:A.fillRect(g,V,4,8),A.fillRect(g,V+16,4,8);break;case 129809:A.fillRect(g+4,V,4,8),A.fillRect(g,V+16,4,8);break;case 129810:A.fillRect(g,V,8,8),A.fillRect(g,V+16,4,8);break;case 129811:A.fillRect(g,V+8,4,16);break;case 129812:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,4,16);break;case 129813:A.fillRect(g,V,8,8),A.fillRect(g,V+8,4,16);break;case 129814:A.fillRect(g+4,V+8,4,8),A.fillRect(g,V+16,4,8);break;case 129815:A.fillRect(g,V,4,8),A.fillRect(g+4,V+8,4,8),A.fillRect(g,V+16,4,8);break;case 129816:A.fillRect(g+4,V,4,16),A.fillRect(g,V+16,4,8);break;case 129817:A.fillRect(g,V,8,8),A.fillRect(g+4,V+8,4,8),A.fillRect(g,V+16,4,8);break;case 129818:A.fillRect(g,V+8,8,8),A.fillRect(g,V+16,4,8);break;case 129819:A.fillRect(g,V,4,24),A.fillRect(g+4,V+8,4,8);break;case 129820:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,8,8),A.fillRect(g,V+16,4,8);break;case 129821:A.fillRect(g,V,8,16),A.fillRect(g,V+16,4,8);break;case 129822:A.fillRect(g+4,V+16,4,8);break;case 129823:A.fillRect(g,V,4,8),A.fillRect(g+4,V+16,4,8);break;case 129824:A.fillRect(g+4,V,4,8),A.fillRect(g+4,V+16,4,8);break;case 129825:A.fillRect(g,V,8,8),A.fillRect(g+4,V+16,4,8);break;case 129826:A.fillRect(g,V+8,4,8),A.fillRect(g+4,V+16,4,8);break;case 129827:A.fillRect(g,V,4,16),A.fillRect(g+4,V+16,4,8);break;case 129828:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,4,8),A.fillRect(g+4,V+16,4,8);break;case 129829:A.fillRect(g,V,8,8),A.fillRect(g,V+8,4,8),A.fillRect(g+4,V+16,4,8);break;case 129830:A.fillRect(g+4,V+8,4,16);break;case 129831:A.fillRect(g,V,4,8),A.fillRect(g+4,V+8,4,16);break;case 129832:A.fillRect(g,V,8,8),A.fillRect(g+4,V+8,4,16);break;case 129833:A.fillRect(g,V+8,8,8),A.fillRect(g+4,V+16,4,8);break;case 129834:A.fillRect(g,V,4,16),A.fillRect(g+4,V+8,4,16);break;case 129835:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,8,8),A.fillRect(g+4,V+16,4,8);break;case 129836:A.fillRect(g,V,8,16),A.fillRect(g+4,V+16,4,8);break;case 129837:A.fillRect(g,V+16,8,8);break;case 129838:A.fillRect(g,V,4,8),A.fillRect(g,V+16,8,8);break;case 129839:A.fillRect(g+4,V,4,8),A.fillRect(g,V+16,8,8);break;case 129840:A.fillRect(g,V,8,8),A.fillRect(g,V+16,8,8);break;case 129841:A.fillRect(g,V+8,4,8),A.fillRect(g,V+16,8,8);break;case 129842:A.fillRect(g,V,4,16),A.fillRect(g,V+16,8,8);break;case 129843:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,4,8),A.fillRect(g,V+16,8,8);break;case 129844:A.fillRect(g,V,8,8),A.fillRect(g,V+8,4,8),A.fillRect(g,V+16,8,8);break;case 129845:A.fillRect(g+4,V+8,4,8),A.fillRect(g,V+16,8,8);break;case 129846:A.fillRect(g,V,4,8),A.fillRect(g+4,V+8,4,8),A.fillRect(g,V+16,8,8);break;case 129847:A.fillRect(g+4,V,4,16),A.fillRect(g,V+16,8,8);break;case 129848:A.fillRect(g,V,8,8),A.fillRect(g+4,V+8,4,8),A.fillRect(g,V+16,8,8);break;case 129849:A.fillRect(g,V+8,8,16);break;case 129850:A.fillRect(g,V,4,24),A.fillRect(g+4,V+8,4,8),A.fillRect(g+4,V+16,4,8);break;case 129851:A.fillRect(g+4,V,4,8),A.fillRect(g,V+8,8,16)}}const ag=.05,cg=9.0375/20;const lg=new Set([57520,57521,57522,57523]),ug=.02,wg={foreground:"#000000",background:"#000000",palette:["#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000","#000000"]},hg=ke('',6);var dg=A=>hg.cloneNode(!0);const fg=ke('',4);var Dg=A=>fg.cloneNode(!0);const yg=ke('',6);var qg=A=>yg.cloneNode(!0);const kg=ke('',4);var pg=A=>kg.cloneNode(!0);const Lg=ke('',6);var Fg=A=>Lg.cloneNode(!0);const Mg=ke('',6);var mg=A=>Mg.cloneNode(!0);const Rg=ke('',4);var Ng=A=>Rg.cloneNode(!0);const Gg=ke('',2),Ug=ke('',6),Jg=ke('Unmute (m)',2),vg=ke('Mute (m)',2),bg=ke('',2),Sg=ke('
    Keyboard shortcuts (?)Fullscreen (f)
    ',18),Yg=ke('',6);function Kg(A){let e=Math.floor(A);const g=Math.floor(e/86400);e%=86400;const V=Math.floor(e/3600);e%=3600;const t=Math.floor(e/60);return e%=60,g>0?`${Tg(g)}:${Tg(V)}:${Tg(t)}:${Tg(e)}`:V>0?`${Tg(V)}:${Tg(t)}:${Tg(e)}`:`${Tg(t)}:${Tg(e)}`}function Tg(A){return A<10?`0${A}`:A.toString()}var Og=A=>{const e=A=>e=>{e.preventDefault(),A(e)},g=()=>"number"==typeof A.currentTime?Kg(A.currentTime):"--:--",V=()=>"number"==typeof A.remainingTime?"-"+Kg(A.remainingTime):g(),t=zA((()=>"number"==typeof A.duration?A.markers.filter((e=>e[0]{const e=A.currentTarget.offsetWidth,g=A.currentTarget.getBoundingClientRect(),V=A.clientX-g.left;return 100*Math.max(0,V/e)+"%"},[B,Q]=ZA(!1),C=function(A,e){let g=!0;return function(){if(g){g=!1;for(var V=arguments.length,t=new Array(V),I=0;Ig=!0),e)}}}(A.onSeekClick,50),i=e=>{e._marker||e.altKey||e.shiftKey||e.metaKey||e.ctrlKey||0!==e.button||(Q(!0),A.onSeekClick(I(e)))},o=A=>{A.altKey||A.shiftKey||A.metaKey||A.ctrlKey||B()&&C(I(A))},r=()=>{Q(!1)};return document.addEventListener("mouseup",r),_A((()=>{document.removeEventListener("mouseup",r)})),(()=>{const I=Sg.cloneNode(!0),B=I.firstChild,Q=B.firstChild,C=Q.nextSibling,r=B.nextSibling,n=r.nextSibling,E=n.firstChild,s=n.nextSibling,a=s.firstChild,c=A.ref;return"function"==typeof c?me(c,I):A.ref=I,Re(I,we(fe,{get when(){return A.isPausable},get children(){const g=Gg.cloneNode(!0);return Fe(g,"click",e(A.onPlayClick)),Re(g,we(De,{get children(){return[we(ye,{get when(){return A.isPlaying},get children(){return we(qg,{})}}),we(ye,{when:!0,get children(){return we(pg,{})}})]}})),g}}),B),Re(Q,g),Re(C,V),Re(r,we(fe,{get when(){return"number"==typeof A.progress||A.isSeekable},get children(){const g=Ug.cloneNode(!0),V=g.firstChild.nextSibling;return g.$$mousemove=o,g.$$mousedown=i,Re(g,we(de,{get each(){return t()},children:(g,V)=>(()=>{const t=Yg.cloneNode(!0),I=t.firstChild,B=I.nextSibling;var Q;return t.$$mousedown=A=>{A._marker=!0},Fe(t,"click",(Q=V(),e((()=>{A.onSeekClick({marker:Q})})))),Re(B,(()=>(A=>""===A[1]?Kg(A[0]):`${Kg(A[0])} - ${A[1]}`)(g))),xA((e=>{const V=(e=>e[0]/A.duration*100+"%")(g),B=!!(e=>"number"==typeof A.currentTime&&e[0]<=A.currentTime)(g);return V!==e._v$&&t.style.setProperty("left",e._v$=V),B!==e._v$2&&I.classList.toggle("ap-marker-past",e._v$2=B),e}),{_v$:void 0,_v$2:void 0}),t})()}),null),xA((e=>Me(V,{transform:`scaleX(${A.progress||0}`},e))),g}})),Re(I,we(fe,{get when(){return void 0!==A.isMuted},get children(){const g=bg.cloneNode(!0);return Fe(g,"click",e(A.onMuteClick)),Re(g,we(De,{get children(){return[we(ye,{get when(){return!0===A.isMuted},get children(){return[we(Ng,{}),Jg.cloneNode(!0)]}}),we(ye,{get when(){return!1===A.isMuted},get children(){return[we(mg,{}),vg.cloneNode(!0)]}})]}})),g}}),n),Fe(n,"click",e(A.onHelpClick)),Re(n,we(Dg,{}),E),Fe(s,"click",e(A.onFullscreenClick)),Re(s,we(Fg,{}),a),Re(s,we(dg,{}),a),xA((()=>I.classList.toggle("ap-seekable",!!A.isSeekable))),I})()};pe(["click","mousedown","mousemove"]);const Hg=ke('
    💥
    ',4);var Zg=A=>Hg.cloneNode(!0);const xg=ke('
    ',4);var Wg=A=>xg.cloneNode(!0);const zg=ke('
    ',4);var Xg=A=>(()=>{const e=zg.cloneNode(!0);return Re(e.firstChild,(()=>A.message)),xA((()=>e.classList.toggle("ap-was-playing",!!A.wasPlaying))),e})();const jg=ke('
    ',22);var $g=A=>(()=>{const e=jg.cloneNode(!0);var g;return Fe(e,"click",(g=A.onClick,A=>{A.preventDefault(),g(A)})),e})();pe(["click"]);const _g=ke("
  • space - pause / resume
  • ",4),Pg=ke("
  • / - rewind / fast-forward by 5 seconds
  • ",6),AV=ke("
  • Shift + / - rewind / fast-forward by 10%
  • ",8),eV=ke("
  • [ / ] - jump to the previous / next marker
  • ",6),gV=ke("
  • 0, 1, 2 ... 9 - jump to 0%, 10%, 20% ... 90%
  • ",10),VV=ke("
  • , / . - step back / forward, a frame at a time (when paused)
  • ",6),tV=ke("
  • m - mute / unmute audio
  • ",4),IV=ke('

    Keyboard shortcuts

    • f - toggle fullscreen mode
    • ? - show this help popup
    ',18);var BV=A=>(()=>{const e=IV.cloneNode(!0),g=e.firstChild,V=g.firstChild.firstChild.nextSibling,t=V.firstChild,I=t.nextSibling;var B;return Fe(e,"click",(B=A.onClose,A=>{A.preventDefault(),B(A)})),g.$$click=A=>{A.stopPropagation()},Re(V,we(fe,{get when(){return A.isPausable},get children(){return _g.cloneNode(!0)}}),t),Re(V,we(fe,{get when(){return A.isSeekable},get children(){return[Pg.cloneNode(!0),AV.cloneNode(!0),eV.cloneNode(!0),gV.cloneNode(!0),VV.cloneNode(!0)]}}),t),Re(V,we(fe,{get when(){return A.hasAudio},get children(){return tV.cloneNode(!0)}}),I),e})();pe(["click"]);const QV=ke('
    ',4);var CV=A=>{const e=A.logger,g=A.core,V=A.autoPlay,t=A.charW,I=A.charH,B=A.bordersW,Q=A.bordersH,C=A.theme??"auto/asciinema",i="auto/"===C.slice(0,5),o=i?C.slice(5):C,[r,n]=_e({containerW:0,containerH:0,isPausable:!0,isSeekable:!0,isFullscreen:!1,currentTime:null,remainingTime:null,progress:null}),[E,s]=ZA(!1),[a,c]=ZA(void 0),[l,u]=ZA(!1),[w,h]=ZA(V?null:"start"),[d,f]=ZA(null),[D,y]=ZA(!1),[q,k]=ZA({cols:A.cols,rows:A.rows},{equals:(A,e)=>A.cols===e.cols&&A.rows===e.rows}),[p,L]=ZA(null),[F,M]=_e([]),[m,R]=ZA(!1),[N,G]=ZA(!1),[U,J]=ZA(null),v=zA((()=>q().cols||80)),b=zA((()=>q().rows||24)),S=()=>!1===A.controls?0:32;let Y,K,T,O,H,Z,x;function W(){y(!1),cA(),lA()}const z=new Promise((A=>{x=A})),X=A=>{let{isPausable:e,isSeekable:g}=A;n({isPausable:e,isSeekable:g}),x()},j=A=>{XA((()=>{void 0!==A.duration&&L(A.duration),void 0!==A.markers&&M(A.markers),void 0!==A.hasAudio&&c(!A.hasAudio&&void 0),void 0!==A.size&&k(A.size),void 0!==A.theme&&J(A.theme)}))},$=()=>{h(null)},_=()=>{XA((()=>{s(!0),u(!0),h(null),y(!0),aA()}))},P=()=>{XA((()=>{s(!1),W()}))},AA=()=>{XA((()=>{s(!1),W(),h("loader")}))},eA=A=>{let{message:e}=A;XA((()=>{s(!1),W(),void 0!==e&&(f(e),h("info"))}))},gA=A=>{c(A)},VA={renders:0},tA=A=>{let{message:g}=A;XA((()=>{s(!1),W(),void 0!==g&&(f(g),h("info"))})),e.debug("stats",VA)},IA=()=>{h("error")},BA=()=>{lA()};g.addEventListener("ready",X),g.addEventListener("metadata",j),g.addEventListener("play",$),g.addEventListener("playing",_),g.addEventListener("idle",P),g.addEventListener("loading",AA),g.addEventListener("offline",eA),g.addEventListener("muted",gA),g.addEventListener("ended",tA),g.addEventListener("errored",IA),g.addEventListener("seeked",BA);const QA=()=>{Z=new ResizeObserver(function(A,e){let g;return function(){for(var V=arguments.length,t=new Array(V),I=0;IA.apply(this,t)),e)}}((A=>{n({containerW:T.offsetWidth,containerH:T.offsetHeight}),T.dispatchEvent(new CustomEvent("resize",{detail:{el:O}}))}),10)),Z.observe(T)};$A((async()=>{e.info("view: mounted"),e.debug("view: font measurements",{charW:t,charH:I}),QA(),n({containerW:T.offsetWidth,containerH:T.offsetHeight})})),_A((()=>{g.removeEventListener("ready",X),g.removeEventListener("metadata",j),g.removeEventListener("play",$),g.removeEventListener("playing",_),g.removeEventListener("idle",P),g.removeEventListener("loading",AA),g.removeEventListener("offline",eA),g.removeEventListener("muted",gA),g.removeEventListener("ended",tA),g.removeEventListener("errored",IA),g.removeEventListener("seeked",BA),g.stop(),cA(),Z.disconnect()}));const CA=zA((()=>{const e=t*v()+B,g=I*b()+Q;let V=A.fit??"width";if("both"===V||r.isFullscreen){V=r.containerW/(r.containerH-S())>e/g?"height":"width"}if(!1===V||"none"===V)return{};if("width"===V){const A=r.containerW/e;return{scale:A,width:r.containerW,height:g*A+S()}}if("height"===V){const A=(r.containerH-S())/g;return{scale:A,width:e*A,height:r.containerH}}throw new Error(`unsupported fit mode: ${V}`)})),iA=()=>{n("isFullscreen",document.fullscreenElement??document.webkitFullscreenElement)},oA=()=>{r.isFullscreen?(document.exitFullscreen??document.webkitExitFullscreen??(()=>{})).apply(document):(T.requestFullscreen??T.webkitRequestFullscreen??(()=>{})).apply(T)},rA=()=>{N()?G(!1):(g.pause(),G(!0))},nA=A=>{if(!(A.altKey||A.metaKey||A.ctrlKey)){if(" "==A.key)g.togglePlay();else if(","==A.key)g.step(-1).then(lA);else if("."==A.key)g.step().then(lA);else if("f"==A.key)oA();else if("m"==A.key)fA();else if("["==A.key)g.seek({marker:"prev"});else if("]"==A.key)g.seek({marker:"next"});else if(A.key.charCodeAt(0)>=48&&A.key.charCodeAt(0)<=57){const e=(A.key.charCodeAt(0)-48)/10;g.seek(100*e+"%")}else if("?"==A.key)rA();else if("ArrowLeft"==A.key)A.shiftKey?g.seek("<<<"):g.seek("<<");else if("ArrowRight"==A.key)A.shiftKey?g.seek(">>>"):g.seek(">>");else{if("Escape"!=A.key)return;G(!1)}A.stopPropagation(),A.preventDefault()}},EA=()=>{r.isFullscreen&&uA(!0)},sA=()=>{r.isFullscreen||uA(!1)},aA=()=>{K=setInterval(lA,100)},cA=()=>{clearInterval(K)},lA=async()=>{const A=await g.getCurrentTime(),e=await g.getRemainingTime(),V=await g.getProgress();n({currentTime:A,remainingTime:e,progress:V})},uA=A=>{clearTimeout(Y),A&&(Y=setTimeout((()=>uA(!1)),2e3)),R(A)},wA=zA((()=>i?U():null)),hA=()=>{z.then((()=>g.play()))},dA=()=>{z.then((()=>g.togglePlay()))},fA=()=>{z.then((()=>{!0===a()?g.unmute():g.mute()}))},DA=A=>{z.then((()=>g.seek(A)))},yA=(()=>{const e=QV.cloneNode(!0),V=e.firstChild;"function"==typeof T?me(T,e):T=e,e.addEventListener("webkitfullscreenchange",iA),e.addEventListener("fullscreenchange",iA),e.$$mousemove=EA,e.$$keydown=nA;return"function"==typeof O?me(O,V):O=V,V.$$mousemove=()=>uA(!0),V.addEventListener("mouseleave",sA),Re(V,we(rg,{get cols(){return v()},get rows(){return b()},get scale(){return CA()?.scale},get blinking(){return D()},get lineHeight(){return A.terminalLineHeight},preferEmbeddedTheme:i,core:g,get stats(){return VA}}),null),Re(V,we(fe,{get when(){return!1!==A.controls},get children(){return we(Og,{get duration(){return p()},get currentTime(){return r.currentTime},get remainingTime(){return r.remainingTime},get progress(){return r.progress},markers:F,get isPlaying(){return E()||"loader"==w()},get isPausable(){return r.isPausable},get isSeekable(){return r.isSeekable},get isMuted(){return a()},onPlayClick:dA,onFullscreenClick:oA,onHelpClick:rA,onSeekClick:DA,onMuteClick:fA,ref(A){"function"==typeof H?H(A):H=A}})}}),null),Re(V,we(De,{get children(){return[we(ye,{get when(){return"start"==w()},get children(){return we($g,{onClick:hA})}}),we(ye,{get when(){return"loader"==w()},get children(){return we(Wg,{})}}),we(ye,{get when(){return"error"==w()},get children(){return we(Zg,{})}})]}}),null),Re(V,we(Qg,{name:"slide",get children(){return we(fe,{get when(){return"info"==w()},get children(){return we(Xg,{get message(){return d()},get wasPlaying(){return l()}})}})}}),null),Re(V,we(fe,{get when(){return N()},get children(){return we(BV,{onClose:()=>G(!1),get isPausable(){return r.isPausable},get isSeekable(){return r.isSeekable},get hasAudio(){return void 0!==a()}})}}),null),xA((g=>{const t=!!(!0===A.controls||"auto"===A.controls&&m()),I=`ap-player ap-default-term-ff asciinema-player-theme-${o}`,B=(()=>{const e={};!1!==A.fit&&"none"!==A.fit||void 0===A.terminalFontSize||("small"===A.terminalFontSize?e["font-size"]="12px":"medium"===A.terminalFontSize?e["font-size"]="18px":"big"===A.terminalFontSize?e["font-size"]="24px":e["font-size"]=A.terminalFontSize);const g=CA();void 0!==g.width&&(e.width=`${g.width}px`,e.height=`${g.height}px`),void 0!==A.terminalFontFamily&&(e["--term-font-family"]=A.terminalFontFamily);const V=wA();return V&&(e["--term-color-foreground"]=V.foreground,e["--term-color-background"]=V.background),e})();var Q,C;return t!==g._v$&&e.classList.toggle("ap-hud",g._v$=t),I!==g._v$2&&(Q=V,null==(C=g._v$2=I)?Q.removeAttribute("class"):Q.className=C),g._v$3=Me(V,B,g._v$3),g}),{_v$:void 0,_v$2:void 0,_v$3:void 0}),e})();return yA};function iV(A,e){let g=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const V=function(A,e){const g=80,V=24,t=document.createElement("div");t.className="ap-default-term-ff",t.style.height="0px",t.style.overflow="hidden",t.style.fontSize="15px",void 0!==A&&t.style.setProperty("--term-font-family",A);const I=document.createElement("div");I.className="ap-term",I.style.width=`${g}ch`,I.style.height=V*(e??1.3333333333)+"em",I.style.fontSize="100%",t.appendChild(I),document.body.appendChild(t);const B={charW:I.clientWidth/g,charH:I.clientHeight/V,bordersW:I.offsetWidth-I.clientWidth,bordersH:I.offsetHeight-I.clientHeight};return document.body.removeChild(t),B}(g.terminalFontFamily,g.terminalLineHeight),t={core:A,logger:g.logger,cols:g.cols,rows:g.rows,fit:g.fit,controls:g.controls,autoPlay:g.autoPlay,terminalFontSize:g.terminalFontSize,terminalFontFamily:g.terminalFontFamily,terminalLineHeight:g.terminalLineHeight,theme:g.theme,...V};let I;const B=function(A,e,g,V={}){let t;return HA((V=>{t=V,e===document?A():Re(e,A(),e.firstChild?null:void 0,g)}),V.owner),()=>{t(),e.textContent=""}}((()=>(I=we(CV,t),I)),e);return{el:I,dispose:B}}pe(["keydown","mousemove"]);const oV=["audioUrl","autoPlay","autoplay","boldIsBright","cols","idleTimeLimit","loop","markers","pauseOnMarkers","poster","preload","rows","speed","startAt"],rV=["autoPlay","autoplay","cols","controls","fit","rows","terminalFontFamily","terminalFontSize","terminalLineHeight","theme"];return A.create=function(A,e){let g=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const V=g.logger??new a,t=new LA(A,function(A){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const g=Object.fromEntries(Object.entries(A).filter((A=>{let[e]=A;return oV.includes(e)})));return g.autoPlay??=g.autoplay,g.speed??=1,{...g,...e}}(g,{logger:V})),{el:I,dispose:B}=iV(t,e,function(A){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const g=Object.fromEntries(Object.entries(A).filter((A=>{let[e]=A;return rV.includes(e)})));return g.autoPlay??=g.autoplay,g.controls??="auto",{...g,...e}}(g,{logger:V})),Q=t.init(),C={el:I,dispose:B,getCurrentTime:()=>Q.then(t.getCurrentTime.bind(t)),getDuration:()=>Q.then(t.getDuration.bind(t)),play:()=>Q.then(t.play.bind(t)),pause:()=>Q.then(t.pause.bind(t)),seek:A=>Q.then((()=>t.seek(A))),addEventListener:(A,e)=>t.addEventListener(A,e.bind(C))};return C},A}({}); diff --git a/packages/landing/public/casts/claude.cast b/packages/landing/public/casts/claude.cast new file mode 100644 index 000000000..0df7f461b --- /dev/null +++ b/packages/landing/public/casts/claude.cast @@ -0,0 +1,457 @@ +{"version": 3, "term": {"cols": 100, "rows": 30, "type": "tmux-256color", "version": "tmux 3.6a"}, "timestamp": 1779224009, "idle_time_limit": 2.0, "command": "env ZDOTDIR=/tmp/cast-claude-zsh zsh -i", "env": {"SHELL": "/bin/zsh"}} +[0.0, "o", "\u001b[2D\u001b[4B\r\u001b[2C\u001b[4ABuild\u001b[1Cme\u001b[1Ca\u001b[1Cworking\u001b[1CLobu\u001b[1Csupport-triage\u001b[1Cagent.\u001b[1CMake\u001b[1Cthese\u001b[1Cdecisions\u001b[1Cyourself,\u001b[1Cno\u001b[1Cquestions:\r\u001b[1B HTTP-only agent. Entities: customer (email), ticket (title, severity, customer_email). One\u001b[K\r\u001b[2C\u001b[1Breactive watcher on ticket.created that\u001b[1Cextracts\u001b[1Cseverity.\u001b[1CSteps:\u001b[1C1)\u001b[1Clobu\u001b[1Cinit\u001b[1Csupport-bot -y\u001b[K\r\u001b[2C\u001b[1B--no-sentry --no-slack-preview 2) Write support-bot/models/schema.yaml with the entities and\u001b[K\r\r\n\u001b[2Cwatcher\u001b[1C3)\u001b[1Clobu\u001b[1Cvalidate\u001b[1C4)\u001b[1Ccat\u001b[1Cthe\u001b[1Cfinal\u001b[1Clobu.toml\u001b[1Cand\u001b[1Cschema.yaml\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m0\u001b[38;5;246m \u001b[38;5;34m0%\u001b[3"] +[0.0, "o", "8;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[51C\u001b[38;5;246m0\u001b[1Ctokens\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[17CClaude\u001b[1Cin\u001b[1CChrome\u001b[1Cenabled\u001b[1C\u00b7\u001b[1C/chrome\u001b[39m\r\r\n\u001b[69C\u001b[4A"] +[0.5, "o", "\u001b]0;\u2802 Claude Code\u0007"] +[0.004, "o", "\u001b[69D\u001b[4B\r\u001b[9A\u001b[48;5;237m\u001b[38;5;239m\u276f \u001b[38;5;231mBuild me a working Lobu support-triage agent. Make these decisions yourself, no questions: \u001b[39m \r\u001b[1B \u001b[38;5;231mHTTP-only agent. Entities: customer (email), ticket (title, severity, customer_email). One \u001b[39m \r\u001b[1B \u001b[38;5;231mreactive watcher on ticket.created that extracts severity. Steps: 1) lobu init support-bot -y \u001b[39m \r\u001b[1B \u001b[38;5;231m--no-sentry --no-slack-preview 2) Write support-bot/models/schema.yaml with the entities and \u001b[39m \r\u001b[1B \u001b[38;5;231mwatcher 3) lobu validate 4) cat the final lobu.toml and schema.yaml\u001b[39m \r\u001b[2C\u001b[1B\u001b[49m\u001b[K\r\u001b[1B\u001b[38;5;174m\u00b7\u001b[39m \u001b[38;5;174mFluttering\u2026 \u001b[38;5;246m(0s)\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m0\u001b[38;5;246m \u001b[38;5;34m0%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[51C\u001b[38;5;246m0\u001b[1Ctokens\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[17CClaude\u001b[1Cin\u001b[1CChrome\u001b[1Cenabled\u001b[1C\u00b7\u001b[1C/chrome\u001b[39m\r\r\n\u001b[2C\u001b[4A"] +[0.21, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2722\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.106, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2733\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.106, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.107, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.159, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u273d\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.227, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.043, "o", "\u001b]0;\u2810 Claude Code\u0007"] +[0.009, "o", "\u001b[2D\u001b[4B\r\u001b[2C\u001b[7A\u001b[38;5;216mF\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.054, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2736\u001b[2C\u001b[38;5;216ml\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.039, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.001, "o", "\u001b[2D\u001b[4B\r\u001b[15C\u001b[7A\u001b[38;5;246m1\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.015, "o", "\u001b[2D\u001b[4B\r\u001b[4C\u001b[7A\u001b[38;5;216mu\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.053, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2733\u001b[1CF\u001b[2C\u001b[38;5;216mt\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.054, "o", "\u001b[2D\u001b[4B\r\u001b[3C\u001b[7A\u001b[38;5;174ml\u001b[2C\u001b[38;5;216mt\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.054, "o", "\u001b[2D\u001b[4B\r\u001b[4C\u001b[7A\u001b[38;5;174mut\u001b[1C\u001b[38;5;216mer\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.05, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2722\u001b[5Ct\u001b[2C\u001b[38;5;216mi\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.054, "o", "\u001b[2D\u001b[4B\r\u001b[7C\u001b[7A\u001b[38;5;174me\u001b[2C\u001b[38;5;216mn\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.053, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u00b7\u001b[7Cr\u001b[2C\u001b[38;5;216mg\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.055, "o", "\u001b[2D\u001b[4B\r\u001b[9C\u001b[7A\u001b[38;5;174mi\u001b[2C\u001b[38;5;216m\u2026\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.053, "o", "\u001b[2D\u001b[4B\r\u001b[10C\u001b[7A\u001b[38;5;174mn\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.049, "o", "\u001b[2D\u001b[4B\r\u001b[11C\u001b[7A\u001b[38;5;174mg\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.055, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2722\u001b[11C\u2026\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.157, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2733\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.114, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2736\u001b[16C\u001b[38;5;246m \u00b7 \u001b[38;5;249mthinking\u001b[38;5;246m)\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.043, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.054, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.121, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u273d\u001b[14C\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.052, "o", "\u001b[2D\u001b[4B\r\u001b[20C\u001b[7A\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.208, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u273b\u001b[19C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.023, "o", "\u001b[2D\u001b[4B\r\u001b[62C\u001b[1A\u001b[38;5;220mauto mode unavailable for this model\u001b[39m\r\r\n\u001b[2C\u001b[4A"] +[0.085, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.055, "o", "\u001b[2D\u001b[4B\r\u001b[12C\u001b[7A\u001b[38;5;216m\u2026\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.053, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2733\u001b[19C\u001b[38;5;246mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.162, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2722\u001b[10C\u001b[38;5;216mg\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.108, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u00b7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.04, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.012, "o", "\u001b[2D\u001b[4B\r\u001b[10C\u001b[7A\u001b[38;5;216mn\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.16, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2722\u001b[14C\u001b[38;5;246m3\u001b[4C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.052, "o", "\u001b[2D\u001b[4B\r\u001b[9C\u001b[7A\u001b[38;5;216mi\u001b[2C\u001b[38;5;174m\u2026\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.016, "o", "\u001b[2D\u001b[4B\r\u001b[20C\u001b[7A\u001b[38;5;246m\u2193\u001b[39m \u001b[38;5;246m13 tokens \u00b7 \u001b[38;5;247mthinking\u001b[38;5;246m)\r\u001b[86C\u001b[5B56943\u001b[39m\r\r\n\r\n\u001b[2C\u001b[4A"] +[0.038, "o", "\u001b[2D\u001b[4B\r\u001b[22C\u001b[7A\u001b[38;5;246m25\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.053, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2733\u001b[21C\u001b[38;5;246m38\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.056, "o", "\u001b[2D\u001b[4B\r\u001b[22C\u001b[7A\u001b[38;5;246m50\u001b[10C\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.05, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u2736\u001b[7C\u001b[38;5;216mr\u001b[2C\u001b[38;5;174mg\u001b[10C\u001b[38;5;246m63\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.054, "o", "\u001b[2D\u001b[4B\r\u001b[22C\u001b[7A\u001b[38;5;246m75\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.016, "o", "\u001b[2D\u001b[4B\r\u001b[22C\u001b[7A\u001b[38;5;246m88\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.034, "o", "\u001b[2D\u001b[4B\r\u001b[7A\u001b[38;5;174m\u273b\u001b[21C\u001b[38;5;246m100 tokens \u00b7 \u001b[38;5;248mthinking\u001b[38;5;246m)\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.054, "o", "\u001b[2D\u001b[4B\r\u001b[23C\u001b[7A\u001b[38;5;246m13\u001b[10C\u001b[38;5;249mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[4A"] +[0.042, "o", "\u001b[2D\u001b[4B\r\u001b[17C\u001b[2A\u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mcast-clau\u001b[1Ce-dir\u001b[44C\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[22m\u001b[39m\u001b[K\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m56943\u001b[1Ctokens\u001b[39m\r\r\n\u001b[62C\u001b[38;5;220mauto\u001b[1Cmode\u001b[1Cunavailable\u001b[1Cfor\u001b[1Cthis\u001b[1Cmodel\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273d\u001b[6C\u001b[38;5;216me\u001b[2C\u001b[38;5;174mn\u001b[12C\u001b[38;5;246m25\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.049, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;231m\u23fa\u001b[1C\u001b[39mI'll build a working Lobu support-triage agent\u001b[1Cfollowing\u001b[1Cthose\u001b[1Cexact\u001b[1Csteps.\r\u001b[2B\u001b[38;5;174m\u273d\u001b[39m \u001b[38;5;174mFlutt\u001b[38;5;216meri\u001b[38;5;174mng\u2026 \u001b[38;5;246m(3s \u00b7 \u2193\u001b[39m \u001b[38;5;246m138 tokens \u00b7 \u001b[38;5;249mthinking\u001b[38;5;246m)\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177mdemo\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b"] +[0.0, "o", "[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[15C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m56943\u001b[1Ctokens\u001b[39m\r\r\n\u001b[62C\u001b[38;5;220mauto\u001b[1Cmode\u001b[1Cunavailable\u001b[1Cfor\u001b[1Cthis\u001b[1Cmodel\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m50\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.036, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m63\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.056, "o", "\u001b[2D\u001b[7B\r\u001b[6C\u001b[10A\u001b[38;5;216mt\u001b[2C\u001b[38;5;174mi\u001b[13C\u001b[38;5;246m75\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m88\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[21C\u001b[38;5;246m200\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.003, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m13\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m\u23fa\u001b[1C\u001b[39m\u001b[1mBash\u001b[22m(lobu init support-bot -y --no-sentry --no-slack-preview)\r\u001b[1B\u001b[38;5;246m \u23bf \u00a0Waiting\u2026\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;174m\u273b\u001b[39m \u001b[38;5;174mFlut\u001b[38;5;216mter\u001b[38;5;174ming\u2026 \u001b[38;5;246m(3s \u00b7 \u2193\u001b[1C225 tokens \u00b7 \u001b[38;5;249mthinking\u001b[38;5;246m)\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38"] +[0.0, "o", ";5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[44C\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[22m\u001b[39m\u001b[K\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m56943\u001b[1Ctokens\u001b[39m\r\r\n\u001b[62C\u001b[38;5;220mauto\u001b[1Cmode\u001b[1Cunavailable\u001b[1Cfor\u001b[1Cthis\u001b[1Cmodel\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.015, "o", "\u001b[2D\u001b[7B\r\u001b[13A\u001b[38;5;246m \r\u001b[5C\u001b[1BRunn\r\u001b[6C\u001b[2B\u001b[38;5;174mter\u001b[14C\u001b[38;5;246m38\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.034, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[22C\u001b[38;5;246m50\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.059, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m63\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.049, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[22C\u001b[38;5;246m75\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[15C\u001b[10A\u001b[38;5;246m4\u001b[7C88\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;180mFluttering\u2026\u001b[9C\u001b[38;5;246m300\u001b[10C\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[23C\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.056, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m13\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u00b7\u001b[23C\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m22\u001b[10C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;216mFluttering\u2026\u001b[11C\u001b[38;5;246m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.035, "o", "\u001b[2D\u001b[7B\r\u001b[13A\u001b[38;5;246m\u23fa\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[22C\u001b[38;5;246m30\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m1\u001b[10Cthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[23C\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[23C\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[23C\u001b[38;5;246m5\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273d\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[15C\u001b[10A\u001b[38;5;246m5\u001b[8C8\u001b[10C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;180mFluttering\u2026\u001b[10C\u001b[38;5;246m40\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m1\u001b[10C\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[23C\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.021, "o", "\u001b[2D\u001b[7B\r\u001b[13A\u001b[38;5;114m\u23fa\r\u001b[5C\u001b[1B\u001b[39mCreating\u001b[1Cproject\u001b[1Cin:\u001b[1C/private/tmp/demo/support-bot\r\u001b[2B \u001b[1C - Creating Lobu project...\u001b[K\r\u001b[5C\u001b[1B\u2714\u001b[1CProject\u001b[1Ccreated\u001b[1Csuccessfully!\r\u001b[1B\u001b[K\r\u001b[1B \u001b[2C\u2713\u001b[1CLobu\u001b[1Cinitialized!\r\u001b[1B\u001b[K\r\u001b[2C\u001b[1B Next steps:\u001b[K\r\u001b[2C\u001b[1B\u001b[K\r\u001b[2C\u001b[1B 1. cd support-bot\u001b[K\r\u001b[7C\u001b[1B2.\u001b[1CStart\u001b[1Cthe\u001b[1Clocal\u001b[1Cstack:\u001b[1Clobu\u001b[1Crun\u001b[1C(uses\u001b[1CPGlite\u001b[1Cby\u001b[1Cdefault)\u001b[20C\u001b[K\r\u001b[12C\u001b[1BOptional:\u001b[1Cset\u001b[1CDATABASE_URL\u001b[1Cin\u001b[1C.env\u001b[1Cto\u001b[1Cuse\u001b[1Cexternal Postgres instead.\u001b[K\r\r\n\u001b[7C3.\u001b[1CAPI\u001b[1Cdocs:\u001b[1C\u001b]8;id=12pc3wo;http://localhost:8787/api/docs\u0007\u001b[94mhttp://localhost:8787/api/docs\u001b[39m\u001b]8;;\u0007\r\r\n\r\r\n\u001b[7CSee\u001b[1CREADME.md\u001b[1Cfor\u001b[1Clayout,\u001b[1CAGENTS.md\u001b[1Cfor\u001b[1Cthe\u001b[1Cagent\u001b[1Ccontract.\r\r\n\r\r\n\u001b[38;5;174m\u2736\u001b[1CFluttering\u2026\u001b[1C\u001b[38;5;246m(5s\u001b[1C\u00b7\u001b[1C\u2191\u001b[1C343\u001b[1Ctokens\u001b[1C\u00b7\u001b[1C\u001b[38;5;248mthinking\u001b[38;5;246m)\u001b[39m\r\r\n\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38"] +[0.0, "o", ";5;246m57228\u001b[1Ctokens\u001b[39m\r\r\n\u001b[62C\u001b[38;5;220mauto\u001b[1Cmode\u001b[1Cunavailable\u001b[1Cfor\u001b[1Cthis\u001b[1Cmodel\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.092, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[23C\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m5\u001b[10C\u001b[38;5;249mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[1C\u001b[38;5;216mF\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[3C\u001b[10A\u001b[38;5;216ml\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u00b7\u001b[3C\u001b[38;5;216mu\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;174mF\u001b[2C\u001b[38;5;216mt\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.006, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.046, "o", "\u001b[2D\u001b[7B\r\u001b[3C\u001b[10A\u001b[38;5;174ml\u001b[2C\u001b[38;5;216mt\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[4C\u001b[10A\u001b[38;5;174mu\u001b[2C\u001b[38;5;216me\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[5C\u001b[10A\u001b[38;5;174mt\u001b[2C\u001b[38;5;216mr\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[5Ct\u001b[2C\u001b[38;5;216mi\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[7C\u001b[10A\u001b[38;5;174me\u001b[2C\u001b[38;5;216mn\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[7Cr\u001b[2C\u001b[38;5;216mg\u001b[3C\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[9C\u001b[10A\u001b[38;5;174mi\u001b[2C\u001b[38;5;216m\u2026\u001b[22C\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[9Cn\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[11C\u001b[10A\u001b[38;5;174mg\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[12C\u001b[10A\u001b[38;5;174m\u2026\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[34C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.108, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273d\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.132, "o", "\u001b[2D\u001b[7B\r\u001b[35C\u001b[10A\u001b[38;5;246mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.044, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.062, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.159, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[14C\u001b[38;5;246m7\u001b[19C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u00b7\u001b[1C\u001b[38;5;216mF\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[3C\u001b[10A\u001b[38;5;216ml\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[4C\u001b[10A\u001b[38;5;216mu\u001b[30C\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;174mF\u001b[2C\u001b[38;5;216mt\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[2Cl\u001b[2C\u001b[38;5;216mt\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[4C\u001b[10A\u001b[38;5;174mu\u001b[2C\u001b[38;5;216me\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[5C\u001b[10A\u001b[38;5;174mt\u001b[2C\u001b[38;5;216mr\u001b[26C\u001b[38;5;249mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[5Ct\u001b[2C\u001b[38;5;216mi\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[7C\u001b[10A\u001b[38;5;174mer\u001b[1C\u001b[38;5;216mng\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[8Ci\u001b[2C\u001b[38;5;216m\u2026\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.031, "o", "\u001b[2D\u001b[7B\r\u001b[10C\u001b[10A\u001b[38;5;174mng\u2026\u001b[7C\u001b[38;5;246m\u2193\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.014, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.074, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273d\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.213, "o", "\u001b[2D\u001b[7B\r\u001b[15C\u001b[10A\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.018, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m59\r\u001b[88C\u001b[8B406\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m\u23fa\u001b[1C\u001b[39m\u001b[1mBash\u001b[22m(ls -la /private/tmp/demo/support-bot/)\r\u001b[2B\u001b[38;5;174m\u273d\u001b[39m \u001b[38;5;174mFluttering\u2026 \u001b[38;5;246m(8s \u00b7 \u2193\u001b[39m \u001b[38;5;246m409 tokens \u00b7 \u001b[38;5;249mthinking\u001b[38;5;246m)\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177mdemo\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permi"] +[0.0, "o", "ssions on\u001b[38;5;246m (shift+tab to cycle)\u001b[15C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m57406\u001b[1Ctokens\u001b[39m\r\r\n\u001b[62C\u001b[38;5;220mauto\u001b[1Cmode\u001b[1Cunavailable\u001b[1Cfor\u001b[1Cthis\u001b[1Cmodel\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[22C\u001b[38;5;246m21\u001b[10C\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.018, "o", "\u001b[2D\u001b[7B\r\u001b[12A\u001b[38;5;114m\u23fa\r\u001b[1B\u001b[38;5;246m \u23bf \u00a0\u001b[39mtotal\u001b[1C56\r\u001b[1B \u001b[1C drwxr-xr-x@ 11 dev wheel 352 19\u001b[1CMay\u001b[1C21:53\u001b[1C.\r\u001b[5C\u001b[1Bdrwxr-xr-x@\u001b[2C3\u001b[1Cdev\u001b[2Cwheel\u001b[4C96\u001b[1C19\u001b[1CMay\u001b[1C21:53\u001b[1C..\r\u001b[1B -rw-------@ 1 dev wheel 879 19 May 21:53 .env\u001b[K\r\u001b[1B \u001b[2C-rw-r--r--@\u001b[2C1\u001b[1Cdev\u001b[2Cwheel\u001b[3C430\u001b[1C19\u001b[1CMay\u001b[1C21:53\u001b[1C.gitignore\r\u001b[1B drwxr-xr-x@ 3 dev wheel 96 19 May 21:53 agents\u001b[K\r\u001b[2C\u001b[1B -rw-r--r--@ 1 dev wheel 11\u001b[1C19\u001b[1CMay\u001b[1C21:53\u001b[1CAGENTS.md\r\u001b[2C\u001b[1B drwxr-xr-x@ 2 dev wheel 64 19 May 21:53 data\u001b[K\r\u001b[2C\u001b[1B -rw-r--r--@ 1 dev wheel 1451 19 May\u001b[1C21:53\u001b[1Clobu.toml\r\u001b[5C\u001b[1B-rw-r--r--@\u001b[2C1\u001b[1Cdev\u001b[2Cwheel\u001b[2C2559\u001b[1C19\u001b[1CMay\u001b[1C21:53\u001b[1CREADME.md\u001b[21C\u001b[K\r\u001b[5C\u001b[1Bdrwxr-xr-x@\u001b[2C3\u001b[1Cdev\u001b[2Cwheel\u001b[4C96\u001b[1C19\u001b[1CMay\u001b[1C21:53\u001b[1Cskills\u001b[K\r\r\n\u001b[5C-rw-r--r--@\u001b[2C1\u001b[1Cdev\u001b[2Cwheel\u001b[2C6195\u001b[1C19\u001b[1CMay\u001b[1C21:53\u001b[1CTESTING.md\r\r\n\r\r\n\u001b[38;5;174m\u273b\u001b[1C\u001b[38;5;180mFluttering\u2026\u001b[38;5;174m \u001b[3"] +[0.0, "o", "8;5;246m(8s\u001b[1C\u00b7\u001b[1C\u2193\u001b[1C440\u001b[1Ctokens\u001b[1C\u00b7\u001b[1C\u001b[38;5;248mthinking\u001b[38;5;246m)\u001b[39m\r\r\n\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[2"] +[0.0, "o", "2m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m57496\u001b[1Ctokens\u001b[39m\r\r\n\u001b[62C\u001b[38;5;220mauto\u001b[1Cmode\u001b[1Cunavailable\u001b[1Cfor\u001b[1Cthis\u001b[1Cmodel\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.019, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;174mFluttering\u2026\u001b[7C\u001b[38;5;246m\u2191\u001b[3C6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.02, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[22C\u001b[38;5;246m51\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[23C\u001b[38;5;246m9\u001b[10C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m62\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[23C\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m5\u001b[10Cthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u00b7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.04, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.012, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;216mF\u001b[21C\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.067, "o", "\u001b[2D\u001b[7B\r\u001b[3C\u001b[10A\u001b[38;5;216ml\u001b[20C\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.067, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[1CF\u001b[1C\u001b[38;5;216mut\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[3C\u001b[10A\u001b[38;5;174ml\u001b[2C\u001b[38;5;216mt\u001b[17C\u001b[38;5;246m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[3Cu\u001b[2C\u001b[38;5;216me\u001b[15C\u001b[38;5;246m70\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.049, "o", "\u001b[2D\u001b[7B\r\u001b[5C\u001b[10A\u001b[38;5;174mt\u001b[2C\u001b[38;5;216mr\u001b[15C\u001b[38;5;246m1\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[5Ct\u001b[2C\u001b[38;5;216mi\u001b[5C\u001b[38;5;246m9\u001b[19C\u001b[38;5;247mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[7C\u001b[10A\u001b[38;5;174me\u001b[2C\u001b[38;5;216mn\u001b[13C\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[8C\u001b[10A\u001b[38;5;174mr\u001b[2C\u001b[38;5;216mg\u001b[12C\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[8Ci\u001b[2C\u001b[38;5;216m\u2026\u001b[11C\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10C\u001b[10A\u001b[38;5;174mn\u001b[24C\u001b[38;5;248mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273d\u001b[10Cg\u001b[12C\u001b[38;5;246m5\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[12C\u001b[10A\u001b[38;5;174m\u2026\u001b[11C\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[35C\u001b[10A\u001b[38;5;249mthinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.069, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[23C\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.01, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.041, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.155, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u00b7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[15C\u001b[10A\u001b[38;5;246m10s \u00b7 \u2191\u001b[39m \u001b[38;5;246m479 tokens \u00b7 \u001b[38;5;249mstill thinking\u001b[38;5;246m)\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[36C\u001b[10A\u001b[38;5;145mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.155, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2722\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.103, "o", "\u001b[2D\u001b[7B\r\u001b[33C\u001b[1A\u001b[38;5;220mYou've used 90% of your weekly limit \u00b7\u001b[1Cresets 8am (Eu\u001b[1Cope/London)\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.019, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2733\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.088, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.081, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.078, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.103, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273d\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.217, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.109, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m1\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.103, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;180m\u2733\u001b[1CFluttering\u2026 \u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.056, "o", "\u001b[2D\u001b[7B\r\u001b[36C\u001b[10A\u001b[38;5;181mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;180m\u2722\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.042, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2193\u001b[2C92\r\u001b[88C\u001b[8B929\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m\u23fa\u001b[1C\u001b[39m\u001b[1mBash\u001b[22m(ls -la /private/tmp/demo/support-bot/models/\u001b[1C2>/dev/null\u001b[1C||\u001b[1Cecho\u001b[1C\"models\u001b[1Cdirectory\r\u001b[3C\u001b[1Bdoesn't\u001b[1Cexist\u001b[1Cyet\")\r\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;179m\u2722\u001b[39m \u001b[38;5;179mFluttering\u2026 \u001b[38;5;246m(11s \u00b7 \u2193\u001b[1C517 tokens \u00b7 \u001b[38;5;181mstill thinking\u001b[38;5;246m)\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[3"] +[0.0, "o", "8;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[44C\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[22m\u001b[39m\u001b[K\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m57929\u001b[1Ctokens\u001b[39m\r\r\n\u001b[33C\u001b[38;5;220mYou've\u001b[1Cused\u001b[1C90%\u001b[1Cof\u001b[1Cyour\u001b[1Cweekly\u001b[1Climit\u001b[1C\u00b7\u001b[1Cresets\u001b[1C8am\u001b[1C(Europe/London)\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.047, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u00b7\u001b[23C\u001b[38;5;246m29\u001b[10C\u001b[38;5;187mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.04, "o", "\u001b[2D\u001b[7B\r\u001b[13A\u001b[38;5;114m\u23fa\r\u001b[2B\u001b[38;5;246m \u23bf \u00a0\u001b[39mmodels\u001b[1Cdirectory\u001b[1Cdoesn't\u001b[1Cexist\u001b[1Cyet\r\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;179m\u00b7\u001b[1CFluttering\u2026 \u001b[38;5;246m(11s \u00b7 \u2193\u001b[1C542 tokens \u00b7 \u001b[38;5;187mstill thinking\u001b[38;5;246m)\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[1C\u001b[38;5;246m\u001b[2m|\u001b[22m \u001b[38;5;216m57k\u001b[38;5;246m \u001b[38;5;34"] +[0.0, "o", "m28%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\r\u001b[2C\u001b[1B\u001b[22m\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[39C\u001b[39m\u001b[K\r\u001b[33C\u001b[1B \u001b[38;5;246m58029 tokens\u001b[39m\r\r\n\u001b[33C\u001b[38;5;220mYou've\u001b[1Cused\u001b[1C90%\u001b[1Cof\u001b[1Cyour\u001b[1Cweekly\u001b[1Climit\u001b[1C\u00b7\u001b[1Cresets\u001b[1C8am\u001b[1C(Europe/London)\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2191\u001b[2C67\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.026, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.021, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m79\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m92\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.067, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2722\u001b[22C\u001b[38;5;246m602\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2733\u001b[23C\u001b[38;5;246m10\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.018, "o", "\u001b[2D\u001b[7B\r\u001b[18C\u001b[5A\u001b[38;5;216m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.037, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2736\u001b[24C\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m5\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u273b\u001b[24C\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.049, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u273d\u001b[24C\u001b[38;5;246m8\u001b[10C\u001b[38;5;181mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m20\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u273b\u001b[24C\u001b[38;5;246m1\u001b[10C\u001b[38;5;180mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.08, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.025, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2736\u001b[24C\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2733\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m5\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2722\u001b[24C\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.035, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2193\u001b[2C39\r\u001b[89C\u001b[8B88\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.02, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m52\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.001, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u00b7\u001b[23C\u001b[38;5;246m64\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m77\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m89\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.042, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m\u23fa\u001b[1C\u001b[39m\u001b[1mBash\u001b[22m(mkdir -p /private/tmp/demo/support-bot/models)\r\u001b[1B\u001b[38;5;246m \u23bf \u00a0Waiting\u2026\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;179m\u00b7\u001b[39m \u001b[38;5;179mFluttering\u2026 \u001b[38;5;246m(12s \u00b7 \u2193\u001b[1C702 tokens \u00b7 \u001b[38;5;180mstill thinking\u001b[38;5;246m)\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38"] +[0.0, "o", ";5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m58k\u001b[38;5;246m \u001b[38;5;34m28%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[44C\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[22m\u001b[39m\u001b[K\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m58088\u001b[1Ctokens\u001b[39m\r\r\n\u001b[33C\u001b[38;5;220mYou've\u001b[1Cused\u001b[1C90%\u001b[1Cof\u001b[1Cyour\u001b[1Cweekly\u001b[1Climit\u001b[1C\u00b7\u001b[1Cresets\u001b[1C8am\u001b[1C(Europe/London)\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m3\u001b[8C9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.02, "o", "\u001b[2D\u001b[7B\r\u001b[13A\u001b[38;5;246m \r\u001b[5C\u001b[1BRunn\r\u001b[24C\u001b[2B21\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.025, "o", "\u001b[2D\u001b[7B\r\u001b[13A\u001b[38;5;114m\u23fa\r\u001b[5C\u001b[1B\u001b[38;5;246mDo\u001b[1Ce\u001b[39m\u001b[K\r\u001b[21C\u001b[2B\u001b[38;5;246m\u2191\u001b[3C7\r\u001b[88C\u001b[8B1\u001b[1C5\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.021, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m32\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2722\u001b[24C\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m40\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2733\u001b[24C\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.067, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u2736\u001b[24C\u001b[38;5;246m5\u001b[10C\u001b[38;5;186mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.01, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.043, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[22C\u001b[5A\u001b[38;5;34m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.03, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.039, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;179m\u273d\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u273d\u001b[1CFluttering\u2026 \u001b[10C\u001b[38;5;246m50\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m1\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u2736\u001b[24C\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m5\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u2733\u001b[24C\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u2722\u001b[24C\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u00b7\u001b[24C\u001b[38;5;246m9\u001b[10C\u001b[38;5;180mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m60\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.018, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.155, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u2722\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.164, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u2733\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u273d\u001b[15C\u001b[22m\u001b[38;5;246m5\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.163, "o", "\u001b[2D\u001b[7B\r\u001b[36C\u001b[10A\u001b[38;5;186mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2193\u001b[2C73\r\u001b[88C\u001b[8B234\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2736\u001b[23C\u001b[22m\u001b[38;5;246m85\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.037, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m98\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.05, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2733\u001b[22C\u001b[22m\u001b[38;5;246m810\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m23\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.035, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m35\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m48\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.055, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2722\u001b[23C\u001b[22m\u001b[38;5;246m60\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m73\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m85\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.039, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u00b7\u001b[23C\u001b[22m\u001b[38;5;246m98\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.056, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m910\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m23\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.048, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m35\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m48\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.039, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2722\u001b[23C\u001b[22m\u001b[38;5;246m60\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m6\u001b[7C73\u001b[10C\u001b[38;5;185mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.056, "o", "\u001b[2D\u001b[7B\r\u001b[24C\u001b[10A\u001b[38;5;246m85\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.051, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2733\u001b[23C\u001b[22m\u001b[38;5;246m98\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[23C\u001b[10A\u001b[38;5;246m1.0k tokens \u00b7 \u001b[38;5;185msti\u001b[1Cl thinking\u001b[38;5;246m)\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.057, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.103, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m1\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.158, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.11, "o", "\u001b[2D\u001b[7B\r\u001b[11A\u001b[38;5;246m \u23bf \u00a0\u001b[38;5;211mError: InputValidationError: Write failed due to the following issue:\r\u001b[1B\u001b[39m \u001b[1C \u001b[38;5;211mAn unexpected parameter `description` was provided\r\u001b[2B\u001b[38;5;215m\u001b[1m\u273b\u001b[22m\u001b[39m \u001b[38;5;215mFluttering\u2026 \u001b[38;5;246m(16s \u00b7 \u2193\u001b[39m \u001b[38;5;246m1.1k tokens \u00b7 \u001b[38;5;185mstill thinking\u001b[38;5;246m)\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m58k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177mdemo\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b"] +[0.0, "o", "[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m58234\u001b[1Ctokens\u001b[39m\r\r\n\u001b[33C\u001b[38;5;220mYou've\u001b[1Cused\u001b[1C90%\u001b[1Cof\u001b[1Cyour\u001b[1Cweekly\u001b[1Climit\u001b[1C\u00b7\u001b[1Cresets\u001b[1C8am\u001b[1C(Europe/London)\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.015, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.087, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2191\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.02, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.057, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.06, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.115, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u00b7\u001b[36C\u001b[22m\u001b[38;5;221mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.078, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.152, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.154, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;215m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;214m\u001b[1m\u2736\u001b[1C\u001b[22mFluttering\u2026 \u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;214m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.157, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;214m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.104, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273d\u001b[1C\u001b[22mFluttering\u2026 \u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.077, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.046, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2193\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m2\r\u001b[88C\u001b[8B682\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.021, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.042, "o", "\u001b[2D\u001b[7B\r\u001b[33C\u001b[1A \u001b[38;5;220m1\u001b[1CMCP \u001b[2Crver needs auth\u001b[38;5;246m \u00b7 /mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.074, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.102, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.108, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u00b7\u001b[24C\u001b[22m\u001b[38;5;246m3\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.066, "o", "\u001b[2D\u001b[7B\r\u001b[18C\u001b[5A\u001b[38;5;216m9\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.091, "o", "\u001b[2D\u001b[7B\r\u001b[37C\u001b[10A\u001b[38;5;220mstill thinking\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.132, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[24C\u001b[22m\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.03, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m \u001b[1C\u001b[39m\u001b[1mWrite\u001b[22m(\u001b]8;id=117kah9;file:///private/tmp/demo/support-bot/models/schema.yaml\u0007/private/tmp/demo/support-bot/models/schema.yaml\u001b]8;;\u0007)\r\u001b[2B\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m \u001b[38;5;220mFluttering\u2026 \u001b[38;5;246m(19s \u00b7 \u2193\u001b[39m \u001b[38;5;246m1.4k tokens \u00b7 \u001b[38;5;220mstill thinking\u001b[38;5;246m)\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177mdemo\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;"] +[0.0, "o", "246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[21C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m58958\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.07, "o", "\u001b[2D\u001b[7B\r\u001b[12A\u001b[38;5;114m\u23fa\r\u001b[1B\u001b[38;5;246m \u23bf \u00a0\u001b[39mWrote\u001b[1C\u001b[1m34\u001b[1C\u001b[22mlines\u001b[1Cto\u001b[1C\u001b[1m/private/tmp/demo/support-bot/models/schema.yaml\r\u001b[1B\u001b[22m \u001b[1C \u001b[38;5;231m\u001b[2m 1 \u001b[22m\u001b[38;5;148mentities:\u001b[39m\u001b[K\r\u001b[5C\u001b[1B\u001b[38;5;231m\u001b[2m 2 \u001b[22m \u001b[38;5;148mcustomer:\r\u001b[1B\u001b[39m \u001b[38;5;231m\u001b[2m 3 \u001b[22m \u001b[38;5;148mfields:\u001b[39m\u001b[K\r\u001b[1B \u001b[2C\u001b[38;5;231m\u001b[2m 4 \u001b[22m \u001b[38;5;148memail:\r\u001b[1B\u001b[39m \u001b[38;5;231m\u001b[2m 5 \u001b[22m \u001b[38;5;148mtype:\u001b[38;5;231m \u001b[38;5;186mstring\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[38;5;231m\u001b[2m 6 \u001b[22m \u001b[38;5;148mrequired:\u001b[38;5;231m \u001b[38;5;141mtrue\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[38;5;231m\u001b[2m 7 \u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[38;5;231m\u001b[2m 8 \u001b[22m \u001b[38;5;148mticket:\u001b[39m\u001b[K\r\u001b[5C\u001b[1B\u001b[38;5;231m\u001b[2m 9 \u001b[22m \u001b[38;5;148mfields:\u001b[66C\u001b[39m\u001b[K\r\u001b[5C\u001b[1B\u001b[38;5;231m\u001b[2m 10 \u001b[22m \u001b[38;5;148mtitle:\u001b[47C\u001b[39m\u001b[K\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 11\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mtype:\u001b[38;5;231m \u001b[38;5;186mstring\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 12\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mrequired:\u001b[38;5;231m \u001b[38;5;1"] +[0.0, "o", "41mtrue\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 13\u001b[1C\u001b[22m \u001b[5C\u001b[38;5;148mseverity:\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 14\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mtype:\u001b[38;5;231m \u001b[38;5;186mstring\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 15\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mrequired:\u001b[38;5;231m \u001b[38;5;141mfalse\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 16\u001b[1C\u001b[22m \u001b[5C\u001b[38;5;148mcustomer_email:\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 17\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mtype:\u001b[38;5;231m \u001b[38;5;186mstring\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 18\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mrequired:\u001b[38;5;231m \u001b[38;5;141mtrue\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 19\u001b[22m\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 20\u001b[1C\u001b[22m\u001b[38;5;148mwatchers:\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 21\u001b[1C\u001b[22m \u001b[1C-\u001b[1C\u001b[38;5;148mname:\u001b[38;5;231m \u001b[38;5;186mextract_ticket_severity\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 22\u001b[1C\u001b[22m \u001b[3C\u001b[38;5;148mon:\u001b[38;5;231m \u001b[38;5;186mticket.created\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 23\u001b[1C\u001b[22m \u001b[3C\u001b[38;5;148mactions:\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 24\u001b[1C\u001b[22m \u001b[5C-\u001b[1C\u001b[38;5;148mtype:\u001b[38;5;231m \u001b[38;5;186mupdate_field\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 25\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148menti"] +[0.0, "o", "ty:\u001b[38;5;231m \u001b[38;5;186mticket\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 26\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mfield:\u001b[38;5;231m \u001b[38;5;186mseverity\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 27\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mvalue_source:\u001b[38;5;231m \u001b[38;5;186mllm\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 28\u001b[1C\u001b[22m \u001b[7C\u001b[38;5;148mprompt:\u001b[38;5;231m \u001b[38;5;186m|\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 29\u001b[1C\u001b[22m \u001b[9C\u001b[38;5;186mExtract\u001b[38;5;231m \u001b[38;5;186mthe\u001b[38;5;231m \u001b[38;5;186mseverity\u001b[38;5;231m \u001b[38;5;186mlevel\u001b[38;5;231m \u001b[38;5;186mfrom\u001b[38;5;231m \u001b[38;5;186mthis\u001b[38;5;231m \u001b[38;5;186mticket\u001b[38;5;231m \u001b[38;5;186mtitle\u001b[38;5;231m \u001b[38;5;186mand\u001b[38;5;231m \u001b[38;5;186mdescription.\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 30\u001b[1C\u001b[22m \u001b[9C\u001b[38;5;148mReturn\u001b[1Conly\u001b[1Cone\u001b[1Cof:\u001b[38;5;231m \u001b[38;5;186mcritical,\u001b[38;5;231m \u001b[38;5;186mhigh,\u001b[38;5;231m \u001b[38;5;186mmedium,\u001b[38;5;231m \u001b[38;5;186mlow\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 31\u001b[22m\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 32\u001b[1C\u001b[22m \u001b[9C\u001b[38;5;148mTitle:\u001b[38;5;231m {{\u001b[1C\u001b[38;5;186mentity.title\u001b[38;5;231m }}\u001b[39m\r\r\n\u001b[5C\u001b[38;5;231m\u001b[2m 33\u001b[22m\u001b[39m\r\r\n\u001b[5C\u001b[38"] +[0.0, "o", ";5;231m\u001b[2m 34\u001b[1C\u001b[22m \u001b[9C\u001b[38;5;186mIf\u001b[38;5;231m \u001b[38;5;186mthe\u001b[38;5;231m \u001b[38;5;186mseverity\u001b[38;5;231m \u001b[38;5;186mcannot\u001b[38;5;231m \u001b[38;5;186mbe\u001b[38;5;231m \u001b[38;5;186mdetermined,\u001b[38;5;231m \u001b[38;5;186mdefault\u001b[38;5;231m \u001b[38;5;186mto\u001b[38;5;231m \u001b[38;5;186m\"medium\".\u001b[39m\r\r\n\r\r\n\u001b[38;5;220m\u001b[1m\u2733\u001b[1C\u001b[22mFluttering\u2026\u001b[1C\u001b[38;5;246m(19s\u001b[1C\u00b7\u001b[1C\u2191\u001b[1C1.4k\u001b[1Ctokens\u001b[1C\u00b7\u001b[1C\u001b[38;5;220mstill\u001b[1Cthinking\u001b[38;5;246m)\u001b[39m\r\r\n\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m58958\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.019, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.036, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.07, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.102, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.262, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.12, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.104, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u00b7\u001b[14C\u001b[22m\u001b[38;5;246m20\u001b[20C\u001b[38;5;220mth\u001b[1Cnking more\u001b[38;5;246m)\u001b[39m\u001b[K\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.094, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.169, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.159, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.08, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m\u23fa\u001b[1C\u001b[39m\u001b[1mBash\u001b[22m(cd /private/tmp/demo/support-bot &&\u001b[1Clobu\u001b[1Cvalidate)\r\u001b[1B\u001b[38;5;246m \u23bf \u00a0Waiting\u2026\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m \u001b[38;5;220mFluttering\u2026 \u001b[38;5;246m(20s \u00b7 \u2193\u001b[1C1.5k tokens \u00b7 \u001b[38;5;220mthinking more\u001b[38;5;246m)\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m"] +[0.0, "o", " \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177mdemo\u001b[44C\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[22m\u001b[39m\u001b[K\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m59087\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.038, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[5C\u001b[12A\u001b[38;5;246mRunn\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.095, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.212, "o", "\u001b[2D\u001b[7B\r\u001b[13A\u001b[38;5;114m\u23fa\r\u001b[5C\u001b[1B\u001b[39m lobu.toml\u001b[1Cis\u001b[1Cvalid\r\u001b[7C\u001b[1B1\u001b[1Cagent(s)\u001b[1Cconfigured\r\u001b[1B \u001b[1C [agents.support-bot] No providers configured.\u001b[1CAgent\u001b[1Cwill\u001b[1Cneed\u001b[1Cprovider\u001b[1Ckeys\u001b[1Cat\u001b[1Cruntime.\r\u001b[2B\u001b[38;5;220m\u001b[1m\u273d\u001b[22m\u001b[39m \u001b[38;5;220mFluttering\u2026 \u001b[38;5;246m(21s \u00b7 \u2191\u001b[39m \u001b[38;5;246m1.5k tokens \u00b7 \u001b[38;5;220mthinking more\u001b[38;5;246m)\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177mdemo\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[2"] +[0.0, "o", "2m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[21C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m59132\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.021, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.063, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.042, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[24C\u001b[22m\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.158, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.018, "o", "\u001b[2D\u001b[7B\r\u001b[27C\u001b[5A\u001b[38;5;177msupport-bot\u001b[39m\u001b[K\r\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.084, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u00b7\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.262, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.118, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m2\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.013, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.037, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.269, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.111, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m\u23fa\u001b[1C\u001b[39m\u001b[1mRead\u001b[22m\u001b[K\r\u001b[2B\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m \u001b[38;5;220mFluttering\u2026 \u001b[38;5;246m(22s \u00b7 \u2193\u001b[39m \u001b[38;5;246m1.6k tokens \u00b7 \u001b[38;5;220mthinking more\u001b[38;5;246m)\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177msupport-bot\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to "] +[0.0, "o", "cycle)\u001b[21C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m59212\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.142, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[12A\u001b[38;5;246m \u001b[5C\u001b[39m(\u001b]8;id=1s4wges;file:///private/tmp/demo/support-bot/lobu.toml\u0007/private/tmp/demo/support-bot/lobu.toml\u001b]8;;\u0007)\r\u001b[2B\u001b[38;5;246m\u23fa\u001b[1C\u001b[39m\u001b[1mRead\u001b[22m\u001b[K\r\u001b[2B\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m \u001b[38;5;220mFluttering\u2026 \u001b[38;5;246m(22s \u00b7 \u2193\u001b[39m \u001b[38;5;246m1.6k tokens \u00b7 \u001b[38;5;220mthinking more\u001b[38;5;246m)\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177msupport-bot\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:"] +[0.0, "o", "\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[21C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m59212\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.06, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u00b7\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.049, "o", "\u001b[2D\u001b[7B\r\u001b[14A\u001b[38;5;114m\u23fa\r\u001b[1B\u001b[38;5;246m \u23bf \u00a0\u001b[39mRead\u001b[1C\u001b[1m38\u001b[1C\u001b[22mlines\r\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;246m \u001b[1C\u001b[39m\u001b[1mRead\u001b[22m(\u001b]8;id=117kah9;file:///private/tmp/demo/support-bot/models/schema.yaml\u0007/private/tmp/demo/support-bot/models/schema.yaml\u001b]8;;\u0007)\r\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;220m\u001b[1m\u00b7\u001b[1C\u001b[22mFluttering\u2026 \u001b[38;5;246m(23s \u00b7 \u2193\u001b[1C1.6k tokens \u00b7 \u001b[38;5;220mthinking more\u001b[38;5;246m)\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[1C\u001b[38;5;246m\u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\r\u001b[2C\u001b[1B\u001b[22m\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[39C\u001b[39m\u001b[K\r\u001b[68C\u001b[1B \u001b[38;5;246m59212\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.015, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.001, "o", "\u001b[2D\u001b[7B\r\u001b[25C\u001b[10A\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.039, "o", "\u001b[2D\u001b[7B\r\u001b[12A\u001b[38;5;114m\u23fa\r\u001b[1B\u001b[38;5;246m \u23bf \u00a0\u001b[39mRead\u001b[1C\u001b[1m35\u001b[1C\u001b[22mlines\r\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;220m\u001b[1m\u00b7\u001b[1C\u001b[22mFluttering\u2026 \u001b[38;5;246m(23s \u00b7 \u2193\u001b[1C1.7k tokens \u00b7 \u001b[38;5;220mthinking more\u001b[38;5;246m)\r\u001b[1B\u001b[39m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[1C\u001b[38;5;246m\u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;"] +[0.0, "o", "5;246m \u001b[2m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\r\u001b[2C\u001b[1B\u001b[22m\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[39C\u001b[39m\u001b[K\r\u001b[68C\u001b[1B \u001b[38;5;246m59354\u001b[1Ctokens\u001b[39m\r\r\n\u001b[68C\u001b[38;5;220m1\u001b[1CMCP\u001b[1Cserver\u001b[1Cneeds\u001b[1Cauth\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.02, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2191\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.089, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.157, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.104, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.105, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.118, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.27, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.058, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.046, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[15C\u001b[22m\u001b[38;5;246m4\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.156, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.102, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u00b7\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.211, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.157, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.076, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.026, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.054, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m5\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.104, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.212, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.156, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.106, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.107, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u00b7\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.09, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.123, "o", "\u001b[2D\u001b[7B\r\u001b[16C\u001b[10A\u001b[38;5;246m6\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.052, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.104, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.12, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.038, "o", "\u001b[2D\u001b[7B\r\u001b[58C\u001b[1A\u001b[38;5;211m1 claude.ai connector unavailable\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.072, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.154, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273d\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.213, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u273b\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.085, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.02, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2736\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.156, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2733\u001b[15C\u001b[22m\u001b[38;5;246m7\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.119, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.092, "o", "\u001b[2D\u001b[7B\r\u001b[21C\u001b[10A\u001b[38;5;246m\u2193\r\u001b[86C\u001b[8B60\u001b[2C5\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u00b7\u001b[24C\u001b[22m\u001b[38;5;246m8\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.213, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;220m\u001b[1m\u2722\u001b[22m\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.033, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;231m\u23fa\u001b[1C\u001b[39mDone! Your Lobu support-triage agent is ready. Here's\u001b[1Cwhat\u001b[1Cwas\u001b[1Cset\u001b[1Cup:\r\u001b[2B \u001b[1mlobu.toml \u2014 Agent configuration\u001b[22m\u001b[K\r\u001b[1B\u001b[K\r\u001b[1B [agents.support-bot]\u001b[K\r\u001b[2C\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m59k\u001b[38;5;246m \u001b[38;5;34m29%\u001b[38;5;246m \u001b[2"] +[0.0, "o", "m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[20C\u001b[39m\u001b[K\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.134, "o", "\u001b[2D\u001b[7B\r\u001b[17C\u001b[5A\u001b[38;5;216m60\u001b[2C\u001b[38;5;34m30\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[9A\u001b[36mname\u001b[1C\u001b[39m=\u001b[1C\u001b[31m\"support-bot\"\r\u001b[1B\u001b[39m \u001b[36mdescription\u001b[39m = \u001b[31m\"\"\u001b[39m\u001b[K\r\u001b[1B \u001b[36mdir\u001b[1C\u001b[39m=\u001b[1C\u001b[31m\"./agents/support-bot\"\r\u001b[1B\u001b[39m\u001b[K\r\u001b[2C\u001b[1B[agents.support-bot.network]\u001b[K\r\u001b[2C\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[83C\u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m60k\u001b[38;5;246m \u001b[38;5;3"] +[0.0, "o", "4m30%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.162, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.101, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[9A\u001b[36mallowed\u001b[1C\u001b[39m=\u001b[1C[\u001b[31m\"registry.npmjs.org\"\u001b[39m,\u001b[1C\u001b[31m\".npmjs.org\"\u001b[39m,\u001b[1C\u001b[31m\"github.com\"\u001b[39m,\u001b[1C\u001b[31m\".github.com\"\u001b[39m,\r\u001b[1B \u001b[31m\".githubusercontent.com\"\u001b[39m, \u001b[31m\"cdn.jsdelivr.net\"\u001b[39m, \u001b[31m\"unpkg.com\"\u001b[39m, \u001b[31m\"pypi.org\"\u001b[39m, \u001b[31m\"files.pythonhosted.org\"\u001b[39m]\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m60k\u001b[38;5;246m \u001b[38;5;34m30%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177msupport-bot\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 2"] +[0.0, "o", "0, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[11C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.198, "o", "\u001b[2D\u001b[7B\r\u001b[8A \u001b[1mmodels/schema.yaml \u2014 Entities & watcher\u001b[22m\u001b[K\r\u001b[1B\u001b[K\r\u001b[1B \u001b[36mentities:\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[36mcustomer:\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[36mfields:\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[36memail:\u001b[39m\u001b[K\r\u001b[10C\u001b[1B\u001b[36mtype:\u001b[1C\u001b[31mstring\u001b[64C\u001b[39m\u001b[K\r\u001b[10C\u001b[1B\u001b[36mrequired:\u001b[1C\u001b[34mtrue\u001b[34C\u001b[39m\u001b[K\r\r\n\r\r\n\u001b[4C\u001b[36mticket:\u001b[39m\r\r\n\u001b[6C\u001b[36mfields:\u001b[39m\r\r\n\u001b[8C\u001b[36mtitle:\u001b[39m\r\r\n\u001b[10C\u001b[36mtype:\u001b[1C\u001b[31mstring\u001b[39m\r\r\n\u001b[10C\u001b[36mrequired:\u001b[1C\u001b[34mtrue\u001b[39m\r\r\n\u001b[8C\u001b[36mseverity:\u001b[39m\r\r\n\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m60k\u001b[38;5;246m \u001b[38;5;34m30%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.165, "o", "\u001b[2D\u001b[7B\r\u001b[10C\u001b[9A\u001b[36mtype:\u001b[1C\u001b[31mstring\r\u001b[1B\u001b[39m \u001b[36mrequired:\u001b[39m \u001b[34mfalse\u001b[39m\u001b[K\r\u001b[1B \u001b[5C\u001b[36mcustomer_email:\r\u001b[1B\u001b[39m \u001b[36mtype:\u001b[39m \u001b[31mstring\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[36mrequired:\u001b[39m \u001b[34mtrue\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[K\r\u001b[2C\u001b[1B\u001b[36mwatchers:\u001b[39m\u001b[K\r\u001b[4C\u001b[1B-\u001b[1C\u001b[36mname:\u001b[1C\u001b[31mextract_ticket_severity\u001b[51C\u001b[39m\u001b[K\r\u001b[6C\u001b[1B\u001b[36mon:\u001b[1C\u001b[31mticket.created\u001b[34C\u001b[39m\u001b[K\r\r\n\u001b[6C\u001b[36mactions:\u001b[39m\r\r\n\u001b[8C-\u001b[1C\u001b[36mtype:\u001b[1C\u001b[31mupdate_field\u001b[39m\r\r\n\u001b[10C\u001b[36mentity:\u001b[1C\u001b[31mticket\u001b[39m\r\r\n\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m60k\u001b[38;5;246m \u001b[38;5;34m30%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.276, "o", "\u001b[2D\u001b[7B\r\u001b[10C\u001b[9A\u001b[36mfield:\u001b[1C\u001b[31mseverity\r\u001b[1B\u001b[39m \u001b[36mvalue_source:\u001b[39m \u001b[31mllm\u001b[39m\u001b[K\r\u001b[1B \u001b[7C\u001b[36mprompt:\u001b[1C\u001b[31m|\r\u001b[1B\u001b[39m \u001b[31m Extract the severity level from this ticket title and description.\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[31m Return only one of: critical, high, medium, low\r\u001b[2C\u001b[1B\u001b[39m\u001b[K\r\u001b[2C\u001b[1B \u001b[36mTitle:\u001b[39m {{ \u001b[31mentity.title\u001b[39m }}\u001b[K\r\u001b[86C\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\r\r\n\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m60k\u001b[38;5;246m \u001b[38;5;34m30%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.221, "o", "\u001b]0;\u2802 Build Lobu support triage agent\u0007"] +[0.263, "o", "\u001b[2D\u001b[7B\r\u001b[8A \u001b[31mIf\u001b[39m \u001b[31mthe\u001b[39m \u001b[31mseverity\u001b[39m \u001b[31mcannot\u001b[39m \u001b[31mbe\u001b[39m \u001b[31mdetermined,\u001b[39m \u001b[31mdefault\u001b[39m \u001b[31mto\u001b[39m \u001b[31m\"medium\".\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[2B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[2C\u001b[1B\u001b[38;5;39mHaiku 4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m60k\u001b[38;5;246m \u001b[38;5;34m30%\u001b[38;5;246m \u001b[2m|\u001b[1C\u001b[22m\u001b[38;5;177msupport-bot\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets 11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets may 20, 8:00a.m.\u001b[17C\u001b[22m\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[38;5;211m\u23f5\u23f5 bypass permissions on\u001b[38;5;246m (shift+tab to cycle)\u001b[11C\u001b[39m\u001b[K\r\r\n\u001b[86C\u001b[38;5;"] +[0.0, "o", "246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.223, "o", "\u001b[2D\u001b[7B\r\u001b[8A \u001b[1mStatus:\u001b[22m \u2713 Validated successfully. HTTP-only, no external dependencies. The watcher will\u001b[K\r\u001b[1B automatically\u001b[1Ctrigger\u001b[1Con\u001b[1Cnew\u001b[1Ctickets\u001b[1Cand\u001b[1Cextract\u001b[1Cseverity\u001b[1Cusing\u001b[1CLLM.\u001b[1CReady\u001b[1Cto\u001b[1Crun\u001b[1Cwith\u001b[1C\u001b[38;5;153mlobu run\u001b[39m.\r\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;174m\u2736\u001b[1CFrosting\u2026 \u001b[38;5;246m(29s\u001b[1C\u00b7 \u2193\u001b[39m \u001b[38;5;246m2.3k tokens)\u001b[39m\u001b[K\r\u001b[2C\u001b[1B\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\u001b[1B\u001b[38;5;246m\u276f\u00a0\u001b[39m\u001b[7m \u001b[83C\u001b[27m\u001b[K\r\u001b[1B\u001b[38;5;244m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"] +[0.0, "o", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m\r\r\n\u001b[2C\u001b[38;5;39mHaiku\u001b[1C4.5\u001b[38;5;246m \u001b[38;5;216m\ud83e\udde0\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;216m60k\u001b[38;5;246m \u001b[38;5;34m30%\u001b[38;5;246m \u001b[2m|\u001b[22m \u001b[38;5;177msupport-bot\u001b[39m\r\r\n\u001b[2C\u001b[38;5;253mcurrent:\u001b[38;5;246m \u001b[38;5;216m58%\u001b[38;5;246m \u001b[2mresets\u001b[1C11:30p.m.\u001b[22m \u001b[2m|\u001b[22m \u001b[38;5;253mweekly:\u001b[38;5;246m \u001b[38;5;210m90%\u001b[38;5;246m \u001b[2mresets\u001b[1Cmay\u001b[1C20,\u001b[1C8:00a.m.\u001b[22m\u001b[39m\r\r\n\u001b[2C\u001b[38;5;211m\u23f5\u23f5\u001b[1Cbypass\u001b[1Cpermissions\u001b[1Con\u001b[38;5;246m (shift+tab\u001b[1Cto\u001b[1Ccycle)\u001b[39m\r\r\n\u001b[86C\u001b[38;5;246m60355\u001b[1Ctokens\u001b[39m\r\r\n\u001b[58C\u001b[38;5;211m1\u001b[1Cclaude.ai\u001b[1Cconnector\u001b[1Cunavailable\u001b[38;5;246m \u00b7\u001b[1C/mcp\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[0.053, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[10A\u001b[38;5;180mFrosting\u2026\u001b[2C\u001b[38;5;246mrunning stop\u001b[1Ch\u001b[1Cok \u00b7 29s \u00b7 \u2193\u001b[1C2.3k tokens)\r\u001b[88C\u001b[8B898\u001b[39m\r\r\n\r\n\u001b[2C\u001b[7A"] +[0.017, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.108, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273d\u001b[1CFrosting\u2026\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.212, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u273b\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.085, "o", "\u001b]0;\u2810 Build Lobu support triage agent\u0007"] +[0.019, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;174m\u2736\u001b[39m\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[0.016, "o", "\u001b]0;\u2733 Build Lobu support triage agent\u0007"] +[0.002, "o", "\u001b[2D\u001b[7B\r\u001b[10A\u001b[38;5;246m\u273b\u001b[1CSaut\u00e9ed for 29s\u001b[39m\u001b[K\r\u001b[3B\u276f\u00a0\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[2C\u001b[7A"] +[4.559, "o", "\u001b[2D\u001b[7B\r\u001b[2C\u001b[1A\u001b[38;5;246mtmux focus-events off \u00b7 add 'set -g focus-events on' to ~/.tmux.conf and reattach for focus\u001b[1Ctra\u2026\u001b[39m\r\r\n\u001b[2C\u001b[7A"] +[8.004, "o", "\u001b[2D\u001b[7B\u001b[2K\u001b[1A\u001b[2K\u001b[G\u001b[1A\r\u001b[86C\u001b[3A\u001b[38;5;246m60898 tokens\r\u001b[3B\u001b[39m\u001b[K\r\u001b[1B\u001b[K\r\u001b[1A\u001b[2C\u001b[5A"] +[0.5, "x", "0"] diff --git a/packages/landing/scripts/gen-landing-snippets.ts b/packages/landing/scripts/gen-landing-snippets.ts new file mode 100644 index 000000000..c92b4d221 --- /dev/null +++ b/packages/landing/scripts/gen-landing-snippets.ts @@ -0,0 +1,739 @@ +#!/usr/bin/env bun +/** + * Reads pinned files out of `examples/` and emits a flat JSON manifest the + * landing page imports at build time. + * + * Round 10 redesign — the page no longer has a global use-case pivot, so the + * manifest is no longer keyed by use case. Each primitive section instead + * shows ONE canonical example: + * + * connector -> examples/ecommerce/connectors/stripe-charges.connector.ts + * memorySchema -> examples/sales/models/schema.yaml (entities slice) + * watcher -> examples/sales/models/schema.yaml (watchers slice) + * reaction -> examples/sales/models/reactions/account-health-monitor.reaction.ts + * agentToml -> examples/sales/lobu.toml + * + * Plus a list of every `examples/*\/lobu.toml` for BrowseExamplesSection: + * + * examples -> [{ slug, label, description, githubUrl }] + * + * The skill snippet stays inline in LandingPage.tsx (set in round 9). + * + * Output: packages/landing/src/generated/landing-snippets.json + */ + +import { existsSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const examplesDir = resolve(__dirname, "../../../examples"); +const outFile = resolve(__dirname, "../src/generated/landing-snippets.json"); + +const PINNED = { + connector: { + slug: "ecommerce", + path: "connectors/stripe-charges.connector.ts", + }, + memorySchema: { slug: "sales", path: "models/schema.yaml" }, + watcher: { slug: "sales", path: "models/schema.yaml" }, + reaction: { + slug: "sales", + path: "models/reactions/account-health-monitor.reaction.ts", + }, + agentToml: { slug: "sales", path: "lobu.toml" }, + skill: { + slug: "office-bot", + path: "agents/food-ordering/skills/deliveroo-order/SKILL.md", + }, +} as const; + +const BUDGETS = { + agentToml: 12, + memorySchema: 22, + watcher: 16, + reaction: 50, + connector: 40, + skill: 26, +}; + +type Language = "toml" | "yaml" | "typescript" | "markdown"; + +type Snippet = { + code: string; + path: string; + githubUrl: string; + language: Language; +}; + +type ExampleEntry = { + slug: string; + label: string; + description: string | null; + githubUrl: string; +}; + +type LandingSnippets = { + connector: Snippet; + memorySchema: Snippet; + watcher: Snippet; + reaction: Snippet; + agentToml: Snippet; + skill: Snippet; + examples: ExampleEntry[]; +}; + +const GITHUB_FILE_BASE = "https://github.com/lobu-ai/lobu/blob/main/examples"; +const GITHUB_TREE_BASE = "https://github.com/lobu-ai/lobu/tree/main/examples"; + +function githubFileUrl(slug: string, relativePath: string): string { + return `${GITHUB_FILE_BASE}/${slug}/${relativePath}`; +} + +function githubTreeUrl(slug: string): string { + return `${GITHUB_TREE_BASE}/${slug}`; +} + +/* -------------------------------------------------------------------------- */ +/* TOML extraction */ +/* -------------------------------------------------------------------------- */ + +const TOML_AGENT_KEEP_KEYS = new Set(["name"]); +const TOML_PROVIDER_KEEP_KEYS = new Set(["id", "model", "key"]); +const TOML_MEMORY_KEEP_KEYS = new Set(["enabled", "org", "models", "data"]); + +function trimAgentToml(raw: string): string { + const lines = raw.split("\n"); + const out: string[] = []; + type Mode = "skip" | "agent" | "provider" | "memory"; + let mode: Mode = "skip"; + let providersSeen = false; + for (const line of lines) { + const sectionMatch = /^\s*\[\[?([\w.-]+)\]\]?\s*$/.exec(line); + if (sectionMatch) { + const name = sectionMatch[1]; + const isAgentTop = /^agents\.[\w-]+$/.test(name); + const isFirstProvider = + /^agents\.[\w-]+\.providers$/.test(name) && !providersSeen; + const isMemory = name === "memory"; + if (isAgentTop) mode = "agent"; + else if (isFirstProvider) { + mode = "provider"; + providersSeen = true; + } else if (isMemory) mode = "memory"; + else mode = "skip"; + if (mode !== "skip") out.push(line.trimEnd()); + continue; + } + if (mode === "skip") continue; + const kvMatch = /^\s*([A-Za-z_][\w-]*)\s*=/.exec(line); + if (!kvMatch) continue; + const key = kvMatch[1]; + const keep = + (mode === "agent" && TOML_AGENT_KEEP_KEYS.has(key)) || + (mode === "provider" && TOML_PROVIDER_KEEP_KEYS.has(key)) || + (mode === "memory" && TOML_MEMORY_KEEP_KEYS.has(key)); + if (keep) out.push(line.trimEnd()); + } + return collapseBlanks(out).join("\n"); +} + +/** Parse a full lobu.toml and pull the first agent name + description fields. */ +type TomlExampleMeta = { label: string | null; description: string | null }; + +function readExampleMeta(rawToml: string, slug: string): TomlExampleMeta { + const lines = rawToml.split("\n"); + type Mode = "none" | "agent" | "memory"; + let mode: Mode = "none"; + let agentName: string | null = null; + let agentDescription: string | null = null; + let memoryDescription: string | null = null; + for (const line of lines) { + const sectionMatch = /^\s*\[\[?([\w.-]+)\]\]?\s*$/.exec(line); + if (sectionMatch) { + const name = sectionMatch[1]; + if (/^agents\.[\w-]+$/.test(name) && mode === "none") mode = "agent"; + else if (name === "memory") mode = "memory"; + else if (mode !== "none") mode = "none"; + continue; + } + const kv = /^\s*([A-Za-z_][\w-]*)\s*=\s*"([^"]*)"\s*$/.exec(line); + if (!kv) continue; + const [, key, value] = kv; + if (mode === "agent" && key === "name" && !agentName) agentName = value; + if (mode === "agent" && key === "description" && !agentDescription) + agentDescription = value; + if (mode === "memory" && key === "description" && !memoryDescription) + memoryDescription = value; + } + const label = agentName ?? slug.charAt(0).toUpperCase() + slug.slice(1); + const description = memoryDescription ?? agentDescription ?? null; + return { label, description }; +} + +/* -------------------------------------------------------------------------- */ +/* YAML helpers */ +/* -------------------------------------------------------------------------- */ + +function extractYamlListItems( + raw: string, + topKey: string, + itemCount: number +): string[] { + const lines = raw.split("\n"); + let inSection = false; + let header: string | null = null; + const items: string[][] = []; + let current: string[] | null = null; + let baseIndent = -1; + + for (const line of lines) { + if (/^[A-Za-z_][\w-]*:/.test(line)) { + const key = line.split(":")[0]; + if (key === topKey) { + inSection = true; + header = line; + continue; + } + if (inSection) break; + } + if (!inSection) continue; + const dashMatch = /^(\s*)-\s/.exec(line); + if (dashMatch) { + if (baseIndent < 0) baseIndent = dashMatch[1].length; + if (dashMatch[1].length === baseIndent) { + if (current) items.push(current); + current = [line]; + continue; + } + } + if (current) { + const indent = line.match(/^\s*/)?.[0].length ?? 0; + if (line.trim() === "" || indent > baseIndent) current.push(line); + else break; + } + } + if (current) items.push(current); + if (!header) return []; + return [header, ...items.slice(0, itemCount).flat()]; +} + +/* -------------------------------------------------------------------------- */ +/* Memory (entity) compression */ +/* -------------------------------------------------------------------------- */ + +function compressEntities(yamlLines: string[]): string[] { + if (yamlLines.length === 0) return []; + const out: string[] = []; + let i = 0; + if (/^entities:/.test(yamlLines[0])) { + out.push("entities:"); + i++; + } + while (i < yamlLines.length && yamlLines[i].trim() === "") i++; + if (i >= yamlLines.length) return out; + + const firstLine = yamlLines[i]; + const dashMatch = /^(\s*)-\s/.exec(firstLine); + if (!dashMatch) return out; + const baseIndent = dashMatch[1].length; + const childIndent = baseIndent + 2; + const pad = " ".repeat(baseIndent); + const padChild = " ".repeat(childIndent); + + let slug = ""; + let name = ""; + const props: Array<{ key: string; type: string }> = []; + + let cursor = i; + const slugInline = /^\s*-\s*slug:\s*(.+)$/.exec(firstLine); + if (slugInline) slug = slugInline[1].trim(); + cursor++; + + let inProperties = false; + let currentPropName: string | null = null; + let currentPropType: string | null = null; + while (cursor < yamlLines.length) { + const ln = yamlLines[cursor]; + if (ln.trim() === "") { + cursor++; + continue; + } + const ind = ln.length - ln.trimStart().length; + if (ind <= baseIndent) break; + const trimmed = ln.trimStart(); + + if (ind === childIndent) { + if (trimmed.startsWith("slug:")) slug = trimmed.slice(5).trim(); + else if (trimmed.startsWith("name:")) name = trimmed.slice(5).trim(); + inProperties = false; + currentPropName = null; + currentPropType = null; + cursor++; + continue; + } + if (trimmed === "properties:" && ind === childIndent + 2) { + inProperties = true; + currentPropName = null; + currentPropType = null; + cursor++; + continue; + } + if (inProperties && ind === childIndent + 4) { + const m = /^([A-Za-z_][\w-]*)\s*:/.exec(trimmed); + if (m) { + if (currentPropName && currentPropType) + props.push({ key: currentPropName, type: currentPropType }); + currentPropName = m[1]; + currentPropType = "string"; + } + } else if (inProperties && currentPropName && trimmed.startsWith("type:")) { + currentPropType = trimmed.slice(5).trim(); + } + cursor++; + } + if (currentPropName && currentPropType) + props.push({ key: currentPropName, type: currentPropType }); + + out.push(`${pad}- slug: ${slug || "entity"}`); + if (name) out.push(`${padChild}name: ${name}`); + out.push(`${padChild}metadata_schema:`); + out.push(`${padChild} type: object`); + out.push(`${padChild} properties:`); + const shown = props.slice(0, 3); + for (const p of shown) + out.push(`${padChild} ${p.key}: { type: ${p.type} }`); + if (props.length > shown.length) + out.push(`${padChild} # ${props.length - shown.length} more…`); + return out; +} + +/* -------------------------------------------------------------------------- */ +/* Watcher compression */ +/* -------------------------------------------------------------------------- */ + +const WATCHER_KEEP_TOP_KEYS = new Set(["slug", "agent", "on", "schedule"]); + +function compressWatcher(yamlLines: string[]): string[] { + if (yamlLines.length === 0) return []; + const out: string[] = []; + if (/^watchers:/.test(yamlLines[0])) out.push("watchers:"); + let i = 1; + while (i < yamlLines.length && yamlLines[i].trim() === "") i++; + if (i >= yamlLines.length) return out; + + const firstLine = yamlLines[i]; + const dashMatch = /^(\s*)-\s/.exec(firstLine); + if (!dashMatch) return out; + const baseIndent = dashMatch[1].length; + const childIndent = baseIndent + 2; + const pad = " ".repeat(baseIndent); + const padChild = " ".repeat(childIndent); + + const fields: Record = {}; + let prompt = ""; + let extractionRequired: string[] = []; + + const slugInline = /^\s*-\s*slug:\s*(.+)$/.exec(firstLine); + if (slugInline) fields.slug = slugInline[1].trim(); + + let cursor = i + 1; + while (cursor < yamlLines.length) { + const ln = yamlLines[cursor]; + if (ln.trim() === "") { + cursor++; + continue; + } + const ind = ln.length - ln.trimStart().length; + if (ind <= baseIndent) break; + const trimmed = ln.trimStart(); + + if (ind === childIndent) { + const kv = /^([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(trimmed); + if (!kv) { + cursor++; + continue; + } + const [, key, value] = kv; + if (key === "prompt") { + if ( + value === "|" || + value === ">" || + value === "" || + value === "|-" || + value === ">-" + ) { + let k = cursor + 1; + while (k < yamlLines.length) { + const sub = yamlLines[k]; + if (sub.trim() === "") { + k++; + continue; + } + const subInd = sub.length - sub.trimStart().length; + if (subInd <= childIndent) break; + prompt = sub.trimStart(); + break; + } + while (k < yamlLines.length) { + const sub = yamlLines[k]; + if (sub.trim() === "") { + k++; + continue; + } + const subInd = sub.length - sub.trimStart().length; + if (subInd <= childIndent) break; + k++; + } + cursor = k; + continue; + } + prompt = value; + cursor++; + continue; + } + if (key === "extraction_schema") { + const schemaInd = childIndent + 2; + let k = cursor + 1; + let captured = false; + while (k < yamlLines.length) { + const sub = yamlLines[k]; + if (sub.trim() === "") { + k++; + continue; + } + const subInd = sub.length - sub.trimStart().length; + if (subInd <= childIndent) break; + if ( + !captured && + subInd === schemaInd && + sub.trimStart().startsWith("required:") + ) { + const sct = sub.trimStart(); + const inline = sct.slice("required:".length).trim(); + if (inline.startsWith("[") && inline.endsWith("]")) { + extractionRequired = inline + .slice(1, -1) + .split(",") + .map((s) => s.trim()) + .filter(Boolean); + captured = true; + k++; + continue; + } + k++; + while (k < yamlLines.length) { + const sub2 = yamlLines[k]; + if (sub2.trim() === "") { + k++; + continue; + } + const sub2Ind = sub2.length - sub2.trimStart().length; + const sub2Trim = sub2.trimStart(); + if (sub2Ind === schemaInd + 2 && sub2Trim.startsWith("- ")) { + extractionRequired.push(sub2Trim.slice(2).trim()); + k++; + continue; + } + break; + } + captured = true; + continue; + } + k++; + } + cursor = k; + continue; + } + if (WATCHER_KEEP_TOP_KEYS.has(key)) fields[key] = value; + } + cursor++; + } + + out.push(`${pad}- slug: ${fields.slug ?? "watcher"}`); + if (fields.agent) out.push(`${padChild}agent: ${fields.agent}`); + if (fields.on) out.push(`${padChild}on: ${fields.on}`); + if (fields.schedule) out.push(`${padChild}schedule: ${fields.schedule}`); + if (prompt) { + const compact = prompt.replace(/^["'`]?|["'`]?$/g, "").replace(/\s+/g, " "); + out.push(`${padChild}prompt: "${compact}"`); + } + out.push(`${padChild}extraction_schema:`); + out.push(`${padChild} type: object`); + if (extractionRequired.length > 0) { + out.push( + `${padChild} required: [${extractionRequired.slice(0, 5).join(", ")}${ + extractionRequired.length > 5 + ? `, …${extractionRequired.length - 5}` + : "" + }]` + ); + } + return out; +} + +/* -------------------------------------------------------------------------- */ +/* SKILL.md frontmatter extraction */ +/* -------------------------------------------------------------------------- */ + +/** + * Pull just the YAML frontmatter out of a SKILL.md (everything between the + * leading `---` and the next `---`). Then slim it so the landing snippet + * fits the right column without scrolling: + * + * - cap `network.allow` and `network.judge` lists at 2 entries each + * - collapse `judges.default: > … (multi-line block scalar)` into a single + * short bullet sentence that keeps the policy's essence + * - leave name + description + nixPackages untouched + */ +function trimSkillMarkdown(raw: string): string { + const lines = raw.split("\n"); + if (lines[0]?.trim() !== "---") return raw; + let end = -1; + for (let i = 1; i < lines.length; i++) { + if (lines[i].trim() === "---") { + end = i; + break; + } + } + if (end < 0) return raw; + const fm = lines.slice(0, end + 1); + + const out: string[] = []; + let i = 0; + while (i < fm.length) { + const line = fm[i]; + const trimmed = line.trimStart(); + + // network.allow / network.judge — cap children to 2 entries. + const listKey = /^(\s*)(allow|judge):\s*$/.exec(line); + if (listKey) { + const baseIndent = listKey[1].length; + out.push(line); + let kept = 0; + let total = 0; + let j = i + 1; + while (j < fm.length) { + const child = fm[j]; + const childTrim = child.trimStart(); + const childIndent = child.length - childTrim.length; + if (!childTrim.startsWith("- ") || childIndent <= baseIndent) break; + total++; + if (kept < 2) { + out.push(child); + kept++; + } + j++; + } + if (total > kept) { + out.push(`${" ".repeat(baseIndent + 2)}# …${total - kept} more`); + } + i = j; + continue; + } + + // judges.default: > … — collapse the block scalar to one essence line. + const blockScalar = /^(\s*)default:\s*[>|][+-]?\s*$/.exec(line); + if (blockScalar) { + const baseIndent = blockScalar[1].length; + out.push( + `${" ".repeat(baseIndent)}default: "Allow GET reads + basket mutations; DENY checkout, payment, profile changes. Fail closed if unclear."` + ); + let j = i + 1; + while (j < fm.length) { + const child = fm[j]; + if (child.trim() === "") { + j++; + continue; + } + const childIndent = child.length - child.trimStart().length; + if (childIndent <= baseIndent) break; + j++; + } + i = j; + continue; + } + + out.push(line); + i++; + } + return collapseBlanks(out).join("\n"); +} + +/* -------------------------------------------------------------------------- */ +/* Helpers */ +/* -------------------------------------------------------------------------- */ + +function collapseBlanks(lines: string[]): string[] { + const out: string[] = []; + let blank = false; + for (const line of lines) { + const isBlank = line.trim() === ""; + if (isBlank && blank) continue; + out.push(line); + blank = isBlank; + } + while (out.length > 0 && out[0].trim() === "") out.shift(); + while (out.length > 0 && out[out.length - 1].trim() === "") out.pop(); + return out; +} + +function snippetFrom( + slug: string, + absPath: string, + relativePath: string, + language: Language, + transform?: (raw: string) => string +): Snippet { + const raw = readFileSync(absPath, "utf-8"); + const code = (transform ? transform(raw) : raw).replace(/\s+$/, ""); + return { + code, + path: relativePath, + githubUrl: githubFileUrl(slug, relativePath), + language, + }; +} + +function warnOverBudget(label: string, lines: number, budget: number): void { + if (lines > budget) { + console.warn( + `gen-landing-snippets: ${label} is ${lines} lines — landing budget is ≤ ${budget}.` + ); + } +} + +/* -------------------------------------------------------------------------- */ +/* Main */ +/* -------------------------------------------------------------------------- */ + +function pinnedFile(slug: string, rel: string): string { + const p = resolve(examplesDir, slug, rel); + if (!existsSync(p)) throw new Error(`Missing pinned source ${p}`); + return p; +} + +function listExamples(): ExampleEntry[] { + const entries = readdirSync(examplesDir, { withFileTypes: true }); + const out: ExampleEntry[] = []; + for (const entry of entries) { + if (!entry.isDirectory()) continue; + const slug = entry.name; + const tomlPath = resolve(examplesDir, slug, "lobu.toml"); + if (!existsSync(tomlPath)) continue; + const raw = readFileSync(tomlPath, "utf-8"); + const { label, description } = readExampleMeta(raw, slug); + out.push({ + slug, + label: label ?? slug, + description, + githubUrl: githubTreeUrl(slug), + }); + } + out.sort((a, b) => a.slug.localeCompare(b.slug)); + return out; +} + +function build(): LandingSnippets { + const connector = snippetFrom( + PINNED.connector.slug, + pinnedFile(PINNED.connector.slug, PINNED.connector.path), + PINNED.connector.path, + "typescript" + ); + warnOverBudget( + `${PINNED.connector.slug}/${PINNED.connector.path}`, + connector.code.split("\n").length, + BUDGETS.connector + ); + + const memorySchema = snippetFrom( + PINNED.memorySchema.slug, + pinnedFile(PINNED.memorySchema.slug, PINNED.memorySchema.path), + PINNED.memorySchema.path, + "yaml", + (raw) => + collapseBlanks( + compressEntities(extractYamlListItems(raw, "entities", 1)) + ).join("\n") + ); + warnOverBudget( + `${PINNED.memorySchema.slug}/${PINNED.memorySchema.path} (entities)`, + memorySchema.code.split("\n").length, + BUDGETS.memorySchema + ); + + const watcher = snippetFrom( + PINNED.watcher.slug, + pinnedFile(PINNED.watcher.slug, PINNED.watcher.path), + PINNED.watcher.path, + "yaml", + (raw) => + collapseBlanks( + compressWatcher(extractYamlListItems(raw, "watchers", 1)) + ).join("\n") + ); + warnOverBudget( + `${PINNED.watcher.slug}/${PINNED.watcher.path} (watchers)`, + watcher.code.split("\n").length, + BUDGETS.watcher + ); + + const reaction = snippetFrom( + PINNED.reaction.slug, + pinnedFile(PINNED.reaction.slug, PINNED.reaction.path), + PINNED.reaction.path, + "typescript" + ); + warnOverBudget( + `${PINNED.reaction.slug}/${PINNED.reaction.path}`, + reaction.code.split("\n").length, + BUDGETS.reaction + ); + + const agentToml = snippetFrom( + PINNED.agentToml.slug, + pinnedFile(PINNED.agentToml.slug, PINNED.agentToml.path), + PINNED.agentToml.path, + "toml", + trimAgentToml + ); + warnOverBudget( + `${PINNED.agentToml.slug}/${PINNED.agentToml.path}`, + agentToml.code.split("\n").length, + BUDGETS.agentToml + ); + + const skill = snippetFrom( + PINNED.skill.slug, + pinnedFile(PINNED.skill.slug, PINNED.skill.path), + PINNED.skill.path, + "markdown", + trimSkillMarkdown + ); + warnOverBudget( + `${PINNED.skill.slug}/${PINNED.skill.path}`, + skill.code.split("\n").length, + BUDGETS.skill + ); + + return { + connector, + memorySchema, + watcher, + reaction, + agentToml, + skill, + examples: listExamples(), + }; +} + +function main() { + const out = build(); + writeFileSync(outFile, `${JSON.stringify(out, null, 2)}\n`, "utf-8"); + console.log( + `gen-landing-snippets: wrote 6 pinned snippets + ${out.examples.length} example entries to ${outFile}` + ); +} + +main(); diff --git a/packages/landing/src/components/ArchitectureDiagram.tsx b/packages/landing/src/components/ArchitectureDiagram.tsx index 72b202a41..2d61727ec 100644 --- a/packages/landing/src/components/ArchitectureDiagram.tsx +++ b/packages/landing/src/components/ArchitectureDiagram.tsx @@ -1,606 +1,590 @@ -import type { LandingUseCaseId } from "../use-case-definitions"; +// biome-ignore-all format: stays compact for the landing-page panel import { messagingChannels } from "./platforms"; -const gatewayLayer = { - label: "Lobu", - sublabel: "Control Plane", - features: [ - "Workers never see secrets", - "HTTP proxy with domain allowlist", - "MCP proxy with per-user OAuth", - "BYO provider keys (Anthropic etc.)", - ], -}; +/** + * Architecture diagram — layered stream story (NOT cycling pairs). + * + * ┌────────────┐ ┌────────────┐ ┌────────────┐ + * │ Connectors │ events │ Memory │ chat │ Agents │ + * │ (logos) │ ──────► │ events │ ──────► │ chat bots │ + * │ sdk pill │ │ ↓ cron·LLM│ read │ other │ + * │ │ │ entities │ ──────► │ agents │ + * │ │ │ (table) │ │ sdk pill │ + * └────────────┘ └────────────┘ └────────────┘ + * + * Continuous stream pulse in the `events` box telegraphs "live stream"; + * the entities widget renders as a small table grid to signal structured + * data rather than a freeform blob. + * Honors prefers-reduced-motion (drops animations entirely). + */ -const runtimeLayer = { - label: "OpenClaw Runtime", - sublabel: "per-user isolation", - features: [ - "One sandbox per user and channel", - "Subprocess isolation with just-bash virtual filesystems", - "systemd-run hardening on Linux production hosts", - "No direct internet access (gateway proxy only)", - "Nix reproducible environments", - "OpenTelemetry for observability", - ], -}; +/* -------------------------------------------------------------------------- */ +/* Connector brand glyphs (simpleicons-style paths, MIT) */ +/* -------------------------------------------------------------------------- */ -function Arrow() { +type Brand = { key: string; label: string; path: string }; + +const CONNECTOR_BRANDS: Brand[] = [ + { + key: "github", + label: "GitHub", + path: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12", + }, + { + key: "linear", + label: "Linear", + path: "M.403 13.795A12.131 12.131 0 0 0 10.203 23.6L.403 13.795zM.182 10.103l13.715 13.714a12.18 12.18 0 0 0 3.137-1.21L1.392 6.966a12.18 12.18 0 0 0-1.21 3.137zm3.135-5.836a12.16 12.16 0 0 1 1.51-1.84L21.572 19.17a12.137 12.137 0 0 1-1.84 1.51L3.317 4.267zM6.682 1.43A12.12 12.12 0 0 1 12 0c6.626 0 12 5.374 12 12 0 1.872-.428 3.643-1.193 5.22L6.682 1.43Z", + }, + { + key: "stripe", + label: "Stripe", + path: "M13.479 9.883c-1.626-.604-2.512-1.067-2.512-1.803 0-.622.511-.977 1.422-.977 1.668 0 3.379.642 4.558 1.22l.666-4.111c-.935-.446-2.847-1.177-5.49-1.177-1.87 0-3.425.489-4.536 1.401-1.155.954-1.757 2.334-1.757 4.005 0 3.027 1.847 4.328 4.855 5.42 1.937.696 2.587 1.192 2.587 1.954 0 .74-.629 1.158-1.77 1.158-1.396 0-3.741-.69-5.323-1.585L5.5 19.612c1.305.74 3.722 1.5 6.245 1.5 1.977 0 3.629-.464 4.752-1.358 1.262-.985 1.915-2.432 1.915-4.155 0-3.105-1.89-4.392-4.933-5.516z", + }, + { + key: "notion", + label: "Notion", + path: "M4.459 4.208c.746.606 1.026.56 2.428.466l13.215-.793c.28 0 .047-.28-.046-.326L17.86 1.968c-.42-.326-.981-.7-2.055-.607L3.01 2.295c-.466.046-.56.28-.374.466zm.793 3.08v13.904c0 .747.373 1.027 1.214.98l14.523-.84c.841-.046.935-.56.935-1.167V6.354c0-.606-.233-.933-.748-.887l-15.177.887c-.56.047-.747.327-.747.933zm14.337.745c.093.42 0 .84-.42.888l-.7.14v10.264c-.608.327-1.168.514-1.635.514-.748 0-.935-.234-1.495-.933l-4.577-7.186v6.952L12.21 19s0 .84-1.168.84l-3.222.186c-.093-.186 0-.653.327-.746l.84-.233V9.854L7.822 9.76c-.094-.42.14-1.026.793-1.073l3.456-.233 4.764 7.279v-6.44l-1.215-.139c-.093-.514.28-.887.747-.933zM1.936 1.035l13.31-.98c1.634-.14 2.055-.047 3.082.7l4.249 2.986c.7.513.934.653.934 1.213v16.378c0 1.026-.373 1.634-1.68 1.726l-15.458.934c-.98.047-1.448-.093-1.962-.747l-3.129-4.06c-.56-.747-.793-1.306-.793-1.96V2.667c0-.839.374-1.54 1.447-1.632z", + }, + { + key: "gmail", + label: "Gmail", + path: "M24 5.457v13.909c0 .904-.732 1.636-1.636 1.636h-3.819V11.73L12 16.64l-6.545-4.91v9.273H1.636A1.636 1.636 0 0 1 0 19.366V5.457c0-2.023 2.309-3.178 3.927-1.964L5.455 4.64 12 9.548l6.545-4.91 1.528-1.145C21.69 2.28 24 3.434 24 5.457z", + }, + { + key: "hubspot", + label: "HubSpot", + path: "M18.164 7.93V5.084a2.198 2.198 0 0 0 1.267-1.978v-.067A2.2 2.2 0 0 0 17.238.845h-.067a2.2 2.2 0 0 0-2.193 2.194v.067a2.198 2.198 0 0 0 1.267 1.978v2.846a6.215 6.215 0 0 0-2.964 1.305L5.42 3.183A2.482 2.482 0 1 0 .55 3.91c.005.351.085.696.235 1.013l7.736 6.018a6.226 6.226 0 0 0 .094 7.012l-2.354 2.353a2.014 2.014 0 0 0-.583-.092 2.025 2.025 0 1 0 2.024 2.025 2.015 2.015 0 0 0-.093-.584l2.328-2.329a6.243 6.243 0 1 0 8.232-9.396zm-.97 9.343a3.2 3.2 0 1 1 0-6.4 3.2 3.2 0 0 1 0 6.4z", + }, +]; + +function ConnectorGlyph({ brand, size = 22 }: { brand: Brand; size?: number }) { return ( -
      - {features.map((f) => ( -
    • - - {f} -
    • - ))} -
    +
    +
    + + +
    ); } -function PlatformColumn() { +function Header() { + // Eyebrow + heading + lede mirror Eyebrow / SectionHeading from + // LandingPage.tsx so the architecture block reads as a peer to the + // other landing sections rather than its own one-off treatment. return ( -
    +
    + Architecture +
    +

    + Stream events. Derive entities. Expose agents. +

    +

    - Messaging platforms + Connectors stream events into memory. Watchers derive typed entities. Agents read that memory or talk to users. +

    +
    + ); +} + +function DiagramBoard() { + return ( +
    + +
    +
    -
    - {messagingChannels.map((channel) => ( +
    + ); +} + +/* -------------------------------------------------------------------------- */ +/* Desktop board — three column layered story */ +/* -------------------------------------------------------------------------- */ + +function DesktopBoard() { + return ( +
    + + + + + +
    + ); +} + +function MobileBoard() { + return ( +
    + + + + + +
    + ); +} + +/* -------------------------------------------------------------------------- */ +/* Columns */ +/* -------------------------------------------------------------------------- */ + +function ConnectorsColumn() { + return ( + +
    + {CONNECTOR_BRANDS.map((b) => (
    - - {channel.renderIcon(14)} - -
    + +
    + ))} +
    + + + ); +} + +function MemoryColumn() { + return ( + +
    + + + +
    +
    + ); +} + +function AgentsColumn() { + return ( + +
    + +
    + {messagingChannels.map((c) => ( -
    + + +
    + {(["HTTP", "MCP", "SDK"] as const).map((p) => ( + - {channel.detail} -
    -
    + {p} + + ))}
    - ))} +
    + read memory programmatically +
    + +
    - -
    +
    ); } -const gatewayBadges = [ - { - label: "Secrets", - href: "/guides/security/", - icon: ( - - ), - }, - { - label: "Single Sign-On (IdP)", - href: null, - icon: ( - - ), - }, - { - label: "Skill Registry", - href: "/getting-started/skills/", - icon: ( - - ), - }, - { - label: "Traces", - href: "/guides/observability/", - icon: ( - - ), - }, - { - label: "Sandboxing", - href: "/guides/security/", - icon: ( - - ), - }, -]; +/* -------------------------------------------------------------------------- */ +/* Building blocks */ +/* -------------------------------------------------------------------------- */ -function GatewayColumn({ useCaseId }: { useCaseId?: LandingUseCaseId }) { +function ColumnCard({ + heading, + footer, + children, +}: { + heading: string; + footer: string; + children: preact.ComponentChildren; +}) { return ( -
    +
    - Bring your own agent + {heading}
    - - } - /> - +
    {children}
    -
    - {gatewayLayer.label} -
    -
    - {gatewayLayer.sublabel} -
    -
    - {gatewayBadges.map((badge) => { - const cls = - "inline-flex items-center gap-1 rounded-full px-2 py-0.5 transition-colors"; - const style = { - backgroundColor: "var(--color-page-surface-dim)", - border: "1px solid var(--color-page-border)", - color: "var(--color-page-text)", - }; - const inner = ( - <> - {badge.icon} - - {badge.label} - - - ); - return badge.href ? ( - - {inner} - - ) : ( -
    - {inner} -
    - ); - })} -
    + {footer}
    -
    ); } -function RuntimeColumn() { +function SdkPill({ label, caption }: { label: string; caption: string }) { return ( -
    -
    + + {label} + + - Equip your agent -
    - } - /> - -
    - {["User A", "User B", "User C"].map((user, i) => ( -
    -
    -
    - {runtimeLayer.label} -
    -
    - {user} -
    -
    - - isolated - -
    - ))} -
    - + {caption} +
    ); } -function MemoryIcon({ size = 12 }: { size?: number }) { - return ( - - ); -} - -function SkillsIcon({ size = 12 }: { size?: number }) { +function SubBlock({ + heading, + children, +}: { + heading: string; + children: preact.ComponentChildren; +}) { return ( - +
    +
    + {heading} +
    + {children} +
    ); } -function AttachmentPill({ - label, - href, - icon, -}: { - label: string; - href: string; - icon: JSX.Element; -}) { +/** + * Two stream boxes (events / entities). Pulse dots live inside as + * absolutely-positioned spans driven by pure CSS keyframes. The keyframes + * are gated by `@media (prefers-reduced-motion: reduce)` so reduced-motion + * sessions see a static frame. + */ +function StreamBox({ label }: { label: string }) { return ( - - {icon} - + {label} - - ); -} - -function DashedConnector() { - return ( - + +
    ); } -function ChatGPTIcon({ size = 12 }: { size?: number }) { +/** + * Entities widget — small table grid. Header row + 3 placeholder rows + * to signal "structured records, not freeform text". Cells use neutral + * monospace dashes/blocks so the table reads as a schema preview rather + * than fake data. Sits in the same box family as StreamBox. + */ +function EntitiesTable() { + const HEADERS = ["name", "type", "updated"] as const; + // Placeholder rows — labelled generically so the widget reads as a + // schema preview, not a snapshot of a real customer's data. + const ROWS: ReadonlyArray = [ + ["Customer A", "company", "2d"], + ["Customer B", "person", "5h"], + ["Customer C", "meeting", "1h"], + ]; return ( - +
    + + entities + + + table + +
    +
    +
    + {HEADERS.map((h) => ( + {h} + ))} +
    +
    + {ROWS.map((row, idx) => ( +
    + {row.map((cell, i) => ( + + {cell} + + ))} +
    + ))} +
    +
    +
    ); } -function ClaudeIcon({ size = 12 }: { size?: number }) { +function DerivationArrow() { return ( - +
    + + + cron · LLM + +
    ); } -function OpenClawIcon({ size = 12 }: { size?: number }) { +/** + * Inline horizontal arrow between desktop columns. With `split` the arrow + * branches into two labelled stubs (top: `chat`, bottom: `read`) for the + * watcher → agents transition. + */ +function ColumnArrow({ + label, + sublabel, + split = false, +}: { + label: string; + sublabel?: string; + split?: boolean; +}) { + if (split) { + return ( +
    +
    + + {label} + + +
    +
    + + {sublabel} + + +
    +
    + ); + } return ( - +
    + + {label} + + +
    ); } -function McpClientIcon({ size = 12 }: { size?: number }) { +function Arrow() { return ( -
    - {agents.map((agent) => ( - - - {agent.renderIcon(12)} - -
    -
    - {agent.label} -
    -
    - {agent.detail} -
    -
    -
    - ))} + ); } -export function ArchitectureDiagram({ - useCaseId, -}: { - useCaseId?: LandingUseCaseId; -} = {}) { +/** + * Pure-CSS pulse animation. Three small dots in the `events` box pulse on + * a stagger to telegraph "live stream". Reduced motion drops the keyframes + * and leaves the dots at a static rest opacity. + */ +function PulseStyles() { return ( -
    - - - - - -
    + ); } diff --git a/packages/landing/src/components/ArchitectureSection.tsx b/packages/landing/src/components/ArchitectureSection.tsx deleted file mode 100644 index 17dd3a6f6..000000000 --- a/packages/landing/src/components/ArchitectureSection.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import type { LandingUseCaseId } from "../use-case-definitions"; -import { ArchitectureDiagram } from "./ArchitectureDiagram"; - -export function ArchitectureSection(props: { - activeUseCaseId?: LandingUseCaseId; -}) { - return ( -
    -
    -
    -
    - Runs on your infrastructure -
    -

    - One gateway, isolated workers, no leaked secrets. -

    -

    - Lobu receives messages at the gateway, starts sandboxed worker - processes on demand, and proxies tools, memory, and credentials so - agents stay isolated from your real keys. -

    -
    - -
    -
    - -
    -
    -
    -
    - ); -} diff --git a/packages/landing/src/components/CodeBlock.tsx b/packages/landing/src/components/CodeBlock.tsx new file mode 100644 index 000000000..dc0dfdb79 --- /dev/null +++ b/packages/landing/src/components/CodeBlock.tsx @@ -0,0 +1,505 @@ +import type { ComponentChildren } from "preact"; + +export type CodeSnippet = { + code: string; + path: string; + githubUrl: string; + language: "toml" | "yaml" | "typescript" | "markdown"; +}; + +type CodeBlockProps = { + snippet: CodeSnippet; + /** Override the filename shown in the tab. Defaults to `snippet.path`. */ + tabLabel?: string; + /** Optional pill in the tab (e.g. "declarative", "reactive"). */ + badge?: string; + /** Extra footer text rendered next to the GitHub link. */ + footnote?: ComponentChildren; +}; + +type Token = { kind: TokenKind; text: string }; +type TokenKind = + | "plain" + | "comment" + | "string" + | "keyword" + | "key" + | "builtin" + | "punctuation"; + +const KIND_COLOR: Record = { + plain: "var(--color-landing-code-text)", + comment: "var(--color-landing-code-comment)", + string: "var(--color-landing-code-string)", + keyword: "var(--color-landing-code-keyword)", + key: "var(--color-landing-code-key)", + builtin: "var(--color-landing-code-builtin)", + punctuation: "var(--color-landing-code-comment)", +}; + +const TS_KEYWORDS = new Set([ + "import", + "from", + "export", + "default", + "class", + "extends", + "implements", + "interface", + "type", + "const", + "let", + "var", + "function", + "return", + "if", + "else", + "for", + "while", + "do", + "switch", + "case", + "break", + "continue", + "throw", + "try", + "catch", + "finally", + "await", + "async", + "yield", + "new", + "this", + "super", + "true", + "false", + "null", + "undefined", + "typeof", + "instanceof", + "in", + "of", + "as", + "void", +]); + +/** + * Render tokens, recombining lines so the calling `
    ` keeps each line as
    + * one element (needed so the optional truncation cleanly cuts on a line break).
    + */
    +function tokensToJsx(tokens: Token[]): ComponentChildren {
    +  return tokens.map((tok, i) => {
    +    if (tok.kind === "plain") {
    +      // Plain text — render as a raw string so React doesn't add wrappers.
    +      return tok.text;
    +    }
    +    return (
    +      
    +        {tok.text}
    +      
    +    );
    +  });
    +}
    +
    +/* -------------------------------------------------------------------------- */
    +/*  TOML tokenizer                                                            */
    +/* -------------------------------------------------------------------------- */
    +
    +function tokenizeToml(line: string): Token[] {
    +  const out: Token[] = [];
    +
    +  // Whole-line comment.
    +  const trimmed = line.trimStart();
    +  if (trimmed.startsWith("#")) {
    +    return [{ kind: "comment", text: line }];
    +  }
    +
    +  // Section header: [agents.foo] or [[agents.foo.providers]]
    +  const sectionMatch = /^(\s*)(\[\[?[^\]]+\]\]?)(.*)$/.exec(line);
    +  if (sectionMatch) {
    +    out.push({ kind: "plain", text: sectionMatch[1] });
    +    out.push({ kind: "keyword", text: sectionMatch[2] });
    +    if (sectionMatch[3]) {
    +      out.push(...tokenizeTomlInline(sectionMatch[3]));
    +    }
    +    return out;
    +  }
    +
    +  // key = value
    +  const kvMatch = /^(\s*)([A-Za-z_][\w.-]*)(\s*=\s*)(.*)$/.exec(line);
    +  if (kvMatch) {
    +    out.push({ kind: "plain", text: kvMatch[1] });
    +    out.push({ kind: "key", text: kvMatch[2] });
    +    out.push({ kind: "punctuation", text: kvMatch[3] });
    +    out.push(...tokenizeTomlInline(kvMatch[4]));
    +    return out;
    +  }
    +
    +  // Blank or array continuation — tokenize inline.
    +  return tokenizeTomlInline(line);
    +}
    +
    +function tokenizeTomlInline(rest: string): Token[] {
    +  const out: Token[] = [];
    +  let i = 0;
    +  while (i < rest.length) {
    +    const ch = rest[i];
    +    if (ch === "#") {
    +      out.push({ kind: "comment", text: rest.slice(i) });
    +      break;
    +    }
    +    if (ch === '"') {
    +      const end = findStringEnd(rest, i + 1, '"');
    +      out.push({ kind: "string", text: rest.slice(i, end + 1) });
    +      i = end + 1;
    +      continue;
    +    }
    +    if (ch === "'") {
    +      const end = findStringEnd(rest, i + 1, "'");
    +      out.push({ kind: "string", text: rest.slice(i, end + 1) });
    +      i = end + 1;
    +      continue;
    +    }
    +    // Numbers / booleans.
    +    const wordMatch = /^(true|false|-?[\d.]+)/.exec(rest.slice(i));
    +    if (wordMatch) {
    +      out.push({ kind: "keyword", text: wordMatch[0] });
    +      i += wordMatch[0].length;
    +      continue;
    +    }
    +    out.push({ kind: "plain", text: ch });
    +    i++;
    +  }
    +  return mergePlain(out);
    +}
    +
    +function findStringEnd(s: string, from: number, quote: string): number {
    +  for (let i = from; i < s.length; i++) {
    +    if (s[i] === "\\") {
    +      i++;
    +      continue;
    +    }
    +    if (s[i] === quote) return i;
    +  }
    +  return s.length - 1;
    +}
    +
    +/* -------------------------------------------------------------------------- */
    +/*  YAML tokenizer                                                            */
    +/* -------------------------------------------------------------------------- */
    +
    +function tokenizeYaml(line: string): Token[] {
    +  const trimmed = line.trimStart();
    +  if (trimmed.startsWith("#")) {
    +    return [{ kind: "comment", text: line }];
    +  }
    +  if (trimmed === "---") {
    +    return [{ kind: "punctuation", text: line }];
    +  }
    +
    +  // `- key: value` list-item-with-mapping
    +  const dashMapping = /^(\s*-\s+)([A-Za-z_][\w-]*)(\s*:)(.*)$/.exec(line);
    +  if (dashMapping) {
    +    return [
    +      { kind: "plain", text: dashMapping[1] },
    +      { kind: "key", text: dashMapping[2] },
    +      { kind: "punctuation", text: dashMapping[3] },
    +      ...tokenizeYamlInline(dashMapping[4]),
    +    ];
    +  }
    +
    +  // `key: value`
    +  const mapping = /^(\s*)([A-Za-z_][\w.-]*)(\s*:)(.*)$/.exec(line);
    +  if (mapping) {
    +    return [
    +      { kind: "plain", text: mapping[1] },
    +      { kind: "key", text: mapping[2] },
    +      { kind: "punctuation", text: mapping[3] },
    +      ...tokenizeYamlInline(mapping[4]),
    +    ];
    +  }
    +
    +  // `- value`
    +  const dashScalar = /^(\s*-\s+)(.*)$/.exec(line);
    +  if (dashScalar) {
    +    return [
    +      { kind: "plain", text: dashScalar[1] },
    +      ...tokenizeYamlInline(dashScalar[2]),
    +    ];
    +  }
    +  return tokenizeYamlInline(line);
    +}
    +
    +function tokenizeYamlInline(rest: string): Token[] {
    +  const out: Token[] = [];
    +  if (rest.length === 0) return out;
    +  let i = 0;
    +  // Leading whitespace preserved.
    +  while (i < rest.length && rest[i] === " ") {
    +    out.push({ kind: "plain", text: " " });
    +    i++;
    +  }
    +  while (i < rest.length) {
    +    const ch = rest[i];
    +    if (ch === "#") {
    +      out.push({ kind: "comment", text: rest.slice(i) });
    +      i = rest.length;
    +      break;
    +    }
    +    if (ch === '"') {
    +      const end = findStringEnd(rest, i + 1, '"');
    +      out.push({ kind: "string", text: rest.slice(i, end + 1) });
    +      i = end + 1;
    +      continue;
    +    }
    +    if (ch === "'") {
    +      const end = findStringEnd(rest, i + 1, "'");
    +      out.push({ kind: "string", text: rest.slice(i, end + 1) });
    +      i = end + 1;
    +      continue;
    +    }
    +    if (ch === "|" || ch === ">") {
    +      // YAML block scalar indicator.
    +      out.push({ kind: "keyword", text: ch });
    +      i++;
    +      continue;
    +    }
    +    // Word / scalar — break on whitespace, `,`, `]`, `}`.
    +    const remainder = rest.slice(i);
    +    const wordMatch = /^[^\s,\]}#]+/.exec(remainder);
    +    if (wordMatch) {
    +      const text = wordMatch[0];
    +      if (/^(true|false|null|~|-?\d+(\.\d+)?)$/.test(text)) {
    +        out.push({ kind: "keyword", text });
    +      } else {
    +        out.push({ kind: "string", text });
    +      }
    +      i += text.length;
    +      continue;
    +    }
    +    out.push({ kind: "plain", text: ch });
    +    i++;
    +  }
    +  return mergePlain(out);
    +}
    +
    +/* -------------------------------------------------------------------------- */
    +/*  TypeScript tokenizer (intentionally minimal)                              */
    +/* -------------------------------------------------------------------------- */
    +
    +function tokenizeTypescript(line: string): Token[] {
    +  const out: Token[] = [];
    +  let i = 0;
    +  while (i < line.length) {
    +    const ch = line[i];
    +    const rest = line.slice(i);
    +
    +    // Line comment.
    +    if (rest.startsWith("//")) {
    +      out.push({ kind: "comment", text: rest });
    +      break;
    +    }
    +    // String literal.
    +    if (ch === '"' || ch === "'" || ch === "`") {
    +      const end = findStringEnd(line, i + 1, ch);
    +      out.push({ kind: "string", text: line.slice(i, end + 1) });
    +      i = end + 1;
    +      continue;
    +    }
    +    // Number.
    +    if (/[\d]/.test(ch)) {
    +      const m = /^[\d._]+/.exec(rest);
    +      if (m) {
    +        out.push({ kind: "keyword", text: m[0] });
    +        i += m[0].length;
    +        continue;
    +      }
    +    }
    +    // Identifier / keyword.
    +    if (/[A-Za-z_$]/.test(ch)) {
    +      const m = /^[A-Za-z_$][\w$]*/.exec(rest);
    +      if (m) {
    +        const word = m[0];
    +        const next = line[i + word.length];
    +        if (TS_KEYWORDS.has(word)) {
    +          out.push({ kind: "keyword", text: word });
    +        } else if (
    +          /^[A-Z]/.test(word) ||
    +          next === "(" ||
    +          (next === ":" && line[i + word.length + 1] !== ":")
    +        ) {
    +          // Heuristics: PascalCase, function call, or `key:` object-literal
    +          // shape -> render as key/identifier accent.
    +          out.push({ kind: "key", text: word });
    +        } else {
    +          out.push({ kind: "plain", text: word });
    +        }
    +        i += word.length;
    +        continue;
    +      }
    +    }
    +    out.push({ kind: "plain", text: ch });
    +    i++;
    +  }
    +  return mergePlain(out);
    +}
    +
    +function mergePlain(tokens: Token[]): Token[] {
    +  const out: Token[] = [];
    +  for (const t of tokens) {
    +    const last = out[out.length - 1];
    +    if (last && last.kind === "plain" && t.kind === "plain") {
    +      last.text += t.text;
    +    } else {
    +      out.push({ ...t });
    +    }
    +  }
    +  return out;
    +}
    +
    +/* -------------------------------------------------------------------------- */
    +/*  Markdown tokenizer — frontmatter fence, frontmatter keys, ATX headings,   */
    +/*  and inline backtick code spans. Everything else falls through as plain.   */
    +/* -------------------------------------------------------------------------- */
    +
    +function tokenizeMarkdownFile(code: string): Token[][] {
    +  const lines = code.split("\n");
    +  let inFrontmatter = false;
    +  return lines.map((line, idx) => {
    +    if (line.trim() === "---") {
    +      // Open frontmatter on first `---`, close on second.
    +      if (idx === 0) {
    +        inFrontmatter = true;
    +        return [{ kind: "punctuation", text: line }];
    +      }
    +      if (inFrontmatter) {
    +        inFrontmatter = false;
    +        return [{ kind: "punctuation", text: line }];
    +      }
    +      return [{ kind: "punctuation", text: line }];
    +    }
    +    if (inFrontmatter) {
    +      // `key: value`
    +      const m = /^([A-Za-z_][\w-]*)(\s*:\s*)(.*)$/.exec(line);
    +      if (m) {
    +        return [
    +          { kind: "key", text: m[1] },
    +          { kind: "punctuation", text: m[2] },
    +          { kind: "string", text: m[3] },
    +        ];
    +      }
    +      return [{ kind: "plain", text: line }];
    +    }
    +    // ATX heading.
    +    const heading = /^(#{1,6})(\s+.*)$/.exec(line);
    +    if (heading) {
    +      return [
    +        { kind: "keyword", text: heading[1] },
    +        { kind: "key", text: heading[2] },
    +      ];
    +    }
    +    // Inline backtick code spans.
    +    if (line.includes("`")) {
    +      const out: Token[] = [];
    +      let i = 0;
    +      while (i < line.length) {
    +        const tick = line.indexOf("`", i);
    +        if (tick === -1) {
    +          out.push({ kind: "plain", text: line.slice(i) });
    +          break;
    +        }
    +        if (tick > i) out.push({ kind: "plain", text: line.slice(i, tick) });
    +        const end = line.indexOf("`", tick + 1);
    +        if (end === -1) {
    +          out.push({ kind: "plain", text: line.slice(tick) });
    +          break;
    +        }
    +        out.push({ kind: "string", text: line.slice(tick, end + 1) });
    +        i = end + 1;
    +      }
    +      return out;
    +    }
    +    return [{ kind: "plain", text: line }];
    +  });
    +}
    +
    +function highlight(code: string, language: CodeSnippet["language"]): Token[][] {
    +  if (language === "markdown") return tokenizeMarkdownFile(code);
    +  const tokenize =
    +    language === "toml"
    +      ? tokenizeToml
    +      : language === "yaml"
    +        ? tokenizeYaml
    +        : tokenizeTypescript;
    +  return code.split("\n").map((line) => tokenize(line));
    +}
    +
    +/* -------------------------------------------------------------------------- */
    +/*  Component                                                                 */
    +/* -------------------------------------------------------------------------- */
    +
    +export function CodeBlock({
    +  snippet,
    +  tabLabel,
    +  badge,
    +  footnote,
    +}: CodeBlockProps) {
    +  const lines = highlight(snippet.code, snippet.language);
    +
    +  return (
    +    
    +
    + {tabLabel ?? snippet.path} + {badge ? ( + + {badge} + + ) : null} +
    + +
    +        
    +          {lines.map((toks, idx) => (
    +            
    +              {tokensToJsx(toks)}
    +              {idx < lines.length - 1 ? "\n" : ""}
    +            
    +          ))}
    +        
    +      
    + +
    + {lines.length} lines + + {footnote} + + see on github → + + +
    +
    + ); +} diff --git a/packages/landing/src/components/FeatureBlock.tsx b/packages/landing/src/components/FeatureBlock.tsx deleted file mode 100644 index 2625f768c..000000000 --- a/packages/landing/src/components/FeatureBlock.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import type { ComponentChildren } from "preact"; - -type Props = { - eyebrow?: string; - title: string; - description: string; - ctaLabel?: string; - ctaHref?: string; - graphic: ComponentChildren; - reverse?: boolean; - showDottedBg?: boolean; -}; - -const ArrowRight = () => ( - -); - -export function FeatureBlock({ - eyebrow, - title, - description, - ctaLabel, - ctaHref, - graphic, - reverse, - showDottedBg = true, -}: Props) { - return ( -
    -
    -
    - {eyebrow ? ( -
    - {eyebrow} -
    - ) : null} -

    - {title} -

    -

    - {description} -

    - {ctaLabel && ctaHref ? ( - - {ctaLabel} - - - ) : null} -
    -
    - {graphic} -
    -
    -
    - ); -} diff --git a/packages/landing/src/components/FeatureGraphics.tsx b/packages/landing/src/components/FeatureGraphics.tsx deleted file mode 100644 index 442b3edbd..000000000 --- a/packages/landing/src/components/FeatureGraphics.tsx +++ /dev/null @@ -1,353 +0,0 @@ -function chatgptIcon(size = 12) { - return ( - - ); -} - -function claudeIcon(size = 12) { - return ( - - ); -} - -function cursorIcon(size = 12) { - return ( - - ); -} - -function openClawIcon(size = 12) { - return ( - - ); -} - -function ChipRow({ items }: { items: string[] }) { - return ( -
    - {items.map((label) => ( - - {label} - - ))} -
    - ); -} - -const memoryAgents = [ - { name: "ChatGPT", detail: "Agent", icon: "✦" }, - { name: "Claude", detail: "Agent", icon: "◇" }, - { name: "OpenClaw", detail: "Agent", icon: "⌘" }, -]; - -export function SharedMemoryGraphic() { - return ( - - ); -} - -function MemoryAgentCard({ - name, - detail, - icon, -}: { - name: string; - detail: string; - icon: string; -}) { - return ( -
    -
    - - - {name} - - - {detail} - -
    -
    - ); -} - -export function SkillsGraphic() { - const included = [ - { label: "Instructions", value: "Triage new issues" }, - { label: "Tools", value: "GitHub MCP + gh" }, - { label: "Network", value: "api.github.com" }, - { label: "Policy", value: "Approve comments" }, - ]; - - return ( -
    -
    -
    -
    - -
    -
    - GitHub triage skill -
    -
    - Packaged capability -
    -
    -
    - - Installed - -
    - -
    -

    - Give agents issue intake, owner routing, and safe GitHub actions in - one reusable bundle. -

    -
    - {included.map((item) => ( -
    -
    - {item.label} -
    -
    - {item.value} -
    -
    - ))} -
    -
    -
    - -
    - {[ - { icon: "📄", label: "Contract review" }, - { icon: "💬", label: "Support desk" }, - { icon: "📈", label: "Revenue research" }, - ].map((skill) => ( -
    - -
    - {skill.label} -
    -
    - ))} -
    -
    - ); -} diff --git a/packages/landing/src/components/HeroProductCard.tsx b/packages/landing/src/components/HeroProductCard.tsx deleted file mode 100644 index 6eb75dff7..000000000 --- a/packages/landing/src/components/HeroProductCard.tsx +++ /dev/null @@ -1,4274 +0,0 @@ -import type { ComponentChildren } from "preact"; -import { useState } from "preact/hooks"; -import type { - LandingUseCaseDefinition, - LandingUseCaseId, -} from "../use-case-definitions"; -import { landingUseCases } from "../use-case-definitions"; -import type { HeroStageId } from "./HeroSection"; - -const ENTITY_EMOJI_FALLBACKS: Record = { - // Core - Member: "👤", - Person: "👤", - Asset: "💼", - Subscription: "💳", - Topic: "🗂", - Trip: "✈️", - Decision: "✅", - Preference: "⚙️", - Document: "📄", - Report: "📊", - Post: "📝", - Task: "✅", - Order: "📦", - Transaction: "💸", - Match: "🔗", - // Legal - Contract: "📜", - Clause: "📑", - Risk: "⚠️", - Counterparty: "🏛", - // Engineering - Incident: "🚨", - PR: "🔧", - "Pull Request": "🔧", - Service: "🧩", - Deploy: "🚀", - Blocker: "⛔", - Milestone: "🚩", - // Support - Customer: "👥", - Issue: "🐞", - Ticket: "🎫", - Article: "📚", - // Sales - Lead: "🎯", - Account: "🏢", - Organization: "🏢", - Deal: "💰", - Opportunity: "✨", - Region: "🌍", - Team: "👥", - "Renewal Risk": "⏳", - Product: "📦", - // Finance / strategy - Owner: "🧑‍💼", - Initiative: "🧭", - Project: "📐", - Stakeholder: "🧑‍💻", - Invoice: "🧾", - Budget: "📊", - Vendor: "🛒", - Forecast: "📈", - Variance: "📉", - // Market / VC - Company: "🏢", - Founder: "🧑‍🚀", - "Fund Round": "💰", - Investor: "🏦", - "Job Posting": "📋", - Sector: "🏭", -}; - -function entityEmoji(label: string): string { - if (ENTITY_EMOJI_FALLBACKS[label]) return ENTITY_EMOJI_FALLBACKS[label]; - // try plural/singular variants - if (label.endsWith("s") && ENTITY_EMOJI_FALLBACKS[label.slice(0, -1)]) { - return ENTITY_EMOJI_FALLBACKS[label.slice(0, -1)]; - } - return "📄"; -} - -function pluralize(label: string): string { - if (label.endsWith("s")) return label; - if (label.endsWith("y")) { - const prev = label[label.length - 2]?.toLowerCase() ?? ""; - if (!"aeiou".includes(prev)) return `${label.slice(0, -1)}ies`; - } - return `${label}s`; -} - -function entityCountSeed(label: string): number { - let h = 0; - for (let i = 0; i < label.length; i++) h = (h * 31 + label.charCodeAt(i)) | 0; - return Math.abs(h % 900) + 24; -} - -function buildSidebarEntities( - useCase: LandingUseCaseDefinition -): EntityNavItem[] { - return useCase.model.entities.map((label, i) => ({ - label: pluralize(label), - emoji: entityEmoji(label), - count: entityCountSeed(label), - active: i === 0, - })); -} - -/* ------------------------------ data adapters ------------------------------ */ - -const TONE_BY_INDEX: Array<"amber" | "violet" | "green" | "muted"> = [ - "amber", - "violet", - "green", - "amber", - "violet", -]; -const RELATIVE_TIMES = ["Just now", "12m ago", "2h ago", "1d ago", "5d ago"]; - -function stripLabelPrefix(label: string): string { - const match = label.match(/^[A-Za-z][A-Za-z ]*?:\s*(.*)$/); - return match ? match[1] : label; -} - -type RecordRow = { - id: string; - name: string; - summary: string; - type: string; - typeTone: "amber" | "violet" | "green" | "muted"; - tag: string; - tagTone: "amber" | "violet" | "green" | "muted"; - updated: string; -}; - -function buildRecordRows(useCase: LandingUseCaseDefinition): RecordRow[] { - const children = useCase.memory.recordTree.children ?? []; - return children.map((child, i) => { - const tag = child.chips?.[0] ?? "memory"; - return { - id: child.id, - name: stripLabelPrefix(child.label), - summary: child.summary, - type: child.kind, - typeTone: TONE_BY_INDEX[i % TONE_BY_INDEX.length], - tag, - tagTone: TONE_BY_INDEX[(i + 2) % TONE_BY_INDEX.length], - updated: RELATIVE_TIMES[i % RELATIVE_TIMES.length], - }; - }); -} - -type ConnectorConnection = { - member: string; - email: string; - account: string; - lastSync: string; - status: "Active" | "Idle" | "Error"; -}; - -type ConnectorRow = { - id: string; - name: string; - description: string; - status: "Connected" | "Available"; - connections: ConnectorConnection[]; -}; - -const SAMPLE_MEMBERS: Array<{ name: string; email: string }> = [ - { name: "Albert Lund", email: "albert@runway.io" }, - { name: "Jenna Roberts", email: "jenna@flatfile.com" }, - { name: "David Chen", email: "david@modal.dev" }, - { name: "Marc Lopez", email: "marc@listen.ai" }, - { name: "Priya Shah", email: "priya@northstar.io" }, - { name: "Sam Park", email: "sam@greenleaf.app" }, -]; - -function synthAccount(name: string, label: string): string { - const slug = name.split(" ")[0]?.toLowerCase() ?? "user"; - const lower = label.toLowerCase(); - if (lower.includes("github")) return `@${slug}`; - if (lower.includes("slack") || lower.includes("teams")) - return "lobu-prod.workspace"; - if (lower.includes("linear")) return "lobu workspace"; - if (lower.includes("gmail")) return `${slug}@example.com`; - if (lower.includes("drive")) return `${slug} · Drive`; - if (lower.includes("upload")) return "Manual upload"; - if (lower.includes("research")) return `${slug} · API key`; - return `${slug}@lobu`; -} - -const SYNC_TIMES = ["Just now", "2m ago", "14m ago", "1h ago", "8m ago"]; - -function buildSampleConnections( - label: string, - count: number -): ConnectorConnection[] { - return SAMPLE_MEMBERS.slice(0, count).map((m, i) => ({ - member: m.name, - email: m.email, - account: synthAccount(m.name, label), - lastSync: SYNC_TIMES[i % SYNC_TIMES.length], - status: i === 2 ? "Idle" : "Active", - })); -} - -const BRAND_NAME_OVERRIDES: Record = { - github: "GitHub", - gitlab: "GitLab", - hubspot: "HubSpot", - salesforce: "Salesforce", - pagerduty: "PagerDuty", - zendesk: "Zendesk", - notion: "Notion", - linear: "Linear", - slack: "Slack", - gmail: "Gmail", - postgres: "Postgres", - datadog: "Datadog", - sentry: "Sentry", - stripe: "Stripe", - intercom: "Intercom", - jira: "Jira", -}; - -function brandName(slug: string): string { - const lower = slug.toLowerCase(); - return ( - BRAND_NAME_OVERRIDES[lower] ?? slug.charAt(0).toUpperCase() + slug.slice(1) - ); -} - -function buildConnectors(useCase: LandingUseCaseDefinition): ConnectorRow[] { - const connectStep = useCase.memory.howItWorks.find((s) => s.id === "connect"); - const chips = connectStep?.chips ?? []; - const domains = useCase.skills.allowedDomains ?? []; - const fromChips = chips.map((label, i) => { - const connections = - i < 2 ? buildSampleConnections(label, i === 0 ? 3 : 2) : []; - return { - id: `chip-${i}`, - name: label, - description: `${label} integration`, - status: (connections.length > 0 - ? "Connected" - : "Available") as ConnectorRow["status"], - connections, - }; - }); - const fromDomains = domains - .map((domain, i) => { - // Generated data uses both glob and leading-dot wildcards - // (*.example.com, .example.com) plus the bare host. Normalise all - // three shapes to the registrable hostname before slugging. - const host = domain.replace(/^\*\.|^api\.|^\./, ""); - const slug = host.split(".")[0]; - return { - id: `domain-${i}`, - slug, - name: brandName(slug), - description: host, - status: "Connected" as const, - connections: buildSampleConnections(slug, 1), - }; - }) - .filter((d) => d.slug.length > 0) - .slice(0, 3); - const seen = new Set(); - return [...fromChips, ...fromDomains].filter((c) => { - // Dedupe by brand key when the name resolves to one we know about - // (so 'github.com' and '.githubusercontent.com' collapse into a single - // GitHub row instead of GitHub + 'Githubusercontent'); otherwise fall - // back to a lowercase name match. - const brand = brandKey(c.name); - const key = brand ?? c.name.toLowerCase(); - if (!key) return false; - if (seen.has(key)) return false; - seen.add(key); - return true; - }); -} - -type WatcherRow = { - name: string; - entity: string; - agent: string; - status: "Active" | "Inactive"; - schedule: string; - last: string; -}; - -function buildWatcherRows(useCase: LandingUseCaseDefinition): WatcherRow[] { - const watcher = useCase.memory.watcher; - const primary = useCase.model.entities[0] ?? "Record"; - const second = useCase.model.entities[1] ?? primary; - const agentLabel = `${useCase.label} agent`; - return [ - { - name: watcher.name, - entity: primary, - agent: agentLabel, - status: "Active", - schedule: watcher.schedule, - last: "Just now", - }, - { - name: `${second} change tracker`, - entity: second, - agent: agentLabel, - status: "Active", - schedule: "every 30m", - last: "12m ago", - }, - { - name: `${primary} digest`, - entity: primary, - agent: agentLabel, - status: "Inactive", - schedule: "*/15 * * * *", - last: "—", - }, - ]; -} - -type AgentRow = { - name: string; - entryPoint: string; - skills: string[]; - status: "Active" | "Paused"; - last: string; -}; - -const ENTRY_POINT_OPTIONS = ["OpenClaw", "Slack", "ChatGPT", "Telegram"]; - -const FALLBACK_AGENT_SKILLS: Record = { - legal: ["contract-review", "clause-risk", "legal-memory"], - engineering: ["incident-triage", "github-prs", "deploy-watch"], - support: ["ticket-triage", "crm-lookup", "reply-drafts"], - finance: ["reconciliation", "stripe", "close-review"], - sales: ["account-research", "crm-sync", "renewal-risk"], - leadership: ["decision-brief", "risk-summary", "follow-ups"], - "agent-community": ["member-intros", "event-digest", "moderation"], - market: ["deal-research", "founder-signals", "portfolio-news"], -}; - -function buildAgentRows(useCase: LandingUseCaseDefinition): AgentRow[] { - const skills = useCase.skills.skills.length - ? useCase.skills.skills - : (FALLBACK_AGENT_SKILLS[useCase.id] ?? [ - useCase.skills.skillId, - "memory-sync", - "source-monitor", - ]); - const baseAgent = useCase.skills.agentId ?? `${useCase.id}-agent`; - const watcherName = useCase.memory.watcher.name; - return [ - { - name: baseAgent, - entryPoint: ENTRY_POINT_OPTIONS[0], - skills: skills.slice(0, 2), - status: "Active", - last: "Just now", - }, - { - name: watcherName, - entryPoint: ENTRY_POINT_OPTIONS[1], - skills: skills.slice(2, 4), - status: "Active", - last: "14m ago", - }, - { - name: `${useCase.label.toLowerCase()} digest`, - entryPoint: ENTRY_POINT_OPTIONS[2], - skills: skills.slice(0, 1), - status: "Paused", - last: "—", - }, - ]; -} - -type AgentInfo = { - identity: string; - mcpEndpoint: string; - primaryClient: string; -}; - -function buildAgentInfo(useCase: LandingUseCaseDefinition): AgentInfo { - return { - identity: useCase.agent.identity?.[0] ?? `${useCase.label} agent`, - mcpEndpoint: "https://lobu.ai/mcp", - primaryClient: "Claude", - }; -} - -type KnowledgeRow = { - id: string; - title: string; - type: string; - summary: string; - chips: string[]; - highlights: { label: string; value: string }[]; - occurredAt: string; -}; - -function buildKnowledgeRows(useCase: LandingUseCaseDefinition): KnowledgeRow[] { - const children = useCase.memory.recordTree.children ?? []; - const nodeHighlights = useCase.memory.nodeHighlights ?? {}; - return children.map((child, i) => ({ - id: child.id, - title: stripLabelPrefix(child.label), - type: child.kind, - summary: child.summary, - chips: child.chips ?? [], - highlights: nodeHighlights[child.id] ?? [], - occurredAt: RELATIVE_TIMES[i % RELATIVE_TIMES.length], - })); -} - -/* ------------------------------ icons ------------------------------ */ - -function SparklesIcon({ size = 14 }: { size?: number }) { - return ( - - ); -} - -function PencilIcon({ size = 12 }: { size?: number }) { - return ( - - ); -} - -function PlusIcon({ size = 14 }: { size?: number }) { - return ( - - ); -} - -function BotIcon({ size = 14 }: { size?: number }) { - return ( - - ); -} - -function WatchersIcon({ size = 14 }: { size?: number }) { - return ( - - ); -} - -function ChevronDownSmall() { - return ( - - ); -} - -function SearchIcon({ size = 13 }: { size?: number }) { - return ( - - ); -} - -/* ------------------------------ data ------------------------------ */ - -type EntityNavItem = { - label: string; - emoji: string; - count: number; - active?: boolean; -}; - -const DEFAULT_ENTITIES: EntityNavItem[] = [ - { label: "Members", emoji: "👤", count: 832, active: true }, - { label: "Assets", emoji: "💼", count: 2 }, - { label: "Subscriptions", emoji: "💳", count: 14 }, - { label: "Topics", emoji: "🗂", count: 38 }, - { label: "Trips", emoji: "✈️", count: 6 }, -]; - -/* ------------------------------ shell ------------------------------ */ - -type NavStage = "members" | "connectors" | "watchers" | "agents" | "knowledge"; -type Pill = "connections" | "home" | "agents"; - -function pillForStage(stage: NavStage): Pill { - if (stage === "connectors") return "connections"; - if (stage === "agents" || stage === "watchers") return "agents"; - return "home"; -} - -function LobuLeftWing({ size = 14 }: { size?: number }) { - return ( - - ); -} - -function LobuRightWing({ size = 14 }: { size?: number }) { - return ( - - ); -} - -function DatabaseIcon({ size = 14 }: { size?: number }) { - return ( - - ); -} - -function FingerprintIcon({ size = 12 }: { size?: number }) { - return ( - - ); -} - -function HardDriveIcon({ size = 12 }: { size?: number }) { - return ( - - ); -} - -function CableIcon({ size = 12 }: { size?: number }) { - return ( - - ); -} - -function RssIcon({ size = 12 }: { size?: number }) { - return ( - - ); -} - -function PillButton({ - active, - icon, - label, - onClick, -}: { - active: boolean; - icon: ComponentChildren; - label: string; - onClick?: () => void; -}) { - return ( - - ); -} - -function SearchPillButton({ badge }: { badge?: number }) { - return ( - - ); -} - -function PillRow({ - pill, - onPillChange, - inboxBadge, -}: { - pill: Pill; - onPillChange?: (next: Pill) => void; - inboxBadge?: number; -}) { - return ( -
    - } - label="Connectors" - onClick={() => onPillChange?.("connections")} - /> - } - label="Memory" - onClick={() => onPillChange?.("home")} - /> - } - label="Agents" - onClick={() => onPillChange?.("agents")} - /> -
    - -
    -
    - ); -} - -function SectionHeader({ - icon, - label, -}: { - icon: ComponentChildren; - label: string; -}) { - return ( -
    - {icon} - {label} -
    - ); -} - -function SidebarRow({ - active, - onClick, - leading, - label, - count, - muted, -}: { - active?: boolean; - onClick?: () => void; - leading: ComponentChildren; - label: string; - count?: number | string; - muted?: boolean; -}) { - return ( - - ); -} - -function StatusDot({ tone }: { tone: "green" | "amber" | "muted" }) { - const bg = - tone === "green" ? "#22c55e" : tone === "amber" ? "#f59e0b" : "#9ca3af"; - return ( -
    + +
    + ); +} + +function CopyIcon(props: { copied: boolean }) { + return props.copied ? ( + + ) : ( + + ); +} + +function GithubIcon() { + return ( + + ); +} + +/** + * Slot for the vendored asciinema-player. The script tag in + * BaseLayout.astro defines window.AsciinemaPlayer; we mount it into the + * container on first paint. If the cast 404s the container stays empty — + * the page never errors. + * + * Playback is gated so the cast doesn't start on its own. On every + * platform we show the player's "click to play" overlay, start a 5s + * timer, and call `player.play()` when it elapses. If the user clicks + * the play button before 5s, the player's `play` event fires and we + * cancel the timer so we don't fight with a manual play. + * + * The ref-callback captures the player instance and the listener / + * timer cleanup on `node.__lobuHeroCleanup` so a follow-up render (or + * unmount) can detach everything cleanly. + */ +function HeroAsciinema() { + // role="img" + aria-label give screen readers a single semantic anchor for + // the whole player. The visually-hidden

    sibling renders even when the + // asciinema player script fails to mount (JS error, blocked CDN, JS off), + // so assistive tech and no-JS visitors still get the gist of what plays. + // The asciinema mount target is a separate child

    so the player's + // DOM rewrites don't clobber the summary. + return ( + + } + code={ +
    + + +
    + } + /> + + ); +} + +function MemorySection() { + return ( + + + Memory + + An event-sourced database for AI agents. + +

    + Declare entity types in YAML. Lobu stores them as append-only + events with full audit. Multi-tenant by default — agents see only + their scope. +

    + + Entity types & relationships — declare what your + agent should remember; link entities with typed relations. + , + <> + Append-only — every change is a new event. Tombstones + supersede; nothing is destroyed. + , + <> + Agent-assisted modeling — paste the setup prompt into + Claude Code or Cursor; it interviews you and drafts{" "} + schema.yaml. + , + <> + Per-user / per-org isolation — your agents only see the + memory they're scoped to. + , + ]} + /> + + Read the memory guide + +
    + } + code={ +
    + + +
    + } + /> + + ); +} + +function WatchersSection() { + return ( + + + Watchers + + Turn events into memory. With prompts. + +

    + A watcher is a prompt +{" "} + extraction_schema. Lobu + runs the LLM, validates, and persists the output to memory.{" "} + No application code — fire on events, or run on cron. +

    + + Reactive — fires on the event stream (e.g.{" "} + + linear.issue.created + + ). + , + <> + Dreaming — runs on cron. Aggregates the previous day's + events into higher-level entities. + , + <> + No-code ETL — the prompt is your transformation; the + schema is your output type. + , + <> + Reactions are optional — drop in a{" "} + *.reaction.ts only + when you need imperative code on top. + , + <> + Auditable — every run lands as events in the durable + log. + , + ]} + /> + + Read the watchers guide + + + } + code={ +
    + +

    + When the watcher extracts data, this reaction runs: +

    + + +
    + } + /> +
    + ); +} + +/* -------------------------------------------------------------------------- */ +/* Skills section — snippet is the YAML frontmatter of the deliveroo-order */ +/* SKILL.md, trimmed at build time by gen-landing-snippets.ts (the example */ +/* that exercises every field the pitch promises: nixPackages, */ +/* network.allow, network.judge, judges.default). */ +/* -------------------------------------------------------------------------- */ + +function SkillsSection() { + return ( + + + Skills + + Bundle tools, packages, and policy into one drop-in. + +

    + A skill is a folder with a{" "} + SKILL.md. Drop it in{" "} + skills/ or{" "} + + agents/<id>/skills/ + + , lobu apply picks it + up. The agent gets instructions, tools, packages, and a per-domain + LLM egress policy in one shot. +

    + + Instructions — markdown describing when the agent + should use this skill. + , + <> + Tools — TypeScript functions the agent calls. + Auto-registered as MCP tools. + , + <> + Network — allowed domains + per-domain LLM egress judge + in YAML. + , + <> + Packages — Nix packages (git, jq, etc.) merged into the + worker env. + , + ]} + /> + + Read the skills guide + + + } + code={ +
    + +

    + Plus the markdown body — instructions for when and how the agent + should use this skill. +

    + +
    + } + /> +
    + ); +} + +function AgentsSection() { + return ( + + + Agents + One agent. Every chat surface. +

    + Declare your agent in{" "} + lobu.toml — provider, + model, skills. One config, every surface below. +

    + + Every chat surface — Slack, Telegram, Discord, Teams, + WhatsApp, HTTP, MCP. Same{" "} + lobu.toml. + , + <> + BYO model — Anthropic, OpenAI, Z.ai, OpenRouter, your + own. + , + <> + Per-user isolation — workers scoped by user/channel. + Secrets stay in the proxy. + , + <> + Durable & audited — every agent action is an event + in the log. + , + ]} + /> + + Read the agents guide + + + } + code={ +
    + + +
    + } + /> +
    + ); +} + +/* -------------------------------------------------------------------------- */ +/* Run anywhere */ +/* -------------------------------------------------------------------------- */ + +function RunAnywhereSection() { + const cards: Array<{ + eyebrow: string; + title: string; + body: preact.ComponentChildren; + code: preact.ComponentChildren; + }> = [ + { + eyebrow: "Local", + title: "Embedded, single process.", + body: ( + <> + Gateway, workers, memory, embeddings — all in one Node process. + Postgres is the only external. + + ), + code: ( + <> + ${" "} + lobu run{"\n"} + {" "} + gateway{" "} + :8787 + {"\n"} + {" "} + worker{" "} + + pid=<n> + + {"\n"} + {" "} + memory{" "} + + N entities + + {"\n"} + {" "} + watchers{" "} + + N armed + + + ), + }, + { + eyebrow: "Self-host", + title: "Docker. Helm. Your cloud.", + body: ( + <> + Helm chart and Dockerfiles in the repo ( + charts/lobu/,{" "} + docker/app/). Run on GCP, + AWS, Fly, Render, or bare metal. + + ), + code: ( + <> + + # Kubernetes + + {"\n"} + ${" "} + helm install lobu ./charts/lobu{"\n\n"} + + # Docker + + {"\n"} + ${" "} + docker build -f docker/app/Dockerfile . + + ), + }, + { + eyebrow: "Lobu Cloud", + title: "Managed runtime.", + body: ( + <> + Same code, run by Lobu. Per-user isolation, secret proxy, automatic + upgrades. + + ), + code: ( + <> + ${" "} + lobu apply{"\n"} + {" "} + org{" "} + + <your-org> + + {"\n"} + {" "} + region{" "} + + <your-region> + + {"\n"} + {" "} + agents{" "} + + N deployed + + {"\n"} + {" "} + gateway{" "} + + <your-org>.lobu.run + + + ), + }, + ]; + return ( + +
    + Run anywhere + + Local, your cloud, or Lobu Cloud. + +

    + Same lobu.toml +{" "} + models/ +{" "} + connectors/ +{" "} + agents/. One command to + boot embedded; Docker + Helm for self-hosting; Lobu Cloud when you + don't want to run it yourself. +

    +
    +
    + {cards.map((card) => ( +
    + {card.eyebrow} +

    + {card.title} +

    +

    + {card.body} +

    +
    +              {card.code}
    +            
    +
    + ))} +
    +
    ); } diff --git a/packages/landing/src/components/Nav.tsx b/packages/landing/src/components/Nav.tsx index ddf841cb0..c13a814a0 100644 --- a/packages/landing/src/components/Nav.tsx +++ b/packages/landing/src/components/Nav.tsx @@ -1,9 +1,6 @@ import { useEffect, useRef, useState } from "preact/hooks"; -import type { LandingUseCaseId } from "../use-case-definitions"; import { - getLobuBaseUrl, getLobuLoginUrl, - getLobuUrl, landingUseCaseGroupedOptions, } from "../use-case-showcases"; @@ -296,19 +293,12 @@ function MegaMenuTrigger({ type NavProps = { currentPath?: string; - startUseCaseId?: LandingUseCaseId; }; -export function Nav({ - currentPath: _currentPath = "/", - startUseCaseId, -}: NavProps) { +export function Nav({ currentPath: _currentPath = "/" }: NavProps) { const [openId, setOpenId] = useState(null); const solutions = buildSolutionsMenu(); const loginUrl = getLobuLoginUrl(); - const startUrl = startUseCaseId - ? getLobuUrl(startUseCaseId) - : getLobuBaseUrl(); useEffect(() => { function onKey(e: KeyboardEvent) { @@ -386,16 +376,6 @@ export function Nav({ > Sign in - - Start building - diff --git a/packages/landing/src/content/docs/getting-started/connector-sdk.md b/packages/landing/src/content/docs/getting-started/connector-sdk.md new file mode 100644 index 000000000..116c7f379 --- /dev/null +++ b/packages/landing/src/content/docs/getting-started/connector-sdk.md @@ -0,0 +1,330 @@ +--- +title: Connector SDK +description: Write TypeScript connectors that turn REST APIs, webhooks, and files into the Lobu event stream. +--- + +Connectors are how Lobu turns external systems — REST APIs, GraphQL, webhooks, files, OAuth-protected services — into the typed event stream that watchers shape into entities and memory. + +A connector is a TypeScript class that extends [`ConnectorRuntime`](/reference/connector-sdk/#connectorruntime) and ships three things: + +- a **`definition`** describing the connector (key, name, version, auth, feeds, actions), +- a **`sync(ctx)`** method that pulls the next slice of data and returns events, +- an optional **`execute(ctx)`** method that runs writes back to the source (create issue, send email). + +Sync runs are idempotent: each run returns a `checkpoint` (cursor, timestamp, ID set) that the next run reads back via `ctx.checkpoint`. + +## Install + +```bash +bun add @lobu/connector-sdk +# or +npm install @lobu/connector-sdk +# or +pnpm add @lobu/connector-sdk +``` + +The package is published from this repo and tracks the same release line as `@lobu/cli` and the gateway. + +## A typed connector, end to end + +The example below pulls issues from a GitHub repository, polls incrementally with a typed checkpoint, and emits one `EventEnvelope` per issue. Every field has a real type — no `as any` casts, no `// biome-ignore` directives. + +```ts +import { + ConnectorRuntime, + type ConnectorDefinition, + type EventEnvelope, + type SyncContext, + type SyncResult, +} from "@lobu/connector-sdk"; + +// User-supplied connection config (rendered as a form in the admin UI). +interface GitHubConfig { + owner: string; + repo: string; +} + +// The shape we persist between runs. Cursor-based pagination so re-runs +// only fetch issues updated after the last successful sync. +interface GitHubCheckpoint { + last_updated_at: string | null; +} + +// Minimal subset of the GitHub REST API issue payload we actually read. +interface GitHubIssue { + id: number; + number: number; + title: string; + body: string | null; + html_url: string; + updated_at: string; + user: { login: string } | null; +} + +// Tiny typed helper so we never reach into `ctx.checkpoint` raw. +function readCheckpoint(raw: SyncContext["checkpoint"]): GitHubCheckpoint { + const cp = (raw ?? {}) as Partial; + return { last_updated_at: cp.last_updated_at ?? null }; +} + +export default class GitHubIssuesConnector extends ConnectorRuntime { + readonly definition: ConnectorDefinition = { + key: "github-issues", + name: "GitHub issues", + version: "1.0.0", + // Personal access token is collected once per connection and stored + // encrypted; the worker only ever sees a `lobu_secret_` placeholder. + authSchema: { + methods: [ + { + type: "env_keys", + fields: [ + { key: "token", label: "GitHub PAT", secret: true, required: true }, + ], + }, + ], + }, + feeds: { + issues: { key: "issues", name: "Issues" }, + }, + }; + + async sync(ctx: SyncContext): Promise { + // For `env_keys` auth, the values land in `ctx.config` keyed by the + // `key` you declared on the auth field. OAuth tokens (for `oauth` auth) + // arrive on `ctx.credentials.accessToken` instead. + const config = ctx.config as unknown as GitHubConfig & { token?: string }; + const checkpoint = readCheckpoint(ctx.checkpoint); + const token = config.token ?? ""; + + // GitHub returns issues updated *at or after* `since`; we want + // strictly after, so we filter by id below. + const since = checkpoint.last_updated_at ?? "1970-01-01T00:00:00Z"; + const url = + `https://api.github.com/repos/${config.owner}/${config.repo}/issues` + + `?state=all&sort=updated&direction=asc&per_page=100&since=${since}`; + + const response = await fetch(url, { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/vnd.github+json", + }, + }); + if (!response.ok) { + throw new Error(`GitHub ${response.status}: ${await response.text()}`); + } + + const issues = (await response.json()) as GitHubIssue[]; + const fresh = issues.filter((i) => i.updated_at !== checkpoint.last_updated_at); + + const events: EventEnvelope[] = fresh.map((issue) => ({ + origin_id: String(issue.id), + origin_type: "issue", + title: `#${issue.number} ${issue.title}`, + payload_text: issue.body ?? "", + source_url: issue.html_url, + author_name: issue.user?.login, + occurred_at: new Date(issue.updated_at), + })); + + return { + events, + // Always advance the checkpoint to the newest `updated_at` we saw. + // If the page was empty, return the previous value verbatim so the + // next run is still idempotent. + checkpoint: { + last_updated_at: + fresh.at(-1)?.updated_at ?? checkpoint.last_updated_at, + } satisfies GitHubCheckpoint, + }; + } + + async execute(): Promise<{ success: false; error: string }> { + return { success: false, error: "github-issues is read-only" }; + } +} +``` + +A few things to notice: + +- **`SyncContext["checkpoint"]` is `Record | null`.** Wrap it once in a tiny typed reader (`readCheckpoint`) instead of casting at every call site. +- **`env_keys` credentials live on `ctx.config`, not `ctx.credentials`.** Lobu merges the values the user filled into the `env_keys` form into `ctx.config` under the keys you declared (`token` here). `ctx.credentials` is reserved for `oauth` auth — `accessToken`, `refreshToken`, `scope`, `expiresAt`. +- **The PAT is a `lobu_secret_` placeholder at runtime.** The gateway's secret proxy swaps it for the real value when the outbound HTTPS request leaves the worker, so the secret never lives in the worker's memory. +- **Pagination via the `since` query param.** The GitHub `Link` header is the alternative for cursor-style paging when you need to walk a stable, ordered list; `since` is simpler when the source already gives you a monotonic timestamp. + +Drop this file at `connectors/github-issues.connector.ts` in your Lobu project. `lobu apply` ships the source to the gateway, which compiles and registers it; from there each `feeds.` entry shows up as something a user can create a connection for in the admin UI. + +## Concepts + +### `ConnectorDefinition` + +The static metadata for your connector. Filed under `connector_definitions` in the gateway DB after `lobu apply`. + +| Field | Required | Description | +|------|----------|-------------| +| `key` | yes | Unique global key, e.g. `google.gmail`, `github-issues` | +| `name` | yes | Human-readable label | +| `version` | yes | Semver — bump to invalidate per-feed checkpoints if the event shape changes | +| `authSchema` | no | How users authenticate this connector (see below) | +| `feeds` | no | Map of feed key → `FeedDefinition` (a connector typically has one or more feeds) | +| `actions` | no | Map of action key → `ActionDefinition` (only needed if you also implement `execute`) | +| `requiredCapability` | no | When set, only worker pods/devices advertising this capability serve runs (e.g. `screentime` for the Mac app) | +| `runtime` | no | Pin to a device platform (iOS, macOS, …) — omit for cloud-side connectors | + +See the full type at [`reference/connector-sdk` › ConnectorDefinition](/reference/connector-sdk/#connectordefinition). + +### `SyncContext` + +What `sync()` receives. Every field is read-only. + +| Field | Description | +|------|-------------| +| `feedKey` | Which feed Lobu is asking you to run | +| `config` | The connection-level config the user filled in (typed by your `FeedDefinition.configSchema`) | +| `checkpoint` | The last successful run's checkpoint, or `null` on the first run | +| `credentials` | OAuth tokens (`accessToken`, `refreshToken`, …) for `oauth` auth; `null` for everything else. `env_keys` values land on `ctx.config` under the declared `key`. | +| `entityIds` | Entities this feed is linked to (rarely needed; useful for scoping the sync) | +| `sessionState` | Browser cookies / tokens captured by `lobu memory browser-auth` for `browser` auth | +| `emitEvents(events)` | Optional streaming hook — flush a chunk before the run ends | +| `updateCheckpoint(cp)` | Optional progress-checkpoint hook for long-running syncs | + +`SyncContext` does not currently expose generics for `config` / `checkpoint`. Declare your own interfaces and convert at the boundary, as the example above does with `readCheckpoint`. + +### `EventEnvelope` + +The shape of one event in the stream. Each envelope becomes a row in the `events` table. + +```ts +interface EventEnvelope { + origin_id: string; // platform's unique ID for this item + origin_type?: string; // source-native type (post, message, charge) + payload_text: string; // main content + payload_type?: "text" | "markdown" | "json_template" | "media" | "empty"; + title?: string; + author_name?: string; + source_url?: string; // permalink back to the original + occurred_at: Date; // when the event actually happened + semantic_type?: string; // content, note, summary, fact, etc. + score?: number; // 0-100 engagement / relevance + metadata?: Record; +} +``` + +Only `origin_id`, `payload_text`, and `occurred_at` are required. The full surface is documented in [`reference/connector-sdk` › EventEnvelope](/reference/connector-sdk/#eventenvelope). + +### `SyncResult` + +```ts +interface SyncResult { + events: EventEnvelope[]; + checkpoint: Record | null; + auth_update?: Record | null; + metadata?: { + items_found?: number; + items_skipped?: number; + [key: string]: unknown; + }; +} +``` + +Return `events: []` plus the same `checkpoint` you received on a no-new-data tick — runs stay idempotent. + +### `ActionContext` / `ActionResult` + +If your connector also writes back (e.g. `assign_issue`, `send_email`), declare an `actions` map on the definition and implement `execute(ctx)`: + +```ts +import type { ActionContext, ActionResult } from "@lobu/connector-sdk"; + +interface AssignIssueInput { + issueId: string; + assignee: string; +} + +async execute(ctx: ActionContext): Promise { + if (ctx.actionKey !== "assign_issue") { + return { success: false, error: `unknown action ${ctx.actionKey}` }; + } + const { issueId, assignee } = ctx.input as unknown as AssignIssueInput; + // Same `env_keys` field as sync() — execute()'s ctx.config carries it too. + const token = String((ctx.config as { token?: string }).token ?? ""); + + await fetch(`https://api.example.com/issues/${issueId}`, { + method: "PATCH", + headers: { Authorization: `Bearer ${token}` }, + body: JSON.stringify({ assignee }), + }); + return { success: true, output: { issueId, assignee } }; +} +``` + +Each `ActionDefinition` declares `requiresApproval: true | false` plus MCP-style `annotations` (`destructiveHint`, `idempotentHint`). The gateway routes high-risk actions through the approval queue before the worker runs them. + +## Auth models + +Declare on `definition.authSchema`. A connector can list multiple methods; the gateway lets the user pick. + +| `type` | Use when | +|--------|----------| +| `none` | Public endpoint, no credentials needed | +| `env_keys` | Static API keys (Stripe secret key, PAT) — fields rendered as form inputs, stored encrypted | +| `oauth` | Standard OAuth 2.0 — Lobu handles the dance, refresh, and per-user token isolation | +| `browser` | Session cookies captured via `lobu memory browser-auth` from a logged-in Chrome profile (or CDP) | +| `interactive` | Custom auth flow (QR pairing, OTP, signed device handshake) — implement `authenticate(ctx)` and stream `AuthArtifact`s | + +Workers never see the raw secret on the wire: the gateway's `secret-proxy` swaps `lobu_secret_` placeholders for real values at egress, so the string you pull from `ctx.config.` (env_keys) or `ctx.credentials.accessToken` (oauth) looks like a normal token from your code, but it's only resolved when the outbound request leaves the proxy. + +Full breakdown at [`reference/connector-sdk` › ConnectorAuthSchema](/reference/connector-sdk/#connectorauthschema). + +## Checkpoints + +The checkpoint is your bookmark. It's persisted on the `feeds` row after every successful sync and handed back as `ctx.checkpoint` on the next run. Three common shapes: + +```ts +// Timestamp cursor (GitHub `since`, Stripe `created[gt]`): +interface TimestampCheckpoint { + last_updated_at: string | null; +} + +// Page token (Google APIs): +interface PageTokenCheckpoint { + next_page_token: string | null; +} + +// Bounded ID set (idempotency, no native cursor): +interface IdSetCheckpoint { + seen_ids: string[]; +} +``` + +Rules of thumb: + +- **Always return a checkpoint**, even on the no-new-data case — return the previous one verbatim. Returning `null` tells the gateway to treat the next run as a fresh start. +- **Cap unbounded structures** (ID sets, in-flight queues) before persisting. Keep the last 1000 IDs — enough to dedupe across a sync window without bloating the row. +- **Long-running syncs** can call `ctx.updateCheckpoint(...)` mid-flight so a crash doesn't lose progress. + +## Where the file lives + +In your Lobu project, drop `*.connector.ts` files under `connectors/`: + +``` +my-agent/ +├── lobu.toml +├── connectors/ +│ ├── github-issues.connector.ts +│ └── stripe-charges.connector.ts +└── agents/my-agent/... +``` + +`lobu apply` discovers, type-checks, and ships them. Update the `version` field whenever the event shape changes so the gateway forces a fresh checkpoint. + +## See it in production + +- [`examples/ecommerce/connectors/stripe-charges.connector.ts`](https://github.com/lobu-ai/lobu/blob/main/examples/ecommerce/connectors/stripe-charges.connector.ts) — REST API, `env_keys` auth, timestamp checkpoint. +- [`examples/lobu-crm/connectors/funnel-form.connector.ts`](https://github.com/lobu-ai/lobu/blob/main/examples/lobu-crm/connectors/funnel-form.connector.ts) — small custom HTTP API, ID-set dedupe. + +## See also + +- [Reactions](/getting-started/reaction-sdk/) — the typed hook (part of this same package) for code that runs after watchers extract data. +- [`@lobu/connector-sdk` API reference](/reference/connector-sdk/) — every exported symbol with types. +- [Memory](/getting-started/memory/) — how connector events become durable entity memory. diff --git a/packages/landing/src/content/docs/getting-started/reaction-sdk.md b/packages/landing/src/content/docs/getting-started/reaction-sdk.md new file mode 100644 index 000000000..b73caec39 --- /dev/null +++ b/packages/landing/src/content/docs/getting-started/reaction-sdk.md @@ -0,0 +1,157 @@ +--- +title: Reactions +description: Run TypeScript code after a watcher extracts data — post to Slack, write derived events, update entities. +--- + +Reactions are part of [`@lobu/connector-sdk`](/reference/connector-sdk/) — they're the typed hook you write to take action *after* a watcher's LLM extraction completes (there is no separate `@lobu/reaction-sdk` npm package). The default watcher path is: LLM extracts data → Lobu validates against the schema → result is persisted to memory. Adding a reaction lets you do imperative work on top of that — post a Slack message, write a derived event, mutate an external system — before the run lands in the durable log. + +Reactions are optional. A watcher without one is pure extraction; a watcher with one is extraction + a typed hook. + +## Install + +The reaction surface ships inside `@lobu/connector-sdk`: + +```bash +bun add @lobu/connector-sdk +``` + +You only need the `ReactionContext` type at authoring time: + +```ts +import type { ReactionContext } from "@lobu/connector-sdk"; +``` + +The `client` runtime is injected by the Lobu sandbox at execution time — there's nothing to import for it. + +## A typed reaction, end to end + +A reaction is a default-exported async function. The runtime invokes it with `(ctx, client)` after a watcher window completes. + +The example below pairs with a `critical-detection` watcher whose `extraction_schema` produces a `CriticalDetection` payload. When the LLM flags severity `critical`, the reaction posts to a Slack incoming webhook and writes a derived `incident` event so dashboards have a stable row to count. + +```ts +import type { ReactionContext } from "@lobu/connector-sdk"; + +// The shape the watcher's `extraction_schema` produces. The schema lives +// in YAML; we mirror it as a TypeScript interface so the reaction is +// fully typed against the same contract. +interface CriticalDetection { + severity: "low" | "medium" | "high" | "critical"; + summary: string; + evidence_event_ids?: number[]; +} + +// Slack incoming webhook URL is provisioned per-org and surfaced to the +// reaction via the watcher's metadata bag. +interface ReactionParams { + slack_webhook_url?: string; +} + +export default async ( + ctx: ReactionContext, + client: { knowledge: { save: (input: Record) => Promise } }, + params?: ReactionParams, +): Promise => { + const detection = ctx.extracted_data as unknown as CriticalDetection; + if (detection.severity !== "critical") return; + + // 1. Notify Slack via the org's incoming webhook. + const webhook = params?.slack_webhook_url; + if (webhook) { + await fetch(webhook, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + text: `:rotating_light: *${ctx.watcher.name}* — ${detection.summary}`, + }), + }); + } + + // 2. Persist a derived `incident` event so the renewal-risk view and + // weekly digest have a queryable record without re-extracting. + await client.knowledge.save({ + entity_ids: ctx.entities.map((e) => e.id), + content: `[${detection.severity.toUpperCase()}] ${detection.summary}`, + semantic_type: "incident", + metadata: { + severity: detection.severity, + window_id: ctx.window.id, + evidence_event_ids: detection.evidence_event_ids ?? [], + }, + }); +}; +``` + +A few notes: + +- **The `client` argument is typed inline.** There is no exported `ClientSDK` type from `@lobu/connector-sdk` (the runtime shape lives in `packages/server/src/sandbox/client-sdk.ts`). Declare the subset you actually call — the example above pins just `client.knowledge.save` — and TypeScript will catch typos at the call site without any `as any`. +- **`ctx.extracted_data` is typed as `Record`** because the watcher's `extraction_schema` lives in YAML and TypeScript can't see it. Cast once to your interface at the top of the function and you're done. +- **Network calls follow the gateway's egress policy.** The Slack webhook host must be in the agent's `WORKER_ALLOWED_DOMAINS` (or routed through the egress judge) — see [Network](https://github.com/lobu-ai/lobu/blob/main/AGENTS.md#network). + +## `ReactionContext` + +The first argument. Read-only — every field comes from the watcher run that just completed. + +| Field | Type | Description | +|------|------|-------------| +| `extracted_data` | `Record` | The LLM's output, validated against the watcher's `extraction_schema`. Cast to a typed interface in your reaction. | +| `entities` | `ReactionEntity[]` | Every entity the watcher is attached to. Each has `id`, `name`, `entity_type`, and `metadata`. | +| `window` | object | The window that was just analyzed: `id`, `watcher_id`, `window_start`, `window_end`, `granularity`, `content_analyzed`. | +| `watcher` | object | Watcher identity: `id`, `slug`, `name`, `version`. Use `slug` for log lines you'll grep on. | +| `organization_id` | `string` | Org UUID. Useful when calling out to external systems that need org-scoping. | + +The full type is at [`reference/reaction-sdk` › ReactionContext](/reference/reaction-sdk/#reactioncontext). + +## The `client` runtime + +The second argument is a `ClientSDK` injected by the sandbox. The exact surface lives in `packages/server/src/sandbox/client-sdk.ts`. The most useful pieces for reactions: + +| API | What it does | +|-----|--------------| +| `client.knowledge.save({...})` | Append a new event to memory. Set `entity_ids` to attach to the right entities, `semantic_type` to classify it, `supersedes_event_id` to tombstone an earlier event. | +| `client.knowledge.search({...})` | Hybrid (vector + full-text) search across the org's events. Use for "have I seen this before?" checks before writing duplicates. | +| `client.knowledge.delete({...})` | Tombstone an event. Append-only: this writes a new superseding row, it never `DELETE`s. | +| `client.knowledge.read({...})` | Fetch a single event by id, or pull the events that were in the watcher's window. | + +For side effects on external systems (Slack, Linear, GitHub), call those APIs directly with `fetch` — credentials live in the connector's `auth_profile`, not on the reaction. + +The sandbox times reactions out, sandboxes their network access through the worker proxy (so the same `WORKER_ALLOWED_DOMAINS` rules apply), and captures stdout/stderr to the run log. + +## Where the file lives + +In your Lobu project, drop the reaction next to the watcher it pairs with: + +``` +my-agent/ +├── lobu.toml +├── models/ +│ ├── watchers/ +│ │ └── critical-detection.yaml +│ └── reactions/ +│ └── critical-detection.reaction.ts +└── agents/my-agent/... +``` + +**The filename is the pairing.** `critical-detection.reaction.ts` runs after the `critical-detection` watcher. No registry, no config block — the slug match is the wiring. + +If you don't want a reaction, don't create the file. The watcher's extraction still gets persisted; the reaction just doesn't fire. + +## When to reach for a reaction + +| Need | Reaction? | +|------|-----------| +| "Persist the LLM's output to memory" | No — the watcher already does that. | +| "Notify Slack when the LLM flags X" | Yes — `fetch` the Slack incoming webhook inside the reaction. | +| "Write a derived, denormalized event for fast querying" | Yes — `client.knowledge.save` with a distinct `semantic_type`. | +| "Mutate an external system based on extraction" | Yes — `fetch` the target API; the worker's egress policy still applies. | +| "Suppress some extractions" | Conditional `return;` early — no `save` call, no notification. Note the extraction itself still lands in the watcher window record. | + +## See it in production + +- [`examples/sales/models/reactions/account-health-monitor.reaction.ts`](https://github.com/lobu-ai/lobu/blob/main/examples/sales/models/reactions/account-health-monitor.reaction.ts) — filters worsening risk transitions out of a watcher's account-changes extraction and persists each one as a typed `health_change` event. + +## See also + +- [Connector SDK](/getting-started/connector-sdk/) — how external events arrive in the first place. +- [Reactions reference](/reference/reaction-sdk/) — every type a reaction can read, all exported from `@lobu/connector-sdk`. +- [Memory](/getting-started/memory/) — how reactions plug into the entity model. diff --git a/packages/landing/src/content/docs/platforms/rest-api.md b/packages/landing/src/content/docs/platforms/rest-api.md index 92b12a6fa..d6fd29db2 100644 --- a/packages/landing/src/content/docs/platforms/rest-api.md +++ b/packages/landing/src/content/docs/platforms/rest-api.md @@ -19,6 +19,11 @@ Browse all endpoints, try requests, and see response schemas in the [full API re The reference is auto-generated from the gateway's OpenAPI spec and always reflects the latest routes. +For TypeScript SDKs used inside Lobu projects rather than over the wire, see: + +- [`@lobu/connector-sdk`](/reference/connector-sdk/) — write connectors that emit events into the stream. +- [Reactions](/reference/reaction-sdk/) — the typed hook (part of `@lobu/connector-sdk`) for code that runs after a watcher extracts data. + ## Quick Start ```bash diff --git a/packages/landing/src/content/docs/reference/connector-sdk.md b/packages/landing/src/content/docs/reference/connector-sdk.md new file mode 100644 index 000000000..639258206 --- /dev/null +++ b/packages/landing/src/content/docs/reference/connector-sdk.md @@ -0,0 +1,530 @@ +--- +title: "@lobu/connector-sdk" +description: Type reference for the Connector SDK — ConnectorRuntime, ConnectorDefinition, EventEnvelope, and the sync/action/auth surface. +sidebar: + order: 5 +--- + +API reference for [`@lobu/connector-sdk`](https://www.npmjs.com/package/@lobu/connector-sdk). For a tutorial-style introduction see the [Connector SDK guide](/getting-started/connector-sdk/); for the reactions surface (also exported from this package) see the [Reactions reference](/reference/reaction-sdk/). + +Every symbol below is a re-export from the package's top-level entry point: + +```ts +import { + ConnectorRuntime, + type ConnectorDefinition, + type SyncContext, + type SyncResult, + type EventEnvelope, + type ActionContext, + type ActionResult, +} from "@lobu/connector-sdk"; +``` + +--- + +## `ConnectorRuntime` + +Abstract base class. Every connector extends it. + +```ts +abstract class ConnectorRuntime { + abstract readonly definition: ConnectorDefinition; + abstract sync(ctx: SyncContext): Promise; + abstract execute(ctx: ActionContext): Promise; + authenticate(ctx: AuthContext): Promise; // default throws +} +``` + +| Member | Required | Description | +|--------|----------|-------------| +| `definition` | yes | Static metadata: key, name, version, auth, feeds, actions. See [`ConnectorDefinition`](#connectordefinition). | +| `sync(ctx)` | yes | Pull data. Receives last checkpoint, returns events + new checkpoint. | +| `execute(ctx)` | yes | Run an action. Stub it with `{ success: false, error: "no actions" }` for read-only connectors. | +| `authenticate(ctx)` | no | Only required when `authSchema.methods` includes `{ type: "interactive" }`. Stream `AuthArtifact`s, await UI signals. | + +--- + +## `ConnectorDefinition` + +```ts +interface ConnectorDefinition { + key: string; // 'google.gmail' + name: string; + description?: string; + version: string; // semver + authSchema?: ConnectorAuthSchema; + feeds?: Record; + actions?: Record; + optionsSchema?: Record; // JSON Schema for global options + faviconDomain?: string; // e.g. 'x.com' + mcpConfig?: { upstreamUrl: string }; // proxy to an upstream MCP server + openapiConfig?: { // auto-generate from OpenAPI + specUrl: string; + includeOperations?: string[]; + excludeOperations?: string[]; + includeTags?: string[]; + serverUrl?: string; + }; + requiredCapability?: string; // e.g. 'screentime' (device-only) + runtime?: ConnectorRuntimeInfo; // pin to a device platform +} +``` + +### `ConnectorRuntimeInfo` + +```ts +interface ConnectorRuntimeInfo { + platforms: Array<"ios" | "android" | "macos" | "windows" | "linux">; + scopes?: string[]; // forwarded to the native platform adapter +} +``` + +Present only on device-bound connectors. Omit for cloud-fleet connectors. + +--- + +## `ConnectorAuthSchema` + +```ts +interface ConnectorAuthSchema { + methods: ConnectorAuthMethod[]; +} + +type ConnectorAuthMethod = + | ConnectorAuthNone + | ConnectorAuthEnvKeys + | ConnectorAuthOAuth + | ConnectorAuthBrowser + | ConnectorAuthInteractive; +``` + +### `ConnectorAuthNone` + +```ts +{ type: "none" } +``` + +### `ConnectorAuthEnvKeys` + +```ts +interface ConnectorAuthEnvKeys { + type: "env_keys"; + required?: boolean; + scope?: "connection" | "organization"; + fields: ConnectorAuthEnvField[]; + description?: string; +} + +interface ConnectorAuthEnvField { + key: string; + label?: string; + description?: string; + example?: string; + secret?: boolean; + required?: boolean; +} +``` + +### `ConnectorAuthOAuth` + +```ts +interface ConnectorAuthOAuth { + type: "oauth"; + provider: string; + requiredScopes: string[]; + optionalScopes?: string[]; + required?: boolean; + description?: string; + scope?: "connection" | "organization"; + authorizationUrl?: string; + tokenUrl?: string; + userinfoUrl?: string; + authParams?: Record; + tokenEndpointAuthMethod?: "client_secret_post" | "client_secret_basic" | "none"; + usePkce?: boolean; + loginScopes?: string[]; + clientIdKey?: string; + clientSecretKey?: string; + setupInstructions?: string; + loginProvisioning?: { autoCreateConnection?: boolean }; +} +``` + +### `ConnectorAuthBrowser` + +```ts +interface ConnectorAuthBrowser { + type: "browser"; + required?: boolean; + description?: string; + capture?: "cli" | "cdp"; // cli = lobu memory browser-auth; cdp = remote debug + requiredDomains?: string[]; + defaultCdpUrl?: string; // default: http://127.0.0.1:9222 +} +``` + +### `ConnectorAuthInteractive` + +```ts +interface ConnectorAuthInteractive { + type: "interactive"; + required?: boolean; + description?: string; + scope?: "connection" | "organization"; + expectedArtifact?: "qr" | "code" | "redirect" | "prompt" | "status"; + timeoutSec?: number; // default 300 +} +``` + +Connectors declaring this method must implement `authenticate(ctx)` and stream [`AuthArtifact`s](#authartifact). + +--- + +## `FeedDefinition` + +```ts +interface FeedDefinition { + key: string; + name: string; + description?: string; + requiredScopes?: string[]; // OAuth scopes that must be held + displayNameTemplate?: string; // "{subreddit} - {content_type}" + configSchema?: Record; // JSON Schema for per-feed config + userManaged?: boolean; // skip auto-wire creation + eventKinds?: Record; + entityLinks?: EntityLinkRule[]; // declarative entity wiring + }>; +} +``` + +### `EntityLinkRule` + +Declares how events emitted by a feed link to dimension entities. + +```ts +interface EntityLinkRule { + entityType: string; // target slug, e.g. "$member" + autoCreate?: boolean; + titlePath?: string; + identities: EntityIdentitySpec[]; + traits?: Record; +} + +interface EntityIdentitySpec { + namespace: string; // 'phone', 'email', or custom + eventPath: string; // dot path into the event + matchOnly?: boolean; +} + +interface EntityTraitSpec { + eventPath: string; + behavior: "init_only" | "prefer_non_empty" | "overwrite"; +} +``` + +### `EntityLinkOverride` + +Per-install override stored on `connector_definitions`: + +```ts +interface EntityLinkOverride { + disable?: boolean; + retargetEntityType?: string; + autoCreate?: boolean; + maskIdentities?: string[]; +} + +type EntityLinkOverrides = Record; +``` + +### `IDENTITY` constants + +Canonical namespaces for cross-connector identity. Use these when targeting `$member` so identities align automatically: + +```ts +const IDENTITY = { + PHONE: "phone", + EMAIL: "email", + WA_JID: "wa_jid", + SLACK_USER_ID: "slack_user_id", + GITHUB_LOGIN: "github_login", + GITHUB_USER_ID: "github_user_id", + GITHUB_REPO_ID: "github_repo_id", + GITHUB_REPO_FULL_NAME: "github_repo_full_name", + AUTH_USER_ID: "auth_user_id", + GOOGLE_CONTACT_ID: "google_contact_id", +} as const; + +type IdentityNamespace = (typeof IDENTITY)[keyof typeof IDENTITY]; +``` + +### `FeedMode` + +```ts +enum FeedMode { + sync = "sync", // connector code runs on a worker + virtual = "virtual", // backed by saved queries (future) +} +``` + +--- + +## `ActionDefinition` + +```ts +interface ActionDefinition { + key: string; + name: string; + description?: string; + requiresApproval: boolean; + annotations?: { + destructiveHint?: boolean; + openWorldHint?: boolean; + idempotentHint?: boolean; + }; + inputSchema?: Record; // JSON Schema + outputSchema?: Record; +} +``` + +--- + +## `SyncContext` + +```ts +interface SyncContext { + feedKey: string; + config: Record; + checkpoint: Record | null; + credentials: SyncCredentials | null; + entityIds: number[]; + sessionState?: Record | null; + emitEvents?: (events: EventEnvelope[]) => Promise; + updateCheckpoint?: (checkpoint: Record | null) => Promise; +} + +interface SyncCredentials { + provider: string; + accessToken: string; + refreshToken?: string | null; + expiresAt?: string | null; + scope?: string | null; +} +``` + +`emitEvents` and `updateCheckpoint` are present only on the long-running sync path. For short syncs return the full result and ignore both hooks. + +**Where credentials land.** `ctx.credentials` is populated only for `oauth` auth (the gateway hands you the resolved `SyncCredentials`). For `env_keys` auth, the values the user filled into the form are merged into `ctx.config` under the keys you declared on each `ConnectorAuthEnvField`. For `browser` auth, captured cookies arrive on `ctx.sessionState`. For `none`, all three are `null`/empty. Same rules apply to `ActionContext`. + +--- + +## `SyncResult` + +```ts +interface SyncResult { + events: EventEnvelope[]; + checkpoint: Record | null; + auth_update?: Record | null; + metadata?: { + items_found?: number; + items_skipped?: number; + [key: string]: unknown; + }; +} +``` + +`auth_update` is for connectors whose credentials rotate during sync (browser cookies, opaque session tokens). The gateway persists it back onto the linked auth profile. + +--- + +## `EventEnvelope` + +The output shape of every connector-emitted event. Each envelope becomes a row in `events`. + +```ts +interface EventEnvelope { + origin_id: string; // required: platform's unique ID + origin_type?: string; // source-native item type + payload_type?: "text" | "markdown" | "json_template" | "media" | "empty"; + payload_text: string; // required: main content + payload_data?: Record; // structured data + payload_template?: Record | null; + attachments?: unknown[]; + title?: string; + author_name?: string; + source_url?: string; + occurred_at: Date; // required: when it happened + semantic_type?: string; // content/note/summary/fact/… + score?: number; // 0-100 engagement + origin_parent_id?: string; // hierarchical content + metadata?: Record; + embedding?: number[]; // pre-computed +} +``` + +--- + +## `ActionContext` / `ActionResult` + +```ts +interface ActionContext { + actionKey: string; + input: Record; + credentials: SyncCredentials | null; + config: Record; +} + +interface ActionResult { + success: boolean; + output?: Record; + error?: string; +} +``` + +--- + +## `AuthContext` / `AuthArtifact` / `AuthResult` + +For connectors with `{ type: "interactive" }` auth. + +```ts +interface AuthContext { + config: Record; + previousCredentials: Record | null; + emit: (artifact: AuthArtifact) => Promise; + awaitSignal: ( + name: string, + options?: { timeoutMs?: number } + ) => Promise>; + signal: AbortSignal; +} + +type AuthArtifact = + | { type: "qr"; value: string; expiresAt?: string; instructions?: string } + | { type: "code"; value: string; expiresAt?: string; instructions?: string } + | { + type: "redirect"; + url: string; + mode: "popup" | "same-tab"; + awaitSignal: string; + instructions?: string; + } + | { + type: "prompt"; + fields: Array<{ + key: string; + label: string; + kind: "text" | "password" | "otp"; + required?: boolean; + }>; + submitSignal: string; + instructions?: string; + } + | { type: "status"; message: string }; + +interface AuthResult { + credentials: Record; + metadata?: { + account_id?: string; + display_name?: string; + expires_at?: string; + [key: string]: unknown; + }; +} +``` + +`ctx.emit(artifact)` streams the next thing the UI should show. Each emit replaces the previously active artifact. Pause on `ctx.awaitSignal("name")` until the UI POSTs the matching signal. + +--- + +## `Connection` / `Feed` / `Run` + +DB-backed types the runtime hands you in admin contexts. Reads only — connectors never write these. + +```ts +interface Connection { + id: number; + organizationId: string; + connectorKey: string; + displayName?: string; + status: "active" | "paused" | "error" | "revoked"; + accountId?: string; + credentials?: Record; + entityIds?: number[]; + config?: Record; + errorMessage?: string; + createdBy?: string; + createdAt: Date; + updatedAt: Date; +} + +interface Feed { + id: number; + organizationId: string; + connectionId: number; + feedKey: string; + status: "active" | "paused" | "error"; + entityIds?: number[]; + config?: Record; + checkpoint?: Record; + syncIntervalMs?: number; + nextSyncAt?: Date; + lastSyncAt?: Date; + lastSyncStatus?: string; + lastError?: string; + consecutiveFailures: number; + itemsCollected: number; + createdAt: Date; + updatedAt: Date; +} + +type RunType = "sync" | "action" | "code" | "watcher" | "auth"; +type RunStatus = "pending" | "running" | "completed" | "failed" | "cancelled" | "timeout"; +type ApprovalStatus = "pending" | "approved" | "rejected" | "auto"; + +interface Run { + id: number; + organizationId: string; + runType: RunType; + feedId?: number; + connectionId?: number; + actionKey?: string; + actionInput?: Record; + actionOutput?: Record; + approvalStatus: ApprovalStatus; + status: RunStatus; + claimedBy?: string; + claimedAt?: Date; + lastHeartbeatAt?: Date; + completedAt?: Date; + connectorKey?: string; + connectorVersion?: string; + checkpoint?: Record; + itemsCollected: number; + errorMessage?: string; + createdAt: Date; +} +``` + +--- + +## Helpers + +The package also re-exports a few utilities so connectors share one implementation: + +| Export | Purpose | +|--------|---------| +| `ky`, `HTTPError`, `KyInstance`, `Options` | Shared HTTP client. | +| `withHttpRetry(fn, opts?)` | Retry-with-backoff wrapper for transient HTTP failures. | +| `calculateEngagementScore(signals)` | Maps raw engagement metrics into a normalised 0–100 `score`. | +| `Type`, `Static` | Re-exported TypeBox builders for `configSchema` / `inputSchema` / `outputSchema`. | +| `sdkLogger` (alias `logger`) | Connector-scoped logger; output is captured by the run record. | +| `normalizeEmail`, `normalizePhone`, `normalizeGithubLogin`, … | Identifier normalisers — call these before populating `EntityIdentitySpec` paths. | +| `SOURCE_NATIVE_EVENT_TYPES`, `isSourceNativeEventType` | The canonical event-type taxonomy. | +| `WATCHER_TIME_GRANULARITIES`, `alignToWatcherWindowStart`, … | Time helpers used by watcher scheduling. | +| Browser SDK: `acquireBrowser`, `launchBrowser`, `launchStealthBrowser`, `CdpPage`, `browserNetworkSync`, etc. | Headless / CDP / stealth browser primitives for `browser` and `cdp` capture. | + +See the [source on GitHub](https://github.com/lobu-ai/lobu/tree/main/packages/connector-sdk/src) for the full helper surface. diff --git a/packages/landing/src/content/docs/reference/reaction-sdk.md b/packages/landing/src/content/docs/reference/reaction-sdk.md new file mode 100644 index 000000000..dad17d9ae --- /dev/null +++ b/packages/landing/src/content/docs/reference/reaction-sdk.md @@ -0,0 +1,154 @@ +--- +title: Reactions +description: Type reference for reactions — ReactionContext, ReactionEntity, and the injected client SDK surface, all from @lobu/connector-sdk. +sidebar: + order: 6 +--- + +API reference for the **reactions** surface of [`@lobu/connector-sdk`](/reference/connector-sdk/). Reactions are TypeScript files that run after a watcher's extraction lands; for a tutorial-style introduction see the [Reactions guide](/getting-started/reaction-sdk/). + +All reaction types live in `@lobu/connector-sdk` — there is no separate `@lobu/reaction-sdk` package on npm. Import them by name: + +```ts +import type { ReactionContext, ReactionEntity } from "@lobu/connector-sdk"; +``` + +The matching `client` runtime is injected by the Lobu sandbox at execution time. It is **not importable** — its shape lives in `packages/server/src/sandbox/client-sdk.ts` and only the context types are shared across packages. + +--- + +## Reaction signature + +A reaction file default-exports an async function: + +```ts +import type { ReactionContext } from "@lobu/connector-sdk"; + +// Declare the subset of the injected ClientSDK your reaction touches. +// `@lobu/connector-sdk` doesn't export `ClientSDK` (the implementation +// lives in the server package), so pin only what you call. +interface ReactionClient { + knowledge: { + save(input: { + entity_ids?: number[]; + content: string; + semantic_type: string; + title?: string; + metadata?: Record; + }): Promise; + }; +} + +export default async ( + ctx: ReactionContext, + client: ReactionClient, + params?: Record, +): Promise => { + // … +}; +``` + +| Argument | Description | +|----------|-------------| +| `ctx` | The watcher-window context — extraction output, attached entities, window metadata. | +| `client` | The `ClientSDK` instance injected by the sandbox. Use `client.knowledge.*` for memory reads/writes; use `fetch` for outbound HTTP. | +| `params` | Optional bag of reaction-specific parameters (rare — most reactions ignore this). | + +Throwing fails the reaction run; the error is surfaced to the watcher run log. Returning `void` is success — there is no need to return the saved-event ID. + +--- + +## `ReactionContext` + +```ts +interface ReactionContext { + /** The extracted analysis data from the completed window */ + extracted_data: Record; + + /** All entities the watcher is attached to */ + entities: ReactionEntity[]; + + /** The window that was just completed */ + window: { + id: number; + watcher_id: number; + window_start: string; + window_end: string; + granularity: string; + content_analyzed: number; + }; + + /** Watcher identity */ + watcher: { + id: number; + slug: string; + name: string; + version: number; + }; + + /** Organization context */ + organization_id: string; +} +``` + +| Field | Notes | +|-------|-------| +| `extracted_data` | The LLM's output, already validated against the watcher's `extraction_schema`. Cast to a concrete interface — TypeScript can't infer it for you, since the schema is YAML-defined. | +| `entities` | Every entity the watcher is attached to. Common pattern: `entity_ids: ctx.entities.map((e) => e.id)` when calling `client.knowledge.save`. | +| `window` | `window_start` / `window_end` are ISO strings; `granularity` matches the watcher's schedule (`1h`, `1d`, …). | +| `watcher` | `slug` is stable across version bumps — use it for grep-friendly log lines. | +| `organization_id` | Org UUID. Forward to external systems that need explicit org-scoping. | + +--- + +## `ReactionEntity` + +```ts +interface ReactionEntity { + id: number; + name: string; + entity_type: string; + metadata: Record; +} +``` + +Each entity carries the org-scoped numeric `id` (use for `entity_ids` on `save`), the display `name`, the type slug (`Company`, `Project`, `$member`), and any `metadata` traits accreted by connector ingestion or earlier watchers. + +--- + +## The injected `client` + +Not exported from `@lobu/connector-sdk` — injected as the second argument at runtime. The shape lives in `packages/server/src/sandbox/client-sdk.ts`. Below is the subset reactions reach for in practice. + +### `client.knowledge` + +| Method | Use | +|--------|-----| +| `save({ entity_ids?, content, semantic_type, title?, slug?, metadata? })` | Append a new event to memory. | +| `search({ query?, entity_type?, entity_id?, limit?, ... })` | Hybrid (vector + full-text) search across the org's events. Use to dedupe before writing. | +| `read({ content_id? \| watcher_id?, entity_ids?, since?, until?, limit? })` | Fetch a single event by id, or pull events from a watcher window. | +| `delete(event_id)` or `delete({ event_id?, event_ids?, reason? })` | Append a tombstone for one or more events. `events` is append-only — `delete` writes a superseding row, never `DELETE`s. | + +### Outbound HTTP + +Reactions hit external systems (Slack incoming webhooks, Linear, GitHub) directly with `fetch`. The worker proxy enforces the same `WORKER_ALLOWED_DOMAINS` policy as connector code, so non-allowlisted hosts are blocked at the network layer — no extra wrapper required. + +When you need to call a third-party API that an installed connector already authenticates, fetch the token through the gateway proxy instead of duplicating credentials in the reaction. + +--- + +## Lifecycle + +1. **Watcher window closes.** The watcher's prompt + `extraction_schema` runs against the events in the window; the extracted JSON is validated. +2. **Lobu looks for a paired reaction.** Filename match: a watcher with slug `account-health-monitor` pairs with `models/reactions/account-health-monitor.reaction.ts`. If no file exists, the run ends here. +3. **Sandbox boots the reaction.** Isolated worker, network restricted by the agent's `WORKER_ALLOWED_DOMAINS`, stdout/stderr captured into the run record, hard timeout. +4. **Reaction runs.** Any `client.knowledge.save` calls append events; outbound `fetch` calls go through the worker HTTP proxy. +5. **Result lands.** Success or failure is recorded on the watcher run; partial side effects (events already saved before a throw) stay in place — they're real events in the durable log. + +--- + +## See also + +- [Reactions guide](/getting-started/reaction-sdk/) — when to reach for a reaction, where the file lives, real-world example. +- [`@lobu/connector-sdk` reference](/reference/connector-sdk/) — the connector surface of the same package. +- [Memory](/getting-started/memory/) — how events become entity memory. diff --git a/packages/landing/src/generated/landing-snippets.json b/packages/landing/src/generated/landing-snippets.json new file mode 100644 index 000000000..c58515e29 --- /dev/null +++ b/packages/landing/src/generated/landing-snippets.json @@ -0,0 +1,112 @@ +{ + "connector": { + "code": "// biome-ignore-all format: stays compact for the landing-page code panel\nimport { ConnectorRuntime, type ConnectorDefinition, type EventEnvelope, type SyncContext, type SyncResult } from \"@lobu/connector-sdk\";\n\ninterface StripeCharge { id: string; amount: number; currency: string; created: number; refunded: boolean }\ninterface Checkpoint { last_created: number }\n\nexport default class StripeChargesConnector extends ConnectorRuntime {\n readonly definition: ConnectorDefinition = {\n key: \"stripe-charges\",\n name: \"Stripe charges\",\n version: \"1.0.0\",\n // Stripe secret key collected per connection; exposed to sync() as ctx.config.secret_key.\n authSchema: { methods: [{ type: \"env_keys\", fields: [{ key: \"secret_key\", label: \"Stripe secret key\", secret: true, required: true }] }] },\n feeds: { charges: { key: \"charges\", name: \"Charges\" } },\n };\n\n async sync(ctx: SyncContext): Promise {\n const cursor = ((ctx.checkpoint ?? {}) as Partial).last_created ?? 0;\n const secretKey = String(ctx.config.secret_key ?? \"\");\n const r = await fetch(`https://api.stripe.com/v1/charges?limit=100&created[gt]=${cursor}`, {\n headers: { Authorization: `Bearer ${secretKey}` },\n });\n if (!r.ok) throw new Error(`Stripe ${r.status}: ${await r.text()}`);\n const data = (((await r.json()) as { data?: StripeCharge[] }).data ?? []).sort((a, b) => a.created - b.created);\n const events: EventEnvelope[] = data.map((c) => ({\n origin_id: c.refunded ? `${c.id}:refund` : c.id,\n origin_type: c.refunded ? \"charge_refunded\" : \"charge_succeeded\",\n title: `${c.refunded ? \"Refund\" : \"Charge\"} — ${(c.amount / 100).toFixed(2)} ${c.currency.toUpperCase()}`,\n payload_text: `${c.refunded ? \"Refund\" : \"Charge\"} of ${(c.amount / 100).toFixed(2)} ${c.currency.toUpperCase()} (stripe id ${c.id})`,\n source_url: `https://dashboard.stripe.com/payments/${c.id}`,\n occurred_at: new Date(c.created * 1000),\n }));\n return { events, checkpoint: { last_created: data.at(-1)?.created ?? cursor } satisfies Checkpoint };\n }\n\n async execute() {\n return { success: false, error: \"no actions\" };\n }\n}", + "path": "connectors/stripe-charges.connector.ts", + "githubUrl": "https://github.com/lobu-ai/lobu/blob/main/examples/ecommerce/connectors/stripe-charges.connector.ts", + "language": "typescript" + }, + "memorySchema": { + "code": "entities:\n - slug: organization\n name: Organization\n metadata_schema:\n type: object\n properties:\n company_name: { type: string }\n stage: { type: string }\n arr: { type: string }\n # 1 more…", + "path": "models/schema.yaml", + "githubUrl": "https://github.com/lobu-ai/lobu/blob/main/examples/sales/models/schema.yaml", + "language": "yaml" + }, + "watcher": { + "code": "watchers:\n - slug: account-health-monitor\n agent: sales\n schedule: 0 */12 * * *\n prompt: \"Poll CRM data for tracked accounts. Track expansion progress, risk level changes, and renewal timeline.\"\n extraction_schema:\n type: object\n required: [risk_level, expansion_status, renewal_blockers, activity_delta]", + "path": "models/schema.yaml", + "githubUrl": "https://github.com/lobu-ai/lobu/blob/main/examples/sales/models/schema.yaml", + "language": "yaml" + }, + "reaction": { + "code": "/**\n * Reaction for the `account-health-monitor` watcher.\n *\n * When the watcher detects a material risk-level change on a tracked account,\n * persist a `health_change` event so the renewal-risk view + weekly digest\n * have a stable record without re-extracting from the CRM stream.\n */\nimport type { ReactionContext } from \"@lobu/connector-sdk\";\n\ninterface HealthData {\n account_changes?: Array<{\n account: string;\n previous_risk: \"low\" | \"medium\" | \"high\";\n current_risk: \"low\" | \"medium\" | \"high\";\n signals: string[];\n }>;\n}\n\nconst RISK_ORDER = { low: 0, medium: 1, high: 2 } as const;\n\nexport default async (ctx: ReactionContext, client: any): Promise => {\n const data = ctx.extracted_data as HealthData;\n const changes = data.account_changes ?? [];\n // Only persist *worsening* transitions — improvements are visible in the\n // CRM stream and don't need a durable flag.\n const escalations = changes.filter(\n (c) => RISK_ORDER[c.current_risk] > RISK_ORDER[c.previous_risk]\n );\n if (escalations.length === 0) return;\n\n for (const c of escalations) {\n await client.knowledge.save({\n entity_ids: ctx.entities.map((e) => e.id),\n content: `Account ${c.account}: risk ${c.previous_risk} → ${c.current_risk}\\nSignals: ${c.signals.join(\"; \")}`,\n semantic_type: \"health_change\",\n metadata: {\n account: c.account,\n from: c.previous_risk,\n to: c.current_risk,\n window_id: ctx.window.id,\n },\n });\n }\n};", + "path": "models/reactions/account-health-monitor.reaction.ts", + "githubUrl": "https://github.com/lobu-ai/lobu/blob/main/examples/sales/models/reactions/account-health-monitor.reaction.ts", + "language": "typescript" + }, + "agentToml": { + "code": "[agents.sales]\nname = \"sales\"\n[[agents.sales.providers]]\nid = \"anthropic\"\nmodel = \"claude/sonnet-4-5\"\nkey = \"$ANTHROPIC_API_KEY\"\n[memory]\nenabled = true\norg = \"sales\"\nmodels = \"./models\"\ndata = \"./data\"", + "path": "lobu.toml", + "githubUrl": "https://github.com/lobu-ai/lobu/blob/main/examples/sales/lobu.toml", + "language": "toml" + }, + "skill": { + "code": "---\nname: deliveroo-order\ndescription: Read a restaurant's Deliveroo menu and assemble a group-order basket for the office lunch. Use in step 2 of the lunch run, after orders are collected. Reading menus and building a basket is allowed; completing checkout or touching payment is NOT.\nnixPackages:\n - chromium\nnetwork:\n allow:\n - registry.npmjs.org\n - .npmjs.org\n # …2 more\n judge:\n - deliveroo.co.uk\n - .deliveroo.co.uk\n # …2 more\njudges:\n default: \"Allow GET reads + basket mutations; DENY checkout, payment, profile changes. Fail closed if unclear.\"\n---", + "path": "agents/food-ordering/skills/deliveroo-order/SKILL.md", + "githubUrl": "https://github.com/lobu-ai/lobu/blob/main/examples/office-bot/agents/food-ordering/skills/deliveroo-order/SKILL.md", + "language": "markdown" + }, + "examples": [ + { + "slug": "agent-community", + "label": "agent-community", + "description": "Discover aligned members, explain why they should meet, and draft warm introductions", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/agent-community" + }, + { + "slug": "atlas", + "label": "atlas-curator", + "description": "Public reference catalog — places, taxonomies, institutions", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/atlas" + }, + { + "slug": "delivery", + "label": "delivery", + "description": "Help delivery teams keep milestones, blockers, owners, and artifacts aligned", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/delivery" + }, + { + "slug": "ecommerce", + "label": "ecommerce-ops", + "description": "Manage subscriptions, process order changes, and resolve customer requests", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/ecommerce" + }, + { + "slug": "finance", + "label": "finance", + "description": "Help finance teams reconcile data, explain variance, and prepare reporting runs", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/finance" + }, + { + "slug": "leadership", + "label": "leadership", + "description": "Turn memos, decisions, and board materials into reusable operating context", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/leadership" + }, + { + "slug": "legal", + "label": "legal-review", + "description": "Review contracts, summarize risk, and surface missing protections", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/legal" + }, + { + "slug": "lobu-crm", + "label": "crm", + "description": "Funnel CRM for Lobu — leads, pilots, conversations, launch signals", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/lobu-crm" + }, + { + "slug": "market", + "label": "vc-tracking", + "description": "Track companies, founders, and investment opportunities for venture firms", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/market" + }, + { + "slug": "office-bot", + "label": "food-ordering", + "description": "Office-ops agents — first up: the weekday lunch order", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/office-bot" + }, + { + "slug": "personal-finance", + "label": "personal-finance", + "description": "UK Self Assessment helper — captures financial activity across the tax year and assembles SA100 + supplementary pages.", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/personal-finance" + }, + { + "slug": "sales", + "label": "sales", + "description": "Help revenue teams track account health, rollout progress, and renewal signals", + "githubUrl": "https://github.com/lobu-ai/lobu/tree/main/examples/sales" + } + ] +} diff --git a/packages/landing/src/globals.css b/packages/landing/src/globals.css index cb79fbd0d..82161f1dd 100644 --- a/packages/landing/src/globals.css +++ b/packages/landing/src/globals.css @@ -28,6 +28,17 @@ --color-page-text: oklch(0.1804 0.0154 57.0973); --color-page-text-muted: oklch(0.4806 0.0254 51.1528); + /* Landing code-block palette (dev-focused sections). Tuned to harmonize + with the warm cream/orange page palette while staying readably dark. */ + --color-landing-code-bg: oklch(0.1820 0.0080 70.0000); + --color-landing-code-bg-soft: oklch(0.2260 0.0080 70.0000); + --color-landing-code-text: oklch(0.9300 0.0220 80.0000); + --color-landing-code-comment: oklch(0.6010 0.0260 70.0000); + --color-landing-code-string: oklch(0.7900 0.1200 70.0000); + --color-landing-code-keyword: oklch(0.8000 0.1500 60.0000); + --color-landing-code-key: oklch(0.8200 0.0700 175.0000); + --color-landing-code-builtin: oklch(0.8000 0.1500 60.0000); + --color-tg-bg: oklch(0.2606 0.0040 84.5838); --color-tg-bg-secondary: oklch(0.2007 0.0101 52.8852); --color-tg-bubble-out: oklch(0.7006 0.1891 46.5400); diff --git a/packages/landing/src/layouts/BaseLayout.astro b/packages/landing/src/layouts/BaseLayout.astro index e07c33ba1..f1db74187 100644 --- a/packages/landing/src/layouts/BaseLayout.astro +++ b/packages/landing/src/layouts/BaseLayout.astro @@ -8,6 +8,10 @@ interface Props { author: string; tags: string[]; }; + /** Force `light` or `dark`; if unset, respect prefers-color-scheme. */ + forceTheme?: "light" | "dark"; + /** When true, ship the vendored asciinema-player CSS + JS bundle. */ + loadAsciinema?: boolean; } const { @@ -15,6 +19,8 @@ const { description = "Open-source backend for multi-user AI agents with isolated workers, per-user OAuth, connected sources, shared memory, and secrets agents never see.", ogType = "website", article, + forceTheme, + loadAsciinema = false, } = Astro.props; import { existsSync } from "node:fs"; @@ -100,10 +106,17 @@ const hasMarkdownTwin = existsSync(markdownFileURL); + + {loadAsciinema && ( + + )} - + )} diff --git a/packages/landing/src/pages/for/[useCase].astro b/packages/landing/src/pages/for/[useCase].astro index 14ec35a46..d942abe40 100644 --- a/packages/landing/src/pages/for/[useCase].astro +++ b/packages/landing/src/pages/for/[useCase].astro @@ -34,11 +34,7 @@ const latestPosts = await getLatestPosts(3); "--grid-max-w": "72rem", }} > -