agentic-documents 0.5.0 → 0.6.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +51 -8
  3. package/dist/{chunk-7R7ZPPRF.js → chunk-34C47PDC.js} +1 -1
  4. package/dist/{chunk-UPEGODUV.js → chunk-5IQX2W52.js} +1 -1
  5. package/dist/{chunk-S6MQDWFK.js → chunk-6UYJV2EJ.js} +19 -6
  6. package/dist/{chunk-E7B6T5WN.js → chunk-CN6UAW7B.js} +5 -3
  7. package/dist/chunk-DWVJIKVT.js +8 -0
  8. package/dist/{chunk-6QOYS63L.js → chunk-GQ5E6T7Z.js} +4 -2
  9. package/dist/{chunk-YNHZCIGO.js → chunk-JBAQEIOH.js} +5 -3
  10. package/dist/chunk-KC5KFB5R.js +354 -0
  11. package/dist/{chunk-FX755I7V.js → chunk-V6TBTOHW.js} +11 -8
  12. package/dist/cli.js +16 -14
  13. package/dist/client.d.ts +5 -5
  14. package/dist/{doc-mJPajXEQ.d.ts → doc-BXG9qG5X.d.ts} +4 -2
  15. package/dist/editor.css +37 -0
  16. package/dist/embed.d.ts +86 -0
  17. package/dist/embed.js +431 -0
  18. package/dist/formats.d.ts +6 -3
  19. package/dist/formats.js +14 -224
  20. package/dist/index.d.ts +12 -11
  21. package/dist/index.js +14 -12
  22. package/dist/live-worker.d.ts +2 -2
  23. package/dist/live-worker.js +7 -6
  24. package/dist/live.d.ts +2 -2
  25. package/dist/live.js +5 -4
  26. package/dist/{mcp-ESSEG46C.js → mcp-ZTUTC4CS.js} +5 -4
  27. package/dist/{export-Cwx276UP.d.ts → render-463xHb-x.d.ts} +3 -4
  28. package/dist/{review-Hgq8OgvD.d.ts → review-Ds-i5Vnc.d.ts} +2 -2
  29. package/dist/{service-CqKE9DKz.d.ts → service-Ck6oX-Kq.d.ts} +2 -2
  30. package/dist/ui/app.css +1 -1
  31. package/dist/ui/app.js +65 -65
  32. package/dist/worker.d.ts +2 -2
  33. package/dist/worker.js +7 -6
  34. package/package.json +28 -11
  35. package/dist/chunk-L6W2AQUF.js +0 -258
package/dist/formats.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Limits, TextDoc } from 'agentic-formats';
2
- import { D as DocOptions, a as AgenticDoc, b as PmNode, c as Principal } from './doc-mJPajXEQ.js';
3
- import { a as ExportOptions } from './export-Cwx276UP.js';
2
+ import { D as DocOptions, A as AgenticDoc, d as PmNode, P as Principal } from './doc-BXG9qG5X.js';
3
+ import { a as ExportOptions } from './render-463xHb-x.js';
4
4
  import 'yjs';
5
5
 
6
6
  declare const IMPORT_FORMATS: readonly ["md", "odt", "docx"];
@@ -41,9 +41,12 @@ declare function fromTextDoc(model: TextDoc): {
41
41
  };
42
42
  /** Read a file into a new document. The author makes the one `create` edit, so text from an agent stays labeled. */
43
43
  declare function importFile(input: string | Uint8Array, format: ImportFormat, author: Principal, options?: ImportOptions): ImportResult;
44
+ declare const ODT_MIME: string;
45
+ /** Write blocks as an OpenDocument text file (.odt). It drops the warnings; use `exportFile` or `exportDoc` to read what the file cannot hold. */
46
+ declare function exportOdt(blocks: PmNode[]): Uint8Array;
44
47
  /** Write a document as a file. `title` goes into the ODT and DOCX metadata. */
45
48
  declare function exportFile(doc: AgenticDoc, format: FileFormat, options?: ExportOptions & {
46
49
  title?: string;
47
50
  }): FileResult;
48
51
 
