@aeptus/aexeo-emdash 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAWtB,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,UAAU,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,YAAY,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;CAGnC;AAED,wBAAgB,YAAY,CAC1B,OAAO,GAAE,mBAAwB,GAChC,0BAA0B,CA0B5B"}
package/dist/index.js ADDED
@@ -0,0 +1,82 @@
1
+ // src/plugin.ts
2
+ var baseCapabilities = [
3
+ "read:content",
4
+ "read:schema",
5
+ "write:artifacts:public/llms.txt",
6
+ "write:artifacts:public/llms-full.txt",
7
+ "write:artifacts:public/facts.json",
8
+ "write:artifacts:public/*.md.txt",
9
+ "kv:seogeo-baselines"
10
+ ];
11
+ function buildCapabilities(evaluatorHost) {
12
+ if (evaluatorHost === null) {
13
+ return baseCapabilities;
14
+ }
15
+ return [...baseCapabilities, "network:fetch"];
16
+ }
17
+ function buildAllowedHosts(evaluatorHost) {
18
+ const hosts = ["api.indexnow.org"];
19
+ if (evaluatorHost !== null && evaluatorHost.length > 0) {
20
+ hosts.push(evaluatorHost);
21
+ }
22
+ return hosts;
23
+ }
24
+
25
+ // src/sandbox.ts
26
+ function seogeoPluginSandboxed(options = {}) {
27
+ const evaluatorHost = options.evaluatorHost ?? process.env.SEOGEO_EVALUATOR_HOST ?? null;
28
+ return {
29
+ id: "aexeo-seogeo",
30
+ version: "0.0.1",
31
+ // Subpath export of this same package; must match package.json
32
+ // `exports["./sandbox"]`.
33
+ entrypoint: "@aeptus/aexeo-emdash/sandbox",
34
+ format: "standard",
35
+ capabilities: buildCapabilities(evaluatorHost),
36
+ allowedHosts: buildAllowedHosts(evaluatorHost),
37
+ // Pages mount at /admin/plugins/aexeo-seogeo/<path>. The page name
38
+ // (without leading slash) is what the sandbox entry receives in
39
+ // `body.page` when emdash POSTs the page_load interaction.
40
+ adminPages: [
41
+ { path: "/findings", label: "SEO findings" },
42
+ { path: "/document", label: "Document SEO" },
43
+ { path: "/setup", label: "Setup" }
44
+ ],
45
+ adminWidgets: [
46
+ { id: "seogeo-score", size: "third", title: "SEO score" }
47
+ ]
48
+ };
49
+ }
50
+
51
+ // src/index.ts
52
+ function seogeoPlugin(options = {}) {
53
+ return {
54
+ id: "aexeo-seogeo",
55
+ version: "0.0.1",
56
+ // Subpath import resolved by the consumer's bundler at build
57
+ // time — must match the package.json `exports["./configured"]`
58
+ // entry.
59
+ entrypoint: "@aeptus/aexeo-emdash/configured",
60
+ options: { ...options },
61
+ capabilities: [
62
+ "read:content",
63
+ "read:schema",
64
+ "kv:seogeo-baselines"
65
+ ],
66
+ adminPages: [
67
+ // "/" alias is required so emdash's /admin/plugins/<id> root
68
+ // doesn't 404 — that page is where the meta /admin/plugins
69
+ // list links to when an operator clicks the plugin entry.
70
+ { path: "/", label: "SEO findings" },
71
+ { path: "/findings", label: "SEO findings" },
72
+ { path: "/document", label: "Document SEO" }
73
+ ],
74
+ adminWidgets: [
75
+ { id: "seogeo-score", size: "third", title: "SEO score" }
76
+ ]
77
+ };
78
+ }
79
+ export {
80
+ seogeoPlugin,
81
+ seogeoPluginSandboxed
82
+ };
@@ -0,0 +1,15 @@
1
+ export interface IndexNowConfig {
2
+ siteUrl: string;
3
+ key: string;
4
+ keyLocation?: string;
5
+ }
6
+ export interface IndexNowSubmission {
7
+ ok: boolean;
8
+ status: number;
9
+ endpoint: string;
10
+ submitted: string[];
11
+ rejected: string[];
12
+ reason?: string;
13
+ }
14
+ export declare function submitIndexNow(config: IndexNowConfig, urls: readonly string[]): Promise<IndexNowSubmission>;
15
+ //# sourceMappingURL=indexnow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexnow.d.ts","sourceRoot":"","sources":["../src/indexnow.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAG7B,OAAO,EAAE,MAAM,CAAC;IAEhB,GAAG,EAAE,MAAM,CAAC;IAGZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA4B7B"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import type { EmdashDocument, Finding } from "./types.js";
2
+ import { type IndexNowConfig, type IndexNowSubmission } from "./indexnow.js";
3
+ export interface McpToolDefinition<Input, Output> {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: unknown;
7
+ handler: (input: Input) => Promise<Output>;
8
+ }
9
+ export interface CheckInput {
10
+ documents: EmdashDocument[];
11
+ configJson?: string;
12
+ }
13
+ export interface CheckOutput {
14
+ findings: Finding[];
15
+ errors: Finding[];
16
+ byRoute: Record<string, Finding[]>;
17
+ totals: {
18
+ findings: number;
19
+ errors: number;
20
+ warnings: number;
21
+ };
22
+ }
23
+ export interface IndexNowSubmitInput {
24
+ config: IndexNowConfig;
25
+ urls: string[];
26
+ }
27
+ export declare const tools: readonly [McpToolDefinition<CheckInput, CheckOutput>, McpToolDefinition<IndexNowSubmitInput, IndexNowSubmission>];
28
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAExB,MAAM,eAAe,CAAC;AAMvB,MAAM,WAAW,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AA4CD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAsCD,eAAO,MAAM,KAAK,mHAA2C,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { EmdashDocument, Finding } from "./types.js";
2
+ import { type EmdashContentItem } from "./adapter.js";
3
+ import type { SidecarHttp } from "./sidecar.js";
4
+ export declare function buildCapabilities(evaluatorHost: string | null): readonly string[];
5
+ export declare function buildAllowedHosts(evaluatorHost: string | null): readonly string[];
6
+ export declare const capabilities: readonly string[];
7
+ export interface KvEntry<T = unknown> {
8
+ key: string;
9
+ value: T;
10
+ }
11
+ export interface KvNamespace {
12
+ get<T = unknown>(key: string): Promise<T | null>;
13
+ set(key: string, value: unknown): Promise<void>;
14
+ delete(key: string): Promise<boolean>;
15
+ list<T = unknown>(prefix?: string): Promise<KvEntry<T>[]>;
16
+ }
17
+ export declare const CONFIG_URL_KEY = "config:evaluator_url";
18
+ export declare const CONFIG_TOKEN_KEY = "config:eval_token";
19
+ export interface SidecarRuntimeConfig {
20
+ url: string;
21
+ token: string;
22
+ }
23
+ export declare function readSidecarConfig(kv: KvNamespace): Promise<SidecarRuntimeConfig | null>;
24
+ export declare function writeSidecarConfig(kv: KvNamespace, config: SidecarRuntimeConfig): Promise<void>;
25
+ export interface ContentList {
26
+ items: EmdashContentItem[];
27
+ cursor?: string;
28
+ hasMore: boolean;
29
+ }
30
+ export interface SandboxContentApi {
31
+ list(collection: string, opts?: {
32
+ limit?: number;
33
+ cursor?: string;
34
+ }): Promise<ContentList>;
35
+ }
36
+ export interface SandboxCtx {
37
+ kv: KvNamespace;
38
+ http: SidecarHttp;
39
+ content: SandboxContentApi;
40
+ log?: {
41
+ info(msg: string, data?: unknown): void;
42
+ warn(msg: string, data?: unknown): void;
43
+ error(msg: string, data?: unknown): void;
44
+ };
45
+ }
46
+ export interface ContentAfterSaveEvent {
47
+ content: EmdashContentItem;
48
+ collection: string;
49
+ isNew: boolean;
50
+ }
51
+ export declare function handleAfterSave(_event: ContentAfterSaveEvent, _ctx: SandboxCtx): Promise<void>;
52
+ export declare function handleAfterSaveConfigured(event: ContentAfterSaveEvent, ctx: SandboxCtx, evaluator: EvaluatorFn): Promise<void>;
53
+ export declare const DEFAULT_COLLECTIONS: readonly ["posts", "pages"];
54
+ export interface RefreshSummary {
55
+ documentsScanned: number;
56
+ routesUpdated: number;
57
+ totalFindings: number;
58
+ errors: string[];
59
+ }
60
+ export type EvaluationOutcome = {
61
+ ok: true;
62
+ findings: Finding[];
63
+ } | {
64
+ ok: false;
65
+ reason: string;
66
+ detail: string;
67
+ };
68
+ export type EvaluatorFn = (documents: readonly EmdashDocument[]) => Promise<EvaluationOutcome>;
69
+ export declare function evaluateAndPersistAll(ctx: SandboxCtx, options: {
70
+ collections?: readonly string[];
71
+ evaluator: EvaluatorFn;
72
+ }): Promise<RefreshSummary>;
73
+ export declare function findingsKey(route: string): string;
74
+ export declare function documentKey(route: string): string;
75
+ export declare function readAllDocuments(kv: KvNamespace): Promise<EmdashDocument[]>;
76
+ export declare function readFindings(kv: KvNamespace, route: string): Promise<Finding[]>;
77
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { KvNamespace, SandboxCtx } from "./plugin.js";
2
+ import { handleAfterSave } from "./plugin.js";
3
+ export type BlockInteraction = {
4
+ type: "page_load";
5
+ page: string;
6
+ } | {
7
+ type: "block_action";
8
+ action_id: string;
9
+ block_id?: string;
10
+ value?: unknown;
11
+ } | {
12
+ type: "form_submit";
13
+ action_id: string;
14
+ block_id?: string;
15
+ values: Record<string, unknown>;
16
+ };
17
+ export interface RouteInput {
18
+ input: BlockInteraction;
19
+ request?: unknown;
20
+ requestMeta?: unknown;
21
+ }
22
+ export interface DispatchCtx {
23
+ body: BlockInteraction;
24
+ kv: KvNamespace;
25
+ ctx: SandboxCtx;
26
+ }
27
+ export interface BlockResponse {
28
+ blocks: unknown[];
29
+ toast?: {
30
+ message: string;
31
+ type: "success" | "error" | "info";
32
+ };
33
+ }
34
+ declare function handleAdminRoute(input: RouteInput, ctx: SandboxCtx): Promise<BlockResponse>;
35
+ declare const _default: {
36
+ hooks: {
37
+ "content:afterSave": typeof handleAfterSave;
38
+ };
39
+ routes: {
40
+ admin: {
41
+ handler: typeof handleAdminRoute;
42
+ };
43
+ };
44
+ mcpTools: readonly [import("./mcp.js").McpToolDefinition<import("./mcp.js").CheckInput, import("./mcp.js").CheckOutput>, import("./mcp.js").McpToolDefinition<import("./mcp.js").IndexNowSubmitInput, import("./indexnow.js").IndexNowSubmission>];
45
+ };
46
+ export default _default;
47
+ //# sourceMappingURL=sandbox-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-entry.d.ts","sourceRoot":"","sources":["../src/sandbox-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAEX,UAAU,EAEX,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,eAAe,EAKhB,MAAM,aAAa,CAAC;AAiBrB,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAON,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,WAAW,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;KAAE,CAAC;CACjE;AAMD,iBAAe,gBAAgB,CAC7B,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,aAAa,CAAC,CAuBxB;;;;;;;;;;;;AAkhBD,wBAWG"}