smart-web-mcp 0.44.1 → 1.1.0

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.
Files changed (162) hide show
  1. package/CHANGELOG.md +350 -0
  2. package/README.md +33 -568
  3. package/dist/assessment.d.ts +10 -3
  4. package/dist/assessment.js +21 -6
  5. package/dist/assessment.js.map +1 -1
  6. package/dist/body-export.d.ts +10 -0
  7. package/dist/body-export.js +28 -0
  8. package/dist/body-export.js.map +1 -0
  9. package/dist/browser-session.d.ts +32 -1
  10. package/dist/browser-session.js +373 -3
  11. package/dist/browser-session.js.map +1 -1
  12. package/dist/cli-fetch-options.d.ts +7 -0
  13. package/dist/cli-fetch-options.js +41 -0
  14. package/dist/cli-fetch-options.js.map +1 -0
  15. package/dist/cli.js +28 -11
  16. package/dist/cli.js.map +1 -1
  17. package/dist/comment-export.d.ts +10 -0
  18. package/dist/comment-export.js +39 -0
  19. package/dist/comment-export.js.map +1 -0
  20. package/dist/composition.d.ts +1 -22
  21. package/dist/composition.js +0 -16
  22. package/dist/composition.js.map +1 -1
  23. package/dist/extraction/budget.d.ts +3 -0
  24. package/dist/extraction/budget.js +88 -7
  25. package/dist/extraction/budget.js.map +1 -1
  26. package/dist/extraction/document.js +134 -9
  27. package/dist/extraction/document.js.map +1 -1
  28. package/dist/korea/coupang-filters.d.ts +5 -0
  29. package/dist/korea/coupang-filters.js +87 -0
  30. package/dist/korea/coupang-filters.js.map +1 -0
  31. package/dist/korea/coupang.d.ts +27 -6
  32. package/dist/korea/coupang.js +202 -82
  33. package/dist/korea/coupang.js.map +1 -1
  34. package/dist/korea/proxy-client.d.ts +1 -0
  35. package/dist/korea/proxy-client.js +6 -2
  36. package/dist/korea/proxy-client.js.map +1 -1
  37. package/dist/korea/smartvertical.d.ts +1 -0
  38. package/dist/korea/smartvertical.js +39 -25
  39. package/dist/korea/smartvertical.js.map +1 -1
  40. package/dist/lib.d.ts +4 -2
  41. package/dist/lib.js +2 -1
  42. package/dist/lib.js.map +1 -1
  43. package/dist/mcp-server.js +30 -15
  44. package/dist/mcp-server.js.map +1 -1
  45. package/dist/operator-browser-fixture.d.ts +7 -0
  46. package/dist/operator-browser-fixture.js +19 -0
  47. package/dist/operator-browser-fixture.js.map +1 -0
  48. package/dist/operator-canary-cli.d.ts +6 -0
  49. package/dist/operator-canary-cli.js +190 -0
  50. package/dist/operator-canary-cli.js.map +1 -0
  51. package/dist/operator-canary.d.ts +74 -0
  52. package/dist/operator-canary.js +135 -0
  53. package/dist/operator-canary.js.map +1 -0
  54. package/dist/operator-cdp.d.ts +15 -0
  55. package/dist/operator-cdp.js +195 -0
  56. package/dist/operator-cdp.js.map +1 -0
  57. package/dist/operator-frame.d.ts +3 -0
  58. package/dist/operator-frame.js +55 -0
  59. package/dist/operator-frame.js.map +1 -0
  60. package/dist/settings.d.ts +3 -0
  61. package/dist/settings.js +1 -0
  62. package/dist/settings.js.map +1 -1
  63. package/dist/shared.d.ts +33 -8
  64. package/dist/shared.js +15 -9
  65. package/dist/shared.js.map +1 -1
  66. package/dist/smartbrowser.d.ts +169 -0
  67. package/dist/smartbrowser.js +288 -0
  68. package/dist/smartbrowser.js.map +1 -0
  69. package/dist/smartcrawl.js +16 -21
  70. package/dist/smartcrawl.js.map +1 -1
  71. package/dist/smartfetch/academic-fallback.js +3 -5
  72. package/dist/smartfetch/academic-fallback.js.map +1 -1
  73. package/dist/smartfetch/archive-fallback.js +2 -5
  74. package/dist/smartfetch/archive-fallback.js.map +1 -1
  75. package/dist/smartfetch/assets.d.ts +1 -1
  76. package/dist/smartfetch/assets.js +28 -1
  77. package/dist/smartfetch/assets.js.map +1 -1
  78. package/dist/smartfetch/jina-reader.d.ts +1 -0
  79. package/dist/smartfetch/jina-reader.js +17 -3
  80. package/dist/smartfetch/jina-reader.js.map +1 -1
  81. package/dist/smartfetch/pipeline.js +15 -25
  82. package/dist/smartfetch/pipeline.js.map +1 -1
  83. package/dist/smartfetch/provider-policy.d.ts +3 -0
  84. package/dist/smartfetch/provider-policy.js +45 -2
  85. package/dist/smartfetch/provider-policy.js.map +1 -1
  86. package/dist/smartfetch/provider-types.d.ts +8 -0
  87. package/dist/smartfetch/providers/article.js +76 -10
  88. package/dist/smartfetch/providers/article.js.map +1 -1
  89. package/dist/smartfetch/providers/blind-post.d.ts +2 -0
  90. package/dist/smartfetch/providers/blind-post.js +167 -0
  91. package/dist/smartfetch/providers/blind-post.js.map +1 -0
  92. package/dist/smartfetch/providers/clien.d.ts +2 -0
  93. package/dist/smartfetch/providers/clien.js +157 -0
  94. package/dist/smartfetch/providers/clien.js.map +1 -0
  95. package/dist/smartfetch/providers/commerce.d.ts +15 -0
  96. package/dist/smartfetch/providers/commerce.js +123 -7
  97. package/dist/smartfetch/providers/commerce.js.map +1 -1
  98. package/dist/smartfetch/providers/dcinside.js +313 -20
  99. package/dist/smartfetch/providers/dcinside.js.map +1 -1
  100. package/dist/smartfetch/providers/github-issue.d.ts +3 -0
  101. package/dist/smartfetch/providers/github-issue.js +101 -0
  102. package/dist/smartfetch/providers/github-issue.js.map +1 -0
  103. package/dist/smartfetch/providers/hackernews-html.d.ts +21 -0
  104. package/dist/smartfetch/providers/hackernews-html.js +148 -0
  105. package/dist/smartfetch/providers/hackernews-html.js.map +1 -0
  106. package/dist/smartfetch/providers/hackernews.js +76 -14
  107. package/dist/smartfetch/providers/hackernews.js.map +1 -1
  108. package/dist/smartfetch/providers/index.js +9 -1
  109. package/dist/smartfetch/providers/index.js.map +1 -1
  110. package/dist/smartfetch/providers/linkedin.js +2 -1
  111. package/dist/smartfetch/providers/linkedin.js.map +1 -1
  112. package/dist/smartfetch/providers/naver-blog.d.ts +2 -0
  113. package/dist/smartfetch/providers/naver-blog.js +87 -45
  114. package/dist/smartfetch/providers/naver-blog.js.map +1 -1
  115. package/dist/smartfetch/providers/naver-cafe-native.d.ts +7 -0
  116. package/dist/smartfetch/providers/naver-cafe-native.js +188 -0
  117. package/dist/smartfetch/providers/naver-cafe-native.js.map +1 -0
  118. package/dist/smartfetch/providers/naver-cafe.js +165 -4
  119. package/dist/smartfetch/providers/naver-cafe.js.map +1 -1
  120. package/dist/smartfetch/providers/naver-map-search.js +1 -1
  121. package/dist/smartfetch/providers/naver-map-search.js.map +1 -1
  122. package/dist/smartfetch/providers/ppomppu.d.ts +2 -0
  123. package/dist/smartfetch/providers/ppomppu.js +289 -0
  124. package/dist/smartfetch/providers/ppomppu.js.map +1 -0
  125. package/dist/smartfetch/providers/reddit.js +24 -3
  126. package/dist/smartfetch/providers/reddit.js.map +1 -1
  127. package/dist/smartfetch/providers/threads.js +1 -1
  128. package/dist/smartfetch/providers/threads.js.map +1 -1
  129. package/dist/smartfetch/providers/wikipedia.js +138 -0
  130. package/dist/smartfetch/providers/wikipedia.js.map +1 -1
  131. package/dist/smartfetch.d.ts +7 -1
  132. package/dist/smartfetch.js +353 -76
  133. package/dist/smartfetch.js.map +1 -1
  134. package/dist/smartsearch-brave.d.ts +2 -0
  135. package/dist/smartsearch-brave.js +43 -0
  136. package/dist/smartsearch-brave.js.map +1 -0
  137. package/dist/smartsearch-browser.d.ts +5 -0
  138. package/dist/smartsearch-browser.js +116 -0
  139. package/dist/smartsearch-browser.js.map +1 -0
  140. package/dist/smartsearch-ddg.d.ts +2 -0
  141. package/dist/smartsearch-ddg.js +46 -0
  142. package/dist/smartsearch-ddg.js.map +1 -0
  143. package/dist/smartsearch-node.d.ts +6 -0
  144. package/dist/smartsearch-node.js +21 -0
  145. package/dist/smartsearch-node.js.map +1 -0
  146. package/dist/smartsearch-postgresql.d.ts +7 -0
  147. package/dist/smartsearch-postgresql.js +44 -0
  148. package/dist/smartsearch-postgresql.js.map +1 -0
  149. package/dist/smartsearch-python.d.ts +8 -0
  150. package/dist/smartsearch-python.js +87 -0
  151. package/dist/smartsearch-python.js.map +1 -0
  152. package/dist/smartsearch-quality.d.ts +6 -0
  153. package/dist/smartsearch-quality.js +47 -0
  154. package/dist/smartsearch-quality.js.map +1 -0
  155. package/dist/smartsearch-youtube.d.ts +7 -0
  156. package/dist/smartsearch-youtube.js +76 -0
  157. package/dist/smartsearch-youtube.js.map +1 -0
  158. package/dist/smartsearch.d.ts +2 -0
  159. package/dist/smartsearch.js +506 -84
  160. package/dist/smartsearch.js.map +1 -1
  161. package/package.json +8 -5
  162. package/python/requirements-undetected-chromedriver.txt +2 -2
