smart-web-mcp 0.44.0 → 1.0.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 (159) hide show
  1. package/CHANGELOG.md +352 -1
  2. package/README.md +33 -566
  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 +31 -12
  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 +39 -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 +47 -10
  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/hackernews-html.d.ts +21 -0
  101. package/dist/smartfetch/providers/hackernews-html.js +148 -0
  102. package/dist/smartfetch/providers/hackernews-html.js.map +1 -0
  103. package/dist/smartfetch/providers/hackernews.js +76 -14
  104. package/dist/smartfetch/providers/hackernews.js.map +1 -1
  105. package/dist/smartfetch/providers/index.js +7 -1
  106. package/dist/smartfetch/providers/index.js.map +1 -1
  107. package/dist/smartfetch/providers/linkedin.js +2 -1
  108. package/dist/smartfetch/providers/linkedin.js.map +1 -1
  109. package/dist/smartfetch/providers/naver-blog.d.ts +2 -0
  110. package/dist/smartfetch/providers/naver-blog.js +87 -45
  111. package/dist/smartfetch/providers/naver-blog.js.map +1 -1
  112. package/dist/smartfetch/providers/naver-cafe-native.d.ts +7 -0
  113. package/dist/smartfetch/providers/naver-cafe-native.js +188 -0
  114. package/dist/smartfetch/providers/naver-cafe-native.js.map +1 -0
  115. package/dist/smartfetch/providers/naver-cafe.js +165 -4
  116. package/dist/smartfetch/providers/naver-cafe.js.map +1 -1
  117. package/dist/smartfetch/providers/naver-map-search.js +1 -1
  118. package/dist/smartfetch/providers/naver-map-search.js.map +1 -1
  119. package/dist/smartfetch/providers/ppomppu.d.ts +2 -0
  120. package/dist/smartfetch/providers/ppomppu.js +289 -0
  121. package/dist/smartfetch/providers/ppomppu.js.map +1 -0
  122. package/dist/smartfetch/providers/reddit.js +24 -3
  123. package/dist/smartfetch/providers/reddit.js.map +1 -1
  124. package/dist/smartfetch/providers/threads.js +1 -1
  125. package/dist/smartfetch/providers/threads.js.map +1 -1
  126. package/dist/smartfetch/providers/wikipedia.js +138 -0
  127. package/dist/smartfetch/providers/wikipedia.js.map +1 -1
  128. package/dist/smartfetch.d.ts +11 -2
  129. package/dist/smartfetch.js +369 -78
  130. package/dist/smartfetch.js.map +1 -1
  131. package/dist/smartsearch-brave.d.ts +2 -0
  132. package/dist/smartsearch-brave.js +43 -0
  133. package/dist/smartsearch-brave.js.map +1 -0
  134. package/dist/smartsearch-browser.d.ts +5 -0
  135. package/dist/smartsearch-browser.js +116 -0
  136. package/dist/smartsearch-browser.js.map +1 -0
  137. package/dist/smartsearch-ddg.d.ts +2 -0
  138. package/dist/smartsearch-ddg.js +46 -0
  139. package/dist/smartsearch-ddg.js.map +1 -0
  140. package/dist/smartsearch-node.d.ts +6 -0
  141. package/dist/smartsearch-node.js +21 -0
  142. package/dist/smartsearch-node.js.map +1 -0
  143. package/dist/smartsearch-postgresql.d.ts +7 -0
  144. package/dist/smartsearch-postgresql.js +44 -0
  145. package/dist/smartsearch-postgresql.js.map +1 -0
  146. package/dist/smartsearch-python.d.ts +8 -0
  147. package/dist/smartsearch-python.js +87 -0
  148. package/dist/smartsearch-python.js.map +1 -0
  149. package/dist/smartsearch-quality.d.ts +6 -0
  150. package/dist/smartsearch-quality.js +47 -0
  151. package/dist/smartsearch-quality.js.map +1 -0
  152. package/dist/smartsearch-youtube.d.ts +7 -0
  153. package/dist/smartsearch-youtube.js +76 -0
  154. package/dist/smartsearch-youtube.js.map +1 -0
  155. package/dist/smartsearch.d.ts +3 -0
  156. package/dist/smartsearch.js +617 -132
  157. package/dist/smartsearch.js.map +1 -1
  158. package/package.json +8 -5
  159. package/python/requirements-undetected-chromedriver.txt +2 -2
