sxng-cli 1.2.5 → 1.2.7
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/README.md +64 -47
- package/dist/claims/deterministic-checks.d.ts +1 -0
- package/dist/claims/deterministic-checks.d.ts.map +1 -1
- package/dist/claims/deterministic-checks.js +3 -4
- package/dist/claims/deterministic-checks.js.map +1 -1
- package/dist/claims/store.d.ts +6 -0
- package/dist/claims/store.d.ts.map +1 -1
- package/dist/claims/store.js +31 -6
- package/dist/claims/store.js.map +1 -1
- package/dist/claims/types.d.ts +7 -2
- package/dist/claims/types.d.ts.map +1 -1
- package/dist/commands/claim.d.ts +3 -3
- package/dist/commands/claim.d.ts.map +1 -1
- package/dist/commands/claim.js +70 -60
- package/dist/commands/claim.js.map +1 -1
- package/dist/commands/evidence.d.ts +3 -4
- package/dist/commands/evidence.d.ts.map +1 -1
- package/dist/commands/evidence.js +164 -144
- package/dist/commands/evidence.js.map +1 -1
- package/dist/commands/extract.d.ts +3 -3
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +58 -62
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/graph-add.d.ts +3 -13
- package/dist/commands/graph-add.d.ts.map +1 -1
- package/dist/commands/graph-add.js +78 -138
- package/dist/commands/graph-add.js.map +1 -1
- package/dist/commands/json-input.d.ts +18 -0
- package/dist/commands/json-input.d.ts.map +1 -0
- package/dist/commands/json-input.js +50 -0
- package/dist/commands/json-input.js.map +1 -0
- package/dist/commands/results-add.d.ts +5 -9
- package/dist/commands/results-add.d.ts.map +1 -1
- package/dist/commands/results-add.js +66 -32
- package/dist/commands/results-add.js.map +1 -1
- package/dist/commands/review.d.ts +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +63 -55
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/verdict.d.ts.map +1 -1
- package/dist/commands/verdict.js +13 -2
- package/dist/commands/verdict.js.map +1 -1
- package/dist/deep/dedupe.js +1 -1
- package/dist/deep/dedupe.js.map +1 -1
- package/dist/deep/extractor.d.ts +4 -1
- package/dist/deep/extractor.d.ts.map +1 -1
- package/dist/deep/extractor.js +83 -26
- package/dist/deep/extractor.js.map +1 -1
- package/dist/deep/graph-explore.d.ts +1 -1
- package/dist/deep/graph-explore.d.ts.map +1 -1
- package/dist/deep/graph-explore.js +14 -12
- package/dist/deep/graph-explore.js.map +1 -1
- package/dist/deep/graph-preprocess.d.ts +2 -1
- package/dist/deep/graph-preprocess.d.ts.map +1 -1
- package/dist/deep/graph-preprocess.js +10 -10
- package/dist/deep/graph-preprocess.js.map +1 -1
- package/dist/deep/graph-sampling.d.ts.map +1 -1
- package/dist/deep/graph-sampling.js +3 -2
- package/dist/deep/graph-sampling.js.map +1 -1
- package/dist/deep/graph.d.ts +10 -3
- package/dist/deep/graph.d.ts.map +1 -1
- package/dist/deep/graph.js +9 -8
- package/dist/deep/graph.js.map +1 -1
- package/dist/deep/local-doc/indexer.d.ts.map +1 -1
- package/dist/deep/local-doc/indexer.js +34 -1
- package/dist/deep/local-doc/indexer.js.map +1 -1
- package/dist/deep/local-doc/searcher.d.ts +4 -2
- package/dist/deep/local-doc/searcher.d.ts.map +1 -1
- package/dist/deep/local-doc/searcher.js +18 -4
- package/dist/deep/local-doc/searcher.js.map +1 -1
- package/dist/deep/path-extraction.js +4 -4
- package/dist/deep/path-extraction.js.map +1 -1
- package/dist/deep/quality-assess.d.ts +4 -4
- package/dist/deep/quality-assess.d.ts.map +1 -1
- package/dist/deep/quality-assess.js +11 -11
- package/dist/deep/quality-assess.js.map +1 -1
- package/dist/deep/quality-assess.sync-conflict-20260728-195206-JAULAPO.d.ts +46 -0
- package/dist/deep/quality-assess.sync-conflict-20260728-195206-JAULAPO.d.ts.map +1 -0
- package/dist/deep/quality-assess.sync-conflict-20260728-195206-JAULAPO.js +122 -0
- package/dist/deep/quality-assess.sync-conflict-20260728-195206-JAULAPO.js.map +1 -0
- package/dist/deep/search-strategy.d.ts.map +1 -1
- package/dist/deep/search-strategy.js +13 -6
- package/dist/deep/search-strategy.js.map +1 -1
- package/dist/deep/session.d.ts +115 -56
- package/dist/deep/session.d.ts.map +1 -1
- package/dist/deep/session.js +554 -253
- package/dist/deep/session.js.map +1 -1
- package/dist/runCli.d.ts.map +1 -1
- package/dist/runCli.js +111 -44
- package/dist/runCli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
- 🔄 **Dynamic Discovery** — Auto-fetches available engines and categories from your SearXNG server
|
|
29
29
|
- 📄 **Multiple Formats** — Markdown (LLM-optimized) or JSON output
|
|
30
30
|
- 🧠 **Deep Search** — Multi-round iterative research with session accumulation, quality assessment, and recovery strategies
|
|
31
|
-
- 🔍 **Content Extraction** — Extract full article content from URLs or session results, with Obscura
|
|
32
|
-
- 🗂️ **Session Management** —
|
|
33
|
-
- 🔗 **External Result Fusion** —
|
|
31
|
+
- 🔍 **Content Extraction** — Extract full article content from URLs or session results, with Obscura fallback and Agent-selected Jina Reader extraction
|
|
32
|
+
- 🗂️ **Session Management** — Separates search discovery from extracted bodies; stable result IDs and revisions prevent stale approvals in parallel work
|
|
33
|
+
- 🔗 **External Result Fusion** — Import external search or extraction output from session-scoped JSON files, without PowerShell inline-JSON escaping risks
|
|
34
34
|
- ⭐ **Quality Assessment** — 3 independent indicators: content depth, source diversity, and novelty
|
|
35
|
-
- 🕸️ **Knowledge Graph** — Structural (query→result→domain) + semantic (entity relations with
|
|
35
|
+
- 🕸️ **Knowledge Graph** — Structural (query→result→domain) + semantic (entity relations with approved result-ID provenance) graph layers
|
|
36
36
|
- 🔄 **Query Redundancy Check** — Word-level or character-bigram Jaccard detects repeated queries
|
|
37
37
|
- 💡 **Agent-First Design** — Outputs structured analysis data (quality, suggestions, recovery) for LLM Agent decision-making
|
|
38
38
|
- 📁 **Local Document Search** — Index and BM25-search local Markdown/text files; results auto-injected into the session pipeline as `source: "local"`
|
|
@@ -70,7 +70,7 @@ npm link
|
|
|
70
70
|
|
|
71
71
|
### Obscura (Optional — for JS-heavy pages)
|
|
72
72
|
|
|
73
|
-
Content extraction uses **Defuddle + linkedom** by default. For JS-rendered pages (SPAs), enable [Obscura](https://github.com/h4ckf0r0day/obscura)
|
|
73
|
+
Content extraction uses **Defuddle + linkedom** by default. For JS-rendered pages (SPAs), enable [Obscura](https://github.com/h4ckf0r0day/obscura). When `--obscura` is used and the binary is absent, sxng automatically downloads the matching release asset from the official GitHub HTTPS download endpoint.
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
76
|
# Linux x86_64
|
|
@@ -110,10 +110,10 @@ obscura --version
|
|
|
110
110
|
| `sxng extract --urls <urls>` | Extract content from web pages |
|
|
111
111
|
| `sxng extract --session <name>` | Extract session results and merge content |
|
|
112
112
|
| `sxng extract --obscura` | JS-rendering fallback for SPA pages |
|
|
113
|
-
| `sxng extract --jina` | Jina Reader
|
|
113
|
+
| `sxng extract --urls <url> --session <name> --jina` | Agent-selected Jina Reader extraction for explicit URLs, merged into a session |
|
|
114
114
|
| `sxng --session new` | Create deep search session |
|
|
115
115
|
| `sxng --session <name> --quality` | Assess result quality, list pending results |
|
|
116
|
-
| `sxng --session <name> --quality --approve
|
|
116
|
+
| `sxng --session <name> --quality --approve-file <path>` | Approve verified pending results selected by `{id, revision}` JSON |
|
|
117
117
|
| `sxng suggest-queries <session>` | Get query suggestion data for Agent |
|
|
118
118
|
| `sxng strategy-info <session>` | Check current search stage |
|
|
119
119
|
| `sxng recovery-analysis <session>` | Get recovery strategies for poor quality |
|
|
@@ -121,19 +121,19 @@ obscura --version
|
|
|
121
121
|
| `sxng session-list` | List all sessions |
|
|
122
122
|
| `sxng session-delete <name>` | Delete a session |
|
|
123
123
|
| `sxng graph-preprocess <session>` | TF-IDF + co-occurrence + result provenance analysis |
|
|
124
|
-
| `sxng graph-add <session>` | Add entities/edges
|
|
124
|
+
| `sxng graph-add <session> --data-file <path>` | Add semantic entities/edges backed by approved result IDs |
|
|
125
125
|
| `sxng graph-search <session>` | Discover entities by keyword |
|
|
126
126
|
| `sxng graph-explore <session>` | View entity relations |
|
|
127
127
|
| `sxng graph-drill <session>` | Follow specific relations |
|
|
128
128
|
| `sxng graph-traverse <session>` | Traverse reasoning paths |
|
|
129
129
|
| `sxng graph-obfuscate <session>` | List obfuscation candidates |
|
|
130
|
-
| `sxng results-add <session> --
|
|
130
|
+
| `sxng results-add <session> --kind <search|extracted> --data-file <path>` | Import external discovery or extracted bodies from session-scoped UTF-8 JSON |
|
|
131
131
|
| `sxng doc-index <path>` | Index local documents for BM25 search |
|
|
132
132
|
| `sxng doc-search <session> <query> --path <path>` | Search indexed docs and inject results into session |
|
|
133
|
-
| `sxng claim-add <session> --claims <
|
|
133
|
+
| `sxng claim-add <session> --claims-file <path>` | Submit atomic claims from UTF-8 JSON (single or batch, auto evidence-search) |
|
|
134
134
|
| `sxng claim-list <session>` | List claims |
|
|
135
135
|
| `sxng evidence-search <session> --claim-id <id>` | Search candidate evidence (read-only) |
|
|
136
|
-
| `sxng evidence-verify <session> --claim-id <id>` | Confirm evidence + submit stance (+ optional auto-policy) |
|
|
136
|
+
| `sxng evidence-verify <session> --claim-id <id> --evidence-file <path>` | Confirm UTF-8 JSON evidence + submit stance (+ optional auto-policy) |
|
|
137
137
|
| `sxng evidence-list <session> --claim-id <id>` | List evidence for a claim |
|
|
138
138
|
| `sxng verdict-list <session> --claim-id <id>` | List verdicts for a claim |
|
|
139
139
|
| `sxng policy-aggregate <session>` | Run policy aggregation manually |
|
|
@@ -159,7 +159,8 @@ obscura --version
|
|
|
159
159
|
| `--desc <text>` | Session description |
|
|
160
160
|
| `--redundancy <action>` | Query redundancy check: `warn`, `adjust`, `skip` |
|
|
161
161
|
| `--quality` | Assess result quality (requires --session) |
|
|
162
|
-
| `--approve <
|
|
162
|
+
| `--approve-file <path>` | Approve `{id, revision}` selections from this session's `agent-inputs` directory |
|
|
163
|
+
| `--skip-file <path>` / `--unskip-file <path>` | Skip or restore `{id, revision}` selections from this session's `agent-inputs` directory |
|
|
163
164
|
| `--threshold-override <json>` | Override quality thresholds (JSON) |
|
|
164
165
|
| `--merge <file>` | Merge new results with previous search JSON |
|
|
165
166
|
|
|
@@ -233,7 +234,7 @@ Deep search enables multi-round iterative research with session accumulation, qu
|
|
|
233
234
|
### Workflow
|
|
234
235
|
|
|
235
236
|
```
|
|
236
|
-
Search → Extract →
|
|
237
|
+
Search → Extract → Quality Assess → Approve → Build Graph → (Loop or Explore)
|
|
237
238
|
↓
|
|
238
239
|
(L2/L3) Claim—Evidence—Review → Final Output
|
|
239
240
|
```
|
|
@@ -248,27 +249,23 @@ sxng --session new --owner "agent-1" --desc "Rust async study" "rust async ecosy
|
|
|
248
249
|
# 2. Extract content from results
|
|
249
250
|
sxng extract --session ds_1712345678_abcdef
|
|
250
251
|
|
|
251
|
-
# 3.
|
|
252
|
-
|
|
252
|
+
# 3. Check extraction output: stats.success and session.updated identify
|
|
253
|
+
# results that received source text; failed URLs remain pending.
|
|
253
254
|
|
|
254
|
-
# 4.
|
|
255
|
-
sxng graph-add ds_1712345678_abcdef --data '{
|
|
256
|
-
"entities": [
|
|
257
|
-
{"label": "tokio", "entityType": "runtime", "score": 0.95, "sourceRounds": [1]},
|
|
258
|
-
{"label": "async-std", "entityType": "runtime", "score": 0.85, "sourceRounds": [1]}
|
|
259
|
-
],
|
|
260
|
-
"edges": [
|
|
261
|
-
{"source": "e:tokio", "target": "e:async_std", "relation": "alternative_to", "weight": 0.9}
|
|
262
|
-
]
|
|
263
|
-
}'
|
|
264
|
-
|
|
265
|
-
# 5. Assess quality — results are pending until approved
|
|
255
|
+
# 4. Assess quality and see each result's verified state
|
|
266
256
|
sxng --session ds_1712345678_abcdef --quality
|
|
267
257
|
|
|
268
|
-
#
|
|
269
|
-
sxng
|
|
258
|
+
# 5. Copy selected {id, revision} objects from quality output into
|
|
259
|
+
# .sxng/sessions/ds_1712345678_abcdef/agent-inputs/approve.json, then approve them.
|
|
260
|
+
sxng --session ds_1712345678_abcdef --quality --approve-file .\.sxng\sessions\ds_1712345678_abcdef\agent-inputs\approve.json
|
|
261
|
+
|
|
262
|
+
# 6. Preprocess session content for entity discovery and provenance
|
|
263
|
+
sxng graph-preprocess ds_1712345678_abcdef
|
|
264
|
+
|
|
265
|
+
# 7. Put complex graph JSON in this session's Agent scratch directory, then add semantic edges
|
|
266
|
+
sxng graph-add ds_1712345678_abcdef --data-file .\.sxng\sessions\ds_1712345678_abcdef\agent-inputs\graph-data.json
|
|
270
267
|
|
|
271
|
-
#
|
|
268
|
+
# 8. Continue research with redundancy check
|
|
272
269
|
sxng --session ds_1712345678_abcdef --queries "tokio vs async-std,benchmark 2026" --redundancy warn
|
|
273
270
|
```
|
|
274
271
|
|
|
@@ -276,6 +273,7 @@ sxng --session ds_1712345678_abcdef --queries "tokio vs async-std,benchmark 2026
|
|
|
276
273
|
|
|
277
274
|
- Extracted web content is deduplicated by normalized URL, then by full-text character 5-gram Jaccard similarity. Query redundancy uses a separate word-level or character-bigram Jaccard check.
|
|
278
275
|
- `--quality` assesses the newest recorded round against earlier approved results. A URL already seen in an earlier round is non-novel, even when it reappears in the newest round.
|
|
276
|
+
- Quality is a diagnostic, not a fact verifier. A search discovery can be approved only after `extract` writes a non-empty body and extraction timestamp. An explicitly imported external body must provide non-empty `content` and an `extractor`; absent `extractedAt` is recorded as its import time.
|
|
279
277
|
- Claim policy treats two normalized publisher domains as two sources. It does not infer corporate ownership, editorial relationships, or syndication across domains.
|
|
280
278
|
|
|
281
279
|
### Session Management
|
|
@@ -312,19 +310,33 @@ Two layers:
|
|
|
312
310
|
|
|
313
311
|
Graph navigation commands: `graph-search` (discover entities), `graph-explore` (view relations), `graph-drill` (follow specific relations), `graph-traverse` (traverse reasoning paths).
|
|
314
312
|
|
|
315
|
-
`graph-preprocess` returns `resultProvenance` (`url`, `title`, `
|
|
313
|
+
`graph-preprocess` returns `resultProvenance` (`id`, `revision`, `url`, `title`, `approval`) for every extracted body. For each semantic entity or edge, copy one or more currently approved `id` values into `sourceResultIds`. This keeps semantic facts traceable to the exact approved bodies rather than a search round.
|
|
316
314
|
|
|
317
315
|
### External Search Results
|
|
318
316
|
|
|
319
317
|
Results from other search tools (Tavily, Exa, etc.) can be injected into any active session via `results-add`, following the same pipeline as native sxng results:
|
|
320
318
|
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
319
|
+
```powershell
|
|
320
|
+
# Import search discovery; its excerpts remain summaries and require extraction.
|
|
321
|
+
sxng results-add <session-name> --kind search --tool exa --query "async runtime" `
|
|
322
|
+
--data-file .\.sxng\sessions\<session-name>\agent-inputs\exa-search.json
|
|
325
323
|
```
|
|
326
324
|
|
|
327
|
-
|
|
325
|
+
Search imports become `pending` and require `extract --session`; inspect `stats.success`, `stats.failed`, and `session.updated`, then approve only entries whose quality output reports `verified: true`. An external tool that already returned a body must instead use `--kind extracted` with non-empty `content` and `extractor`; it becomes pending approval without another extraction. A failed extraction remains pending and cannot enter the graph. `tool` and `query` record the discovery provenance.
|
|
326
|
+
|
|
327
|
+
### Structured JSON Input
|
|
328
|
+
|
|
329
|
+
All structured writes use a UTF-8 JSON file under `.sxng/sessions/<session-name>/agent-inputs/`. This avoids PowerShell quoting and Windows command-line length limits, keeps concurrent sessions isolated, and gives each command one inspectable input artifact. The CLI rejects inline JSON and files outside the owning session.
|
|
330
|
+
|
|
331
|
+
| Command | Required file option |
|
|
332
|
+
|---|---|
|
|
333
|
+
| External search or extracted bodies | `results-add --data-file <path>` |
|
|
334
|
+
| Graph entities/edges | `graph-add --data-file <path>` |
|
|
335
|
+
| Approval, skip, restore selections | `--approve-file` / `--skip-file` / `--unskip-file <path>` |
|
|
336
|
+
| One/batch Claim | `claim-add --claim-file` / `--claims-file <path>` |
|
|
337
|
+
| Evidence verification | `evidence-verify --evidence-file <path>` |
|
|
338
|
+
|
|
339
|
+
The file must be UTF-8 (a UTF-8 BOM is accepted). Missing, malformed, cross-session, or out-of-directory input fails before state changes. The CLI never deletes Agent input files automatically; `session-delete` removes the entire session only when explicitly requested.
|
|
328
340
|
|
|
329
341
|
### Claim—Evidence—Review Pipeline (L2/L3 Only)
|
|
330
342
|
|
|
@@ -339,17 +351,14 @@ evidence-verify (with --complete auto-policy) → Review → Agent adjusts outpu
|
|
|
339
351
|
|
|
340
352
|
**Quick Example:**
|
|
341
353
|
|
|
342
|
-
```
|
|
343
|
-
# 1.
|
|
344
|
-
sxng claim-add my-session --claims
|
|
345
|
-
{"text":"Tokio is the most widely used async runtime","riskLevel":"medium"},
|
|
346
|
-
{"text":"async-std is no longer actively maintained","riskLevel":"medium"}
|
|
347
|
-
]'
|
|
354
|
+
```powershell
|
|
355
|
+
# 1. Put claims from your draft in the session's UTF-8 Agent input directory, then submit it.
|
|
356
|
+
sxng claim-add my-session --claims-file .\.sxng\sessions\my-session\agent-inputs\claims.json
|
|
348
357
|
# → returns claims with IDs + auto-discovered evidence candidates
|
|
349
358
|
|
|
350
|
-
# 2.
|
|
359
|
+
# 2. Put {resultId, quote, charStart, charEnd} in the session's UTF-8 Agent input directory.
|
|
351
360
|
sxng evidence-verify my-session --claim-id "cl_001" \
|
|
352
|
-
--evidence
|
|
361
|
+
--evidence-file .\.sxng\sessions\my-session\agent-inputs\evidence.json \
|
|
353
362
|
--stance support --reason "Official docs confirm" --complete
|
|
354
363
|
# → returns evidence + verdict + review (decision: approved / needsReview)
|
|
355
364
|
|
|
@@ -358,7 +367,7 @@ sxng review-list my-session
|
|
|
358
367
|
```
|
|
359
368
|
|
|
360
369
|
**Key Principles:**
|
|
361
|
-
- **Deterministic checks**: CLI validates
|
|
370
|
+
- **Deterministic checks**: CLI validates `resultId` against approved extracted results, UTF-16 offsets within range, and the SHA256 hash of the quoted source span
|
|
362
371
|
- **No embedded LLM**: All semantic work (claim extraction, stance) is done by the Agent outside the CLI
|
|
363
372
|
- **Policy rules**: 7 rules (singleRefute → highRiskInsufficient → dualSourceSupport → dualSourceMixed → singleSource → allInsufficient → fallback) — pure rule engine, no model calls
|
|
364
373
|
- **`--complete` flag**: Evidence + verdict + auto-policy in one call
|
|
@@ -384,19 +393,27 @@ sxng doc-index ./docs
|
|
|
384
393
|
sxng doc-search <session-name> "query" --path ./docs
|
|
385
394
|
```
|
|
386
395
|
|
|
387
|
-
**How it works:** auto-indexing on first use (Orama BM25, title×3 / headings×2 / content×1),
|
|
396
|
+
**How it works:** auto-indexing on first use (Orama BM25, title×3 / headings×2 / content×1), each matched chunk is injected as an `extracted` result with `extractor: "local-index"`, then follows `--quality` → `--approve-file` → `graph-add`. Use `graph-preprocess` before adding new entities so approved IDs become `sourceResultIds`. Local searches do **not** increment the round counter.
|
|
388
397
|
|
|
389
398
|
**Quality note:** Pure local search yields `sourceDiversity: 1`. Combine with web results for adequate diversity.
|
|
390
399
|
|
|
391
400
|
### Known Limitations
|
|
392
401
|
|
|
393
|
-
- Session and
|
|
402
|
+
- Session result and graph mutations use a per-session lock plus atomic replacement; Claim, Evidence, and Review files still have no cross-file transaction.
|
|
394
403
|
- URL extraction is not an SSRF security boundary; use only trusted public URLs.
|
|
395
404
|
- Local document scanning has no defined symbolic-link boundary or cycle policy.
|
|
396
405
|
- Index rebuilds overwrite the current persistence files; an interruption or disk failure can require re-indexing.
|
|
397
406
|
|
|
398
407
|
See [PRD-005 design improvements](docs/prds/PRD-005-design-improvements.md) for the deferred remediation plan.
|
|
399
408
|
|
|
409
|
+
## 💡 Projects Using SXNG CLI
|
|
410
|
+
|
|
411
|
+
SXNG CLI's deep search workflow (session accumulation, quality assessment, knowledge graph, claim–evidence–review) is used by projects that need persistent, multi-round research capabilities:
|
|
412
|
+
|
|
413
|
+
- **[1052 OS](https://github.com/1052666/1052-OS)** — A personal AI operating system. Its `search-pack` integrates persistent research sessions, quality assessment, content extraction, and a claim–evidence–review pipeline, all powered by the same deep search concepts that drive SXNG CLI.
|
|
414
|
+
|
|
415
|
+
> Open a PR to add your project here.
|
|
416
|
+
|
|
400
417
|
## 🔗 Links
|
|
401
418
|
|
|
402
419
|
- **GitHub:** https://github.com/hkwuks/sxng-cli
|
|
@@ -30,6 +30,7 @@ export declare function resolveApprovedContent(sessionDir: string, resultUrl: st
|
|
|
30
30
|
export declare function computeSourceClusterId(evidence: EvidenceSpan): string;
|
|
31
31
|
/** A candidate evidence match, not persisted until verified by Agent. */
|
|
32
32
|
export interface EvidenceCandidate {
|
|
33
|
+
resultId: string;
|
|
33
34
|
resultUrl: string;
|
|
34
35
|
quote: string;
|
|
35
36
|
charStart: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deterministic-checks.d.ts","sourceRoot":"","sources":["../../src/claims/deterministic-checks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"deterministic-checks.d.ts","sourceRoot":"","sources":["../../src/claims/deterministic-checks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK1C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,MAAM,GACd,WAAW,CAQb;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQ5B;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,GACrB,MAAM,CAQR;AAID,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAyDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,iBAAiB,EAAE,CA2DrB"}
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { createHash } from 'crypto';
|
|
9
9
|
import { getApprovedResults } from '../deep/session.js';
|
|
10
|
-
import { loadSessionResults } from '../deep/session.js';
|
|
11
10
|
/**
|
|
12
11
|
* Verify that an EvidenceSpan is properly anchored to approved content.
|
|
13
12
|
*/
|
|
@@ -42,7 +41,7 @@ export function resolveApprovedContent(sessionDir, resultUrl) {
|
|
|
42
41
|
export function computeSourceClusterId(evidence) {
|
|
43
42
|
let publisher = '';
|
|
44
43
|
try {
|
|
45
|
-
publisher = new URL(evidence.resultUrl).hostname.toLowerCase().replace(/^www\./, '');
|
|
44
|
+
publisher = new URL(evidence.resultUrl ?? '').hostname.toLowerCase().replace(/^www\./, '');
|
|
46
45
|
}
|
|
47
46
|
catch { /* empty */ }
|
|
48
47
|
// Unknown publishers share one cluster so they cannot inflate domain diversity.
|
|
@@ -111,8 +110,7 @@ export function searchCandidates(sessionDir, claimText) {
|
|
|
111
110
|
const threshold = /[\u3400-\u9fff]/u.test(claimText)
|
|
112
111
|
? CJK_JACCARD_THRESHOLD
|
|
113
112
|
: JACCARD_THRESHOLD;
|
|
114
|
-
const
|
|
115
|
-
const approved = allResults.filter(r => r.status === 'approved' && r.content);
|
|
113
|
+
const approved = getApprovedResults(sessionDir);
|
|
116
114
|
const candidates = [];
|
|
117
115
|
for (const result of approved) {
|
|
118
116
|
const content = result.content;
|
|
@@ -144,6 +142,7 @@ export function searchCandidates(sessionDir, claimText) {
|
|
|
144
142
|
candidates.push({
|
|
145
143
|
score,
|
|
146
144
|
candidate: {
|
|
145
|
+
resultId: result.id,
|
|
147
146
|
resultUrl: result.url,
|
|
148
147
|
quote: trimmed,
|
|
149
148
|
charStart,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deterministic-checks.js","sourceRoot":"","sources":["../../src/claims/deterministic-checks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAiB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"deterministic-checks.js","sourceRoot":"","sources":["../../src/claims/deterministic-checks.ts"],"names":[],"mappings":"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"}
|
package/dist/claims/store.d.ts
CHANGED
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
* { "status": "ok", "data": { "claims": [...] } }
|
|
7
7
|
*/
|
|
8
8
|
import { Claim, EvidenceSpan, Verdict, Review, ReviewStatus } from './types.js';
|
|
9
|
+
export declare class ClaimsStateError extends Error {
|
|
10
|
+
readonly file: string;
|
|
11
|
+
constructor(file: string);
|
|
12
|
+
}
|
|
13
|
+
/** Validate all existing claim artifacts before any related mutation. */
|
|
14
|
+
export declare function assertClaimsStoreReadable(sessionDir: string): void;
|
|
9
15
|
export declare function loadClaims(sessionDir: string): Claim[];
|
|
10
16
|
export declare function saveClaims(sessionDir: string, claims: Claim[]): void;
|
|
11
17
|
/** Allocate next claim ID: cl_<seq>. Reads current count from file. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/claims/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,KAAK,EACL,YAAY,EACZ,OAAO,EACP,MAAM,EACN,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/claims/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,KAAK,EACL,YAAY,EACZ,OAAO,EACP,MAAM,EACN,YAAY,EACb,MAAM,YAAY,CAAC;AAsCpB,qBAAa,gBAAiB,SAAQ,KAAK;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAGlC;AAgBD,yEAAyE;AACzE,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAKlE;AAeD,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,EAAE,CAEtD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAGpE;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAItD;AAID,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAEhE;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,CAGjF;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIzD;AAID,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE,CAE1D;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAG1E;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIxD;AAID,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAGvE;AAID,oCAAoC;AACpC,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,GACvB,KAAK,EAAE,CAIT;AAED,uCAAuC;AACvC,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,YAAY,GACtB,MAAM,EAAE,CAIV;AAED,wCAAwC;AACxC,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,YAAY,EAAE,CAEhB;AAED,wCAAwC;AACxC,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,EAAE,CAEX"}
|
package/dist/claims/store.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* using the same envelope format as results.json/graph.json:
|
|
6
6
|
* { "status": "ok", "data": { "claims": [...] } }
|
|
7
7
|
*/
|
|
8
|
-
import { readFileSync,
|
|
9
|
-
import { join } from 'path';
|
|
8
|
+
import { readFileSync, existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from 'fs';
|
|
9
|
+
import { dirname, join } from 'path';
|
|
10
10
|
// ── Path helpers ────────────────────────────────────────────────────
|
|
11
11
|
function claimsDir(sessionDir) {
|
|
12
12
|
return join(sessionDir, 'claims');
|
|
@@ -29,6 +29,13 @@ function ensureClaimsDir(sessionDir) {
|
|
|
29
29
|
mkdirSync(dir, { recursive: true });
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
+
export class ClaimsStateError extends Error {
|
|
33
|
+
file;
|
|
34
|
+
constructor(file) {
|
|
35
|
+
super(`Cannot read claims state: ${file}`);
|
|
36
|
+
this.file = file;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
32
39
|
function loadArray(file) {
|
|
33
40
|
if (!existsSync(file))
|
|
34
41
|
return [];
|
|
@@ -38,18 +45,36 @@ function loadArray(file) {
|
|
|
38
45
|
if (parsed.status === 'ok' && Array.isArray(parsed.data?.items)) {
|
|
39
46
|
return parsed.data.items;
|
|
40
47
|
}
|
|
41
|
-
|
|
48
|
+
throw new Error('invalid claims envelope');
|
|
42
49
|
}
|
|
43
50
|
catch {
|
|
44
|
-
|
|
51
|
+
throw new ClaimsStateError(file);
|
|
45
52
|
}
|
|
46
53
|
}
|
|
54
|
+
/** Validate all existing claim artifacts before any related mutation. */
|
|
55
|
+
export function assertClaimsStoreReadable(sessionDir) {
|
|
56
|
+
loadArray(claimsFile(sessionDir));
|
|
57
|
+
loadArray(evidencesFile(sessionDir));
|
|
58
|
+
loadArray(verdictsFile(sessionDir));
|
|
59
|
+
loadArray(reviewsFile(sessionDir));
|
|
60
|
+
}
|
|
47
61
|
function writeArray(file, items) {
|
|
48
|
-
const dir =
|
|
62
|
+
const dir = dirname(file);
|
|
49
63
|
if (!existsSync(dir)) {
|
|
50
64
|
mkdirSync(dir, { recursive: true });
|
|
51
65
|
}
|
|
52
|
-
|
|
66
|
+
const temp = join(dir, `.${file.split(/[\\/]/).pop()}.${process.pid}.${Date.now()}.tmp`);
|
|
67
|
+
writeFileSync(temp, JSON.stringify({ status: 'ok', data: { items } }, null, 2), 'utf-8');
|
|
68
|
+
try {
|
|
69
|
+
renameSync(temp, file);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
try {
|
|
73
|
+
rmSync(temp, { force: true });
|
|
74
|
+
}
|
|
75
|
+
catch { /* preserve write error */ }
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
53
78
|
}
|
|
54
79
|
// ── Claims ──────────────────────────────────────────────────────────
|
|
55
80
|
export function loadClaims(sessionDir) {
|
package/dist/claims/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/claims/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/claims/store.ts"],"names":[],"mappings":"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"}
|
package/dist/claims/types.d.ts
CHANGED
|
@@ -33,8 +33,10 @@ export interface Claim {
|
|
|
33
33
|
export interface EvidenceSpan {
|
|
34
34
|
id: string;
|
|
35
35
|
claimId: string;
|
|
36
|
-
/**
|
|
37
|
-
|
|
36
|
+
/** Stable approved result ID this evidence points to */
|
|
37
|
+
resultId: string;
|
|
38
|
+
/** Display-only URL retained for audit readability. */
|
|
39
|
+
resultUrl?: string;
|
|
38
40
|
/** Verbatim quote from source */
|
|
39
41
|
quote: string;
|
|
40
42
|
/** Offset in UTF-16 code units (JS .slice() convention) */
|
|
@@ -55,6 +57,9 @@ export interface EvidenceSpan {
|
|
|
55
57
|
* Derived from: normalized publisher domain → SHA256 → 16 hex chars.
|
|
56
58
|
*/
|
|
57
59
|
sourceClusterId?: string;
|
|
60
|
+
invalid?: boolean;
|
|
61
|
+
invalidatedAt?: number;
|
|
62
|
+
invalidationReason?: 'contentChanged' | 'sourceSkipped';
|
|
58
63
|
}
|
|
59
64
|
export interface Verdict {
|
|
60
65
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/claims/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,KAAK;IACpB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IAEX,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IAEb,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,2CAA2C;IAC3C,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAErC;;;;;OAKG;IACH,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAE7C,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IAEnB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAEhB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/claims/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,KAAK;IACpB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IAEX,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IAEb,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,2CAA2C;IAC3C,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAErC;;;;;OAKG;IACH,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAE7C,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IAEnB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAEhB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IAEjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IAEd,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAEhB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IAEpB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IAEpB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAAC;CACzD;AAID,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAElB,kCAAkC;IAClC,MAAM,EAAE,YAAY,CAAC;IAErB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
package/dist/commands/claim.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Claim add and list commands for the review pipeline.
|
|
3
3
|
*/
|
|
4
4
|
export declare function runClaimAdd(session: string, options: {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
claimFile?: string;
|
|
6
|
+
claimsFile?: string;
|
|
7
7
|
format?: string;
|
|
8
8
|
}): Promise<number>;
|
|
9
9
|
export declare function runClaimList(session: string, options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2BH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC,CA8FjB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
|