package/CHANGELOG.md CHANGED
@@ -5,9 +5,219 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on Keep a Changelog[^1] and this project uses SemVer.
6
6
 
7
7
  ## Unreleased
8
+ * Read public GitHub issue originals and their first 100 API comments with exact issue/comment identity validation. A missing, malformed or rate-limited API response stays partial rather than presenting page chrome as a complete discussion; threads beyond the first page remain incomplete.
9
+ * Resolve quote-only searches scoped to a full public article URL from its primary original body when the phrase is absent from search-index metadata. Preserve exact URL and snippet provenance; do not accept navigation text, extra unsupported terms, redirects, private/local-only requests, or an unverified original. Exact npm packages retain their existing metadata route.
10
+ * Read a requested HTML section fragment from its unique section, heading, or leading empty alias within the primary content, including nested subsections, rather than presenting the unrelated beginning of a long reference page. Missing or changed-document anchors remain partial; other fragment layouts are not claimed supported.
11
+ * Keep an ordinary authored article as its original body instead of converting it to a paper solely because it names an author. Academic enrichment still applies when DOI/PubMed/journal identity or an academic host supplies paper evidence; generic article body coverage no longer becomes falsely partial from appended author metadata.
12
+ * Preserve literal code operators and identifier underscores in generic HTML original text instead of removing them as Markdown decoration; Markdown-source cleanup remains separate.
13
+ * Exclude generic HTML descendants marked hidden, inert, aria-hidden, or inline display/visibility-hidden from article text, headings, blocks, Markdown, index cards and hidden-only outbound links. A title with no visible body is partial; a URL also linked visibly remains available.
14
+ * Exclude hidden Ppomppu post and comment descendants from readable text, links, and media while retaining visible original evidence. A hidden-only body is not a recovered article.
15
+ * Continue public Blind post comments through bounded, verified local-browser more/reply controls when the native page omits rows. Preserve exact post identity, existing comments and partial status on participation or failed continuation; exclude native ad rows from comment-completeness decisions.
16
+ * Scope public Blind discussion pages to the exact post body and readable native comments instead of mixing ads, related posts, and comment text into an apparently complete article. Preserve declared-versus-collected comment coverage; hidden or unloaded replies remain partial.
17
+ * Bind a Coupang product's current ordinary price to one rendered price layout and the visible product/item identity, rather than confusing its crossed-out list price or conditional card/member discount with the sale price. Ambiguous layouts and mismatched variants remain partial without a verified price.
18
+ * Keep a Coupang browser product read partial when visible KRW prices cannot be tied to the requested variant and their conditions. Retain the exact product and visible details, but do not claim a verified structured price or complete shopping answer.
19
+ * Read exact Wikipedia section URLs through the native article heading and its bounded subsection, rather than claiming a clipped article prefix is the requested section. Preserve verified redirects and report unavailable/missing headings as partial instead of substituting unrelated content.
20
+ * Reject archive.md capture-list search pages even when they list snapshots; a search index is not the requested article body and must not be reported complete.
21
+ * Continue a weak NamuWiki direct document in the approved local browser before optional slow relays when CDP is configured. Require readable primary content and the exact requested article URL; a failed or changed-identity browser attempt retains the existing relay route and never retries the same browser task.
22
+ * Recover Wikipedia alias originals from a native MediaWiki parse response only when its bounded redirect chain starts at the requested title and ends at the returned article. Retain the supplied URL and reject unrelated redirect metadata.
23
+ * When Wikipedia's native article API is unavailable, do not report a navigation-heavy Jina relay as a complete article: retain the exact URL and a partial/unavailable outcome without relaying chrome links or assets. Readable relay articles without that shell remain available.
24
+ * Replace Wikipedia Jina navigation-heavy relay text with the exact-title MediaWiki parsed article body when the native API verifies the requested page within the remaining deadline; retain the existing route on API failure.
25
+ * Treat HTTP-success SearXNG responses without a `results` array as failed provider attempts, not verified no-hit searches. A valid empty array stays a genuine zero-result response, and other enabled discovery routes can still recover originals.
26
+ * Recover exact npm package searches with standalone quoted phrases when the registry name or description contains the whole phrase; keep negative quotes and additional unsupported constraints on full-query search, and label original-body verification separately.
27
+ * Prefer validated Naver Cafe article originals over equally topical menu listings in Korean discovery, while retaining menu-only leads. Search snippets still do not establish readable article content or login access.
28
+ * Resolve simple `Node.js 24 fsPromises.* documentation` lookups to a verified official filesystem API section; fetching that exact fragment returns its scoped signature/options instead of a clipped whole page. Unsupported query operators still use general search, and missing fragments remain partial.
29
+ * Preserve PostgreSQL versioned command-reference syntax, parameter text and trailing sections from the scoped `refentry` body, rather than reporting a prose-only CREATE INDEX extraction as complete.
30
+ * Preserve the full chapter table on versioned PostgreSQL documentation pages instead of treating prose-extractor output that omits later symbols as complete; bounded inline output reports body coverage and explicit private export retains the normalized full source.
31
+ * Resolve simple unscoped PostgreSQL version-and-symbol documentation lookups through the official search and a version-matched original containing the symbol; reject mismatched versions, index-only evidence and unsupported operators, and retain general search on native failure.
32
+ * Rank Korean Wikipedia native results with the whole simple query phrase in title/snippet before scattered-term matches, excluding incidental single-term matches when supported leads exist; retain all leads when none has enough visible evidence, and fill slots from the existing bounded native candidate pool.
33
+ * For simple unscoped `Python … documentation` searches with no usable general-engine result, continue from approved-browser general discovery to the official Python docs index; prefer verified native symbol cards over adjacent general leads, retaining those leads if native search fails. Other Python questions and unsupported operators are unchanged.
34
+ * Reject invalid or conflicting CLI `--budget`/`--output-budget` values before search, fetch, or crawl; a misspelled `full` no longer silently falls back to compact and omits requested comments.
35
+ * Reject Jina Reader's Korean missing-page shell rather than treating its navigation text as a recovered article after the original URL fails; retain the direct failure and continue eligible recovery routes.
36
+ * Preserve explicit `site:` URL query parameters when filtering search originals: a Ppomppu `id=interior` scope no longer admits `id=diy` posts from the same path, including host-only browser continuation.
37
+ * Recover Korean Clien/DCInside/Ppomppu path-scoped discovery when Naver treats the path as text: retry once with the host-only query inside the shared deadline, while enforcing the original path on every returned URL and stopping on participation or changed query identity.
38
+ * Treat a visibly locked Blind review as user-required before optional relay/archive retries; retain the public preview rather than spending the request deadline on an unrelated fallback.
39
+ * Enforce the CLI smartsearch `--max-chars` cap on rendered text with an explicit truncation marker; reject invalid limits before retrieval while leaving `--json` structured results intact.
40
+ * Make `smart-web fetch --format json` emit structured JSON as advertised (equivalent to `--json`), and reject unknown fetch formats before a web request.
41
+ * Allow explicit `smart-web fetch --export-body` to return the existing bounded private normalized-body receipt in CLI output; reject caller-selected paths and keep default inline output bounded.
42
+ * Add opt-in private normalized-body export before inline clipping (1 MiB, 0600, hash/character/coverage receipt), preserving partial inline delivery and avoiding an unbounded MCP response.
43
+ * Exclude Wayback toolbar media and duplicate inferred original assets when an archived media URL is available; retain archived download URLs instead of treating possibly dead live originals as verified downloads, without changing ordinary reads.
44
+ * Mark a generic article's projected response partial when its primary body is clipped, even if the source has no explicit body-coverage record. The budget still reports omitted characters; an unclipped source remains complete.
45
+ * Normalize original outbound URLs from Wayback-backed article reads instead of presenting replay wrappers and archive toolbar links as usable sources. Snapshot-only media assets and long-body projection remain separate limits.
46
+ * Reject unsupported CLI options before executing a search, fetch, or crawl; `--full` no longer silently uses the compact budget. Use `--budget full` for complete bounded projection.
47
+ * Mark Blind company-review pages with a review-to-unlock prompt on the requested review as partial, user-required previews; do not mistake related ratings/reviews for the original body.
48
+ * Suppress a Ppomppu-owned outbound tracking link only when its decoded target is already present as the exact direct original; retain unmatched or foreign-post links.
49
+ * Require YouTube native result titles to support unquoted positive terms too; a scoped review query no longer treats a generic product summary as a review merely because the quoted model matches.
50
+ * Recover explicit `site:youtube.com/watch` positive/quoted searches through YouTube's native results in the approved local browser when general discovery has no usable originals. Preserve exact video IDs and shared deadline; titles are leads, not verified video/transcript content.
51
+ * Resolve the release PR from the verified tag commit during manually dispatched publication recovery, rather than using the dispatch branch SHA and leaving the merged release PR pending.
52
+ * Keep MDN native quoted-symbol discovery to title/summary-supported candidates instead of treating neighboring index entries as exact matches. Without index evidence, continue the full scoped query; original-body relevance remains unverified.
53
+ * Keep Ppomppu post/comment link-preview text and destinations while excluding generated CSS thumbnails from article assets; retain actual inline photos and attachments.
54
+
55
+ * Exclude Ppomppu's known expand-control icon from scoped post/comment assets without dropping article photos or externally hosted comment images.
56
+ * Classify Brave's HTTP-success human-verification page as a failed search attempt rather than a verified empty result; an actually empty response remains a no-hit result.
57
+
58
+ * Exclude GitHub wiki edit/history views from explicitly wiki-scoped article discovery before limiting results, while preserving them when history or edit is requested.
59
+
60
+ * Scope Ppomppu asset discovery to the verified post body and accepted comments, excluding unrelated header/navigation images while retaining inline media.
61
+
62
+ * Honor explicit full smartfetch budget in the human-readable text view, delivering all projected comments (up to 30) rather than silently hiding complete threads behind the compact eight-comment renderer.
63
+
64
+ * Distinguish malformed HTTP-success crates.io search envelopes from a verified empty crates list; native failure diagnostics and scoped general-search continuation remain available.
65
+
66
+ * Distinguish malformed HTTP-success MDN, Wikipedia and npm search envelopes from verified empty native searches, preserving failed-provider diagnostics and general-search continuation.
67
+
68
+ * Reject empty or wrong-identity HTTP-success npm package metadata instead of constructing a result from the requested URL; continue to a scoped general search when available.
69
+
70
+ * Omit over-budget smartsearch result URLs instead of publishing truncated, unusable originals. Fill from later usable results, record omissions and lower projected confidence; provider discovery itself is unchanged.
71
+
72
+ * Deliver up to 30 normalized comments in explicitly full smartfetch output, including 26-comment Ppomppu originals. Compact/balanced limits and private export remain separate; larger threads or clipped evidence stay partial.
73
+
74
+ * Continue Ppomppu's observed native more-comments control in an owned browser task, preserving post identity, original body, comment IDs and the shared deadline. Pending, failed or clipped comment delivery remains partial.
75
+
76
+ * Align source package, MCP Registry and README descriptions with the shipped bounded `smartbrowser` action tool and retired legacy browser backend; document that tab state is batch-scoped.
77
+
78
+ * Follow observed Naver Cafe native next-comment controls in an owned, deadline-bounded browser task. Retain exact article body and route identity while reconciling comments-only pages; masked/unknown IDs and unvisited pages remain partial.
79
+ * Document the verified local browser-backend retirement boundary: used public-page/action coverage, migrated consumer configuration, host-specific adoption limits, and rollback without relaunching the archived service.
80
+
81
+ * Preserve guarded main-frame GET navigation when Chromium replaces an aborted response interception with a new request bearing the same native network identity and exact URL. Keep replacement validation, document sandboxing, deadlines and ordinary response failures intact; do not retry navigation or treat a bare abort as success.
82
+ * Preserve readable content and participation outcomes when a task-owned request is natively cancelled during URL validation. Ignore only the exact stale continuation error with matching native cancellation evidence; keep ambiguous/unsafe/response failures terminal and await outstanding guards before publishing content.
83
+ * Keep exact Naver Blog/Cafe article identity through shared-link redirects, including native mobile continuation, original URL provenance, explicit targets, and terminal browser participation/safety failures without provider retries.
84
+ * Recover exact Naver Cafe articles and owned comments through the native mobile browser entry. Preserve public-share identity, media-only evidence, participation, and body/comment coverage through projection/export; render native comments in text/Markdown and stop treating API comment counts as recovered rows.
85
+ * Continue no-yield Python documentation discovery through the official native search in the approved browser. Preserve version/path/positive-phrase constraints, completed card-local evidence and the shared deadline; deduplicate symbol matches by original page. General search coverage and unsupported query operators remain separate.
86
+
87
+ * Preserve nonstandard browser response codes through guarded document fulfillment even when the origin supplies no reason phrase. Initial HTTP errors now stop before readiness/actions with the observed status instead of becoming content timeouts or protocol errors; error pages are not successful retrievals.
88
+
89
+ * Recover exact Hacker News stories and native comment parent identities after item-API failures or malformed payloads, with honest declared/collected/returned coverage and existing private full-comment export. Bound the API policy/preflight/body to one cancellation-aware subdeadline before optional approved-browser continuation.
90
+
91
+ * Honor single-site Hacker News `after:`/`before:` UTC date bounds in the native search query and validate each story timestamp before limiting. Invalid/ambiguous intervals fail explicitly; undated generic/browser snippets cannot masquerade as date-compliant results.
92
+
93
+ ### Explicit native frame downloads
94
+
95
+ - Capture bounded HTTP attachments from an explicitly selected direct same-origin iframe, binding the native frame ID and validated redirect chain rather than URL/name similarity. Preserve frame provenance, exact bytes and private artifact receipts without changing shared download settings.
96
+ - Resolve observed links against the native document base and recheck participation/frame scope before publishing download bytes, including root downloads. Same-URL sibling responses, changed scope and late participation cannot publish an artifact.
97
+ - Resolve selected-frame native identity through an isolated-world marker, not page-controlled globals; keep the narrow Playwright CDP registration adapter separate and fail closed if unavailable.
98
+
99
+ ### English browser search continuation
100
+
101
+ - Allow Latin-topic queries, not only Hangul queries, to reach the existing approved local-browser search fallback. Keep site/path/quote, unsupported-operator and private/local-only constraints unchanged; browser index coverage remains limited.
102
+ - Reject ambiguous repeated search-query parameters and credentialed search-page URLs, and prevent late original-URL DNS validation from admitting out-of-budget evidence.
103
+
104
+ ### Explicit native frame screenshots
105
+
106
+ - Allow `smartbrowser` screenshot steps to select a supported direct same-origin frame. Capture the native iframe rectangle with CSS-pixel dimensions and scoped private artifact receipts; retain native rendering rather than creating a second renderer.
107
+ - Recheck participation and frame identity after screenshot readiness/capture and before writing bytes. Hidden, opaque, replaced, foreign and unsupported frames still fail closed; root screenshots receive the same post-capture participation guard.
108
+
109
+ ### Verified Coupang filtered recovery
110
+
111
+ - Require a positive integer KRW maximum for budget searches and validate hosted price/rocket evidence before applying the result limit. Unknown delivery remains unknown; invalid or out-of-filter candidates cannot silently satisfy the request.
112
+ - Recover failed or low-yield rocket/budget API calls through the approved owned browser and filter observed native cards by exact variant, current unconditioned item price and explicit ROCKET badge. Exclude hidden/ambiguous cards, conditional/per-unit prices and duplicate queries; retain API failure evidence, original deadlines and cooldown/network boundaries. This is bounded listing evidence, not full inventory, checkout totals or a membership offer guarantee.
113
+
114
+ ### Owned-target CDP attachment
115
+
116
+ - Avoid browser-wide attachment and execution-world initialization in unrelated existing tabs. Use Playwright's public CDP transport interface to attach only newly created task targets, keeping its page/frame/input semantics and shared authentication without changing browser defaults.
117
+ - Bound local endpoint discovery and late-target cleanup; retain original task deadlines. Real fresh-MCP regression checks zero new execution worlds in an unrelated sentinel; existing short-budget denial/login and implicit-attachment tests retain their original limits and assertions.
118
+
119
+ ### Bounded browser interruption diagnostics
120
+
121
+ - Attribute connected-browser timeouts/cancellation to a closed lifecycle phase without echoing raw Playwright URL, locator or input-value call logs in those messages. Preserve codes/categories, policy refusals, shared deadlines and owned-resource cleanup; no larger timeout or claim of faster CDP connection.
122
+ - Cover injected failures at every post-validation phase, pre-cancelled validation, deadline/late-resource cleanup and exact policy refusal controls. A fresh-MCP local fixture confirms an authorized fill followed by a timed-out wait exposes neither synthetic fill nor selector values.
123
+
124
+ ### Explicit same-origin frame keyboard input
125
+
126
+ - Allow native `press` with the existing explicit direct same-origin `frame` selector. Reuse current-document paint readiness and participation/scope checks; preserve the existing key-length bound and unsupported screenshot/download frame boundaries.
127
+ - Verify trusted initial Enter and same-frame navigation, selection-shortcut/Backspace changes, zero dispatch for opaque/hidden/participation frames, and native foreign-navigation refusal through local CDP/fresh-MCP fixtures.
128
+
129
+ ### Bounded native comment pages and private export
130
+
131
+ - Continue DCInside's verified native next-page controls in one approved owned browser task, with five-page, byte and shared-deadline limits. Reconcile cross-page and explicitly deleted parents without inventing readable deleted comments; failed/mismatched traversals stay partial.
132
+ - Add opt-in MCP `export_comments` for private pre-projection normalized JSON with path/count/hash/completeness receipts and finite byte/row caps. Inline clipping remains partial; export does not mask missing source evidence or expose raw DOM/session state.
133
+
134
+ ### Native browser input readiness
135
+
136
+ - Wait for the current top-level document's first paint before native fill/key/click/download-trigger input, then recheck participation. Empty fill includes a native Delete. Input-only pages can acknowledge an early key without delivering it; document readiness is not enough. Preserve the shared deadline, owned tab and native trusted events without sleeping, replaying actions or changing shared focus settings.
137
+ - Add fresh-MCP input-only and navigation regressions plus a delayed participation negative control. Frame-level keyboard actions and universal input delivery remain outside this change.
138
+
139
+ ### DCInside native sticker comments
140
+
141
+ - Preserve native `.comment_dccon` image/animated media-only comments and replies instead of requiring a text-only container. Keep observed media source URLs and parent identities; do not discard readable replies because their parent is a sticker.
142
+ - Exclude hidden/editor/toolbar content and handler-only URLs, and scope generic asset discovery to accepted body/comment evidence. Pagination, missing-parent replies and finite projected comment limits still remain incomplete rather than receiving a false all-comments claim.
143
+
144
+ ### Explicit same-origin frame actions
145
+
146
+ - Support bounded, explicit `frame` selectors for native click/fill/select/wait/scroll/upload batches. Return selected-frame identity/content/controls separately from parent evidence, without input values. Frame selection cannot silently switch to another frame or accept a URL-matching opaque sandbox origin.
147
+ - Recheck selected host visibility and effective parent access after readiness and before evidence; preserve participation, tab ownership and deadline guards. Native frame-src policy blocks foreign child navigation before transmission. Nested/cross-origin/opaque frames and frame-level keyboard/download/screenshot operations remain unsupported; this is not universal frame parity.
148
+
149
+ ### Naver Blog original bodies
150
+
151
+ - Read exact desktop Blog posts through their identity-preserving native mobile document in the selected browser session, rather than exhausting the budget on the desktop frame shell. Preserve the requested URL and observed acquisition URL separately; reject foreign post redirects and conflicting source identities.
152
+ - Extract nested article containers structurally and scope links/assets to sanitized body content. Missing, ambiguous, hidden or unavailable body shells remain incomplete; the first child or unrelated page chrome cannot establish a complete post. Body projection clipping revokes completeness instead of silently dropping the tail. This does not claim Blog comment retrieval.
153
+
154
+ ### Naver UGC discovery
155
+
156
+ - Recover original Blog/UGC result links from observed owned Naver search cards, retaining hard site scope and card/field-local title/snippet evidence. Exclude known inert/hidden/advertising markup rather than admitting arbitrary page headings.
157
+ - Require positive quoted phrases in a single discovery field and preserve model suffix boundaries when Naver silently relaxes the query. Unsupported compound/exclusion/date operators remain unverified instead of becoming false browser-search success; original-body/comment completeness is not implied.
158
+
159
+ ### Embedded participation safety
160
+
161
+ - Stop parent-page actions when a visible iframe (including bounded nested frames) contains a password, MFA, CAPTCHA or consent wall. Recheck after action readiness and preserve a typed user-participation error; hidden branches are excluded, while unreadable/excessive frame scope fails closed without exporting child DOM.
162
+ - Refuse direct iframe/frame host interactions rather than implicitly targeting embedded controls. The explicit same-origin frame action subset is described above; native iframe key delivery and cross-origin acquisition still need verification.
163
+
164
+ ### Coupang query fidelity
165
+
166
+ - Filter hosted multi-keyword/model candidates before applying the result limit. Nonempty but query-unverified API results now trigger the same single approved-browser continuation as transport failures; usable API candidates remain explicitly partial if recovery is unavailable.
167
+ - Share title-evidence checks between hosted and browser search, preserving Latin/numeric model boundaries (including one-digit variants) and Unicode width/case equivalence without changing the submitted query or product identifiers. Broad one-word API category searches still rely on upstream semantics; this is not a general semantic relevance or accessory classifier.
168
+
169
+ ### Operator semantic canary
170
+
171
+ - Add a one-shot installed-MCP probe for allowlisted community post/comment tasks with a positive control, exact identity/content/coverage checks, time-separated confirmation, private state and an exclusive host lock. Optional GitHub incident publication deduplicates through authoritative pagination and verifies writes without publishing private source data.
172
+ - Keep upstream outages, cooldowns and human-required states separate from semantic repair candidates. No scheduler, repair worker, automatic incident closure or full maintenance-loop guarantee is introduced.
173
+
174
+ ### Retrieval deadline propagation
175
+
176
+ - Keep one original budget between smartfetch acquisition stages instead of resetting it for browser continuation. Approved-CDP direct reads reserve 60% for recovery; native/Impit preflight, redirects and body reads share the direct slice and receive cancellation. Late evidence cannot become a complete result, and exhausted tasks do not start the next stage.
177
+ - Preserve observed cooldowns even when response cleanup stalls, and prevent cancelled redirect resolution from starting fresh DNS checks. Nested provider-internal cancellation and named-profile browser lifecycle remain separate limits, not a universal hard-deadline claim.
178
+
179
+ ### Community evidence
180
+
181
+ - Extract native Clien desktop post bodies and readable comments, with source IDs, reply status, attachment URLs and separate deleted-row positions. Reconcile displayed counts without counting deletion placeholders as readable answers; preserve unknown parents rather than infer them from mentions. Empty lists can continue once through the selected approved CDP session within the original deadline.
182
+ - Extract scoped Ppomppu desktop post/comment evidence, including nested replies, instead of generic article text with an empty comment array. Missing native rows trigger one same-session, remaining-deadline CDP continuation; duplicate PHP identity parameters and conflicting native rows cannot become complete evidence.
183
+ - Reconcile native post-header counts with the dynamic DCInside list: its initial zero/absent total cannot establish an empty complete thread while the header declares comments. Automatically recover within the same remaining CDP budget, or remain partial on disagreement/expiry.
184
+ - Scope DCInside post bodies to native content instead of capturing intervening page scripts/chrome. Extract verified native comments, parent/reply relationships, timestamps and media while rejecting bot/unbound/foreign rows and conflicting evidence.
185
+ - Reuse the selected approved CDP session once for initially empty dynamic comments, retaining the original deadline and post identity. Keep paginated/unknown/incomplete comments partial; do not switch named profiles to an anonymous backend.
186
+ - Distinguish collected and actually returned comment coverage after output budgeting. Truncated rows/text cannot retain a complete claim, even after reprojection. See [community evidence](docs/community-evidence.md) for current limits.
187
+
188
+ ### Legacy contract removal
189
+
190
+ - Removed `planWebTaskFromSmartfetch`, `planWebTaskFromSmartcrawl`, `WebTaskRequestPlan`, and `web_task` handoff output. Consumers use the existing owned-browser acquisition/action contracts, not legacy task dispatch; search-to-crawl planning remains.
191
+ - Incomplete retrieval exposes bounded `assessment.continuation` states without claiming execution. Observed login/CAPTCHA participation survives browser error normalization; generic denial is not a login request and generic CAPTCHA text does not invent a vendor. No automated CAPTCHA solver plan is emitted.
192
+ - This is a library/output contract change, not completed browser capability parity or a service shutdown. Frames and cross-call tab state remain open.
193
+
194
+ ### Browser actions
195
+
196
+ - Added bounded explicit-byte uploads and request-bound HTTP attachment capture to `smartbrowser`, without local-file reads or shared download-setting changes. Streams are capped, partial/misattributed attachments fail, filenames cannot choose paths, and signed query values are omitted from receipts.
197
+ - Added `smartbrowser`: bounded input, click, select, keypress, wait, scroll and screenshot batches in an owned tab of the approved local CDP browser. Returns observed controls, final page evidence and private screenshot artifacts; keeps existing cookies without exporting them. Frames and cross-call tab state remain unsupported.
198
+ - Bound operator connection/setup/extraction and cleanup, propagate MCP cancellation, and prohibit unguarded popup/download/other-tab action navigation through a task-local native document sandbox. Recheck user-participation walls after control readiness. This advances, but does not complete, legacy web-task-api retirement.
199
+
200
+ ### Search discovery quality
201
+
202
+ - Exclude known outbound tracking relays from original-result candidates without navigating or promoting their encoded targets. Preserve meaningful query parameters on actual originals.
203
+ - Continue low-yield simple Korean discovery within the remaining search budget, retain uncertain originals on recovery failure, rank topic-bearing titles/snippets before clipping, and keep weak evidence confidence low. This is a metadata yield signal, not proof of body relevance.
204
+ - Parse DuckDuckGo nested result cards structurally and keep snippets owned by their exact card/link; exclude ads, hidden/template content, and wrapped/nested cross-link snippet contamination.
205
+
206
+ ### Request isolation
207
+
208
+ - Removed URL-only `smartfetch` inflight sharing: concurrent tasks now keep their own acquisition/runtime/selector/timeout options, output budgets and mutable results. Identical reads may do independent I/O; this does not yet make the entire fallback chain share one deadline.
209
+
210
+ ### Documentation
211
+
212
+ - Reworked README and agent instructions around operator-first task completion, browser-use migration, real-workflow search quality, and bounded drift repair; moved setup/verification detail into linked guides and marked earlier handoff-only designs historical. This documentation change does not claim those migration goals are already implemented.
8
213
 