@@ -0,0 +1,190 @@
1
+ import { execFile } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { access, lstat, mkdir, open, readFile, readdir, realpath, rename, unlink, writeFile } from "node:fs/promises";
4
+ import { constants } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { basename, delimiter, dirname, join, resolve } from "node:path";
7
+ import { pathToFileURL } from "node:url";
8
+ import { parseArgs, promisify } from "node:util";
9
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
11
+ import { CONTROL_PROBE, advanceObservation, evaluateProbe, incidentBody, incidentMarker, parseProbeConfig } from "./operator-canary.js";
12
+ const REPO = "jojo-labs/smart-web";
13
+ const execFileAsync = promisify(execFile);
14
+ const gh = async (args) => (await execFileAsync("gh", args, { timeout: 30000, maxBuffer: 16 * 1024 * 1024 })).stdout;
15
+ export async function withCanaryLock(directory, action) {
16
+ await mkdir(directory, { recursive: true, mode: 0o700 });
17
+ const info = await lstat(directory);
18
+ if (!info.isDirectory() || info.isSymbolicLink() || (info.mode & 0o077))
19
+ throw new Error("Canary directory must be private");
20
+ const path = join(directory, "canary.lock");
21
+ const handle = await open(path, "wx", 0o600);
22
+ try {
23
+ return await action();
24
+ }
25
+ finally {
26
+ await handle.close();
27
+ await unlink(path);
28
+ }
29
+ }
30
+ export async function publishIncident(adapter, state, run = gh) {
31
+ const body = incidentBody(adapter, state);
32
+ const marker = incidentMarker(adapter, state.reason);
33
+ // REST pagination avoids search-index lag after creation or a process crash.
34
+ const pages = JSON.parse(await run(["api", "--paginate", "--slurp", `repos/${REPO}/issues?state=all&per_page=100`]));
35
+ if (!Array.isArray(pages) || pages.some(p => !Array.isArray(p)))
36
+ throw new Error("Invalid issue inventory");
37
+ const matches = pages.flat().filter(issue => issue && !issue.pull_request && typeof issue.body === "string" && issue.body.split("\n")[0] === marker);
38
+ if (matches.length > 1)
39
+ throw new Error("Duplicate incident markers require reconciliation");
40
+ let number;
41
+ if (matches.length) {
42
+ const issue = matches[0];
43
+ number = issue.number;
44
+ if (!Number.isSafeInteger(number) || number < 1 || !["open", "closed"].includes(issue.state))
45
+ throw new Error("Invalid incident identity");
46
+ if (issue.state === "closed")
47
+ await run(["issue", "reopen", String(number), "--repo", REPO]);
48
+ }
49
+ else {
50
+ const url = (await run(["issue", "create", "--repo", REPO, "--title", `Operator canary: ${adapter} post/comments ${state.reason}`, "--body", body])).trim();
51
+ const match = /^https:\/\/github\.com\/jojo-labs\/smart-web\/issues\/([1-9]\d*)$/.exec(url);
52
+ if (!match)
53
+ throw new Error("Unverified incident creation");
54
+ number = Number(match[1]);
55
+ }
56
+ const verified = JSON.parse(await run(["api", `repos/${REPO}/issues/${number}`]));
57
+ if (verified.number !== number || verified.state !== "open" || verified.body !== (matches.length ? matches[0].body : body))
58
+ throw new Error("Incident readback mismatch");
59
+ return `https://github.com/${REPO}/issues/${number}`;
60
+ }
61
+ async function privateJson(path) {
62
+ const info = await lstat(path);
63
+ if (!info.isFile() || info.isSymbolicLink() || (info.mode & 0o077) || info.size > 1024 * 1024)
64
+ throw new Error("Expected a bounded private JSON file");
65
+ return JSON.parse(await readFile(path, "utf8"));
66
+ }
67
+ async function runtimeIdentity(binary) {
68
+ let executable = binary;
69
+ if (!binary.includes("/")) {
70
+ executable = "";
71
+ for (const path of (process.env.PATH || "").split(delimiter)) {
72
+ const candidate = join(path, binary);
73
+ try {
74
+ await access(candidate, constants.X_OK);
75
+ executable = candidate;
76
+ break;
77
+ }
78
+ catch { /* next PATH entry */ }
79
+ }
80
+ if (!executable)
81
+ throw new Error("MCP executable unavailable");
82
+ }
83
+ const entry = await realpath(executable);
84
+ const dist = dirname(entry);
85
+ const manifest = JSON.parse(await readFile(join(dirname(dist), "package.json"), "utf8"));
86
+ if (manifest.name !== "smart-web-mcp" || basename(dist) !== "dist" || basename(entry) !== "index.js")
87
+ throw new Error("Expected the built Smart Web MCP entry");
88
+ const hash = createHash("sha256");
89
+ async function walk(path, prefix = "") {
90
+ for (const item of (await readdir(path, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
91
+ if (item.isSymbolicLink())
92
+ throw new Error("Unexpected runtime symlink");
93
+ const name = prefix + item.name;
94
+ if (item.isDirectory())
95
+ await walk(join(path, item.name), name + "/");
96
+ else if (item.isFile() && item.name.endsWith(".js"))
97
+ hash.update(name + "\0").update(await readFile(join(path, item.name)));
98
+ }
99
+ }
100
+ await walk(dist);
101
+ return { command: process.execPath, args: [entry], digest: hash.digest("hex") };
102
+ }
103
+ export async function runCanary(args = process.argv.slice(2)) {
104
+ const { values } = parseArgs({ args, strict: true, options: { config: { type: "string" }, "state-dir": { type: "string" }, "mcp-bin": { type: "string" }, publish: { type: "boolean", default: false }, help: { type: "boolean", default: false } } });
105
+ if (values.help) {
106
+ console.log("node dist/operator-canary-cli.js --config PRIVATE_JSON [--mcp-bin smart-web-mcp] [--state-dir PRIVATE_DIR] [--publish]\nOne read-only MCP round. Publication requires two separated semantic failures and a working control. No scheduler, repair worker, notifications or automatic issue closure.");
107
+ return 0;
108
+ }
109
+ if (!values.config)
110
+ throw new Error("Private probe config required");
111
+ const probes = parseProbeConfig(await privateJson(resolve(values.config)));
112
+ const runtime = await runtimeIdentity(values["mcp-bin"] || "smart-web-mcp");
113
+ const extension = import.meta.url.endsWith(".ts") ? "ts" : "js";
114
+ const monitor = createHash("sha256").update(await readFile(new URL(import.meta.url))).update(await readFile(new URL(`./operator-canary.${extension}`, import.meta.url))).digest("hex");
115
+ const directory = resolve(values["state-dir"] || join(homedir(), ".local/state/smart-web/operator-canary"));
116
+ return withCanaryLock(directory, async () => {
117
+ const statePath = join(directory, "state.json");
118
+ let previous = {};
119
+ try {
120
+ const data = await privateJson(statePath);
121
+ if (data.version !== 1 || !data.targets || typeof data.targets !== "object" || Array.isArray(data.targets))
122
+ throw new Error("Invalid state");
123
+ previous = data.targets;
124
+ }
125
+ catch (error) {
126
+ if (error.code !== "ENOENT")
127
+ throw error;
128
+ }
129
+ const client = new Client({ name: "smart-web-operator-canary", version: "1" });
130
+ const transport = new StdioClientTransport({ command: runtime.command, args: runtime.args, env: Object.fromEntries(Object.entries(process.env).filter((entry) => typeof entry[1] === "string")), stderr: "ignore" });
131
+ const deadline = Date.now() + 90000;
132
+ const unavailable = { outcome: "unavailable", reason: "upstream", bodyChars: 0, comments: 0 };
133
+ const observe = async (probe) => {
134
+ const remaining = Math.min(30000, deadline - Date.now());
135
+ if (remaining < 4000)
136
+ return unavailable;
137
+ try {
138
+ const reply = await client.callTool({ name: "smartfetch", arguments: { url: probe.url, format: "json", output_budget: "full", timeout_ms: Math.min(25000, remaining - 1000) } }, undefined, { timeout: remaining });
139
+ const text = Array.isArray(reply.content) ? reply.content.find(c => c?.type === "text" && typeof c.text === "string") : undefined;
140
+ const data = reply.structuredContent ?? (text ? JSON.parse(text.text) : null);
141
+ return evaluateProbe(probe, data);
142
+ }
143
+ catch {
144
+ return unavailable;
145
+ }
146
+ };
147
+ const targets = {};
148
+ const summaries = {};
149
+ let control = unavailable;
150
+ try {
151
+ await client.connect(transport, { timeout: 10000 });
152
+ control = await observe(CONTROL_PROBE);
153
+ for (const probe of probes) {
154
+ const observation = control.outcome === "healthy" ? await observe(probe) : unavailable;
155
+ const oracle = createHash("sha256").update(monitor).update(JSON.stringify({ probe, control: CONTROL_PROBE })).digest("hex");
156
+ const state = advanceObservation(previous[probe.adapter], observation, { now: Date.now(), controlHealthy: control.outcome === "healthy", runtime: runtime.digest, oracle });
157
+ targets[probe.adapter] = state;
158
+ summaries[probe.adapter] = { ...observation, status: state.status };
159
+ }
160
+ }
161
+ finally {
162
+ await client.close();
163
+ }
164
+ const completed = new Date().toISOString();
165
+ const saved = { version: 1, completed, runtime: runtime.digest, control, targets };
166
+ const temp = join(directory, `state-${process.pid}.tmp`);
167
+ await writeFile(temp, JSON.stringify(saved, null, 2) + "\n", { mode: 0o600, flag: "wx" });
168
+ await rename(temp, statePath);
169
+ const issues = [];
170
+ if (values.publish) {
171
+ for (const probe of probes) {
172
+ const state = targets[probe.adapter];
173
+ if (state?.status === "confirmed")
174
+ issues.push(await publishIncident(probe.adapter, state));
175
+ }
176
+ }
177
+ console.log(JSON.stringify({ completed, runtime: runtime.digest, control, targets: summaries, issues, repair: "not_dispatched" }, null, 2));
178
+ if (control.outcome !== "healthy" || Object.values(targets).some(t => t.status === "blocked"))
179
+ return 2;
180
+ return Object.values(targets).every(t => t.status === "healthy") ? 0 : 1;
181
+ });
182
+ }
183
+ if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
184
+ runCanary().then(code => { process.exitCode = code; }).catch(() => {
185
+ // No raw transport, filesystem or provider errors on the public CLI surface.
186
+ console.error("operator_canary_failed: inspect the private configuration, lock, runtime and local permissions; no repair was dispatched");
187
+ process.exitCode = 3;
188
+ });
189
+ }
190
+ //# sourceMappingURL=operator-canary-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-canary-cli.js","sourceRoot":"","sources":["../src/operator-canary-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ declare const adapterSchema: z.ZodEnum<{
3
+ clien: "clien";
4
+ dcinside: "dcinside";
5
+ ppomppu: "ppomppu";
6
+ }>;
7
+ export type CanaryAdapter = z.infer<typeof adapterSchema>;
8
+ declare const reasonSchema: z.ZodEnum<{
9
+ body: "body";
10
+ comments: "comments";
11
+ coverage: "coverage";
12
+ identity: "identity";
13
+ ok: "ok";
14
+ partial: "partial";
15
+ schema: "schema";
16
+ title: "title";
17
+ upstream: "upstream";
18
+ }>;
19
+ export type CanaryReason = z.infer<typeof reasonSchema>;
20
+ export type CanaryOutcome = "healthy" | "semantic_regression" | "unavailable" | "cooldown" | "human_required";
21
+ export interface CanaryProbe {
22
+ adapter: CanaryAdapter | "control";
23
+ url: string;
24
+ titleIncludes: string;
25
+ bodyIncludes: string;
26
+ minBodyChars: number;
27
+ minComments: number;
28
+ }
29
+ export declare const CONTROL_PROBE: CanaryProbe;
30
+ export declare const CONFIRMATION_DELAY_MS = 300000;
31
+ export declare function parseProbeConfig(value: unknown): CanaryProbe[];
32
+ export interface CanaryObservation {
33
+ outcome: CanaryOutcome;
34
+ reason: CanaryReason;
35
+ bodyChars: number;
36
+ comments: number;
37
+ }
38
+ /** Only enums/counts cross this boundary; never return source text or error strings. */
39
+ export declare function evaluateProbe(probe: CanaryProbe, value: unknown): CanaryObservation;
40
+ declare const stateSchema: z.ZodObject<{
41
+ version: z.ZodLiteral<1>;
42
+ status: z.ZodEnum<{
43
+ blocked: "blocked";
44
+ confirmed: "confirmed";
45
+ healthy: "healthy";
46
+ suspect: "suspect";
47
+ }>;
48
+ reason: z.ZodEnum<{
49
+ body: "body";
50
+ comments: "comments";
51
+ coverage: "coverage";
52
+ identity: "identity";
53
+ ok: "ok";
54
+ partial: "partial";
55
+ schema: "schema";
56
+ title: "title";
57
+ upstream: "upstream";
58
+ }>;
59
+ count: z.ZodNumber;
60
+ first: z.ZodNumber;
61
+ last: z.ZodNumber;
62
+ runtime: z.ZodString;
63
+ oracle: z.ZodString;
64
+ }, z.core.$strict>;
65
+ export type CanaryState = z.infer<typeof stateSchema>;
66
+ export declare function advanceObservation(previous: unknown, observation: CanaryObservation, context: {
67
+ now: number;
68
+ controlHealthy: boolean;
69
+ runtime: string;
70
+ oracle: string;
71
+ }): CanaryState;
72
+ export declare function incidentMarker(adapter: CanaryAdapter, reason: CanaryReason): string;
73
+ export declare function incidentBody(adapter: CanaryAdapter, value: CanaryState): string;
74
+ export {};
@@ -0,0 +1,135 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+ const adapterSchema = z.enum(["clien", "dcinside", "ppomppu"]);
4
+ const reasonSchema = z.enum(["ok", "schema", "identity", "title", "body", "comments", "coverage", "partial", "upstream"]);
5
+ export const CONTROL_PROBE = { adapter: "control", url: "https://example.com/", titleIncludes: "Example Domain", bodyIncludes: "domain", minBodyChars: 20, minComments: 0 };
6
+ export const CONFIRMATION_DELAY_MS = 300000;
7
+ const MAX_OBSERVATION_AGE_MS = 86400000;
8
+ function allowedTarget(adapter, raw) {
9
+ try {
10
+ const url = new URL(raw);
11
+ if (url.protocol !== "https:" || url.username || url.password || url.port || url.hash)
12
+ return false;
13
+ if (adapter === "clien")
14
+ return url.hostname === "www.clien.net" && /^\/service\/board\/[a-zA-Z0-9_]+\/\d+$/.test(url.pathname) && !url.search;
15
+ const host = adapter === "ppomppu" ? "www.ppomppu.co.kr" : "gall.dcinside.com";
16
+ const pathMatches = adapter === "ppomppu" ? url.pathname === "/zboard/view.php" : /^\/(?:mgallery\/|mini\/)?board\/view\/?$/.test(url.pathname);
17
+ if (url.hostname !== host || !pathMatches)
18
+ return false;
19
+ return [...url.searchParams.keys()].sort().join(",") === "id,no" && /^[a-zA-Z0-9_]+$/.test(url.searchParams.get("id") || "") && /^\d+$/.test(url.searchParams.get("no") || "");
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ const probeSchema = z.object({
26
+ adapter: adapterSchema,
27
+ url: z.string().max(500),
28
+ titleIncludes: z.string().min(3).max(100).refine(s => s.trim().length >= 3),
29
+ bodyIncludes: z.string().min(3).max(120).refine(s => s.trim().length >= 3),
30
+ minBodyChars: z.number().int().min(20).max(10000),
31
+ minComments: z.number().int().min(1).max(1000)
32
+ }).strict().refine(p => allowedTarget(p.adapter, p.url), "Expected an allowlisted public post URL");
33
+ export function parseProbeConfig(value) {
34
+ const parsed = z.object({ version: z.literal(1), probes: z.array(probeSchema).min(1).max(3) }).strict().parse(value);
35
+ if (new Set(parsed.probes.map(p => p.adapter)).size !== parsed.probes.length)
36
+ throw new Error("Duplicate adapter probe");
37
+ return parsed.probes;
38
+ }
39
+ function record(value) {
40
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
41
+ }
42
+ /** Only enums/counts cross this boundary; never return source text or error strings. */
43
+ export function evaluateProbe(probe, value) {
44
+ const result = record(value);
45
+ const post = record(result.post);
46
+ const comments = Array.isArray(result.comments) ? result.comments : [];
47
+ const bodyChars = typeof post.text === "string" ? post.text.length : 0;
48
+ const answer = (outcome, reason) => ({ outcome, reason, bodyChars, comments: comments.length });
49
+ const errors = Array.isArray(result.errors) ? result.errors.map(record) : [];
50
+ const codes = errors.flatMap(e => [typeof e.code === "string" ? e.code : "", typeof e.category === "string" ? e.category : ""]);
51
+ if (codes.some(c => /(?:http_429|retry_after|rate_limit|cooldown)/i.test(c)))
52
+ return answer("cooldown", "upstream");
53
+ if (record(result.operator).status === "user_required" || codes.some(c => /(?:user_required|login_required|auth_required|captcha|mfa|consent_required)/i.test(c)))
54
+ return answer("human_required", "upstream");
55
+ const evidence = record(result.evidence);
56
+ if (evidence.impit_success !== true && evidence.playwright_success !== true)
57
+ return answer("unavailable", "upstream");
58
+ if (typeof result.partial !== "boolean" || !Array.isArray(result.comments) || typeof post.url !== "string")
59
+ return answer("semantic_regression", "schema");
60
+ if (post.url !== probe.url)
61
+ return answer("semantic_regression", "identity");
62
+ if (typeof post.title !== "string" || !post.title.includes(probe.titleIncludes))
63
+ return answer("semantic_regression", "title");
64
+ if (bodyChars < probe.minBodyChars || typeof post.text !== "string" || !post.text.includes(probe.bodyIncludes))
65
+ return answer("semantic_regression", "body");
66
+ if (probe.minComments > 0) {
67
+ const rows = comments.map(record);
68
+ const invalidRow = rows.some(c => typeof c.id !== "string" || !c.id
69
+ || typeof c.url !== "string" || c.url.split("#")[0] !== probe.url
70
+ || !((typeof c.text === "string" && c.text.trim()) || (Array.isArray(c.media) && c.media.some(m => typeof m === "string" && /^https?:\/\/[^\s]+$/.test(m)))));
71
+ if (rows.length < probe.minComments || new Set(rows.map(c => c.id)).size !== rows.length || invalidRow)
72
+ return answer("semantic_regression", "comments");
73
+ const coverage = record(post.comment_coverage);
74
+ if (coverage.complete !== true || coverage.retrieval_complete !== true || coverage.declared_count !== coverage.collected_count || coverage.returned_count !== coverage.collected_count || coverage.returned_count !== comments.length)
75
+ return answer("semantic_regression", "coverage");
76
+ }
77
+ if (result.partial)
78
+ return answer("semantic_regression", "partial");
79
+ return answer("healthy", "ok");
80
+ }
81
+ const hashSchema = z.string().regex(/^[a-f0-9]{64}$/);
82
+ const stateSchema = z.object({
83
+ version: z.literal(1),
84
+ status: z.enum(["healthy", "blocked", "suspect", "confirmed"]),
85
+ reason: reasonSchema,
86
+ count: z.number().int().min(0).max(2),
87
+ first: z.number().int().nonnegative(),
88
+ last: z.number().int().nonnegative(),
89
+ runtime: hashSchema,
90
+ oracle: hashSchema
91
+ }).strict().refine(s => s.first <= s.last && s.count === (s.status === "confirmed" ? 2 : s.status === "suspect" ? 1 : 0));
92
+ export function advanceObservation(previous, observation, context) {
93
+ const { now, controlHealthy, runtime, oracle } = context;
94
+ const parsed = stateSchema.safeParse(previous);
95
+ const prior = parsed.success ? parsed.data : undefined;
96
+ const comparable = prior && prior.runtime === runtime && prior.oracle === oracle && prior.reason === observation.reason && prior.last <= now && now - prior.last <= MAX_OBSERVATION_AGE_MS && (prior.status === "suspect" || prior.status === "confirmed");
97
+ const base = { version: 1, reason: observation.reason, runtime, oracle, first: now, last: now };
98
+ if (!controlHealthy || !["healthy", "semantic_regression"].includes(observation.outcome))
99
+ return stateSchema.parse({ ...base, status: "blocked", count: 0 });
100
+ if (observation.outcome === "healthy")
101
+ return stateSchema.parse({ ...base, status: "healthy", count: 0 });
102
+ if (comparable && now - prior.first >= CONFIRMATION_DELAY_MS)
103
+ return stateSchema.parse({ ...base, first: prior.first, status: "confirmed", count: 2 });
104
+ return stateSchema.parse({ ...base, first: comparable ? prior.first : now, status: "suspect", count: 1 });
105
+ }
106
+ export function incidentMarker(adapter, reason) {
107
+ const key = `${adapterSchema.parse(adapter)}:smartfetch:post_comments:${reasonSchema.parse(reason)}:v1`;
108
+ return `<!-- smart-web-operator-canary:v1:${createHash("sha256").update(key).digest("hex").slice(0, 24)} -->`;
109
+ }
110
+ export function incidentBody(adapter, value) {
111
+ const state = stateSchema.parse(value);
112
+ if (state.status !== "confirmed")
113
+ throw new Error("Unconfirmed incident");
114
+ return `${incidentMarker(adapter, state.reason)}
115
+ ## Context
116
+ Operator semantic canary: ${adapterSchema.parse(adapter)} / smartfetch / post_comments.
117
+ Mission: https://github.com/jojo-labs/smart-web/issues/496
118
+
119
+ ## Current status
120
+ Repeated semantic mismatch: ${state.reason}. Two time-separated checks used the same oracle and runtime with a working positive control. This is not a claim that an upstream outage, CAPTCHA, or login wall can be repaired.
121
+
122
+ ## Evidence / verification
123
+ - First confirmation-window observation: ${new Date(state.first).toISOString()}
124
+ - Latest observation: ${new Date(state.last).toISOString()}
125
+ - Runtime tree SHA-256: ${state.runtime}
126
+ - Exact private probe URL, title, content and provider messages are deliberately excluded. The local operator state/config owns reproduction details.
127
+
128
+ ## Acceptance criteria / next action
129
+ Reproduce the original task; add a failing regression; independently review; run full checks and held-out controls; merge; deploy the exact reviewed build; verify the original task through deployed MCP and again later before closure. Preserve rollback and stop promotion if the control regresses.
130
+
131
+ ## Blockers
132
+ Not dispatched: this canary does not launch a repair worker or close incidents. The active implementation owner must coordinate any bounded native repair; no duplicate worker, scheduler, or notification delivery is created.
133
+ `;
134
+ }
135
+ //# sourceMappingURL=operator-canary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-canary.js","sourceRoot":"","sources":["../src/operator-canary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type Browser, type ConnectOverCDPTransport } from "playwright";
2
+ type OwnedCdpTransport = ConnectOverCDPTransport & {
3
+ readonly cleanupIncomplete: boolean;
4
+ };
5
+ export declare function ownedBrowserCleanupIncomplete(browser: Browser | undefined): boolean;
6
+ export declare function createOwnedCdpTransport(wire: ConnectOverCDPTransport): OwnedCdpTransport;
7
+ export declare function connectOwnedCdpTransport(transport: OwnedCdpTransport, options: {
8
+ timeout: number;
9
+ noDefaults: true;
10
+ }): Promise<Browser>;
11
+ export declare function connectOwnedBrowser(endpoint: string, options: {
12
+ timeout: number;
13
+ noDefaults: true;
14
+ }): Promise<Browser>;
15
+ export {};