@adminide-stack/yantra-mobile 12.0.129 → 12.0.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -256,6 +256,16 @@ const MOBILE_APP_CATALOG = [
256
256
  // The deployed surface is `posts-surface`, not `social-post-surface`.
257
257
  surfaceSlug: "posts"
258
258
  },
259
+ {
260
+ key: "invoices",
261
+ label: "Invoices",
262
+ icon: "cash-check",
263
+ group: "Money",
264
+ prompt: "Show me which invoices are still unpaid.",
265
+ // The served Invoices surface (yantra-surface packages/invoices) in the shared WebView.
266
+ nativeRoute: "webbuilder",
267
+ surfaceSlug: "invoices"
268
+ },
259
269
  {
260
270
  key: "expenses",
261
271
  label: "Expenses",
@@ -1 +1 @@
1
- {"version":3,"file":"mobileAppCatalog.js","sources":["../../../src/features/apps/mobileAppCatalog.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport type { MaterialCommunityIcons } from '@expo/vector-icons';\n\ntype IconName = ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport type AppGroupId = 'Create' | 'Office' | 'Automate' | 'Sell' | 'Money' | 'Team' | 'More';\n\nexport type MobileAppItem = {\n key: string;\n label: string;\n icon: IconName;\n group: AppGroupId;\n /** Prompt sent as the first chat turn when the app has no native screen. */\n prompt: string;\n /**\n * Which surface host opens this app, if it has one. `webbuilder` is the\n * historical name of the shared WebView surface shell (`screens/WebBuilder`),\n * which is not web-builder-specific: it takes a `url` route param, mints the\n * system token, injects the bridge + cdecli token, stamps `embed=mobile` and\n * owns the timeout/retry UI. Anything with a deployed surface SPA can use it.\n */\n nativeRoute?:\n | 'webbuilder'\n | 'canvas-native'\n | 'characters-native'\n | 'chat-native'\n | 'billing-native'\n | 'shopping-native'\n | 'travel-native'\n | 'job-search-native'\n | 'resume-native'\n | 'inbox-native'\n | 'study-native'\n | 'local-services-native'\n | 'movies-native'\n | 'expenses-native'\n | 'webbuilder-native'\n | 'design-native';\n /**\n * Deployed surface SPA for this app, as the `<slug>-surface` name. Resolved\n * against SURFACE_URL_TEMPLATE so one env var covers every surface and stays\n * per-environment, instead of 20+ near-identical URLs in eas.json.\n *\n * The slug is the SURFACE's name, which is not always the tile key\n * (issue-ticket -> issues, shop -> shopping, notebook -> notebooklm).\n */\n surfaceSlug?: string;\n /**\n * Explicit env override, for the surfaces people actually run locally\n * (design 5174, canvas 5175, webbuilder). Wins over `surfaceSlug`.\n */\n surfaceUrlKey?: 'WEB_BUILDER_URL' | 'CANVAS_SURFACE_URL' | 'DESIGN_SURFACE_URL';\n /**\n * Key of the web tile this native tile replaces in every launcher list.\n * The web entry stays in the catalog (deep links, tests, the WebView\n * lane) but users see one tile per app, the native one, under the\n * shared name. Also the key of a retired tile this one took over from\n * (Posters for Paper 2 Poster). Either way a favorite pinned under the\n * old key carries over to this tile.\n */\n supersedes?: string;\n /**\n * Account chrome, not a product app. Stays in the catalog so drawer /\n * deep-link routing still knows the native host, but never appears as\n * a tile in Apps or the Apps menu.\n */\n hideInLauncher?: boolean;\n};\n\n/**\n * Mobile Apps launcher. Labels, groups, and prompts stay in lockstep with the\n * browser ChatTopBar Apps menu (`packages-modules/account/browser`).\n */\nexport const MOBILE_APP_CATALOG: readonly MobileAppItem[] = [\n {\n key: 'design',\n label: 'Design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'DESIGN_SURFACE_URL',\n surfaceSlug: 'design',\n },\n {\n key: 'design-native',\n label: 'Design',\n supersedes: 'design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n // The native design studio (features/design): templates, saved designs and the\n // editor, drawn natively over the same designs as the web Design Studio. No WebView.\n nativeRoute: 'design-native',\n },\n {\n key: 'canvas',\n label: 'Canvas',\n icon: 'view-grid-outline',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'CANVAS_SURFACE_URL',\n surfaceSlug: 'canvas',\n },\n {\n key: 'canvas-native',\n label: 'Canvas',\n supersedes: 'canvas',\n icon: 'vector-square',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n // Renders through Module Federation: the viewer downloads from the\n // canvas-surface origin on open. First native surface; the classic\n // Canvas tile keeps the full web editor in the WebView host.\n nativeRoute: 'canvas-native',\n },\n {\n key: 'webbuilder',\n label: 'Web Builder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'WEB_BUILDER_URL',\n surfaceSlug: 'webbuilder',\n },\n {\n key: 'webbuilder-native',\n label: 'Web Builder',\n supersedes: 'webbuilder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n // Native web builder over the same projects as the web surface: your sites,\n // build and edit with the agent, live preview, versions, publish.\n nativeRoute: 'webbuilder-native',\n },\n {\n key: 'codezen',\n label: 'Codezen',\n icon: 'code-braces',\n group: 'Create',\n prompt: 'Clone my repository and fix the failing test',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'codezen',\n },\n {\n key: 'character',\n label: 'Characters',\n icon: 'drama-masks',\n group: 'Create',\n prompt: 'Create a stoic philosophy mentor character I can chat with',\n // Native federated experience (gallery -> detail -> chat); the web\n // surface remains reachable through the surface lane if ever needed.\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n {\n key: 'characters-native',\n label: 'Characters',\n supersedes: 'character',\n icon: 'account-star',\n group: 'Create',\n prompt: 'Show me characters I can chat with.',\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n // Word, Excel, PowerPoint and PDF files, pictures, interface designs and research posters,\n // each in its own browser editor (yantra-office).\n {\n key: 'word',\n label: 'Documents',\n icon: 'file-document-outline',\n group: 'Office',\n prompt: 'Write a one-page project proposal as a Word document',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'word',\n },\n {\n key: 'excel',\n label: 'Spreadsheets',\n icon: 'file-table-outline',\n group: 'Office',\n prompt: 'Make a monthly budget spreadsheet with totals and a chart',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'excel',\n },\n {\n key: 'presentation',\n label: 'Presentations',\n icon: 'presentation',\n group: 'Office',\n prompt: 'Turn my notes into a six-slide project update deck',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'presentation',\n },\n {\n key: 'pdf',\n label: 'PDFs',\n icon: 'file-pdf-box',\n group: 'Office',\n prompt: 'Make a one-page PDF checklist for moving house',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'pdf',\n },\n {\n key: 'photo',\n label: 'Photos',\n icon: 'image-edit-outline',\n group: 'Office',\n prompt: 'Make an Instagram post from a template with our spring sale headline',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'photo',\n },\n {\n key: 'figdesign',\n label: 'FigDesign',\n // The pen tool, not Design's palette or Canvas's vector-square: Design is AI web-design\n // boards and Canvas is media, this is the interface design editor.\n icon: 'fountain-pen-tip',\n group: 'Office',\n prompt: 'Start a mobile app design for my bakery in our brand green, with Light and Dark modes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'figdesign',\n },\n {\n key: 'poster',\n label: 'Posters',\n // A printed sheet with a headline over its text, as on the web launcher, not\n // Presentations' easel: a poster is one big page, not a deck.\n icon: 'post-outline',\n group: 'Office',\n prompt: 'Turn this research paper into a 48 x 36 inch conference poster I can edit and print.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'poster',\n // Posters replaced Paper 2 Poster: a tile pinned under the old key stays pinned.\n supersedes: 'paper2poster',\n },\n {\n key: 'chat-native',\n label: 'Chats',\n icon: 'message-text-outline',\n group: 'Team',\n prompt: 'Show me my conversations.',\n // Person-to-person messaging, federated like canvas: the whole UI\n // downloads from the chat-native surface on open. Not the AI chat -\n // that is the Home tab.\n nativeRoute: 'chat-native',\n },\n {\n key: 'workflow',\n label: 'Workflow',\n icon: 'sitemap',\n group: 'Automate',\n prompt: 'Build a workflow that runs every morning and sends me a summary of what changed.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'workflow',\n },\n {\n key: 'computer',\n label: 'Computer',\n icon: 'monitor',\n group: 'Automate',\n prompt: 'Open a browser and compare the top 5 CRM tools with screenshots',\n },\n {\n key: 'crm',\n label: 'CRM',\n icon: 'account-group-outline',\n group: 'Sell',\n prompt: 'Look at my pipeline and tell me which deals are going cold and what I should send them.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'crm',\n },\n {\n key: 'salesiq',\n label: 'SalesIQ',\n icon: 'radar',\n group: 'Sell',\n prompt: 'Show me who is on my website right now',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'salesiq',\n },\n {\n key: 'inbox',\n label: 'Inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'inbox',\n },\n {\n key: 'inbox-native',\n label: 'Inbox',\n supersedes: 'inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n // Native mail client over the same yantra-mailer store as the web Inbox.\n nativeRoute: 'inbox-native',\n },\n {\n key: 'mailcampaign',\n label: 'Mail Campaigns',\n icon: 'bullhorn-outline',\n group: 'Sell',\n prompt: 'Draft an email campaign announcing what we shipped this month.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'mailcampaign',\n },\n {\n key: 'smscampaign',\n label: 'SMS Campaigns',\n icon: 'message-text-outline',\n group: 'Sell',\n prompt: \"Text my customers a short reminder about this week's offer.\",\n nativeRoute: 'webbuilder',\n surfaceSlug: 'smscampaign',\n },\n {\n key: 'social-post',\n label: 'Social Posts',\n icon: 'send-outline',\n group: 'Sell',\n prompt: 'Draft a launch post for X and LinkedIn and schedule it for Tuesday morning.',\n nativeRoute: 'webbuilder',\n // The deployed surface is `posts-surface`, not `social-post-surface`.\n surfaceSlug: 'posts',\n },\n {\n key: 'expenses',\n label: 'Expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'expenses',\n },\n {\n key: 'expenses-native',\n label: 'Expenses',\n supersedes: 'expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n // Native expenses over the same expenses subgraph as the web app: scan receipts,\n // approvals, budgets, recurring payments, accounts.\n nativeRoute: 'expenses-native',\n },\n {\n key: 'cards-wallet',\n label: 'Cards & Wallet',\n icon: 'credit-card-outline',\n group: 'Money',\n prompt: 'Issue a $200 virtual card for monthly ad spend',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'cards-wallet',\n },\n {\n key: 'billing',\n label: 'Billing',\n icon: 'currency-usd',\n group: 'Money',\n prompt: 'Create an invoice for a $2,400 consulting project',\n nativeRoute: 'billing-native',\n surfaceSlug: 'billing',\n // Plan / subscription for this account — already in the drawer.\n hideInLauncher: true,\n },\n {\n key: 'kpi-motivation',\n label: 'KPI Motivation',\n icon: 'trophy-outline',\n group: 'Team',\n prompt: 'Set up a weekly sales KPI scoreboard for my team',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'kpi-motivation',\n },\n {\n key: 'issue-ticket',\n label: 'Issue Ticket',\n icon: 'bug-outline',\n group: 'Team',\n prompt: 'Create a bug board and triage my open issues',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'issues',\n },\n {\n key: 'notebook',\n label: 'Study',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'notebooklm',\n },\n {\n key: 'study-native',\n label: 'Study',\n supersedes: 'notebook',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n // Native study notebooks over the same yantra-notebook store as the web Study.\n nativeRoute: 'study-native',\n },\n {\n key: 'resume',\n label: 'Resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'resume',\n },\n {\n key: 'resume-native',\n label: 'Resume',\n supersedes: 'resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'resume-native',\n },\n {\n key: 'job-search',\n label: 'Job Search',\n icon: 'briefcase-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'job-search',\n },\n {\n key: 'job-search-native',\n label: 'Job Search',\n supersedes: 'job-search',\n icon: 'briefcase-search-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'job-search-native',\n },\n {\n key: 'shop',\n label: 'Shop',\n icon: 'cart-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'shopping',\n },\n {\n key: 'shopping-native',\n label: 'Shop',\n supersedes: 'shop',\n icon: 'storefront-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n // Federated storefront: search + cart download from shopping_native/Shop.\n // The classic Shop tile keeps the web surface in the WebView host.\n nativeRoute: 'shopping-native',\n },\n {\n key: 'travel-native',\n label: 'Travel',\n supersedes: 'travel',\n icon: 'airplane-takeoff',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'travel-native',\n },\n {\n key: 'travel',\n label: 'Travel',\n icon: 'airplane',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'travel',\n },\n {\n key: 'social-events',\n label: 'yantra.live',\n icon: 'ticket-outline',\n group: 'More',\n prompt: 'What concerts are happening nearby this weekend?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'social-events',\n },\n {\n key: 'movies',\n label: 'Movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'movies',\n },\n {\n key: 'movies-native',\n label: 'Movies',\n supersedes: 'movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n // Native cinema app over the yantra-movies connector: discover, trailers, showtimes, watchlist.\n nativeRoute: 'movies-native',\n },\n {\n key: 'local-services',\n label: 'Local Services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'local-services',\n },\n {\n key: 'local-services-native',\n label: 'Local Services',\n supersedes: 'local-services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n // Native search, details and saved pros over the same yantra-local-services\n // connector as the web Local Services surface.\n nativeRoute: 'local-services-native',\n },\n {\n key: 'fitness',\n label: 'Fitness',\n icon: 'dumbbell',\n group: 'More',\n prompt: 'Build me a workout plan for this week',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'fitness',\n },\n];\n\nexport const APP_GROUP_ORDER: readonly AppGroupId[] = ['Create', 'Office', 'Automate', 'Sell', 'Money', 'Team', 'More'];\n\nexport type AppsTab = 'all' | 'favorites';\n\n/**\n * Poster colors per group - the tile artwork. Deliberately the same in light\n * and dark themes: artwork is content, the card chrome is what adapts.\n */\nexport const APP_GROUP_ART: Record<AppGroupId, { base: string; glow: string }> = {\n Create: { base: '#4f46e5', glow: '#c4b5fd' },\n Office: { base: '#334155', glow: '#cbd5e1' },\n Automate: { base: '#0f766e', glow: '#99f6e4' },\n Sell: { base: '#c2410c', glow: '#fed7aa' },\n Money: { base: '#15803d', glow: '#bbf7d0' },\n Team: { base: '#0369a1', glow: '#bae6fd' },\n More: { base: '#be185d', glow: '#fbcfe8' },\n};\n\nexport function matchesAppQuery(label: string, query: string): boolean {\n const q = query.toLowerCase().replace(/[^a-z0-9]/g, '');\n if (!q) return true;\n return label\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .includes(q);\n}\n\n/**\n * Favorites keyed by a web tile that a native tile now replaces, carried over to\n * the native tile, so pinning \"Inbox\" before it went native still pins it after.\n */\nexport function carryOverSupersededFavorites(\n favorites: ReadonlySet<string>,\n items: readonly MobileAppItem[] = MOBILE_APP_CATALOG,\n): Set<string> {\n const replacement = new Map<string, string>();\n for (const item of items) if (item.supersedes) replacement.set(item.supersedes, item.key);\n const out = new Set<string>();\n for (const key of favorites) out.add(replacement.get(key) ?? key);\n return out;\n}\n\n/** One tile per app: a web tile disappears when its native replacement is in the list. */\nexport function visibleMobileApps(items: readonly MobileAppItem[]): MobileAppItem[] {\n const replaced = new Set(items.map((item) => item.supersedes).filter(Boolean));\n return items.filter((item) => !item.hideInLauncher && !replaced.has(item.key));\n}\n\nexport function groupMobileApps(items: readonly MobileAppItem[], query: string) {\n const hits = visibleMobileApps(items).filter((item) => matchesAppQuery(item.label, query));\n return APP_GROUP_ORDER.map((label) => ({\n label,\n items: hits.filter((item) => item.group === label),\n })).filter((group) => group.items.length > 0);\n}\n\n/**\n * One flat grid (Manus/game-launcher style) instead of grouped sections: rows\n * stay dense and the group reads from each card's caption. Catalog order is\n * kept inside a group; groups follow APP_GROUP_ORDER.\n */\nexport function filterMobileApps(\n items: readonly MobileAppItem[],\n query: string,\n tab: AppsTab,\n favorites: ReadonlySet<string>,\n): MobileAppItem[] {\n const rank = new Map(APP_GROUP_ORDER.map((group, index) => [group, index]));\n return visibleMobileApps(items)\n .filter((item) => matchesAppQuery(item.label, query))\n .filter((item) => tab !== 'favorites' || favorites.has(item.key))\n .sort((a, b) => (rank.get(a.group) ?? APP_GROUP_ORDER.length) - (rank.get(b.group) ?? APP_GROUP_ORDER.length));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mobileAppCatalog.js","sources":["../../../src/features/apps/mobileAppCatalog.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport type { MaterialCommunityIcons } from '@expo/vector-icons';\n\ntype IconName = ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport type AppGroupId = 'Create' | 'Office' | 'Automate' | 'Sell' | 'Money' | 'Team' | 'More';\n\nexport type MobileAppItem = {\n key: string;\n label: string;\n icon: IconName;\n group: AppGroupId;\n /** Prompt sent as the first chat turn when the app has no native screen. */\n prompt: string;\n /**\n * Which surface host opens this app, if it has one. `webbuilder` is the\n * historical name of the shared WebView surface shell (`screens/WebBuilder`),\n * which is not web-builder-specific: it takes a `url` route param, mints the\n * system token, injects the bridge + cdecli token, stamps `embed=mobile` and\n * owns the timeout/retry UI. Anything with a deployed surface SPA can use it.\n */\n nativeRoute?:\n | 'webbuilder'\n | 'canvas-native'\n | 'characters-native'\n | 'chat-native'\n | 'billing-native'\n | 'shopping-native'\n | 'travel-native'\n | 'job-search-native'\n | 'resume-native'\n | 'inbox-native'\n | 'study-native'\n | 'local-services-native'\n | 'movies-native'\n | 'expenses-native'\n | 'webbuilder-native'\n | 'design-native';\n /**\n * Deployed surface SPA for this app, as the `<slug>-surface` name. Resolved\n * against SURFACE_URL_TEMPLATE so one env var covers every surface and stays\n * per-environment, instead of 20+ near-identical URLs in eas.json.\n *\n * The slug is the SURFACE's name, which is not always the tile key\n * (issue-ticket -> issues, shop -> shopping, notebook -> notebooklm).\n */\n surfaceSlug?: string;\n /**\n * Explicit env override, for the surfaces people actually run locally\n * (design 5174, canvas 5175, webbuilder). Wins over `surfaceSlug`.\n */\n surfaceUrlKey?: 'WEB_BUILDER_URL' | 'CANVAS_SURFACE_URL' | 'DESIGN_SURFACE_URL';\n /**\n * Key of the web tile this native tile replaces in every launcher list.\n * The web entry stays in the catalog (deep links, tests, the WebView\n * lane) but users see one tile per app, the native one, under the\n * shared name. Also the key of a retired tile this one took over from\n * (Posters for Paper 2 Poster). Either way a favorite pinned under the\n * old key carries over to this tile.\n */\n supersedes?: string;\n /**\n * Account chrome, not a product app. Stays in the catalog so drawer /\n * deep-link routing still knows the native host, but never appears as\n * a tile in Apps or the Apps menu.\n */\n hideInLauncher?: boolean;\n};\n\n/**\n * Mobile Apps launcher. Labels, groups, and prompts stay in lockstep with the\n * browser ChatTopBar Apps menu (`packages-modules/account/browser`).\n */\nexport const MOBILE_APP_CATALOG: readonly MobileAppItem[] = [\n {\n key: 'design',\n label: 'Design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'DESIGN_SURFACE_URL',\n surfaceSlug: 'design',\n },\n {\n key: 'design-native',\n label: 'Design',\n supersedes: 'design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n // The native design studio (features/design): templates, saved designs and the\n // editor, drawn natively over the same designs as the web Design Studio. No WebView.\n nativeRoute: 'design-native',\n },\n {\n key: 'canvas',\n label: 'Canvas',\n icon: 'view-grid-outline',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'CANVAS_SURFACE_URL',\n surfaceSlug: 'canvas',\n },\n {\n key: 'canvas-native',\n label: 'Canvas',\n supersedes: 'canvas',\n icon: 'vector-square',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n // Renders through Module Federation: the viewer downloads from the\n // canvas-surface origin on open. First native surface; the classic\n // Canvas tile keeps the full web editor in the WebView host.\n nativeRoute: 'canvas-native',\n },\n {\n key: 'webbuilder',\n label: 'Web Builder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'WEB_BUILDER_URL',\n surfaceSlug: 'webbuilder',\n },\n {\n key: 'webbuilder-native',\n label: 'Web Builder',\n supersedes: 'webbuilder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n // Native web builder over the same projects as the web surface: your sites,\n // build and edit with the agent, live preview, versions, publish.\n nativeRoute: 'webbuilder-native',\n },\n {\n key: 'codezen',\n label: 'Codezen',\n icon: 'code-braces',\n group: 'Create',\n prompt: 'Clone my repository and fix the failing test',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'codezen',\n },\n {\n key: 'character',\n label: 'Characters',\n icon: 'drama-masks',\n group: 'Create',\n prompt: 'Create a stoic philosophy mentor character I can chat with',\n // Native federated experience (gallery -> detail -> chat); the web\n // surface remains reachable through the surface lane if ever needed.\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n {\n key: 'characters-native',\n label: 'Characters',\n supersedes: 'character',\n icon: 'account-star',\n group: 'Create',\n prompt: 'Show me characters I can chat with.',\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n // Word, Excel, PowerPoint and PDF files, pictures, interface designs and research posters,\n // each in its own browser editor (yantra-office).\n {\n key: 'word',\n label: 'Documents',\n icon: 'file-document-outline',\n group: 'Office',\n prompt: 'Write a one-page project proposal as a Word document',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'word',\n },\n {\n key: 'excel',\n label: 'Spreadsheets',\n icon: 'file-table-outline',\n group: 'Office',\n prompt: 'Make a monthly budget spreadsheet with totals and a chart',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'excel',\n },\n {\n key: 'presentation',\n label: 'Presentations',\n icon: 'presentation',\n group: 'Office',\n prompt: 'Turn my notes into a six-slide project update deck',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'presentation',\n },\n {\n key: 'pdf',\n label: 'PDFs',\n icon: 'file-pdf-box',\n group: 'Office',\n prompt: 'Make a one-page PDF checklist for moving house',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'pdf',\n },\n {\n key: 'photo',\n label: 'Photos',\n icon: 'image-edit-outline',\n group: 'Office',\n prompt: 'Make an Instagram post from a template with our spring sale headline',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'photo',\n },\n {\n key: 'figdesign',\n label: 'FigDesign',\n // The pen tool, not Design's palette or Canvas's vector-square: Design is AI web-design\n // boards and Canvas is media, this is the interface design editor.\n icon: 'fountain-pen-tip',\n group: 'Office',\n prompt: 'Start a mobile app design for my bakery in our brand green, with Light and Dark modes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'figdesign',\n },\n {\n key: 'poster',\n label: 'Posters',\n // A printed sheet with a headline over its text, as on the web launcher, not\n // Presentations' easel: a poster is one big page, not a deck.\n icon: 'post-outline',\n group: 'Office',\n prompt: 'Turn this research paper into a 48 x 36 inch conference poster I can edit and print.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'poster',\n // Posters replaced Paper 2 Poster: a tile pinned under the old key stays pinned.\n supersedes: 'paper2poster',\n },\n {\n key: 'chat-native',\n label: 'Chats',\n icon: 'message-text-outline',\n group: 'Team',\n prompt: 'Show me my conversations.',\n // Person-to-person messaging, federated like canvas: the whole UI\n // downloads from the chat-native surface on open. Not the AI chat -\n // that is the Home tab.\n nativeRoute: 'chat-native',\n },\n {\n key: 'workflow',\n label: 'Workflow',\n icon: 'sitemap',\n group: 'Automate',\n prompt: 'Build a workflow that runs every morning and sends me a summary of what changed.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'workflow',\n },\n {\n key: 'computer',\n label: 'Computer',\n icon: 'monitor',\n group: 'Automate',\n prompt: 'Open a browser and compare the top 5 CRM tools with screenshots',\n },\n {\n key: 'crm',\n label: 'CRM',\n icon: 'account-group-outline',\n group: 'Sell',\n prompt: 'Look at my pipeline and tell me which deals are going cold and what I should send them.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'crm',\n },\n {\n key: 'salesiq',\n label: 'SalesIQ',\n icon: 'radar',\n group: 'Sell',\n prompt: 'Show me who is on my website right now',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'salesiq',\n },\n {\n key: 'inbox',\n label: 'Inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'inbox',\n },\n {\n key: 'inbox-native',\n label: 'Inbox',\n supersedes: 'inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n // Native mail client over the same yantra-mailer store as the web Inbox.\n nativeRoute: 'inbox-native',\n },\n {\n key: 'mailcampaign',\n label: 'Mail Campaigns',\n icon: 'bullhorn-outline',\n group: 'Sell',\n prompt: 'Draft an email campaign announcing what we shipped this month.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'mailcampaign',\n },\n {\n key: 'smscampaign',\n label: 'SMS Campaigns',\n icon: 'message-text-outline',\n group: 'Sell',\n prompt: \"Text my customers a short reminder about this week's offer.\",\n nativeRoute: 'webbuilder',\n surfaceSlug: 'smscampaign',\n },\n {\n key: 'social-post',\n label: 'Social Posts',\n icon: 'send-outline',\n group: 'Sell',\n prompt: 'Draft a launch post for X and LinkedIn and schedule it for Tuesday morning.',\n nativeRoute: 'webbuilder',\n // The deployed surface is `posts-surface`, not `social-post-surface`.\n surfaceSlug: 'posts',\n },\n {\n key: 'invoices',\n label: 'Invoices',\n icon: 'cash-check',\n group: 'Money',\n prompt: 'Show me which invoices are still unpaid.',\n // The served Invoices surface (yantra-surface packages/invoices) in the shared WebView.\n nativeRoute: 'webbuilder',\n surfaceSlug: 'invoices',\n },\n {\n key: 'expenses',\n label: 'Expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'expenses',\n },\n {\n key: 'expenses-native',\n label: 'Expenses',\n supersedes: 'expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n // Native expenses over the same expenses subgraph as the web app: scan receipts,\n // approvals, budgets, recurring payments, accounts.\n nativeRoute: 'expenses-native',\n },\n {\n key: 'cards-wallet',\n label: 'Cards & Wallet',\n icon: 'credit-card-outline',\n group: 'Money',\n prompt: 'Issue a $200 virtual card for monthly ad spend',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'cards-wallet',\n },\n {\n key: 'billing',\n label: 'Billing',\n icon: 'currency-usd',\n group: 'Money',\n prompt: 'Create an invoice for a $2,400 consulting project',\n nativeRoute: 'billing-native',\n surfaceSlug: 'billing',\n // Plan / subscription for this account — already in the drawer.\n hideInLauncher: true,\n },\n {\n key: 'kpi-motivation',\n label: 'KPI Motivation',\n icon: 'trophy-outline',\n group: 'Team',\n prompt: 'Set up a weekly sales KPI scoreboard for my team',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'kpi-motivation',\n },\n {\n key: 'issue-ticket',\n label: 'Issue Ticket',\n icon: 'bug-outline',\n group: 'Team',\n prompt: 'Create a bug board and triage my open issues',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'issues',\n },\n {\n key: 'notebook',\n label: 'Study',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'notebooklm',\n },\n {\n key: 'study-native',\n label: 'Study',\n supersedes: 'notebook',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n // Native study notebooks over the same yantra-notebook store as the web Study.\n nativeRoute: 'study-native',\n },\n {\n key: 'resume',\n label: 'Resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'resume',\n },\n {\n key: 'resume-native',\n label: 'Resume',\n supersedes: 'resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'resume-native',\n },\n {\n key: 'job-search',\n label: 'Job Search',\n icon: 'briefcase-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'job-search',\n },\n {\n key: 'job-search-native',\n label: 'Job Search',\n supersedes: 'job-search',\n icon: 'briefcase-search-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'job-search-native',\n },\n {\n key: 'shop',\n label: 'Shop',\n icon: 'cart-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'shopping',\n },\n {\n key: 'shopping-native',\n label: 'Shop',\n supersedes: 'shop',\n icon: 'storefront-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n // Federated storefront: search + cart download from shopping_native/Shop.\n // The classic Shop tile keeps the web surface in the WebView host.\n nativeRoute: 'shopping-native',\n },\n {\n key: 'travel-native',\n label: 'Travel',\n supersedes: 'travel',\n icon: 'airplane-takeoff',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'travel-native',\n },\n {\n key: 'travel',\n label: 'Travel',\n icon: 'airplane',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'travel',\n },\n {\n key: 'social-events',\n label: 'yantra.live',\n icon: 'ticket-outline',\n group: 'More',\n prompt: 'What concerts are happening nearby this weekend?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'social-events',\n },\n {\n key: 'movies',\n label: 'Movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'movies',\n },\n {\n key: 'movies-native',\n label: 'Movies',\n supersedes: 'movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n // Native cinema app over the yantra-movies connector: discover, trailers, showtimes, watchlist.\n nativeRoute: 'movies-native',\n },\n {\n key: 'local-services',\n label: 'Local Services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'local-services',\n },\n {\n key: 'local-services-native',\n label: 'Local Services',\n supersedes: 'local-services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n // Native search, details and saved pros over the same yantra-local-services\n // connector as the web Local Services surface.\n nativeRoute: 'local-services-native',\n },\n {\n key: 'fitness',\n label: 'Fitness',\n icon: 'dumbbell',\n group: 'More',\n prompt: 'Build me a workout plan for this week',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'fitness',\n },\n];\n\nexport const APP_GROUP_ORDER: readonly AppGroupId[] = ['Create', 'Office', 'Automate', 'Sell', 'Money', 'Team', 'More'];\n\nexport type AppsTab = 'all' | 'favorites';\n\n/**\n * Poster colors per group - the tile artwork. Deliberately the same in light\n * and dark themes: artwork is content, the card chrome is what adapts.\n */\nexport const APP_GROUP_ART: Record<AppGroupId, { base: string; glow: string }> = {\n Create: { base: '#4f46e5', glow: '#c4b5fd' },\n Office: { base: '#334155', glow: '#cbd5e1' },\n Automate: { base: '#0f766e', glow: '#99f6e4' },\n Sell: { base: '#c2410c', glow: '#fed7aa' },\n Money: { base: '#15803d', glow: '#bbf7d0' },\n Team: { base: '#0369a1', glow: '#bae6fd' },\n More: { base: '#be185d', glow: '#fbcfe8' },\n};\n\nexport function matchesAppQuery(label: string, query: string): boolean {\n const q = query.toLowerCase().replace(/[^a-z0-9]/g, '');\n if (!q) return true;\n return label\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .includes(q);\n}\n\n/**\n * Favorites keyed by a web tile that a native tile now replaces, carried over to\n * the native tile, so pinning \"Inbox\" before it went native still pins it after.\n */\nexport function carryOverSupersededFavorites(\n favorites: ReadonlySet<string>,\n items: readonly MobileAppItem[] = MOBILE_APP_CATALOG,\n): Set<string> {\n const replacement = new Map<string, string>();\n for (const item of items) if (item.supersedes) replacement.set(item.supersedes, item.key);\n const out = new Set<string>();\n for (const key of favorites) out.add(replacement.get(key) ?? key);\n return out;\n}\n\n/** One tile per app: a web tile disappears when its native replacement is in the list. */\nexport function visibleMobileApps(items: readonly MobileAppItem[]): MobileAppItem[] {\n const replaced = new Set(items.map((item) => item.supersedes).filter(Boolean));\n return items.filter((item) => !item.hideInLauncher && !replaced.has(item.key));\n}\n\nexport function groupMobileApps(items: readonly MobileAppItem[], query: string) {\n const hits = visibleMobileApps(items).filter((item) => matchesAppQuery(item.label, query));\n return APP_GROUP_ORDER.map((label) => ({\n label,\n items: hits.filter((item) => item.group === label),\n })).filter((group) => group.items.length > 0);\n}\n\n/**\n * One flat grid (Manus/game-launcher style) instead of grouped sections: rows\n * stay dense and the group reads from each card's caption. Catalog order is\n * kept inside a group; groups follow APP_GROUP_ORDER.\n */\nexport function filterMobileApps(\n items: readonly MobileAppItem[],\n query: string,\n tab: AppsTab,\n favorites: ReadonlySet<string>,\n): MobileAppItem[] {\n const rank = new Map(APP_GROUP_ORDER.map((group, index) => [group, index]));\n return visibleMobileApps(items)\n .filter((item) => matchesAppQuery(item.label, query))\n .filter((item) => tab !== 'favorites' || favorites.has(item.key))\n .sort((a, b) => (rank.get(a.group) ?? APP_GROUP_ORDER.length) - (rank.get(b.group) ?? APP_GROUP_ORDER.length));\n}\n"],"names":[],"mappings":"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"}
@@ -21,10 +21,11 @@ const VEO_ASPECTS = ["16:9", "9:16"];
21
21
  const VEO_RESOLUTIONS = ["720p", "1080p"];
22
22
  const VEO_DURATIONS = [4, 6, 8];
23
23
  const STATIC_IMAGE_MODELS = [{
24
- id: "gemini-3.1-flash-image-preview",
24
+ id: "gemini-efficient",
25
25
  label: "Gemini Efficient",
26
- provider: "google",
27
- description: ""
26
+ provider: "antigravity",
27
+ description: "",
28
+ supportsImageInput: true
28
29
  }];
29
30
  const STATIC_VIDEO_MODELS = [{
30
31
  id: "veo-3.1-generate-preview",
@@ -130,6 +131,7 @@ function promptAudioModels(models) {
130
131
  return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));
131
132
  }
132
133
  function normalizeModels(raw) {
134
+ var _a;
133
135
  let payload = raw;
134
136
  if (typeof payload === "string") {
135
137
  try {
@@ -140,11 +142,11 @@ function normalizeModels(raw) {
140
142
  }
141
143
  const record = payload && typeof payload === "object" ? payload : {};
142
144
  const nested = record.data && typeof record.data === "object" ? record.data : record;
143
- const list = Array.isArray(payload) ? payload : Array.isArray(nested.models) ? nested.models : Array.isArray(nested.data) ? nested.data : Array.isArray(record.models) ? record.models : [];
145
+ const list = (_a = [payload, nested.models, nested.data, record.models].find(Array.isArray)) != null ? _a : [];
144
146
  return list.map((m) => {
145
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
147
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
146
148
  return __spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
147
- id: String((_c = (_b = (_a = m.id) != null ? _a : m.modelId) != null ? _b : m.name) != null ? _c : ""),
149
+ id: String((_c = (_b = (_a2 = m.id) != null ? _a2 : m.modelId) != null ? _b : m.name) != null ? _c : ""),
148
150
  label: String((_h = (_g = (_f = (_e = (_d = m.displayName) != null ? _d : m.label) != null ? _e : m.title) != null ? _f : m.name) != null ? _g : m.id) != null ? _h : ""),
149
151
  provider: String((_j = (_i = m.provider) != null ? _i : m.source) != null ? _j : ""),
150
152
  description: String((_k = m.description) != null ? _k : "")
@@ -219,7 +221,6 @@ function modelThatReadsImages(models, selectedId) {
219
221
  }
220
222
  function generationCapabilities(model) {
221
223
  var _a, _b, _c;
222
- (model == null ? void 0 : model.provider) === "google";
223
224
  return {
224
225
  aspects: ((_a = model == null ? void 0 : model.aspectRatios) == null ? void 0 : _a.length) ? model.aspectRatios : ["16:9", "9:16"],
225
226
  resolutions: (_b = model == null ? void 0 : model.resolutions) != null ? _b : [],
@@ -1 +1 @@
1
- {"version":3,"file":"generationModels.js","sources":["../../../src/features/canvas/generationModels.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `hooks/useModelList` — LIST_MODELS shapes\n * and duration gating. An out-of-range `durationSeconds` comes back as a\n * blank video, not an error (web issue #305).\n */\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n description: string;\n supportsImageInput?: boolean;\n supportsVideoInput?: boolean;\n supportsImageToVideo?: boolean;\n supportsEndFrame?: boolean;\n /** Whether the video model reads style/subject reference stills (`styleReferenceUrls`). */\n supportsReferenceImages?: boolean;\n /** How many reference stills it reads (Veo 3, Seedance 9); see `videoReferenceCap`. */\n maxReferenceImages?: number;\n supportsAudio?: boolean;\n isFast?: boolean;\n type?: string;\n supportedDurationsSeconds?: number[];\n defaultDurationSeconds?: number;\n maxDurationSeconds?: number;\n aspectRatios?: string[];\n resolutions?: string[];\n}\n\nconst VEO_ASPECTS = ['16:9', '9:16'];\nconst VEO_RESOLUTIONS = ['720p', '1080p'];\nconst VEO_DURATIONS = [4, 6, 8];\n\nexport const STATIC_IMAGE_MODELS: ModelInfo[] = [\n { id: 'gemini-3.1-flash-image-preview', label: 'Gemini Efficient', provider: 'google', description: '' },\n];\n\n/** Offline fallback — verbatim copy of canvas-surface `hooks/useModelList` STATIC_VIDEO_MODELS (the connector's VEO_MODEL_REGISTRY). */\nexport const STATIC_VIDEO_MODELS: ModelInfo[] = [\n {\n id: 'veo-3.1-generate-preview',\n label: 'Veo 3.1 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n supportsAudio: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3.1-fast-generate-preview',\n label: 'Veo 3.1 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n isFast: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-generate-preview',\n label: 'Veo 3 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-fast-generate-preview',\n label: 'Veo 3 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-2.0-generate-001',\n label: 'Veo 2.0',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: [5, 6, 7, 8],\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'bytedance/seedance-2.0',\n label: 'Seedance 2.0',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n },\n {\n id: 'bytedance/seedance-2.0-fast',\n label: 'Seedance 2.0 Fast',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n isFast: true,\n },\n];\n\nexport const AUDIO_PROMPT_TYPES = new Set(['tts', 'sfx', 'music']);\n\nfunction durationList(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n return raw.filter((s): s is number => typeof s === 'number' && Number.isFinite(s) && s > 0);\n}\n\nfunction duration(raw: unknown): number | undefined {\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? raw : undefined;\n}\n\nexport function videoDurationOptions(model: ModelInfo | undefined): number[] {\n return model?.supportedDurationsSeconds ?? [];\n}\n\nexport function promptAudioModels(models: ModelInfo[]): ModelInfo[] {\n return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));\n}\n\nexport function normalizeModels(raw: unknown): ModelInfo[] {\n let payload: unknown = raw;\n if (typeof payload === 'string') {\n try {\n payload = JSON.parse(payload);\n } catch {\n return [];\n }\n }\n const record = payload && typeof payload === 'object' ? (payload as Record<string, unknown>) : {};\n const nested = record.data && typeof record.data === 'object' ? (record.data as Record<string, unknown>) : record;\n const list = Array.isArray(payload)\n ? payload\n : Array.isArray(nested.models)\n ? nested.models\n : Array.isArray(nested.data)\n ? nested.data\n : Array.isArray(record.models)\n ? record.models\n : [];\n return (list as Array<Record<string, unknown>>)\n .map((m) => ({\n id: String(m.id ?? m.modelId ?? m.name ?? ''),\n label: String(m.displayName ?? m.label ?? m.title ?? m.name ?? m.id ?? ''),\n provider: String(m.provider ?? m.source ?? ''),\n description: String(m.description ?? ''),\n ...(typeof m.supportsImageInput === 'boolean' ? { supportsImageInput: m.supportsImageInput } : {}),\n ...(typeof m.supportsVideoInput === 'boolean' ? { supportsVideoInput: m.supportsVideoInput } : {}),\n ...(typeof m.supportsImageToVideo === 'boolean' ? { supportsImageToVideo: m.supportsImageToVideo } : {}),\n ...(typeof m.supportsEndFrame === 'boolean' ? { supportsEndFrame: m.supportsEndFrame } : {}),\n ...(typeof m.supportsReferenceImages === 'boolean'\n ? { supportsReferenceImages: m.supportsReferenceImages }\n : {}),\n ...(typeof m.maxReferenceImages === 'number' && Number.isFinite(m.maxReferenceImages)\n ? { maxReferenceImages: Math.max(0, Math.round(m.maxReferenceImages)) }\n : {}),\n ...(typeof m.supportsAudio === 'boolean' ? { supportsAudio: m.supportsAudio } : {}),\n ...(typeof m.isFast === 'boolean' ? { isFast: m.isFast } : {}),\n ...(Array.isArray(m.aspectRatios) ? { aspectRatios: m.aspectRatios.map(String).filter(Boolean) } : {}),\n ...(Array.isArray(m.resolutions) ? { resolutions: m.resolutions.map(String).filter(Boolean) } : {}),\n ...(typeof m.type === 'string' ? { type: m.type } : {}),\n supportedDurationsSeconds: durationList(m.supportedDurationsSeconds),\n ...(duration(m.defaultDurationSeconds) ? { defaultDurationSeconds: Number(m.defaultDurationSeconds) } : {}),\n ...(duration(m.maxDurationSeconds) ? { maxDurationSeconds: Number(m.maxDurationSeconds) } : {}),\n }))\n .filter((m) => Boolean(m.id));\n}\n\nexport function buildVideoGenerateParams(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n durationSeconds?: number;\n referenceImageUrl?: string;\n referenceVideoUrl?: string;\n /** End frame (web `referenceEndImageUrl`); only models with `supportsEndFrame` read it. */\n referenceEndImageUrl?: string;\n /** Style/subject stills, capped by `videoReferenceCap`. */\n styleReferenceUrls?: string[];\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n}): Record<string, unknown> {\n return {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.durationSeconds ? { durationSeconds: opts.durationSeconds } : {}),\n ...(opts.referenceImageUrl ? { referenceImageUrl: opts.referenceImageUrl } : {}),\n ...(opts.referenceVideoUrl ? { referenceVideoUrl: opts.referenceVideoUrl } : {}),\n ...(opts.referenceEndImageUrl ? { referenceEndImageUrl: opts.referenceEndImageUrl } : {}),\n ...(opts.styleReferenceUrls?.length ? { styleReferenceUrls: opts.styleReferenceUrls } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n // Sent whenever set: a model that defaults to sound needs an explicit false.\n ...(opts.generateAudio !== undefined ? { generateAudio: opts.generateAudio } : {}),\n ...(opts.negativePrompt ? { negativePrompt: opts.negativePrompt } : {}),\n };\n}\n\n/** Smallest reference count any provider takes - the cap when the connector does not say (web). */\nexport const DEFAULT_VIDEO_REFERENCE_CAP = 3;\n\n/** How many reference stills the selected video model's slot holds (web `videoReferenceCap`). */\nexport function videoReferenceCap(models: readonly ModelInfo[], selectedId: string): number {\n const current = models.find((m) => m.id === selectedId);\n if (!current) return DEFAULT_VIDEO_REFERENCE_CAP;\n if (typeof current.maxReferenceImages === 'number') return current.maxReferenceImages;\n return current.supportsReferenceImages === false ? 0 : DEFAULT_VIDEO_REFERENCE_CAP;\n}\n\n/** With a still attached, the first model that reads images when the pick cannot (web `modelThatReadsImages`). */\nexport function modelThatReadsImages(models: readonly ModelInfo[], selectedId: string): string | null {\n const current = models.find((m) => m.id === selectedId);\n if (!current || current.supportsImageInput !== false) return null;\n return models.find((m) => m.supportsImageInput)?.id ?? null;\n}\n\n/** Twin of canvas-surface `videoGenOptions.generationCapabilities`. */\nexport function generationCapabilities(model: ModelInfo | undefined): {\n aspects: string[];\n resolutions: string[];\n canAudio: boolean;\n canStartFrame: boolean;\n canEndFrame: boolean;\n canVideoInput: boolean;\n} {\n const google = model?.provider === 'google';\n return {\n aspects: model?.aspectRatios?.length ? model.aspectRatios : ['16:9', '9:16'],\n resolutions: model?.resolutions ?? [],\n canAudio: Boolean(model?.supportsAudio),\n canStartFrame: model?.supportsImageToVideo ?? true,\n canEndFrame: Boolean(model?.supportsEndFrame),\n canVideoInput: Boolean(model?.supportsVideoInput),\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generationModels.js","sources":["../../../src/features/canvas/generationModels.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `hooks/useModelList` — LIST_MODELS shapes\n * and duration gating. An out-of-range `durationSeconds` comes back as a\n * blank video, not an error (web issue #305).\n */\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n description: string;\n supportsImageInput?: boolean;\n supportsVideoInput?: boolean;\n supportsImageToVideo?: boolean;\n supportsEndFrame?: boolean;\n /** Whether the video model reads style/subject reference stills (`styleReferenceUrls`). */\n supportsReferenceImages?: boolean;\n /** How many reference stills it reads (Veo 3, Seedance 9); see `videoReferenceCap`. */\n maxReferenceImages?: number;\n supportsAudio?: boolean;\n isFast?: boolean;\n type?: string;\n supportedDurationsSeconds?: number[];\n defaultDurationSeconds?: number;\n maxDurationSeconds?: number;\n aspectRatios?: string[];\n resolutions?: string[];\n}\n\nconst VEO_ASPECTS = ['16:9', '9:16'];\nconst VEO_RESOLUTIONS = ['720p', '1080p'];\nconst VEO_DURATIONS = [4, 6, 8];\n\n/**\n * Offline fallback for the image picker, and the lane default that\n * `defaultModelForLane` hands to an unpinned generate/edit.\n *\n * The id must be one the image connector's registry actually knows.\n * `gemini-3.1-flash-image-preview` was not: the registry's entry is\n * `google/gemini-3.1-flash-image-preview`, so the bare id matched nothing,\n * fell to the default provider - direct Google - and every request labelled\n * \"Gemini Efficient\" was billed against the AI Studio key, whose prepay is\n * depleted.\n */\nexport const STATIC_IMAGE_MODELS: ModelInfo[] = [\n {\n id: 'gemini-efficient',\n label: 'Gemini Efficient',\n provider: 'antigravity',\n description: '',\n supportsImageInput: true,\n },\n];\n\n/** Offline fallback — verbatim copy of canvas-surface `hooks/useModelList` STATIC_VIDEO_MODELS (the connector's VEO_MODEL_REGISTRY). */\nexport const STATIC_VIDEO_MODELS: ModelInfo[] = [\n {\n id: 'veo-3.1-generate-preview',\n label: 'Veo 3.1 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n supportsAudio: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3.1-fast-generate-preview',\n label: 'Veo 3.1 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n isFast: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-generate-preview',\n label: 'Veo 3 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-fast-generate-preview',\n label: 'Veo 3 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-2.0-generate-001',\n label: 'Veo 2.0',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: [5, 6, 7, 8],\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'bytedance/seedance-2.0',\n label: 'Seedance 2.0',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n },\n {\n id: 'bytedance/seedance-2.0-fast',\n label: 'Seedance 2.0 Fast',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n isFast: true,\n },\n];\n\nexport const AUDIO_PROMPT_TYPES = new Set(['tts', 'sfx', 'music']);\n\nfunction durationList(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n return raw.filter((s): s is number => typeof s === 'number' && Number.isFinite(s) && s > 0);\n}\n\nfunction duration(raw: unknown): number | undefined {\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? raw : undefined;\n}\n\nexport function videoDurationOptions(model: ModelInfo | undefined): number[] {\n return model?.supportedDurationsSeconds ?? [];\n}\n\nexport function promptAudioModels(models: ModelInfo[]): ModelInfo[] {\n return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));\n}\n\nexport function normalizeModels(raw: unknown): ModelInfo[] {\n let payload: unknown = raw;\n if (typeof payload === 'string') {\n try {\n payload = JSON.parse(payload);\n } catch {\n return [];\n }\n }\n const record = payload && typeof payload === 'object' ? (payload as Record<string, unknown>) : {};\n const nested = record.data && typeof record.data === 'object' ? (record.data as Record<string, unknown>) : record;\n // The first array among the envelopes LIST_MODELS has been seen to answer with.\n const list = [payload, nested.models, nested.data, record.models].find(Array.isArray) ?? [];\n return (list as Array<Record<string, unknown>>)\n .map((m) => ({\n id: String(m.id ?? m.modelId ?? m.name ?? ''),\n label: String(m.displayName ?? m.label ?? m.title ?? m.name ?? m.id ?? ''),\n provider: String(m.provider ?? m.source ?? ''),\n description: String(m.description ?? ''),\n ...(typeof m.supportsImageInput === 'boolean' ? { supportsImageInput: m.supportsImageInput } : {}),\n ...(typeof m.supportsVideoInput === 'boolean' ? { supportsVideoInput: m.supportsVideoInput } : {}),\n ...(typeof m.supportsImageToVideo === 'boolean' ? { supportsImageToVideo: m.supportsImageToVideo } : {}),\n ...(typeof m.supportsEndFrame === 'boolean' ? { supportsEndFrame: m.supportsEndFrame } : {}),\n ...(typeof m.supportsReferenceImages === 'boolean'\n ? { supportsReferenceImages: m.supportsReferenceImages }\n : {}),\n ...(typeof m.maxReferenceImages === 'number' && Number.isFinite(m.maxReferenceImages)\n ? { maxReferenceImages: Math.max(0, Math.round(m.maxReferenceImages)) }\n : {}),\n ...(typeof m.supportsAudio === 'boolean' ? { supportsAudio: m.supportsAudio } : {}),\n ...(typeof m.isFast === 'boolean' ? { isFast: m.isFast } : {}),\n ...(Array.isArray(m.aspectRatios) ? { aspectRatios: m.aspectRatios.map(String).filter(Boolean) } : {}),\n ...(Array.isArray(m.resolutions) ? { resolutions: m.resolutions.map(String).filter(Boolean) } : {}),\n ...(typeof m.type === 'string' ? { type: m.type } : {}),\n supportedDurationsSeconds: durationList(m.supportedDurationsSeconds),\n ...(duration(m.defaultDurationSeconds) ? { defaultDurationSeconds: Number(m.defaultDurationSeconds) } : {}),\n ...(duration(m.maxDurationSeconds) ? { maxDurationSeconds: Number(m.maxDurationSeconds) } : {}),\n }))\n .filter((m) => Boolean(m.id));\n}\n\nexport function buildVideoGenerateParams(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n durationSeconds?: number;\n referenceImageUrl?: string;\n referenceVideoUrl?: string;\n /** End frame (web `referenceEndImageUrl`); only models with `supportsEndFrame` read it. */\n referenceEndImageUrl?: string;\n /** Style/subject stills, capped by `videoReferenceCap`. */\n styleReferenceUrls?: string[];\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n}): Record<string, unknown> {\n return {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.durationSeconds ? { durationSeconds: opts.durationSeconds } : {}),\n ...(opts.referenceImageUrl ? { referenceImageUrl: opts.referenceImageUrl } : {}),\n ...(opts.referenceVideoUrl ? { referenceVideoUrl: opts.referenceVideoUrl } : {}),\n ...(opts.referenceEndImageUrl ? { referenceEndImageUrl: opts.referenceEndImageUrl } : {}),\n ...(opts.styleReferenceUrls?.length ? { styleReferenceUrls: opts.styleReferenceUrls } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n // Sent whenever set: a model that defaults to sound needs an explicit false.\n ...(opts.generateAudio !== undefined ? { generateAudio: opts.generateAudio } : {}),\n ...(opts.negativePrompt ? { negativePrompt: opts.negativePrompt } : {}),\n };\n}\n\n/** Smallest reference count any provider takes - the cap when the connector does not say (web). */\nexport const DEFAULT_VIDEO_REFERENCE_CAP = 3;\n\n/** How many reference stills the selected video model's slot holds (web `videoReferenceCap`). */\nexport function videoReferenceCap(models: readonly ModelInfo[], selectedId: string): number {\n const current = models.find((m) => m.id === selectedId);\n if (!current) return DEFAULT_VIDEO_REFERENCE_CAP;\n if (typeof current.maxReferenceImages === 'number') return current.maxReferenceImages;\n return current.supportsReferenceImages === false ? 0 : DEFAULT_VIDEO_REFERENCE_CAP;\n}\n\n/** With a still attached, the first model that reads images when the pick cannot (web `modelThatReadsImages`). */\nexport function modelThatReadsImages(models: readonly ModelInfo[], selectedId: string): string | null {\n const current = models.find((m) => m.id === selectedId);\n if (!current || current.supportsImageInput !== false) return null;\n return models.find((m) => m.supportsImageInput)?.id ?? null;\n}\n\n/** Twin of canvas-surface `videoGenOptions.generationCapabilities`. */\nexport function generationCapabilities(model: ModelInfo | undefined): {\n aspects: string[];\n resolutions: string[];\n canAudio: boolean;\n canStartFrame: boolean;\n canEndFrame: boolean;\n canVideoInput: boolean;\n} {\n return {\n aspects: model?.aspectRatios?.length ? model.aspectRatios : ['16:9', '9:16'],\n resolutions: model?.resolutions ?? [],\n canAudio: Boolean(model?.supportsAudio),\n canStartFrame: model?.supportsImageToVideo ?? true,\n canEndFrame: Boolean(model?.supportsEndFrame),\n canVideoInput: Boolean(model?.supportsVideoInput),\n };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {MaterialCommunityIcons}from'@expo/vector-icons';import {memo,useState,useRef,useEffect}from'react';import {View,StyleSheet,Pressable,ActivityIndicator,Text}from'react-native';const ACCENT = "#2563eb";
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {MaterialCommunityIcons}from'@expo/vector-icons';import {memo,useState,useRef,useEffect}from'react';import {View,StyleSheet,Pressable,ActivityIndicator,Text}from'react-native';import {totalSteps}from'./toolActivity.js';const ACCENT = "#2563eb";
2
2
  const DONE = "#10b981";
3
3
  function formatElapsed(ms) {
4
4
  const s = Math.round(ms / 1e3);
@@ -33,7 +33,7 @@ const ToolTimeline = memo(function ToolTimeline2({
33
33
  const bg = isDark ? "#0b1220" : "#f9fafb";
34
34
  const muted = isDark ? "#94a3b8" : "#6b7280";
35
35
  const strong = isDark ? "#e2e8f0" : "#111827";
36
- const count = steps.length;
36
+ const count = totalSteps(steps);
37
37
  const summary = active ? `Working \xB7 ${formatElapsed(elapsed)}` : `Used ${count} tool${count === 1 ? "" : "s"}${elapsed ? ` \xB7 ${formatElapsed(elapsed)}` : ""}`;
38
38
  return /* @__PURE__ */ jsxs(View, { style: [styles.wrap, {
39
39
  borderColor: border,
@@ -59,6 +59,12 @@ const ToolTimeline = memo(function ToolTimeline2({
59
59
  /* @__PURE__ */ jsx(Text, { style: [styles.stepLabel, {
60
60
  color: step.status === "running" ? strong : muted
61
61
  }], numberOfLines: 1, children: step.label }),
62
+ step.count ? /* @__PURE__ */ jsxs(Text, { style: [styles.stepCount, {
63
+ color: muted
64
+ }], children: [
65
+ "\xD7",
66
+ step.count
67
+ ] }) : null,
62
68
  step.detail ? /* @__PURE__ */ jsxs(Text, { style: [styles.stepDetail, {
63
69
  color: muted
64
70
  }], numberOfLines: 1, children: [
@@ -110,6 +116,11 @@ const styles = StyleSheet.create({
110
116
  fontSize: 12,
111
117
  flexShrink: 1
112
118
  },
119
+ stepCount: {
120
+ fontSize: 12,
121
+ marginLeft: 4,
122
+ fontVariant: ["tabular-nums"]
123
+ },
113
124
  stepDetail: {
114
125
  fontSize: 12,
115
126
  marginLeft: 4,
@@ -1 +1 @@
1
- {"version":3,"file":"ToolTimeline.js","sources":["../../../src/features/chat/ToolTimeline.tsx"],"sourcesContent":["/**\n * <ToolTimeline> — the agent's tool activity, as a collapsible strip.\n *\n * The cdecli agent narrates tool use into the streamed assistant text as bare\n * `⚙ ToolSearch` rows. Rendered raw they read as debug noise — which is exactly\n * what mobile was showing. {@link ./toolActivity} pulls them out of the prose;\n * this draws them.\n *\n * Same behaviour as the web timeline (auto-expand while working, last step\n * spins, collapse to \"Used N tools\" when done), rebuilt for touch: a full-width\n * 44pt header row instead of a hover-styled button, ActivityIndicator instead of\n * a CSS spin, and no title tooltips (there is nowhere to hover) so details\n * truncate in place.\n */\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport React, { memo, useEffect, useRef, useState } from 'react';\nimport { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';\nimport type { ToolStep } from './toolActivity';\n\nconst ACCENT = '#2563eb';\nconst DONE = '#10b981';\n\nfunction formatElapsed(ms: number): string {\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n return `${m}m ${s % 60}s`;\n}\n\nexport const ToolTimeline = memo(function ToolTimeline({\n steps,\n active,\n isDark = false,\n}: {\n steps: ToolStep[];\n /** True while the turn is still streaming: drives the spinner and the timer. */\n active: boolean;\n isDark?: boolean;\n}) {\n // Expanded while working so live progress is visible; collapses once done.\n const [open, setOpen] = useState(active);\n // Captured on first activity, frozen at completion. Ref-held so re-renders\n // do not restart it.\n const startedAtRef = useRef<number | null>(null);\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n if (active) {\n if (startedAtRef.current === null) startedAtRef.current = Date.now();\n const tick = () => setElapsed(Date.now() - (startedAtRef.current ?? Date.now()));\n tick();\n const timer = setInterval(tick, 1000);\n return () => clearInterval(timer);\n }\n setOpen(false);\n return undefined;\n }, [active]);\n\n if (steps.length === 0) return null;\n\n const border = isDark ? '#1f2937' : '#e5e7eb';\n const bg = isDark ? '#0b1220' : '#f9fafb';\n const muted = isDark ? '#94a3b8' : '#6b7280';\n const strong = isDark ? '#e2e8f0' : '#111827';\n\n const count = steps.length;\n const summary = active\n ? `Working · ${formatElapsed(elapsed)}`\n : `Used ${count} tool${count === 1 ? '' : 's'}${elapsed ? ` · ${formatElapsed(elapsed)}` : ''}`;\n\n return (\n <View style={[styles.wrap, { borderColor: border, backgroundColor: bg }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ expanded: open }}\n accessibilityLabel={summary}\n onPress={() => setOpen((v) => !v)}\n style={({ pressed }) => ({ opacity: pressed ? 0.7 : 1 })}\n >\n {/* The row lives on a View: on the Pressable's style callback the\n header lost its row layout and padding and stacked vertically. */}\n <View style={styles.header}>\n {active ? (\n <ActivityIndicator size=\"small\" color={ACCENT} style={styles.headerIcon} />\n ) : (\n <MaterialCommunityIcons\n name=\"wrench-outline\"\n size={14}\n color={muted}\n style={styles.headerIcon}\n />\n )}\n <Text style={[styles.summary, { color: muted }]} numberOfLines={1}>\n {summary}\n </Text>\n <MaterialCommunityIcons name={open ? 'chevron-down' : 'chevron-right'} size={18} color={muted} />\n </View>\n </Pressable>\n\n {open ? (\n <View style={[styles.list, { borderTopColor: border }]}>\n {steps.map((step) => (\n <View key={step.id} style={styles.step}>\n {step.status === 'running' ? (\n <ActivityIndicator size=\"small\" color={ACCENT} style={styles.stepIcon} />\n ) : (\n <MaterialCommunityIcons name=\"check\" size={13} color={DONE} style={styles.stepIcon} />\n )}\n <Text\n style={[styles.stepLabel, { color: step.status === 'running' ? strong : muted }]}\n numberOfLines={1}\n >\n {step.label}\n </Text>\n {step.detail ? (\n <Text style={[styles.stepDetail, { color: muted }]} numberOfLines={1}>\n · {step.detail}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n wrap: {\n width: '100%',\n borderWidth: 1,\n borderRadius: 10,\n marginBottom: 8,\n overflow: 'hidden',\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n minHeight: 44, // touch target\n },\n headerIcon: { width: 18, marginRight: 6 },\n summary: { flex: 1, fontSize: 12, fontWeight: '600' },\n list: { borderTopWidth: 1, paddingHorizontal: 10, paddingVertical: 6 },\n step: { flexDirection: 'row', alignItems: 'center', paddingVertical: 3 },\n stepIcon: { width: 16, marginRight: 6 },\n stepLabel: { fontSize: 12, flexShrink: 1 },\n stepDetail: { fontSize: 12, marginLeft: 4, flexShrink: 1 },\n});\n\nexport default ToolTimeline;\n"],"names":["ToolTimeline"],"mappings":"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"}
1
+ {"version":3,"file":"ToolTimeline.js","sources":["../../../src/features/chat/ToolTimeline.tsx"],"sourcesContent":["/**\n * <ToolTimeline> — the agent's tool activity, as a collapsible strip.\n *\n * The cdecli agent narrates tool use into the streamed assistant text as bare\n * `⚙ ToolSearch` rows. Rendered raw they read as debug noise — which is exactly\n * what mobile was showing. {@link ./toolActivity} pulls them out of the prose;\n * this draws them.\n *\n * Same behaviour as the web timeline (auto-expand while working, last step\n * spins, collapse to \"Used N tools\" when done), rebuilt for touch: a full-width\n * 44pt header row instead of a hover-styled button, ActivityIndicator instead of\n * a CSS spin, and no title tooltips (there is nowhere to hover) so details\n * truncate in place.\n */\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport React, { memo, useEffect, useRef, useState } from 'react';\nimport { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';\nimport { totalSteps, type ToolStep } from './toolActivity';\n\nconst ACCENT = '#2563eb';\nconst DONE = '#10b981';\n\nfunction formatElapsed(ms: number): string {\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n return `${m}m ${s % 60}s`;\n}\n\nexport const ToolTimeline = memo(function ToolTimeline({\n steps,\n active,\n isDark = false,\n}: {\n steps: ToolStep[];\n /** True while the turn is still streaming: drives the spinner and the timer. */\n active: boolean;\n isDark?: boolean;\n}) {\n // Expanded while working so live progress is visible; collapses once done.\n const [open, setOpen] = useState(active);\n // Captured on first activity, frozen at completion. Ref-held so re-renders\n // do not restart it.\n const startedAtRef = useRef<number | null>(null);\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n if (active) {\n if (startedAtRef.current === null) startedAtRef.current = Date.now();\n const tick = () => setElapsed(Date.now() - (startedAtRef.current ?? Date.now()));\n tick();\n const timer = setInterval(tick, 1000);\n return () => clearInterval(timer);\n }\n setOpen(false);\n return undefined;\n }, [active]);\n\n if (steps.length === 0) return null;\n\n const border = isDark ? '#1f2937' : '#e5e7eb';\n const bg = isDark ? '#0b1220' : '#f9fafb';\n const muted = isDark ? '#94a3b8' : '#6b7280';\n const strong = isDark ? '#e2e8f0' : '#111827';\n\n const count = totalSteps(steps);\n const summary = active\n ? `Working · ${formatElapsed(elapsed)}`\n : `Used ${count} tool${count === 1 ? '' : 's'}${elapsed ? ` · ${formatElapsed(elapsed)}` : ''}`;\n\n return (\n <View style={[styles.wrap, { borderColor: border, backgroundColor: bg }]}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ expanded: open }}\n accessibilityLabel={summary}\n onPress={() => setOpen((v) => !v)}\n style={({ pressed }) => ({ opacity: pressed ? 0.7 : 1 })}\n >\n {/* The row lives on a View: on the Pressable's style callback the\n header lost its row layout and padding and stacked vertically. */}\n <View style={styles.header}>\n {active ? (\n <ActivityIndicator size=\"small\" color={ACCENT} style={styles.headerIcon} />\n ) : (\n <MaterialCommunityIcons\n name=\"wrench-outline\"\n size={14}\n color={muted}\n style={styles.headerIcon}\n />\n )}\n <Text style={[styles.summary, { color: muted }]} numberOfLines={1}>\n {summary}\n </Text>\n <MaterialCommunityIcons name={open ? 'chevron-down' : 'chevron-right'} size={18} color={muted} />\n </View>\n </Pressable>\n\n {open ? (\n <View style={[styles.list, { borderTopColor: border }]}>\n {steps.map((step) => (\n <View key={step.id} style={styles.step}>\n {step.status === 'running' ? (\n <ActivityIndicator size=\"small\" color={ACCENT} style={styles.stepIcon} />\n ) : (\n <MaterialCommunityIcons name=\"check\" size={13} color={DONE} style={styles.stepIcon} />\n )}\n <Text\n style={[styles.stepLabel, { color: step.status === 'running' ? strong : muted }]}\n numberOfLines={1}\n >\n {step.label}\n </Text>\n {step.count ? (\n <Text style={[styles.stepCount, { color: muted }]}>×{step.count}</Text>\n ) : null}\n {step.detail ? (\n <Text style={[styles.stepDetail, { color: muted }]} numberOfLines={1}>\n · {step.detail}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n wrap: {\n width: '100%',\n borderWidth: 1,\n borderRadius: 10,\n marginBottom: 8,\n overflow: 'hidden',\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n minHeight: 44, // touch target\n },\n headerIcon: { width: 18, marginRight: 6 },\n summary: { flex: 1, fontSize: 12, fontWeight: '600' },\n list: { borderTopWidth: 1, paddingHorizontal: 10, paddingVertical: 6 },\n step: { flexDirection: 'row', alignItems: 'center', paddingVertical: 3 },\n stepIcon: { width: 16, marginRight: 6 },\n stepLabel: { fontSize: 12, flexShrink: 1 },\n stepCount: { fontSize: 12, marginLeft: 4, fontVariant: ['tabular-nums'] },\n stepDetail: { fontSize: 12, marginLeft: 4, flexShrink: 1 },\n});\n\nexport default ToolTimeline;\n"],"names":["ToolTimeline"],"mappings":"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"}
@@ -18,11 +18,17 @@ var __spreadValues = (a, b) => {
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  const COMPUTER_CONNECTOR = "yantra-computer";
21
+ function totalSteps(steps) {
22
+ return steps.reduce((total, step) => {
23
+ var _a;
24
+ return total + ((_a = step.count) != null ? _a : 1);
25
+ }, 0);
26
+ }
21
27
  const GEAR_LINE_RE = /^[ \t]*[⚙🔧\u{1F6E0}]️?[ \t]+(.+?)[ \t]*$/u;
22
28
  const BARE_MCP_LINE_RE = /^[ \t]*(mcp__[^\s].*?)[ \t]*$/;
23
29
  const BARE_GEAR_LINE_RE = /^[ \t]*[⚙🔧\u{1F6E0}]️?[ \t]*$/u;
24
- const TOOL_LABELS = [[/^tool[_-]?search$/i, "Searching tools"], [/^web[_-]?search$/i, "Searching the web"], [/^web[_-]?scrape$/i, "Reading a page"], [/^web[_-]?batch[_-]?scrape$/i, "Reading pages"], [/^reddit[_-]?search$/i, "Searching Reddit"], [/^x[_-]?search$/i, "Searching X"], [/^youtube[_-]?search$/i, "Searching YouTube"], [/^academic[_-]?search$/i, "Searching papers"], [/^(yantra[_-]?)?github[_-]?search$/i, "Searching GitHub"], [/^bash$/i, "Running a command"], [/^grep$/i, "Searching files"], [/^(str_replace_editor|edit|write)$/i, "Editing files"], [/^read$/i, "Reading files"]];
25
- const COMPUTER_ACTION_LABELS = [[/_(RESOLVE|STATUS|PROVIDERS)$/i, "Finding your Computer"], [/_(CREATE|RESUME)$/i, "Starting your Computer"], [/_BROWSE$/i, "Opening a page on your Computer"], [/_READ_PAGE$/i, "Reading the page on your Computer"], [/_SCREENSHOT$/i, "Looking at your Computer screen"], [/_(ACT|INPUT)$/i, "Clicking and typing on your Computer"], [/_ATTACH_FILE$/i, "Attaching a file on your Computer"], [/_(READ_FILE|WRITE_FILE)$/i, "Working with files on your Computer"], [/_EXEC$/i, "Running a command on your Computer"]];
30
+ const TOOL_LABELS = [[/^tool[_-]?search$/i, "Searching tools"], [/^web[_-]?search$/i, "Searching the web"], [/^web[_-]?scrape$/i, "Reading a page"], [/^web[_-]?batch[_-]?scrape$/i, "Reading pages"], [/^reddit[_-]?search$/i, "Searching Reddit"], [/^x[_-]?search$/i, "Searching X"], [/^youtube[_-]?search$/i, "Searching YouTube"], [/^academic[_-]?search$/i, "Searching papers"], [/^(yantra[_-]?)?github[_-]?search$/i, "Searching GitHub"], [/^bash$/i, "Running a command"], [/^grep$/i, "Searching files"], [/^(str_replace_editor|edit|write)$/i, "Editing files"], [/^read$/i, "Reading files"], [/^search[_-]?connectors$/i, "Finding the right tool"], [/^list[_-]?credentials$/i, "Checking your saved logins"]];
31
+ const COMPUTER_ACTION_LABELS = [[/_(RESOLVE|STATUS|PROVIDERS)$|^(resolve\b|computer status|list computer providers)/i, "Finding your Computer"], [/_(CREATE|RESUME)$|^(create|resume) computer/i, "Starting your Computer"], [/_BROWSE$|^browse\b/i, "Opening a page on your Computer"], [/_READ_PAGE$|^read the .*page$/i, "Reading the page on your Computer"], [/_SCREENSHOT$|screenshot/i, "Looking at your Computer screen"], [/_(ACT|INPUT)$|^(act on|send real input)\b/i, "Clicking and typing on your Computer"], [/_ATTACH_FILE$|^attach a file/i, "Attaching a file on your Computer"], [/_(READ_FILE|WRITE_FILE)$|^(read|write) computer file/i, "Working with files on your Computer"], [/_EXEC$|^run command/i, "Running a command on your Computer"]];
26
32
  const CONNECTOR_LABELS = [[/image[_-]?gen/i, "Generating image"], [/video[_-]?gen/i, "Generating video"], [/(audio|tts|speech|voice)/i, "Generating audio"], [/search/i, "Searching"]];
27
33
  function prettifySlug(slug) {
28
34
  const words = slug.replace(/^yantra[_-]/i, "").replace(/[_-]+/g, " ").trim();
@@ -61,8 +67,7 @@ function stripToolPayloads(text) {
61
67
  const fenceRe = /```[\s\S]*?(?:```|$)/g;
62
68
  const out = [];
63
69
  let last = 0;
64
- let match;
65
- while (match = fenceRe.exec(text)) {
70
+ for (let match = fenceRe.exec(text); match; match = fenceRe.exec(text)) {
66
71
  out.push(stripUnfencedPayloadLines(text.slice(last, match.index)));
67
72
  const block = match[0];
68
73
  const isToolDump = /\/(?:data\/users\/)?\.cdecli-server\b/.test(block);
@@ -74,7 +79,7 @@ function stripToolPayloads(text) {
74
79
  return out.join("").replace(/\n{3,}/g, "\n\n").trim();
75
80
  }
76
81
  function humanizeToolLine(body) {
77
- var _a, _b, _c, _d, _e, _f, _g, _h;
82
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
78
83
  const trimmed = body.trim();
79
84
  const dashSplit = trimmed.split(/\s+[—–-]\s+/);
80
85
  const head = (_b = (_a = dashSplit[0]) == null ? void 0 : _a.trim()) != null ? _b : trimmed;
@@ -102,6 +107,16 @@ function humanizeToolLine(body) {
102
107
  detail: sanitizeDetail(detailRaw)
103
108
  };
104
109
  }
110
+ if (/^get[_-]?action[_-]?schema$/i.test(bareTool)) {
111
+ const connector = (_i = detailRaw == null ? void 0 : detailRaw.split("/")[0]) == null ? void 0 : _i.trim();
112
+ if (!connector) return {
113
+ label: "Looking up a tool"
114
+ };
115
+ return {
116
+ label: "Looking up a tool",
117
+ detail: connector === COMPUTER_CONNECTOR ? "Computer" : prettifySlug(connector)
118
+ };
119
+ }
105
120
  for (const [re, label2] of TOOL_LABELS) {
106
121
  if (re.test(bareTool)) return {
107
122
  label: label2,
@@ -115,6 +130,27 @@ function humanizeToolLine(body) {
115
130
  detail: sanitizeDetail(detailRaw)
116
131
  };
117
132
  }
133
+ function addStep(steps, {
134
+ label,
135
+ detail,
136
+ connector
137
+ }) {
138
+ var _a;
139
+ const previous = steps[steps.length - 1];
140
+ if (previous && previous.label === label && previous.detail === detail && previous.connector === connector) {
141
+ previous.count = ((_a = previous.count) != null ? _a : 1) + 1;
142
+ } else {
143
+ steps.push(__spreadProps(__spreadValues({
144
+ id: `tool-${steps.length}`,
145
+ label,
146
+ detail
147
+ }, connector && {
148
+ connector
149
+ }), {
150
+ status: "done"
151
+ }));
152
+ }
153
+ }
118
154
  function parseToolActivity(content, active = false) {
119
155
  var _a;
120
156
  if (!content) return {
@@ -127,24 +163,8 @@ function parseToolActivity(content, active = false) {
127
163
  const gear = GEAR_LINE_RE.exec(line);
128
164
  const mcp = gear ? null : BARE_MCP_LINE_RE.exec(line);
129
165
  const body = (_a = gear == null ? void 0 : gear[1]) != null ? _a : mcp == null ? void 0 : mcp[1];
130
- if (body) {
131
- const {
132
- label,
133
- detail,
134
- connector
135
- } = humanizeToolLine(body);
136
- steps.push(__spreadProps(__spreadValues({
137
- id: `tool-${steps.length}`,
138
- label,
139
- detail
140
- }, connector && {
141
- connector
142
- }), {
143
- status: "done"
144
- }));
145
- continue;
146
- }
147
- kept.push(line);
166
+ if (body) addStep(steps, humanizeToolLine(body));
167
+ else kept.push(line);
148
168
  }
149
169
  const joined = kept.join("\n").replace(/\n{3,}/g, "\n\n").trim();
150
170
  const text = steps.length > 0 ? stripToolPayloads(joined) : joined;
@@ -155,4 +175,4 @@ function parseToolActivity(content, active = false) {
155
175
  steps,
156
176
  text
157
177
  };
158
- }export{COMPUTER_CONNECTOR,humanizeToolLine,isToolPayloadLine,parseToolActivity,stripToolPayloads};//# sourceMappingURL=toolActivity.js.map
178
+ }export{COMPUTER_CONNECTOR,humanizeToolLine,isToolPayloadLine,parseToolActivity,stripToolPayloads,totalSteps};//# sourceMappingURL=toolActivity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolActivity.js","sources":["../../../src/features/chat/toolActivity.ts"],"sourcesContent":["/**\n * Tool-activity parsing for the polished status timeline (mobile).\n *\n * A port of the web's `features/chat/toolActivity`, copied rather than imported:\n * mobile is a separate bundle and shares no code with the web shell. It is pure\n * string logic with no DOM or React dependency, so the two are kept in step by\n * having the same tests rather than by a shared module.\n *\n *\n * The cdecli/agent narrates tool use into the streamed assistant text as bare\n * rows, e.g.:\n *\n * ⚙ ToolSearch\n * ⚙ mcp__cdecli__execute_action — yantra-image-generation/Image\n *\n * Rendered raw, these read as debug noise. We parse them out of the prose into\n * structured steps that {@link ./ToolTimeline} renders as an animated,\n * collapsible timeline, and hand back the cleaned prose so the bubble shows only\n * the real answer.\n *\n * Parsing is deliberately conservative: a line only counts as tool activity when\n * it leads with the gear/wrench glyph the agent prefixes, or is a standalone\n * `mcp__…` invocation. Ordinary prose never matches, so a miss degrades to\n * \"leave the text as-is\" rather than eating real content.\n */\n\nexport interface ToolStep {\n /** Stable within a single parse pass — index-based, so identical tools don't collide. */\n id: string;\n /** Humanized present-tense label, e.g. \"Generating image\". */\n label: string;\n /** Optional detail, e.g. the connector slug or raw tool token. */\n detail?: string;\n /** The connector an execute_action row ran on (`yantra-computer`), when it was one. */\n connector?: string;\n /** 'running' only ever applies to the LAST step of an in-flight turn. */\n status: 'running' | 'done';\n}\n\n/** The connector behind the user's cloud Computer - the one browser they can watch and take over. */\nexport const COMPUTER_CONNECTOR = 'yantra-computer';\n\n/** Whether any step of a turn ran on the user's Computer. */\nexport function usesComputer(steps: ToolStep[]): boolean {\n return steps.some((step) => step.connector === COMPUTER_CONNECTOR);\n}\n\nexport interface ParsedToolActivity {\n steps: ToolStep[];\n /** Prose with every tool-activity line removed. */\n text: string;\n}\n\n// A tool-activity line: optional indent, a gear/wrench glyph (with optional\n// emoji variation selector), then the tool token + optional \"— detail\". The `m`\n// flag scopes ^/$ to each line; `u` so the glyph classes match correctly.\nconst GEAR_LINE_RE = /^[ \\t]*[⚙🔧\\u{1F6E0}]️?[ \\t]+(.+?)[ \\t]*$/u;\n// A bare MCP invocation on its own line — the agent sometimes omits the glyph.\n// `mcp__` is vanishingly unlikely in real prose, so this is safe to strip.\nconst BARE_MCP_LINE_RE = /^[ \\t]*(mcp__[^\\s].*?)[ \\t]*$/;\n// The glyph alone: a tool row whose name has not streamed in yet. It is not\n// prose, and painted as text it trails the answer as a stray gear.\nconst BARE_GEAR_LINE_RE = /^[ \\t]*[⚙🔧\\u{1F6E0}]️?[ \\t]*$/u;\n\n/** Known tool tokens → present-tense labels. Anything unmapped falls back to a humanized token. */\nconst TOOL_LABELS: Array<[RegExp, string]> = [\n [/^tool[_-]?search$/i, 'Searching tools'],\n [/^web[_-]?search$/i, 'Searching the web'],\n [/^web[_-]?scrape$/i, 'Reading a page'],\n [/^web[_-]?batch[_-]?scrape$/i, 'Reading pages'],\n [/^reddit[_-]?search$/i, 'Searching Reddit'],\n [/^x[_-]?search$/i, 'Searching X'],\n [/^youtube[_-]?search$/i, 'Searching YouTube'],\n [/^academic[_-]?search$/i, 'Searching papers'],\n [/^(yantra[_-]?)?github[_-]?search$/i, 'Searching GitHub'],\n [/^bash$/i, 'Running a command'],\n [/^grep$/i, 'Searching files'],\n [/^(str_replace_editor|edit|write)$/i, 'Editing files'],\n [/^read$/i, 'Reading files'],\n];\n\n/**\n * The Computer's actions, by verb. The connector alone (\"Running computer\")\n * says nothing; what the person wants to know is that the agent is on their\n * browser and roughly what it is doing there.\n */\nconst COMPUTER_ACTION_LABELS: Array<[RegExp, string]> = [\n [/_(RESOLVE|STATUS|PROVIDERS)$/i, 'Finding your Computer'],\n [/_(CREATE|RESUME)$/i, 'Starting your Computer'],\n [/_BROWSE$/i, 'Opening a page on your Computer'],\n [/_READ_PAGE$/i, 'Reading the page on your Computer'],\n [/_SCREENSHOT$/i, 'Looking at your Computer screen'],\n [/_(ACT|INPUT)$/i, 'Clicking and typing on your Computer'],\n [/_ATTACH_FILE$/i, 'Attaching a file on your Computer'],\n [/_(READ_FILE|WRITE_FILE)$/i, 'Working with files on your Computer'],\n [/_EXEC$/i, 'Running a command on your Computer'],\n];\n\n/** Connector slug → verb phrase for `execute_action — <connector>/<action>` rows. */\nconst CONNECTOR_LABELS: Array<[RegExp, string]> = [\n [/image[_-]?gen/i, 'Generating image'],\n [/video[_-]?gen/i, 'Generating video'],\n [/(audio|tts|speech|voice)/i, 'Generating audio'],\n [/search/i, 'Searching'],\n];\n\n/** Title-case a slug/token: \"yantra-image-generation\" → \"Yantra image generation\". */\nfunction prettifySlug(slug: string): string {\n const words = slug\n .replace(/^yantra[_-]/i, '')\n .replace(/[_-]+/g, ' ')\n .trim();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : slug;\n}\n\n/** Shell / interpreter snippets the agent pastes after a bash/read row. */\nexport function isToolPayloadLine(line: string): boolean {\n const t = line.trim();\n if (!t) return false;\n if (/^```/.test(t)) return true;\n if (/^(import\\s+\\w+|from\\s+\\S+\\s+import)\\b/.test(t)) return true;\n if (/^(const|let|var)\\s+\\w+\\s*=/.test(t)) return true;\n if (/\\brequire\\s*\\(/.test(t)) return true;\n if (/^path\\s*=\\s*['\"`]/.test(t)) return true;\n if (/\\/(?:data\\/users\\/)?\\.cdecli-server\\b/.test(t)) return true;\n if (/^(mkdir|curl|chmod|rm |cp |mv |cat |echo |python3?\\b|node\\s+-e|npx |yarn |npm )\\b/.test(t)) return true;\n if (/^(fs\\.|JSON\\.parse|JSON\\.stringify)/.test(t)) return true;\n return false;\n}\n\nfunction looksLikeCommandDetail(detail: string): boolean {\n const t = detail.trim();\n if (!t) return false;\n if (isToolPayloadLine(t)) return true;\n if (/^(python3?|node|mkdir|curl|npx|bash|sh|zsh)\\b/.test(t)) return true;\n if (t.length > 72) return true;\n return false;\n}\n\nfunction sanitizeDetail(detail: string | undefined): string | undefined {\n if (!detail) return undefined;\n if (looksLikeCommandDetail(detail)) return undefined;\n return detail;\n}\n\nfunction stripUnfencedPayloadLines(chunk: string): string {\n return chunk\n .split('\\n')\n .filter((line) => !isToolPayloadLine(line))\n .join('\\n');\n}\n\n/**\n * Drop dumped tool scripts (unfenced bash/python after a gear row).\n * Never strip markdown fences — those are the answer's code examples.\n */\nexport function stripToolPayloads(text: string): string {\n const fenceRe = /```[\\s\\S]*?(?:```|$)/g;\n const out: string[] = [];\n let last = 0;\n let match: RegExpExecArray | null;\n while ((match = fenceRe.exec(text))) {\n out.push(stripUnfencedPayloadLines(text.slice(last, match.index)));\n const block = match[0];\n const isToolDump = /\\/(?:data\\/users\\/)?\\.cdecli-server\\b/.test(block);\n const keepWidget = /\\bpropsComponent\\b/.test(block);\n if (!isToolDump || keepWidget) out.push(block);\n last = match.index + block.length;\n }\n out.push(stripUnfencedPayloadLines(text.slice(last)));\n return out\n .join('')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\n/**\n * Turn a raw tool row body into a { label, detail }. Handles the two shapes we\n * see: a bare tool name (\"ToolSearch\") and an MCP execute_action carrying a\n * \"connector/action\" detail after an em/en dash.\n */\nexport function humanizeToolLine(body: string): { label: string; detail?: string; connector?: string } {\n const trimmed = body.trim();\n\n // `mcp__cdecli__execute_action — yantra-image-generation/Image`\n const dashSplit = trimmed.split(/\\s+[—–-]\\s+/);\n const head = dashSplit[0]?.trim() ?? trimmed;\n const detailRaw = dashSplit.length > 1 ? dashSplit.slice(1).join(' — ').trim() : undefined;\n\n // Strip an `mcp__<server>__` prefix off the head token.\n const bareTool = head.replace(/^mcp__[^_]+__/i, '').replace(/^mcp__/i, '');\n\n // execute_action rows: the meaning is in the connector detail, not the verb.\n if (/^execute_action$/i.test(bareTool) && detailRaw) {\n const connector = detailRaw.split('/')[0]?.trim() ?? detailRaw;\n if (connector === COMPUTER_CONNECTOR) {\n const action = detailRaw.split('/')[1]?.trim() ?? '';\n const label = COMPUTER_ACTION_LABELS.find(([re]) => re.test(action))?.[1] ?? 'Using your Computer';\n return { label, detail: 'Computer', connector };\n }\n for (const [re, label] of CONNECTOR_LABELS) {\n if (re.test(connector)) return { label, detail: prettifySlug(connector) };\n }\n return { label: `Running ${prettifySlug(connector)}`, detail: sanitizeDetail(detailRaw) };\n }\n\n for (const [re, label] of TOOL_LABELS) {\n if (re.test(bareTool)) return { label, detail: sanitizeDetail(detailRaw) };\n }\n\n // Generic fallback: prettify the token (camelCase / snake_case → spaced).\n const spaced = bareTool\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim();\n // Lowercase the WHOLE token, not just its first character: the split above\n // turns \"someNewTool\" into \"some New Tool\", and lowercasing only the head\n // left the label reading \"Running some New Tool\" mid-sentence.\n const label = spaced ? `Running ${spaced.toLowerCase()}` : 'Working';\n return { label, detail: sanitizeDetail(detailRaw) };\n}\n\n/**\n * Extract tool-activity rows from streamed/persisted assistant content.\n *\n * @param content raw assistant text\n * @param active when true the turn is still streaming, so the LAST step is\n * marked 'running'; otherwise every step is 'done'.\n */\nexport function parseToolActivity(content: string, active = false): ParsedToolActivity {\n if (!content) return { steps: [], text: content ?? '' };\n\n const steps: ToolStep[] = [];\n const kept: string[] = [];\n\n for (const line of content.split('\\n').filter((l) => !BARE_GEAR_LINE_RE.test(l))) {\n const gear = GEAR_LINE_RE.exec(line);\n const mcp = gear ? null : BARE_MCP_LINE_RE.exec(line);\n const body = gear?.[1] ?? mcp?.[1];\n if (body) {\n const { label, detail, connector } = humanizeToolLine(body);\n steps.push({ id: `tool-${steps.length}`, label, detail, ...(connector && { connector }), status: 'done' });\n continue;\n }\n kept.push(line);\n }\n\n const joined = kept\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n // Payload stripping is only for dumps that follow tool rows. Applying it\n // to every assistant turn deleted fenced JS/bash examples from the bubble.\n const text = steps.length > 0 ? stripToolPayloads(joined) : joined;\n\n if (active && steps.length > 0) {\n steps[steps.length - 1].status = 'running';\n }\n\n return { steps, text };\n}\n"],"names":["label"],"mappings":"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"}
1
+ {"version":3,"file":"toolActivity.js","sources":["../../../src/features/chat/toolActivity.ts"],"sourcesContent":["/**\n * Tool-activity parsing for the polished status timeline (mobile).\n *\n * A port of the web's `features/chat/toolActivity`, copied rather than imported:\n * mobile is a separate bundle and shares no code with the web shell. It is pure\n * string logic with no DOM or React dependency, so the two are kept in step by\n * having the same tests rather than by a shared module.\n *\n *\n * The cdecli/agent narrates tool use into the streamed assistant text as bare\n * rows, e.g.:\n *\n * ⚙ ToolSearch\n * ⚙ mcp__cdecli__execute_action — yantra-image-generation/Image\n *\n * Rendered raw, these read as debug noise. We parse them out of the prose into\n * structured steps that {@link ./ToolTimeline} renders as an animated,\n * collapsible timeline, and hand back the cleaned prose so the bubble shows only\n * the real answer.\n *\n * Parsing is deliberately conservative: a line only counts as tool activity when\n * it leads with the gear/wrench glyph the agent prefixes, or is a standalone\n * `mcp__…` invocation. Ordinary prose never matches, so a miss degrades to\n * \"leave the text as-is\" rather than eating real content.\n */\n\nexport interface ToolStep {\n /** Stable within a single parse pass — index-based, so identical tools don't collide. */\n id: string;\n /** Humanized present-tense label, e.g. \"Generating image\". */\n label: string;\n /** Optional detail, e.g. the connector slug or raw tool token. */\n detail?: string;\n /** The connector an execute_action row ran on (`yantra-computer`), when it was one. */\n connector?: string;\n /** 'running' only ever applies to the LAST step of an in-flight turn. */\n status: 'running' | 'done';\n /** How many times in a row this same step ran, when more than once. */\n count?: number;\n}\n\n/** The connector behind the user's cloud Computer - the one browser they can watch and take over. */\nexport const COMPUTER_CONNECTOR = 'yantra-computer';\n\n/** Whether any step of a turn ran on the user's Computer. */\nexport function usesComputer(steps: ToolStep[]): boolean {\n return steps.some((step) => step.connector === COMPUTER_CONNECTOR);\n}\n\n/** How many tool calls the steps stand for: a row that repeated counts every run. */\nexport function totalSteps(steps: readonly ToolStep[]): number {\n return steps.reduce((total, step) => total + (step.count ?? 1), 0);\n}\n\nexport interface ParsedToolActivity {\n steps: ToolStep[];\n /** Prose with every tool-activity line removed. */\n text: string;\n}\n\n// A tool-activity line: optional indent, a gear/wrench glyph (with optional\n// emoji variation selector), then the tool token + optional \"— detail\". The `m`\n// flag scopes ^/$ to each line; `u` so the glyph classes match correctly.\nconst GEAR_LINE_RE = /^[ \\t]*[⚙🔧\\u{1F6E0}]️?[ \\t]+(.+?)[ \\t]*$/u;\n// A bare MCP invocation on its own line — the agent sometimes omits the glyph.\n// `mcp__` is vanishingly unlikely in real prose, so this is safe to strip.\nconst BARE_MCP_LINE_RE = /^[ \\t]*(mcp__[^\\s].*?)[ \\t]*$/;\n// The glyph alone: a tool row whose name has not streamed in yet. It is not\n// prose, and painted as text it trails the answer as a stray gear.\nconst BARE_GEAR_LINE_RE = /^[ \\t]*[⚙🔧\\u{1F6E0}]️?[ \\t]*$/u;\n\n/** Known tool tokens → present-tense labels. Anything unmapped falls back to a humanized token. */\nconst TOOL_LABELS: Array<[RegExp, string]> = [\n [/^tool[_-]?search$/i, 'Searching tools'],\n [/^web[_-]?search$/i, 'Searching the web'],\n [/^web[_-]?scrape$/i, 'Reading a page'],\n [/^web[_-]?batch[_-]?scrape$/i, 'Reading pages'],\n [/^reddit[_-]?search$/i, 'Searching Reddit'],\n [/^x[_-]?search$/i, 'Searching X'],\n [/^youtube[_-]?search$/i, 'Searching YouTube'],\n [/^academic[_-]?search$/i, 'Searching papers'],\n [/^(yantra[_-]?)?github[_-]?search$/i, 'Searching GitHub'],\n [/^bash$/i, 'Running a command'],\n [/^grep$/i, 'Searching files'],\n [/^(str_replace_editor|edit|write)$/i, 'Editing files'],\n [/^read$/i, 'Reading files'],\n [/^search[_-]?connectors$/i, 'Finding the right tool'],\n [/^list[_-]?credentials$/i, 'Checking your saved logins'],\n];\n\n/**\n * The Computer's actions, by verb. The connector alone (\"Running computer\")\n * says nothing; what the person wants to know is that the agent is on their\n * browser and roughly what it is doing there.\n *\n * The agent names an action by its id (`YANTRA_COMPUTER_ACT`) about as often as\n * by its title (\"Act on the Computer Browser\"), and sometimes rewords the title\n * (\"Take a Screenshot on Computer\"), so each verb matches both.\n */\nconst COMPUTER_ACTION_LABELS: Array<[RegExp, string]> = [\n [/_(RESOLVE|STATUS|PROVIDERS)$|^(resolve\\b|computer status|list computer providers)/i, 'Finding your Computer'],\n [/_(CREATE|RESUME)$|^(create|resume) computer/i, 'Starting your Computer'],\n [/_BROWSE$|^browse\\b/i, 'Opening a page on your Computer'],\n [/_READ_PAGE$|^read the .*page$/i, 'Reading the page on your Computer'],\n [/_SCREENSHOT$|screenshot/i, 'Looking at your Computer screen'],\n [/_(ACT|INPUT)$|^(act on|send real input)\\b/i, 'Clicking and typing on your Computer'],\n [/_ATTACH_FILE$|^attach a file/i, 'Attaching a file on your Computer'],\n [/_(READ_FILE|WRITE_FILE)$|^(read|write) computer file/i, 'Working with files on your Computer'],\n [/_EXEC$|^run command/i, 'Running a command on your Computer'],\n];\n\n/** Connector slug → verb phrase for `execute_action — <connector>/<action>` rows. */\nconst CONNECTOR_LABELS: Array<[RegExp, string]> = [\n [/image[_-]?gen/i, 'Generating image'],\n [/video[_-]?gen/i, 'Generating video'],\n [/(audio|tts|speech|voice)/i, 'Generating audio'],\n [/search/i, 'Searching'],\n];\n\n/** Title-case a slug/token: \"yantra-image-generation\" → \"Yantra image generation\". */\nfunction prettifySlug(slug: string): string {\n const words = slug\n .replace(/^yantra[_-]/i, '')\n .replace(/[_-]+/g, ' ')\n .trim();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : slug;\n}\n\n/** Shell / interpreter snippets the agent pastes after a bash/read row. */\nexport function isToolPayloadLine(line: string): boolean {\n const t = line.trim();\n if (!t) return false;\n if (/^```/.test(t)) return true;\n if (/^(import\\s+\\w+|from\\s+\\S+\\s+import)\\b/.test(t)) return true;\n if (/^(const|let|var)\\s+\\w+\\s*=/.test(t)) return true;\n if (/\\brequire\\s*\\(/.test(t)) return true;\n if (/^path\\s*=\\s*['\"`]/.test(t)) return true;\n if (/\\/(?:data\\/users\\/)?\\.cdecli-server\\b/.test(t)) return true;\n if (/^(mkdir|curl|chmod|rm |cp |mv |cat |echo |python3?\\b|node\\s+-e|npx |yarn |npm )\\b/.test(t)) return true;\n if (/^(fs\\.|JSON\\.parse|JSON\\.stringify)/.test(t)) return true;\n return false;\n}\n\nfunction looksLikeCommandDetail(detail: string): boolean {\n const t = detail.trim();\n if (!t) return false;\n if (isToolPayloadLine(t)) return true;\n if (/^(python3?|node|mkdir|curl|npx|bash|sh|zsh)\\b/.test(t)) return true;\n if (t.length > 72) return true;\n return false;\n}\n\nfunction sanitizeDetail(detail: string | undefined): string | undefined {\n if (!detail) return undefined;\n if (looksLikeCommandDetail(detail)) return undefined;\n return detail;\n}\n\nfunction stripUnfencedPayloadLines(chunk: string): string {\n return chunk\n .split('\\n')\n .filter((line) => !isToolPayloadLine(line))\n .join('\\n');\n}\n\n/**\n * Drop dumped tool scripts (unfenced bash/python after a gear row).\n * Never strip markdown fences — those are the answer's code examples.\n */\nexport function stripToolPayloads(text: string): string {\n const fenceRe = /```[\\s\\S]*?(?:```|$)/g;\n const out: string[] = [];\n let last = 0;\n for (let match = fenceRe.exec(text); match; match = fenceRe.exec(text)) {\n out.push(stripUnfencedPayloadLines(text.slice(last, match.index)));\n const block = match[0];\n const isToolDump = /\\/(?:data\\/users\\/)?\\.cdecli-server\\b/.test(block);\n const keepWidget = /\\bpropsComponent\\b/.test(block);\n if (!isToolDump || keepWidget) out.push(block);\n last = match.index + block.length;\n }\n out.push(stripUnfencedPayloadLines(text.slice(last)));\n return out\n .join('')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\n/**\n * Turn a raw tool row body into a { label, detail }. Handles the two shapes we\n * see: a bare tool name (\"ToolSearch\") and an MCP execute_action carrying a\n * \"connector/action\" detail after an em/en dash.\n */\nexport function humanizeToolLine(body: string): { label: string; detail?: string; connector?: string } {\n const trimmed = body.trim();\n\n // `mcp__cdecli__execute_action — yantra-image-generation/Image`\n const dashSplit = trimmed.split(/\\s+[—–-]\\s+/);\n const head = dashSplit[0]?.trim() ?? trimmed;\n const detailRaw = dashSplit.length > 1 ? dashSplit.slice(1).join(' — ').trim() : undefined;\n\n // Strip an `mcp__<server>__` prefix off the head token.\n const bareTool = head.replace(/^mcp__[^_]+__/i, '').replace(/^mcp__/i, '');\n\n // execute_action rows: the meaning is in the connector detail, not the verb.\n if (/^execute_action$/i.test(bareTool) && detailRaw) {\n const connector = detailRaw.split('/')[0]?.trim() ?? detailRaw;\n if (connector === COMPUTER_CONNECTOR) {\n const action = detailRaw.split('/')[1]?.trim() ?? '';\n const label = COMPUTER_ACTION_LABELS.find(([re]) => re.test(action))?.[1] ?? 'Using your Computer';\n return { label, detail: 'Computer', connector };\n }\n for (const [re, label] of CONNECTOR_LABELS) {\n if (re.test(connector)) return { label, detail: prettifySlug(connector) };\n }\n return { label: `Running ${prettifySlug(connector)}`, detail: sanitizeDetail(detailRaw) };\n }\n\n // `get_action_schema — yantra-computer/Act on the Computer Browser`: the agent reading\n // how to call an action. Plumbing - say which tool, not the action's raw title.\n if (/^get[_-]?action[_-]?schema$/i.test(bareTool)) {\n const connector = detailRaw?.split('/')[0]?.trim();\n if (!connector) return { label: 'Looking up a tool' };\n return {\n label: 'Looking up a tool',\n detail: connector === COMPUTER_CONNECTOR ? 'Computer' : prettifySlug(connector),\n };\n }\n\n for (const [re, label] of TOOL_LABELS) {\n if (re.test(bareTool)) return { label, detail: sanitizeDetail(detailRaw) };\n }\n\n // Generic fallback: prettify the token (camelCase / snake_case → spaced).\n const spaced = bareTool\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim();\n // Lowercase the WHOLE token, not just its first character: the split above\n // turns \"someNewTool\" into \"some New Tool\", and lowercasing only the head\n // left the label reading \"Running some New Tool\" mid-sentence.\n const label = spaced ? `Running ${spaced.toLowerCase()}` : 'Working';\n return { label, detail: sanitizeDetail(detailRaw) };\n}\n\n/**\n * Append a step, or count it on the row before when it is the same step again straight after\n * itself: twenty clicks on one page as twenty identical rows bury the answer and push the live\n * Computer view out of sight.\n */\nfunction addStep(steps: ToolStep[], { label, detail, connector }: Omit<ToolStep, 'id' | 'status'>): void {\n const previous = steps[steps.length - 1];\n if (previous && previous.label === label && previous.detail === detail && previous.connector === connector) {\n previous.count = (previous.count ?? 1) + 1;\n } else {\n steps.push({ id: `tool-${steps.length}`, label, detail, ...(connector && { connector }), status: 'done' });\n }\n}\n\n/**\n * Extract tool-activity rows from streamed/persisted assistant content.\n *\n * @param content raw assistant text\n * @param active when true the turn is still streaming, so the LAST step is\n * marked 'running'; otherwise every step is 'done'.\n */\nexport function parseToolActivity(content: string, active = false): ParsedToolActivity {\n if (!content) return { steps: [], text: content ?? '' };\n\n const steps: ToolStep[] = [];\n const kept: string[] = [];\n\n for (const line of content.split('\\n').filter((l) => !BARE_GEAR_LINE_RE.test(l))) {\n const gear = GEAR_LINE_RE.exec(line);\n const mcp = gear ? null : BARE_MCP_LINE_RE.exec(line);\n const body = gear?.[1] ?? mcp?.[1];\n if (body) addStep(steps, humanizeToolLine(body));\n else kept.push(line);\n }\n\n const joined = kept\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n // Payload stripping is only for dumps that follow tool rows. Applying it\n // to every assistant turn deleted fenced JS/bash examples from the bubble.\n const text = steps.length > 0 ? stripToolPayloads(joined) : joined;\n\n if (active && steps.length > 0) {\n steps[steps.length - 1].status = 'running';\n }\n\n return { steps, text };\n}\n"],"names":["label"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/yantra-mobile",
3
- "version": "12.0.129",
3
+ "version": "12.0.130",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -27,7 +27,7 @@
27
27
  "uuid": "^9.0.0"
28
28
  },
29
29
  "devDependencies": {
30
- "common": "^12.0.129",
30
+ "common": "12.0.129",
31
31
  "libphonenumber-js": "^1.13.3"
32
32
  },
33
33
  "peerDependencies": {
@@ -45,7 +45,7 @@
45
45
  "@messenger-box/platform-mobile": "*",
46
46
  "@react-native-async-storage/async-storage": "*",
47
47
  "@react-navigation/native": "*",
48
- "common": "12.0.127",
48
+ "common": "12.0.129",
49
49
  "expo-background-task": "*",
50
50
  "expo-constants": "*",
51
51
  "expo-secure-store": "*",
@@ -67,5 +67,5 @@
67
67
  "typescript": {
68
68
  "definition": "lib/index.d.ts"
69
69
  },
70
- "gitHead": "2b57e9ad89fcf5fec15e00f74959680ab48277e5"
70
+ "gitHead": "feea786a46ae57a577a93380f86797ba2db54b8f"
71
71
  }