{
  "date": "2026-10-27",
  "source": "C:\\Users\\tjzhong\\AppData\\Local\\Tabbit\\Application\\1.18.21.0\\resources.pak",
  "source_sha256": "9b8e0ea03f6f0d2d30f93c4fe0b7576f4773b5fc882224a0a6e9ba507b5e7ee3",
  "summary": {
    "resources": 6268,
    "text_resources": 4957,
    "binary_resources": 1311,
    "product_keyword_matches": 1218,
    "tabbit_authored_text_resources": 4,
    "tab_patch_marked_resources": 15,
    "translation_extension_version": "2.2026.1021.1302",
    "tab_local_files_runtime_version": "0.1.7"
  },
  "curated_pages": [
    {
      "id": 60030,
      "role": "快捷操作",
      "category": "extension quick-actions page",
      "status": "text",
      "text_type": "html",
      "chars": 9162,
      "decoded_bytes": 9817,
      "title": "快捷操作 · Tabbit",
      "file": "text/resource-60030.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/><title>快捷操作 · Tabbit</title><style>:root{color-scheme:light;--primary:#f3a04c;--accent:#e58522;--bg:#f4f4f6;--card:#fff;--text:rgba(0,0,0,.8);--secondary:rgba(0,0,0,.5);--line:rgba(0,0,0,.08);--border:rgba(0,0,0,.12);--subtle:rgba(0,0,0,.02);--hover:rgba(0,0,0,.06);--field:rgba(0,0,0,.04);--off:rgba(0,0,0,.2);font:14px/1.5 'SF Pro Display','PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif} :root[data-dark]{color-scheme:dark;--bg:#232324;--card:#2e2e2e;--text:rgba(255,255,255,.85);--secondary:rgba(255,255,255,.5);--line:rgba(255,255,255,.08);--border:rgba(255,255,255,.12);--subtle:rgba(255,255,255,.02);--hover:rgba(255,255,255,.06);--field:rgba(255,255,255,.04);--off:rgba(255,255,255,.2)} *{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text)}main{max-width:672px;margin:0 auto;padding:40px 32px 48px}h1,h2,h3,p{margin:0}h1{font-size:24px;line-height:32px;font-weight:600;letter-spacing:-.6px}h2,h3{font-size:14px;font-weight:500}button,input,textarea{font:inherit;color:inherit}button{cursor:pointer;border:0;background:none}"
    },
    {
      "id": 60031,
      "role": "Tabbit 扩展后台",
      "category": "extension background service worker",
      "status": "text",
      "text_type": "javascript",
      "chars": 404178,
      "decoded_bytes": 417688,
      "title": "",
      "file": "text/resource-60031.js",
      "product_file": null,
      "urls": [
        "chrome-extension://${Mo}/viewer.html`,qo=[Fo,`${Fo}?*`];function",
        "chrome://*/*",
        "chrome-extension://*/*",
        "chrome://newtab"
      ],
      "head": "(()=>{\"use strict\";const e=\"startup\",t=\"open_slider\",r=\"close_slider\",n=\"open_tab_skill_popup\",a=\"close_tab_skill_popup\",o=\"screenshot\",s=\"close_screenshot\",i=\"select_web_text\",c=\"open_selection_assistant\",l=\"clear_web_text_selection\",d=\"fetch_page_html\",u=\"fetch_current_window\",h=\"chat_select_image\",m=\"fetch_bookmark_progress\",g=\"regenerate_bookmark_summary\",f=\"check_bookmark_summary_status\",p=\"check_is_login\",w=\"check_capability\",y=\"open_session\",b=\"open_popup\",I=\"check_existing_tab\",E=\"activate_tab\",T=\"save_tab_group_to_bookmarks\",k=\"FETCH_SUBTITLE\",_=\"navigate_in_tab\",A=\"check_moa_certificate\",v=\"execute_skill\",S=\"autorun_skill\",C=\"open_sidebar_with_skill\",R=\"execute_page_script_v1\",N=\"execute_script_skill_v1\",L=\"get_prompt_cache\",U=\"delete_prompt_cache_item\",x=\"refresh_prompt_cache\",D=\"clear_prompt_cache\",O=\"get_current_host\",P=\"get_device_info\",$=\"llm_request\",M=\"bridge_image_request\",B=\"bridge_image_task_create_request\",F=\"bridge_image_task_query_request\",q=\"bridge_audio_request\",G=\"bridge_asr_request\",W=\"bridge_email_notification_request\",z=\"bridge_sms_notification_request\",V=\"bridge_audio_task_create_request\",j=\"bridge_audio_task_query_request\",Q=\"bridge_video_create_reque"
    },
    {
      "id": 60046,
      "role": "Chat/LLM bridge",
      "category": "extension injected bridge",
      "status": "text",
      "text_type": "javascript",
      "chars": 11534,
      "decoded_bytes": 11534,
      "title": "",
      "file": "text/resource-60046.js",
      "product_file": null,
      "urls": [],
      "head": "(()=>{const e=\"__TAB_CHAT_LLM_BRIDGE__\",t=\"LLM_RESPONSE\",r=\"BRIDGE_IMAGE_RESPONSE\",i=\"BRIDGE_IMAGE_TASK_CREATE_RESPONSE\",n=\"BRIDGE_IMAGE_TASK_QUERY_RESPONSE\",o=\"BRIDGE_AUDIO_RESPONSE\",a=\"BRIDGE_ASR_RESPONSE\",s=\"BRIDGE_EMAIL_NOTIFICATION_RESPONSE\",_=\"BRIDGE_SMS_NOTIFICATION_RESPONSE\",l=\"BRIDGE_AUDIO_TASK_CREATE_RESPONSE\",c=\"BRIDGE_AUDIO_TASK_QUERY_RESPONSE\",m=\"BRIDGE_VIDEO_CREATE_RESPONSE\",d=\"BRIDGE_VIDEO_TASK_RESPONSE\";class u{constructor(){this.pendingRequests=new Map,this.init()}async chat(e,t){const r=(e||\"\").trim();if(!r)throw new Error(\"content is required\");const i={content:r};return\"string\"==typeof t?i.response_format=t:t&&(t.response_format&&(i.response_format=t.response_format),t.images&&t.images.length>0&&(i.images=t.images),t.videos&&t.videos.length>0&&(i.videos=t.videos),t.audios&&t.audios.length>0&&(i.audios=t.audios)),this.request({payload:i})}async generateImage(e,t){const i=(e||\"\").trim();if(!i)throw new Error(\"prompt is required\");p(t);const n=E(i,t),o=await this._sendAndWait({requestType:\"BRIDGE_IMAGE_REQUEST\",responseType:r,action:\"image-generate\",payload:n,timeoutMs:18e4});return o?.success||f(\"IMAGE_GENERATION_FAILED\",o?.error_message||\"Image generation failed\""
    },
    {
      "id": 60047,
      "role": "字幕获取器",
      "category": "extension subtitle fetcher",
      "status": "text",
      "text_type": "javascript",
      "chars": 4069,
      "decoded_bytes": 4069,
      "title": "",
      "file": "text/resource-60047.js",
      "product_file": null,
      "urls": [],
      "head": "(()=>{\"use strict\";const e=\"SUBTITLE_CONTENT_RESULT\",t=\"CAPTURED_SUBTITLE_URLS_RESULT\",s=\"__TAB_CHAT_SUBTITLE_FETCHER__\";class r{constructor(){this.performanceObserver=null,this.processedUrls=new Set,this.capturedSubtitleUrls=new Map,this.subtitleContentCache=new Map,this.isMonitoring=!1,this.startPerformanceMonitoring()}startPerformanceMonitoring(){if(window.PerformanceObserver&&!this.isMonitoring)try{this.performanceObserver=new PerformanceObserver(e=>{e.getEntries().forEach(e=>{e.name.includes(\"timedtext\")&&!this.processedUrls.has(e.name)&&(this.processedUrls.add(e.name),this.collectSubtitleUrl(e.name))})}),this.performanceObserver.observe({entryTypes:[\"resource\"]}),this.isMonitoring=!0,this.checkExistingResources()}catch(e){}}checkExistingResources(){try{performance.getEntriesByType(\"resource\").filter(e=>e.name.includes(\"timedtext\")&&!this.processedUrls.has(e.name)).forEach(e=>{this.processedUrls.add(e.name),this.collectSubtitleUrl(e.name)})}catch(e){}}getVidFromUrl(e){try{return new URL(e).searchParams.get(\"v\")||null}catch(e){return null}}async collectSubtitleUrl(e){const t=this.getVidFromUrl(e);if(!t)return;const s=this.capturedSubtitleUrls.get(t)||[];if(s.includes(e)||(s.pus"
    },
    {
      "id": 60048,
      "role": "Readability",
      "category": "extension content extraction",
      "status": "text",
      "text_type": "javascript",
      "chars": 45133,
      "decoded_bytes": 45171,
      "title": "",
      "file": "text/resource-60048.js",
      "product_file": null,
      "urls": [],
      "head": "(()=>{var e={259(e,t,i){var r=i(573),a=i(269);e.exports={Readability:r,isProbablyReaderable:a}},269(e){var t={unlikelyCandidates:/-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i,okMaybeItsACandidate:/and|article|body|column|content|main|shadow/i};function i(e){return(!e.style||\"none\"!=e.style.display)&&!e.hasAttribute(\"hidden\")&&(!e.hasAttribute(\"aria-hidden\")||\"true\"!=e.getAttribute(\"aria-hidden\")||e.className&&e.className.includes&&e.className.includes(\"fallback-image\"))}e.exports=function(e,r={}){\"function\"==typeof r&&(r={visibilityChecker:r});var a={minScore:20,minContentLength:140,visibilityChecker:i};r=Object.assign(a,r);var n=e.querySelectorAll(\"p, pre, article\"),s=e.querySelectorAll(\"div > br\");if(s.length){var o=new Set(n);[].forEach.call(s,function(e){o.add(e.parentNode)}),n=Array.from(o)}var l=0;return[].some.call(n,function(e){if(!r.visibilityChecker(e))return!1;var i=e.className+\" \"+e.id;if(t.unlikelyCandidates.test(i)&&!t.okMaybeItsACandidate.test(i))return!1;if(e.matches"
    },
    {
      "id": 60049,
      "role": "Tabbit Popup",
      "category": "extension popup bundle",
      "status": "text",
      "text_type": "javascript",
      "chars": 383463,
      "decoded_bytes": 386901,
      "title": "",
      "file": "text/resource-60049.js",
      "product_file": null,
      "urls": [
        "chrome://password-manager/passwords",
        "chrome://history/",
        "chrome://downloads/",
        "chrome://tab-group-manager",
        "chrome://settings/passport"
      ],
      "head": "/*! For license information please see popup.f5ce32172c5da24fc35a.js.LICENSE.txt */ (()=>{\"use strict\";var e={14(e,n){function t(e,n){var t=e.length;e.push(n);e:for(;0<t;){var r=t-1>>>1,a=e[r];if(!(0<o(a,n)))break e;e[r]=n,e[t]=a,t=r}}function r(e){return 0===e.length?null:e[0]}function a(e){if(0===e.length)return null;var n=e[0],t=e.pop();if(t!==n){e[0]=t;e:for(var r=0,a=e.length,i=a>>>1;r<i;){var l=2*(r+1)-1,s=e[l],c=l+1,u=e[c];if(0>o(s,t))c<a&&0>o(u,s)?(e[r]=u,e[c]=t,r=c):(e[r]=s,e[l]=t,r=l);else{if(!(c<a&&0>o(u,t)))break e;e[r]=u,e[c]=t,r=c}}}return n}function o(e,n){var t=e.sortIndex-n.sortIndex;return 0!==t?t:e.id-n.id}if(n.unstable_now=void 0,\"object\"==typeof performance&&\"function\"==typeof performance.now){var i=performance;n.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();n.unstable_now=function(){return l.now()-s}}var c=[],u=[],d=1,f=null,p=3,h=!1,m=!1,g=!1,b=!1,y=\"function\"==typeof setTimeout?setTimeout:null,v=\"function\"==typeof clearTimeout?clearTimeout:null,k=\"undefined\"!=typeof setImmediate?setImmediate:null;function w(e){for(var n=r(u);null!==n;){if(null===n.callback)a(u);else{if(!(n.startTime<=e))break;a(u),n.sortIndex=n.expirationTime,t(c,n)}n=r(u"
    },
    {
      "id": 60054,
      "role": "Offscreen Document",
      "category": "extension offscreen page",
      "status": "text",
      "text_type": "html",
      "chars": 191,
      "decoded_bytes": 191,
      "title": "Offscreen Document",
      "file": "text/resource-60054.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html><html><head><meta charset=\"UTF-8\"/><title>Offscreen Document</title></head><body><div id=\"root\"></div><script src=\"js/offscreen.21021764d1f788e66aff.js\"></script></body></html>"
    },
    {
      "id": 60055,
      "role": "Popup - Tabbit",
      "category": "extension popup HTML",
      "status": "text",
      "text_type": "html",
      "chars": 1021,
      "decoded_bytes": 1021,
      "title": "Popup - Tabbit",
      "file": "text/resource-60055.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Popup - Tabbit</title><style>html, body { margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; width: 286px; max-width: 286px; max-height: 720px; background: transparent; box-sizing: border-box; overflow: hidden; } #root { width: 100%; max-width: 100%; max-height: 720px; min-height: 0; overflow: hidden; } /* Override in-bundle styles that expand the popup to viewport/max bounds. */ .popup-container { width: 100% !important; max-width: 100% !important; min-height: 0 !important; height: auto !important; background: transparent !important; }</style></head><body><div id=\"root\"></div><script defer=\"defer\" src=\"js/popup.f5ce32172c5da24fc35a.js\"></script></body></html>"
    },
    {
      "id": 60056,
      "role": "诊断中继",
      "category": "diagnostic relay page",
      "status": "text",
      "text_type": "html",
      "chars": 195,
      "decoded_bytes": 195,
      "title": "Tabbit diagnostic relay",
      "file": "text/resource-60056.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html><html><head><meta charset=\"utf-8\"><title>Tabbit diagnostic relay</title></head><body><script defer=\"defer\" src=\"js/diagnostic_relay.fe70de55488583d162bf.js\"></script></body></html>"
    },
    {
      "id": 60163,
      "role": "Tabbit Translation manifest",
      "category": "translation extension manifest",
      "status": "text",
      "text_type": "json",
      "chars": 2224,
      "decoded_bytes": 2224,
      "title": "",
      "file": "text/resource-60163.json",
      "product_file": null,
      "urls": [],
      "head": "{ \"manifest_version\": 3, \"name\": \"__MSG_extName__\", \"description\": \"__MSG_extDescription__\", \"version\": \"2.2026.1021.1302\", \"icons\": { \"16\": \"icon/16.png\", \"32\": \"icon/32.png\", \"48\": \"icon/48.png\", \"96\": \"icon/96.png\", \"128\": \"icon/128.png\" }, \"default_locale\": \"en\", \"key\": \"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1MY31UadWyISpYXqmR/dTnYj44ROQpYc2m+dkDjtb+Wrc23aBuH6nNFjtZ/cctejiQMUtzTwDTgoIKXycW99KMLo4RCIs0d7/UI8CzIZipE4ky3/IuYwXBQlo1awpxW6phTGDJiUox1AbgUhUGusJTWqAr7Qgf6QagTnxoc+6V8O4x0FbOOsgS6M65sI83aRCu+CL2+DGwy0rYPrs+hIFcS2DX2JnpvU9w951SHH5pCJnOi+QQ/BeAALqgTRu+FkYGj8pMp80mBv520RrKmEDl/AvXiE1fkGO4XqpniDtWgnWSvpZKMTMhyTgM60lvTWV4uL71x0oAHaz3xV9LyQiQIDAQAB\", \"permissions\": [ \"storage\", \"tabs\", \"tabInstance\", \"tabAnalytics\", \"tabThemeColor\", \"tabContentExtractor\", \"alarms\", \"cookies\", \"contextMenus\", \"scripting\", \"webNavigation\" ], \"externally_connectable\": { \"ids\": [ \"mbpebkdabcipnkcjgmoaejclfnpakpdj\", \"nmbemfeekdkfhjikjegnegkndcehpfej\" ] }, \"host_permissions\": [ \"*://*/*\", \"file:///*\", \"*://*.youtube.com/*\", \"*://www"
    },
    {
      "id": 60164,
      "role": "Translation Options",
      "category": "translation extension options page",
      "status": "text",
      "text_type": "html",
      "chars": 1176,
      "decoded_bytes": 1176,
      "title": "Options | Tabbit Translation",
      "file": "text/resource-60164.html",
      "product_file": null,
      "urls": [],
      "head": "<!DOCTYPE html> <html> <head> <meta charset=\"UTF-8\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <title>Options | Tabbit Translation</title> <!-- Customize the manifest options --> <meta name=\"manifest.open_in_tab\" content=\"true\"> <!-- <meta name=\"manifest.browser_style\" content=\"true\" /> --> <!-- Set include/exclude if the page should be removed from some builds --> <!-- <meta name=\"manifest.include\" content=\"['chrome', 'firefox', 'edge', 'safari']\" /> --> <!-- <meta name=\"manifest.exclude\" content=\"['chrome']\" /> --> <script type=\"module\" crossorigin src=\"chunks/options-DsbOK4Vg.js\"></script> <link rel=\"modulepreload\" crossorigin href=\"chunks/_virtual_wxt-plugins-CUkw3aEC.js\"> <link rel=\"modulepreload\" crossorigin href=\"chunks/theme-C4xGsEGw.js\"> <link rel=\"modulepreload\" crossorigin href=\"chunks/custom-stream-D-KTgsoM.js\"> <link rel=\"stylesheet\" crossorigin href=\"assets/theme-LVKQoexB.css\"> <link rel=\"stylesheet\" crossorigin href=\"assets/options-CuGCYU4w.css\"> </head> <body> <div id=\"root\"></div> </body> </html> "
    },
    {
      "id": 60165,
      "role": "Translation Popup",
      "category": "translation extension popup page",
      "status": "text",
      "text_type": "html",
      "chars": 861,
      "decoded_bytes": 861,
      "title": "Popup | Tabbit Translation",
      "file": "text/resource-60165.html",
      "product_file": null,
      "urls": [],
      "head": "<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <title>Popup | Tabbit Translation</title> <meta name=\"manifest.type\" content=\"browser_action\"> <script type=\"module\" crossorigin src=\"chunks/popup-B9KFbIRj.js\"></script> <link rel=\"modulepreload\" crossorigin href=\"chunks/_virtual_wxt-plugins-CUkw3aEC.js\"> <link rel=\"modulepreload\" crossorigin href=\"chunks/theme-C4xGsEGw.js\"> <link rel=\"modulepreload\" crossorigin href=\"chunks/tab-local-files-pdf-BuXqXyyR.js\"> <link rel=\"stylesheet\" crossorigin href=\"assets/theme-LVKQoexB.css\"> <link rel=\"stylesheet\" crossorigin href=\"assets/popup-Fd_pYC0L.css\"> </head> <body class=\"!mr-0\"> <div id=\"root\" style=\"width: 320px; min-height: 128px\"></div> </body> </html> "
    },
    {
      "id": 60331,
      "role": "TabLocalFiles / Favorites bundle",
      "category": "local file and favorites web bundle",
      "status": "text",
      "text_type": "html",
      "chars": 1829272,
      "decoded_bytes": 1853571,
      "title": "${htmlTitle}",
      "file": "text/resource-60331.html",
      "product_file": null,
      "urls": [],
      "head": "\"use strict\"; var TabLocalFiles; (function (TabLocalFiles) { TabLocalFiles.RUNTIME_VERSION = \"0.1.7\"; })(TabLocalFiles || (TabLocalFiles = {})); var TabLocalFiles; (function (TabLocalFiles) { var TextCodec; (function (TextCodec) { const BOM = \" \"; const UTF8_BOM_BYTES = [0xef, 0xbb, 0xbf]; function detectLineEnding(text) { let crlf = 0; let lf = 0; let cr = 0; for (let index = 0; index < text.length; index += 1) { const code = text.charCodeAt(index); if (code === 13) { if (text.charCodeAt(index + 1) === 10) { crlf += 1; index += 1; } else { cr += 1; } } else if (code === 10) { lf += 1; } } if (crlf === 0 && lf === 0 && cr === 0) { return \"unknown\"; } if (crlf >= lf && crlf >= cr) { return \"crlf\"; } return lf >= cr ? \"lf\" : \"cr\"; } Tex"
    },
    {
      "id": 60468,
      "role": "Previewer popup",
      "category": "local file preview popup",
      "status": "text",
      "text_type": "html",
      "chars": 1285,
      "decoded_bytes": 1317,
      "title": "Previewer",
      "file": "text/resource-60468.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html> <html lang=\"zh-CN\"> <head> <meta charset=\"utf-8\" /> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /> <title>Previewer</title> <link rel=\"stylesheet\" href=\"styles.css\" /> </head> <body class=\"tlf-popup-body\"> <main class=\"tlf-popup\" data-tlf-popup> <header class=\"tlf-popup-header\"> <div> <h1 class=\"tlf-popup-title\">Previewer</h1> <p class=\"tlf-popup-subtitle\" data-tlf-i18n=\"app.description\">本地文件渲染</p> </div> <button class=\"tlf-toolbar-button tlf-popup-settings-button\" type=\"button\" data-tlf-popup-settings data-tlf-i18n-title=\"popup.settings\" data-tlf-i18n-aria-label=\"popup.settings\" title=\"设置\" aria-label=\"设置\"></button> </header> <section class=\"tlf-popup-section\"> <h2 class=\"tlf-popup-section-title\" data-tlf-i18n=\"popup.favorites\">收藏</h2> <div class=\"tlf-popup-list\" data-tlf-popup-favorites></div> </section> <hr class=\"tlf-popup-divider\" /> <section class=\"tlf-popup-section\"> <h2 class=\"tlf-popup-section-title\" data-tlf-i18n=\"popup.recents\">最近打开</h2> <div class=\"tlf-popup-list\" data-tlf-popup-recents></div>"
    },
    {
      "id": 60472,
      "role": "Tabbit Reader",
      "category": "reading mode page",
      "status": "text",
      "text_type": "html",
      "chars": 1932,
      "decoded_bytes": 2110,
      "title": "Tabbit 阅读模式",
      "file": "text/resource-60472.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html> <html lang=\"zh-CN\"> <head> <meta charset=\"utf-8\" /> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /> <title>Tabbit 阅读模式</title> <link rel=\"stylesheet\" href=\"../styles.css\" /> </head> <body class=\"tlf-reading-page\"> <header class=\"tlf-reading-header\"> <div> <p class=\"tlf-reading-eyebrow\">TABBIT READER</p> <h1 id=\"reading-surface-title\">阅读模式</h1> </div> <button id=\"reload-page\" class=\"tlf-reading-button\" type=\"button\">重新加载</button> </header> <main class=\"tlf-reading-shell\"> <aside class=\"tlf-reading-diagnostics\" aria-label=\"接口状态\"> <h2>接口状态</h2> <dl> <div> <dt>readingMode</dt> <dd id=\"reading-mode-capability\">检测中</dd> </div> <div> <dt>readingList</dt> <dd id=\"reading-list-capability\">检测中</dd> </div> <div> <dt>tabReadingSpace</dt> <dd id=\"reading-space-capability\">检测中</dd> </div> <div> <dt>正文提取器</dt> <dd id=\"distillation-method\">等待正文</dd> </div> </dl> <button id=\"load-r"
    },
    {
      "id": 60473,
      "role": "TabLocalFiles theme runtime",
      "category": "local file theme runtime",
      "status": "text",
      "text_type": "javascript",
      "chars": 590618,
      "decoded_bytes": 598137,
      "title": "",
      "file": "text/resource-60473.js",
      "product_file": null,
      "urls": [],
      "head": "\"use strict\"; var TabLocalFiles; (function (TabLocalFiles) { var Theme; (function (Theme) { const LEGACY_MODE_STORAGE_KEY = \"tab-local-files:theme\"; const MODE_STORAGE_KEY = \"tab-local-files:theme-mode\"; const MEDIA_QUERY = \"(prefers-color-scheme: dark)\"; const PORT_NAME = \"tlf-theme\"; const PORT_RECONNECT_DELAY_MS = 1000; const CHROMIUM_UNSET_USER_COLOR = -6645094; const TABBIT_DEFAULT_ORANGE = -810932; let activeGeneration = 0; let bindingCleanup; let lastBrowserColors; let lastAppliedTheme; let lastAppliedAccent; let lastAppliedMode; const changeHandlers = new Set(); function start() { stop(); clearLegacyPreference(); const generation = ++activeGeneration; const isActive = () => generation === activeGeneration; applyColors(); void readBrowserThemeColors().then((colors) => { if (isActive() && colors) { lastBrowserColors = colors; applyColors(colors); } }); const mediaQuery = window.matchMe"
    },
    {
      "id": 60475,
      "role": "Previewer settings",
      "category": "local file preview settings",
      "status": "text",
      "text_type": "html",
      "chars": 8372,
      "decoded_bytes": 8954,
      "title": "Previewer",
      "file": "text/resource-60475.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html> <html lang=\"zh-CN\"> <head> <meta charset=\"utf-8\" /> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /> <title>Previewer</title> <link rel=\"stylesheet\" href=\"styles.css\" /> </head> <body class=\"tlf-settings-body\"> <div class=\"tlf-settings-shell\"> <aside class=\"tlf-settings-sidebar\"> <p class=\"tlf-settings-sidebar-title\" data-tlf-i18n=\"settings.title\">Previewer 设置</p> <nav class=\"tlf-settings-nav\" data-tlf-i18n-aria-label=\"settings.title\" aria-label=\"Previewer 设置\"> <a class=\"tlf-settings-nav-item\" href=\"#general\" data-tlf-settings-nav=\"general\"> <svg class=\"tlf-lucide-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.0"
    },
    {
      "id": 60477,
      "role": "TabLocalFiles CSS",
      "category": "local file UI stylesheet",
      "status": "text",
      "text_type": "css",
      "chars": 423706,
      "decoded_bytes": 423709,
      "title": "",
      "file": "text/resource-60477.css",
      "product_file": null,
      "urls": [],
      "head": "/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inse"
    },
    {
      "id": 60749,
      "role": "Previewer document shell",
      "category": "document renderer shell",
      "status": "text",
      "text_type": "html",
      "chars": 1281,
      "decoded_bytes": 1311,
      "title": "Previewer",
      "file": "text/resource-60749.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html> <html lang=\"zh-CN\"> <head> <meta charset=\"utf-8\" /> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /> <title>Previewer</title> <link rel=\"stylesheet\" href=\"styles.css\" /> <link rel=\"stylesheet\" href=\"vendor/markdown-inline-editor-layer.css\" /> </head> <body> <div class=\"tlf-format-empty\"> <h2 data-tlf-i18n=\"viewer.openingTitle\">正在打开文件</h2> <p data-tlf-i18n=\"viewer.openingDescription\">Previewer 正在准备文件预览。</p> </div> <script src=\"vendor/jszip.min.js\"></script> <script src=\"vendor/docx-preview.min.js\"></script> <script src=\"vendor/chart.umd.min.js\"></script> <script src=\"vendor/PptxViewJS.min.js\"></script> <script src=\"vendor/pptxviewjs-fixes.js\"></script> <!-- KaTeX is not listed here on purpose: TabLocalFiles.VendorLoader.ensureKatex() fetches it when a document actually contains math, so opening a PDF or an image costs nothing. --> <script src=\"vendor/marked.umd.js\"></script> <script src=\"vendor/speed-highlight.js\"></script> <script src=\"vendor/markdown-mermaid.js\"></script> <script src=\"vendor/markdown-markmap.js\"></script> <script src=\"content.js\""
    },
    {
      "id": 60821,
      "role": "Tab Organizer",
      "category": "tab organizer WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 690,
      "decoded_bytes": 690,
      "title": "",
      "file": "text/resource-60821.html",
      "product_file": null,
      "urls": [
        "chrome://theme/colors.css?sets=ui,chrome",
        "chrome://resources/css/text_defaults.css",
        "chrome://resources/mojo/mojo/public/js/bindings.js"
      ],
      "head": "<!DOCTYPE html> <html> <head> <meta charset=\"utf-8\"> <link rel=\"stylesheet\" href=\"chrome://theme/colors.css?sets=ui,chrome\"> <link rel=\"stylesheet\" href=\"chrome://resources/css/text_defaults.css\"> <link rel=\"stylesheet\" href=\"tab_organizer.css\"> <script type=\"module\" src=\"./strings.m.js\"></script> <script type=\"module\" src=\"chrome://resources/mojo/mojo/public/js/bindings.js\"></script> <script type=\"module\" src=\"tab_organizer.js\"></script> <style> html, body { width: 286px; } body { background-color: var(--color-sys-base-container); margin: 0; } </style> </head> <body> <tab-organizer-app></tab-organizer-app> </body> </html> "
    },
    {
      "id": 60830,
      "role": "Tab Group Manager",
      "category": "tab group manager WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 1011,
      "decoded_bytes": 1033,
      "title": "$i18n{tabGroupManagerPageTitle}",
      "file": "text/resource-60830.html",
      "product_file": null,
      "urls": [
        "chrome://resources/css/md_colors.css",
        "chrome://resources/css/text_defaults_md.css",
        "chrome://theme/colors.css?sets=ui,chrome"
      ],
      "head": "<!DOCTYPE html> <html dir=\"$i18n{textdirection}\" lang=\"$i18n{language}\"> <head> <meta charset=\"utf-8\"> <meta name=\"color-scheme\" content=\"light dark\"> <title>$i18n{tabGroupManagerPageTitle}</title> <link rel=\"stylesheet\" href=\"chrome://resources/css/md_colors.css\"> <link rel=\"stylesheet\" href=\"chrome://resources/css/text_defaults_md.css\"> <link rel=\"stylesheet\" href=\"chrome://theme/colors.css?sets=ui,chrome\"> <script type=\"module\" src=\"./strings.m.js\"></script> <style> /* 禁止最外层页面的滚动条 */ html, body { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; } #container { width: 100%; height: 100%; overflow: hidden; } </style> </head> <body> <div id=\"container\"> <h1>$i18n{tabGroupManagerPageTitle}</h1> <!-- tab-group-manager-app component will be added dynamically by tab_group_manager_main.js --> </div> <script type=\"module\" src=\"tab_group_manager_main.js\"></script> </body> </html> "
    },
    {
      "id": 60947,
      "role": "Tab Onboarding",
      "category": "onboarding WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 461,
      "decoded_bytes": 461,
      "title": "Tab Onboarding",
      "file": "text/resource-60947.html",
      "product_file": null,
      "urls": [],
      "head": "<!DOCTYPE HTML> <html> <head> <meta charset=\"utf-8\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, viewport-fit=cover\"> <title>Tab Onboarding</title> <script type=\"module\" src=\"./tab_onboarding_main.js\"></script> </head> <body> <div id=\"container\"> <!-- tab-onboarding-app component will be added dynamically by tab_onboarding_main.js --> </div> </body> </html> "
    },
    {
      "id": 60949,
      "role": "Tab Onboarding proxy",
      "category": "Mojo/browser proxy",
      "status": "text",
      "text_type": "javascript",
      "chars": 5367,
      "decoded_bytes": 5401,
      "title": "",
      "file": "text/resource-60949.js",
      "product_file": null,
      "urls": [],
      "head": "// Copyright 2024 Your Company // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import{BrowserType,MigrationDataType,PageCallbackRouter,PageHandlerFactory,PageHandlerRemote}from\"./tab_onboarding.mojom-webui.js\";export{BrowserType,MigrationDataType}from\"./tab_onboarding.mojom-webui.js\";export class TabOnboardingBrowserProxy{handler;callbackRouter;constructor(){this.callbackRouter=new PageCallbackRouter;this.handler=new PageHandlerRemote;const factory=PageHandlerFactory.getRemote();factory.createPageHandler(this.callbackRouter.$.bindNewPipeAndPassRemote(),this.handler.$.bindNewPipeAndPassReceiver())}getCallbackRouter(){return this.callbackRouter}async getAvailableBrowsers(){const{browsers:browsers}=await this.handler.getAvailableBrowsers();return browsers}isWindows_(){const plat=(navigator.platform||\"\").toLowerCase();return plat.startsWith(\"win\")}async exportData(config){let filteredConfig=config;if(this.isWindows_()&&config&&config.sourceUser){const bt=config.sourceUser.browserType;const allowSet=new Set;if(bt===BrowserType.CHROME||bt===BrowserType.TABBIT||bt===BrowserType.EDGE){allowSet.add(MigrationDataType.HISTORY);allowSet.a"
    },
    {
      "id": 61031,
      "role": "Tab Screenshot",
      "category": "screenshot overlay WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 33651,
      "decoded_bytes": 33651,
      "title": "$i18n{tabScreenshotTitle}",
      "file": "text/resource-61031.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html> <html data-color-scheme=\"$i18n{tabScreenshotColorScheme}\" data-theme-kind=\"$i18n{tabScreenshotThemeKind}\"> <head> <meta charset=\"utf-8\"> <title>$i18n{tabScreenshotTitle}</title> <link rel=\"stylesheet\" href=\"tab_screenshot.css\"> <script type=\"module\" src=\"app.js\"></script> </head> <body> <div id=\"shade\"></div> <div id=\"domHighlight\" aria-hidden=\"true\"></div> <div id=\"hint\" class=\"surface\"> <span>$i18n{tabScreenshotHint}</span> </div> <div id=\"selection\"> <span class=\"selection-handle n\" data-resize-handle=\"n\" aria-hidden=\"true\"></span> <span class=\"selection-handle ne\" data-resize-handle=\"ne\" aria-hidden=\"true\"></span> <span class=\"selection-handle e\" data-resize-handle=\"e\" aria-hidden=\"true\"></span> <span class=\"selection-handle se\" data-resize-handle=\"se\" aria-hidden=\"true\"></span> <span class=\"selection-handle s\" data-resize-handle=\"s\" aria-hidden=\"true\"></span> <span class=\"selection-handle sw\" data-resize-handle=\"sw\" aria-hidden=\"true\"></span> <span class=\"selection-handle w\" data-resize-handle=\"w\" aria-hidden=\"true\"></span> <span class=\"selection-"
    },
    {
      "id": 61034,
      "role": "Tab Screenshot proxy",
      "category": "Mojo/browser proxy",
      "status": "text",
      "text_type": "javascript",
      "chars": 5732,
      "decoded_bytes": 5732,
      "title": "",
      "file": "text/resource-61034.js",
      "product_file": null,
      "urls": [],
      "head": "import{AskTabbitStatus,ErrorCode,FavoriteSaveStatus,Interaction,PageCallbackRouter,PageHandlerFactory,PageHandlerRemote,SaveStatus,ScrollPreviewDiagnosticEvent}from\"./tab_screenshot.mojom-webui.js\";export{ErrorCode,Interaction,ScrollPreviewDiagnosticEvent};function cloneImageForRequest(image){if(image.bytes.bytes!==undefined){return{...image,bytes:{bytes:Array.from(image.bytes.bytes)}}}const sharedMemory=image.bytes.sharedMemory;if(sharedMemory===undefined){throw new Error(\"Screenshot image buffer is invalid\")}const source=new Uint8Array(sharedMemory.bufferHandle.mapBuffer(0,sharedMemory.size).buffer);const buffer=Mojo.createSharedBuffer(sharedMemory.size);const destination=new Uint8Array(buffer.handle.mapBuffer(0,sharedMemory.size).buffer);destination.set(source);return{...image,bytes:{sharedMemory:{bufferHandle:buffer.handle,size:sharedMemory.size}}}}export class BrowserProxyImpl{handler=new PageHandlerRemote;callbackRouter=new PageCallbackRouter;constructor(){PageHandlerFactory.getRemote().createPageHandler(this.callbackRouter.$.bindNewPipeAndPassRemote(),this.handler.$.bindNewPipeAndPassReceiver())}async captureSelection(rect){const{result:result}=await this.handler.captureSele"
    },
    {
      "id": 61086,
      "role": "Tab Custom Group",
      "category": "custom group WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 589,
      "decoded_bytes": 589,
      "title": "",
      "file": "text/resource-61086.html",
      "product_file": null,
      "urls": [
        "chrome://theme/colors.css?sets=ui,chrome",
        "chrome://resources/css/text_defaults.css"
      ],
      "head": "<!DOCTYPE html> <html> <head> <meta charset=\"utf-8\"> <link rel=\"stylesheet\" href=\"chrome://theme/colors.css?sets=ui,chrome\"> <link rel=\"stylesheet\" href=\"chrome://resources/css/text_defaults.css\"> <link rel=\"stylesheet\" href=\"tab_custom_group.css\"> <script type=\"module\" src=\"tab_custom_group.js\"></script> <style> html, body { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; background-color: var(--color-sys-surface1); } </style> </head> <body> <tab-custom-group-app></tab-custom-group-app> </body> </html> "
    },
    {
      "id": 61180,
      "role": "Tabbit Debug",
      "category": "Tabbit debug tools WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 1627,
      "decoded_bytes": 1627,
      "title": "Tabbit Debug",
      "file": "text/resource-61180.html",
      "product_file": null,
      "urls": [
        "chrome://resources/css/text_defaults.css"
      ],
      "head": "<!DOCTYPE html> <html> <head> <meta charset=\"utf-8\"> <title>Tabbit Debug</title> <link rel=\"stylesheet\" href=\"chrome://resources/css/text_defaults.css\"> <link rel=\"stylesheet\" href=\"tabbit_debug.css\"> <script type=\"module\" src=\"tabbit_debug.js\"></script> </head> <body> <div class=\"page-container\"> <h1 id=\"page-title\">Tabbit Browser Debug Tools</h1> <div class=\"section\"> <h2 id=\"logging-control-title\">Logging Control</h2> <div class=\"control-row\"> <label class=\"toggle-container\"> <span id=\"enable-logging-label\" class=\"toggle-label\"> Enable Logging </span> <input type=\"checkbox\" id=\"logging-toggle\" class=\"toggle\"> <span class=\"toggle-slider\"></span> </label> <div class=\"status\" id=\"logging-status\"></div> </div> <div class=\"debug-info\" id=\"debug-info\"></div> <div class=\"config-info\" id=\"config-info\"></div> </div> <div class=\"section\"> <h2 id=\"log-directory-title\">Log Directory</h2> <div class=\"path-display\" id=\"log-path\"> Loading... </div> <button id=\"open-log-btn\" class=\"action-button\"> Open Log Directory "
    },
    {
      "id": 61181,
      "role": "Tabbit Debug CSS",
      "category": "Tabbit-authored stylesheet",
      "status": "text",
      "text_type": "css",
      "chars": 4494,
      "decoded_bytes": 4494,
      "title": "",
      "file": "text/resource-61181.css",
      "product_file": null,
      "urls": [],
      "head": "/* Copyright 2026 The Tabbit Browser Authors */ :root { --primary-color: rgb(26, 115, 232); --border-color: rgb(218, 220, 224); --hover-bg: rgb(248, 249, 250); --success-color: rgb(15, 157, 88); --error-color: rgb(217, 48, 37); --warning-color: rgb(230, 145, 0); --section-bg: white; --text-primary: rgb(32, 33, 36); --text-secondary: rgb(95, 99, 104); } @media (prefers-color-scheme: dark) { :root { --primary-color: rgb(138, 180, 248); --border-color: rgb(95, 99, 104); --hover-bg: rgb(60, 64, 67); --success-color: rgb(129, 201, 149); --error-color: rgb(242, 139, 130); --warning-color: rgb(255, 179, 64); --section-bg: rgb(41, 42, 45); --text-primary: rgb(232, 234, 237); --text-secondary: rgb(154, 160, 166); } } * { box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 0; padding: 20px; background: var(--hover-bg); color: var(--text-primary); } .page-container { max-width: 800px; margin: 0 auto; } h1 { font-size: 24px; font-weight: 400; margin: 0 0 24px 0; color: var(--text-primary); } h2 { font-size: 16px; font-weight: 500; m"
    },
    {
      "id": 61182,
      "role": "Tabbit Debug JS",
      "category": "Tabbit-authored debug script",
      "status": "text",
      "text_type": "javascript",
      "chars": 5585,
      "decoded_bytes": 5593,
      "title": "",
      "file": "text/resource-61182.js",
      "product_file": null,
      "urls": [
        "chrome://resources/js/cr.js",
        "chrome://resources/js/load_time_data.js"
      ],
      "head": "// Copyright 2026 The Tabbit Browser Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import\"/strings.m.js\";import{sendWithPromise}from\"chrome://resources/js/cr.js\";import{loadTimeData}from\"chrome://resources/js/load_time_data.js\";function i18n(key){return loadTimeData.getString(key)}function setTextContent(id,key){const element=document.getElementById(id);if(element){element.textContent=i18n(key)}}function labelValue(labelKey,value){const label=i18n(labelKey);return`${label}${label.endsWith(\":\")?\" \":\"\"}${value}`}function commandLineValue(switchText){const activeSuffix=i18n(\"activeSuffix\");return`${switchText}${activeSuffix.startsWith(\"(\")?\" \":\"\"}${activeSuffix}`}function applyLocalizedStrings(){document.title=i18n(\"documentTitle\");setTextContent(\"page-title\",\"pageTitle\");setTextContent(\"logging-control-title\",\"loggingControlTitle\");setTextContent(\"enable-logging-label\",\"enableLogging\");setTextContent(\"log-directory-title\",\"logDirectoryTitle\");setTextContent(\"log-path\",\"loading\");setTextContent(\"open-log-btn\",\"openLogDirectory\");setTextContent(\"crash-dumps-title\",\"crashDumpsTitle\");setTextContent(\"dmp-path\",\"loading\");s"
    },
    {
      "id": 61210,
      "role": "Tabbit Desktop Pet",
      "category": "desktop pet WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 566,
      "decoded_bytes": 566,
      "title": "Tabbit Desktop Pet",
      "file": "text/resource-61210.html",
      "product_file": null,
      "urls": [],
      "head": "<!doctype html> <html> <head> <meta charset=\"utf-8\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> <title>Tabbit Desktop Pet</title> <link rel=\"stylesheet\" href=\"tabbit_desktop_pet.css\"> <script type=\"module\" src=\"tabbit_desktop_pet.js\"></script> </head> <body> <main class=\"pet-stage\" data-mode=\"loading\" aria-label=\"Tabbit desktop pet\"> <iframe id=\"petIframe\" title=\"Tabbit desktop pet player\" allow=\"clipboard-read; clipboard-write\"> </iframe> </main> </body> </html> "
    },
    {
      "id": 61212,
      "role": "Desktop Pet bridge",
      "category": "desktop pet iframe/Mojo bridge",
      "status": "text",
      "text_type": "javascript",
      "chars": 5101,
      "decoded_bytes": 5101,
      "title": "",
      "file": "text/resource-61212.js",
      "product_file": null,
      "urls": [
        "chrome://resources/js/load_time_data.js"
      ],
      "head": "import\"/strings.m.js\";import{DragDirection,PageCallbackRouter,PageHandlerFactory}from\"./tabbit_desktop_pet.mojom-webui.js\";import{loadTimeData}from\"chrome://resources/js/load_time_data.js\";const PLAYER_URL=loadTimeData.getString(\"petIframeUrl\");const PLAYER_ORIGIN=new URL(PLAYER_URL).origin;const petIframe=document.querySelector(\"#petIframe\");const stage=document.querySelector(\".pet-stage\");const pageHandlerFactory=PageHandlerFactory.getRemote();let pendingDirection=\"idle\";let iframeReady=false;let iframeRepaintFrame;let iframeRepaintResetFrame;let iframeReloadSequence=0;const pendingPetMessages=[];function isContextMenuAction(action){return action===\"feed\"||action===\"hide\"}function isRecord(value){return Boolean(value)&&typeof value===\"object\"}function movementForDirection(direction){switch(direction){case DragDirection.kLeft:return\"left\";case DragDirection.kRight:return\"right\";case DragDirection.kUp:return\"up\";case DragDirection.kDown:return\"down\";case DragDirection.kIdle:default:return\"idle\"}}function requestIframeRepaint(){if(!petIframe||stage?.dataset[\"mode\"]!==\"iframe\"){return}if(iframeRepaintFrame!==undefined){return}iframeRepaintFrame=window.requestAnimationFrame((()=>{ifra"
    },
    {
      "id": 61230,
      "role": "Diagnostic upload dialog",
      "category": "diagnostic feedback and upload dialog",
      "status": "text",
      "text_type": "html",
      "chars": 3951,
      "decoded_bytes": 3953,
      "title": "$i18n{title}",
      "file": "text/resource-61230.html",
      "product_file": null,
      "urls": [
        "chrome://resources/css/text_defaults_md.css"
      ],
      "head": "<!doctype html> <html lang=\"$i18n{language}\"> <head> <meta charset=\"utf-8\"> <title>$i18n{title}</title> <link rel=\"stylesheet\" href=\"chrome://resources/css/text_defaults_md.css\"> <script type=\"module\" src=\"strings.m.js\"></script> </head> <body> <main class=\"dialog-shell\"> <section id=\"form-view\" class=\"view\" style=\"display: flex;\"> <h1 class=\"view-title\">$i18n{title}</h1> <p class=\"view-subtitle\">$i18n{subtitle}</p> <div class=\"field-group\"> <label class=\"field-label\" for=\"description\">$i18n{descriptionLabel}</label> <textarea id=\"description\" rows=\"6\" maxlength=\"500\" placeholder=\"$i18n{descriptionPlaceholder}\" required></textarea> <p id=\"description-error\" class=\"field-error\" style=\"display:none\"> $i18n{descriptionError} </p> </div> <div class=\"field-group\"> <label class=\"field-label\" for=\"email\">$i18n{emailLabel}</label> <input id=\"email\" type=\"email\" placeholder=\"$i18n{emailPlaceholder}\"> <p id=\"email-error\" class=\"field-error\" style=\"display:none\"> $i18n{emailError} </p> </div> "
    },
    {
      "id": 61250,
      "role": "Tabbit Voice Input",
      "category": "speech internals WebUI",
      "status": "text",
      "text_type": "html",
      "chars": 3192,
      "decoded_bytes": 3254,
      "title": "Tabbit Voice Input",
      "file": "text/resource-61250.html",
      "product_file": null,
      "urls": [
        "chrome://resources/css/text_defaults.css"
      ],
      "head": "<!DOCTYPE html> <html> <head> <meta charset=\"utf-8\"> <title>Tabbit Voice Input</title> <link rel=\"stylesheet\" href=\"chrome://resources/css/text_defaults.css\"> <link rel=\"stylesheet\" href=\"tabbit_speech_internals.css\"> <script type=\"module\" src=\"tabbit_speech_internals.js\"></script> </head> <body> <main class=\"page\"> <header class=\"header\"> <h1>Tabbit Voice Input</h1> <div id=\"status\" class=\"status\">Loading...</div> </header> <section class=\"section\"> <h2>Dictation</h2> <label class=\"checkbox\"> <input id=\"enabled\" type=\"checkbox\"> <span>Enabled</span> </label> <label class=\"field\"> <span>Language</span> <select id=\"language\"> <option value=\"\">System Default</option> <option value=\"en-US\">English (US)</option> <option value=\"zh-CN\">中文（简体）</option> <option value=\"zh-TW\">中文（繁體）</option> <option value=\"ja-JP\">日本語</option> <option value=\"ko-KR\">한국어</option> </select> </label> <div class=\"actions\"> <button id=\"save\">Save</button> </div> </section> <section class=\"section\"> <h2>Test Voice In"
    },
    {
      "id": 61251,
      "role": "Voice Input CSS",
      "category": "Tabbit-authored stylesheet",
      "status": "text",
      "text_type": "css",
      "chars": 2751,
      "decoded_bytes": 2751,
      "title": "",
      "file": "text/resource-61251.css",
      "product_file": null,
      "urls": [],
      "head": "/* Copyright 2026 The Tabbit Browser Authors */ :root { --bg: rgb(248, 249, 250); --border: rgb(218, 220, 224); --button: rgb(26, 115, 232); --error: rgb(217, 48, 37); --ok: rgb(15, 157, 88); --panel: white; --text: rgb(32, 33, 36); --text-muted: rgb(95, 99, 104); } @media (prefers-color-scheme: dark) { :root { --bg: rgb(32, 33, 36); --border: rgb(95, 99, 104); --button: rgb(138, 180, 248); --error: rgb(242, 139, 130); --ok: rgb(129, 201, 149); --panel: rgb(41, 42, 45); --text: rgb(232, 234, 237); --text-muted: rgb(154, 160, 166); } } * { box-sizing: border-box; } body { background: var(--bg); color: var(--text); margin: 0; } .page { margin: 0 auto; max-width: 860px; padding: 24px; } .header { align-items: center; display: flex; gap: 16px; justify-content: space-between; margin-bottom: 20px; } h1 { font-size: 24px; font-weight: 400; margin: 0; } h2 { font-size: 16px; font-weight: 500; margin: 0 0 16px; } .status { border: 1px solid var(--border); border-radius: 16px; color: var(--text-muted); font-size: 13px; padding: 6px 12px; } .status.available { color: var(--ok); } .st"
    },
    {
      "id": 61252,
      "role": "Voice Input JS",
      "category": "Tabbit-authored speech internals script",
      "status": "text",
      "text_type": "javascript",
      "chars": 4748,
      "decoded_bytes": 4748,
      "title": "",
      "file": "text/resource-61252.js",
      "product_file": null,
      "urls": [],
      "head": "// Copyright 2026 The Tabbit Browser Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import{PageHandlerFactory,PageHandlerRemote}from\"./tabbit_speech_internals.mojom-webui.js\";const pageHandler=new PageHandlerRemote;PageHandlerFactory.getRemote().createPageHandler(pageHandler.$.bindNewPipeAndPassReceiver());function getRequiredElement(id){const element=document.getElementById(id);if(!element){throw new Error(`Missing element: ${id}`)}return element}function getSettingsFromPage(){return{enabled:getRequiredElement(\"enabled\").checked,language:getRequiredElement(\"language\").value}}function setStatus(text,ok){const status=getRequiredElement(\"status\");status.textContent=text;status.className=ok?\"status available\":\"status unavailable\"}let voiceInputTestRecording=false;let voiceInputTestPollId=null;function updateVoiceInputTestTarget(text,isFinal){const target=getRequiredElement(\"voice-input-test-target\");target.value=text;target.focus();target.setSelectionRange(target.value.length,target.value.length);if(isFinal){const message=text?\"Transcription complete.\":\"No speech was transcribed.\";setVoiceInputTestRecording(false,message"
    }
  ],
  "notable_findings": [
    "resources.pak contains full text payloads for Tabbit WebUI pages, not only string tables.",
    "Tabbit-authored WebUI sources are visible for Tabbit Debug, Voice Input, and Desktop Pet.",
    "Tabbit also packages extension pages and large content bundles: quick actions, popup, LLM bridge, subtitle fetcher, Readability, screenshot, onboarding, organizer and local-file preview.",
    "Tabbit Translation is shipped as a full MV3 extension inside resources.pak with its own manifest, localized messages, options page and popup.",
    "TabLocalFiles/Previewer ships HTML, JS, CSS, theme and document-viewer assets; this is a product web application bundled into the browser."
  ],
  "limitations": [
    "Resource IDs are preserved, but original GRD/GRDP names are not present. Roles are inferred from HTML titles, source headers, imports and content.",
    "Some product keyword matches are upstream Chromium WebUI pages that merely mention bookmarks, history, Mojo, settings or skills.",
    "Extracted resources are data; no target JavaScript was executed.",
    "Binary resources are indexed, not visually reconstructed in this pass."
  ]
}