@opacedev/astro-ai-content-checker 0.3.1

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 (185) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/LICENSE +9 -0
  3. package/README.md +236 -0
  4. package/SBOM.cdx.json +172 -0
  5. package/SECURITY.md +9 -0
  6. package/THIRD_PARTY_NOTICES.md +36 -0
  7. package/dist/build-report-html.d.ts +3 -0
  8. package/dist/highlight.js +155 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.js +43 -0
  11. package/dist/options.d.ts +21 -0
  12. package/dist/options.js +6 -0
  13. package/dist/receipt.d.ts +15 -0
  14. package/dist/receipt.js +100 -0
  15. package/dist/report.d.ts +55 -0
  16. package/dist/report.js +12 -0
  17. package/dist/sections.js +181 -0
  18. package/dist/share.d.ts +47 -0
  19. package/dist/share.js +72 -0
  20. package/dist/shared-EX54KI6H.js +1503 -0
  21. package/dist/shared-MMXWTX2U.js +43 -0
  22. package/dist/toolbar.js +13478 -0
  23. package/node_modules/@opacedev/ai-content-checker-browser/LICENSE +21 -0
  24. package/node_modules/@opacedev/ai-content-checker-browser/README.md +145 -0
  25. package/node_modules/@opacedev/ai-content-checker-browser/dist/dom/visible-text.d.ts +14 -0
  26. package/node_modules/@opacedev/ai-content-checker-browser/dist/dom/visible-text.js +47 -0
  27. package/node_modules/@opacedev/ai-content-checker-browser/dist/index.d.ts +3 -0
  28. package/node_modules/@opacedev/ai-content-checker-browser/dist/index.js +99 -0
  29. package/node_modules/@opacedev/ai-content-checker-browser/dist/worker/client.d.ts +12 -0
  30. package/node_modules/@opacedev/ai-content-checker-browser/dist/worker/client.js +17 -0
  31. package/node_modules/@opacedev/ai-content-checker-browser/dist/worker/entry.d.ts +1 -0
  32. package/node_modules/@opacedev/ai-content-checker-browser/dist/worker/entry.js +3984 -0
  33. package/node_modules/@opacedev/ai-content-checker-browser/dist/worker/protocol.d.ts +30 -0
  34. package/node_modules/@opacedev/ai-content-checker-browser/dist/worker/protocol.js +1 -0
  35. package/node_modules/@opacedev/ai-content-checker-browser/package.json +60 -0
  36. package/node_modules/@opacedev/ai-content-checker-contracts/LICENSE +21 -0
  37. package/node_modules/@opacedev/ai-content-checker-contracts/README.md +93 -0
  38. package/node_modules/@opacedev/ai-content-checker-contracts/dist/index.d.ts +58 -0
  39. package/node_modules/@opacedev/ai-content-checker-contracts/dist/index.js +17 -0
  40. package/node_modules/@opacedev/ai-content-checker-contracts/package.json +57 -0
  41. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/analysis-request.schema.d.ts +44 -0
  42. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/analysis-result.schema.d.ts +122 -0
  43. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/candidate.schema.d.ts +81 -0
  44. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/capabilities.schema.d.ts +24 -0
  45. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/checker-result.schema.d.ts +342 -0
  46. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/common.schema.d.ts +10 -0
  47. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/envelope.schema.d.ts +14 -0
  48. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/gate-result.schema.d.ts +19 -0
  49. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/integrity-receipt.schema.d.ts +122 -0
  50. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/job.schema.d.ts +188 -0
  51. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/method-result.schema.d.ts +39 -0
  52. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/pattern-finding.schema.d.ts +26 -0
  53. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/protected-span.schema.d.ts +35 -0
  54. package/node_modules/@opacedev/ai-content-checker-contracts/src/generated/rewrite-request.schema.d.ts +65 -0
  55. package/node_modules/@opacedev/ai-content-checker-contracts/src/index.ts +63 -0
  56. package/node_modules/@opacedev/ai-content-checker-contracts/src/semantic-validation.mjs +32 -0
  57. package/node_modules/@opacedev/ai-content-checker-core/LICENSE +21 -0
  58. package/node_modules/@opacedev/ai-content-checker-core/README.md +186 -0
  59. package/node_modules/@opacedev/ai-content-checker-core/dist/bundle.js +4744 -0
  60. package/node_modules/@opacedev/ai-content-checker-core/dist/capabilities.d.ts +16 -0
  61. package/node_modules/@opacedev/ai-content-checker-core/dist/capabilities.js +7 -0
  62. package/node_modules/@opacedev/ai-content-checker-core/dist/diff/diff.d.ts +17 -0
  63. package/node_modules/@opacedev/ai-content-checker-core/dist/diff/diff.js +76 -0
  64. package/node_modules/@opacedev/ai-content-checker-core/dist/fixes/preview.d.ts +27 -0
  65. package/node_modules/@opacedev/ai-content-checker-core/dist/fixes/preview.js +47 -0
  66. package/node_modules/@opacedev/ai-content-checker-core/dist/gates/policy.d.ts +14 -0
  67. package/node_modules/@opacedev/ai-content-checker-core/dist/gates/policy.js +16 -0
  68. package/node_modules/@opacedev/ai-content-checker-core/dist/index.d.ts +15 -0
  69. package/node_modules/@opacedev/ai-content-checker-core/dist/index.js +15 -0
  70. package/node_modules/@opacedev/ai-content-checker-core/dist/inspect.d.ts +8 -0
  71. package/node_modules/@opacedev/ai-content-checker-core/dist/inspect.js +84 -0
  72. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-gb-v1.d.ts +12 -0
  73. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-gb-v1.js +68 -0
  74. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v2-data.d.ts +73 -0
  75. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v2-data.js +499 -0
  76. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v2.d.ts +76 -0
  77. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v2.js +1067 -0
  78. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v3-data.d.ts +165 -0
  79. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v3-data.js +614 -0
  80. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v3.d.ts +19 -0
  81. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v3.js +542 -0
  82. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v4-corpus.d.ts +40 -0
  83. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v4-corpus.js +40 -0
  84. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v4-data.d.ts +138 -0
  85. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v4-data.js +200 -0
  86. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v4.d.ts +71 -0
  87. package/node_modules/@opacedev/ai-content-checker-core/dist/patterns/en-signals-v4.js +388 -0
  88. package/node_modules/@opacedev/ai-content-checker-core/dist/protected/extract.d.ts +17 -0
  89. package/node_modules/@opacedev/ai-content-checker-core/dist/protected/extract.js +75 -0
  90. package/node_modules/@opacedev/ai-content-checker-core/dist/protected/validate.d.ts +3 -0
  91. package/node_modules/@opacedev/ai-content-checker-core/dist/protected/validate.js +17 -0
  92. package/node_modules/@opacedev/ai-content-checker-core/dist/provenance/c2pa-text.d.ts +55 -0
  93. package/node_modules/@opacedev/ai-content-checker-core/dist/provenance/c2pa-text.js +86 -0
  94. package/node_modules/@opacedev/ai-content-checker-core/dist/receipts/build.d.ts +48 -0
  95. package/node_modules/@opacedev/ai-content-checker-core/dist/receipts/build.js +61 -0
  96. package/node_modules/@opacedev/ai-content-checker-core/dist/report/checker-result.d.ts +241 -0
  97. package/node_modules/@opacedev/ai-content-checker-core/dist/report/checker-result.js +419 -0
  98. package/node_modules/@opacedev/ai-content-checker-core/dist/source/offsets.d.ts +34 -0
  99. package/node_modules/@opacedev/ai-content-checker-core/dist/source/offsets.js +51 -0
  100. package/node_modules/@opacedev/ai-content-checker-core/dist/source/utf8.d.ts +3 -0
  101. package/node_modules/@opacedev/ai-content-checker-core/dist/source/utf8.js +58 -0
  102. package/node_modules/@opacedev/ai-content-checker-core/dist/source/visible-text.d.ts +12 -0
  103. package/node_modules/@opacedev/ai-content-checker-core/dist/source/visible-text.js +30 -0
  104. package/node_modules/@opacedev/ai-content-checker-core/dist/unicode/data.d.ts +22 -0
  105. package/node_modules/@opacedev/ai-content-checker-core/dist/unicode/data.js +137 -0
  106. package/node_modules/@opacedev/ai-content-checker-core/dist/unicode/inspect.d.ts +16 -0
  107. package/node_modules/@opacedev/ai-content-checker-core/dist/unicode/inspect.js +84 -0
  108. package/node_modules/@opacedev/ai-content-checker-core/dist/verdict/combine.d.ts +162 -0
  109. package/node_modules/@opacedev/ai-content-checker-core/dist/verdict/combine.js +501 -0
  110. package/node_modules/@opacedev/ai-content-checker-core/package.json +62 -0
  111. package/node_modules/canonicalize/LICENSE +201 -0
  112. package/node_modules/canonicalize/README.md +65 -0
  113. package/node_modules/canonicalize/bin/canonicalize.js +17 -0
  114. package/node_modules/canonicalize/lib/canonicalize.d.ts +2 -0
  115. package/node_modules/canonicalize/lib/canonicalize.js +74 -0
  116. package/node_modules/canonicalize/package.json +64 -0
  117. package/node_modules/entities/LICENSE +11 -0
  118. package/node_modules/entities/lib/decode.d.ts +211 -0
  119. package/node_modules/entities/lib/decode.d.ts.map +1 -0
  120. package/node_modules/entities/lib/decode.js +536 -0
  121. package/node_modules/entities/lib/decode.js.map +1 -0
  122. package/node_modules/entities/lib/decode_codepoint.d.ts +19 -0
  123. package/node_modules/entities/lib/decode_codepoint.d.ts.map +1 -0
  124. package/node_modules/entities/lib/decode_codepoint.js +76 -0
  125. package/node_modules/entities/lib/decode_codepoint.js.map +1 -0
  126. package/node_modules/entities/lib/encode.d.ts +22 -0
  127. package/node_modules/entities/lib/encode.d.ts.map +1 -0
  128. package/node_modules/entities/lib/encode.js +77 -0
  129. package/node_modules/entities/lib/encode.js.map +1 -0
  130. package/node_modules/entities/lib/escape.d.ts +43 -0
  131. package/node_modules/entities/lib/escape.d.ts.map +1 -0
  132. package/node_modules/entities/lib/escape.js +122 -0
  133. package/node_modules/entities/lib/escape.js.map +1 -0
  134. package/node_modules/entities/lib/esm/decode.d.ts +211 -0
  135. package/node_modules/entities/lib/esm/decode.d.ts.map +1 -0
  136. package/node_modules/entities/lib/esm/decode.js +496 -0
  137. package/node_modules/entities/lib/esm/decode.js.map +1 -0
  138. package/node_modules/entities/lib/esm/decode_codepoint.d.ts +19 -0
  139. package/node_modules/entities/lib/esm/decode_codepoint.d.ts.map +1 -0
  140. package/node_modules/entities/lib/esm/decode_codepoint.js +71 -0
  141. package/node_modules/entities/lib/esm/decode_codepoint.js.map +1 -0
  142. package/node_modules/entities/lib/esm/encode.d.ts +22 -0
  143. package/node_modules/entities/lib/esm/encode.d.ts.map +1 -0
  144. package/node_modules/entities/lib/esm/encode.js +69 -0
  145. package/node_modules/entities/lib/esm/encode.js.map +1 -0
  146. package/node_modules/entities/lib/esm/escape.d.ts +43 -0
  147. package/node_modules/entities/lib/esm/escape.d.ts.map +1 -0
  148. package/node_modules/entities/lib/esm/escape.js +116 -0
  149. package/node_modules/entities/lib/esm/escape.js.map +1 -0
  150. package/node_modules/entities/lib/esm/generated/decode-data-html.d.ts +3 -0
  151. package/node_modules/entities/lib/esm/generated/decode-data-html.d.ts.map +1 -0
  152. package/node_modules/entities/lib/esm/generated/decode-data-html.js +7 -0
  153. package/node_modules/entities/lib/esm/generated/decode-data-html.js.map +1 -0
  154. package/node_modules/entities/lib/esm/generated/decode-data-xml.d.ts +3 -0
  155. package/node_modules/entities/lib/esm/generated/decode-data-xml.d.ts.map +1 -0
  156. package/node_modules/entities/lib/esm/generated/decode-data-xml.js +7 -0
  157. package/node_modules/entities/lib/esm/generated/decode-data-xml.js.map +1 -0
  158. package/node_modules/entities/lib/esm/generated/encode-html.d.ts +8 -0
  159. package/node_modules/entities/lib/esm/generated/encode-html.d.ts.map +1 -0
  160. package/node_modules/entities/lib/esm/generated/encode-html.js +10 -0
  161. package/node_modules/entities/lib/esm/generated/encode-html.js.map +1 -0
  162. package/node_modules/entities/lib/esm/index.d.ts +96 -0
  163. package/node_modules/entities/lib/esm/index.d.ts.map +1 -0
  164. package/node_modules/entities/lib/esm/index.js +99 -0
  165. package/node_modules/entities/lib/esm/index.js.map +1 -0
  166. package/node_modules/entities/lib/esm/package.json +1 -0
  167. package/node_modules/entities/lib/generated/decode-data-html.d.ts +3 -0
  168. package/node_modules/entities/lib/generated/decode-data-html.d.ts.map +1 -0
  169. package/node_modules/entities/lib/generated/decode-data-html.js +9 -0
  170. package/node_modules/entities/lib/generated/decode-data-html.js.map +1 -0
  171. package/node_modules/entities/lib/generated/decode-data-xml.d.ts +3 -0
  172. package/node_modules/entities/lib/generated/decode-data-xml.d.ts.map +1 -0
  173. package/node_modules/entities/lib/generated/decode-data-xml.js +9 -0
  174. package/node_modules/entities/lib/generated/decode-data-xml.js.map +1 -0
  175. package/node_modules/entities/lib/generated/encode-html.d.ts +8 -0
  176. package/node_modules/entities/lib/generated/encode-html.d.ts.map +1 -0
  177. package/node_modules/entities/lib/generated/encode-html.js +12 -0
  178. package/node_modules/entities/lib/generated/encode-html.js.map +1 -0
  179. package/node_modules/entities/lib/index.d.ts +96 -0
  180. package/node_modules/entities/lib/index.d.ts.map +1 -0
  181. package/node_modules/entities/lib/index.js +126 -0
  182. package/node_modules/entities/lib/index.js.map +1 -0
  183. package/node_modules/entities/package.json +90 -0
  184. package/node_modules/entities/readme.md +122 -0
  185. package/package.json +91 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,138 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@opacedev/astro-ai-content-checker` are recorded here.
4
+
5
+ ## 0.3.1 - 2026-09-04
6
+
7
+ - **Section rows open in place.** Each section's deep dive now lives inside its own score row
8
+ instead of further down the panel: one row open at a time, the open row's header pinned under a
9
+ sticky strip reading "Section n of m · level · score" with previous, next and close. The strip
10
+ prints the row's own level and score rather than recomputing them, so the two can never disagree.
11
+ - **The chosen section is tinted on the page being previewed.** The visible-text projection already
12
+ records, for every text node, the window it occupies in the string the model read, so a section's
13
+ UTF-16 offsets map back to DOM ranges by arithmetic rather than by re-matching text. The passage
14
+ is wrapped in marked spans in the band colour and scrolled into view; a passage that runs across
15
+ inline elements simply takes one mark per text node. The page's text is never altered, form
16
+ controls and editable regions are left alone, and every mark comes back off on deselect, on a
17
+ close, on a view change, on the next run and when the panel closes.
18
+ - **A section is never called selected without a visible tint.** The strip says how many passages
19
+ were tinted, and says plainly when the passage could not be found on the page as it is now.
20
+ - **Share is the shared share sheet.** "Share this result", on the reading and on the Receipts tab,
21
+ opens the website's own dialog — copy result link, email, more apps on this device, LinkedIn,
22
+ Facebook, X, WhatsApp — carrying the content-free result link. The levels, section scores, word
23
+ count, date and model version ride in the URL fragment, which a browser never sends to a server.
24
+ The page text is not in it. It replaces the button that only copied a text summary.
25
+ - The three bundled runtime packages move with the developer set to `0.3.1`:
26
+ `@opacedev/ai-content-checker-browser`, `-contracts` and `-core`. The vendored tarballs, the
27
+ lock file, the SBOM and the third-party notices all name them.
28
+
29
+ ## 0.3.0 - 2026-09-03
30
+
31
+ - **Renamed.** The package is now `@opacedev/astro-ai-content-checker`; it was
32
+ `@opace/astro-content-integrity`. Nothing was published under the old name, so there is no
33
+ redirect and nothing to migrate.
34
+ - The product is named **Opace AI Content Checker & Detector** everywhere a reader sees it: the
35
+ toolbar app in Astro's own rail reads **Opace AI Content Checker & Detector for Astro**, and the
36
+ panel masthead, the tab-rail label, the build log line, the printable report title and the share
37
+ summary all carry the full product name. "Content integrity" is kept only where it describes the
38
+ three-axis reading, never as the product name.
39
+ - The three bundled runtime packages moved to the renamed developer set at `0.3.0`:
40
+ `@opacedev/ai-content-checker-browser`, `-contracts` and `-core`. The vendored tarballs, the
41
+ lock file, the SBOM and the third-party notices all name them.
42
+ - npm keywords are now `astro-integration`, `astro`, `withastro`, `ai-checker`, `ai-detector`,
43
+ `ai-content-checker`, `devtools`, `dev-toolbar`, `privacy`. `astro-integration` stays first
44
+ because the Astro catalogue ingests on it.
45
+
46
+ Nothing about behaviour changed: the same two on-device routes, the same explicit run, the same
47
+ button that names the download, the same 50,000-character refusal, the same content-free receipt
48
+ and share, and the same five tabs.
49
+
50
+ ## 0.2.2 - 2026-09-04
51
+
52
+ - **Redrew the panel shell.** The chrome around the reading now speaks the same premium language as
53
+ the WordPress Lab: a layered panel shadow with a hairline orange rule under the masthead, the
54
+ colour logo tile, a recessed tab rail with one unmistakable active tab, raised cards on a 4-point
55
+ spacing scale, and one dominant orange primary button that lifts under the pointer.
56
+ - Route choices are selectable tiles with a coloured left rail and status pills — Recommended and
57
+ Private, no limit on the on-device route, No AI reading on the quick route — so what choosing a
58
+ route means is legible before it is chosen.
59
+ - Every notice now carries a mark and a way out: the held-back reading offers to change how the page
60
+ is read, and the no-rewriting panel opens the Check page.
61
+ - Empty panels are drawn rather than left blank: the reading, the patch preview and the receipts tab
62
+ each say what will appear there and what to do first.
63
+ - The shell answers dark mode through the same token names the shared result stylesheet uses, so the
64
+ chrome and the reading flip together instead of one going dark on its own. Reduced motion still
65
+ collapses every transition, and forced colours keep every edge.
66
+ - **Fixed a false refusal.** Opening the printable report used `window.open(..., 'noopener')`, which
67
+ always returns null, so the panel told every developer their browser had blocked a report that was
68
+ sitting open in the next tab. The handle is taken and its `opener` severed instead: the same
69
+ boundary, and a status line that says what actually happened.
70
+
71
+ ## 0.2.1 - 2026-09-03
72
+
73
+ - **Removed the separate download tick box.** The primary button now says what pressing it will do,
74
+ and pressing it is the consent: with no verified model on the machine it reads "Download model and
75
+ check" and carries the 34.5 MB size and the published SHA-256 prefix beside it, with the data-file
76
+ explanation kept as a note underneath; once the model is cached it reads "Check this page" and
77
+ downloads nothing. Progress, cancellation and "Clear the 34.5 MB model file" are unchanged.
78
+ - A cached model that has gone, or that fails its pinned hash, is now a refusal rather than a silent
79
+ 34.5 MB download: the reading is held back, the button offers the download again, and the reason is
80
+ written out.
81
+ - Named the product the way the website does, everywhere a person can read it: the Dev Toolbar entry
82
+ is **Opace AI Content Checker & Detector**, the tab rail and the build log line say the same, and no surface
83
+ says a bare "Content Integrity".
84
+
85
+ ## 0.2.0 - 2026-09-02
86
+
87
+ - Rebuilt the toolbar panel in the product's visual language: paper canvas, white panels, the Opace
88
+ orange, the five named bands, the real logo, "Evidence, not guarantees", and the Outfit and Plus
89
+ Jakarta Sans OFL subsets bundled as data URLs so the panel needs no network for its typography.
90
+ - Adopted the shared Opace result presentation, so the toolbar draws the same reading as the website
91
+ checker: the five-band dial, the level and its meaning, the strongest section, section score bars,
92
+ a deep dive per section with the passage, the measured word re-use and editing advice, the three
93
+ independent result axes, the named checks, what the reading means and does not mean, the certainty
94
+ disclosure and the run record. A score is always a zero-to-one pattern reading, never a percentage.
95
+ - Named the two routes plainly — "On this device" (recommended) and "Quick checks only" — and said
96
+ where the consented EU server route actually lives, rather than implying the toolbar has one.
97
+ - Said plainly what the 34.5 MB download is: a data file of model weights, not a program, which
98
+ cannot execute, is compared against the published SHA-256 before use, is stored in the browser
99
+ cache like any other web asset, and is cleared with one click. The consent card and Settings both
100
+ show the size and the first eight characters of that hash.
101
+ - Replaced the toolbar-rail icon with a single-colour line glyph, so it sits with Astro's own white
102
+ rail icons instead of dropping a colour tile into their row. The full-colour product mark stays in
103
+ the panel masthead.
104
+ - Gave every tab a one-line plain-English description of what it does, and an honest body where a
105
+ feature is not in this release.
106
+ - Renamed "Protect & rewrite" to **Protect & fix** — removing invisible Unicode is the only fix that
107
+ ships, and the tab now says so in its first line.
108
+ - **Removed the Index tab.** It only ever rendered "Planned, not built", and an empty placeholder
109
+ reads as a broken feature.
110
+ - Added the too-short, offline, model-error and withheld states, a cancellable download with
111
+ progress, and a plain-English status line that never depends on colour.
112
+ - Added three exports beside a complete reading: the shared branded printable report in a new tab —
113
+ the same document the Node CLI and the WordPress plugin produce — a content-free JSON receipt
114
+ covering the exact result, and a content-free share summary whose fragment the website checker
115
+ can open.
116
+ - **Fixed:** the inspection Worker never started in an installed consumer project. It was fetched as
117
+ a separate file, and a host dev server refuses a path outside the consumer's own directory — which
118
+ is where an installed dependency always is. The worker is now bundled into the toolbar and started
119
+ from a blob URL.
120
+ - Restyled the unattended build scan's printable page with the shared stylesheet, labelled it a
121
+ deterministic build scan, and added the three-axis block with the AI-pattern reading honestly
122
+ `not_assessed`.
123
+ - Raised the three bundled Opace packages to 0.2.0 — `@opacedev/ai-content-checker-contracts`,
124
+ `@opacedev/ai-content-checker-core` and `@opacedev/ai-content-checker-browser` — so the integration closes
125
+ over the same released bytes as the CLI and the client, and pinned each of them exactly.
126
+ - No change to the explicit run, the 50,000-character refuse-not-truncate rule, the ten-second worker
127
+ timeout, the browser-storage boundary or the report path containment.
128
+
129
+ ## 0.1.0 - 2026-08-26
130
+
131
+ - Added one development-only Astro Dev Toolbar app with six internal evidence and settings views.
132
+ - Added explicit Worker-based visible-page inspection with no initial scan or outbound request.
133
+ - Added deterministic, hash-only JSON and printable HTML build reports for approved prerendered routes.
134
+ - Added reviewed safe-fix patch previews without automatic source writes.
135
+ - Added strict option validation, output-path containment and production-toolbar isolation.
136
+ - Added Astro 5, 6 and 7 static/server/hybrid compatibility coverage.
137
+ - Added keyboard, reduced-motion, responsive and automated accessibility checks.
138
+ - Kept Anthropic official verification `unsupported`, the Index `Not configured`, and model/provider/local-service lanes disabled.
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Opace Digital Agency
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,236 @@
1
+ # Opace AI Content Checker & Detector for Astro
2
+
3
+ The interactive Dev Toolbar panel is the full checker: it reads the page you are previewing with the pinned Cycle-5 model, on your own machine, after you press the button that says it will download the model. You get the same five-band reading, section scores, passages, evidence and printable report as the Opace checker on the web, in the same visual language.
4
+
5
+ The unattended build scan is a different thing and says so on its own page. It is deterministic build support: no model runs, nothing is sent anywhere, no page text is written, and the AI-pattern reading stays `not_assessed`. Neither the toolbar nor the build scan claims to determine authorship, and neither writes to your source files.
6
+
7
+ ![Astro AI content checker showing section two, its score and evidence, with matching passages highlighted on the previewed page](https://raw.githubusercontent.com/OpaceDigitalAgency/opace-ai-content-checker-detector/main/docs/assets/screenshots/astro-ai-content-checker-section-evidence.png)
8
+
9
+ The current Dev Toolbar connects each scored section to its passage on the page. This genuine demonstration capture shows a model reading, not a verified authorship judgement.
10
+
11
+ ## Free AI content checker for Astro websites
12
+
13
+ Review blog articles, documentation and landing-page copy while previewing your Astro site. The Dev Toolbar places an on-device AI content detector beside the rendered page, so you can inspect text without copying it into an external service. Choose a scored section to highlight the matching passage on the preview.
14
+
15
+ This is useful during editorial QA before deployment. The integration does not rewrite source files, add a production visitor widget or claim that an AI score predicts search rankings.
16
+
17
+ ## New in 0.3.1
18
+
19
+ The current toolbar includes expandable section evidence, passage highlighting, section navigation and the shared result-link sheet. Its printable report uses the same section evidence as the reading. This documentation revision adds clearer examples, use cases and privacy guidance without changing the model.
20
+
21
+ ## AI writing detection and deterministic build checks
22
+
23
+ Use the interactive model route for an AI-pattern reading of ChatGPT, Claude, Gemini or other AI-assisted text, with the published limitations. Use quick checks for invisible characters, lookalike letters, protected spans and editorial suggestions. A score is not an authorship percentage, and the tool does not identify a text's generator.
24
+
25
+ The unattended build scan inspects prerendered HTML using deterministic checks only. It writes content-free records for review; it does not run an AI detector, score dynamic SSR pages or fail the build in this version.
26
+
27
+ ## Astro AI detector questions
28
+
29
+ **Is it free?** The integration is MIT licensed, with no subscription or provider API key. On-device inference uses your computer and downloads verified assets after consent.
30
+
31
+ **Does it slow down the public site?** The toolbar runs during development and is absent from production output. The separate build report contains no toolbar runtime.
32
+
33
+ **Can it check private drafts?** Page text stays in the browser on both toolbar routes. Model downloads contact the fixed asset host. Full printable reports include scored passages; shared links and receipts omit them.
34
+
35
+ **Can I run it in CI as an AI gate?** The build scan is report-only and model-free. Review its findings as engineering evidence; do not treat a successful build as proof of human writing.
36
+
37
+ **Does it detect plagiarism?** No. It does not search for copied sources. Use the model reading, text checks and your editorial review for their separate purposes.
38
+
39
+ [Try the online AI checker](https://opace.agency/tools/ai/content-verification-integrity/checker/) · [GitHub source and issues](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector) · [Opace web development](https://opace.agency/services/web-design/) · [Related Opace tool suites](https://opace.agency/tools/suite/)
40
+
41
+ ## What it includes
42
+
43
+ - One development-only toolbar app with five tabs — Check page, Protect & fix, Claude readiness, Receipts and Settings — each opening with one plain line saying what it does. A tab with nothing behind it is not shipped as a tab.
44
+ - The complete reading, drawn by the shared Opace presentation: the five-band dial, the level and what it means, the strongest section, section score bars, a deep dive per section with the passage, the measured word re-use, the tell in your own sentences and editing advice, the three independent result axes, every named check, what the reading means and does not mean, how certain it is, and the run record.
45
+ - Two routes, both on your machine: the on-device Cycle-5 model, downloaded only when you press a button that says so, or the quick deterministic checks with the AI-pattern reading honestly left unread.
46
+ - Explicit, user-triggered inspection. Nothing scans at install, on start-up or on page load.
47
+ - Three exports beside a complete reading: the shared branded printable report in its own tab — the same document the Opace CLI and WordPress plugin produce — a content-free JSON receipt and a content-free share summary.
48
+ - Local safe-fix previews for explainable invisible Unicode, and nothing else: **Protect & fix** says in its first line that removing invisible characters is the only fix that ships. Patches are exported for you to read and are never applied to your source files.
49
+ - Honest unavailable states. Anthropic's own text-watermark verifier remains `unsupported`, and where a feature is not in this release the tab body says so plainly rather than looking broken.
50
+ - Keyboard navigation, visible focus, reduced motion, forced colours, narrow-panel reflow and status text that never depends on colour alone.
51
+ - A panel that answers your system theme. Light and dark are both drawn from the same token names the shared result stylesheet uses, so the chrome and the reading change together.
52
+ - No network request for anything the panel draws. The Outfit and Plus Jakarta Sans OFL subsets, the logo, the stylesheet and the inspection worker are all bundled.
53
+
54
+ ## Install
55
+
56
+ After the package is published, Astro can add it automatically:
57
+
58
+ ```sh
59
+ npx astro add @opacedev/astro-ai-content-checker
60
+ ```
61
+
62
+ For manual setup:
63
+
64
+ ```sh
65
+ npm install @opacedev/astro-ai-content-checker
66
+ ```
67
+
68
+ ```js
69
+ import { defineConfig } from 'astro/config';
70
+ import contentIntegrity from '@opacedev/astro-ai-content-checker';
71
+
72
+ export default defineConfig({
73
+ integrations: [contentIntegrity()],
74
+ });
75
+ ```
76
+
77
+ Start `astro dev`, open Astro's Dev Toolbar and choose **Opace AI Content Checker & Detector**. Choose a route, then press the button. With no verified model on the machine it reads **Download model and check** and shows the 34.5 MB size and the published hash beside it; once the model is cached it reads **Check this page** and downloads nothing. Nothing runs, and nothing downloads, until you press it.
78
+
79
+ ## Configuration
80
+
81
+ The unattended build defaults are offline, report-only and content-free. The interactive toolbar is configured by the person using it, not by this file:
82
+
83
+ ```js
84
+ contentIntegrity({
85
+ toolbar: true,
86
+ buildCheck: 'report',
87
+ failOn: ['protected_fact_changed'],
88
+ localService: false,
89
+ include: ['**/*.html'],
90
+ exclude: ['**/404.html', '**/500.html', '**/feed*.html', '**/search*.html', '**/sitemap*.html'],
91
+ reportDirectory: 'content-integrity-report',
92
+ maxCharacters: 50_000,
93
+ })
94
+ ```
95
+
96
+ | Option | Default | Behaviour |
97
+ |---|---|---|
98
+ | `toolbar` | `true` | Registers one app during `astro dev`; no production toolbar runtime is emitted. |
99
+ | `buildCheck` | `'report'` | Writes deterministic reports and never fails the build. Other values fail closed in 0.3.1. |
100
+ | `failOn` | `['protected_fact_changed']` | Reserved deterministic hard-gate list; it does not enable build failure in 0.3.1. |
101
+ | `localService` | `false` | Must remain `false`; no service or provider client ships in this release. |
102
+ | `include` / `exclude` | safe relative globs | Limits prerendered HTML considered at build time. Absolute and traversing paths are rejected. |
103
+ | `reportDirectory` | `'content-integrity-report'` | Relative directory beneath Astro's output directory; symlink escapes are rejected. |
104
+ | `maxCharacters` | `50_000` | Upper bound for one rendered document at build time. The toolbar refuses a longer page rather than trimming it. |
105
+
106
+ Unknown options, wrong types, unsafe paths, secret-shaped values, `buildCheck: 'fail'` and `localService: true` raise an actionable configuration error.
107
+
108
+ ## The model file
109
+
110
+ The on-device route downloads one 34.5 MB file the first time you use it. It is worth being precise about what that file is.
111
+
112
+ It is a **data file of model weights** — a large table of numbers the checker reads. It is not a program, and it cannot execute anything on your machine. Before any of it is used, every byte is compared against the published SHA-256 `9f57d6a8…` (in full: `9f57d6a8fe48a329170c5272f4f09a08ed383f9f461e7900fecd70f9fb15ef1b`), and a file that does not match is thrown away rather than run. It comes from one fixed HTTPS base, it is stored in the browser cache like any other web asset, the download can be cancelled while it runs, and one click in Settings clears it again. A 14–26 MB browser runtime is fetched alongside it and verified the same way.
113
+
114
+ There is no separate tick box. The button itself says whether pressing it will download the model, and the size and the first eight characters of that hash sit beside it with this explanation as a note, before anything is fetched. Settings shows them again beside the clear button.
115
+
116
+ ## Privacy and security
117
+
118
+ Deterministic page inspection runs in a module Worker with no network request; the worker is bundled into the toolbar and started from a blob, so no dev server has to serve it. The on-device Cycle-5 choice downloads the pinned model, vocabulary and browser runtime from one fixed HTTPS base only after you press a button that says it will, verifies every byte against a pinned hash before anything runs, can be cancelled mid-download and can be cleared again from Settings. On the deterministic route the worker makes no network request at all, and on the on-device route the only request is the pinned model download, so page text is not sent to Opace or to any other recipient on either route. Results and page text are not placed in cookies, local storage, session storage or IndexedDB; only the verified model files use the browser cache. Reloading clears the result. Receipts and share summaries carry hashes, counts, levels and scores, never page text, a page URL or a route path. If an asset request is blocked, the route reports the failure and leaves the AI-pattern reading unassessed.
119
+
120
+ The default build report contains hashes, counts, method identifiers, limitations and opaque source-relative IDs. It excludes page text, routes, filesystem paths, tokens and toolbar code. Review [SECURITY.md](SECURITY.md) before reporting a vulnerability; do not include private content or credentials in an issue.
121
+
122
+ ## Compatibility
123
+
124
+ Version 0.1.0 passed Astro 5.18.2, 6.4.8 and 7.2.7 in static, server and hybrid projects; 0.2.0, 0.2.1, 0.2.2, 0.3.0 and 0.3.1 are re-proved against Astro 7.2.7 static and server consumers and inherit that matrix pending a renewed full sweep. Astro 5 passed on Node 20, 22 and 24; Astro 6 and 7 passed on Node 22 and 24 and follow their upstream Node 22.12 minimum. The package peer range is `>=5.0.0 <8.0.0` and its own Node floor is 20.3.
125
+
126
+ Dynamic SSR pages without prerendered HTML are not included in the build report. Inspect them explicitly in the development toolbar.
127
+
128
+ ## Accessibility
129
+
130
+ The five views use a roving tab pattern: Left/Right moves between tabs, focus stays on the selected tab, and each state has visible text. Section rows in a reading are real disclosure buttons. Controls have accessible names and focus indicators, run progress is announced politely, and no band is carried by colour alone — every band prints its own name. Automated Chromium checks cover the keyboard journey, reduced motion, forced colours, 375 px reflow and axe at every state. Platform assistive-technology results are recorded separately from automated checks.
131
+
132
+ ## Troubleshooting
133
+
134
+ **The toolbar app is missing.** Confirm `toolbar` is not `false`, restart `astro dev`, and check that the integration is in `integrations[]`. It is intentionally absent from preview and production output.
135
+
136
+ **No route appears in the build report.** Check `include`/`exclude` and confirm the route is prerendered. Runtime-only SSR pages use the toolbar instead.
137
+
138
+ **Configuration fails after an upgrade.** Remove unknown or held options. This release deliberately rejects local-service and build-failure modes.
139
+
140
+ **The model will not download.** The fixed model base must answer with a CORS header for a browser to read it. If that request fails, the on-device route reports the failure and leaves the AI-pattern reading unread; quick checks still run.
141
+
142
+ **A private EU server route.** The toolbar does not have one. Both of its routes stay on your machine. The consented EU server route is offered in the Opace WordPress plugin and Chrome extension.
143
+
144
+ ## Support, evidence and licence
145
+
146
+ - Product documentation: [Opace AI Content Checker & Detector for Astro](https://opace.agency/tools/ai/content-verification-integrity/astro-integration/)
147
+ - Privacy: [Opace AI Content Checker & Detector privacy](https://opace.agency/privacy-policy/)
148
+ - Support: [Opace AI Content Checker & Detector support](https://opace.agency/get-in-touch/)
149
+ - AI services: [Opace artificial intelligence services](https://opace.agency/services/artificial-intelligence/)
150
+ - Source and issues: [Opace Digital Agency on GitHub](https://github.com/OpaceDigitalAgency)
151
+ - Security policy: [SECURITY.md](SECURITY.md)
152
+ - Third-party notices: [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)
153
+ - Software bill of materials: [SBOM.cdx.json](SBOM.cdx.json)
154
+
155
+ Opace-authored integration code is available under the [MIT Licence](LICENSE). A passing check applies only to the named disclosed method and does not prove human authorship or detector clearance.
156
+
157
+ ## Attribution
158
+
159
+ This engine was built on existing open-source work by deliberate choice, so the projects it
160
+ stands on are named here rather than only in a licence file.
161
+
162
+ - [avoid-ai-writing](https://github.com/conorbronsdon/avoid-ai-writing) — MIT, Conor Bronsdon and contributors. 46 of the 51 v2 writing-pattern rule categories, the stylometric methods, the weights and the classifier logic, adapted to TypeScript, plus Cyrillic and Greek lookalike map data. One upstream bug was fixed in the port.
163
+ - [watermarks-remover](https://github.com/guillaumemeyer/watermarks-remover) — MIT, Guillaume Meyer. The invisible-character and space-substitute carrier tables and the explicit-carrier inspection model. Table data only; no upstream code is distributed.
164
+ - [Unicode Consortium character data](https://www.unicode.org/Public/UCD/latest/) — Unicode licence. The 415-code-point carrier inventory across 38 rules and the 60-entry confusable set.
165
+ - [antislop-sampler](https://github.com/sam-paech/antislop-sampler) — Apache-2.0, Sam Paech. Fiction phrase and over-represented name data behind the `fiction-slop-phrase` and `fiction-promptonym` rules.
166
+ - [slop-forensics](https://github.com/sam-paech/slop-forensics) — MIT, Sam Paech. Per-model observations corroborating the fiction-lane rules.
167
+ - [SLOP_Detector](https://github.com/SicariusSicariiStuff/SLOP_Detector) — Apache-2.0, SicariusSicariiStuff. The graded penalty-class weighting approach.
168
+ - [slop-gate](https://github.com/hwajongpark/slop-gate) — MIT, hwajongpark. Promotional-register and buzz-phrase pattern data.
169
+ - [anti-ai-writing](https://github.com/avectats7/anti-ai-writing) — MIT, avectats7. Buzz-phrase and weak-verb observation data.
170
+ - [anti-slop](https://github.com/kjmagnan1s/anti-slop) — MIT, kjmagnan1s. Faux-insight phrase data and the protect-list and context-profile design.
171
+ - [claude-slop-detector](https://github.com/aplaceforallmystuff/claude-slop-detector) — MIT, aplaceforallmystuff. Staccato-fragment and tripled-negation observations.
172
+ - [Wikipedia, *Signs of AI writing*](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) — CC BY-SA 4.0. Editorial guidance independently re-expressed with no verbatim excerpts, credited as the licence requires.
173
+ - [Project Gutenberg](https://www.gutenberg.org) public-domain texts, all published before 1929 — the embedded human-prose reference corpus behind the rhythm and register signals.
174
+ - [canonicalize](https://github.com/cyberphone/json-canonicalization) — Apache-2.0. RFC 8785 canonicalisation.
175
+ - Published academic findings by Liang et al. (ICML 2024), Kobak et al. (*Science Advances* 2025), Juzek & Ward (COLING 2025), Reinhart et al. (PNAS 2025), Geng & Trotta (2024) and Pew Research (2026), used as rule thresholds and lexicon facts.
176
+
177
+ Several well-known detector repositories were cloned and read during the research phase and are
178
+ credited as exactly that — read, not used. Nothing in this package derives from `fast-detect-gpt`,
179
+ `Binoculars`, `RADAR`, `DIPPER`, `ai-detector-bench`, `BIRA`, `SIRA` or `MarkLLM`.
180
+
181
+ Full records, with versions, snapshot commits and file-level destinations:
182
+ [THIRD_PARTY_NOTICES.md](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector/blob/main/THIRD_PARTY_NOTICES.md) ·
183
+ [DEPENDENCY-LEDGER.md](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector/blob/main/docs/legal/DEPENDENCY-LEDGER.md).
184
+
185
+ ## Where this is weakest, measured
186
+
187
+ This package does not bundle the trained model. Its interactive toolbar can download and verify the
188
+ pinned Cycle-5 int8 artefact after explicit consent, while its deterministic route and unattended
189
+ build scan never produce an AI-pattern reading. The model results below apply only when the trained
190
+ model actually ran.
191
+
192
+ **The writing rules are editorial feedback, not detection.** On 922 machine and 1,200 held-out
193
+ human long-form documents, they detect 45.1% of machine writing while flagging **24.8% of human
194
+ writing** — one human document in four. `computeEditorialSignals` returns a writing score, never
195
+ an authorship reading, and must not be presented as one.
196
+
197
+ The deployed Cycle 5 model (`tier3-cycle5-v1`, margin rule
198
+ `max(m1, m2+0.34) >= 3.571`) was measured separately through both live runtimes on the full
199
+ 5,558-document long-form evaluation corpus. That corpus is not wholly independent: 654/922 AI
200
+ documents are independent of every Cycle 2 split and 268 are not; 11/4,636 human documents
201
+ overlap. The separate topic-matched held-out slice is the independent evasion measurement.
202
+
203
+ | Cycle 5 measurement | result | denominator and runtime |
204
+ |---|---:|---|
205
+ | AI documents flagged | **97.8%** | 902/922, EU server fp32 |
206
+ | human documents wrongly flagged | **0.99%** | 46/4,636, EU server fp32 |
207
+ | AI documents flagged | **97.6%** | 900/922, browser int8 |
208
+ | human documents wrongly flagged | **1.57%** | 73/4,636, browser int8 |
209
+ | topic-matched held-out AI flagged | **86.9%** | 153/176, server evaluation route |
210
+ | structured human partners wrongly flagged | **0.2%** | 1/418, server evaluation route |
211
+ | human fiction wrongly flagged | **3.1% / 3.5%** | 7/227 server / 8/227 browser |
212
+ | held-out 100-word AI flagged | **76.8%** | 43/56, server evaluation route |
213
+ | heavy AI edits of human originals flagged | **28.5%** | 39/137, server evaluation view |
214
+ | academic human documents wrongly flagged | **0.8%** | 15/1,992, server evaluation view |
215
+
216
+ The 100-word cell is small, fiction remains higher-risk than the overall human set, and treating
217
+ heavy AI edits as machine-assisted is a product boundary rather than proof of authorship. Do not
218
+ use a result for an academic misconduct decision about one student.
219
+
220
+ *Historical, not current:* Cycle 2 (`tier3-cycle2-v1`, live 28 August – 1 September 2026) produced
221
+ the earlier 883/922 server, 889/922 browser, 45/4,636 server-human and 90/4,636 browser-human
222
+ figures. Its fiction and length rows are retired and must not be mixed with Cycle 5.
223
+
224
+ Complete list with sources: [Honest limitations](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector#honest-limitations).
225
+
226
+ ## Evidence
227
+
228
+ Every accuracy figure this project publishes is measured, carries its denominator and names its
229
+ source report. The six result charts, the per-register detection and false-positive tables and the
230
+ complete weakness list are on the [repository front page](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector#what-it-measures-and-where-it-fails).
231
+
232
+ - [Capability register](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector/blob/main/docs/CAPABILITIES.md) — the exhaustive technical inventory
233
+ - [Evidence index](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector/blob/main/docs/EVIDENCE-INDEX.md) — every test result and research artefact, with paths
234
+ - [Test evidence](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector/blob/main/docs/TEST-EVIDENCE.md) — verbatim suite totals and the current-model appendix
235
+ - [Route parity](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector/blob/main/docs/measurements/ROUTE-PARITY.md) — browser int8 against server fp32, all disagreements written out
236
+ - [Honest limitations](https://github.com/OpaceDigitalAgency/opace-ai-content-checker-detector#honest-limitations) — where the tool is weakest, ranked, with denominators
package/SBOM.cdx.json ADDED
@@ -0,0 +1,172 @@
1
+ {
2
+ "bomFormat": "CycloneDX",
3
+ "specVersion": "1.6",
4
+ "serialNumber": "urn:uuid:930aa4c2-223a-4a6f-a0a8-f0eef6fa167d",
5
+ "version": 1,
6
+ "metadata": {
7
+ "timestamp": "2026-09-04T00:00:00Z",
8
+ "component": {
9
+ "type": "library",
10
+ "bom-ref": "pkg:npm/%40opacedev/astro-ai-content-checker@0.3.1",
11
+ "name": "@opacedev/astro-ai-content-checker",
12
+ "version": "0.3.1",
13
+ "licenses": [
14
+ {
15
+ "license": {
16
+ "id": "MIT"
17
+ }
18
+ }
19
+ ],
20
+ "purl": "pkg:npm/%40opacedev/astro-ai-content-checker@0.3.1"
21
+ }
22
+ },
23
+ "components": [
24
+ {
25
+ "type": "library",
26
+ "bom-ref": "pkg:npm/%40opacedev/ai-content-checker-browser@0.3.1",
27
+ "name": "@opacedev/ai-content-checker-browser",
28
+ "version": "0.3.1",
29
+ "licenses": [
30
+ {
31
+ "license": {
32
+ "id": "MIT"
33
+ }
34
+ }
35
+ ],
36
+ "purl": "pkg:npm/%40opacedev/ai-content-checker-browser@0.3.1"
37
+ },
38
+ {
39
+ "type": "library",
40
+ "bom-ref": "pkg:npm/%40opacedev/ai-content-checker-contracts@0.3.1",
41
+ "name": "@opacedev/ai-content-checker-contracts",
42
+ "version": "0.3.1",
43
+ "licenses": [
44
+ {
45
+ "license": {
46
+ "id": "MIT"
47
+ }
48
+ }
49
+ ],
50
+ "purl": "pkg:npm/%40opacedev/ai-content-checker-contracts@0.3.1"
51
+ },
52
+ {
53
+ "type": "library",
54
+ "bom-ref": "pkg:npm/%40opacedev/ai-content-checker-core@0.3.1",
55
+ "name": "@opacedev/ai-content-checker-core",
56
+ "version": "0.3.1",
57
+ "licenses": [
58
+ {
59
+ "license": {
60
+ "id": "MIT"
61
+ }
62
+ }
63
+ ],
64
+ "purl": "pkg:npm/%40opacedev/ai-content-checker-core@0.3.1"
65
+ },
66
+ {
67
+ "type": "library",
68
+ "bom-ref": "pkg:npm/canonicalize@4.0.0",
69
+ "name": "canonicalize",
70
+ "version": "4.0.0",
71
+ "licenses": [
72
+ {
73
+ "license": {
74
+ "id": "Apache-2.0"
75
+ }
76
+ }
77
+ ],
78
+ "purl": "pkg:npm/canonicalize@4.0.0"
79
+ },
80
+ {
81
+ "type": "library",
82
+ "bom-ref": "pkg:npm/entities@4.5.0",
83
+ "name": "entities",
84
+ "version": "4.5.0",
85
+ "licenses": [
86
+ {
87
+ "license": {
88
+ "id": "BSD-2-Clause"
89
+ }
90
+ }
91
+ ],
92
+ "purl": "pkg:npm/entities@4.5.0"
93
+ },
94
+ {
95
+ "type": "file",
96
+ "bom-ref": "font:outfit-variable@2020",
97
+ "name": "Outfit (variable, subset)",
98
+ "version": "2020",
99
+ "licenses": [
100
+ {
101
+ "license": {
102
+ "id": "OFL-1.1"
103
+ }
104
+ }
105
+ ],
106
+ "hashes": [
107
+ {
108
+ "alg": "SHA-256",
109
+ "content": "92684e4acde79ef07758cd09380b7e01e9824d8b061eddeda046f78c166d7b12"
110
+ }
111
+ ],
112
+ "description": "Bundled as a data URL in dist/toolbar.js. Development toolbar only."
113
+ },
114
+ {
115
+ "type": "file",
116
+ "bom-ref": "font:plus-jakarta-sans-latin@2020",
117
+ "name": "Plus Jakarta Sans (latin subset)",
118
+ "version": "2020",
119
+ "licenses": [
120
+ {
121
+ "license": {
122
+ "id": "OFL-1.1"
123
+ }
124
+ }
125
+ ],
126
+ "hashes": [
127
+ {
128
+ "alg": "SHA-256",
129
+ "content": "153fc85b70298beeb1d61a5f723331649e7f23bb77302a66e61cb3e2fbdb5e79"
130
+ }
131
+ ],
132
+ "description": "Bundled as a data URL in dist/toolbar.js. Development toolbar only."
133
+ }
134
+ ],
135
+ "dependencies": [
136
+ {
137
+ "ref": "pkg:npm/%40opacedev/astro-ai-content-checker@0.3.1",
138
+ "dependsOn": [
139
+ "pkg:npm/%40opacedev/ai-content-checker-browser@0.3.1",
140
+ "pkg:npm/%40opacedev/ai-content-checker-contracts@0.3.1",
141
+ "pkg:npm/%40opacedev/ai-content-checker-core@0.3.1",
142
+ "pkg:npm/entities@4.5.0"
143
+ ]
144
+ },
145
+ {
146
+ "ref": "pkg:npm/%40opacedev/ai-content-checker-browser@0.3.1",
147
+ "dependsOn": [
148
+ "pkg:npm/%40opacedev/ai-content-checker-contracts@0.3.1",
149
+ "pkg:npm/%40opacedev/ai-content-checker-core@0.3.1"
150
+ ]
151
+ },
152
+ {
153
+ "ref": "pkg:npm/%40opacedev/ai-content-checker-core@0.3.1",
154
+ "dependsOn": [
155
+ "pkg:npm/%40opacedev/ai-content-checker-contracts@0.3.1",
156
+ "pkg:npm/canonicalize@4.0.0"
157
+ ]
158
+ },
159
+ {
160
+ "ref": "pkg:npm/%40opacedev/ai-content-checker-contracts@0.3.1",
161
+ "dependsOn": []
162
+ },
163
+ {
164
+ "ref": "pkg:npm/canonicalize@4.0.0",
165
+ "dependsOn": []
166
+ },
167
+ {
168
+ "ref": "pkg:npm/entities@4.5.0",
169
+ "dependsOn": []
170
+ }
171
+ ]
172
+ }
package/SECURITY.md ADDED
@@ -0,0 +1,9 @@
1
+ # Security policy
2
+
3
+ Do not disclose a suspected vulnerability, token, private source text or customer data in a public issue.
4
+
5
+ Before the repository is public, report security concerns through <https://opace.agency/get-in-touch/>. After publication, use the repository's private security-advisory form when it is available. Include the affected version, a minimal content-free reproduction and the expected impact.
6
+
7
+ Version 0.1.0 receives security fixes while it is the current supported release. Opace will publish the supported-version table in this file when a later line replaces it.
8
+
9
+ The integration's security boundary is offline, user-invoked inspection with hash-only reports. Remote providers, local-service pairing, automatic source writes and production toolbar code are outside version 0.1.0.
@@ -0,0 +1,36 @@
1
+ # Third-party notices
2
+
3
+ Version 0.3.1 bundles the following exact runtime packages so the integration is dependency-closed. This notice does not imply endorsement by their authors.
4
+
5
+ | Package | Version | Licence | Purpose |
6
+ |---|---:|---|---|
7
+ | `@opacedev/ai-content-checker-contracts` | `0.3.1` | MIT | Frozen schema and status contract. |
8
+ | `@opacedev/ai-content-checker-core` | `0.3.1` | MIT | Deterministic inspection, hashes and reviewed diffs. |
9
+ | `@opacedev/ai-content-checker-browser` | `0.3.1` | MIT | Visible-text projection and Worker boundary. |
10
+ | `canonicalize` | `4.0.0` | Apache-2.0 | RFC 8785 canonical JSON used by the bundled core. |
11
+ | `entities` | `4.5.0` | BSD-2-Clause | Standards-correct HTML entity decoding for browser/server parity. |
12
+
13
+ ## Bundled fonts
14
+
15
+ The development toolbar embeds two OFL font subsets as data URLs, so the panel matches the product's
16
+ typography without a single network request. Neither file is served to a site's visitors: the toolbar
17
+ exists only during `astro dev` and is absent from every production build.
18
+
19
+ | File | Bytes | SHA-256 | Family and licence |
20
+ |---|---:|---|---|
21
+ | `assets/fonts/outfit-variable.woff2` | 32,228 | `92684e4acde79ef07758cd09380b7e01e9824d8b061eddeda046f78c166d7b12` | Outfit, Copyright 2020 The Outfit Project Authors (https://github.com/Outfitio/Outfit-Fonts). SIL Open Font License 1.1. |
22
+ | `assets/fonts/plus-jakarta-sans-latin.woff2` | 27,348 | `153fc85b70298beeb1d61a5f723331649e7f23bb77302a66e61cb3e2fbdb5e79` | Plus Jakarta Sans, Copyright 2020 The Plus Jakarta Sans Project Authors (https://github.com/tokotype/PlusJakartaSans). SIL Open Font License 1.1. |
23
+
24
+ Both are subsets of the upstream releases, unmodified in outline. The SIL Open Font License 1.1
25
+ permits embedding and redistribution; the fonts are not sold, and the reserved font names are not
26
+ used for any modified version. The full licence text is published with each upstream project.
27
+
28
+ ## Build-time only
29
+
30
+ `onnxruntime-web` 1.29.0 (MIT, Microsoft) is a development dependency of the toolbar bundle and is
31
+ compiled into `dist/toolbar.js`. Its WebAssembly binary is not shipped in this package; the toolbar
32
+ downloads and hash-verifies it from the fixed model base only after explicit consent.
33
+
34
+ ## Licence files
35
+
36
+ The complete upstream licences are shipped at `node_modules/canonicalize/LICENSE` and `node_modules/entities/LICENSE` in the packed archive. The Opace package licences are shipped with their bundled package metadata and are also covered by this repository's MIT licence. Opace has not modified either third-party package.
@@ -0,0 +1,3 @@
1
+ import type { AstroIntegrityReport } from './report.js';
2
+ /** Render the complete printable build-scan page. Deterministic for a given report. */
3
+ export declare function renderBuildReportHtml(report: AstroIntegrityReport): string;