9
214
  ### Added
10
215
 
216
+ - Failed Korean search can continue in the approved local browser on Naver and return organic original links without a tool-switch handoff. Single-site host/path filtering rejects off-scope hits before selection, while grouped multi-site queries keep their original engine semantics. Private modes, changed queries, challenges, recommendation-only pages, and unsafe originals remain fail-closed.
217
+ - Coupang keyword API errors/timeouts/malformed payloads now continue through an explicitly configured local browser, preserving exact rendered product links and failure provenance; true empty API results, backoff, unsafe redirects, and unimplemented filter recovery stay distinct.
218
+ - Configured operator-browser reads now automatically continue after direct HTTP 403/5xx or transport failures, preserving failed-attempt evidence. Direct 429/Retry-After responses and unsafe redirects do not trigger browser or acquisition-relay retries. Successful direct reads remain direct.
219
+ - Added opt-in `fetch.browserCdpUrl` for single-page `smartfetch` reads through an approved local browser-use/CDP session. Each request owns its tab, waits for rendered content, validates navigation requests including redirect hops, and disconnects without closing the shared browser. No anonymous HTTP preflight is required for this lane.
220
+ - Coupang browser reads now preserve product/variant identifiers, rendered specifications and coupon conditions. Search cards exclude crossed-out list prices; denied/loading shells and redirected product variants remain unverified rather than becoming successful product results.
11
221
  - Expanded `algumon_deal` coverage to Algumon comment/review pages, stable review-to-deal links, and the public rank/theme/most-bought/Sheet routes used in Korean shopping research.
