@aeptus/aexeo-emdash 0.6.0 → 0.8.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 CHANGED
@@ -6,6 +6,146 @@ and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.1] - 2026-05-03
10
+
11
+ Fix for the entity-presence diagnostic shipped in 0.8.0.
12
+
13
+ ### Fixed
14
+
15
+ - `EntityPresence` admin component's fetch to `/presence` was
16
+ missing the `X-EmDash-Request: 1` header that emdash's catch-all
17
+ plugin-route handler requires for state-changing methods on
18
+ private routes. Without it the host returns 403 CSRF_REJECTED
19
+ before the plugin handler runs, and the host's plugin-registry
20
+ bundle then crashes on the rejected response shape with a
21
+ `Cannot read properties of undefined (reading 'trim')` error
22
+ during admin-page render. With the header added, both the 403
23
+ and the downstream trim crash clear.
24
+
25
+ The `/data`, `/refresh`, and `/facts` routes were already sending
26
+ the header — `/presence` was the new addition and the omission
27
+ shipped in 0.8.0.
28
+
29
+ ## [0.8.0] - 2026-05-03
30
+
31
+ Layer-4 entity-presence diagnostic. The `/entity-legitimacy`
32
+ admin page now queries five free public APIs against the
33
+ configured organization in the truth manifest and surfaces what
34
+ the open web actually shows.
35
+
36
+ **Compatibility:** verified against emdash `0.7.0` and `0.8.0`.
37
+
38
+ ### Added
39
+
40
+ - **Public web presence diagnostic** on `/entity-legitimacy`,
41
+ below the truth-manifest authoring section. Five sources, one
42
+ card each, one Refresh button:
43
+ - **Wikipedia** (OpenSearch)
44
+ - **Wikidata** (`wbsearchentities`)
45
+ - **GitHub** (`/users/<handle>`)
46
+ - **Domain registration** (RDAP via the `rdap.org` redirector)
47
+ - **Common Crawl** (CDX index latest available)
48
+
49
+ Each card shows one of four states: *found* (with deep-link),
50
+ *no record*, *couldn't reach* (network/timeout/rate-limit),
51
+ *skipped* (preconditions missing). No scoring — Aexeo surfaces
52
+ this layer, it does not grade it. The "Open ↗" link on each
53
+ *found* row deep-links to the source's record so editors can
54
+ verify directly.
55
+ - **`POST .../plugins/aexeo-emdash/presence`** route with `kind:
56
+ "data"` (cached read) and `kind: "refresh"` (re-query and
57
+ persist) operations. Cached for 24h in `presence:current`; the
58
+ cache is invalidated when the manifest's organization name
59
+ changes (so stale results against a different entity never show).
60
+ - **`TruthEntity` and `TruthManifest` type exports** — minimal
61
+ TS projections of the Rust truth-manifest shape, sufficient for
62
+ the fields the plugin reads on the TS side.
63
+
64
+ ### Notes on rate limits
65
+
66
+ The five APIs are all free and unauthenticated. The 24h cache
67
+ is the rate-limit backstop:
68
+ - GitHub's 60/hr unauth cap is the binding constraint and stays
69
+ comfortably under the limit even with liberal manual refreshing.
70
+ - Wikipedia, Wikidata, and Common Crawl have no published cap;
71
+ the plugin sends a polite `User-Agent` identifying itself.
72
+ - RDAP via `rdap.org` is a community redirector with no published
73
+ cap.
74
+
75
+ If a fetch times out (>5s) or returns 429/5xx, the corresponding
76
+ source card shows "couldn't reach" with the underlying error;
77
+ hitting Refresh later retries.
78
+
79
+ ### Notes for hosts upgrading from 0.7.x
80
+
81
+ - No code changes required. The configured factory is unchanged
82
+ and the new route is registered automatically.
83
+ - Editors who haven't authored a truth manifest yet will see the
84
+ "Author the truth manifest first" CTA on `/entity-legitimacy`
85
+ — this is the same page where they author the manifest, so the
86
+ CTA composes cleanly.
87
+ - The presence diagnostic doesn't run on its own. Editors must
88
+ click Refresh once after authoring (or updating) the manifest
89
+ to populate the cache.
90
+
91
+ ## [0.7.0] - 2026-05-03
92
+
93
+ Restructures the admin sidebar around the four-layer GEO model
94
+ (retrievability, citability, absorbability, entity legitimacy) from
95
+ the May 2026 research synthesis. Each pillar is its own admin page,
96
+ each finding carries its rule's layer assignment, and the
97
+ entity-legitimacy pillar folds in the truth-manifest authoring UI.
98
+
99
+ **Compatibility:** verified against emdash `0.7.0` and `0.8.0`.
100
+
101
+ ### Added
102
+
103
+ - **Four pillar admin pages**: `/retrievability`, `/citability`,
104
+ `/absorbability`, `/entity-legitimacy`. Each filters findings to
105
+ rules whose primary layer matches; cross-cutting rules surface
106
+ their secondary layers as chips on the row ("this rule also
107
+ affects citability").
108
+ - **`layerBreakdown` field** on the `FindingsPayload` wire shape.
109
+ One entry per layer with totals, errors, and warnings; primary
110
+ layer only, so the sum equals `totals.findings`. Powers the
111
+ pillar header counts and a future dashboard widget badge.
112
+ - **`layers` field on each `Finding`**, populated by the bridge
113
+ during `evaluateDocuments`. Optional in the type so legacy KV
114
+ entries written before the enrichment landed still parse —
115
+ legacy rows fall back to `citability` (the most common layer)
116
+ until the next refresh repopulates them.
117
+ - **Type exports**: `Layer`, `RuleLayers`, `LAYERS_ORDERED`,
118
+ `layerHumanLabel`, `layerOneLineDescription` from the package
119
+ root for hosts that want to reuse the framework.
120
+
121
+ ### Changed
122
+
123
+ - **`/facts` is now an alias** for `/entity-legitimacy`. The
124
+ truth-manifest authoring UI is unchanged but it lives inside the
125
+ entity-legitimacy pillar page (composed alongside FACTS00x
126
+ findings and a placeholder for the layer-4 presence diagnostic
127
+ shipping in 0.8.0). Old bookmarks to `/facts` keep working.
128
+ - **Sidebar order changed**: pillar entries first, then `/document`
129
+ (cross-layer per-document panel), then `/findings` (the existing
130
+ cross-pillar flat-view, kept for "show me everything" triage).
131
+ Editors who had the old "SEO findings / Document SEO / Truth
132
+ manifest" layout in muscle memory will need to re-orient.
133
+ - **WASM bridge enriches each finding** with its layer assignment
134
+ before returning JSON. The Rust engine is the canonical layer
135
+ authority; the plugin doesn't maintain a parallel mapping.
136
+
137
+ ### Notes for hosts upgrading from 0.6.x
138
+
139
+ - No code changes required for hosts using only `aexeoPlugin({ ... })`.
140
+ The configured factory is unchanged.
141
+ - The four pillar pages each carry their own URL path — links to
142
+ `/admin/plugins/aexeo-emdash/retrievability` etc. work
143
+ immediately after upgrade.
144
+ - Editors will see four new sidebar entries and one renamed entry
145
+ (`Truth manifest` is gone from the sidebar; its content lives at
146
+ `Entity legitimacy`). Worth a brief internal note to the
147
+ editorial team before deploying the bump.
148
+
9
149
  ## [0.6.0] - 2026-05-03
10
150
 
11
151
  **Breaking change**: the `seogeo` → `aexeo` rename across the
@@ -379,7 +519,10 @@ First public release.
379
519
  `astro.config.mjs` for the WASM import to resolve to a
380
520
  precompiled `WebAssembly.Module`. Not optional.
381
521
 
382
- [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.6.0...HEAD
522
+ [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.1...HEAD
523
+ [0.8.1]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.0...aexeo-emdash-v0.8.1
524
+ [0.8.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.7.0...aexeo-emdash-v0.8.0
525
+ [0.7.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.6.0...aexeo-emdash-v0.7.0
383
526
  [0.6.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.5.0...aexeo-emdash-v0.6.0
384
527
  [0.5.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.4.0...aexeo-emdash-v0.5.0
385
528
  [0.4.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.3.0...aexeo-emdash-v0.4.0
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Absorbability(): React.JSX.Element;
3
+ //# sourceMappingURL=Absorbability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Absorbability.d.ts","sourceRoot":"","sources":["../../src/admin/Absorbability.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,wBAAgB,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAEjD"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Citability(): React.JSX.Element;
3
+ //# sourceMappingURL=Citability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Citability.d.ts","sourceRoot":"","sources":["../../src/admin/Citability.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,wBAAgB,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAE9C"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function EntityLegitimacy(): React.JSX.Element;
3
+ //# sourceMappingURL=EntityLegitimacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityLegitimacy.d.ts","sourceRoot":"","sources":["../../src/admin/EntityLegitimacy.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,wBAAgB,gBAAgB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA0BpD"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function EntityPresence(): React.JSX.Element;
3
+ //# sourceMappingURL=EntityPresence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityPresence.d.ts","sourceRoot":"","sources":["../../src/admin/EntityPresence.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiD/B,wBAAgB,cAAc,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAqHlD"}
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import { type Layer } from "../types.js";
3
+ export declare function PillarView({ layer, extraSlot, }: {
4
+ layer: Layer;
5
+ extraSlot?: React.ReactNode;
6
+ }): React.JSX.Element;
7
+ //# sourceMappingURL=PillarView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PillarView.d.ts","sourceRoot":"","sources":["../../src/admin/PillarView.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,aAAa,CAAC;AAWrB,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,GACV,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IAGb,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA6MpB"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Retrievability(): React.JSX.Element;
3
+ //# sourceMappingURL=Retrievability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Retrievability.d.ts","sourceRoot":"","sources":["../../src/admin/Retrievability.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,wBAAgB,cAAc,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAElD"}
package/dist/admin.d.ts CHANGED
@@ -1,6 +1,14 @@
1
+ import { Absorbability } from "./admin/Absorbability.js";
2
+ import { Citability } from "./admin/Citability.js";
3
+ import { EntityLegitimacy } from "./admin/EntityLegitimacy.js";
1
4
  import { Facts } from "./admin/Facts.js";
2
5
  import { Findings } from "./admin/Findings.js";
6
+ import { Retrievability } from "./admin/Retrievability.js";
3
7
  export declare const pages: {
8
+ "/retrievability": typeof Retrievability;
9
+ "/citability": typeof Citability;
10
+ "/absorbability": typeof Absorbability;
11
+ "/entity-legitimacy": typeof EntityLegitimacy;
4
12
  "/findings": typeof Findings;
5
13
  "/facts": typeof Facts;
6
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,eAAO,MAAM,KAAK;;;CAMjB,CAAC"}
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,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;;;;;;;CAajB,CAAC"}