smart-web-mcp 1.6.2 → 1.6.4

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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,8 @@ 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
+ * Recover source-bound public GitHub organization discussion replies from the rendered discussion when `include_comments` is requested. The generic direct→one approved-browser continuation now distinguishes an exact thread's top-level comments, nested replies, and count; a deleted/unreadable reply remains partial rather than inventing its text. This covers the measured public HTML shape, not private discussions or pagination.
9
+ * Keep generic discussion reads partial when a reply points to a missing parent, itself, or a cyclic parent chain, even if the displayed comment count matches. A direct orphan may continue once in the approved browser; only source-bound corrected thread evidence completes the read.
8
10
  * Recover public GitHub pull-request body, top-level conversation comments and bounded inline review threads through exact-identity issue/pull APIs. Parent-linked review replies and verified file paths stay separate from top-level comments; missing/foreign rows or unverifiable counts remain partial. At most five review pages are read; private and larger threads are not claimed complete.
9
11
  * Treat short rendered 404 discussion shells as missing originals rather than complete article bodies, even when navigation chrome hides the error in a generic title. A substantive article quoting an error message remains readable; this does not recover deleted posts.
10
12
  * Preserve readable direct article and bound comment evidence when a requested-comment browser continuation returns a same-URL loading shell, lower conflicting count, or drops existing comment IDs. The attempted browser remains visible in provenance and missing comments stay partial; this does not claim live browser recovery for sites that block both routes.
@@ -414,6 +416,20 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
414
416
  - Korean public API helpers now validate outbound URLs and redirects before fetching, blocking localhost, private, and reserved targets unless `network.allowPrivateHosts` is explicitly enabled.
415
417
  - 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.
416
418
 