49
- export { DOCX_MIME, FILE_FORMATS, type FileFormat, type FileResult, IMPORT_FORMATS, type ImportFormat, type ImportOptions, type ImportResult, exportFile, fromTextDoc, importFile, toTextDoc };
52
+ export { DOCX_MIME, FILE_FORMATS, type FileFormat, type FileResult, IMPORT_FORMATS, type ImportFormat, type ImportOptions, type ImportResult, ODT_MIME, exportFile, exportOdt, fromTextDoc, importFile, toTextDoc };
package/dist/formats.js CHANGED
@@ -1,233 +1,23 @@
1
1
  import {
2
- DATA_IMAGE,
3
- exportDoc,
4
- fromBase64,
5
- safeHref,
6
- toBase64
7
- } from "./chunk-L6W2AQUF.js";
8
- import {
9
- AgenticDoc,
10
- DocError,
11
- checkAuthor
12
- } from "./chunk-6QOYS63L.js";
13
-
14
- // src/formats.ts
15
- import { DEFAULT_LIMITS, FormatError, readDocx, readOdt, writeDocx, writeOdt } from "agentic-formats";
16
- var IMPORT_FORMATS = ["md", "odt", "docx"];
17
- var FILE_FORMATS = ["md", "html", "odt", "docx"];
18
- var DOCX_MIME = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
19
- var CONTENT_TYPES = {
20
- md: "text/markdown; charset=utf-8",
21
- html: "text/html; charset=utf-8",
22
- odt: "application/vnd.oasis.opendocument.text",
23
- docx: DOCX_MIME
24
- };
25
- var PM_MARKS = { bold: "bold", italic: "italic", strike: "strike", code: "code" };
26
- var MODEL_IMAGE = /^image\/(png|jpeg|gif)$/;
27
- var TASK = ["\u2610 ", "\u2611 "];
28
- var warner = () => {
29
- const seen = /* @__PURE__ */ new Set();
30
- return { warn: (line) => void seen.add(line), list: () => [...seen] };
31
- };
32
- function toTextDoc(blocks, title) {
33
- const { warn, list } = warner();
34
- const inlines = (nodes = [], extra = []) => nodes.flatMap((node) => {
35
- if (node.type === "hardBreak") return [{ type: "break" }];
36
- if (node.type === "image") {
37
- const alt = typeof node.attrs?.alt === "string" ? node.attrs.alt : "";
38
- const found = DATA_IMAGE.exec(String(node.attrs?.src ?? "").trim());
39
- if (found && MODEL_IMAGE.test(found[1].toLowerCase())) {
40
- try {
41
- return [{ type: "image", data: fromBase64(found[2]), mime: found[1].toLowerCase(), ...alt ? { alt } : {} }];
42
- } catch {
43
- }
44
- }
45
- warn("an image that is not an embedded PNG, JPEG, or GIF is kept as its alt text");
46
- return [{ type: "text", text: `[image${alt ? `: ${alt}` : ""}]` }];
47
- }
48
- if (!node.text) return [];
49
- const marks = [...extra, ...(node.marks ?? []).flatMap((m) => PM_MARKS[m.type] ? [PM_MARKS[m.type]] : [])];
50
- const href = safeHref((node.marks ?? []).find((m) => m.type === "link")?.attrs?.href);
51
- return [{ type: "text", text: node.text, ...marks.length ? { marks } : {}, ...href ? { href } : {} }];
52
- });
53
- const listOf = (node) => {
54
- const items = (node.content ?? []).map((item) => {
55
- const [first, ...rest] = item.content ?? [];
56
- const content = inlines(first?.content);
57
- if (item.type === "taskItem") content.unshift({ type: "text", text: TASK[item.attrs?.checked ? 1 : 0] });
58
- let sublist;
59
- for (const child of rest) {
60
- if (!sublist && /^(bulletList|orderedList|taskList)$/.test(child.type)) sublist = listOf(child);
61
- else {
62
- warn("a list item with more than one paragraph is kept as one paragraph with line breaks");
63
- for (const b of toBlocks(child)) content.push({ type: "break" }, ...textOfBlock(b));
64
- }
65
- }
66
- return { content, ...sublist ? { sublist } : {} };
67
- });
68
- if (node.type === "orderedList" && Number(node.attrs?.start ?? 1) !== 1) warn("a numbered list that does not start at 1 starts at 1");
69
- return { type: "list", ordered: node.type === "orderedList", items };
70
- };
71
- const textOfBlock = (b) => b.type === "list" ? b.items.flatMap((i, n) => [...n ? [{ type: "break" }] : [], ...i.content]) : b.type === "table" ? b.rows.flat(2).flatMap(textOfBlock) : b.content;
72
- const toBlocks = (node) => {
73
- switch (node.type) {
74
- case "paragraph":
75
- return [{ type: "paragraph", content: inlines(node.content) }];
76
- case "heading": {
77
- const level = Math.min(6, Math.max(1, Math.trunc(Number(node.attrs?.level)) || 1));
78
- return [{ type: "heading", level, content: inlines(node.content) }];
79
- }
80
- case "blockquote":
81
- warn("a quote is kept as plain paragraphs");
82
- return (node.content ?? []).flatMap(toBlocks);
83
- case "codeBlock": {
84
- warn("a code block is kept as a paragraph of code text");
85
- const lines = (node.content ?? []).map((t) => t.text ?? "").join("").split("\n");
86
- return [{ type: "paragraph", content: lines.flatMap((line, i) => [...i ? [{ type: "break" }] : [], ...line ? [{ type: "text", text: line, marks: ["code"] }] : []]) }];
87
- }
88
- case "horizontalRule":
89
- warn("a horizontal rule is left out");
90
- return [];
91
- case "bulletList":
92
- case "orderedList":
93
- case "taskList":
94
- return [listOf(node)];
95
- case "table": {
96
- const rows = node.content ?? [];
97
- const header = rows.length > 0 && (rows[0].content ?? []).length > 0 && (rows[0].content ?? []).every((c) => c.type === "tableHeader");
98
- return [{ type: "table", ...header ? { header: true } : {}, rows: rows.map((r) => (r.content ?? []).map((c) => (c.content ?? []).flatMap(toBlocks))) }];
99
- }
100
- default:
101
- warn(`a ${node.type} block is left out`);
102
- return [];
103
- }
104
- };
105
- const model = { ...title ? { title } : {}, blocks: blocks.flatMap(toBlocks) };
106
- return { model, warnings: list() };
107
- }
108
- function fromTextDoc(model) {
109
- const { warn, list } = warner();
110
- const text = (value, marks = []) => value ? [{ type: "text", text: value, ...marks.length ? { marks } : {} }] : [];
111
- const inlines = (nodes) => nodes.flatMap((node) => {
112
- switch (node.type) {
113
- case "break":
114
- return [{ type: "hardBreak" }];
115
- case "image":
116
- if (!MODEL_IMAGE.test(node.mime)) {
117
- warn("an image that is not a PNG, JPEG, or GIF is kept as its alt text");
118
- return text(`[image${node.alt ? `: ${node.alt}` : ""}]`);
119
- }
120
- return [{ type: "image", attrs: { src: `data:${node.mime};base64,${toBase64(node.data)}`, alt: node.alt ?? null, title: null } }];
121
- case "footnote":
122
- warn("a footnote is kept as text in brackets");
123
- return [...text(" ["), ...inlines(node.content), ...text("]")];
124
- case "text": {
125
- const marks = [];
126
- for (const mark of node.marks ?? []) {
127
- if (mark === "bold" || mark === "italic" || mark === "strike" || mark === "code") marks.push({ type: mark });
128
- else warn(`the ${mark} mark is left out; the text stays`);
129
- }
130
- const href = node.href === void 0 ? void 0 : safeHref(node.href);
131
- if (node.href !== void 0 && !href) warn("a link that is not a web, mail, or relative address is left out; the text stays");
132
- if (href) marks.push({ type: "link", attrs: { href } });
133
- if (marks.length > 1 && marks.some((m) => m.type === "code")) {
134
- warn("a mark or a link on code text is left out; the text stays as code");
135
- return text(node.text, [{ type: "code" }]);
136
- }
137
- return text(node.text, marks);
138
- }
139
- default:
140
- return [];
141
- }
142
- });
143
- const paragraph = (content) => ({ type: "paragraph", ...content.length ? { content: inlines(content) } : {} });
144
- const toNodes = (block) => {
145
- switch (block.type) {
146
- case "heading":
147
- return [{ type: "heading", attrs: { level: block.level }, content: inlines(block.content) }];
148
- case "paragraph":
149
- return [paragraph(block.content)];
150
- case "list":
151
- return [
152
- {
153
- type: block.ordered ? "orderedList" : "bulletList",
154
- ...block.ordered ? { attrs: { start: 1, type: null } } : {},
155
- content: block.items.map((item) => ({ type: "listItem", content: [paragraph(item.content), ...item.sublist ? toNodes(item.sublist) : []] }))
156
- }
157
- ];
158
- case "table": {
159
- const rows = block.rows.filter((r) => r.length > 0);
160
- if (rows.length === 0) return [];
161
- return [
162
- {
163
- type: "table",
164
- content: rows.map((row, i) => ({
165
- type: "tableRow",
166
- content: row.map((cell) => {
167
- const content = cell.flatMap(toNodes);
168
- return { type: block.header && i === 0 ? "tableHeader" : "tableCell", attrs: { colspan: 1, rowspan: 1, colwidth: null }, content: content.length ? content : [{ type: "paragraph" }] };
169
- })
170
- }))
171
- }
172
- ];
173
- }
174
- default:
175
- return [];
176
- }
177
- };
178
- const prune = (node) => node.content ? { ...node, content: node.content.filter((n) => n.type !== "text" || n.text).map(prune) } : node;
179
- const blocks = model.blocks.flatMap(toNodes).map(prune);
180
- return { blocks, ...model.title ? { title: model.title } : {}, warnings: list() };
181
- }
182
- var formatFailure = (error) => {
183
- if (error instanceof FormatError) throw new DocError("INVALID_INPUT", `the file was refused (${error.code}): ${error.message}`);
184
- throw error;
185
- };
186
- function importFile(input, format, author, options = {}) {
187
- checkAuthor(author);
188
- if (!IMPORT_FORMATS.includes(format)) throw new DocError("INVALID_INPUT", `import format must be one of ${IMPORT_FORMATS.join(", ")}`);
189
- const maxBytes = options.limits?.maxInputBytes ?? DEFAULT_LIMITS.maxInputBytes;
190
- if (format === "md") {
191
- let markdown;
192
- try {
193
- markdown = typeof input === "string" ? input : new TextDecoder("utf-8", { fatal: true }).decode(input);
194
- } catch {
195
- throw new DocError("INVALID_INPUT", "a md file must be UTF-8 text");
196
- }
197
- if (new TextEncoder().encode(markdown).length > maxBytes) throw new DocError("INVALID_INPUT", `the file is larger than ${maxBytes} bytes`);
198
- return { doc: AgenticDoc.fromMarkdown(markdown, author, options.doc), warnings: [] };
199
- }
200
- if (!(input instanceof Uint8Array)) throw new DocError("INVALID_INPUT", `a ${format} file must be bytes, not text`);
201
- let read;
202
- try {
203
- read = format === "odt" ? readOdt(input, options.limits) : readDocx(input, options.limits);
204
- } catch (error) {
205
- return formatFailure(error);
206
- }
207
- const mapped = fromTextDoc(read.model);
208
- return {
209
- doc: AgenticDoc.fromBlocks(mapped.blocks, author, options.doc),
210
- ...mapped.title ? { title: mapped.title } : {},
211
- warnings: [...read.warnings, ...mapped.warnings]
212
- };
213
- }
214
- function exportFile(doc, format, options = {}) {
215
- if (!FILE_FORMATS.includes(format)) throw new DocError("INVALID_INPUT", `export format must be one of ${FILE_FORMATS.join(", ")}`);
216
- if (format === "md" || format === "html") return { format, contentType: CONTENT_TYPES[format], data: exportDoc(doc, format, options).data, warnings: [] };
217
- const { model, warnings } = toTextDoc(doc.toJSON().content ?? [], options.title);
218
- let written;
219
- try {
220
- written = format === "odt" ? writeOdt(model) : writeDocx(model);
221
- } catch (error) {
222
- return formatFailure(error);
223
- }
224
- return { format, contentType: CONTENT_TYPES[format], data: written.bytes, warnings: [...warnings, ...written.warnings] };
225
- }
2
+ DOCX_MIME,
3
+ FILE_FORMATS,
4
+ IMPORT_FORMATS,
5
+ ODT_MIME,
6
+ exportFile,
7
+ exportOdt,
8
+ fromTextDoc,
9
+ importFile,
10
+ toTextDoc
11
+ } from "./chunk-KC5KFB5R.js";
12
+ import "./chunk-GQ5E6T7Z.js";
13
+ import "./chunk-DWVJIKVT.js";
226
14
  export {
227
15
  DOCX_MIME,
228
16
  FILE_FORMATS,
229
17
  IMPORT_FORMATS,
18
+ ODT_MIME,
230
19
  exportFile,
20
+ exportOdt,
231
21
  fromTextDoc,
232
22
  importFile,
233
23
  toTextDoc
package/dist/index.d.ts CHANGED
@@ -1,13 +1,18 @@
1
- import { c as Principal, b as PmNode } from './doc-mJPajXEQ.js';
2
- export { a as AgenticDoc, A as Anchor, d as AnchorTarget, D as DocOptions, E as EditEntry, e as PRINCIPAL_KINDS, P as PrincipalKind, S as Section, f as SectionTarget, T as Target, g as TextTarget, h as blocksToMarkdown, m as markdownToBlocks, p as parseAuthor } from './doc-mJPajXEQ.js';
1
+ import { A as AgenticDoc, P as Principal } from './doc-BXG9qG5X.js';
2
+ export { a as Anchor, b as AnchorTarget, D as DocOptions, E as EditEntry, c as PRINCIPAL_KINDS, d as PmNode, e as PrincipalKind, S as Section, f as SectionTarget, T as Target, g as TextTarget, h as blocksToMarkdown, m as markdownToBlocks, p as parseAuthor } from './doc-BXG9qG5X.js';
3
3
  import { Schema } from 'prosemirror-model';
4
- export { a as DocError, D as DocErrorCode, M as Message, S as Suggestion, b as Suggestions, T as Thread, c as Threads } from './review-Hgq8OgvD.js';
4
+ export { D as DocError, a as DocErrorCode, M as Message, S as Suggestion, b as Suggestions, T as Thread, c as Threads } from './review-Ds-i5Vnc.js';
5
5
  import { z } from 'zod';
6
- import { a as DocAccess } from './service-CqKE9DKz.js';
7
- export { b as DocInfo, c as DocsPorts, d as DocsService } from './service-CqKE9DKz.js';
8
- export { b as EXPORT_FORMATS, E as ExportFormat, a as ExportOptions, c as ExportResult, e as exportDoc } from './export-Cwx276UP.js';
6
+ import { D as DocAccess } from './service-Ck6oX-Kq.js';
7
+ export { a as DocInfo, b as DocsPorts, c as DocsService } from './service-Ck6oX-Kq.js';
8
+ import { E as ExportFormat, a as ExportOptions, b as ExportResult } from './render-463xHb-x.js';
9
+ export { c as EXPORT_FORMATS } from './render-463xHb-x.js';
9
10
  import { AdapterOptions, Blobs, Store } from 'agentic-identity';
11
+ export { ODT_MIME, exportOdt } from './formats.js';
10
12
  import 'yjs';
13
+ import 'agentic-formats';
14
+
15
+ declare function exportDoc(doc: AgenticDoc, format: ExportFormat, options?: ExportOptions): ExportResult;
11
16
 
12
17
  declare const schema: Schema<string, string>;
13
18
 
@@ -46,8 +51,4 @@ declare function createFileStore(dir: string, options?: AdapterOptions & Pick<Fi
46
51
  shared?: string;
47
52
  }): Store;