12
222
  - Added compact/balanced/full MCP budget controls for `smartvertical`, including structured `result` projection and rendered text caps so Korean/local vertical calls stay token-bounded after the single-tool collapse.
13
223
  - Added `smartvertical`, a single Korean/local structured-data MCP router for places, weather, transit, finance, DART, real estate, safety, news, commerce, spellcheck, zipcode, law, public restrooms, and GeekNews domains.
@@ -89,6 +299,7 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
89
299
 
90
300
  ### Changed
91
301
 
302
+ - npm releases now use GitHub Actions OIDC trusted publishing on a GitHub-hosted runner, and the release workflow can safely recover an existing immutable tag from the current default-branch workflow without long-lived npm credentials.
92
303
  - Tightened the `smartfetch` balanced and full projection presets so representative long-document/thread payloads stay near the `preferred_budget_chars` widths that select them instead of expanding to roughly 160k/645k serialized characters.
93
304
  - Collapsed the public MCP surface for Korean/local helpers from individual `kr_*` tools into `smartvertical` domains while keeping provider adapters modular internally.
94
305
  - CI pull request verification now stays on GitHub-hosted runners while trusted push/release events can still use the configured runner pool.
@@ -119,6 +330,17 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
119
330
 
120
331
  ### Fixed
121
332
 
