@aeptus/aexeo-emdash 0.8.19 → 0.9.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.
- package/CHANGELOG.md +112 -2
- package/INSTALL.md +286 -4
- package/README.md +20 -5
- package/dist/adapter.d.ts +62 -4
- package/dist/adapter.d.ts.map +1 -1
- package/dist/admin/Findings.d.ts.map +1 -1
- package/dist/admin.d.ts.map +1 -1
- package/dist/admin.js +73 -6
- package/dist/assessment-display.d.ts +10 -0
- package/dist/assessment-display.d.ts.map +1 -0
- package/dist/cms-coverage.d.ts +10 -0
- package/dist/cms-coverage.d.ts.map +1 -0
- package/dist/configured.d.ts +16 -1
- package/dist/configured.d.ts.map +1 -1
- package/dist/configured.js +1341 -172
- package/dist/content-evaluator.d.ts +34 -0
- package/dist/content-evaluator.d.ts.map +1 -0
- package/dist/content.d.ts +98 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +445 -0
- package/dist/data-route.d.ts +12 -1
- package/dist/data-route.d.ts.map +1 -1
- package/dist/evaluator-sandbox.d.ts +1 -1
- package/dist/evaluator-sandbox.d.ts.map +1 -1
- package/dist/evaluator.d.ts +1 -1
- package/dist/evaluator.d.ts.map +1 -1
- package/dist/findings-view.d.ts +11 -5
- package/dist/findings-view.d.ts.map +1 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +163 -4
- package/dist/inventory.d.ts +59 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/plugin.d.ts +59 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/presence-check.d.ts +1 -0
- package/dist/presence-check.d.ts.map +1 -1
- package/dist/sandbox-entry.d.ts +2 -1
- package/dist/sandbox-entry.d.ts.map +1 -1
- package/dist/sandbox-entry.js +1077 -190
- package/dist/sandbox.d.ts +2 -2
- package/dist/sidecar-url.d.ts.map +1 -1
- package/dist/sidecar.d.ts +9 -1
- package/dist/sidecar.d.ts.map +1 -1
- package/dist/types.d.ts +26 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/wasm-init.d.ts +8 -0
- package/dist/wasm-init.d.ts.map +1 -1
- package/package.json +28 -8
- package/wasm/aexeo_emdash_bridge.d.ts +22 -0
- package/wasm/aexeo_emdash_bridge.js +1 -1
- package/wasm/aexeo_emdash_bridge_bg.d.ts +15 -0
- package/wasm/aexeo_emdash_bridge_bg.js +130 -0
- package/wasm/aexeo_emdash_bridge_bg.wasm +0 -0
- package/wasm/aexeo_emdash_bridge_bg.wasm.d.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,118 @@ All notable changes to `@aeptus/aexeo-emdash` are listed here.
|
|
|
4
4
|
The format follows [Keep a Changelog](https://keepachangelog.com/),
|
|
5
5
|
and the project follows [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.9.1] - 2026-11-12
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Support host-provided component, inventory route and locale mappings, and preserve precise CMS source positions when available.
|
|
14
|
+
- Report content assessment coverage and measurements, with opt-in external gate and link observation providers.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Count body findings withheld due to incomplete CMS projections in aggregate telemetry, and test native family coverage against the rule registry.
|
|
19
|
+
- Withhold native page and site rules unless their evidence is observable from the CMS body; preserve explicitly tagged content-preset findings and filter old stored results at read time.
|
|
20
|
+
- Explain when no content-preset assessment was recorded and report aggregate assessment coverage in local telemetry.
|
|
21
|
+
- Show whether each CMS evaluation had complete, partial, unavailable or unknown body coverage in both findings interfaces. Older findings without coverage are treated conservatively; a complete body does not establish rendered-page or overall editorial quality.
|
|
22
|
+
- Preserve available prose while marking body coverage unverified when automatic selection encounters an unrecognized conventional body field. Hosts can still explicitly select the fields constituting the rendered body.
|
|
23
|
+
- Preserve ordered Portable Text when it is mixed with custom components. Unmapped components leave coverage unverified; explicitly mapped components can be included or deliberately excluded from editorial body evaluation.
|
|
24
|
+
|
|
25
|
+
## [0.9.0] - 2026-11-10
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- Portable content presets with per-collection selection, typed body capabilities and explicit incomplete results.
|
|
30
|
+
- Ordered mappings for multiple content fields and custom blocks, including nested repeats and heading levels, in configured and sandboxed modes.
|
|
31
|
+
- Conservative CMS link inventory export, source locations and aggregate content coverage telemetry.
|
|
32
|
+
- The configured dashboard reports evaluator failures without breaking the editor and tolerates older findings without secondary layers.
|
|
33
|
+
|
|
34
|
+
### Compatibility
|
|
35
|
+
|
|
36
|
+
- Supports EmDash `^1.2.0`. Deploy the matching sidecar when using sandboxed mode.
|
|
37
|
+
- The intelligence widget reports facts and blockers instead of the removed composite score.
|
|
38
|
+
- Existing site and CLI checks remain separate from optional content presets.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- **The dashboard widget no longer shows a composite score.** The "Overall"
|
|
43
|
+
stat and the "Site score is N — below the 60 quality threshold" banner are
|
|
44
|
+
gone; blockers remain the call to action. `SiteIntelligenceScore` loses
|
|
45
|
+
`overall_score`, `answer_pack_score` and `elapsed_us` and gains
|
|
46
|
+
`answer_pack`, and `citation_readiness_score` and `truth_consistency_score`
|
|
47
|
+
may now be `null`, shown as "unknown", when nothing was measured.
|
|
48
|
+
- **Entity presence resolves the newest Common Crawl index at runtime** from
|
|
49
|
+
`collinfo.json` instead of a pinned crawl, so a site first crawled after a
|
|
50
|
+
plugin release is no longer reported `not_found`. Failing to resolve the
|
|
51
|
+
index reports `unreachable`.
|
|
52
|
+
- Support EmDash `^1.2.0` and run the plugin-host integration coverage against
|
|
53
|
+
EmDash `1.2.0`.
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
57
|
+
- **The sandboxed plugin warns when its sidecar is on another version.** The
|
|
58
|
+
Worker reports its version in the `x-aexeo-version` response header, and the
|
|
59
|
+
plugin logs a warning when it differs, since a Worker left behind on an upgrade
|
|
60
|
+
keeps evaluating with older rules.
|
|
61
|
+
|
|
62
|
+
### Security
|
|
63
|
+
|
|
64
|
+
- **EVAL_TOKEN never falls back to plaintext.** When the host cannot encrypt
|
|
65
|
+
the token (usually `EMDASH_ENCRYPTION_KEY` is unset), the Setup page now shows
|
|
66
|
+
an error and changes nothing, where it used to store the token in plaintext KV
|
|
67
|
+
with only a log line. **Behaviour change:** on such a host, saving the Setup
|
|
68
|
+
form fails until the key is set, even for a URL-only change. A token already
|
|
69
|
+
in KV keeps working, and the Setup page says it is unencrypted.
|
|
70
|
+
- **A rotated token is no longer ignored.** Reads preferred settings, so a token
|
|
71
|
+
that fell back to KV during a rotation lost to the older one in settings. A KV
|
|
72
|
+
token is always the newer of the two, and is now read first.
|
|
73
|
+
- **The Setup form rejects trailing-dot hosts** such as `https://localhost./`,
|
|
74
|
+
which passed the loopback check.
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
|
|
78
|
+
- **`aexeo-crawl-worker` upgrade notes.** The Worker refuses every request when
|
|
79
|
+
`EVAL_TOKEN` is shorter than 32 characters, so rotate a shorter token before
|
|
80
|
+
redeploying. It answers `413` above 8 MiB, the limit of emdash's sandbox
|
|
81
|
+
bridge. Malformed bodies and initialization failures now return JSON errors, and
|
|
82
|
+
token comparison is constant-time. It is built with Wrangler 4 and a newer
|
|
83
|
+
compatibility date.
|
|
84
|
+
- **Editors can read findings.** The configured plugin's `admin` and `data`
|
|
85
|
+
routes declare `plugins:read`; emdash otherwise requires `plugins:manage`.
|
|
86
|
+
Refresh, facts and presence stay admin-only, and the `admin` route refuses
|
|
87
|
+
`refresh_findings` for non-admins. The sandboxed entry stays admin-only because
|
|
88
|
+
its `admin` route also saves the Setup form.
|
|
89
|
+
- **The configured plugin declares its network use**: `network:request` and the
|
|
90
|
+
presence sources' hosts, which it was using while declaring only `content:read`.
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
|
|
94
|
+
- **Concurrent writes no longer lose newer data.** A save older than the stored
|
|
95
|
+
revision is ignored, a slow evaluation does not overwrite the findings of a
|
|
96
|
+
later save or delete, and a Refresh does not overwrite a save that landed during
|
|
97
|
+
the sweep or remove a document created during it.
|
|
98
|
+
- **Deleted content leaves the findings immediately**, through a
|
|
99
|
+
`content:afterDelete` hook, including when it is only trashed. Restoring an
|
|
100
|
+
entry brings it back at its next save or Refresh.
|
|
101
|
+
- **Legacy `document:` entries are removed** by a Refresh that does not see their
|
|
102
|
+
route. They record no collection, so they were previously never removed.
|
|
103
|
+
- **The sandboxed score widget reports the score as unavailable** instead of a
|
|
104
|
+
score of 0, which read as a measured result.
|
|
105
|
+
- **Entity presence no longer reports false results.** Common Crawl searches the
|
|
106
|
+
whole domain, where an exact-URL match reported a site absent when the crawl
|
|
107
|
+
skipped only its home page. Wikipedia and Wikidata records must name the entity
|
|
108
|
+
or a declared alias, ignoring legal forms; a substring used to count, so
|
|
109
|
+
"Pineapple" matched "Apple".
|
|
110
|
+
- **Saving a document no longer reports false site-graph findings or erases
|
|
111
|
+
real ones.** A save evaluates one document as a one-page site, so every
|
|
112
|
+
internal link was reported as broken (`LNK001`) and the page as an orphan
|
|
113
|
+
(`LNK002`), and those results replaced the route's stored findings until the
|
|
114
|
+
next Refresh. Rules that depend on other documents (`LNK001`-`LNK004`,
|
|
115
|
+
`SEO009`, `SEO012`, `SEO016`, `SEO017`, `CNT005`) are now computed by Refresh
|
|
116
|
+
only: a save keeps the route's stored findings for them, so a link fixed or
|
|
117
|
+
added in that save is reflected at the next Refresh.
|
|
118
|
+
|
|
7
119
|
## [0.8.19] - 2026-09-29
|
|
8
120
|
|
|
9
121
|
Updates the EmDash integration to the current plugin and content APIs, and
|
|
@@ -126,8 +238,6 @@ version, since 0.8.19 had never been published.
|
|
|
126
238
|
`deploy`, and only the two declaration files remain tracked. The package
|
|
127
239
|
also gains a README, which it did not have.
|
|
128
240
|
|
|
129
|
-
## [Unreleased]
|
|
130
|
-
|
|
131
241
|
## [0.8.18] - 2026-09-28
|
|
132
242
|
|
|
133
243
|
### Added
|
package/INSTALL.md
CHANGED
|
@@ -5,6 +5,194 @@ site. Findings show up as a Block Kit admin page; a sidebar widget
|
|
|
5
5
|
shows the site's current intelligence score; saves auto-evaluate the
|
|
6
6
|
changed document.
|
|
7
7
|
|
|
8
|
+
## Restricting content presets to specific collections
|
|
9
|
+
|
|
10
|
+
Content presets apply to all evaluated collections by default. Set
|
|
11
|
+
`contentPreset.collections` to select only the collections that use the preset;
|
|
12
|
+
existing site checks continue to run on all configured collections. Use
|
|
13
|
+
`byCollection` to choose an alternate preset for a selected collection.
|
|
14
|
+
For example:
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
aexeoPlugin({
|
|
18
|
+
contentPreset: {
|
|
19
|
+
name: "article",
|
|
20
|
+
collections: ["blog_posts", "glossary_terms"],
|
|
21
|
+
byCollection: { glossary_terms: "glossary" },
|
|
22
|
+
},
|
|
23
|
+
})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## External gates in configured mode
|
|
27
|
+
|
|
28
|
+
The default descriptor loads no external code. Hosts that need custom gates can
|
|
29
|
+
provide a trusted runtime entrypoint exporting `createPlugin(options)` and call
|
|
30
|
+
Aexeo's configured entry with a runtime provider. Package this module under a
|
|
31
|
+
specifier your EmDash build can import, then set the descriptor's `entrypoint`
|
|
32
|
+
to that specifier. EmDash serializes descriptor options as JSON, so a callback
|
|
33
|
+
cannot be placed in `aexeoPlugin` options.
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
// Example host-owned runtime module, published as @example/aexeo-runtime
|
|
37
|
+
import { createPlugin as createAexeo } from "@aeptus/aexeo-emdash/configured";
|
|
38
|
+
import type { ConfiguredPluginOptions, ExternalGateProvider } from "@aeptus/aexeo-emdash/configured";
|
|
39
|
+
|
|
40
|
+
const externalGates: ExternalGateProvider = async ({ input }) => [{
|
|
41
|
+
extension: "example.rule",
|
|
42
|
+
parameters: {},
|
|
43
|
+
input,
|
|
44
|
+
diagnostics: [], // Replace with your trusted checker and its diagnostics.
|
|
45
|
+
}];
|
|
46
|
+
|
|
47
|
+
export function createPlugin(options: ConfiguredPluginOptions) {
|
|
48
|
+
return createAexeo(options, { externalGates });
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
In the host's configuration, use
|
|
53
|
+
`{ ...aexeoPlugin({ contentPreset: { name: "custom", sources: { custom: "..." } } }), entrypoint: "@example/aexeo-runtime" }`.
|
|
54
|
+
The callback runs on save and refresh only when the resolved preset has a custom
|
|
55
|
+
gate. It receives the selected document’s
|
|
56
|
+
projected input, selected preset and collection, and returns results bound to
|
|
57
|
+
the input and the gate's exact parameters. The preset must declare the matching
|
|
58
|
+
custom gate. Aexeo reports stale or missing results as incomplete. If the
|
|
59
|
+
provider fails, modern reports retain other findings and mark external gates as
|
|
60
|
+
not checked; older sidecar clients that cannot represent coverage still fail.
|
|
61
|
+
The input may include private content and
|
|
62
|
+
evidence. The host owns provider trust, timeouts, resource limits and any
|
|
63
|
+
network transfer. This runtime injection does not configure the sandbox worker.
|
|
64
|
+
An optional `onExternalGateTelemetry` runtime callback receives only provider
|
|
65
|
+
duration and success/error status, with no content or document identifiers.
|
|
66
|
+
It measures projection, provider call and result evaluation, not whether the returned gates passed.
|
|
67
|
+
|
|
68
|
+
## Content coverage
|
|
69
|
+
|
|
70
|
+
Portable Text bodies provide text, headings, paragraphs and links to content
|
|
71
|
+
presets. A plain text body provides text only. EmDash custom blocks are
|
|
72
|
+
project-specific; their flattened text is available to the legacy site audit,
|
|
73
|
+
but content-preset gates that require body capabilities are reported as
|
|
74
|
+
`not_checked` until a faithful mapping is provided. The configured plugin
|
|
75
|
+
persists available findings alongside each gate status and its reason. The
|
|
76
|
+
sidecar also reports these assessments to updated clients; older clients retain
|
|
77
|
+
the fail-closed behavior for incomplete presets. This avoids treating unobserved
|
|
78
|
+
headings, paragraphs or links as absent. An explicitly empty body
|
|
79
|
+
is distinct from an unavailable body. When an entry has several candidate
|
|
80
|
+
content fields, the default first-field projection remains unverified because
|
|
81
|
+
it cannot establish which fields appear in the rendered page.
|
|
82
|
+
|
|
83
|
+
During a CMS refresh, failed collection listings, invalid pagination and
|
|
84
|
+
incomplete bodies make sitewide and cross-document results unavailable. Aexeo
|
|
85
|
+
hides old cross-document findings and shows the coverage reason in the admin
|
|
86
|
+
views and `sitewideAssessment` in the findings API. `aexeo.sitewide_coverage`
|
|
87
|
+
logs only an aggregate status. A complete CMS listing is not proof that the
|
|
88
|
+
CMS inventory matches a rendered site or represents an atomic snapshot;
|
|
89
|
+
concurrent edits and refreshes are not isolated by the host's KV interface.
|
|
90
|
+
CMS-only evaluation does not assert that links are broken or pages are orphans;
|
|
91
|
+
use a rendered-site audit with matched inventory and coverage evidence.
|
|
92
|
+
|
|
93
|
+
For custom blocks in configured mode, declare the ordered rendered content
|
|
94
|
+
fields for each block type in the plugin configuration:
|
|
95
|
+
|
|
96
|
+
```js
|
|
97
|
+
aexeoPlugin({
|
|
98
|
+
contentFieldsByCollection: { pages: ["introduction", "sections"] },
|
|
99
|
+
blockMappings: {
|
|
100
|
+
hero: [
|
|
101
|
+
{ kind: "heading", field: "headline" },
|
|
102
|
+
{ kind: "paragraph", field: "description", optional: true },
|
|
103
|
+
{ kind: "link", field: "linkLabel", hrefField: "linkUrl", optional: true },
|
|
104
|
+
{ kind: "richText", field: "body" },
|
|
105
|
+
],
|
|
106
|
+
faq: [
|
|
107
|
+
{ kind: "heading", field: "heading" },
|
|
108
|
+
{ kind: "repeat", field: "faqs", fields: [
|
|
109
|
+
{ kind: "heading", field: "question", level: 3 },
|
|
110
|
+
{ kind: "paragraph", field: "answer" },
|
|
111
|
+
] },
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`contentFieldsByCollection` declares the body fields rendered by each selected
|
|
118
|
+
collection, in order. It is an explicit assertion of completeness, so include
|
|
119
|
+
all rendered fields. A selected field absent from the record makes the body
|
|
120
|
+
incomplete, while an explicitly present `null` is treated as empty. If no selected
|
|
121
|
+
field is present, the body remains unavailable. In sandboxed mode, enter this object in `Content fields by collection (JSON)`.
|
|
122
|
+
If this setting is malformed or cannot be read, save and Refresh keep recognized
|
|
123
|
+
prose but mark all body capabilities unavailable; check the plugin warning and
|
|
124
|
+
repair the setting. An unset setting uses automatic detection as usual.
|
|
125
|
+
|
|
126
|
+
Portable Text can also interleave text blocks and custom components. An
|
|
127
|
+
unknown component keeps its surrounding text but marks body capabilities
|
|
128
|
+
unverified. Best-effort text extracted from an unknown component is bounded to
|
|
129
|
+
64 nesting levels, 50,000 visited values and 1,048,576 UTF-16 code units;
|
|
130
|
+
it may therefore be incomplete and must not be treated as a complete body. A host may map a component to `[]` only when it has verified that
|
|
131
|
+
the component contributes no content relevant to the evaluated body.
|
|
132
|
+
|
|
133
|
+
For an inline object inside a Portable Text block, use an explicit `inline`
|
|
134
|
+
mapping. It projects text and links in place without creating a new paragraph:
|
|
135
|
+
|
|
136
|
+
```js
|
|
137
|
+
blockMappings: {
|
|
138
|
+
badge: { inline: [
|
|
139
|
+
{ kind: "text", field: "label" },
|
|
140
|
+
{ kind: "link", field: "linkLabel", hrefField: "href", optional: true },
|
|
141
|
+
] },
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
An empty `inline` array asserts the component adds no relevant body content.
|
|
146
|
+
An optional `capabilities` array limits the assertion just as for block mappings;
|
|
147
|
+
omitting it asserts all body capabilities. Only declare these mappings after
|
|
148
|
+
verifying the host renderer. Unknown components or invalid fields keep surrounding
|
|
149
|
+
spans but leave the body unverified. Mapped spans do not have original CMS source
|
|
150
|
+
locations because they are derived from component fields. Unchanged surrounding
|
|
151
|
+
spans can retain their original paths even when component projection changes their
|
|
152
|
+
position; ambiguous aliases and oversized or cyclic records remain unmapped.
|
|
153
|
+
|
|
154
|
+
The array form asserts that all four capabilities are complete. If a host can
|
|
155
|
+
only establish some capabilities, use the object form instead:
|
|
156
|
+
|
|
157
|
+
```js
|
|
158
|
+
blockMappings: {
|
|
159
|
+
card: {
|
|
160
|
+
fields: [{ kind: "paragraph", field: "body" }],
|
|
161
|
+
capabilities: ["text", "paragraphs"],
|
|
162
|
+
},
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
List a capability only when the projected fields faithfully represent **all**
|
|
167
|
+
of that component's rendered content relevant to it, including content outside
|
|
168
|
+
the listed fields. An empty `fields` array in the object form asserts only the
|
|
169
|
+
listed capabilities; for example, `fields: [], capabilities: ["headings"]`
|
|
170
|
+
asserts that the component contributes no headings, but says nothing about its
|
|
171
|
+
text, paragraphs or links. Aexeo intersects capabilities across every component,
|
|
172
|
+
selected field and nested rich-text block. Unknown, malformed or missing input
|
|
173
|
+
still removes the affected coverage conservatively. These assertions require
|
|
174
|
+
validation against the host renderer; they do not prove the content is correct.
|
|
175
|
+
|
|
176
|
+
A block mapping is the site's assertion that those fields cover the rendered content,
|
|
177
|
+
in order. `richText` accepts Portable Text arrays, including text mixed with
|
|
178
|
+
mapped custom components, or arrays of mapped custom components alone, and
|
|
179
|
+
preserves their headings and links. Unmapped or
|
|
180
|
+
malformed nested components and recursion beyond the mapping depth limit leave
|
|
181
|
+
body coverage unverified; `heading` defaults to h2 and accepts levels 1 through 6. `repeat`
|
|
182
|
+
maps each item in an array;
|
|
183
|
+
`optional: true` permits an absent field without inventing content. Every
|
|
184
|
+
encountered block type must be
|
|
185
|
+
mapped and every mapped field must have the expected type. If not, capabilities
|
|
186
|
+
remain unverified. These options apply to configured-mode saves and both
|
|
187
|
+
refresh routes. In sandboxed mode, enter the same JSON object in the plugin
|
|
188
|
+
settings field `Custom block mappings (JSON)`; it applies to save and Refresh.
|
|
189
|
+
Invalid or unavailable settings leave custom blocks unverified.
|
|
190
|
+
|
|
191
|
+
Adapters supplying an `EmdashDocument` can set `body_capabilities` to a subset
|
|
192
|
+
of `text`, `headings`, `paragraphs` and `links`. Omit it only when all four
|
|
193
|
+
are faithfully represented. These capability declarations describe input
|
|
194
|
+
coverage; they do not validate the content itself.
|
|
195
|
+
|
|
8
196
|
## Two install paths
|
|
9
197
|
|
|
10
198
|
The package exports two factories:
|
|
@@ -31,8 +219,8 @@ when it's actually needed.
|
|
|
31
219
|
(`@astrojs/cloudflare` + `@emdash-cms/cloudflare`'s `sandbox()`
|
|
32
220
|
runner is fine — sandboxed plugins use Worker Loader, configured
|
|
33
221
|
plugins don't, but both adapters import cleanly).
|
|
34
|
-
- EmDash
|
|
35
|
-
|
|
222
|
+
- EmDash `^1.2.0` as a peer dependency. The integration coverage targets
|
|
223
|
+
`1.2.0` with EmDash's official plugin test host.
|
|
36
224
|
|
|
37
225
|
### Install
|
|
38
226
|
|
|
@@ -371,8 +559,10 @@ Node adapter.
|
|
|
371
559
|
evaluated document under `document:<route>`.
|
|
372
560
|
- **Auto-evaluate on save**: emdash's `content:afterSave` hook fires
|
|
373
561
|
for each save, re-evaluates that one document, and updates its
|
|
374
|
-
KV findings entry.
|
|
375
|
-
the next
|
|
562
|
+
KV findings entry. Findings that depend on other documents, such as
|
|
563
|
+
broken internal links, keep their last Refresh result until the next
|
|
564
|
+
Refresh. The dashboard widget reflects the new score on the next page
|
|
565
|
+
load.
|
|
376
566
|
|
|
377
567
|
## Architecture in one paragraph
|
|
378
568
|
|
|
@@ -386,3 +576,95 @@ itself is the same `aexeo-emdash-bridge` Rust crate that powers the
|
|
|
386
576
|
Aexeo CLI; it's compiled to WebAssembly via wasm-pack and imported
|
|
387
577
|
by the host's bundler (Vite + `vite-plugin-wasm`). No separate
|
|
388
578
|
service, no sidecar, no auth token.
|
|
579
|
+
|
|
580
|
+
### Exporting a conservative link inventory
|
|
581
|
+
|
|
582
|
+
For host code with access to EmDash's content API, the package exports
|
|
583
|
+
`exportLinkInventory(content, options)`. Select the collections belonging to
|
|
584
|
+
one publication explicitly and supply the observed site identity:
|
|
585
|
+
|
|
586
|
+
```ts
|
|
587
|
+
import { exportLinkInventory } from "@aeptus/aexeo-emdash";
|
|
588
|
+
|
|
589
|
+
const result = await exportLinkInventory(ctx.content, {
|
|
590
|
+
collections: ["blog_posts", "pages"],
|
|
591
|
+
identity: { origin: "https://example.org", release: "release-id", surface: "public", snapshot: "snapshot-id" },
|
|
592
|
+
});
|
|
593
|
+
// result.inventory matches the link-graph input's inventory shape.
|
|
594
|
+
// Inspect result.issues and result.omitted before using it.
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
The export resolves public URLs through EmDash and paginates each selected
|
|
598
|
+
collection. Entries without public URLs are reported as omitted, and entries
|
|
599
|
+
with URLs default to `unknown` disposition. A host may supply `classify` when
|
|
600
|
+
it has authoritative indexability and alias information. Repeated or missing
|
|
601
|
+
cursors, failures, malformed collection responses or entries, and page limits are reported.
|
|
602
|
+
Malformed entries are omitted; a malformed collection page stops that collection
|
|
603
|
+
without discarding other collections. The inventory is always marked
|
|
604
|
+
incomplete because pagination alone cannot establish a transactional snapshot or
|
|
605
|
+
include routes outside the chosen collections. No HTTP endpoint is installed by
|
|
606
|
+
this API. It cannot by itself establish that a crawl and CMS view describe the
|
|
607
|
+
same publication, release and point in time.
|
|
608
|
+
|
|
609
|
+
Hosts whose rendered routes differ from EmDash's resolver can supply an async
|
|
610
|
+
`resolveUrl(collection, item)` returning the actual public URL or `null` when
|
|
611
|
+
no route is known. It replaces `getPublicUrl` for that export. The optional
|
|
612
|
+
`classify(item, url, collection)` callback can use collection-specific rules
|
|
613
|
+
and return `disposition`, `target`, and an explicit `locale` (including `null`
|
|
614
|
+
for unknown); omitting `locale` retains the CMS value. Callback failures leave
|
|
615
|
+
entries omitted or unclassified and are counted without exposing error details.
|
|
616
|
+
These host-supplied values are assertions, not proof of rendered routes,
|
|
617
|
+
publication state, snapshot identity, or inventory completeness.
|
|
618
|
+
|
|
619
|
+
URL resolution runs at most eight CMS requests concurrently by default. Set
|
|
620
|
+
`urlResolutionConcurrency` to an integer from 1 to 100 to suit the host's
|
|
621
|
+
capacity; use 1 for sequential requests. Pagination remains sequential.
|
|
622
|
+
|
|
623
|
+
An optional `onTelemetry` callback receives only elapsed milliseconds and aggregate counts. It is disabled by default and does not receive URLs or content.
|
|
624
|
+
|
|
625
|
+
### CMS coverage and rendered pages
|
|
626
|
+
|
|
627
|
+
The CMS integration evaluates content records, not the rendered page.
|
|
628
|
+
It does not report legacy SEO, social metadata, accessibility, page-size,
|
|
629
|
+
answer-block or citation-context findings as if generated HTML were observed.
|
|
630
|
+
The CMS dashboard score widget is unavailable for the same reason: CMS records
|
|
631
|
+
do not establish rendered-page coverage or a complete site inventory. Run Aexeo
|
|
632
|
+
against the built site to assess those checks. The `aexeo.page_coverage`
|
|
633
|
+
telemetry event marks rendered-page and generated-metadata coverage as not observed;
|
|
634
|
+
`aexeo.content_coverage` describes body projection separately.
|
|
635
|
+
|
|
636
|
+
The built-in `article` preset is a minimal non-empty text check, not a complete
|
|
637
|
+
editorial or SEO assessment. Choose and compose the editorial presets appropriate
|
|
638
|
+
to the content, or supply a project-specific preset.
|
|
639
|
+
|
|
640
|
+
When the host renderer selects a description from collection fields, configure
|
|
641
|
+
the same ordered fallback explicitly, for example:
|
|
642
|
+
|
|
643
|
+
```ts
|
|
644
|
+
aexeoPlugin({
|
|
645
|
+
descriptionFieldsByCollection: { blog_posts: ["seo_description", "excerpt"] },
|
|
646
|
+
})
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
In sandboxed mode, enter the equivalent JSON object, for example
|
|
650
|
+
`{"blog_posts":["seo_description","excerpt"]}`, in the plugin setting
|
|
651
|
+
`Description fields by collection (JSON)`. It applies to saves and Refresh.
|
|
652
|
+
|
|
653
|
+
The mapping projects source values; it does not prove what metadata the page
|
|
654
|
+
renderer generated. Explicit null or empty fields are observed as absent. A
|
|
655
|
+
missing, undefined or invalid field before the chosen fallback makes the source
|
|
656
|
+
unverified; an unused later field need not be present. Invalid settings remain
|
|
657
|
+
unverified. A `required_metadata` gate requesting `description` reports
|
|
658
|
+
`not_checked` when that source was not observed; other known-missing fields
|
|
659
|
+
can still produce findings. The `aexeo.description_coverage` log contains
|
|
660
|
+
aggregate counts of observed and unverified source projections without content
|
|
661
|
+
or identifiers.
|
|
662
|
+
|
|
663
|
+
Content preset gate outcomes, including `not_checked` and their reasons, are
|
|
664
|
+
stored with the current route findings and exposed in CMS views and the data
|
|
665
|
+
route. The preset panel lists passed, failed and unchecked gates, whether they
|
|
666
|
+
are blocking, and available measurements and thresholds. Older stored reports
|
|
667
|
+
may not contain measurements; missing measurements are not shown as zero. A
|
|
668
|
+
pass covers only the configured checks and is not an overall quality score. A failed evaluation clears findings for that revision and records an
|
|
669
|
+
error; it must not be interpreted as a clean assessment. `aexeo.preset_coverage`
|
|
670
|
+
logs aggregate counts without routes, gate identifiers, reasons or content.
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Aexeo SEO/GEO content evaluator as an emdash plugin.
|
|
4
4
|
|
|
5
5
|
Adds a Findings admin page, per-document panel, and dashboard
|
|
6
|
-
intelligence
|
|
6
|
+
intelligence facts widget to an emdash site. Saves auto-evaluate the
|
|
7
7
|
changed document; the Refresh button re-evaluates the whole site.
|
|
8
8
|
|
|
9
9
|
## Install
|
|
@@ -43,18 +43,25 @@ troubleshooting list, see [INSTALL.md](./INSTALL.md).
|
|
|
43
43
|
- **Findings page** at `/_emdash/admin/plugins/aexeo-emdash/findings`:
|
|
44
44
|
rule violations across the site, filterable by severity.
|
|
45
45
|
- **Document panel** at `/document`: findings scoped to one document.
|
|
46
|
-
- **Dashboard widget**:
|
|
47
|
-
|
|
46
|
+
- **Dashboard widget**: citation readiness, truth consistency and answer
|
|
47
|
+
structure side by side, with the top blockers. There is no composite score
|
|
48
|
+
or quality threshold, and a dimension with nothing to measure reads
|
|
49
|
+
`unknown`.
|
|
50
|
+
- **Entity presence**: Wikipedia is searched on `en.wikipedia.org` only, so
|
|
51
|
+
`not_found` says nothing about other language editions.
|
|
48
52
|
- **Refresh button**: re-evaluate every document in the configured
|
|
49
53
|
collections (`posts`, `pages` by default).
|
|
50
54
|
- **Auto-evaluate on save**: EmDash's `content:afterSave` hook evaluates
|
|
51
55
|
the saved document and updates its findings. Sandboxed installs need a
|
|
52
56
|
configured evaluator sidecar; configured installs run evaluation in-process.
|
|
57
|
+
Findings that depend on other documents (broken and weak internal links,
|
|
58
|
+
inbound links, hreflang targets, shared canonicals, duplicate metadata and
|
|
59
|
+
text) stay as the last Refresh stored them until the next Refresh.
|
|
53
60
|
|
|
54
61
|
## Compatibility
|
|
55
62
|
|
|
56
|
-
- EmDash
|
|
57
|
-
- Runtime integration coverage targets EmDash `
|
|
63
|
+
- EmDash `^1.2.0` (peer dependency; current supported range)
|
|
64
|
+
- Runtime integration coverage targets EmDash `1.2.0` via the official
|
|
58
65
|
`@emdash-cms/plugin-test` host.
|
|
59
66
|
- Cloudflare Workers via `@astrojs/cloudflare`. The plugin uses
|
|
60
67
|
Cloudflare-specific APIs and silently no-ops on the Node adapter.
|
|
@@ -174,3 +181,11 @@ for the sandboxed setup runbook.
|
|
|
174
181
|
## License
|
|
175
182
|
|
|
176
183
|
MIT — see [LICENSE](./LICENSE).
|
|
184
|
+
|
|
185
|
+
### Host-supplied link observations
|
|
186
|
+
|
|
187
|
+
The optional content API can evaluate explicitly supplied link reachability
|
|
188
|
+
observations without network access in WASM. See [content gate documentation](https://github.com/schiste/Aexeo/blob/main/docs/content-gates.md#emdash-host-observations) for snapshot binding,
|
|
189
|
+
privacy and incomplete-coverage behavior. Configured save and refresh hooks invoke
|
|
190
|
+
a host observer only when it is explicitly installed and the selected preset requests
|
|
191
|
+
the gate. The host owns its network policy and request limits.
|
package/dist/adapter.d.ts
CHANGED
|
@@ -1,10 +1,55 @@
|
|
|
1
1
|
import type { EmdashDocument } from "./types.js";
|
|
2
|
+
/** Ordered fields that the host declares constitute a custom block's content. */
|
|
3
|
+
export type CustomBlockField = {
|
|
4
|
+
kind: "paragraph" | "richText";
|
|
5
|
+
field: string;
|
|
6
|
+
optional?: boolean;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "heading";
|
|
9
|
+
field: string;
|
|
10
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
11
|
+
optional?: boolean;
|
|
12
|
+
} | {
|
|
13
|
+
kind: "link";
|
|
14
|
+
field: string;
|
|
15
|
+
hrefField: string;
|
|
16
|
+
optional?: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "repeat";
|
|
19
|
+
field: string;
|
|
20
|
+
fields: readonly CustomBlockField[];
|
|
21
|
+
optional?: boolean;
|
|
22
|
+
};
|
|
23
|
+
/** Capabilities that a host can establish for a component's rendered content. */
|
|
24
|
+
export type BodyCapability = "text" | "headings" | "paragraphs" | "links";
|
|
25
|
+
/** Ordered fields projected within the surrounding Portable Text block. */
|
|
26
|
+
export type InlineComponentField = {
|
|
27
|
+
kind: "text";
|
|
28
|
+
field: string;
|
|
29
|
+
optional?: boolean;
|
|
30
|
+
} | {
|
|
31
|
+
kind: "link";
|
|
32
|
+
field: string;
|
|
33
|
+
hrefField: string;
|
|
34
|
+
optional?: boolean;
|
|
35
|
+
};
|
|
36
|
+
/** The object form asserts coverage only for the listed capabilities. */
|
|
37
|
+
export type CustomBlockMapping = readonly CustomBlockField[] | {
|
|
38
|
+
fields: readonly CustomBlockField[];
|
|
39
|
+
capabilities: readonly BodyCapability[];
|
|
40
|
+
} | {
|
|
41
|
+
inline: readonly InlineComponentField[];
|
|
42
|
+
capabilities?: readonly BodyCapability[];
|
|
43
|
+
};
|
|
44
|
+
export type CustomBlockMappings = Record<string, CustomBlockMapping>;
|
|
2
45
|
export interface EmdashContentItem {
|
|
3
46
|
id: string;
|
|
4
47
|
type: string;
|
|
5
48
|
slug: string | null;
|
|
6
49
|
status: string;
|
|
7
50
|
locale: string | null;
|
|
51
|
+
/** Host write timestamp. Orders concurrent saves and Refresh sweeps. */
|
|
52
|
+
updatedAt?: string;
|
|
8
53
|
translationGroup?: string | null;
|
|
9
54
|
data: Record<string, unknown>;
|
|
10
55
|
seo?: {
|
|
@@ -21,6 +66,14 @@ export interface EmdashContentMeta {
|
|
|
21
66
|
title: string;
|
|
22
67
|
/** Exact URL returned by EmDash, or null when this entry has no public route. */
|
|
23
68
|
publicUrl: string | null;
|
|
69
|
+
/** The content could not be adapted; route and title are from the previous snapshot. */
|
|
70
|
+
adaptationFailed?: true;
|
|
71
|
+
/** Original paths for unchanged Portable Text blocks in this exact snapshot. */
|
|
72
|
+
bodySourcePaths?: Array<Array<string | number> | null>;
|
|
73
|
+
/** Original text paths for unchanged spans within projected blocks. */
|
|
74
|
+
bodySourceSpanPaths?: Array<Array<Array<string | number> | null> | null>;
|
|
75
|
+
/** The host's `updatedAt` for the row this entry was adapted from. */
|
|
76
|
+
updatedAt?: string;
|
|
24
77
|
}
|
|
25
78
|
export interface ContentUrlApi {
|
|
26
79
|
getPublicUrl(collection: string, id: string): Promise<string | null>;
|
|
@@ -44,16 +97,21 @@ export interface AdaptedContent {
|
|
|
44
97
|
* accounts for collection URL patterns, locale prefixes, and slash policy;
|
|
45
98
|
* slug-derived paths are not equivalent to the site's actual public URLs.
|
|
46
99
|
*/
|
|
47
|
-
export declare function adaptContentItemWithContext(content: EmdashContentItem, contentApi: ContentUrlApi, defaultLocale?: string): Promise<AdaptedContent>;
|
|
100
|
+
export declare function adaptContentItemWithContext(content: EmdashContentItem, contentApi: ContentUrlApi, defaultLocale?: string, blockMappings?: CustomBlockMappings, contentFields?: readonly string[], descriptionFields?: readonly string[]): Promise<AdaptedContent>;
|
|
48
101
|
/**
|
|
49
102
|
* Synchronous adapter for callers that do not have a host content API.
|
|
50
103
|
* It deliberately uses a stable identity route; callers should use
|
|
51
104
|
* adaptContentItemWithContext whenever EmDash can resolve the public URL.
|
|
52
105
|
*/
|
|
53
|
-
export declare function contentItemToEmdashDocument(content: EmdashContentItem): EmdashDocument;
|
|
54
|
-
|
|
106
|
+
export declare function contentItemToEmdashDocument(content: EmdashContentItem, blockMappings?: CustomBlockMappings): EmdashDocument;
|
|
107
|
+
type AdaptContentOptions = {
|
|
55
108
|
route?: string;
|
|
56
109
|
publicUrl?: string | null;
|
|
57
110
|
defaultLocale?: string;
|
|
58
|
-
|
|
111
|
+
blockMappings?: CustomBlockMappings | undefined;
|
|
112
|
+
contentFields?: readonly string[];
|
|
113
|
+
descriptionFields?: readonly string[];
|
|
114
|
+
};
|
|
115
|
+
export declare function adaptContentItem(content: EmdashContentItem, options?: AdaptContentOptions): AdaptedContent;
|
|
116
|
+
export {};
|
|
59
117
|
//# sourceMappingURL=adapter.d.ts.map
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Findings.d.ts","sourceRoot":"","sources":["../../src/admin/Findings.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Findings.d.ts","sourceRoot":"","sources":["../../src/admin/Findings.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,wBAAgB,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAiN5C"}
|
package/dist/admin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,KAAK;IAEhB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,oBAAoB;IACpB,gBAAgB;IAIhB,WAAW;IAGX,QAAQ;CACT,CAAC"}
|