48
53
 
49
- declare const ODT_MIME = "application/vnd.oasis.opendocument.text";
50
- /** Write blocks as an OpenDocument text file (.odt): content, styles, and images as embedded files. */
51
- declare function exportOdt(blocks: PmNode[]): Uint8Array;
52
-
53
- export { type Command, type FileBlobsOptions, ODT_MIME, PmNode, Principal, commands, createFileBlobs, createFileStore, exportOdt, schema };
54
+ export { AgenticDoc, type Command, ExportFormat, ExportOptions, ExportResult, type FileBlobsOptions, Principal, commands, createFileBlobs, createFileStore, exportDoc, schema };
package/dist/index.js CHANGED
@@ -1,32 +1,34 @@
1
1
  import {
2
2
  createFileBlobs,
3
3
  createFileStore
4
- } from "./chunk-7R7ZPPRF.js";
4
+ } from "./chunk-34C47PDC.js";
5
+ import {
6
+ commands,
7
+ exportDoc
8
+ } from "./chunk-6UYJV2EJ.js";
5
9
  import {
6
10
  DocsService
7
- } from "./chunk-YNHZCIGO.js";
11
+ } from "./chunk-JBAQEIOH.js";
8
12
  import {
9
- commands
10
- } from "./chunk-S6MQDWFK.js";
13
+ Suggestions,
14
+ Threads
15
+ } from "./chunk-5IQX2W52.js";
11
16
  import {
12
17
  EXPORT_FORMATS,
13
18
  ODT_MIME,
14
- exportDoc,
15
19
  exportOdt
16
- } from "./chunk-L6W2AQUF.js";
17
- import {
18
- Suggestions,
19
- Threads
20
- } from "./chunk-UPEGODUV.js";
20
+ } from "./chunk-KC5KFB5R.js";
21
21
  import {
22
22
  AgenticDoc,
23
23
  DocError,
24
- PRINCIPAL_KINDS,
25
24
  blocksToMarkdown,
26
25
  markdownToBlocks,
27
26
  parseAuthor,
28
27
  schema
29
- } from "./chunk-6QOYS63L.js";
28
+ } from "./chunk-GQ5E6T7Z.js";
29
+ import {
30
+ PRINCIPAL_KINDS
31
+ } from "./chunk-DWVJIKVT.js";
30
32
  export {
31
33
  AgenticDoc,
32
34
  DocError,
@@ -5,9 +5,9 @@ import 'hono';
5
5
  import 'agentic-identity';
6
6
  import 'agentic-identity/cloudflare';
7
7
  import 'agentic-realtime';
8
- import './doc-mJPajXEQ.js';
8
+ import './doc-BXG9qG5X.js';
9
9
  import 'yjs';
10
- import './service-CqKE9DKz.js';
10
+ import './service-Ck6oX-Kq.js';
11
11
 
12
12
  type Namespace = Parameters<typeof createDurableObjectRealtime>[0];
13
13
  interface LiveEnv extends WorkerEnv {
@@ -2,14 +2,15 @@ import {
2
2
  createApp,
3
3
  regionOf,
4
4
  serviceFor
5
- } from "./chunk-FX755I7V.js";
6
- import "./chunk-YNHZCIGO.js";
7
- import "./chunk-S6MQDWFK.js";
8
- import "./chunk-L6W2AQUF.js";
9
- import "./chunk-UPEGODUV.js";
5
+ } from "./chunk-V6TBTOHW.js";
6
+ import "./chunk-6UYJV2EJ.js";
7
+ import "./chunk-JBAQEIOH.js";
8
+ import "./chunk-5IQX2W52.js";
9
+ import "./chunk-KC5KFB5R.js";
10
10
  import {
11
11
  DocError
12
- } from "./chunk-6QOYS63L.js";
12
+ } from "./chunk-GQ5E6T7Z.js";
13
+ import "./chunk-DWVJIKVT.js";
13
14
 
14
15
  // src/live-worker.ts
15
16
  import { createDurableObjectRealtime } from "agentic-realtime/worker";
package/dist/live.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Peer } from 'agentic-realtime/client';
2
- import { a as AgenticDoc, c as Principal, D as DocOptions } from './doc-mJPajXEQ.js';
3
- import { a as DocAccess, D as DocSummary } from './service-CqKE9DKz.js';
2
+ import { A as AgenticDoc, P as Principal, D as DocOptions } from './doc-BXG9qG5X.js';
3
+ import { D as DocAccess, d as DocSummary } from './service-Ck6oX-Kq.js';
4
4
  import 'yjs';
5
5
  import 'agentic-identity';
6
6
 
package/dist/live.js CHANGED
@@ -2,10 +2,11 @@ import {
2
2
  LiveDoc,
3
3
  LiveService,
4
4
  whoAmI
5
- } from "./chunk-E7B6T5WN.js";
6
- import "./chunk-YNHZCIGO.js";
7
- import "./chunk-UPEGODUV.js";
8
- import "./chunk-6QOYS63L.js";
5
+ } from "./chunk-CN6UAW7B.js";
6
+ import "./chunk-JBAQEIOH.js";
7
+ import "./chunk-5IQX2W52.js";
8
+ import "./chunk-GQ5E6T7Z.js";
9
+ import "./chunk-DWVJIKVT.js";
9
10
  export {
10
11
  LiveDoc,
11
12
  LiveService,
@@ -3,12 +3,13 @@ import {
3
3
  } from "./chunk-5Y66UCTE.js";
4
4
  import {
5
5
  commands
6
- } from "./chunk-S6MQDWFK.js";
7
- import "./chunk-L6W2AQUF.js";
8
- import "./chunk-UPEGODUV.js";
6
+ } from "./chunk-6UYJV2EJ.js";
7
+ import "./chunk-5IQX2W52.js";
8
+ import "./chunk-KC5KFB5R.js";
9
9
  import {
10
10
  DocError
11
- } from "./chunk-6QOYS63L.js";
11
+ } from "./chunk-GQ5E6T7Z.js";
12
+ import "./chunk-DWVJIKVT.js";
12
13
 
13
14
  // src/mcp.ts
14
15
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -1,5 +1,3 @@
1
- import { a as AgenticDoc } from './doc-mJPajXEQ.js';
2
-
3
1
  declare const EXPORT_FORMATS: readonly ["md", "html", "odt"];
4
2
  type ExportFormat = (typeof EXPORT_FORMATS)[number];
5
3
  interface ExportOptions {
@@ -11,7 +9,8 @@ interface ExportResult {
11
9
  contentType: string;
12
10
  encoding: "utf8" | "base64";
13
11
  data: string;
12
+ /** One line for each part of the document that the format cannot hold. Empty when nothing was lost. */
13
+ warnings: string[];
14
14
  }
15
- declare function exportDoc(doc: AgenticDoc, format: ExportFormat, options?: ExportOptions): ExportResult;
16
15
 
17
- export { type ExportFormat as E, type ExportOptions as a, EXPORT_FORMATS as b, type ExportResult as c, exportDoc as e };
16
+ export { type ExportFormat as E, type ExportOptions as a, type ExportResult as b, EXPORT_FORMATS as c };
@@ -1,4 +1,4 @@
1
- import { A as Anchor, c as Principal, a as AgenticDoc, g as TextTarget, d as AnchorTarget } from './doc-mJPajXEQ.js';
1
+ import { a as Anchor, P as Principal, A as AgenticDoc, g as TextTarget, b as AnchorTarget } from './doc-BXG9qG5X.js';
2
2
 
3
3
  type DocErrorCode = "NO_MATCH" | "AMBIGUOUS_MATCH" | "STALE_ANCHOR" | "NO_SECTION" | "INVALID_AUTHOR" | "INVALID_INPUT" | "NO_THREAD" | "NO_SUGGESTION" | "ALREADY_DECIDED" | "FORBIDDEN" | "NO_DOCUMENT" | "DOCUMENT_EXISTS" | "LOCKED" | "CONFLICT" | "MISCONFIGURED";
4
4
  declare class DocError extends Error {
@@ -82,4 +82,4 @@ declare class Suggestions {
82
82
  }): Suggestion[];
83
83
  }
84
84
 
85
- export { type DocErrorCode as D, type Message as M, type Suggestion as S, type Thread as T, DocError as a, Suggestions as b, Threads as c };
85
+ export { DocError as D, type Message as M, type Suggestion as S, type Thread as T, type DocErrorCode as a, Suggestions as b, Threads as c };
@@ -1,4 +1,4 @@
1
- import { P as PrincipalKind, c as Principal, a as AgenticDoc, D as DocOptions } from './doc-mJPajXEQ.js';
1
+ import { e as PrincipalKind, P as Principal, A as AgenticDoc, D as DocOptions } from './doc-BXG9qG5X.js';
2
2
  import { Blobs, Store } from 'agentic-identity';
3
3
 
4
4
  /** What the catalog keeps for each document. The author kind stays, so machine-made work stays labeled. */
@@ -88,4 +88,4 @@ declare class DocsService implements DocAccess {
88
88
  write<T>(id: string, run: (doc: AgenticDoc) => T, author?: Principal): Promise<T>;
89
89
  }
90
90
 
