@the-focus-ai/artifacts 1.1.0 → 1.2.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 (46) hide show
  1. package/README.md +47 -0
  2. package/dist/src/cli.d.ts +2 -1
  3. package/dist/src/cli.d.ts.map +1 -1
  4. package/dist/src/cli.js +107 -4
  5. package/dist/src/cli.js.map +1 -1
  6. package/dist/src/diff.d.ts +16 -0
  7. package/dist/src/diff.d.ts.map +1 -0
  8. package/dist/src/diff.js +90 -0
  9. package/dist/src/diff.js.map +1 -0
  10. package/dist/src/doc-asset-collect.d.ts +29 -0
  11. package/dist/src/doc-asset-collect.d.ts.map +1 -0
  12. package/dist/src/doc-asset-collect.js +112 -0
  13. package/dist/src/doc-asset-collect.js.map +1 -0
  14. package/dist/src/doc-asset-rewrite.d.ts +6 -0
  15. package/dist/src/doc-asset-rewrite.d.ts.map +1 -0
  16. package/dist/src/doc-asset-rewrite.js +15 -0
  17. package/dist/src/doc-asset-rewrite.js.map +1 -0
  18. package/dist/src/front-matter.d.ts +36 -0
  19. package/dist/src/front-matter.d.ts.map +1 -0
  20. package/dist/src/front-matter.js +105 -0
  21. package/dist/src/front-matter.js.map +1 -0
  22. package/dist/src/http.d.ts +5 -0
  23. package/dist/src/http.d.ts.map +1 -1
  24. package/dist/src/http.js +62 -0
  25. package/dist/src/http.js.map +1 -1
  26. package/dist/src/index.d.ts +7 -0
  27. package/dist/src/index.d.ts.map +1 -1
  28. package/dist/src/index.js +7 -0
  29. package/dist/src/index.js.map +1 -1
  30. package/dist/src/living-doc.d.ts +184 -0
  31. package/dist/src/living-doc.d.ts.map +1 -0
  32. package/dist/src/living-doc.js +656 -0
  33. package/dist/src/living-doc.js.map +1 -0
  34. package/dist/src/remote-api.d.ts +38 -0
  35. package/dist/src/remote-api.d.ts.map +1 -1
  36. package/dist/src/remote-api.js +63 -0
  37. package/dist/src/remote-api.js.map +1 -1
  38. package/dist/src/storage/doc-asset-content.d.ts +55 -0
  39. package/dist/src/storage/doc-asset-content.d.ts.map +1 -0
  40. package/dist/src/storage/doc-asset-content.js +145 -0
  41. package/dist/src/storage/doc-asset-content.js.map +1 -0
  42. package/dist/src/storage/living-doc-metadata.d.ts +165 -0
  43. package/dist/src/storage/living-doc-metadata.d.ts.map +1 -0
  44. package/dist/src/storage/living-doc-metadata.js +416 -0
  45. package/dist/src/storage/living-doc-metadata.js.map +1 -0
  46. package/package.json +17 -2