333
+ - Brave HTML search now pairs titles and snippets with their own result anchors instead of crossing navigation links or cards. Declared sponsored and hidden cards are excluded. Exact npm-package metadata no longer silently discards the remaining query; GitHub wiki/issues/discussions scopes skip the unrelated repository-tree lane and continue with the original full query.
334
+ - `smartvertical` now rejects unsupported explicit actions on GeekNews, stock, DART, real-estate, food-safety, Coupang, and law routes before provider I/O instead of silently running a different operation. MCP errors list supported actions without echoing unbounded input; omitted defaults and valid actions are unchanged.
335
+ - `smartvertical` now omits oversized structured object keys at compact/balanced/full limits of 120/240/480 UTF-16 code units, preventing provider-controlled names from bypassing value budgets or ballooning `budget.fields` paths. Omission counts stay on the containing object; valid sibling identifiers remain unchanged.
336
+ - Shared text budgets now report exact omitted source characters (including marker reservation and trimmed whitespace), preserve valid Unicode surrogate pairs, and return source prefixes instead of broken markers when a complete truncation notice cannot fit. Truncated text metadata adds `omitted_chars`; preset selection and field caps are unchanged.
337
+ - Numeric host budget hints now treat `null` as absent rather than zero in the shared resolver, and all four MCP tools accept nullable `preferred_budget_chars` / `headroom_tokens`. Valid fallback hints and configured smartfetch caps are preserved; explicit zero and existing preset thresholds are unchanged.
338
+ - Release Please runs now fail with the stalled PR URL when a merged release remains labeled `autorelease: pending`, preventing failed tag publication from blocking later releases behind green no-op workflow runs.
339
+ - Provider benchmark live smokes now accept BOJ `partial_text_only` output only when it remains partial, preserves upstream errors, includes non-empty route evidence, and recommends a `web_task` handoff; error-free, non-partial, and complete-looking header-only shapes remain missing evidence.
340
+ - Jina Reader relay requests now identify as `smart-web-mcp` instead of impersonating Chrome, avoiding Cloudflare challenges that rejected the browser user agent while preserving the opt-in no-secret relay path.
341
+ - Reddit post retrieval now rejects RSS/Atom, Arctic Shift, and same-origin JSON records whose subreddit/permalink does not match the requested post route, preventing a valid global post ID from turning an unavailable URL into unrelated high-confidence content.
342
+ - Required `semver-guard` checks now run to completion for each PR event instead of cancelling one another during near-simultaneous Dependabot edit/rebase updates and leaving the latest head blocked.
343
+ - Provider benchmark live smokes now treat non-partial usable output recovered by a fallback as present evidence even when earlier failed attempts remain in `errors`, avoiding false critical provider gaps while retaining the error class for diagnostics.
122
344
  - `smartsearch` now carries structured provider execution status and per-attempt diagnostics independently from `engine` and `results`, so successful zero-match searches remain MCP/CLI successes while all-provider transport, HTTP, or parser failures return MCP errors and non-zero CLI exits without losing JSON diagnostics.
123
345
  - `smartfetch` MCP calls now honor the configured `fetch.outputBudget` preset and numeric caps instead of replacing them with the compact fallback; explicit per-call budget controls still take precedence.
124
346
  - `smartsearch` and `smartcrawl` summary budget projection now caps every normalized string field, including titles, URLs, page/discovery metadata, notes, errors, assessment signals, and handoff guidance, preventing non-snippet fields from bypassing compact/balanced/full output limits.
@@ -178,6 +400,134 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
178
400
  - Korean public API helpers now validate outbound URLs and redirects before fetching, blocking localhost, private, and reserved targets unless `network.allowPrivateHosts` is explicitly enabled.
179
401
  - CI now declares read-only default repository permissions, Dependabot auto-merge pins the reusable workflow without forwarding all caller secrets, and the workflow check enforces those guards.
180
402
 