91
- export { type DocSummary as D, type DocAccess as a, type DocInfo as b, type DocsPorts as c, DocsService as d };
91
+ export { type DocAccess as D, type DocInfo as a, type DocsPorts as b, DocsService as c, type DocSummary as d };
package/dist/ui/app.css CHANGED
@@ -1 +1 @@
1
- @font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./assets/inter-latin-ext-wght-normal-HA22NDSG.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./assets/inter-latin-wght-normal-NRMW37G5.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url("./assets/jetbrains-mono-latin-ext-wght-normal-TSLVDSQR.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url("./assets/jetbrains-mono-latin-wght-normal-VBS632QH.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root,[data-theme=light]{color-scheme:light;--ad-color-bg: #FAF9F7;--ad-color-surface: #FFFFFF;--ad-color-surface-raised: #FFFFFF;--ad-color-surface-sunken: #F3F1EE;--ad-color-surface-hover: #E9E6E1;--ad-color-text: #1D1C1A;--ad-color-text-muted: #5E5A53;--ad-color-text-on-accent: #FFFFFF;--ad-color-border: #DAD7D1;--ad-color-border-strong: #827D73;--ad-color-accent: #2B4BC4;--ad-color-accent-hover: #223D9F;--ad-color-accent-subtle: #E8EDFC;--ad-color-accent-text: #223D9F;--ad-color-agent: #8E2C86;--ad-color-agent-subtle: #F7E8F5;--ad-color-agent-text: #7A2273;--ad-color-danger: #B42318;--ad-color-danger-subtle: #FDECEA;--ad-color-danger-text: #A11D14;--ad-color-warning: #92520A;--ad-color-warning-subtle: #FDF1DC;--ad-color-warning-text: #7A4208;--ad-color-success: #1B6B3A;--ad-color-success-subtle: #E6F5EC;--ad-color-success-text: #175C32;--ad-color-focus: #2B4BC4;--ad-color-scrim: rgb(29 28 26 / .4);--ad-shadow-raised: 0 1px 2px rgb(29 28 26 / .06), 0 2px 16px rgb(29 28 26 / .08);--ad-shadow-floating: 0 2px 6px rgb(29 28 26 / .08), 0 8px 40px rgb(29 28 26 / .16)}:root{--ad-space-1: .25rem;--ad-space-2: .5rem;--ad-space-3: .75rem;--ad-space-4: 1rem;--ad-space-6: 1.5rem;--ad-space-8: 2rem;--ad-space-12: 3rem;--ad-space-16: 4rem;--ad-space-24: 6rem;--ad-radius-sm: .25rem;--ad-radius-md: .5rem;--ad-radius-lg: .75rem;--ad-radius-full: 9999px;--ad-font-family-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;--ad-font-family-mono: "JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, monospace;--ad-font-size-xs: .75rem;--ad-font-size-sm: .875rem;--ad-font-size-md: 1rem;--ad-font-size-lg: 1.125rem;--ad-font-size-xl: 1.5rem;--ad-font-size-2xl: 2rem;--ad-line-height-tight: 1.25;--ad-line-height-snug: 1.4;--ad-line-height-normal: 1.55;--ad-font-weight-regular: 400;--ad-font-weight-medium: 500;--ad-font-weight-semibold: 600;--ad-duration-fast: .1s;--ad-duration-base: .16s;--ad-duration-slow: .24s;--ad-easing-out: cubic-bezier(.16, 1, .3, 1);--ad-size-control: 2rem;--ad-size-control-touch: 2.75rem;--ad-size-sidebar: 16rem;--ad-size-topbar: 3rem;--ad-size-content: 46rem}@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}}[data-theme=dark]{color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}@media(prefers-reduced-motion:reduce){:root{--ad-duration-fast: .01ms;--ad-duration-base: .01ms;--ad-duration-slow: .01ms}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;background:var(--ad-color-bg);color:var(--ad-color-text);font-family:var(--ad-font-family-sans);font-size:var(--ad-font-size-sm);line-height:var(--ad-line-height-normal);font-feature-settings:"cv11","ss03";-webkit-font-smoothing:antialiased}h1,h2,h3,h4{margin:0;line-height:var(--ad-line-height-tight);font-weight:var(--ad-font-weight-semibold);text-wrap:balance}h1{font-size:var(--ad-font-size-2xl)}h2{font-size:var(--ad-font-size-xl)}h3{font-size:var(--ad-font-size-lg)}h4{font-size:var(--ad-font-size-md)}p{margin:0;text-wrap:pretty}a{color:var(--ad-color-accent-text);text-underline-offset:.2em}code,kbd,pre{font-family:var(--ad-font-family-mono);font-size:.9em}:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:2px}::selection{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text)}.ad-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.ad-skip-link{position:absolute;inset-block-start:var(--ad-space-2);inset-inline-start:var(--ad-space-2);z-index:100;padding:var(--ad-space-2) var(--ad-space-4);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);color:var(--ad-color-text);box-shadow:var(--ad-shadow-floating);transform:translateY(-200%)}.ad-skip-link:focus{transform:none}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}:root{--ad-control-h: var(--ad-size-control)}@media(pointer:coarse){:root{--ad-control-h: var(--ad-size-control-touch)}}.ad-button{--button-bg: var(--ad-color-surface);--button-bg-hover: var(--ad-color-surface-hover);--button-bg-active: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text);--button-border: var(--ad-color-border-strong);display:inline-flex;align-items:center;justify-content:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-4);border:1px solid var(--button-border);border-radius:var(--ad-radius-md);background:var(--button-bg);color:var(--button-fg);font:inherit;font-weight:var(--ad-font-weight-medium);line-height:1;white-space:nowrap;cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-button:hover{background:var(--button-bg-hover)}.ad-button:active{background:var(--button-bg-active)}.ad-button--sm{min-height:1.75rem;padding:0 var(--ad-space-3);font-size:var(--ad-font-size-xs)}@media(pointer:coarse){.ad-button--sm{min-height:var(--ad-control-h)}}.ad-button--primary{--button-bg: var(--ad-color-accent);--button-bg-hover: var(--ad-color-accent-hover);--button-bg-active: var(--ad-color-accent-hover);--button-fg: var(--ad-color-text-on-accent);--button-border: transparent}.ad-button--ghost{--button-bg: transparent;--button-border: transparent}.ad-button--danger{--button-bg-hover: var(--ad-color-danger-subtle);--button-bg-active: var(--ad-color-danger-subtle);--button-fg: var(--ad-color-danger-text);--button-border: var(--ad-color-danger)}.ad-button:disabled{--button-bg: var(--ad-color-surface-sunken);--button-bg-hover: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text-muted);--button-border: var(--ad-color-border);cursor:not-allowed}.ad-button[aria-busy=true]{cursor:progress}.ad-icon-button{width:var(--ad-control-h);padding:0}.ad-icon-button.ad-button--sm{width:1.75rem}@media(pointer:coarse){.ad-icon-button.ad-button--sm{width:var(--ad-control-h)}}.ad-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:ad-spin .7s linear infinite}@keyframes ad-spin{to{transform:rotate(360deg)}}.ad-field{display:grid;gap:var(--ad-space-1)}.ad-field__label{font-weight:var(--ad-font-weight-medium)}.ad-field__hint{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-field__error{display:flex;align-items:flex-start;gap:var(--ad-space-1);color:var(--ad-color-danger-text);font-size:var(--ad-font-size-xs)}.ad-field__error svg{flex:none;margin-top:-.1em}.ad-input{width:100%;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:1px solid var(--ad-color-border-strong);border-radius:var(--ad-radius-md);background:var(--ad-color-surface);color:var(--ad-color-text);font:inherit}.ad-input::placeholder{color:var(--ad-color-text-muted);opacity:1}.ad-input:hover:not(:disabled){background:var(--ad-color-surface-sunken)}.ad-input[aria-invalid=true]{border-color:var(--ad-color-danger);box-shadow:inset 0 0 0 1px var(--ad-color-danger)}.ad-input:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);color:var(--ad-color-text-muted);cursor:not-allowed}.ad-textarea{min-height:5rem;padding:var(--ad-space-2) var(--ad-space-3);resize:vertical}.ad-select{position:relative;display:block}.ad-select select{appearance:none;padding-inline-end:var(--ad-space-8);cursor:pointer}.ad-select:after{content:"";position:absolute;inset-inline-end:var(--ad-space-3);inset-block-start:50%;width:.45rem;height:.45rem;border:solid var(--ad-color-text-muted);border-width:0 2px 2px 0;transform:translateY(-75%) rotate(45deg);pointer-events:none}.ad-toggle{display:grid;gap:var(--ad-space-1)}.ad-toggle__row{display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-control-h);cursor:pointer}.ad-checkbox,.ad-switch{appearance:none;flex:none;margin:0;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface);cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox{display:grid;place-items:center;width:1.25rem;height:1.25rem;border-radius:var(--ad-radius-sm)}.ad-checkbox:before{content:"";width:.75rem;height:.75rem;background:var(--ad-color-text-on-accent);clip-path:polygon(14% 52%,0 66%,38% 100%,100% 20%,86% 8%,38% 72%);transform:scale(0);transition:transform var(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-checkbox:checked:before{transform:scale(1)}.ad-switch{position:relative;width:2.25rem;height:1.375rem;border-radius:var(--ad-radius-full);background:var(--ad-color-surface-sunken)}.ad-switch:before{content:"";position:absolute;inset-block-start:50%;inset-inline-start:.2rem;width:.875rem;height:.875rem;border-radius:var(--ad-radius-full);background:var(--ad-color-text-muted);transform:translateY(-50%);transition:inset-inline-start var(--ad-duration-base) var(--ad-easing-out)}.ad-switch:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-switch:checked:before{background:var(--ad-color-text-on-accent);inset-inline-start:calc(100% - 1.075rem)}.ad-checkbox:disabled,.ad-switch:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);cursor:not-allowed}.ad-checkbox:disabled:before{background:var(--ad-color-text-muted)}.ad-switch:disabled:before{background:var(--ad-color-border)}@keyframes ad-fade-in{0%{opacity:0}}@keyframes ad-pop-in{0%{opacity:0;scale:.97}}.ad-overlay{position:fixed;z-index:50;inset:0;background:var(--ad-color-scrim);animation:ad-fade-in var(--ad-duration-base) var(--ad-easing-out)}.ad-dialog{position:fixed;z-index:50;inset:0;margin:auto;width:min(32rem,calc(100vw - 2rem));height:fit-content;max-height:calc(100vh - 2rem);overflow:auto;padding:var(--ad-space-6);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-lg);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-dialog__title{padding-inline-end:var(--ad-space-8);font-size:var(--ad-font-size-lg)}.ad-dialog__description{margin-top:var(--ad-space-2);color:var(--ad-color-text-muted)}.ad-dialog__body{margin-top:var(--ad-space-4)}.ad-dialog__footer{display:flex;justify-content:flex-end;gap:var(--ad-space-2);margin-top:var(--ad-space-6)}.ad-dialog__close{position:absolute;inset-block-start:var(--ad-space-3);inset-inline-end:var(--ad-space-3)}.ad-tooltip{z-index:60;max-width:16rem;padding:var(--ad-space-1) var(--ad-space-2);border-radius:var(--ad-radius-sm);background:var(--ad-color-text);color:var(--ad-color-bg);font-size:var(--ad-font-size-xs);animation:ad-fade-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu{z-index:60;min-width:11rem;padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu__item{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-sm);color:var(--ad-color-text);cursor:pointer;outline:none;user-select:none}.ad-menu__item[data-highlighted]{background:var(--ad-color-surface-hover)}.ad-menu__item[data-highlighted]:focus-visible,.ad-menu__item:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:-2px}.ad-menu__item[data-disabled]{color:var(--ad-color-text-muted);cursor:not-allowed}.ad-menu__item--danger{color:var(--ad-color-danger-text)}.ad-menu__shortcut{margin-inline-start:auto;color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-menu__separator{height:1px;margin:var(--ad-space-1) 0;background:var(--ad-color-border)}.ad-toast-viewport{position:fixed;inset-block-end:var(--ad-space-4);inset-inline-end:var(--ad-space-4);z-index:70;display:grid;gap:var(--ad-space-2);width:min(24rem,calc(100vw - 2rem));margin:0;padding:0;list-style:none}.ad-toast{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--ad-space-3);padding:var(--ad-space-3) var(--ad-space-3) var(--ad-space-3) var(--ad-space-4);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating)}.ad-toast[data-state=open]{animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-toast__icon{margin-top:var(--ad-space-1)}.ad-toast--info .ad-toast__icon{color:var(--ad-color-accent)}.ad-toast--success .ad-toast__icon{color:var(--ad-color-success)}.ad-toast--warning .ad-toast__icon{color:var(--ad-color-warning)}.ad-toast--danger .ad-toast__icon{color:var(--ad-color-danger)}.ad-toast__title{font-weight:var(--ad-font-weight-medium)}.ad-toast__description{margin-top:var(--ad-space-1);color:var(--ad-color-text-muted)}.ad-tabs__list{display:flex;gap:var(--ad-space-1);border-bottom:1px solid var(--ad-color-border)}.ad-tabs__trigger{position:relative;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:0;background:transparent;color:var(--ad-color-text-muted);font:inherit;cursor:pointer}.ad-tabs__trigger:hover{color:var(--ad-color-text)}.ad-tabs__trigger[data-state=active]{color:var(--ad-color-text);font-weight:var(--ad-font-weight-semibold)}.ad-tabs__trigger[data-state=active]:after{content:"";position:absolute;inset:auto var(--ad-space-3) -1px;height:2px;background:var(--ad-color-accent)}.ad-tabs__panel{padding-top:var(--ad-space-4)}.ad-shell{display:grid;grid-template-columns:var(--ad-size-sidebar) minmax(0,1fr);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar" "sidebar content";min-height:100vh}.ad-shell__sidebar{grid-area:sidebar;display:flex;flex-direction:column;gap:var(--ad-space-4);padding:var(--ad-space-4) var(--ad-space-3);border-inline-end:1px solid var(--ad-color-border);background:var(--ad-color-surface-sunken)}.ad-shell__brand{padding:0 var(--ad-space-3);font-weight:var(--ad-font-weight-semibold)}.ad-shell__topbar{grid-area:topbar;display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-size-topbar);padding:0 var(--ad-space-6);border-bottom:1px solid var(--ad-color-border);background:var(--ad-color-bg)}.ad-shell__actions{display:flex;align-items:center;gap:var(--ad-space-4);margin-inline-start:auto}.ad-shell__content{grid-area:content;min-width:0;padding:var(--ad-space-8) var(--ad-space-6) var(--ad-space-24);outline:none}.ad-shell__menu{display:none}@media(max-width:47.99rem){.ad-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr;grid-template-areas:"topbar" "sidebar" "content"}.ad-shell__menu{display:inline-flex}.ad-shell__sidebar[data-open=false]{display:none}.ad-shell__sidebar{border-inline-end:0;border-bottom:1px solid var(--ad-color-border)}.ad-shell__topbar,.ad-shell__content{padding-inline:var(--ad-space-4)}}.ad-sidebar-nav{display:grid;gap:var(--ad-space-1);margin:0;padding:0;list-style:none}.ad-sidebar-nav__link{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-md);color:var(--ad-color-text);text-decoration:none}.ad-sidebar-nav__link:hover{background:var(--ad-color-surface-hover)}.ad-sidebar-nav__link[aria-current=page]{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text);font-weight:var(--ad-font-weight-semibold)}.ad-toolbar{display:inline-flex;align-items:center;gap:var(--ad-space-1);padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface)}.ad-toolbar__separator{align-self:stretch;width:1px;margin:var(--ad-space-1);background:var(--ad-color-border)}.ad-button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--button-border);font-weight:var(--ad-font-weight-semibold);--button-bg: var(--ad-color-accent-subtle);--button-bg-hover: var(--ad-color-accent-subtle);--button-fg: var(--ad-color-accent-text);--button-border: var(--ad-color-accent)}.ad-empty{display:grid;justify-items:center;gap:var(--ad-space-3);padding:var(--ad-space-12) var(--ad-space-6);text-align:center}.ad-empty__title{font-size:var(--ad-font-size-lg)}.ad-empty__description{max-width:28rem;color:var(--ad-color-text-muted)}.ad-files{margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-file-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;gap:var(--ad-space-4);min-height:3rem;padding:var(--ad-space-1) var(--ad-space-2);border-bottom:1px solid var(--ad-color-border)}.ad-file-row:hover{background:var(--ad-color-surface-sunken)}.ad-file-row__icon{display:inline-flex;color:var(--ad-color-text-muted)}.ad-file-row__name{min-height:1.5rem;overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-file-row__meta,.ad-file-row__time{display:inline-flex;align-items:center;gap:var(--ad-space-2);color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-file-row__actions{display:inline-flex}@media(max-width:47.99rem){.ad-file-row{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"icon name actions" ". meta meta" ". time time"}.ad-file-row__icon{grid-area:icon}.ad-file-row__name{grid-area:name}.ad-file-row__meta{grid-area:meta}.ad-file-row__time{grid-area:time}.ad-file-row__actions{grid-area:actions}}.ad-avatar{display:inline-grid;flex:none;place-items:center;width:1.5rem;height:1.5rem;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface-sunken);color:var(--ad-color-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1}.ad-avatar svg{width:.9rem;height:.9rem}.ad-avatar--person{border-radius:var(--ad-radius-full)}.ad-avatar--agent{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.ad-avatar--more{border-radius:var(--ad-radius-full);background:var(--ad-color-surface);color:var(--ad-color-text-muted)}.ad-chip{display:inline-flex;align-items:center;gap:var(--ad-space-2);max-width:100%;min-width:0}.ad-chip__name{overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-chip__meta{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}.ad-pill{flex:none;padding:.125rem var(--ad-space-2);border:1px solid var(--ad-color-agent);border-radius:var(--ad-radius-full);color:var(--ad-color-agent-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-semibold);letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.ad-stack{display:inline-flex;align-items:center;gap:var(--ad-space-3)}.ad-stack__list{display:flex;margin:0;padding:0;list-style:none}.ad-stack__list li+li{margin-inline-start:-.25rem}.ad-stack__list .ad-avatar{width:1.75rem;height:1.75rem;box-shadow:0 0 0 2px var(--ad-color-bg)}.ad-stack__summary{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}@media(forced-colors:active){.ad-checkbox:checked,.ad-switch:checked{background:Highlight;border-color:Highlight}.ad-checkbox:before{background:HighlightText}.ad-switch{background:Canvas;border-color:ButtonText}.ad-switch:before{background:ButtonText}.ad-switch:checked:before{background:HighlightText}.ad-button[aria-busy=true]{border-style:dashed}.ad-button[aria-pressed=true]{background:Highlight;color:HighlightText;border-color:Highlight}.ad-tabs__trigger[data-state=active]:after{background:Highlight}.ad-menu__item[data-highlighted]{outline:2px solid Highlight;outline-offset:-2px}}.ad-dialog:has(.ad-share){width:min(36rem,calc(100vw - 2rem))}.ad-share{display:grid;gap:var(--ad-space-4)}.ad-share__invite{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:start;gap:var(--ad-space-3)}.ad-share__invite .ad-field:first-child{grid-column:1 / -1}.ad-share__invite .ad-button{align-self:end}.ad-share__sent{color:var(--ad-color-success-text);font-size:var(--ad-font-size-xs)}.ad-share__people{display:grid;margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-share__people li{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-3);padding:var(--ad-space-2) 0;border-bottom:1px solid var(--ad-color-border)}.ad-share__people .ad-field{min-width:9rem}.ad-share__controls{display:inline-flex;align-items:center;gap:var(--ad-space-2)}.ad-share__owner{padding-inline:var(--ad-space-3);color:var(--ad-color-text-muted)}.ad-share__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--ad-space-3)}.ad-share__copy{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--ad-space-3)}@media(max-width:30rem){.ad-share__invite,.ad-share__row,.ad-share__copy{grid-template-columns:1fr}}.ad-cursor{position:relative;display:inline-block;width:0;vertical-align:baseline;user-select:none}.ad-cursor__caret{position:absolute;inset-block:-.2em -.15em;inset-inline-start:0;width:2px;background:var(--ad-color-accent)}.ad-cursor__tag{position:absolute;inset-block-end:1.45em;inset-inline-start:0;padding:.0625rem var(--ad-space-2);border:1px solid var(--ad-color-accent);border-radius:var(--ad-radius-sm) var(--ad-radius-sm) var(--ad-radius-sm) 0;background:var(--ad-color-accent);color:var(--ad-color-text-on-accent);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1.3;white-space:nowrap}.ad-cursor--agent .ad-cursor__caret{background:var(--ad-color-agent)}.ad-cursor--agent .ad-cursor__tag{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.page-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-4);flex-wrap:wrap;margin-block-end:var(--ad-space-6);max-width:var(--ad-size-content)}.page-head h1{margin:0;font-size:var(--ad-font-size-xl);line-height:var(--ad-line-height-tight);overflow-wrap:anywhere}.page-head h1:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:4px;border-radius:var(--ad-radius-sm)}.page-actions{display:flex;gap:var(--ad-space-2);flex-wrap:wrap}.muted{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-sm);margin:0}.notice{max-width:var(--ad-size-content)}.signin{max-width:24rem;margin:var(--ad-space-24) auto 0;padding:0 var(--ad-space-4);display:grid;gap:var(--ad-space-4)}.signin h1{margin:0;font-size:var(--ad-font-size-xl)}.form{display:grid;gap:var(--ad-space-4)}.form-actions{display:flex;gap:var(--ad-space-2);align-items:center;justify-content:flex-end;flex-wrap:wrap}.form-error{color:var(--ad-color-danger-text);margin:0;font-size:var(--ad-font-size-sm)}.section-title{margin:var(--ad-space-2) 0 0;font-size:var(--ad-font-size-md)}.people{list-style:none;margin:0;padding:0;display:grid;gap:var(--ad-space-2)}.editor-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-4);flex-wrap:wrap;max-width:var(--ad-size-content);margin-block-end:var(--ad-space-3)}.editor-meta{display:flex;align-items:center;gap:var(--ad-space-4);flex-wrap:wrap}.glyph{font-weight:var(--ad-font-weight-semibold);min-width:1.25rem;text-align:center}.glyph--b{font-weight:800}.glyph--i{font-style:italic;font-family:serif}.editor-host{max-width:var(--ad-size-content);background:var(--ad-color-surface);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md)}.editor-host:focus-within{outline:2px solid var(--ad-color-focus);outline-offset:2px}.prose{min-height:20rem;padding:var(--ad-space-6);outline:none;line-height:var(--ad-line-height-normal);overflow-wrap:anywhere}.prose>:first-child{margin-top:0}.prose h1{font-size:var(--ad-font-size-2xl);line-height:var(--ad-line-height-tight)}.prose h2{font-size:var(--ad-font-size-xl);line-height:var(--ad-line-height-tight)}.prose h3{font-size:var(--ad-font-size-lg)}.prose a{color:var(--ad-color-accent-text);text-decoration:underline}.prose blockquote{margin-inline:0;padding-inline-start:var(--ad-space-4);border-inline-start:3px solid var(--ad-color-border-strong)}.prose code{font-family:var(--ad-font-family-mono);background:var(--ad-color-surface-sunken);padding:0 .25em;border-radius:var(--ad-radius-sm)}.prose pre{background:var(--ad-color-surface-sunken);padding:var(--ad-space-3);border-radius:var(--ad-radius-md);overflow-x:auto}.prose table{border-collapse:collapse}.prose th,.prose td{border:1px solid var(--ad-color-border-strong);padding:var(--ad-space-1) var(--ad-space-2)}.prose img{max-width:100%}.prose ul[data-type=taskList]{list-style:none;padding-inline-start:var(--ad-space-2)}.prose ul[data-type=taskList] li{display:flex;gap:var(--ad-space-2)}.agent-text{text-decoration:underline dotted 2px var(--ad-color-agent);text-underline-offset:3px;background:var(--ad-color-agent-subtle);border-radius:2px}.legend{margin-block-start:var(--ad-space-3)}.caret{position:relative;border-inline-start:2px solid var(--ad-color-accent);margin-inline:-1px;pointer-events:none;word-break:normal}.caret--agent{border-inline-start:2px dashed var(--ad-color-agent)}.caret__tag{position:absolute;top:-1.45em;inset-inline-start:-2px;white-space:nowrap;font-size:var(--ad-font-size-xs);line-height:1.3;padding:0 var(--ad-space-1);border-radius:var(--ad-radius-sm) var(--ad-radius-sm) var(--ad-radius-sm) 0;background:var(--ad-color-accent);color:var(--ad-color-text-on-accent);user-select:none}.caret--agent .caret__tag{background:var(--ad-color-surface);color:var(--ad-color-agent-text);border:1px solid var(--ad-color-agent);border-radius:0}
1
+ @font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./assets/inter-latin-ext-wght-normal-HA22NDSG.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./assets/inter-latin-wght-normal-NRMW37G5.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url("./assets/jetbrains-mono-latin-ext-wght-normal-TSLVDSQR.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url("./assets/jetbrains-mono-latin-wght-normal-VBS632QH.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root,[data-theme=light]{color-scheme:light;--ad-color-bg: #FAF9F7;--ad-color-surface: #FFFFFF;--ad-color-surface-raised: #FFFFFF;--ad-color-surface-sunken: #F3F1EE;--ad-color-surface-hover: #E9E6E1;--ad-color-text: #1D1C1A;--ad-color-text-muted: #5E5A53;--ad-color-text-on-accent: #FFFFFF;--ad-color-border: #DAD7D1;--ad-color-border-strong: #827D73;--ad-color-accent: #2B4BC4;--ad-color-accent-hover: #223D9F;--ad-color-accent-subtle: #E8EDFC;--ad-color-accent-text: #223D9F;--ad-color-agent: #8E2C86;--ad-color-agent-subtle: #F7E8F5;--ad-color-agent-text: #7A2273;--ad-color-danger: #B42318;--ad-color-danger-subtle: #FDECEA;--ad-color-danger-text: #A11D14;--ad-color-warning: #92520A;--ad-color-warning-subtle: #FDF1DC;--ad-color-warning-text: #7A4208;--ad-color-success: #1B6B3A;--ad-color-success-subtle: #E6F5EC;--ad-color-success-text: #175C32;--ad-color-focus: #2B4BC4;--ad-color-scrim: rgb(29 28 26 / .4);--ad-shadow-raised: 0 1px 2px rgb(29 28 26 / .06), 0 2px 16px rgb(29 28 26 / .08);--ad-shadow-floating: 0 2px 6px rgb(29 28 26 / .08), 0 8px 40px rgb(29 28 26 / .16)}:root{--ad-space-1: .25rem;--ad-space-2: .5rem;--ad-space-3: .75rem;--ad-space-4: 1rem;--ad-space-6: 1.5rem;--ad-space-8: 2rem;--ad-space-12: 3rem;--ad-space-16: 4rem;--ad-space-24: 6rem;--ad-radius-sm: .25rem;--ad-radius-md: .5rem;--ad-radius-lg: .75rem;--ad-radius-full: 9999px;--ad-font-family-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;--ad-font-family-mono: "JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, monospace;--ad-font-size-xs: .75rem;--ad-font-size-sm: .875rem;--ad-font-size-md: 1rem;--ad-font-size-lg: 1.125rem;--ad-font-size-xl: 1.5rem;--ad-font-size-2xl: 2rem;--ad-line-height-tight: 1.25;--ad-line-height-snug: 1.4;--ad-line-height-normal: 1.55;--ad-font-weight-regular: 400;--ad-font-weight-medium: 500;--ad-font-weight-semibold: 600;--ad-duration-fast: .1s;--ad-duration-base: .16s;--ad-duration-slow: .24s;--ad-easing-out: cubic-bezier(.16, 1, .3, 1);--ad-size-control: 2rem;--ad-size-control-touch: 2.75rem;--ad-size-sidebar: 16rem;--ad-size-topbar: 3rem;--ad-size-content: 46rem}@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}}[data-theme=dark]{color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}@media(prefers-reduced-motion:reduce){:root{--ad-duration-fast: .01ms;--ad-duration-base: .01ms;--ad-duration-slow: .01ms}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;background:var(--ad-color-bg);color:var(--ad-color-text);font-family:var(--ad-font-family-sans);font-size:var(--ad-font-size-sm);line-height:var(--ad-line-height-normal);font-feature-settings:"cv11","ss03";-webkit-font-smoothing:antialiased}h1,h2,h3,h4{margin:0;line-height:var(--ad-line-height-tight);font-weight:var(--ad-font-weight-semibold);text-wrap:balance}h1{font-size:var(--ad-font-size-2xl)}h2{font-size:var(--ad-font-size-xl)}h3{font-size:var(--ad-font-size-lg)}h4{font-size:var(--ad-font-size-md)}p{margin:0;text-wrap:pretty}a{color:var(--ad-color-accent-text);text-underline-offset:.2em}code,kbd,pre{font-family:var(--ad-font-family-mono);font-size:.9em}:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:2px}::selection{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text)}.ad-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.ad-skip-link{position:absolute;inset-block-start:var(--ad-space-2);inset-inline-start:var(--ad-space-2);z-index:100;padding:var(--ad-space-2) var(--ad-space-4);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);color:var(--ad-color-text);box-shadow:var(--ad-shadow-floating);transform:translateY(-200%)}.ad-skip-link:focus{transform:none}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}:root{--ad-control-h: var(--ad-size-control)}@media(pointer:coarse){:root{--ad-control-h: var(--ad-size-control-touch)}}.ad-button{--button-bg: var(--ad-color-surface);--button-bg-hover: var(--ad-color-surface-hover);--button-bg-active: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text);--button-border: var(--ad-color-border-strong);display:inline-flex;align-items:center;justify-content:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-4);border:1px solid var(--button-border);border-radius:var(--ad-radius-md);background:var(--button-bg);color:var(--button-fg);font:inherit;font-weight:var(--ad-font-weight-medium);line-height:1;white-space:nowrap;cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-button:hover{background:var(--button-bg-hover)}.ad-button:active{background:var(--button-bg-active)}.ad-button--sm{min-height:1.75rem;padding:0 var(--ad-space-3);font-size:var(--ad-font-size-xs)}@media(pointer:coarse){.ad-button--sm{min-height:var(--ad-control-h)}}.ad-button--primary{--button-bg: var(--ad-color-accent);--button-bg-hover: var(--ad-color-accent-hover);--button-bg-active: var(--ad-color-accent-hover);--button-fg: var(--ad-color-text-on-accent);--button-border: transparent}.ad-button--ghost{--button-bg: transparent;--button-border: transparent}.ad-button--danger{--button-bg-hover: var(--ad-color-danger-subtle);--button-bg-active: var(--ad-color-danger-subtle);--button-fg: var(--ad-color-danger-text);--button-border: var(--ad-color-danger)}.ad-button:disabled{--button-bg: var(--ad-color-surface-sunken);--button-bg-hover: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text-muted);--button-border: var(--ad-color-border);cursor:not-allowed}.ad-button[aria-busy=true]{cursor:progress}.ad-icon-button{width:var(--ad-control-h);padding:0}.ad-icon-button.ad-button--sm{width:1.75rem}@media(pointer:coarse){.ad-icon-button.ad-button--sm{width:var(--ad-control-h)}}.ad-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:ad-spin .7s linear infinite}@keyframes ad-spin{to{transform:rotate(360deg)}}.ad-field{display:grid;gap:var(--ad-space-1)}.ad-field__label{font-weight:var(--ad-font-weight-medium)}.ad-field__hint{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-field__error{display:flex;align-items:flex-start;gap:var(--ad-space-1);color:var(--ad-color-danger-text);font-size:var(--ad-font-size-xs)}.ad-field__error svg{flex:none;margin-top:-.1em}.ad-input{width:100%;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:1px solid var(--ad-color-border-strong);border-radius:var(--ad-radius-md);background:var(--ad-color-surface);color:var(--ad-color-text);font:inherit}.ad-input::placeholder{color:var(--ad-color-text-muted);opacity:1}.ad-input:hover:not(:disabled){background:var(--ad-color-surface-sunken)}.ad-input[aria-invalid=true]{border-color:var(--ad-color-danger);box-shadow:inset 0 0 0 1px var(--ad-color-danger)}.ad-input:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);color:var(--ad-color-text-muted);cursor:not-allowed}.ad-textarea{min-height:5rem;padding:var(--ad-space-2) var(--ad-space-3);resize:vertical}.ad-select{position:relative;display:block}.ad-select select{appearance:none;padding-inline-end:var(--ad-space-8);cursor:pointer}.ad-select:after{content:"";position:absolute;inset-inline-end:var(--ad-space-3);inset-block-start:50%;width:.45rem;height:.45rem;border:solid var(--ad-color-text-muted);border-width:0 2px 2px 0;transform:translateY(-75%) rotate(45deg);pointer-events:none}.ad-toggle{display:grid;gap:var(--ad-space-1)}.ad-toggle__row{display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-control-h);cursor:pointer}.ad-checkbox,.ad-switch{appearance:none;flex:none;margin:0;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface);cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox{display:grid;place-items:center;width:1.25rem;height:1.25rem;border-radius:var(--ad-radius-sm)}.ad-checkbox:before{content:"";width:.75rem;height:.75rem;background:var(--ad-color-text-on-accent);clip-path:polygon(14% 52%,0 66%,38% 100%,100% 20%,86% 8%,38% 72%);transform:scale(0);transition:transform var(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-checkbox:checked:before{transform:scale(1)}.ad-switch{position:relative;width:2.25rem;height:1.375rem;border-radius:var(--ad-radius-full);background:var(--ad-color-surface-sunken)}.ad-switch:before{content:"";position:absolute;inset-block-start:50%;inset-inline-start:.2rem;width:.875rem;height:.875rem;border-radius:var(--ad-radius-full);background:var(--ad-color-text-muted);transform:translateY(-50%);transition:inset-inline-start var(--ad-duration-base) var(--ad-easing-out)}.ad-switch:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-switch:checked:before{background:var(--ad-color-text-on-accent);inset-inline-start:calc(100% - 1.075rem)}.ad-checkbox:disabled,.ad-switch:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);cursor:not-allowed}.ad-checkbox:disabled:before{background:var(--ad-color-text-muted)}.ad-switch:disabled:before{background:var(--ad-color-border)}@keyframes ad-fade-in{0%{opacity:0}}@keyframes ad-pop-in{0%{opacity:0;scale:.97}}.ad-overlay{position:fixed;z-index:50;inset:0;background:var(--ad-color-scrim);animation:ad-fade-in var(--ad-duration-base) var(--ad-easing-out)}.ad-dialog{position:fixed;z-index:50;inset:0;margin:auto;width:min(32rem,calc(100vw - 2rem));height:fit-content;max-height:calc(100vh - 2rem);overflow:auto;padding:var(--ad-space-6);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-lg);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-dialog__title{padding-inline-end:var(--ad-space-8);font-size:var(--ad-font-size-lg)}.ad-dialog__description{margin-top:var(--ad-space-2);color:var(--ad-color-text-muted)}.ad-dialog__body{margin-top:var(--ad-space-4)}.ad-dialog__footer{display:flex;justify-content:flex-end;gap:var(--ad-space-2);margin-top:var(--ad-space-6)}.ad-dialog__close{position:absolute;inset-block-start:var(--ad-space-3);inset-inline-end:var(--ad-space-3)}.ad-tooltip{z-index:60;max-width:16rem;padding:var(--ad-space-1) var(--ad-space-2);border-radius:var(--ad-radius-sm);background:var(--ad-color-text);color:var(--ad-color-bg);font-size:var(--ad-font-size-xs);animation:ad-fade-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu{z-index:60;min-width:11rem;padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu__item{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-sm);color:var(--ad-color-text);cursor:pointer;outline:none;user-select:none}.ad-menu__item[data-highlighted]{background:var(--ad-color-surface-hover)}.ad-menu__item[data-highlighted]:focus-visible,.ad-menu__item:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:-2px}.ad-menu__item[data-disabled]{color:var(--ad-color-text-muted);cursor:not-allowed}.ad-menu__item--danger{color:var(--ad-color-danger-text)}.ad-menu__shortcut{margin-inline-start:auto;color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-menu__separator{height:1px;margin:var(--ad-space-1) 0;background:var(--ad-color-border)}.ad-toast-viewport{position:fixed;inset-block-end:var(--ad-space-4);inset-inline-end:var(--ad-space-4);z-index:70;display:grid;gap:var(--ad-space-2);width:min(24rem,calc(100vw - 2rem));margin:0;padding:0;list-style:none}.ad-toast{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--ad-space-3);padding:var(--ad-space-3) var(--ad-space-3) var(--ad-space-3) var(--ad-space-4);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating)}.ad-toast[data-state=open]{animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-toast__icon{margin-top:var(--ad-space-1)}.ad-toast--info .ad-toast__icon{color:var(--ad-color-accent)}.ad-toast--success .ad-toast__icon{color:var(--ad-color-success)}.ad-toast--warning .ad-toast__icon{color:var(--ad-color-warning)}.ad-toast--danger .ad-toast__icon{color:var(--ad-color-danger)}.ad-toast__title{font-weight:var(--ad-font-weight-medium)}.ad-toast__description{margin-top:var(--ad-space-1);color:var(--ad-color-text-muted)}.ad-tabs__list{display:flex;gap:var(--ad-space-1);border-bottom:1px solid var(--ad-color-border)}.ad-tabs__trigger{position:relative;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:0;background:transparent;color:var(--ad-color-text-muted);font:inherit;cursor:pointer}.ad-tabs__trigger:hover{color:var(--ad-color-text)}.ad-tabs__trigger[data-state=active]{color:var(--ad-color-text);font-weight:var(--ad-font-weight-semibold)}.ad-tabs__trigger[data-state=active]:after{content:"";position:absolute;inset:auto var(--ad-space-3) -1px;height:2px;background:var(--ad-color-accent)}.ad-tabs__panel{padding-top:var(--ad-space-4)}.ad-shell{display:grid;grid-template-columns:var(--ad-size-sidebar) minmax(0,1fr);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar" "sidebar content";min-height:100vh}.ad-shell__sidebar{grid-area:sidebar;display:flex;flex-direction:column;gap:var(--ad-space-4);padding:var(--ad-space-4) var(--ad-space-3);border-inline-end:1px solid var(--ad-color-border);background:var(--ad-color-surface-sunken)}.ad-shell__brand{padding:0 var(--ad-space-3);font-weight:var(--ad-font-weight-semibold)}.ad-shell__topbar{grid-area:topbar;display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-size-topbar);padding:0 var(--ad-space-6);border-bottom:1px solid var(--ad-color-border);background:var(--ad-color-bg)}.ad-shell__actions{display:flex;align-items:center;gap:var(--ad-space-4);margin-inline-start:auto}.ad-shell__content{grid-area:content;min-width:0;padding:var(--ad-space-8) var(--ad-space-6) var(--ad-space-24);outline:none}.ad-shell__menu{display:none}@media(max-width:47.99rem){.ad-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr;grid-template-areas:"topbar" "sidebar" "content"}.ad-shell__menu{display:inline-flex}.ad-shell__sidebar[data-open=false]{display:none}.ad-shell__sidebar{border-inline-end:0;border-bottom:1px solid var(--ad-color-border)}.ad-shell__topbar,.ad-shell__content{padding-inline:var(--ad-space-4)}}.ad-sidebar-nav{display:grid;gap:var(--ad-space-1);margin:0;padding:0;list-style:none}.ad-sidebar-nav__link{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-md);color:var(--ad-color-text);text-decoration:none}.ad-sidebar-nav__link:hover{background:var(--ad-color-surface-hover)}.ad-sidebar-nav__link[aria-current=page]{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text);font-weight:var(--ad-font-weight-semibold)}.ad-toolbar{display:inline-flex;align-items:center;gap:var(--ad-space-1);padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface)}.ad-toolbar__separator{align-self:stretch;width:1px;margin:var(--ad-space-1);background:var(--ad-color-border)}.ad-button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--button-border);font-weight:var(--ad-font-weight-semibold);--button-bg: var(--ad-color-accent-subtle);--button-bg-hover: var(--ad-color-accent-subtle);--button-fg: var(--ad-color-accent-text);--button-border: var(--ad-color-accent)}.ad-empty{display:grid;justify-items:center;gap:var(--ad-space-3);padding:var(--ad-space-12) var(--ad-space-6);text-align:center}.ad-empty__title{font-size:var(--ad-font-size-lg)}.ad-empty__description{max-width:28rem;color:var(--ad-color-text-muted)}.ad-files{margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-file-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;gap:var(--ad-space-4);min-height:3rem;padding:var(--ad-space-1) var(--ad-space-2);border-bottom:1px solid var(--ad-color-border)}.ad-file-row:hover{background:var(--ad-color-surface-sunken)}.ad-file-row__icon{display:inline-flex;color:var(--ad-color-text-muted)}.ad-file-row__name{min-height:1.5rem;overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-file-row__meta,.ad-file-row__time{display:inline-flex;align-items:center;gap:var(--ad-space-2);color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-file-row__actions{display:inline-flex}@media(max-width:47.99rem){.ad-file-row{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"icon name actions" ". meta meta" ". time time"}.ad-file-row__icon{grid-area:icon}.ad-file-row__name{grid-area:name}.ad-file-row__meta{grid-area:meta}.ad-file-row__time{grid-area:time}.ad-file-row__actions{grid-area:actions}}.ad-avatar{display:inline-grid;flex:none;place-items:center;width:1.5rem;height:1.5rem;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface-sunken);color:var(--ad-color-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1}.ad-avatar svg{width:.9rem;height:.9rem}.ad-avatar--person{border-radius:var(--ad-radius-full)}.ad-avatar--agent{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.ad-avatar--more{border-radius:var(--ad-radius-full);background:var(--ad-color-surface);color:var(--ad-color-text-muted)}.ad-chip{display:inline-flex;align-items:center;gap:var(--ad-space-2);max-width:100%;min-width:0}.ad-chip__name{overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-chip__meta{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}.ad-pill{flex:none;padding:.125rem var(--ad-space-2);border:1px solid var(--ad-color-agent);border-radius:var(--ad-radius-full);color:var(--ad-color-agent-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-semibold);letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.ad-stack{display:inline-flex;align-items:center;gap:var(--ad-space-3)}.ad-stack__list{display:flex;margin:0;padding:0;list-style:none}.ad-stack__list li+li{margin-inline-start:-.25rem}.ad-stack__list .ad-avatar{width:1.75rem;height:1.75rem;box-shadow:0 0 0 2px var(--ad-color-bg)}.ad-stack__summary{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}@media(forced-colors:active){.ad-checkbox:checked,.ad-switch:checked{background:Highlight;border-color:Highlight}.ad-checkbox:before{background:HighlightText}.ad-switch{background:Canvas;border-color:ButtonText}.ad-switch:before{background:ButtonText}.ad-switch:checked:before{background:HighlightText}.ad-button[aria-busy=true]{border-style:dashed}.ad-button[aria-pressed=true]{background:Highlight;color:HighlightText;border-color:Highlight}.ad-tabs__trigger[data-state=active]:after{background:Highlight}.ad-menu__item[data-highlighted]{outline:2px solid Highlight;outline-offset:-2px}}.ad-dialog:has(.ad-share){width:min(36rem,calc(100vw - 2rem))}.ad-share{display:grid;gap:var(--ad-space-4)}.ad-share__invite{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:start;gap:var(--ad-space-3)}.ad-share__invite .ad-field:first-child{grid-column:1 / -1}.ad-share__invite .ad-button{align-self:end}.ad-share__sent{color:var(--ad-color-success-text);font-size:var(--ad-font-size-xs)}.ad-share__people{display:grid;margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-share__people li{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-3);padding:var(--ad-space-2) 0;border-bottom:1px solid var(--ad-color-border)}.ad-share__people .ad-field{min-width:9rem}.ad-share__controls{display:inline-flex;align-items:center;gap:var(--ad-space-2)}.ad-share__owner{padding-inline:var(--ad-space-3);color:var(--ad-color-text-muted)}.ad-share__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--ad-space-3)}.ad-share__copy{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--ad-space-3)}@media(max-width:30rem){.ad-share__invite,.ad-share__row,.ad-share__copy{grid-template-columns:1fr}}.ad-cursor{position:relative;display:inline-block;width:0;vertical-align:baseline;user-select:none}.ad-cursor__caret{position:absolute;inset-block:-.2em -.15em;inset-inline-start:0;width:2px;background:var(--ad-color-accent)}.ad-cursor__tag{position:absolute;inset-block-end:1.45em;inset-inline-start:0;padding:.0625rem var(--ad-space-2);border:1px solid var(--ad-color-accent);border-radius:var(--ad-radius-sm) var(--ad-radius-sm) var(--ad-radius-sm) 0;background:var(--ad-color-accent);color:var(--ad-color-text-on-accent);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1.3;white-space:nowrap}.ad-cursor--agent .ad-cursor__caret{background:var(--ad-color-agent)}.ad-cursor--agent .ad-cursor__tag{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.adoc.muted,.adoc .muted{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-sm);margin:0}.adoc.notice,.adoc .notice{max-width:var(--ad-size-content)}.adoc.form{display:grid;gap:var(--ad-space-4)}.adoc.form .form-actions{display:flex;gap:var(--ad-space-2);align-items:center;justify-content:flex-end;flex-wrap:wrap}.adoc .editor-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-4);flex-wrap:wrap;max-width:var(--ad-size-content);margin-block-end:var(--ad-space-3)}.adoc .editor-meta{display:flex;align-items:center;gap:var(--ad-space-4);flex-wrap:wrap}.adoc .glyph{font-weight:var(--ad-font-weight-semibold);min-width:1.25rem;text-align:center}.adoc .glyph--b{font-weight:800}.adoc .glyph--i{font-style:italic;font-family:serif}.adoc .editor-host{max-width:var(--ad-size-content);background:var(--ad-color-surface);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md)}.adoc .editor-host:focus-within{outline:2px solid var(--ad-color-focus);outline-offset:2px}.adoc .prose{min-height:20rem;padding:var(--ad-space-6);outline:none;line-height:var(--ad-line-height-normal);overflow-wrap:anywhere}.adoc .prose>:first-child{margin-top:0}.adoc .prose h1{font-size:var(--ad-font-size-2xl);line-height:var(--ad-line-height-tight)}.adoc .prose h2{font-size:var(--ad-font-size-xl);line-height:var(--ad-line-height-tight)}.adoc .prose h3{font-size:var(--ad-font-size-lg)}.adoc .prose a{color:var(--ad-color-accent-text);text-decoration:underline}.adoc .prose blockquote{margin-inline:0;padding-inline-start:var(--ad-space-4);border-inline-start:3px solid var(--ad-color-border-strong)}.adoc .prose code{font-family:var(--ad-font-family-mono);background:var(--ad-color-surface-sunken);padding:0 .25em;border-radius:var(--ad-radius-sm)}.adoc .prose pre{background:var(--ad-color-surface-sunken);padding:var(--ad-space-3);border-radius:var(--ad-radius-md);overflow-x:auto}.adoc .prose table{border-collapse:collapse}.adoc .prose th,.adoc .prose td{border:1px solid var(--ad-color-border-strong);padding:var(--ad-space-1) var(--ad-space-2)}.adoc .prose img{max-width:100%}.adoc .prose ul[data-type=taskList]{list-style:none;padding-inline-start:var(--ad-space-2)}.adoc .prose ul[data-type=taskList] li{display:flex;gap:var(--ad-space-2)}.adoc .agent-text{text-decoration:underline dotted 2px var(--ad-color-agent);text-underline-offset:3px;background:var(--ad-color-agent-subtle);border-radius:2px}.adoc .legend{margin-block-start:var(--ad-space-3)}.adoc .caret{position:relative;border-inline-start:2px solid var(--ad-color-accent);margin-inline:-1px;pointer-events:none;word-break:normal}.adoc .caret--agent{border-inline-start:2px dashed var(--ad-color-agent)}.adoc .caret__tag{position:absolute;top:-1.45em;inset-inline-start:-2px;white-space:nowrap;font-size:var(--ad-font-size-xs);line-height:1.3;padding:0 var(--ad-space-1);border-radius:var(--ad-radius-sm) var(--ad-radius-sm) var(--ad-radius-sm) 0;background:var(--ad-color-accent);color:var(--ad-color-text-on-accent);user-select:none}.adoc .caret--agent .caret__tag{background:var(--ad-color-surface);color:var(--ad-color-agent-text);border:1px solid var(--ad-color-agent);border-radius:0}.page-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-4);flex-wrap:wrap;margin-block-end:var(--ad-space-6);max-width:var(--ad-size-content)}.page-head h1{margin:0;font-size:var(--ad-font-size-xl);line-height:var(--ad-line-height-tight);overflow-wrap:anywhere}.page-head h1:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:4px;border-radius:var(--ad-radius-sm)}.page-actions{display:flex;gap:var(--ad-space-2);flex-wrap:wrap}.muted{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-sm);margin:0}.notice{max-width:var(--ad-size-content)}.signin{max-width:24rem;margin:var(--ad-space-24) auto 0;padding:0 var(--ad-space-4);display:grid;gap:var(--ad-space-4)}.signin h1{margin:0;font-size:var(--ad-font-size-xl)}.form{display:grid;gap:var(--ad-space-4)}.form-actions{display:flex;gap:var(--ad-space-2);align-items:center;justify-content:flex-end;flex-wrap:wrap}.form-error{color:var(--ad-color-danger-text);margin:0;font-size:var(--ad-font-size-sm)}.section-title{margin:var(--ad-space-2) 0 0;font-size:var(--ad-font-size-md)}.people{list-style:none;margin:0;padding:0;display:grid;gap:var(--ad-space-2)}