@@ -0,0 +1,36 @@
1
+ export interface SplitFrontMatter {
2
+ /** Raw YAML between the opening/closing `---` fences, or null if none. */
3
+ matter: string | null;
4
+ body: string;
5
+ }
6
+ /**
7
+ * Split Markdown into optional YAML front matter and the body.
8
+ * Preserves the exact matter text so editors can round-trip without reformat.
9
+ */
10
+ export declare function splitFrontMatter(markdown: string): SplitFrontMatter;
11
+ /**
12
+ * Reassemble Markdown from optional front matter and body.
13
+ * Empty/whitespace-only matter drops the fences entirely.
14
+ */
15
+ export declare function joinFrontMatter(matter: string | null, body: string): string;
16
+ /** Parse front-matter YAML into a plain object, or null if missing/invalid. */
17
+ export declare function parseFrontMatterData(matter: string | null): Record<string, unknown> | null;
18
+ /** Prefer a string `title` from front matter when present. */
19
+ export declare function titleFromFrontMatter(matter: string | null): string | null;
20
+ /**
21
+ * Title for a Living Doc: front-matter `title`, else first heading/line in the
22
+ * body (front matter itself is never used as the title).
23
+ */
24
+ export declare function deriveMarkdownTitle(markdown: string): string | null;
25
+ /** Body only — safe to feed to markdown-it / TipTap. */
26
+ export declare function markdownBody(markdown: string): string;
27
+ /** Serialize a plain object back to YAML suitable for front-matter fences. */
28
+ export declare function serializeFrontMatterData(data: Record<string, unknown>): string;
29
+ /**
30
+ * Parse a single field value from the front-matter editor.
31
+ * Prefer YAML scalars/collections; fall back to the raw string.
32
+ */
33
+ export declare function parseFrontMatterFieldValue(raw: string): unknown;
34
+ /** Format a value for display in a single-line field editor. */
35
+ export declare function formatFrontMatterFieldValue(value: unknown): string;
36
+ //# sourceMappingURL=front-matter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"front-matter.d.ts","sourceRoot":"","sources":["../../src/front-matter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAInE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhC;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAOzE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWnE;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,8EAA8E;AAC9E,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAED,gEAAgE;AAChE,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOlE"}
@@ -0,0 +1,105 @@
1
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
2
+ // Opening fence at the start of the file, then YAML, then a closing fence.
3
+ const FRONT_MATTER_RE = /^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)([\s\S]*)$/;
4
+ /**
5
+ * Split Markdown into optional YAML front matter and the body.
6
+ * Preserves the exact matter text so editors can round-trip without reformat.
7
+ */
8
+ export function splitFrontMatter(markdown) {
9
+ const match = markdown.match(FRONT_MATTER_RE);
10
+ if (!match)
11
+ return { matter: null, body: markdown };
12
+ return { matter: match[1], body: match[2] ?? "" };
13
+ }
14
+ /**
15
+ * Reassemble Markdown from optional front matter and body.
16
+ * Empty/whitespace-only matter drops the fences entirely.
17
+ */
18
+ export function joinFrontMatter(matter, body) {
19
+ if (matter === null)
20
+ return body;
21
+ const trimmed = matter.replace(/^\uFEFF/, "").replace(/\s+$/, "");
22
+ if (trimmed.length === 0)
23
+ return body;
24
+ const bodyPart = body.replace(/^\r?\n/, "");
25
+ return `---\n${trimmed}\n---\n${bodyPart}`;
26
+ }
27
+ /** Parse front-matter YAML into a plain object, or null if missing/invalid. */
28
+ export function parseFrontMatterData(matter) {
29
+ if (matter === null)
30
+ return null;
31
+ try {
32
+ const data = parseYaml(matter);
33
+ if (data && typeof data === "object" && !Array.isArray(data)) {
34
+ return data;
35
+ }
36
+ return null;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /** Prefer a string `title` from front matter when present. */
43
+ export function titleFromFrontMatter(matter) {
44
+ const data = parseFrontMatterData(matter);
45
+ if (!data)
46
+ return null;
47
+ const title = data.title;
48
+ if (typeof title !== "string")
49
+ return null;
50
+ const trimmed = title.trim();
51
+ return trimmed.length > 0 ? trimmed.slice(0, 200) : null;
52
+ }
53
+ /**
54
+ * Title for a Living Doc: front-matter `title`, else first heading/line in the
55
+ * body (front matter itself is never used as the title).
56
+ */
57
+ export function deriveMarkdownTitle(markdown) {
58
+ const { matter, body } = splitFrontMatter(markdown);
59
+ const fromMatter = titleFromFrontMatter(matter);
60
+ if (fromMatter)
61
+ return fromMatter;
62
+ for (const line of body.split("\n")) {
63
+ const heading = line.match(/^#{1,6}\s+(.+?)\s*$/);
64
+ if (heading)
65
+ return heading[1].slice(0, 200);
66
+ if (line.trim().length > 0)
67
+ return line.trim().slice(0, 200);
68
+ }
69
+ return null;
70
+ }
71
+ /** Body only — safe to feed to markdown-it / TipTap. */
72
+ export function markdownBody(markdown) {
73
+ return splitFrontMatter(markdown).body;
74
+ }
75
+ /** Serialize a plain object back to YAML suitable for front-matter fences. */
76
+ export function serializeFrontMatterData(data) {
77
+ return stringifyYaml(data, { lineWidth: 0 }).replace(/\n$/, "");
78
+ }
79
+ /**
80
+ * Parse a single field value from the front-matter editor.
81
+ * Prefer YAML scalars/collections; fall back to the raw string.
82
+ */
83
+ export function parseFrontMatterFieldValue(raw) {
84
+ const trimmed = raw.trim();
85
+ if (trimmed.length === 0)
86
+ return "";
87
+ try {
88
+ return parseYaml(trimmed);
89
+ }
90
+ catch {
91
+ return raw;
92
+ }
93
+ }
94
+ /** Format a value for display in a single-line field editor. */
95
+ export function formatFrontMatterFieldValue(value) {
96
+ if (value === null || value === undefined)
97
+ return "";
98
+ if (typeof value === "string")
99
+ return value;
100
+ if (typeof value === "number" || typeof value === "boolean") {
101
+ return String(value);
102
+ }
103
+ return stringifyYaml(value, { lineWidth: 0 }).replace(/\n$/, "");
104
+ }
105
+ //# sourceMappingURL=front-matter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"front-matter.js","sourceRoot":"","sources":["../../src/front-matter.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type ServeLivingDocViewInput } from "./living-doc.js";
2
3
  import { type ServePublicationInput } from "./publication.js";
3
4
  export declare function writeWebResponseToNodeResponse(webResponse: Response, nodeResponse: ServerResponse): Promise<void>;
4
5
  export declare function servePublicationNodeRequest(nodeRequest: IncomingMessage, nodeResponse: ServerResponse, dependencies: Omit<ServePublicationInput, "request">): Promise<void>;
6
+ export declare function serveLivingDocViewNodeRequest(nodeRequest: IncomingMessage, nodeResponse: ServerResponse, dependencies: Omit<ServeLivingDocViewInput, "request">): Promise<void>;
7
+ export declare function nodeRequestToWebRequest(request: IncomingMessage): Promise<Request>;
8
+ export declare function nodeRequestUrl(request: IncomingMessage): string;
5
9
  export declare function publicationRequestUrl(request: IncomingMessage): string;
10
+ export declare function livingDocViewRequestUrl(request: IncomingMessage): string;
6
11
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAE1B,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,QAAQ,EACrB,YAAY,EAAE,cAAc,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,eAAe,EAC5B,YAAY,EAAE,cAAc,EAC5B,YAAY,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAKtE"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAE1B,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,QAAQ,EACrB,YAAY,EAAE,cAAc,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,eAAe,EAC5B,YAAY,EAAE,cAAc,EAC5B,YAAY,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,eAAe,EAC5B,YAAY,EAAE,cAAc,EAC5B,YAAY,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,GACrD,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAI/D;AAWD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAKtE;AA2CD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAMxE"}
package/dist/src/http.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { serveLivingDocViewRequest, } from "./living-doc.js";
1
2
  import { servePublicationRequest, } from "./publication.js";
2
3
  export async function writeWebResponseToNodeResponse(webResponse, nodeResponse) {
3
4
  nodeResponse.statusCode = webResponse.status;
@@ -21,6 +22,38 @@ export async function servePublicationNodeRequest(nodeRequest, nodeResponse, dep
21
22
  });
22
23
  await writeWebResponseToNodeResponse(response, nodeResponse);
23
24
  }
25
+ export async function serveLivingDocViewNodeRequest(nodeRequest, nodeResponse, dependencies) {
26
+ const request = new Request(livingDocViewRequestUrl(nodeRequest), {
27
+ method: nodeRequest.method,
28
+ headers: nodeRequest.headers,
29
+ });
30
+ const response = await serveLivingDocViewRequest({
31
+ request,
32
+ ...dependencies,
33
+ });
34
+ await writeWebResponseToNodeResponse(response, nodeResponse);
35
+ }
36
+ export async function nodeRequestToWebRequest(request) {
37
+ const body = await readNodeRequestBody(request);
38
+ return new Request(nodeRequestUrl(request), {
39
+ method: request.method,
40
+ headers: request.headers,
41
+ body: body.length > 0 ? new Uint8Array(body) : undefined,
42
+ });
43
+ }
44
+ export function nodeRequestUrl(request) {
45
+ const host = request.headers.host ?? "localhost";
46
+ const protocol = request.headers["x-forwarded-proto"] ?? "https";
47
+ return `${protocol}://${host}${request.url ?? "/"}`;
48
+ }
49
+ function readNodeRequestBody(request) {
50
+ return new Promise((resolve, reject) => {
51
+ const chunks = [];
52
+ request.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
53
+ request.on("end", () => resolve(Buffer.concat(chunks)));
54
+ request.on("error", reject);
55
+ });
56
+ }
24
57
  export function publicationRequestUrl(request) {
25
58
  const host = request.headers.host ?? "localhost";
26
59
  const protocol = request.headers["x-forwarded-proto"] ?? "https";
@@ -59,4 +92,33 @@ function queryPathFromVercelCatchAll(path) {
59
92
  function isString(value) {
60
93
  return typeof value === "string";
61
94
  }
95
+ export function livingDocViewRequestUrl(request) {
96
+ const host = request.headers.host ?? "localhost";
97
+ const protocol = request.headers["x-forwarded-proto"] ?? "https";
98
+ const viewPath = livingDocPathFromVercelRequest(request);
99
+ const search = new URL(request.url ?? "/", "https://localhost").search;
100
+ return `${protocol}://${host}/d/${viewPath}${search}`;
101
+ }
102
+ function livingDocPathFromVercelRequest(request) {
103
+ const queryOpaque = request.query?.opaque;
104
+ const queryPath = request.query?.path;
105
+ if (typeof queryOpaque === "string") {
106
+ return [queryOpaque, queryPathFromVercelCatchAll(queryPath)]
107
+ .filter(Boolean)
108
+ .join("/");
109
+ }
110
+ if (Array.isArray(queryOpaque) && typeof queryOpaque[0] === "string") {
111
+ return [queryOpaque[0], queryPathFromVercelCatchAll(queryPath)]
112
+ .filter(Boolean)
113
+ .join("/");
114
+ }
115
+ const pathname = new URL(request.url ?? "/", "https://localhost").pathname;
116
+ const apiPrefix = "/api/d/";
117
+ if (pathname.startsWith(apiPrefix))
118
+ return pathname.slice(apiPrefix.length);
119
+ const publicPrefix = "/d/";
120
+ if (pathname.startsWith(publicPrefix))
121
+ return pathname.slice(publicPrefix.length);
122
+ return pathname.split("/").filter(Boolean).at(-1) ?? "";
123
+ }
62
124
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
1
  export * from "./auth.js";
2
+ export * from "./diff.js";
3
+ export * from "./doc-asset-collect.js";
4
+ export * from "./doc-asset-rewrite.js";
5
+ export * from "./front-matter.js";
6
+ export * from "./living-doc.js";
2
7
  export * from "./local-config.js";
3
8
  export * from "./publication.js";
4
9
  export * from "./remote-api.js";
5
10
  export * from "./local-config.js";
6
11
  export * from "./storage/artifact-content.js";
12
+ export * from "./storage/doc-asset-content.js";
13
+ export * from "./storage/living-doc-metadata.js";
7
14
  export * from "./storage/publication-metadata.js";
8
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,8 +1,15 @@
1
1
  export * from "./auth.js";
2
+ export * from "./diff.js";
3
+ export * from "./doc-asset-collect.js";
4
+ export * from "./doc-asset-rewrite.js";
5
+ export * from "./front-matter.js";
6
+ export * from "./living-doc.js";
2
7
  export * from "./local-config.js";
3
8
  export * from "./publication.js";
4
9
  export * from "./remote-api.js";
5
10
  export * from "./local-config.js";
6
11
  export * from "./storage/artifact-content.js";
12
+ export * from "./storage/doc-asset-content.js";
13
+ export * from "./storage/living-doc-metadata.js";
7
14
  export * from "./storage/publication-metadata.js";
8
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC"}
@@ -0,0 +1,184 @@
1
+ import { type PublisherTokenStore } from "./auth.js";
2
+ import { type DocAssetContentStore } from "./storage/doc-asset-content.js";
3
+ import { type CommentOrigin, type LivingDoc, type LivingDocComment, type LivingDocMetadataStore, type LivingDocSuggestion, type SuggestionStatus } from "./storage/living-doc-metadata.js";
4
+ export { collectDocAssets, extractRelativeImageRefs, readCollectedDocAsset, toHostedAssetPath, type CollectedDocAsset, type CollectDocAssetsResult, } from "./doc-asset-collect.js";
5
+ export { rewriteDocAssetMarkdown } from "./doc-asset-rewrite.js";
6
+ export { deriveMarkdownTitle, formatFrontMatterFieldValue, joinFrontMatter, markdownBody, parseFrontMatterData, parseFrontMatterFieldValue, serializeFrontMatterData, splitFrontMatter, titleFromFrontMatter, } from "./front-matter.js";
7
+ export { contentTypeForDocAssetPath, createVercelBlobDocAssetContentStore, docAssetBlobPath, InMemoryDocAssetContentStore, normalizeDocAssetPath, VercelBlobDocAssetContentStore, type DocAssetContentStore, } from "./storage/doc-asset-content.js";
8
+ export declare const livingDocViewPrefix = "/d";
9
+ export declare const livingDocReviewPrefix = "/r";
10
+ export declare const maxLivingDocMarkdownBytes: number;
11
+ export declare const maxLivingDocTextBytes: number;
12
+ export interface PublishDocAssetPayload {
13
+ relativeRef: string;
14
+ assetPath: string;
15
+ contentType?: string;
16
+ /** Raw file bytes (Buffer) or base64 string from the API. */
17
+ data: Buffer | string;
18
+ }
19
+ export interface PublishLivingDocInput {
20
+ markdown: string;
21
+ publisherEmail: string;
22
+ publicBaseUrl: string;
23
+ store: LivingDocMetadataStore;
24
+ title?: string | null;
25
+ opaqueId?: string;
26
+ reviewId?: string;
27
+ contentStore?: DocAssetContentStore;
28
+ assets?: PublishDocAssetPayload[];
29
+ }
30
+ export interface PublishLivingDocResult {
31
+ opaqueId: string;
32
+ reviewId: string;
33
+ title: string | null;
34
+ viewUrl: string;
35
+ reviewUrl: string;
36
+ uploadedAssets: string[];
37
+ }
38
+ export declare function publishLivingDoc(input: PublishLivingDocInput): Promise<PublishLivingDocResult>;
39
+ export interface PullLivingDocInput {
40
+ opaqueId: string;
41
+ publisherEmail: string;
42
+ store: LivingDocMetadataStore;
43
+ }
44
+ export interface PulledComment {
45
+ id: string;
46
+ origin: CommentOrigin;
47
+ author: string | null;
48
+ anchorQuote: string;
49
+ body: string;
50
+ createdAt: string;
51
+ }
52
+ export interface PulledSuggestion {
53
+ id: string;
54
+ anchorQuote: string;
55
+ anchorStart: number | null;
56
+ replacement: string;
57
+ note: string | null;
58
+ status: SuggestionStatus;
59
+ }
60
+ export interface PullLivingDocResult {
61
+ opaqueId: string;
62
+ title: string | null;
63
+ versionNumber: number;
64
+ previousVersionNumber: number | null;
65
+ markdown: string;
66
+ diffFromPreviousVersion: string | null;
67
+ openComments: PulledComment[];
68
+ priorSuggestions: PulledSuggestion[];
69
+ }
70
+ /**
71
+ * Cut an immutable Version of the Living Doc and return the current Markdown,
72
+ * a diff versus the previous Version, and the open Reviewer feedback. This is
73
+ * the turn boundary: each pull advances the version number.
74
+ */
75
+ export declare function pullLivingDocFeedback(input: PullLivingDocInput): Promise<PullLivingDocResult>;
76
+ export interface RespondSuggestionInput {
77
+ anchorQuote: string;
78
+ replacement: string;
79
+ note?: string | null;
80
+ anchorStart?: number | null;
81
+ }
82
+ export interface RespondReplyInput {
83
+ parentCommentId: string;
84
+ body: string;
85
+ }
86
+ export interface RespondLivingDocInput {
87
+ opaqueId: string;
88
+ publisherEmail: string;
89
+ store: LivingDocMetadataStore;
90
+ suggestions?: RespondSuggestionInput[];
91
+ replies?: RespondReplyInput[];
92
+ }
93
+ export interface RespondLivingDocResult {
94
+ opaqueId: string;
95
+ versionNumber: number;
96
+ createdSuggestions: PulledSuggestion[];
97
+ createdReplies: PulledComment[];
98
+ }
99
+ /**
100
+ * The agent's half of the round: post span-anchored Suggestions (never applied
101
+ * automatically) and replies to open Comments. Suggestions target the latest
102
+ * pulled Version.
103
+ */
104
+ export declare function respondToLivingDoc(input: RespondLivingDocInput): Promise<RespondLivingDocResult>;
105
+ export interface RemoveLivingDocInput {
106
+ opaqueId: string;
107
+ publisherEmail: string;
108
+ store: LivingDocMetadataStore;
109
+ }
110
+ export interface RemoveLivingDocResult {
111
+ opaqueId: string;
112
+ status: "removed" | "not-found";
113
+ }
114
+ /**
115
+ * Removal disables the Living Doc: the View Link and Review Link both stop
116
+ * serving it. This is the kill switch for a leaked Review Link.
117
+ */
118
+ export declare function removeLivingDoc(input: RemoveLivingDocInput): Promise<RemoveLivingDocResult>;
119
+ export interface ReviewStateResult {
120
+ opaqueId: string;
121
+ title: string | null;
122
+ versionNumber: number;
123
+ markdown: string;
124
+ comments: LivingDocComment[];
125
+ pendingSuggestions: LivingDocSuggestion[];
126
+ }
127
+ export declare function getReviewState(store: LivingDocMetadataStore, reviewId: string): Promise<ReviewStateResult>;
128
+ export declare function saveReviewMarkdown(store: LivingDocMetadataStore, reviewId: string, markdown: string): Promise<LivingDoc>;
129
+ export interface AddReviewerCommentInput {
130
+ anchorQuote: string;
131
+ body: string;
132
+ anchorStart?: number | null;
133
+ anchorEnd?: number | null;
134
+ author?: string | null;
135
+ }
136
+ export declare function addReviewerComment(store: LivingDocMetadataStore, reviewId: string, input: AddReviewerCommentInput): Promise<LivingDocComment>;
137
+ export declare function resolveReviewerComment(store: LivingDocMetadataStore, reviewId: string, commentId: string): Promise<LivingDocComment>;
138
+ export interface DecideSuggestionResult {
139
+ suggestion: LivingDocSuggestion;
140
+ markdown: string;
141
+ applied: boolean;
142
+ occurrenceCount: number;
143
+ }
144
+ /**
145
+ * Accept or reject an agent Suggestion. Accepting applies the change to the
146
+ * live Markdown at the anchored quote — when the quote matches more than one
147
+ * place, the occurrence nearest the Suggestion's anchorStart offset wins. If
148
+ * the quote no longer exists (the Reviewer edited past it), the Suggestion
149
+ * stays pending so its replacement text remains visible on the review surface
150
+ * instead of vanishing with an accepted-but-unapplied status.
151
+ */
152
+ export declare function decideSuggestion(store: LivingDocMetadataStore, reviewId: string, suggestionId: string, decision: Extract<SuggestionStatus, "accepted" | "rejected">): Promise<DecideSuggestionResult>;
153
+ export interface ServeLivingDocViewInput {
154
+ request: Request;
155
+ store: LivingDocMetadataStore;
156
+ contentStore?: DocAssetContentStore;
157
+ }
158
+ export declare function serveLivingDocViewRequest({ request, store, contentStore, }: ServeLivingDocViewInput): Promise<Response>;
159
+ export interface HandleAgentApiInput {
160
+ request: Request;
161
+ store: LivingDocMetadataStore;
162
+ tokenStore: PublisherTokenStore;
163
+ publicBaseUrl?: string;
164
+ contentStore?: DocAssetContentStore;
165
+ }
166
+ export declare function handleLivingDocAgentApiRequest({ request, store, tokenStore, publicBaseUrl, contentStore, }: HandleAgentApiInput): Promise<Response>;
167
+ export interface HandleReviewApiInput {
168
+ request: Request;
169
+ store: LivingDocMetadataStore;
170
+ }
171
+ export declare function handleReviewApiRequest({ request, store, }: HandleReviewApiInput): Promise<Response>;
172
+ export declare function livingDocViewUrl(publicBaseUrl: string, opaqueId: string): string;
173
+ export declare function livingDocAssetUrl(publicBaseUrl: string, opaqueId: string, assetPath: string): string;
174
+ export declare function livingDocReviewUrl(publicBaseUrl: string, reviewId: string): string;
175
+ export declare function livingDocViewRouteFromUrl(url: string): {
176
+ opaqueId: string;
177
+ assetPath: string;
178
+ } | null;
179
+ export declare function opaqueIdFromViewUrl(url: string): string | null;
180
+ export declare function reviewIdFromReviewUrl(url: string): string | null;
181
+ export declare function opaqueIdFromViewReference(reference: string): string;
182
+ export declare function livingDocSafetyHeaders(headers?: HeadersInit): Headers;
183
+ export declare function createReviewId(): string;
184
+ //# sourceMappingURL=living-doc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"living-doc.d.ts","sourceRoot":"","sources":["../../src/living-doc.ts"],"names":[],"mappings":"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"}