419
+ ## [1.6.4](https://github.com/jojo-labs/smart-web/compare/v1.6.3...v1.6.4) (2026-10-03)
420
+
421
+
422
+ ### Bug Fixes
423
+
424
+ * recover public discussion comments in approved browser ([#731](https://github.com/jojo-labs/smart-web/issues/731)) ([682cc61](https://github.com/jojo-labs/smart-web/commit/682cc618a8a842a51af76ac7c023f980a8c2950e))
425
+
426
+ ## [1.6.3](https://github.com/jojo-labs/smart-web/compare/v1.6.2...v1.6.3) (2026-10-03)
427
+
428
+
429
+ ### Bug Fixes
430
+
431
+ * reject broken generic discussion parent chains ([#728](https://github.com/jojo-labs/smart-web/issues/728)) ([5475738](https://github.com/jojo-labs/smart-web/commit/5475738e13281c18d143fc7799c0c3cc2362a4ae))
432
+
417
433
  ## [1.6.2](https://github.com/jojo-labs/smart-web/compare/v1.6.1...v1.6.2) (2026-10-03)
418
434
 
419
435
 
@@ -1,8 +1,76 @@
1
1
  import { parseHTML } from "linkedom";
2
2
  import { cleanDocumentHtml } from "../extraction/document.js";
3
3
  const normalize = (text) => text.replace(/\s+/g, " ").trim();
4
+ /** GitHub discussions expose public comment IDs in HTML, not the issue REST API. */
5
+ function githubDiscussion(html, url, method) {
6
+ let requested;
7
+ try {
8
+ requested = new URL(url);
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ const identity = /^\/orgs\/([A-Za-z0-9_.-]+)\/discussions\/([1-9]\d*)\/?$/.exec(requested.pathname);
14
+ if (requested.protocol !== "https:" || requested.hostname !== "github.com" || !identity || requested.search)
15
+ return null;
16
+ const { document } = parseHTML(cleanDocumentHtml(html, url, { removeBoilerplate: false }));
17
+ const root = document.querySelector(".discussion.js-discussion");
18
+ const count = root?.querySelector("#discussion-comment-count");
19
+ if (!root || !count)
20
+ return null;
21
+ const label = normalize(count.textContent || "");
22
+ const match = /(?:^|\b)(\d+)\s+comments?\s*[·•]?\s*(\d+)\s+repl(?:y|ies)\b/i.exec(label);
23
+ const declared = match ? Number(match[1]) + Number(match[2])
24
+ : /\b0\s+comments?\b/i.test(label) && !/\b\d+\s+repl(?:y|ies)\b/i.test(label) ? 0 : null;
25
+ const comments = [];
26
+ const ids = new Set();
27
+ let unbound = false;
28
+ for (const row of root.querySelectorAll("[id^='discussioncomment-']")) {
29
+ const id = row.getAttribute("id") || "";
30
+ if (!/^discussioncomment-[1-9]\d*$/.test(id))
31
+ continue;
32
+ const numeric = id.slice("discussioncomment-".length);
33
+ const ownerPath = row.getAttribute("data-url") || "";
34
+ const expected = `/${identity[1]}/`;
35
+ const suffix = `/discussions/${identity[2]}/comments/${numeric}`;
36
+ const owned = ownerPath.startsWith(expected) && ownerPath.endsWith(suffix)
37
+ && ownerPath.slice(expected.length, -suffix.length).match(/^[A-Za-z0-9_.-]+$/);
38
+ const body = Array.from(row.querySelectorAll(".comment-body"))
39
+ .find(element => element.closest("[id^='discussioncomment-']") === row);
40
+ const text = normalize(body?.textContent || "");
41
+ if (!owned || !text || ids.has(id)) {
42
+ unbound = true;
43
+ continue;
44
+ }
45
+ ids.add(id);
46
+ const parentContainer = row.closest("[id^='child-comments-discussioncomment-']");
47
+ const parent = parentContainer?.id.slice("child-comments-".length);
48
+ comments.push({ id, url: `${url.split("#")[0]}#${id}`, text,
49
+ ...(parent ? { parent_id: parent } : {}), source: method });
50
+ if (comments.length >= 500) {
51
+ unbound = true;
52
+ break;
53
+ }
54
+ }
55
+ for (const comment of comments) {
56
+ if (comment.parent_id && (comment.parent_id === comment.id || !ids.has(String(comment.parent_id)))) {
57
+ delete comment.parent_id;
58
+ unbound = true;
59
+ }
60
+ }
61
+ for (const row of root.querySelectorAll("[id^='discussioncomment-']")) {
62
+ if (/^discussioncomment-[1-9]\d*$/.test(row.id))
63
+ row.remove();
64
+ }
65
+ count.remove();
66
+ return { comments, coverage: { declared_count: declared, collected_count: comments.length,
67
+ complete: declared !== null && comments.length === declared && !unbound }, articleHtml: document.toString() };
68
+ }
4
69
  /** Read only identity-bearing rows inside a bound discussion region. Unknown is not zero. */
5
70
  export function extractGenericDiscussion(html, url, method) {
71
+ const github = githubDiscussion(html, url, method);
72
+ if (github)
73
+ return github;
6
74
  const { document } = parseHTML(cleanDocumentHtml(html, url, { removeBoilerplate: false }));
7
75
  const roots = Array.from(document.querySelectorAll("#comments, [id^='comments-'], #story_comments, [role='region'][aria-label*='comment' i]"));
8
76
  const root = roots.find(element => element.querySelector(".comment[id], [data-comment-id]")) || roots[0];
@@ -89,6 +157,31 @@ export function extractGenericDiscussion(html, url, method) {
89
157
  if (root.querySelector(".comment:not([id])"))
90
158
  unbound = true;
91
159
  }
160
+ // A declared count matching the row count does not establish a thread if
161
+ // a reply points outside the collected source-bound rows (or to itself).
162
+ for (const comment of comments) {
163
+ const parent = comment.parent_id;
164
+ if (typeof parent !== "string")
165
+ continue;
166
+ if (parent === comment.id || !ids.has(parent)) {
167
+ delete comment.parent_id;
168
+ unbound = true;
169
+ }
170
+ }
171
+ const byId = new Map(comments.map(comment => [comment.id, comment]));
172
+ for (const comment of comments) {
173
+ const visited = new Set([comment.id]);
174
+ let current = comment;
175
+ while (typeof current.parent_id === "string") {
176
+ if (visited.has(current.parent_id)) {
177
+ delete comment.parent_id;
178
+ unbound = true;
179
+ break;
180
+ }
181
+ visited.add(current.parent_id);
182
+ current = byId.get(current.parent_id) || current;
183
+ }
184
+ }
92
185
  const complete = declared !== null && comments.length === declared && !unbound;
93
186
  for (const element of roots)
94
187
  element.remove();
@@ -1 +1 @@
1
- {"version":3,"file":"generic-discussion.js","sourceRoot":"","sources":["../../src/smartfetch/generic-discussion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generic-discussion.js","sourceRoot":"","sources":["../../src/smartfetch/generic-discussion.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "smart-web-mcp",
3
3
  "mcpName": "io.github.jojo-labs/smart-web",
4
- "version": "1.6.2",
4
+ "version": "1.6.4",
5
5
  "packageManager": "npm@11.9.0",
6
6
  "description": "Local MCP for web search, direct-URL fetch, site crawling, docs export, and bounded smartbrowser local browser actions.",
7
7
  "homepage": "https://github.com/jojo-labs/smart-web",
@@ -67,7 +67,7 @@
67
67
  "dev:mcp": "node dist/dev.js",
68
68
  "dev:watch": "tsc -p tsconfig.json --watch --preserveWatchOutput",
69
69
  "typecheck": "tsc -p tsconfig.json --noEmit",
70
- "test": "node --import tsx --test src/generic-discussion.test.ts src/blind-post.test.ts src/cli-fetch-options.test.ts src/body-export.test.ts src/assessment.test.ts src/browser-session.test.ts src/shared.test.ts src/extraction.test.ts src/assets.test.ts src/dev-runtime.test.ts src/release-scripts.test.ts src/provider-benchmark-script.test.ts src/smartsearch-quality-benchmark-script.test.ts src/no-secret-surface-watchdog-script.test.ts src/partial-handoff-watchdog-script.test.ts src/render.test.ts src/providers.test.ts src/hackernews-recovery.test.ts src/smartcrawl.test.ts src/smartcrawl-export.test.ts src/provider-policy.test.ts src/archive-fallback.test.ts src/mcp.test.ts src/korea/korea.test.ts src/korea/coupang-recovery.test.ts src/search-browser.test.ts src/search-integrity.test.ts src/fetch-isolation.test.ts src/fetch-deadline.test.ts src/search-quality.test.ts src/smartbrowser.test.ts src/browser-participation.test.ts src/retirement.test.ts src/dcinside-comments.test.ts src/ppomppu-comments.test.ts src/clien-comments.test.ts src/naver-blog.test.ts src/naver-cafe.test.ts src/operator-canary.test.ts src/operator-canary-cli.test.ts src/operator-cdp.test.ts src/operator-cancellation.test.ts src/operator-restart.test.ts",
70
+ "test": "node --import tsx --test src/generic-discussion.test.ts src/github-discussion.test.ts src/blind-post.test.ts src/cli-fetch-options.test.ts src/body-export.test.ts src/assessment.test.ts src/browser-session.test.ts src/shared.test.ts src/extraction.test.ts src/assets.test.ts src/dev-runtime.test.ts src/release-scripts.test.ts src/provider-benchmark-script.test.ts src/smartsearch-quality-benchmark-script.test.ts src/no-secret-surface-watchdog-script.test.ts src/partial-handoff-watchdog-script.test.ts src/render.test.ts src/providers.test.ts src/hackernews-recovery.test.ts src/smartcrawl.test.ts src/smartcrawl-export.test.ts src/provider-policy.test.ts src/archive-fallback.test.ts src/mcp.test.ts src/korea/korea.test.ts src/korea/coupang-recovery.test.ts src/search-browser.test.ts src/search-integrity.test.ts src/fetch-isolation.test.ts src/fetch-deadline.test.ts src/search-quality.test.ts src/smartbrowser.test.ts src/browser-participation.test.ts src/retirement.test.ts src/dcinside-comments.test.ts src/ppomppu-comments.test.ts src/clien-comments.test.ts src/naver-blog.test.ts src/naver-cafe.test.ts src/operator-canary.test.ts src/operator-canary-cli.test.ts src/operator-cdp.test.ts src/operator-cancellation.test.ts src/operator-restart.test.ts",
71
71
  "test:e2e": "node --import tsx --test src/packaged-mcp.test.ts",
72
72
  "test:browser": "node --import tsx --test --test-concurrency=1 src/operator-browser.e2e.test.ts src/browser-actions.e2e.test.ts src/dcinside-pages.e2e.test.ts src/naver-cafe.e2e.test.ts src/operator-cancellation.e2e.test.ts",
73
73
  "test:file": "node --import tsx --test",