@omgbase/astro 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.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/links.d.ts +75 -0
- package/dist/links.d.ts.map +1 -0
- package/dist/links.js +198 -0
- package/dist/links.js.map +1 -0
- package/dist/loader.d.ts +70 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +75 -0
- package/dist/loader.js.map +1 -0
- package/dist/local.d.ts +31 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +139 -0
- package/dist/local.js.map +1 -0
- package/dist/map.d.ts +41 -0
- package/dist/map.d.ts.map +1 -0
- package/dist/map.js +106 -0
- package/dist/map.js.map +1 -0
- package/dist/remote.d.ts +49 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +155 -0
- package/dist/remote.js.map +1 -0
- package/dist/schema.d.ts +16 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +115 -0
- package/dist/server.js.map +1 -0
- package/dist/transport.d.ts +74 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +2 -0
- package/dist/transport.js.map +1 -0
- package/dist/watch.d.ts +38 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +215 -0
- package/dist/watch.js.map +1 -0
- package/package.json +48 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { Workspace, freshnessSweep, buildServer } from "@omgbase/core";
|
|
4
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
5
|
+
function resolveRepo(ws, slug) {
|
|
6
|
+
if (slug) {
|
|
7
|
+
const found = ws.repoBySlug(slug);
|
|
8
|
+
if (!found)
|
|
9
|
+
throw new Error(`repo not found: ${slug}`);
|
|
10
|
+
return found;
|
|
11
|
+
}
|
|
12
|
+
const repos = ws.repos();
|
|
13
|
+
if (repos.length === 0)
|
|
14
|
+
throw new Error("no repos in workspace");
|
|
15
|
+
if (repos.length > 1) {
|
|
16
|
+
throw new Error(`ambiguous repo; pass repo: one of ${repos.map((r) => r.slug).join(", ")}`);
|
|
17
|
+
}
|
|
18
|
+
return repos[0];
|
|
19
|
+
}
|
|
20
|
+
function authorized(req, token) {
|
|
21
|
+
if (!token)
|
|
22
|
+
return true;
|
|
23
|
+
const header = req.headers.authorization;
|
|
24
|
+
if (!header)
|
|
25
|
+
return false;
|
|
26
|
+
const [scheme, value] = header.split(/\s+/, 2);
|
|
27
|
+
return scheme?.toLowerCase() === "bearer" && value === token;
|
|
28
|
+
}
|
|
29
|
+
function readBody(req) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const chunks = [];
|
|
32
|
+
req.on("data", (c) => chunks.push(c));
|
|
33
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
|
|
34
|
+
req.on("error", reject);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Demo/CI Streamable HTTP MCP server for a local workspace.
|
|
39
|
+
*
|
|
40
|
+
* Same protocol as `omg … --server https://…` against a stdio-mcp-to-http wrapper
|
|
41
|
+
* or a future `omg serve`. Prefer pointing production builds at your real MCP HTTP
|
|
42
|
+
* endpoint; this helper is for local remote-transport demos without that wrapper.
|
|
43
|
+
*/
|
|
44
|
+
export async function createMcpHttpServer(opts) {
|
|
45
|
+
const ws = Workspace.open(opts.workspace);
|
|
46
|
+
const repo = resolveRepo(ws, opts.repo);
|
|
47
|
+
if (!opts.stale && repo.rootPath) {
|
|
48
|
+
freshnessSweep(ws.store, repo.repoId, repo.rootPath);
|
|
49
|
+
}
|
|
50
|
+
const mcp = buildServer({
|
|
51
|
+
store: ws.store,
|
|
52
|
+
repoId: repo.repoId,
|
|
53
|
+
...(repo.rootPath ? { rootPath: repo.rootPath } : {}),
|
|
54
|
+
});
|
|
55
|
+
const transport = new StreamableHTTPServerTransport({
|
|
56
|
+
sessionIdGenerator: () => randomUUID(),
|
|
57
|
+
});
|
|
58
|
+
await mcp.connect(transport);
|
|
59
|
+
const host = opts.host ?? "127.0.0.1";
|
|
60
|
+
const port = opts.port ?? 0;
|
|
61
|
+
const mcpPath = opts.path ?? "/mcp";
|
|
62
|
+
const server = createServer((req, res) => {
|
|
63
|
+
void (async () => {
|
|
64
|
+
try {
|
|
65
|
+
if (!authorized(req, opts.token)) {
|
|
66
|
+
res.writeHead(401, { "content-type": "application/json" });
|
|
67
|
+
res.end(JSON.stringify({ error: "unauthorized" }));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const raw = await readBody(req);
|
|
71
|
+
const body = raw ? JSON.parse(raw) : undefined;
|
|
72
|
+
await transport.handleRequest(req, res, body);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
if (!res.headersSent) {
|
|
76
|
+
res.writeHead(500, { "content-type": "application/json" });
|
|
77
|
+
res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
})();
|
|
81
|
+
});
|
|
82
|
+
await new Promise((resolve, reject) => {
|
|
83
|
+
server.once("error", reject);
|
|
84
|
+
server.listen(port, host, () => resolve());
|
|
85
|
+
});
|
|
86
|
+
const address = server.address();
|
|
87
|
+
if (!address || typeof address === "string") {
|
|
88
|
+
throw new Error("MCP HTTP server failed to bind");
|
|
89
|
+
}
|
|
90
|
+
const url = `http://${host}:${address.port}${mcpPath.startsWith("/") ? mcpPath : `/${mcpPath}`}`;
|
|
91
|
+
return {
|
|
92
|
+
server,
|
|
93
|
+
url,
|
|
94
|
+
host,
|
|
95
|
+
port: address.port,
|
|
96
|
+
close: () => new Promise((resolve, reject) => {
|
|
97
|
+
server.close(async (err) => {
|
|
98
|
+
try {
|
|
99
|
+
await mcp.close();
|
|
100
|
+
ws.store.close();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
/* ignore */
|
|
104
|
+
}
|
|
105
|
+
if (err)
|
|
106
|
+
reject(err);
|
|
107
|
+
else
|
|
108
|
+
resolve();
|
|
109
|
+
});
|
|
110
|
+
}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/** @deprecated Use {@link createMcpHttpServer}. */
|
|
114
|
+
export const createPublicationServer = createMcpHttpServer;
|
|
115
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/** A lean query hit before hydration. */
|
|
2
|
+
export interface QueryHit {
|
|
3
|
+
id: string;
|
|
4
|
+
path: string;
|
|
5
|
+
/** Optional projections returned by the OQX query. */
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
/** Fully hydrated document ready for Astro entry mapping. */
|
|
9
|
+
export interface HydratedDoc {
|
|
10
|
+
id: string;
|
|
11
|
+
path: string;
|
|
12
|
+
/** Properties grouped by source: frontmatter / inline / computed. */
|
|
13
|
+
properties: Record<string, Record<string, unknown>>;
|
|
14
|
+
/** Full reconstructed file bytes (includes YAML frontmatter when present). */
|
|
15
|
+
body: string;
|
|
16
|
+
/** Content hash for digest / cache skipping when available. */
|
|
17
|
+
contentHash: string | null;
|
|
18
|
+
rev: string | null;
|
|
19
|
+
}
|
|
20
|
+
export interface QueryOptions {
|
|
21
|
+
query: string;
|
|
22
|
+
limit?: number;
|
|
23
|
+
repo?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface HydrateOptions {
|
|
26
|
+
ids: string[];
|
|
27
|
+
repo?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ChangesPage {
|
|
30
|
+
digests: Array<{
|
|
31
|
+
seq: number;
|
|
32
|
+
summary?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/** Current tip of the repo commit feed — use as the next poll cursor. */
|
|
35
|
+
head: number;
|
|
36
|
+
truncated: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface ChangesSinceOptions {
|
|
39
|
+
/** Exclusive lower bound (repo commit seq). Omit / use a high value to probe `head`. */
|
|
40
|
+
cursor?: number;
|
|
41
|
+
limit?: number;
|
|
42
|
+
repo?: string;
|
|
43
|
+
}
|
|
44
|
+
/** Live document out-edge used for identity-gated markdown link rewriting. */
|
|
45
|
+
export interface DocOutEdge {
|
|
46
|
+
src: string;
|
|
47
|
+
dst: string;
|
|
48
|
+
dstPath: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface OutEdgesOptions {
|
|
51
|
+
/** Source doc ids to collect out-edges for. */
|
|
52
|
+
ids: string[];
|
|
53
|
+
repo?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Transport seam: local `@omgbase/core` or remote Streamable HTTP MCP.
|
|
57
|
+
* Both paths share query → hydrate; optional `changesSince` enables remote watch.
|
|
58
|
+
*/
|
|
59
|
+
export interface Transport {
|
|
60
|
+
readonly kind: "local" | "remote";
|
|
61
|
+
query(opts: QueryOptions): Promise<QueryHit[]>;
|
|
62
|
+
hydrate(opts: HydrateOptions): Promise<HydratedDoc[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Live out-edges from the given docs to document destinations (`$dst` / `$dst_path`).
|
|
65
|
+
* Used to gate markdown link rewrites to destinations omg already resolved.
|
|
66
|
+
*/
|
|
67
|
+
outEdges?(opts: OutEdgesOptions): Promise<DocOutEdge[]>;
|
|
68
|
+
/** Optional change feed for remote (and local) live reload. */
|
|
69
|
+
changesSince?(opts?: ChangesSinceOptions): Promise<ChangesPage>;
|
|
70
|
+
/** Local filesystem root to watch in `astro dev`, when available. */
|
|
71
|
+
watchRoot?: string | null;
|
|
72
|
+
close?(): void | Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACtD;;;OAGG;IACH,QAAQ,CAAC,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACxD,+DAA+D;IAC/D,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAChE,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":""}
|
package/dist/watch.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { LoaderContext } from "astro/loaders";
|
|
2
|
+
import type { Transport } from "./transport.js";
|
|
3
|
+
import type { SlugContext } from "./map.js";
|
|
4
|
+
import { type HrefContext } from "./links.js";
|
|
5
|
+
export type WatchOption = boolean | {
|
|
6
|
+
/** Poll interval for remote `changes_since` (default 2000). */
|
|
7
|
+
intervalMs?: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function stopWatch(collection: string): Promise<void>;
|
|
10
|
+
export declare function syncEntries(context: LoaderContext, transport: Transport, opts: {
|
|
11
|
+
query: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
repo?: string;
|
|
14
|
+
slug: (ctx: SlugContext) => string;
|
|
15
|
+
href: false | ((ctx: HrefContext) => string);
|
|
16
|
+
}): Promise<{
|
|
17
|
+
seen: number;
|
|
18
|
+
written: number;
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* After the initial load, keep the collection fresh in `astro dev`.
|
|
22
|
+
*
|
|
23
|
+
* - **Local:** subscribe to Astro's Vite FS watcher on the vault root (same path
|
|
24
|
+
* glob/file loaders use). Updates rewrite the content data store → existing HMR.
|
|
25
|
+
* - **Remote:** poll MCP `changes_since`; on new commits, re-query/hydrate into
|
|
26
|
+
* the store → same data-store write → same HMR.
|
|
27
|
+
*
|
|
28
|
+
* No Astro integration required; enabled automatically when `watcher` is present.
|
|
29
|
+
*/
|
|
30
|
+
export declare function startWatch(context: LoaderContext, transport: Transport, opts: {
|
|
31
|
+
query: string;
|
|
32
|
+
limit?: number;
|
|
33
|
+
repo?: string;
|
|
34
|
+
slug: (ctx: SlugContext) => string;
|
|
35
|
+
href: false | ((ctx: HrefContext) => string);
|
|
36
|
+
watch: WatchOption;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAKL,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAKpB,MAAM,MAAM,WAAW,GACnB,OAAO,GACP;IACE,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AASN,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjE;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;IACnC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC;CAC9C,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAqG5C;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;IACnC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC;IAC7C,KAAK,EAAE,WAAW,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAwGf"}
|
package/dist/watch.js
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { mapDoc, mergeHitProjections } from "./map.js";
|
|
2
|
+
import { allowedDstsFor, buildHrefIndex, hrefIndexFingerprint, rewriteMarkdownLinks, } from "./links.js";
|
|
3
|
+
const CURSOR_META = "omg:changes-cursor";
|
|
4
|
+
const DEFAULT_POLL_MS = 2000;
|
|
5
|
+
/** Per-collection watch handles so a re-sync replaces the previous poll/listeners. */
|
|
6
|
+
const watches = new Map();
|
|
7
|
+
export async function stopWatch(collection) {
|
|
8
|
+
const prev = watches.get(collection);
|
|
9
|
+
if (!prev)
|
|
10
|
+
return;
|
|
11
|
+
watches.delete(collection);
|
|
12
|
+
await prev.stop();
|
|
13
|
+
}
|
|
14
|
+
export async function syncEntries(context, transport, opts) {
|
|
15
|
+
const { store, logger, parseData, renderMarkdown, generateDigest } = context;
|
|
16
|
+
const hits = await transport.query({
|
|
17
|
+
query: opts.query,
|
|
18
|
+
...(opts.limit !== undefined ? { limit: opts.limit } : {}),
|
|
19
|
+
...(opts.repo !== undefined ? { repo: opts.repo } : {}),
|
|
20
|
+
});
|
|
21
|
+
const ids = hits.map((h) => h.id);
|
|
22
|
+
const docs = ids.length
|
|
23
|
+
? await transport.hydrate({
|
|
24
|
+
ids,
|
|
25
|
+
...(opts.repo !== undefined ? { repo: opts.repo } : {}),
|
|
26
|
+
})
|
|
27
|
+
: [];
|
|
28
|
+
const byId = new Map(docs.map((d) => [d.id, d]));
|
|
29
|
+
const seen = new Set();
|
|
30
|
+
let written = 0;
|
|
31
|
+
// Identity → site URL for every hydrated doc in this collection.
|
|
32
|
+
let hrefIndex = buildHrefIndex([]);
|
|
33
|
+
let edges = [];
|
|
34
|
+
let hrefFp = "";
|
|
35
|
+
if (opts.href !== false && docs.length > 0) {
|
|
36
|
+
const hrefOf = opts.href;
|
|
37
|
+
const entries = docs.map((doc) => {
|
|
38
|
+
const slug = opts.slug({
|
|
39
|
+
path: doc.path,
|
|
40
|
+
docId: doc.id,
|
|
41
|
+
properties: doc.properties,
|
|
42
|
+
});
|
|
43
|
+
const href = hrefOf({
|
|
44
|
+
path: doc.path,
|
|
45
|
+
docId: doc.id,
|
|
46
|
+
slug,
|
|
47
|
+
properties: doc.properties,
|
|
48
|
+
});
|
|
49
|
+
return { docId: doc.id, path: doc.path, href };
|
|
50
|
+
});
|
|
51
|
+
hrefIndex = buildHrefIndex(entries);
|
|
52
|
+
hrefFp = hrefIndexFingerprint(hrefIndex);
|
|
53
|
+
if (transport.outEdges) {
|
|
54
|
+
try {
|
|
55
|
+
edges = await transport.outEdges({
|
|
56
|
+
ids: docs.map((d) => d.id),
|
|
57
|
+
...(opts.repo !== undefined ? { repo: opts.repo } : {}),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
logger.warn(`omgbase out-edges unavailable; link rewrite uses path resolution only: ${err instanceof Error ? err.message : String(err)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const hit of hits) {
|
|
66
|
+
const doc = byId.get(hit.id);
|
|
67
|
+
if (!doc) {
|
|
68
|
+
logger.warn(`hydrate missed doc ${hit.id} (${hit.path})`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
seen.add(doc.id);
|
|
72
|
+
const mapped = mapDoc(doc, opts.slug);
|
|
73
|
+
mapped.data = mergeHitProjections(mapped.data, hit);
|
|
74
|
+
let body = mapped.body;
|
|
75
|
+
if (opts.href !== false && hrefIndex.byDocId.size > 0) {
|
|
76
|
+
const allowed = edges.length
|
|
77
|
+
? allowedDstsFor(doc.id, edges, hrefIndex)
|
|
78
|
+
: undefined;
|
|
79
|
+
// Prefer edge-gated rewrite when we have live out-edges; if this doc has
|
|
80
|
+
// none into the collection, still allow path resolution into hydrated docs.
|
|
81
|
+
const gate = allowed && allowed.size > 0 ? allowed : undefined;
|
|
82
|
+
body = rewriteMarkdownLinks(body, {
|
|
83
|
+
srcPath: doc.path,
|
|
84
|
+
hrefIndex,
|
|
85
|
+
...(gate ? { allowedDstIds: gate } : {}),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const baseDigest = mapped.digest || generateDigest(mapped.body);
|
|
89
|
+
const digest = hrefFp ? `${baseDigest}|href:${hrefFp}` : baseDigest;
|
|
90
|
+
const existing = store.get(doc.id);
|
|
91
|
+
if (existing?.digest === digest)
|
|
92
|
+
continue;
|
|
93
|
+
const data = await parseData({ id: doc.id, data: mapped.data });
|
|
94
|
+
const rendered = await renderMarkdown(body);
|
|
95
|
+
store.set({ id: doc.id, data, body, digest, rendered });
|
|
96
|
+
written += 1;
|
|
97
|
+
}
|
|
98
|
+
for (const id of store.keys()) {
|
|
99
|
+
if (!seen.has(id))
|
|
100
|
+
store.delete(id);
|
|
101
|
+
}
|
|
102
|
+
return { seen: seen.size, written };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* After the initial load, keep the collection fresh in `astro dev`.
|
|
106
|
+
*
|
|
107
|
+
* - **Local:** subscribe to Astro's Vite FS watcher on the vault root (same path
|
|
108
|
+
* glob/file loaders use). Updates rewrite the content data store → existing HMR.
|
|
109
|
+
* - **Remote:** poll MCP `changes_since`; on new commits, re-query/hydrate into
|
|
110
|
+
* the store → same data-store write → same HMR.
|
|
111
|
+
*
|
|
112
|
+
* No Astro integration required; enabled automatically when `watcher` is present.
|
|
113
|
+
*/
|
|
114
|
+
export async function startWatch(context, transport, opts) {
|
|
115
|
+
const { collection, watcher, meta, logger } = context;
|
|
116
|
+
if (!watcher)
|
|
117
|
+
return;
|
|
118
|
+
if (opts.watch === false)
|
|
119
|
+
return;
|
|
120
|
+
const intervalMs = typeof opts.watch === "object" && opts.watch.intervalMs !== undefined
|
|
121
|
+
? opts.watch.intervalMs
|
|
122
|
+
: DEFAULT_POLL_MS;
|
|
123
|
+
let busy = false;
|
|
124
|
+
let stopped = false;
|
|
125
|
+
const reload = async (reason) => {
|
|
126
|
+
if (busy || stopped)
|
|
127
|
+
return;
|
|
128
|
+
busy = true;
|
|
129
|
+
try {
|
|
130
|
+
const { written } = await syncEntries(context, transport, opts);
|
|
131
|
+
logger.info(`omgbase reload (${reason})${written ? `: ${written} entries updated` : ""}`);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
logger.error(`omgbase reload failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
busy = false;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
const cleanups = [];
|
|
141
|
+
// Local vault: piggyback on Astro's Vite watcher (identical to glob()).
|
|
142
|
+
const root = transport.watchRoot;
|
|
143
|
+
if (transport.kind === "local" && root) {
|
|
144
|
+
watcher.add(root);
|
|
145
|
+
let timer = null;
|
|
146
|
+
const onFs = () => {
|
|
147
|
+
if (timer)
|
|
148
|
+
clearTimeout(timer);
|
|
149
|
+
timer = setTimeout(() => {
|
|
150
|
+
void reload("fs");
|
|
151
|
+
}, 150);
|
|
152
|
+
};
|
|
153
|
+
watcher.on("change", onFs);
|
|
154
|
+
watcher.on("add", onFs);
|
|
155
|
+
watcher.on("unlink", onFs);
|
|
156
|
+
cleanups.push(() => {
|
|
157
|
+
if (timer)
|
|
158
|
+
clearTimeout(timer);
|
|
159
|
+
watcher.off("change", onFs);
|
|
160
|
+
watcher.off("add", onFs);
|
|
161
|
+
watcher.off("unlink", onFs);
|
|
162
|
+
});
|
|
163
|
+
logger.info(`watching local omgbase vault ${root}`);
|
|
164
|
+
}
|
|
165
|
+
// Remote (or local without a useful root): poll changes_since.
|
|
166
|
+
if (transport.changesSince && (transport.kind === "remote" || !root)) {
|
|
167
|
+
let cursor = meta.get(CURSOR_META);
|
|
168
|
+
if (cursor === undefined) {
|
|
169
|
+
// Seed at tip so the first poll doesn't replay the whole history.
|
|
170
|
+
const tip = await transport.changesSince({
|
|
171
|
+
cursor: Number.MAX_SAFE_INTEGER,
|
|
172
|
+
...(opts.repo !== undefined ? { repo: opts.repo } : {}),
|
|
173
|
+
});
|
|
174
|
+
cursor = String(tip.head);
|
|
175
|
+
meta.set(CURSOR_META, cursor);
|
|
176
|
+
}
|
|
177
|
+
const tick = async () => {
|
|
178
|
+
if (busy || stopped || !transport.changesSince)
|
|
179
|
+
return;
|
|
180
|
+
try {
|
|
181
|
+
const page = await transport.changesSince({
|
|
182
|
+
cursor: Number(cursor),
|
|
183
|
+
...(opts.repo !== undefined ? { repo: opts.repo } : {}),
|
|
184
|
+
});
|
|
185
|
+
if (page.digests.length === 0) {
|
|
186
|
+
if (page.head !== Number(cursor)) {
|
|
187
|
+
cursor = String(page.head);
|
|
188
|
+
meta.set(CURSOR_META, cursor);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
cursor = String(page.head);
|
|
193
|
+
meta.set(CURSOR_META, cursor);
|
|
194
|
+
await reload(`changes_since → ${cursor}`);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
logger.warn(`omgbase changes_since poll failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const id = setInterval(() => {
|
|
201
|
+
void tick();
|
|
202
|
+
}, intervalMs);
|
|
203
|
+
cleanups.push(() => clearInterval(id));
|
|
204
|
+
logger.info(`polling omgbase changes_since every ${intervalMs}ms`);
|
|
205
|
+
}
|
|
206
|
+
watches.set(collection, {
|
|
207
|
+
stop: async () => {
|
|
208
|
+
stopped = true;
|
|
209
|
+
for (const c of cleanups)
|
|
210
|
+
await c();
|
|
211
|
+
await transport.close?.();
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@omgbase/astro",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Astro Content Loader and helpers to use omgbase as a CMS",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=22"
|
|
12
|
+
},
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./server": {
|
|
21
|
+
"types": "./dist/server.d.ts",
|
|
22
|
+
"import": "./dist/server.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
31
|
+
"@omgbase/core": "^0.5.0",
|
|
32
|
+
"@omgbase/sync": "^0.4.2"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"astro": ">=5.0.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"astro": "^7.3.5",
|
|
39
|
+
"typescript": "^5.7.2",
|
|
40
|
+
"vitest": "^2.1.8"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc -p tsconfig.json",
|
|
44
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"lint": "echo 'no lint yet'"
|
|
47
|
+
}
|
|
48
|
+
}
|