403
+ ## [1.1.0](https://github.com/jojo-labs/smart-web/compare/v1.0.0...v1.1.0) (2026-10-03)
404
+
405
+
406
+ ### Features
407
+
408
+ * recover public GitHub issue body and comments ([#681](https://github.com/jojo-labs/smart-web/issues/681)) ([63998fa](https://github.com/jojo-labs/smart-web/commit/63998fa57e269b1badd56f00fd486a104ad75ef6))
409
+
410
+ ## [1.0.0](https://github.com/jojo-labs/smart-web/compare/v0.44.1...v1.0.0) (2026-10-03)
411
+
412
+
413
+ ### ⚠ BREAKING CHANGES
414
+
415
+ * retire legacy web-task request contracts ([#509](https://github.com/jojo-labs/smart-web/issues/509))
416
+
417
+ ### Features
418
+
419
+ * add bounded native comment pages and private export ([#530](https://github.com/jojo-labs/smart-web/issues/530)) ([ff9ddf0](https://github.com/jojo-labs/smart-web/commit/ff9ddf0a3bbd07f397da8abb071977d9318cfa4e))
420
+ * add bounded owned-browser file transfers ([#508](https://github.com/jojo-labs/smart-web/issues/508)) ([e7f63da](https://github.com/jojo-labs/smart-web/commit/e7f63da2eb3f8a9fd4d41992d7d05623be5ce860))
421
+ * add operator semantic canaries and incident dedup ([#515](https://github.com/jojo-labs/smart-web/issues/515)) ([2816570](https://github.com/jojo-labs/smart-web/commit/281657078b7abfad1cba1f793eec1355230be576))
422
+ * bind explicit frame downloads to native owner identity ([#547](https://github.com/jojo-labs/smart-web/issues/547)) ([9ad1d90](https://github.com/jojo-labs/smart-web/commit/9ad1d90d56e1c070809da55bfb9594761a2ef9c2))
423
+ * capture explicitly scoped native frame screenshots ([#541](https://github.com/jojo-labs/smart-web/issues/541)) ([4221eb5](https://github.com/jojo-labs/smart-web/commit/4221eb5bf0bd84b99f4847d2afb4b0de85322e3d))
424
+ * enable native keypress in explicit same-origin frames ([#532](https://github.com/jojo-labs/smart-web/issues/532)) ([f73b728](https://github.com/jojo-labs/smart-web/commit/f73b728a5a716ff34c82e5f55e276466eeac52f5))
425
+ * execute bounded approved-browser action batches ([#507](https://github.com/jojo-labs/smart-web/issues/507)) ([4b5fea2](https://github.com/jojo-labs/smart-web/commit/4b5fea23fa0fc8c8f37f37522310a5ac80cfa52f))
426
+ * export normalized long article bodies privately ([#612](https://github.com/jojo-labs/smart-web/issues/612)) ([bb780ba](https://github.com/jojo-labs/smart-web/commit/bb780bacbf22eccd0dd0305869abb859430758ec))
427
+ * expose bounded article body export in CLI ([#614](https://github.com/jojo-labs/smart-web/issues/614)) ([193d856](https://github.com/jojo-labs/smart-web/commit/193d856488e0690362839e336ac7d15ba6966143))
428
+ * recover scoped YouTube discovery through native browser search ([#597](https://github.com/jojo-labs/smart-web/issues/597)) ([0bfbd88](https://github.com/jojo-labs/smart-web/commit/0bfbd88bf24f22aed5c5069b4fb937c723892341))
429
+ * recover storefront reads through approved local CDP ([#497](https://github.com/jojo-labs/smart-web/issues/497)) ([9084b36](https://github.com/jojo-labs/smart-web/commit/9084b36e1044b89e773ef71319f75ca140d09ebb))
430
+ * retire legacy web-task request contracts ([#509](https://github.com/jojo-labs/smart-web/issues/509)) ([a23d4ca](https://github.com/jojo-labs/smart-web/commit/a23d4ca012af49990fbdb15bc7f0bd2bfbb4b208))
431
+ * support explicit same-origin frame action scopes ([#523](https://github.com/jojo-labs/smart-web/issues/523)) ([d6ee274](https://github.com/jojo-labs/smart-web/commit/d6ee274d27ca72c3b84aa9a481a6247c9cb69672))
432
+
433
+
434
+ ### Bug Fixes
435
+
436
+ * accept honest BOJ partial benchmark evidence ([#477](https://github.com/jojo-labs/smart-web/issues/477)) ([61888ff](https://github.com/jojo-labs/smart-web/commit/61888ff460b477e6d3314152079b5130a8344c2b))
437
+ * accept recovered provider benchmark evidence ([#464](https://github.com/jojo-labs/smart-web/issues/464)) ([45af6f0](https://github.com/jojo-labs/smart-web/commit/45af6f05b6b67928bcd19ba6ab89c829da8aa47f))
438
+ * align browser action release metadata ([#569](https://github.com/jojo-labs/smart-web/issues/569)) ([7917fa0](https://github.com/jojo-labs/smart-web/commit/7917fa0ffa3f12ca313bed23938961c836bc92a4))
439
+ * bind release recovery PR transition to tag commit ([#595](https://github.com/jojo-labs/smart-web/issues/595)) ([81ed921](https://github.com/jojo-labs/smart-web/commit/81ed921e9eb4e201c50b17045293f1a6b2bdaed6))
440
+ * bind rendered Coupang ordinary product price ([#661](https://github.com/jojo-labs/smart-web/issues/661)) ([ca12cd8](https://github.com/jojo-labs/smart-web/commit/ca12cd84f2e7d08fcf92eeed4b8f73193bd755d4))
441
+ * bound browser interruption diagnostics by phase ([#534](https://github.com/jojo-labs/smart-web/issues/534)) ([3902027](https://github.com/jojo-labs/smart-web/commit/390202749499ad5ef24849f70a63622e6c7cfb33))
442
+ * bound smartvertical object keys ([#491](https://github.com/jojo-labs/smart-web/issues/491)) ([1dca82d](https://github.com/jojo-labs/smart-web/commit/1dca82d28e02728f34e8d2a5139af0d88c13b1c1))
443
+ * **ci:** migrate npm releases to trusted publishing ([#481](https://github.com/jojo-labs/smart-web/issues/481)) ([2a9697b](https://github.com/jojo-labs/smart-web/commit/2a9697bc6bbb84b0092446beb4494225809fe176))
444
+ * **ci:** prevent semver guard cancellations ([#469](https://github.com/jojo-labs/smart-web/issues/469)) ([8f724ff](https://github.com/jojo-labs/smart-web/commit/8f724ffae76de300b40605a9d548f249652f6822))
445
+ * **ci:** surface stalled release conveyor ([#480](https://github.com/jojo-labs/smart-web/issues/480)) ([8136978](https://github.com/jojo-labs/smart-web/commit/81369781a8f952a6aa33e207ea1e6c8531fca128))
446
+ * classify Brave challenge as failed discovery ([#588](https://github.com/jojo-labs/smart-web/issues/588)) ([c3b4182](https://github.com/jojo-labs/smart-web/commit/c3b41822e7a65e222b59feb7b0d246be47681e46))
447
+ * classify locked Blind reviews as partial previews ([#605](https://github.com/jojo-labs/smart-web/issues/605)) ([0b6b64f](https://github.com/jojo-labs/smart-web/commit/0b6b64fb3d19e36e8b3ae6f96711b9a66f25ccf7))
448
+ * continue English queries through bounded browser search ([#543](https://github.com/jojo-labs/smart-web/issues/543)) ([bc1da63](https://github.com/jojo-labs/smart-web/commit/bc1da6393738a0335547fa1c77ebedaee1008e88))
449
+ * continue failed direct reads in approved browser ([#500](https://github.com/jojo-labs/smart-web/issues/500)) ([e513fe0](https://github.com/jojo-labs/smart-web/commit/e513fe0c976c4841748908f39ffa8ffbb58d6dfc))
450
+ * continue failed Korean searches in approved browser ([#503](https://github.com/jojo-labs/smart-web/issues/503)) ([5de024b](https://github.com/jojo-labs/smart-web/commit/5de024b453f2007e942f046eee8db6ae7c44fe91))
451
+ * continue low-yield search with owned original evidence ([#506](https://github.com/jojo-labs/smart-web/issues/506)) ([c446c74](https://github.com/jojo-labs/smart-web/commit/c446c744303acb0e682eda984f843dbd801bd240))
452
+ * continue owned Ppomppu native comments ([#570](https://github.com/jojo-labs/smart-web/issues/570)) ([103b87f](https://github.com/jojo-labs/smart-web/commit/103b87f21acbb0e0784ddb92a136211e8c2e5b34))
453
+ * continue public Blind comment-more controls ([#665](https://github.com/jojo-labs/smart-web/issues/665)) ([2e7a295](https://github.com/jojo-labs/smart-web/commit/2e7a295b0c0a5855ea143324bb759797abb2c0fa))
454
+ * deduplicate Ppomppu direct outbound originals ([#602](https://github.com/jojo-labs/smart-web/issues/602)) ([4038cdd](https://github.com/jojo-labs/smart-web/commit/4038cdd1d7b94f4e744f35552ce0b10efb812e10))
455
+ * deliver complete small comment threads in full output ([#572](https://github.com/jojo-labs/smart-web/issues/572)) ([a5e097e](https://github.com/jojo-labs/smart-web/commit/a5e097eac44f6ad1afecd85d0cecd265587e5940))
456
+ * deliver full projected comments in smartfetch text ([#582](https://github.com/jojo-labs/smart-web/issues/582)) ([ae1356e](https://github.com/jojo-labs/smart-web/commit/ae1356ec1ba6271272266de9c2ea765fec5cc570))
457
+ * discover versioned PostgreSQL symbol documentation ([#632](https://github.com/jojo-labs/smart-web/issues/632)) ([5d44414](https://github.com/jojo-labs/smart-web/commit/5d444143e681ec00717573bbd51880c9473df8b7))
458
+ * enforce search CLI cap and stop locked review relays ([#618](https://github.com/jojo-labs/smart-web/issues/618)) ([fd67b5b](https://github.com/jojo-labs/smart-web/commit/fd67b5bdb14e153c83789e74b9863dfdceb73d83))
459
+ * exclude hidden generic article evidence ([#669](https://github.com/jojo-labs/smart-web/issues/669)) ([804804e](https://github.com/jojo-labs/smart-web/commit/804804e9aab7f254dd640ccd14fbfd516cc37939))
460
+ * exclude hidden Ppomppu article evidence ([#667](https://github.com/jojo-labs/smart-web/issues/667)) ([b79bbc8](https://github.com/jojo-labs/smart-web/commit/b79bbc87e9cdf8de45798a808537550e5d7522f1))
461
+ * exclude Ppomppu link preview thumbnails from article media ([#591](https://github.com/jojo-labs/smart-web/issues/591)) ([0ff5dbb](https://github.com/jojo-labs/smart-web/commit/0ff5dbb7d975d9d331916d694b01e8d402cb6733))
462
+ * follow owned Naver Cafe comment pagination ([#567](https://github.com/jojo-labs/smart-web/issues/567)) ([b9ad7fc](https://github.com/jojo-labs/smart-web/commit/b9ad7fc6da331a29b12dcfade70098443d544db5))
463
+ * follow verified Wikipedia article redirects ([#652](https://github.com/jojo-labs/smart-web/issues/652)) ([3517d0e](https://github.com/jojo-labs/smart-web/commit/3517d0efe47a0a626315f5ff64b7b0c96385e5bc))
464
+ * honor fetch CLI JSON format ([#616](https://github.com/jojo-labs/smart-web/issues/616)) ([3064ca9](https://github.com/jojo-labs/smart-web/commit/3064ca92cb521f73454530394d2bd718902e101c))
465
+ * isolate concurrent smartfetch task intent ([#505](https://github.com/jojo-labs/smart-web/issues/505)) ([b7fd41f](https://github.com/jojo-labs/smart-web/commit/b7fd41fd4684ada5c8f434a73a85e4f286be4859))
466
+ * isolate operator CDP attachment to task-owned targets ([#537](https://github.com/jojo-labs/smart-web/issues/537)) ([2b273aa](https://github.com/jojo-labs/smart-web/commit/2b273aa04356f9f8a00154bb006c910d906a00a0))
467
+ * **jina:** use honest relay user agent ([#475](https://github.com/jojo-labs/smart-web/issues/475)) ([565b4fe](https://github.com/jojo-labs/smart-web/commit/565b4fe5f2fff75da731ee5ad19a469c9aa20be1))
468
+ * keep archived media downloads free of Wayback chrome ([#610](https://github.com/jojo-labs/smart-web/issues/610)) ([3fc74e1](https://github.com/jojo-labs/smart-web/commit/3fc74e156acdc2a6db53b71ae7a712bdf24e58d7))
469
+ * keep authored generic articles out of paper fallback ([#673](https://github.com/jojo-labs/smart-web/issues/673)) ([dcd3a1c](https://github.com/jojo-labs/smart-web/commit/dcd3a1c67eb237cbbdc5d05ea6af8e9283e69798))
470
+ * mark clipped article body delivery partial ([#609](https://github.com/jojo-labs/smart-web/issues/609)) ([ab8208e](https://github.com/jojo-labs/smart-web/commit/ab8208e31b265c814abdcdb824f582ac97ee646a))
471
+ * mark unbound Coupang browser prices partial ([#659](https://github.com/jojo-labs/smart-web/issues/659)) ([cf58017](https://github.com/jojo-labs/smart-web/commit/cf5801737b0f3d0944206cfd776f3bcde07f3608))
472
+ * omit Ppomppu expand icon from article assets ([#590](https://github.com/jojo-labs/smart-web/issues/590)) ([55fbacb](https://github.com/jojo-labs/smart-web/commit/55fbacbea7573b73fcc0ec44439baef17a67e448))
473
+ * omit truncated search result URLs ([#574](https://github.com/jojo-labs/smart-web/issues/574)) ([f0c56c9](https://github.com/jojo-labs/smart-web/commit/f0c56c9ca0fe93253304656769c63f80593a682f))
474
+ * prefer original GitHub wiki articles in scoped search ([#586](https://github.com/jojo-labs/smart-web/issues/586)) ([c484a1d](https://github.com/jojo-labs/smart-web/commit/c484a1dab531fc9b72ad4d677a462098fe364863))
475
+ * preserve code syntax in generic HTML originals ([#671](https://github.com/jojo-labs/smart-web/issues/671)) ([71dc4b5](https://github.com/jojo-labs/smart-web/commit/71dc4b5d7b0282a137bf90ed7b30ac563df683f4))
476
+ * preserve guarded browser HTTP response status ([#554](https://github.com/jojo-labs/smart-web/issues/554)) ([ee606ff](https://github.com/jojo-labs/smart-web/commit/ee606ff33405ff521e6ee8f24d9fe83595ef32a3))
477
+ * preserve guarded native navigation replacements ([#565](https://github.com/jojo-labs/smart-web/issues/565)) ([290dbb6](https://github.com/jojo-labs/smart-web/commit/290dbb677f84c4885e19b41b5f3f1694b11f101e))
478
+ * preserve HN date constraints through native and fallback search ([#549](https://github.com/jojo-labs/smart-web/issues/549)) ([4501671](https://github.com/jojo-labs/smart-web/commit/4501671782fe82b0721b2ec049b47869b9550c6a))
479
+ * preserve native DCInside sticker comments ([#525](https://github.com/jojo-labs/smart-web/issues/525)) ([1a1f543](https://github.com/jojo-labs/smart-web/commit/1a1f543805bc0857577fc7a20c6e0daeaa7ffd63))
480
+ * preserve native Naver article identity through aliases ([#560](https://github.com/jojo-labs/smart-web/issues/560)) ([b42f2c4](https://github.com/jojo-labs/smart-web/commit/b42f2c4d5d66a7a5486e48dac151aac1ff456c48))
481
+ * preserve outcomes after owned request cancellation ([#563](https://github.com/jojo-labs/smart-web/issues/563)) ([f9c013f](https://github.com/jojo-labs/smart-web/commit/f9c013f0b751baa26f690f8f095a71b9f077a534))
482
+ * preserve PostgreSQL command reference syntax ([#637](https://github.com/jojo-labs/smart-web/issues/637)) ([0dd08d1](https://github.com/jojo-labs/smart-web/commit/0dd08d1a022df23231504f24ce3ec7cf55776f6f))
483
+ * preserve quoted MDN discovery intent ([#593](https://github.com/jojo-labs/smart-web/issues/593)) ([1c0b6b9](https://github.com/jojo-labs/smart-web/commit/1c0b6b9037de7a6041e02ada58be9d3baa115f18))
484
+ * preserve search result ownership and scoped query intent ([#504](https://github.com/jojo-labs/smart-web/issues/504)) ([2c5c67c](https://github.com/jojo-labs/smart-web/commit/2c5c67cdb5af186c1d7afe159394272a5a488420))
485
+ * preserve site query parameters in search originals ([#622](https://github.com/jojo-labs/smart-web/issues/622)) ([6dd063a](https://github.com/jojo-labs/smart-web/commit/6dd063a6778ab8f1261f8c2e986eebed06911006))
486
+ * prioritize approved browser for weak NamuWiki originals ([#654](https://github.com/jojo-labs/smart-web/issues/654)) ([409f930](https://github.com/jojo-labs/smart-web/commit/409f930d36db22e8155f39226b0beb040b6862ba))
487
+ * prioritize topical Korean Wikipedia search results ([#630](https://github.com/jojo-labs/smart-web/issues/630)) ([be0adbd](https://github.com/jojo-labs/smart-web/commit/be0adbdc20cd80a406d34db355682f14f831c8ab))
488
+ * rank Naver Cafe article originals ahead of menu ties ([#641](https://github.com/jojo-labs/smart-web/issues/641)) ([db32e0b](https://github.com/jojo-labs/smart-web/commit/db32e0b0540fd272143cac9e8c51789c811d5272))
489
+ * read exact Wikipedia article sections ([#657](https://github.com/jojo-labs/smart-web/issues/657)) ([a104a55](https://github.com/jojo-labs/smart-web/commit/a104a55842da3dfa17bc4aaa04ae3e59d3a78446))
490
+ * recover complete Naver Blog original bodies ([#521](https://github.com/jojo-labs/smart-web/issues/521)) ([d0c9cdd](https://github.com/jojo-labs/smart-web/commit/d0c9cdddec153ad38fc78a4ea2d12edc20c065b5))
491
+ * recover exact Naver Cafe articles and native comments ([#558](https://github.com/jojo-labs/smart-web/issues/558)) ([f14d4e2](https://github.com/jojo-labs/smart-web/commit/f14d4e295994b8d10edef490f4aac7488975715c))
492
+ * recover failed Coupang keyword API through local browser ([#502](https://github.com/jojo-labs/smart-web/issues/502)) ([ed851bd](https://github.com/jojo-labs/smart-web/commit/ed851bd527a25f04889600e1056b0c4044a4767d))
493
+ * recover HN originals and comment evidence after API failures ([#551](https://github.com/jojo-labs/smart-web/issues/551)) ([099c456](https://github.com/jojo-labs/smart-web/commit/099c456075ed813062fa25fc0d78e10dd55f22b3))
494
+ * recover owned Naver UGC search evidence ([#519](https://github.com/jojo-labs/smart-web/issues/519)) ([52925d1](https://github.com/jojo-labs/smart-web/commit/52925d1411d8a232365949ad297030182e82c137))
495
+ * recover path-scoped Korean community discovery ([#620](https://github.com/jojo-labs/smart-web/issues/620)) ([4683d44](https://github.com/jojo-labs/smart-web/commit/4683d44390f95135633b4ed967654a87c0c70cf2))
496
+ * recover Python documentation through native browser search ([#556](https://github.com/jojo-labs/smart-web/issues/556)) ([f6aab3c](https://github.com/jojo-labs/smart-web/commit/f6aab3c28342f60058109fc8f7371d0a313a32c4))
497
+ * recover query-unverified Coupang search candidates ([#517](https://github.com/jojo-labs/smart-web/issues/517)) ([fa2c604](https://github.com/jojo-labs/smart-web/commit/fa2c6046ede89687c609a18be7ba7b539ea888ed))
498
+ * recover quoted exact npm package discovery ([#643](https://github.com/jojo-labs/smart-web/issues/643)) ([72b7a59](https://github.com/jojo-labs/smart-web/commit/72b7a5905374a464deadb6a8713916510b7585d3))
499
+ * recover scoped Clien post and comment evidence ([#513](https://github.com/jojo-labs/smart-web/issues/513)) ([6dd7bbc](https://github.com/jojo-labs/smart-web/commit/6dd7bbc557adc8d3506d4d070538c442eacea63c))
500
+ * recover scoped DCInside post and comment evidence ([#510](https://github.com/jojo-labs/smart-web/issues/510)) ([86620a0](https://github.com/jojo-labs/smart-web/commit/86620a0d0516882ff5820aab335c27b0068dd84c))
501
+ * recover scoped Ppomppu comments through approved browser ([#512](https://github.com/jojo-labs/smart-web/issues/512)) ([4309215](https://github.com/jojo-labs/smart-web/commit/4309215e66ce73ef642d00294e37dbcb7adb3f56))
502
+ * recover unscoped Python documentation through native search ([#628](https://github.com/jojo-labs/smart-web/issues/628)) ([fb3236c](https://github.com/jojo-labs/smart-web/commit/fb3236c793eb5f0489bbac64b807a12fabd838a0))
503
+ * recover Wikipedia article body from native API ([#647](https://github.com/jojo-labs/smart-web/issues/647)) ([6f57568](https://github.com/jojo-labs/smart-web/commit/6f57568a087237f75db1a1ee6877bbd6cb68bc90))
504
+ * **reddit:** validate fallback post identity ([#473](https://github.com/jojo-labs/smart-web/issues/473)) ([1eeacca](https://github.com/jojo-labs/smart-web/commit/1eeaccaa2a761170b50840bcb1d86403196674ae))
505
+ * reject archive capture lists as original articles ([#655](https://github.com/jojo-labs/smart-web/issues/655)) ([6b8e608](https://github.com/jojo-labs/smart-web/commit/6b8e6089ac9b1345e1f6a284052cb5a8a6f551bf))
506
+ * reject invalid CLI output budgets before retrieval ([#626](https://github.com/jojo-labs/smart-web/issues/626)) ([9503e2e](https://github.com/jojo-labs/smart-web/commit/9503e2e9ca39ed95931bf0e3bc2ddd522ec38570))
507
+ * reject malformed crates search envelope ([#580](https://github.com/jojo-labs/smart-web/issues/580)) ([47e8757](https://github.com/jojo-labs/smart-web/commit/47e87575d6f0af839af8ec59237f69626488394f))
508
+ * reject malformed native search envelopes ([#578](https://github.com/jojo-labs/smart-web/issues/578)) ([ec1fbc1](https://github.com/jojo-labs/smart-web/commit/ec1fbc13c49f529d1efa068d08ba8f634e2c1fb3))
509
+ * reject malformed SearXNG search envelopes ([#645](https://github.com/jojo-labs/smart-web/issues/645)) ([18dd225](https://github.com/jojo-labs/smart-web/commit/18dd225fc2b873585fb6557155bd69a5c9e20187))
510
+ * reject mismatched npm package metadata ([#576](https://github.com/jojo-labs/smart-web/issues/576)) ([37ae932](https://github.com/jojo-labs/smart-web/commit/37ae932f191946e8adb3fd24b2c630fbc891c26d))
511
+ * reject missing-page reader relay as recovered content ([#624](https://github.com/jojo-labs/smart-web/issues/624)) ([b98a093](https://github.com/jojo-labs/smart-web/commit/b98a09356c5a09ed6aff5b508354e035940379ce))
512
+ * reject unsupported CLI options before retrieval ([#607](https://github.com/jojo-labs/smart-web/issues/607)) ([da9b83a](https://github.com/jojo-labs/smart-web/commit/da9b83a6ccd34917bb13af48444c04a279e65d80))
513
+ * reject unsupported smartvertical actions ([#493](https://github.com/jojo-labs/smart-web/issues/493)) ([091f697](https://github.com/jojo-labs/smart-web/commit/091f69764f1f4d9dbef3af521bbade963b88c8ed))
514
+ * reject Wikipedia relay navigation on native outage ([#649](https://github.com/jojo-labs/smart-web/issues/649)) ([b73e773](https://github.com/jojo-labs/smart-web/commit/b73e7732fd48619e3876fc976204e9da63f7d867))
515
+ * report truthful budget text truncation ([#488](https://github.com/jojo-labs/smart-web/issues/488)) ([95c2344](https://github.com/jojo-labs/smart-web/commit/95c234469c3f14badd19dd6152db942d6199f174))
516
+ * require positive evidence in native YouTube search titles ([#598](https://github.com/jojo-labs/smart-web/issues/598)) ([f939144](https://github.com/jojo-labs/smart-web/commit/f9391445d537862adfc744a01ce9035533739caf))
517
+ * reserve and propagate fetch acquisition deadlines ([#514](https://github.com/jojo-labs/smart-web/issues/514)) ([fdf092b](https://github.com/jojo-labs/smart-web/commit/fdf092b8b0dc4112a3dcbf24b0a8cceba0538136))
518
+ * resolve Node 24 filesystem symbols to scoped originals ([#639](https://github.com/jojo-labs/smart-web/issues/639)) ([e679f04](https://github.com/jojo-labs/smart-web/commit/e679f04b7395532c581ab2ce826fa684e71d9ca4))
519
+ * restore original links from Wayback-backed article reads ([#608](https://github.com/jojo-labs/smart-web/issues/608)) ([550577b](https://github.com/jojo-labs/smart-web/commit/550577b267ccbe305241adcf075ebc2160528549))
520
+ * retain complete PostgreSQL reference body before projection ([#635](https://github.com/jojo-labs/smart-web/issues/635)) ([8c520b7](https://github.com/jojo-labs/smart-web/commit/8c520b737731ef99562fbe37f29ad2c95369e86a))
521
+ * scope generic HTML section fragment originals ([#675](https://github.com/jojo-labs/smart-web/issues/675)) ([2436b09](https://github.com/jojo-labs/smart-web/commit/2436b095c3f97ff1078943b03462c23306711ea3))
522
+ * scope Ppomppu assets to post and comments ([#584](https://github.com/jojo-labs/smart-web/issues/584)) ([b7fa13d](https://github.com/jojo-labs/smart-web/commit/b7fa13df0830f06751704039bb00a24f6859e293))
523
+ * scope public Blind discussion evidence ([#663](https://github.com/jojo-labs/smart-web/issues/663)) ([6e49ef8](https://github.com/jojo-labs/smart-web/commit/6e49ef8209db578097ead6241f20e27500d5dce9))
524
+ * stop parent actions at embedded participation walls ([#518](https://github.com/jojo-labs/smart-web/issues/518)) ([3963ae5](https://github.com/jojo-labs/smart-web/commit/3963ae5bdf7b81c300cbfc69e5c0cbffd1f6b336))
525
+ * treat null host budget hints as absent ([#484](https://github.com/jojo-labs/smart-web/issues/484)) ([4d4c42d](https://github.com/jojo-labs/smart-web/commit/4d4c42d268b129bf350dda589b69db418ce67e59))
526
+ * verify Coupang rocket and budget browser recovery ([#539](https://github.com/jojo-labs/smart-web/issues/539)) ([27d4d25](https://github.com/jojo-labs/smart-web/commit/27d4d25eeeffcc6bca2242395ea044ea3ef0e0fd))
527
+ * verify quote-only scoped search against original body ([#677](https://github.com/jojo-labs/smart-web/issues/677)) ([6847c82](https://github.com/jojo-labs/smart-web/commit/6847c82d84c8707b09e0363da2b5e336da1d5062))
528
+ * wait for document paint before native browser input ([#528](https://github.com/jojo-labs/smart-web/issues/528)) ([38d7250](https://github.com/jojo-labs/smart-web/commit/38d7250f6ca730261c2de664465a0f1774030a44))
529
+ * wait past initial zero DCInside comment counts ([#511](https://github.com/jojo-labs/smart-web/issues/511)) ([34ca417](https://github.com/jojo-labs/smart-web/commit/34ca4174dcc0585e005b6bfe7ae72fe457e2994c))
530
+
181
531
  ## [0.44.1](https://github.com/jojo-labs/smart-web/compare/v0.44.0...v0.44.1) (2026-08-28)
182
532
 
183
533