@agimon-ai/po-author 0.0.0-alpha.69 → 0.0.0-alpha.70
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.
|
@@ -57,28 +57,79 @@ function createWebmcpNamespace(catalog, sessionId, assertAvailable) {
|
|
|
57
57
|
if (disposed) throw new Error("Author WebMCP run is disposed.");
|
|
58
58
|
assertAvailable();
|
|
59
59
|
};
|
|
60
|
+
const recorded = async (member, tool, input, work) => {
|
|
61
|
+
const started = Date.now();
|
|
62
|
+
let args = {};
|
|
63
|
+
try {
|
|
64
|
+
if (typeof input === "object" && input !== null && !Array.isArray(input)) args = copy(input);
|
|
65
|
+
} catch {}
|
|
66
|
+
const base = {
|
|
67
|
+
name: `webmcp.${member}`,
|
|
68
|
+
tool,
|
|
69
|
+
args
|
|
70
|
+
};
|
|
71
|
+
let outcome;
|
|
72
|
+
try {
|
|
73
|
+
outcome = await work();
|
|
74
|
+
} catch (error) {
|
|
75
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
76
|
+
run.record?.({
|
|
77
|
+
...base,
|
|
78
|
+
ok: false,
|
|
79
|
+
ms: Date.now() - started,
|
|
80
|
+
error: message,
|
|
81
|
+
result: { content: [{
|
|
82
|
+
type: "text",
|
|
83
|
+
text: message
|
|
84
|
+
}] }
|
|
85
|
+
});
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
run.record?.({
|
|
89
|
+
...base,
|
|
90
|
+
ok: true,
|
|
91
|
+
ms: Date.now() - started,
|
|
92
|
+
result: {
|
|
93
|
+
content: [{
|
|
94
|
+
type: "text",
|
|
95
|
+
text: JSON.stringify(outcome.details ?? null, null, 2)
|
|
96
|
+
}],
|
|
97
|
+
details: outcome.details
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
return outcome.value;
|
|
101
|
+
};
|
|
60
102
|
const members = Object.create(null);
|
|
61
|
-
members.open = async (
|
|
103
|
+
members.open = (input) => recorded("open", require_structuredDocuments.OPEN_AUTHORING_FILE_TOOL_NAME, input, async () => {
|
|
62
104
|
check();
|
|
63
105
|
const { path, alias } = require_structuredDocuments.parseOpenAuthoringFileInput(copy(input));
|
|
64
|
-
const result = await catalog.open(path, run.signal, alias);
|
|
106
|
+
const result = copy(await catalog.open(path, run.signal, alias));
|
|
65
107
|
check();
|
|
66
|
-
return
|
|
67
|
-
|
|
68
|
-
|
|
108
|
+
return {
|
|
109
|
+
details: result,
|
|
110
|
+
value: result
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
members.describe = (input) => recorded("describe", require_structuredDocuments.AUTHOR_DESCRIBE_TOOL_NAME, input, async () => {
|
|
69
114
|
check();
|
|
70
115
|
const { alias } = require_structuredDocuments.parseDescribeAuthorToolsInput(copy(input === void 0 ? {} : input));
|
|
71
|
-
const result = await catalog.describe(run.signal, alias);
|
|
116
|
+
const result = copy(await catalog.describe(run.signal, alias));
|
|
72
117
|
check();
|
|
73
|
-
return
|
|
74
|
-
|
|
75
|
-
|
|
118
|
+
return {
|
|
119
|
+
details: result,
|
|
120
|
+
value: result
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
members.call = (input) => recorded("call", require_structuredDocuments.AUTHOR_USE_TOOL_NAME, input, async () => {
|
|
76
124
|
check();
|
|
77
125
|
const parsed = require_structuredDocuments.parseUseAuthorToolInput(copy(input));
|
|
78
|
-
const result = await catalog.execute(parsed, run.signal);
|
|
126
|
+
const result = copy(await catalog.execute(parsed, run.signal));
|
|
79
127
|
check();
|
|
80
|
-
return
|
|
81
|
-
|
|
128
|
+
return {
|
|
129
|
+
details: result,
|
|
130
|
+
value: result.result
|
|
131
|
+
};
|
|
132
|
+
});
|
|
82
133
|
return members;
|
|
83
134
|
}
|
|
84
135
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["parseOpenAuthoringFileInput","parseDescribeAuthorToolsInput","parseUseAuthorToolInput","path","AUTHOR_ARTIFACT_PREFIX","DocumentRequestError","artifactRoot","fs","openArtifact","ArtifactAccessError","documentTooLarge","readArtifactBytes","constants","AUTHOR_ALIAS_PATTERN","AuthorBridgeError","path","defineApiRoutes","apiResponse","AuthorBridgeError","Hono","routes","parseUseAuthorToolInput","DocumentRequestError","RootBoundReplaceError","Hono","routes","getMimeType","digestOf","replaceRootBoundFile","parseStructuredDocument","preflightStructuredDocument","serializeStructuredDocument","createAuthorBridgeState","randomUUID","Hono","routes","defineRoot","ARTIFACTS_SERVICE","authorMinorMode","createAuthorCatalog","PO_CODEMODE_SERVICE","readPoCodemode","serverMinorModes","routes","AUTHOR_ALIAS_PATTERN","defineChannel","defineServerMethod","authorBridgeMethod","defineMethod","defineRoute","defineRoutedCommand","createAuthorCommand","defineHook","AUTHOR_GUIDANCE","defineResource","packageResourcePath","readPackageResource","defineResource","packageResourcePath","readPackageResource","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","channelAuthorWebmcp","methodBridge","composeRootHooks","apiRoute","commandAuthor","hookBeforeAgentStart","resourceCodemodeHowToAuthor","resourcePoUseAuthor","toolDescribeAuthorTools","toolOpenAuthoringFile","toolUseAuthorTools"],"sources":["../../src/services/webmcpNamespace/index.ts","../../src/types/webAuthor.ts","../../src/services/structuredDocuments/document.ts","../../src/services/authorCanvasRegistry/index.ts","../../src/types/apiRoutes.ts","../../src/types/authorApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorBridgeApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorDocumentApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorApi.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/services/webAuthorChannel/index.ts","../../src/extensions/(backend)/channel/author-webmcp.server.ts","../../src/services/authorBridgeMethod/index.ts","../../src/extensions/(backend)/method/bridge.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/author.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-author.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-use-author.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/describe-author-tools.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/open-authoring-file.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/use-author-tools.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\n\nimport {\n parseDescribeAuthorToolsInput,\n parseOpenAuthoringFileInput,\n parseUseAuthorToolInput,\n} from '../../schemas/authorTools';\nimport type { AuthorCatalog } from '../authorCatalog/type';\n\n// ponytail: typed per-canvas members need a synchronous catalog reader and a shared schema converter in po-core.\nconst DECLARATIONS = `interface AuthorViewportCatalogSnapshot {\n catalogToken: string;\n tools: { name: string; label: string; description: string; inputSchema: Readonly<Record<string, unknown>> }[];\n canvases?: { alias: string; path: string; status: 'opening' | 'ready' | 'unavailable' }[];\n alias?: string;\n path?: string;\n status?: 'opening' | 'ready' | 'unavailable';\n nextStep?: string;\n}\ndeclare const webmcp: {\n /** Open or reuse a canvas for a relative repository file or a session artifact. The returned alias is canonical; its catalog may still be opening. */\n open(input: { path: string; alias?: string }): Promise<{ path: string; byteLength: number; alias?: string; status?: 'opening' | 'ready' | 'unavailable'; reused?: boolean }>;\n /** Ready canvases, or one canvas's tools and its catalog token. */\n describe(input?: { alias?: string }): Promise<AuthorViewportCatalogSnapshot>;\n /** Call one tool with an explicit current token. Await same-canvas calls sequentially. */\n call(input: { alias?: string; catalogToken: string; name: string; arguments: Record<string, unknown> }): Promise<unknown>;\n};`;\n\nfunction copy<T>(value: T): T {\n return value === undefined ? value : JSON.parse(JSON.stringify(value));\n}\n\nexport function createWebmcpNamespace(\n catalog: AuthorCatalog,\n sessionId: string,\n assertAvailable: () => void,\n): PoCodemodeNamespace {\n return {\n name: 'webmcp',\n summary:\n 'Author canvas WebMCP: open a file as a canvas, describe its catalog, then call one tool with its explicit token. Await same-canvas calls sequentially; structured errors remain data.',\n declarations: DECLARATIONS,\n bind(run) {\n if (run.sessionId !== sessionId) throw new Error('Author WebMCP namespace belongs to another session.');\n let disposed = false;\n run.onDispose(() => {\n disposed = true;\n });\n const check = () => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('Author WebMCP run is disposed.');\n assertAvailable();\n };\n const members: Record<string, unknown> = Object.create(null);\n members.open = async (input: unknown) => {\n check();\n const { path, alias } = parseOpenAuthoringFileInput(copy(input));\n const result = await catalog.open(path, run.signal, alias);\n check();\n return copy(result);\n };\n members.describe = async (input?: unknown) => {\n check();\n const { alias } = parseDescribeAuthorToolsInput(copy(input === undefined ? {} : input));\n const result = await catalog.describe(run.signal, alias);\n check();\n return copy(result);\n };\n members.call = async (input: unknown) => {\n check();\n const parsed = parseUseAuthorToolInput(copy(input));\n const result = await catalog.execute(parsed, run.signal);\n check();\n return copy(result.result);\n };\n return members;\n },\n };\n}\n","import type { AuthorViewportCapabilityDescriptor } from './author';\n\nexport const authorChannelType = 'author_webmcp';\n\nexport interface AuthorRegisterMessage {\n alias: string;\n kind: 'register';\n generation: number;\n}\n\nexport interface AuthorReleaseMessage {\n alias: string;\n kind: 'release';\n generation: number;\n}\nexport interface AuthorCatalogMessage {\n alias: string;\n kind: 'catalog';\n generation: number;\n ownerToken: string;\n tools: AuthorViewportCapabilityDescriptor[];\n}\n\nexport interface AuthorResultMessage {\n alias: string;\n kind: 'result';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n result: unknown;\n}\n\nexport interface AuthorCancelledMessage {\n alias: string;\n kind: 'cancelled';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport type AuthorBrowserMessage =\n | AuthorRegisterMessage\n | AuthorReleaseMessage\n | AuthorCatalogMessage\n | AuthorResultMessage\n | AuthorCancelledMessage;\n\nexport interface AuthorAcceptedMessage {\n alias?: string;\n kind: 'accepted';\n generation: number;\n ownerToken: string;\n catalogToken?: string;\n leaseMs: number;\n}\n\nexport interface AuthorRequestMessage {\n alias?: string;\n kind: 'request';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface AuthorCancelMessage {\n alias?: string;\n kind: 'cancel';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport interface AuthorRejectedMessage {\n alias?: string;\n kind: 'rejected';\n reason: string;\n}\n\n/** Direct-event frame carrying a session's open canvases from the API to the channel. */\nexport const authorCanvasesFrame = 'author_canvases';\n\n/** Open canvases a conversation keeps; opening one more closes the least recently opened. */\nexport const AUTHOR_MAX_CANVASES = 32;\n\nexport interface AuthorOpenCanvas {\n alias: string;\n path: string;\n}\n\n/** Every canvas the server still has open, oldest first. Browsers keep one tab per entry. */\nexport interface AuthorCanvasesMessage {\n kind: 'canvases';\n canvases: AuthorOpenCanvas[];\n}\n\nexport type AuthorHubMessage =\n | AuthorAcceptedMessage\n | AuthorRequestMessage\n | AuthorCancelMessage\n | AuthorRejectedMessage\n | AuthorCanvasesMessage;\n\nexport interface AuthorWebView {\n activation: 'inactive' | 'active';\n capabilityCount: number;\n}\n","import { constants } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport {\n ArtifactAccessError,\n artifactRoot,\n openArtifact,\n readArtifactBytes,\n} from '@agimon-ai/po-artifact/artifactFiles';\n\nimport { AUTHOR_ARTIFACT_PREFIX } from '../../constants/author';\nimport { DocumentRequestError, documentTooLarge } from './common';\n\nexport const AUTHOR_DOCUMENT_MAX_BYTES = 25 * 1024 * 1024;\n\n/**\n * Where a requested document lives. `path` is the canonical form clients use;\n * `realPath` identifies the file so two spellings share one canvas.\n */\nexport type AuthorDocumentSource =\n | { kind: 'workspace'; path: string; realPath: string; root: string }\n | { kind: 'artifact'; path: string; realPath: string; root: string; relative: string };\n\nfunction inside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);\n}\n\n/**\n * The session artifact folder is the one place outside the working tree Author\n * may read. It is named either `artifact:<relative>` or by the absolute path the\n * agent's prompt gives; po-artifact's guarded open does the containment checks.\n */\nasync function resolveArtifact(\n requestedPath: string,\n sessionId: string | undefined,\n environment: Readonly<Record<string, string | undefined>> | undefined,\n) {\n const prefixed = requestedPath.startsWith(AUTHOR_ARTIFACT_PREFIX);\n if (sessionId === undefined || environment === undefined) {\n if (prefixed) throw new DocumentRequestError('Artifacts need a session.', 400);\n return undefined;\n }\n const root = artifactRoot(sessionId, environment);\n if (prefixed) return { root, relative: requestedPath.slice(AUTHOR_ARTIFACT_PREFIX.length) };\n if (!path.isAbsolute(requestedPath)) return undefined;\n const realRoot = await fs.realpath(root).catch(() => root);\n const base = [root, realRoot].find((candidate) => inside(candidate, requestedPath));\n if (base === undefined) return undefined;\n return { root, relative: path.relative(base, requestedPath).split(path.sep).join('/') };\n}\n\nexport async function resolveDocument(\n cwd: string,\n requestedPath: unknown,\n sessionId?: string,\n environment?: Readonly<Record<string, string | undefined>>,\n): Promise<AuthorDocumentSource> {\n if (typeof requestedPath !== 'string' || requestedPath.length === 0 || requestedPath.includes('\\0'))\n throw new Error('A relative document path is required.');\n const artifact = await resolveArtifact(requestedPath, sessionId, environment);\n if (artifact !== undefined) {\n const realRoot = await fs.realpath(artifact.root).catch(() => artifact.root);\n return {\n kind: 'artifact',\n path: `${AUTHOR_ARTIFACT_PREFIX}${artifact.relative}`,\n realPath: path.join(realRoot, artifact.relative),\n ...artifact,\n };\n }\n if (path.isAbsolute(requestedPath))\n throw new Error('A relative document path, or a file in the session artifact folder, is required.');\n const root = await fs.realpath(cwd);\n const candidate = path.resolve(root, requestedPath);\n if (candidate !== root && !candidate.startsWith(`${root}${path.sep}`))\n throw new DocumentRequestError('Document path is outside the working directory.', 403);\n const realCandidate = await fs.realpath(candidate);\n if (realCandidate !== root && !realCandidate.startsWith(`${root}${path.sep}`)) {\n throw new DocumentRequestError('Document path is outside the working directory.', 403);\n }\n // A session may store artifacts inside its cwd. Relative spellings must not turn them into writable workspace files.\n const containedArtifact = await resolveArtifact(realCandidate, sessionId, environment);\n if (containedArtifact !== undefined) {\n return {\n kind: 'artifact',\n path: `${AUTHOR_ARTIFACT_PREFIX}${containedArtifact.relative}`,\n realPath: realCandidate,\n ...containedArtifact,\n };\n }\n return {\n kind: 'workspace',\n root,\n path: path.relative(root, realCandidate).split(path.sep).join('/'),\n realPath: realCandidate,\n };\n}\n\nasync function readArtifact(\n root: string,\n relative: string,\n workflowVisible?: ArtifactWorkflowVisibility,\n): Promise<Uint8Array> {\n let file: Awaited<ReturnType<typeof openArtifact>>;\n try {\n file = await openArtifact(root, relative, workflowVisible);\n } catch (error) {\n if (error instanceof ArtifactAccessError) throw new DocumentRequestError(error.message, error.status);\n throw error;\n }\n try {\n if (file.stat.size > AUTHOR_DOCUMENT_MAX_BYTES)\n throw documentTooLarge(`Document exceeds the ${AUTHOR_DOCUMENT_MAX_BYTES} byte preview limit.`);\n return await readArtifactBytes(file.handle, file.stat.size);\n } finally {\n await file.handle.close();\n }\n}\n\nexport async function readSource(\n source: AuthorDocumentSource,\n workflowVisible?: ArtifactWorkflowVisibility,\n): Promise<Uint8Array> {\n if (source.kind === 'artifact') return await readArtifact(source.root, source.relative, workflowVisible);\n if (process.platform !== 'darwin' && process.platform !== 'linux')\n throw new DocumentRequestError('Secure document reads require macOS or Linux.', 403);\n // Darwin O_NOFOLLOW_ANY atomically rejects symlinks in every component.\n // Linux validates the opened descriptor's actual path, not a mutable path lookup.\n const noFollow = process.platform === 'darwin' ? 0x20000000 : constants.O_NOFOLLOW;\n const handle = await fs.open(source.realPath, constants.O_RDONLY | constants.O_NONBLOCK | noFollow);\n try {\n const stat = await handle.stat();\n const current = await fs.lstat(source.realPath);\n const realPath = await fs.realpath(process.platform === 'linux' ? `/proc/self/fd/${handle.fd}` : source.realPath);\n if (\n !stat.isFile() ||\n !current.isFile() ||\n stat.dev !== current.dev ||\n stat.ino !== current.ino ||\n !inside(source.root, realPath)\n )\n throw new DocumentRequestError('The document changed or is outside the working directory.', 403);\n if (stat.size > AUTHOR_DOCUMENT_MAX_BYTES)\n throw documentTooLarge(`Document exceeds the ${AUTHOR_DOCUMENT_MAX_BYTES} byte preview limit.`);\n return await readArtifactBytes(handle, stat.size);\n } finally {\n await handle.close();\n }\n}\n\nexport async function readDocument(\n cwd: string,\n requestedPath: unknown,\n sessionId?: string,\n environment?: Readonly<Record<string, string | undefined>>,\n workflowVisible?: ArtifactWorkflowVisibility,\n): Promise<Uint8Array> {\n return await readSource(await resolveDocument(cwd, requestedPath, sessionId, environment), workflowVisible);\n}\n","import path from 'node:path';\n\nimport type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\n\nimport { AuthorBridgeError, type AuthorBridgeState } from '../../models/authorBridgeState';\nimport { AUTHOR_ALIAS_PATTERN } from '../../schemas/authorTools';\nimport type {\n AuthorCanvasView,\n AuthorOpenFileResult,\n AuthorViewportCatalogSnapshot,\n UseAuthorToolInput,\n} from '../../types/author';\nimport { AUTHOR_MAX_CANVASES, type AuthorOpenCanvas } from '../../types/webAuthor';\nimport { readSource, resolveDocument } from '../structuredDocuments/document';\n\ninterface Canvas {\n alias: string;\n path: string;\n realPath: string;\n bridge: AuthorBridgeState;\n closed: boolean;\n readyOnce: boolean;\n}\n\nexport function createAuthorCanvasRegistry(\n cwd: string,\n createBridge: () => AuthorBridgeState,\n /** Admits the session's artifact folder beside the working tree. */\n sessionId?: string,\n environment?: Readonly<Record<string, string | undefined>>,\n workflowVisible?: ArtifactWorkflowVisibility,\n) {\n // Insertion order is recency order: a successful open moves its canvas to the end.\n const byAlias = new Map<string, Canvas>();\n const byPath = new Map<string, Canvas>();\n // ponytail: grows by one alias per eviction for the session's lifetime; cap it if sessions churn thousands of files.\n const retired = new Map<string, string>();\n const listeners = new Set<() => void>();\n const changed = () => {\n for (const listener of listeners) listener();\n };\n\n const select = (alias?: string): Canvas => {\n if (alias !== undefined) {\n if (!AUTHOR_ALIAS_PATTERN.test(alias)) throw new AuthorBridgeError('Invalid Author canvas alias.', 400);\n const canvas = byAlias.get(alias);\n const retiredPath = retired.get(alias);\n if (canvas === undefined && retiredPath !== undefined)\n throw new AuthorBridgeError(\n `Author canvas '${alias}' was closed to make room for newer canvases. Reopen ${retiredPath} with open_authoring_file.`,\n 404,\n );\n if (canvas === undefined)\n throw new AuthorBridgeError(\n `Unknown Author canvas '${alias}'. Call describe_author_tools({}) for available aliases.`,\n 404,\n );\n return canvas;\n }\n const canvases = [...byAlias.values()].filter((canvas) => !canvas.closed);\n if (canvases.length !== 1)\n throw new AuthorBridgeError('Specify a canvas alias. Call describe_author_tools({}) to list canvases.', 409);\n return canvases[0]!;\n };\n\n const view = (canvas: Canvas): AuthorCanvasView => {\n if (canvas.closed) return { alias: canvas.alias, path: canvas.path, status: 'unavailable' };\n try {\n canvas.bridge.describe();\n canvas.readyOnce = true;\n return { alias: canvas.alias, path: canvas.path, status: 'ready' };\n } catch {\n return { alias: canvas.alias, path: canvas.path, status: canvas.readyOnce ? 'unavailable' : 'opening' };\n }\n };\n\n return {\n async open(requestedPath: string, signal?: AbortSignal, requestedAlias?: string): Promise<AuthorOpenFileResult> {\n signal?.throwIfAborted();\n if (requestedAlias !== undefined && !AUTHOR_ALIAS_PATTERN.test(requestedAlias))\n throw new AuthorBridgeError('Invalid Author canvas alias.', 400);\n const source = await resolveDocument(cwd, requestedPath, sessionId, environment);\n const bytes = await readSource(source, workflowVisible);\n signal?.throwIfAborted();\n const { realPath, path: canonicalPath } = source;\n const occupied = requestedAlias === undefined ? undefined : byAlias.get(requestedAlias);\n if (occupied !== undefined && occupied.realPath !== realPath)\n throw new AuthorBridgeError(`Author canvas alias '${requestedAlias}' already names ${occupied.path}.`, 409);\n const existing = byPath.get(realPath);\n if (existing !== undefined) {\n if (existing.closed) existing.readyOnce = false;\n existing.closed = false;\n byAlias.delete(existing.alias);\n byAlias.set(existing.alias, existing);\n changed();\n return {\n path: existing.path,\n byteLength: bytes.byteLength,\n alias: existing.alias,\n status: view(existing).status,\n reused: true,\n };\n }\n if (byAlias.size >= AUTHOR_MAX_CANVASES) {\n const values = [...byAlias.values()];\n const reclaimed = values.find((canvas) => canvas.closed);\n const evicted = reclaimed ?? values[0]!;\n evicted.bridge.close();\n byAlias.delete(evicted.alias);\n byPath.delete(evicted.realPath);\n if (reclaimed === undefined) retired.set(evicted.alias, evicted.path);\n }\n const base =\n path\n .basename(realPath)\n .replace(/\\.[^.]*$/u, '')\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/gu, '-')\n .replace(/^[^a-z]+/u, 'canvas-')\n .slice(0, 48) || 'canvas';\n // An evicted file gets its old name back so the agent's alias keeps working.\n const revived = [...retired].find(([, retiredPath]) => retiredPath === canonicalPath)?.[0];\n if (revived !== undefined) retired.delete(revived);\n if (requestedAlias !== undefined) retired.delete(requestedAlias);\n let alias = requestedAlias ?? revived ?? base;\n for (let suffix = 2; byAlias.has(alias) || retired.has(alias); suffix++) alias = `${base.slice(0, 56)}-${suffix}`;\n const canvas: Canvas = {\n alias,\n path: canonicalPath,\n realPath,\n bridge: createBridge(),\n closed: false,\n readyOnce: false,\n };\n byAlias.set(alias, canvas);\n byPath.set(realPath, canvas);\n changed();\n return { path: canonicalPath, byteLength: bytes.byteLength, alias, status: 'opening', reused: false };\n },\n describe(alias?: string): AuthorViewportCatalogSnapshot {\n const canvases = [...byAlias.values()].map(view);\n const target =\n alias === undefined && canvases.filter((canvas) => canvas.status !== 'unavailable').length !== 1\n ? undefined\n : select(alias);\n if (target === undefined) {\n return {\n catalogToken: '',\n tools: [],\n canvases,\n nextStep: 'Open a file with open_authoring_file, then describe_author_tools({\"alias\":\"canvas-name\"}).',\n };\n }\n const status = view(target).status;\n const base = { alias: target.alias, path: target.path, status, canvases };\n if (status !== 'ready') {\n return {\n ...base,\n catalogToken: '',\n tools: [],\n nextStep:\n status === 'opening'\n ? `Wait for ${target.alias} to be ready, then call describe_author_tools({\"alias\":\"${target.alias}\"}).`\n : `Reopen ${target.path} with open_authoring_file({\"path\":\"${target.path}\",\"alias\":\"${target.alias}\"}).`,\n };\n }\n return { ...base, ...target.bridge.describe() };\n },\n invoke(input: UseAuthorToolInput, signal?: AbortSignal) {\n const target = select(input.alias);\n if (target.closed) throw new AuthorBridgeError(`Canvas '${target.alias}' is closed. Reopen its file.`, 503);\n return target.bridge.invoke(input, signal).then((result) => ({ ...result, alias: target.alias }));\n },\n bridge(alias: string): AuthorBridgeState {\n const canvas = select(alias);\n if (canvas.closed) throw new AuthorBridgeError(`Canvas '${alias}' is closed. Reopen its file.`, 503);\n return canvas.bridge;\n },\n close(alias: string): void {\n if (!byAlias.has(alias) && retired.has(alias)) return;\n const canvas = select(alias);\n canvas.closed = true;\n canvas.bridge.close();\n canvas.bridge = createBridge();\n changed();\n },\n /** Canvases still open, oldest first; a canvas whose browser disconnected still counts. */\n openCanvases(): AuthorOpenCanvas[] {\n return [...byAlias.values()]\n .filter((canvas) => !canvas.closed)\n .map((canvas) => ({ alias: canvas.alias, path: canvas.path }));\n },\n onChange(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n dispose(): void {\n for (const canvas of byAlias.values()) canvas.bridge.close();\n byAlias.clear();\n byPath.clear();\n },\n };\n}\n\nexport type AuthorCanvasRegistry = ReturnType<typeof createAuthorCanvasRegistry>;\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { AuthorOpenFileResult } from './author';\nimport type { AuthorSessionView } from './authorApi';\nimport type { DocumentPreflightReport, ParsedStructuredDocument } from './structuredDocuments';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/author/`, so the mount is\n * stated once, by the folder that creates it. The browser used to restate it:\n * `authorStateUrl` built one URL from `API_BASE_PATH` and the document helper\n * two files away spelled `author` out again as a literal, so the two could\n * disagree and nothing would say so.\n *\n * The order below is the order the three Hono apps register in: `/state` in\n * `authorApi`, the eight bridge routes in `authorBridgeApi`, the three document\n * routes in `authorDocumentApi`. A reviewer can read the two side by side.\n *\n * Response types are named only where a caller reads the body. The bridge\n * routes are called by the hub's author channel over `requestSessionApi`, which\n * has its own message vocabulary and never sees this client.\n */\nexport default defineApiRoutes({\n state: {\n method: 'GET',\n path: '/state',\n response: apiResponse<AuthorSessionView>(),\n },\n bridgeRegister: {\n method: 'POST',\n path: '/bridge/register',\n },\n bridgeCatalog: {\n method: 'POST',\n path: '/bridge/catalog',\n },\n /** Long-polls for the next capability request, so it settles when one arrives. */\n bridgeNext: {\n method: 'POST',\n path: '/bridge/next',\n },\n bridgeResult: {\n method: 'POST',\n path: '/bridge/result',\n },\n bridgeCancelled: {\n method: 'POST',\n path: '/bridge/cancelled',\n },\n bridgeDisconnect: {\n method: 'POST',\n path: '/bridge/disconnect',\n },\n bridgeClose: {\n method: 'POST',\n path: '/bridge/close',\n },\n bridgeDescribe: {\n method: 'GET',\n path: '/bridge/describe',\n query: ['alias'],\n },\n bridgeInvoke: {\n method: 'POST',\n path: '/bridge/invoke',\n },\n /**\n * Parses one structured document.\n *\n * Answers a byte-length summary instead when the request names no format,\n * which is the agent-side tool path; the page always names one.\n */\n documentsOpen: {\n method: 'POST',\n path: '/documents/open',\n query: ['session'],\n response: apiResponse<ParsedStructuredDocument | AuthorOpenFileResult>(),\n },\n documentsPreflight: {\n method: 'POST',\n path: '/documents/preflight',\n query: ['session'],\n response: apiResponse<DocumentPreflightReport>(),\n },\n documentsSerialize: {\n method: 'POST',\n path: '/documents/serialize',\n query: ['session'],\n response: apiResponse<{ bytes: string; encoding: string }>(),\n },\n /** Exact source bytes and conditional replacement, scoped to this Author session. */\n file: {\n method: 'GET',\n path: '/file',\n query: ['path'],\n raw: true,\n },\n fileWrite: {\n method: 'PUT',\n path: '/file',\n query: ['path'],\n raw: true,\n },\n});\n","import type { AuthorModeActivation } from './author';\n\n/**\n * The wire vocabulary this package's API shares with whatever calls it.\n *\n * Paths live in `./apiRoutes`, which the Hono apps register from and the\n * generated client addresses, so neither half can move alone. What stays here\n * is the mount segment the server registers under and the shape the state\n * route answers with.\n */\n\n/** Where a host mounts this package's API; the segment after /api/plugins/. */\nexport const API_BASE_PATH = 'author';\n\n/** Query parameter naming the session a document request belongs to. */\nexport const SESSION_QUERY_PARAM = 'session';\n\nexport interface AuthorSessionView {\n sessionId: string | null;\n activation: AuthorModeActivation;\n capabilityCount: number;\n}\n","import { Hono } from 'hono';\n\nimport { AuthorBridgeError } from '../../../../../../../models/authorBridgeState';\nimport { parseUseAuthorToolInput } from '../../../../../../../schemas/authorTools';\nimport type { AuthorCanvasRegistry } from '../../../../../../../services/authorCanvasRegistry';\nimport routes from '../../../../../../../types/apiRoutes';\nimport type { AuthorViewportCapabilityDescriptor } from '../../../../../../../types/author';\n\nfunction record(value: unknown): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n throw new AuthorBridgeError('Invalid request.', 400);\n return value as Record<string, unknown>;\n}\n\nfunction text(value: unknown, key: string): string {\n const result = record(value)[key];\n if (typeof result !== 'string' || result === '') throw new AuthorBridgeError(`Invalid ${key}.`, 400);\n return result;\n}\n\nfunction generation(value: unknown): number {\n const result = record(value).generation;\n if (!Number.isSafeInteger(result) || (result as number) < 0) throw new AuthorBridgeError('Invalid generation.', 400);\n return result as number;\n}\n\nasync function body(request: Request): Promise<Record<string, unknown>> {\n return record(await request.json());\n}\n\nexport function createAuthorBridgeApi(registry: AuthorCanvasRegistry): Hono {\n const app = new Hono();\n app.onError((error, context) =>\n context.json(\n { error: error instanceof Error ? error.message : String(error) },\n error instanceof AuthorBridgeError ? error.status : 500,\n ),\n );\n app.post(routes.bridgeRegister.path, async (context) => {\n const value = await body(context.req.raw);\n const alias = text(value, 'alias');\n return context.json({ ...registry.bridge(alias).register(text(value, 'bindingId'), generation(value)), alias });\n });\n app.post(routes.bridgeCatalog.path, async (context) => {\n const value = await body(context.req.raw);\n const tools = value.tools;\n if (!Array.isArray(tools)) throw new AuthorBridgeError('Invalid Author catalog.', 400);\n const alias = text(value, 'alias');\n return context.json({\n ...registry\n .bridge(alias)\n .catalog(\n text(value, 'bindingId'),\n generation(value),\n text(value, 'ownerToken'),\n tools as AuthorViewportCapabilityDescriptor[],\n ),\n alias,\n });\n });\n app.post(routes.bridgeNext.path, async (context) => {\n const value = await body(context.req.raw);\n const alias = text(value, 'alias');\n return context.json({\n ...(await registry\n .bridge(alias)\n .next(text(value, 'bindingId'), generation(value), text(value, 'ownerToken'), context.req.raw.signal)),\n alias,\n });\n });\n app.post(routes.bridgeResult.path, async (context) => {\n const value = await body(context.req.raw);\n registry\n .bridge(text(value, 'alias'))\n .result(\n text(value, 'bindingId'),\n generation(value),\n text(value, 'ownerToken'),\n text(value, 'catalogToken'),\n text(value, 'requestId'),\n value.result,\n );\n return context.json({ accepted: true });\n });\n app.post(routes.bridgeCancelled.path, async (context) => {\n const value = await body(context.req.raw);\n registry\n .bridge(text(value, 'alias'))\n .cancelled(\n text(value, 'bindingId'),\n generation(value),\n text(value, 'ownerToken'),\n text(value, 'catalogToken'),\n text(value, 'requestId'),\n );\n return context.json({ accepted: true });\n });\n app.post(routes.bridgeDisconnect.path, async (context) => {\n const value = await body(context.req.raw);\n registry.bridge(text(value, 'alias')).disconnect(text(value, 'bindingId'), generation(value));\n return context.json({ accepted: true });\n });\n app.post(routes.bridgeClose.path, async (context) => {\n const value = await body(context.req.raw);\n registry.close(text(value, 'alias'));\n return context.json({ accepted: true });\n });\n app.get(routes.bridgeDescribe.path, (context) => context.json(registry.describe(context.req.query('alias'))));\n app.post(routes.bridgeInvoke.path, async (context) => {\n const value = parseUseAuthorToolInput(await context.req.raw.json());\n return context.json(await registry.invoke(value, context.req.raw.signal));\n });\n return app;\n}\n","import type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport { replaceRootBoundFile, RootBoundReplaceError } from '@agimon-ai/po-core/platform';\nimport { Hono } from 'hono';\nimport { getMimeType } from 'hono/utils/mime';\n\nimport {\n parseStructuredDocument,\n preflightStructuredDocument,\n serializeStructuredDocument,\n} from '../../../../../../../services/structuredDocuments';\nimport { digestOf, DocumentRequestError } from '../../../../../../../services/structuredDocuments/common';\nimport {\n AUTHOR_DOCUMENT_MAX_BYTES,\n readDocument,\n readSource,\n resolveDocument,\n} from '../../../../../../../services/structuredDocuments/document';\nimport routes from '../../../../../../../types/apiRoutes';\nimport type { AuthorOpenFileResult } from '../../../../../../../types/author';\nimport type {\n CsvDialect,\n DocumentOperation,\n StructuredDocumentFormat,\n} from '../../../../../../../types/structuredDocuments';\n\nexport { AUTHOR_DOCUMENT_MAX_BYTES } from '../../../../../../../services/structuredDocuments/document';\n\ninterface DocumentRequest {\n path?: unknown;\n alias?: unknown;\n format?: unknown;\n operations?: unknown;\n preflightDigest?: unknown;\n csvDialect?: unknown;\n}\n\nexport interface AuthorDocumentApiOptions {\n cwd?: string;\n /** Admits the session's artifact folder beside the working tree. */\n sessionId?: string;\n environment?: Readonly<Record<string, string | undefined>>;\n workflowVisible?: ArtifactWorkflowVisibility;\n open?: (path: string, signal?: AbortSignal, alias?: string) => Promise<AuthorOpenFileResult>;\n}\n\nconst FORMATS = new Set<StructuredDocumentFormat>(['markdown-slides', 'csv', 'pptx', 'xlsx']);\n\nfunction errorResponse(\n context: { json: (value: unknown, status: 400 | 403 | 404 | 409 | 413 | 422 | 500) => Response },\n error: unknown,\n): Response {\n const message = error instanceof Error ? error.message : 'Document operation failed.';\n // A refusal names its own status; anything else is a request the document cannot satisfy.\n return context.json(\n { error: message },\n error instanceof DocumentRequestError || error instanceof RootBoundReplaceError ? error.status : 422,\n );\n}\n\nfunction requestFormat(value: unknown): StructuredDocumentFormat {\n if (typeof value !== 'string' || !FORMATS.has(value as StructuredDocumentFormat))\n throw new Error('A supported format is required.');\n return value as StructuredDocumentFormat;\n}\n\nfunction requestOperations(value: unknown): DocumentOperation[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.length > 100_000) throw new Error('A bounded operations array is required.');\n return value.map((operation) => {\n if (\n typeof operation !== 'object' ||\n operation === null ||\n typeof (operation as Record<string, unknown>).fragmentId !== 'string' ||\n typeof (operation as Record<string, unknown>).replacement !== 'string'\n ) {\n throw new Error('Each operation requires string fragmentId and replacement fields.');\n }\n return operation as DocumentOperation;\n });\n}\n\nasync function bodyOf(request: Request): Promise<DocumentRequest> {\n const body = (await request.json()) as unknown;\n if (typeof body !== 'object' || body === null || Array.isArray(body)) throw new Error('A JSON object is required.');\n return body as DocumentRequest;\n}\n\nexport function createAuthorDocumentApi(options: AuthorDocumentApiOptions = {}): Hono {\n const app = new Hono();\n const admittedCwd = (): string => {\n if (options.cwd === undefined)\n throw new DocumentRequestError('Author requires the session working directory.', 403);\n return options.cwd;\n };\n\n app.get(routes.file.path, async (context) => {\n try {\n const source = await resolveDocument(\n admittedCwd(),\n context.req.query('path'),\n options.sessionId,\n options.environment,\n );\n const bytes = await readSource(source, options.workflowVisible);\n return new Response(bytes as Uint8Array<ArrayBuffer>, {\n headers: {\n 'Content-Type': getMimeType(source.path) ?? 'application/octet-stream',\n 'Content-Length': String(bytes.byteLength),\n 'X-File-SHA256': digestOf(bytes),\n 'Cache-Control': 'no-store',\n },\n });\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.put(routes.fileWrite.path, async (context) => {\n try {\n const requested = context.req.query('path');\n const source = await resolveDocument(admittedCwd(), requested, options.sessionId, options.environment);\n if (source.kind === 'artifact') throw new DocumentRequestError('Artifacts are read-only.', 403);\n const expectedSha256 = context.req.header('X-Expected-SHA256');\n if (expectedSha256 === undefined || !/^[a-f0-9]{64}$/.test(expectedSha256))\n throw new DocumentRequestError('X-Expected-SHA256 is required.', 400);\n const chunks: Uint8Array[] = [];\n let length = 0;\n const reader = context.req.raw.body?.getReader();\n if (reader !== undefined) {\n try {\n while (true) {\n const part = await reader.read();\n if (part.done) break;\n length += part.value.byteLength;\n if (length > AUTHOR_DOCUMENT_MAX_BYTES) {\n await reader.cancel();\n throw new DocumentRequestError('File exceeds the save limit.', 413);\n }\n chunks.push(part.value);\n }\n } finally {\n reader.releaseLock();\n }\n }\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n const sha256 = await replaceRootBoundFile({\n root: source.root,\n relativePath: requested!,\n expectedSha256,\n bytes,\n maxBytes: AUTHOR_DOCUMENT_MAX_BYTES,\n signal: context.req.raw.signal,\n });\n return new Response(null, { status: 204, headers: { 'X-File-SHA256': sha256 } });\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.post(routes.documentsOpen.path, async (context) => {\n try {\n const body = await bodyOf(context.req.raw);\n if (body.format === undefined && options.open !== undefined) {\n return context.json(\n await options.open(body.path as string, context.req.raw.signal, body.alias as string | undefined),\n );\n }\n const bytes = await readDocument(\n admittedCwd(),\n body.path,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n if (body.format === undefined) {\n return context.json({ path: body.path as string, byteLength: bytes.byteLength } satisfies AuthorOpenFileResult);\n }\n return context.json(\n await parseStructuredDocument(requestFormat(body.format), bytes, body.csvDialect as Partial<CsvDialect>),\n );\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.post(routes.documentsPreflight.path, async (context) => {\n try {\n const body = await bodyOf(context.req.raw);\n const bytes = await readDocument(\n admittedCwd(),\n body.path,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n return context.json(\n await preflightStructuredDocument(\n requestFormat(body.format),\n bytes,\n requestOperations(body.operations),\n body.csvDialect as Partial<CsvDialect>,\n ),\n );\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.post(routes.documentsSerialize.path, async (context) => {\n try {\n const body = await bodyOf(context.req.raw);\n if (typeof body.preflightDigest !== 'string') throw new Error('A preflight report digest is required.');\n const bytes = await readDocument(\n admittedCwd(),\n body.path,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n const serialized = await serializeStructuredDocument(\n requestFormat(body.format),\n bytes,\n requestOperations(body.operations),\n body.preflightDigest,\n body.csvDialect as Partial<CsvDialect>,\n );\n return context.json({\n bytes: Buffer.from(serialized.bytes).toString('base64'),\n encoding: 'base64',\n manifest: serialized.manifest,\n operationLog: serialized.operationLog,\n });\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n return app;\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport type { PoApi, PoApiContext, PoApiHandler } from '@agimon-ai/po-core/packageApi';\nimport { Hono } from 'hono';\n\nimport { createAuthorBridgeState, type AuthorBridgeState } from '../../../../../../../models/authorBridgeState';\nimport {\n createAuthorCanvasRegistry,\n type AuthorCanvasRegistry,\n} from '../../../../../../../services/authorCanvasRegistry';\nimport type { AuthorCatalog } from '../../../../../../../services/authorCatalog/type';\nimport routes from '../../../../../../../types/apiRoutes';\nimport { API_BASE_PATH, type AuthorSessionView } from '../../../../../../../types/authorApi';\nimport type { AuthorOpenCanvas } from '../../../../../../../types/webAuthor';\nimport { createAuthorBridgeApi } from './authorBridgeApi';\nimport { createAuthorDocumentApi } from './authorDocumentApi';\n\nexport interface AuthorApiOptions {\n sessionId?: string;\n cwd?: string;\n environment?: Readonly<Record<string, string | undefined>>;\n workflowVisible?: ArtifactWorkflowVisibility;\n readState?: () => Omit<AuthorSessionView, 'sessionId'>;\n registry?: AuthorCanvasRegistry;\n}\n\nconst inactiveState = (): Omit<AuthorSessionView, 'sessionId'> => ({ activation: 'inactive', capabilityCount: 0 });\nconst createBridge = (): AuthorBridgeState =>\n createAuthorBridgeState({\n now: Date.now,\n issueToken: randomUUID,\n scheduleTimeout(callback, delayMs) {\n const timer = setTimeout(callback, delayMs);\n timer.unref?.();\n return () => clearTimeout(timer);\n },\n });\n\nexport function createAuthorApi(options: AuthorApiOptions = {}): Hono {\n if (options.cwd === undefined) throw new Error('Author requires the session working directory.');\n const app = new Hono();\n const registry =\n options.registry ??\n createAuthorCanvasRegistry(\n options.cwd,\n createBridge,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n app.get(routes.state.path, (context) =>\n context.json({\n sessionId: options.sessionId ?? null,\n ...(options.readState ?? inactiveState)(),\n } satisfies AuthorSessionView),\n );\n app.route('/', createAuthorBridgeApi(registry));\n app.route(\n '/',\n createAuthorDocumentApi({\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n ...(options.sessionId === undefined ? {} : { sessionId: options.sessionId }),\n ...(options.environment === undefined ? {} : { environment: options.environment }),\n workflowVisible: options.workflowVisible,\n open: (path, signal, alias) => registry.open(path, signal, alias),\n }),\n );\n return app;\n}\n\nexport const api: PoApi = {\n basePath: API_BASE_PATH,\n start(context: PoApiContext): PoApiHandler {\n // One server hosts many sessions, so its own directory is never a session's project.\n if (context.cwd === undefined) throw new Error('Author requires the session working directory.');\n const registry = createAuthorCanvasRegistry(context.cwd, createBridge, context.sessionId, context.environment);\n const app = createAuthorApi({\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n cwd: context.cwd,\n ...(context.environment === undefined ? {} : { environment: context.environment }),\n registry,\n });\n return { fetch: (request) => app.fetch(request), close: () => registry.dispose() };\n },\n};\n\n/** The session API and tools share the same browser ownership and pending requests. */\nexport function createAuthorSessionApi(\n cwd: string,\n sessionId: string,\n environment: Readonly<Record<string, string | undefined>>,\n /** Receives every change to the open canvases, and the empty list at start. */\n publishCanvases?: (canvases: AuthorOpenCanvas[]) => void,\n workflowVisible?: ArtifactWorkflowVisibility,\n): { api: PoApi; catalog: AuthorCatalog } {\n const registry = createAuthorCanvasRegistry(cwd, createBridge, sessionId, environment, workflowVisible);\n if (publishCanvases !== undefined) {\n registry.onChange(() => publishCanvases(registry.openCanvases()));\n publishCanvases([]);\n }\n return {\n catalog: {\n open: (path, signal, alias) => registry.open(path, signal, alias),\n async describe(signal, alias) {\n signal?.throwIfAborted();\n return registry.describe(alias);\n },\n execute: (input, signal) => registry.invoke(input, signal),\n },\n api: {\n basePath: API_BASE_PATH,\n start() {\n const app = createAuthorApi({ cwd, sessionId, environment, registry, workflowVisible });\n return { fetch: (request) => app.fetch(request), close: () => registry.dispose() };\n },\n },\n };\n}\n","import { ARTIFACTS_SERVICE, type ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport { PO_CODEMODE_SERVICE, readPoCodemode } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport { serverMinorModes } from '@agimon-ai/po-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { authorMinorMode } from '../../../../models/authorMode';\nimport { createAuthorCatalog } from '../../../../services/authorCatalog';\nimport { createWebmcpNamespace } from '../../../../services/webmcpNamespace';\nimport { authorCanvasesFrame } from '../../../../types/webAuthor';\nimport { api, createAuthorSessionApi } from './api/author/_lib/authorApi';\n\nexport default defineRoot(({ agent, host, context, signal }: PoServerPluginContext) => {\n const { environment, directEvents } = host.context;\n if (agent && environment === undefined) throw new Error('Author requires an admitted session environment.');\n const workflowVisible: ArtifactWorkflowVisibility = (relativePath, kind) =>\n !signal.aborted && context.get(ARTIFACTS_SERVICE)?.workflowVisible(relativePath, kind) === true;\n const cwd = agent?.context.cwd ?? host.context.cwd;\n const sessionId = agent?.context.sessionId ?? host.context.sessionId;\n const session =\n cwd && sessionId && environment\n ? createAuthorSessionApi(\n cwd,\n sessionId,\n environment,\n (canvases) => directEvents?.publish(authorCanvasesFrame, sessionId, { canvases }),\n workflowVisible,\n )\n : undefined;\n const isActive = () => (agent?.context.selection.state?.['minor-mode'] ?? []).includes(authorMinorMode.descriptor.id);\n const mode = agent\n ? authorMinorMode.createOwner({\n isActive,\n detail: () => 'document authoring available',\n async setActive(enabled) {\n const modes = (agent.context.selection.state?.['minor-mode'] ?? []).filter(\n (id) => id !== authorMinorMode.descriptor.id,\n );\n await agent.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: enabled ? [...modes, authorMinorMode.descriptor.id] : modes,\n });\n },\n })\n : undefined;\n let disposed = false;\n const catalog = createAuthorCatalog(session?.catalog);\n const assertAlive = () => {\n signal.throwIfAborted();\n if (disposed) throw new Error('Author session is disposed.');\n };\n const assertAvailable = () => {\n assertAlive();\n if (!isActive()) throw new Error('Author mode is not active.');\n };\n const mountNamespace = (context: Context) => {\n if (!agent) return;\n // The webmcp namespace and its pinned skill stay available without Author mode; only the direct tools are mode-gated.\n const namespace = createWebmcpNamespace(catalog, agent.context.sessionId, assertAlive);\n context.inject([PO_CODEMODE_SERVICE], (scoped) => {\n const registration = readPoCodemode(scoped)?.register('@agimon-ai/po-author', namespace);\n return () => registration?.dispose();\n });\n };\n return {\n onDispose: () => {\n disposed = true;\n },\n value: {\n api: session?.api ?? api,\n catalog,\n // Registration is gated by AUTHOR_TOOL_WHEN; this re-checks a call already in flight when the mode turns off.\n assertAvailable,\n service: undefined,\n },\n services: [...(mode ? [serverMinorModes([mode])] : []), mountNamespace],\n };\n});\n","import type {\n PoHubChannelConnection,\n PoHubChannelHost,\n PoHubChannelSource,\n PoHubSessionScope,\n PoHubChannel,\n} from '@agimon-ai/po-core/hubChannel';\n\nimport { AUTHOR_ALIAS_PATTERN } from '../../schemas/authorTools';\nimport routes from '../../types/apiRoutes';\nimport { API_BASE_PATH } from '../../types/authorApi';\nimport {\n AUTHOR_MAX_CANVASES,\n authorCanvasesFrame,\n authorChannelType,\n type AuthorBrowserMessage,\n type AuthorCanvasesMessage,\n type AuthorHubMessage,\n type AuthorOpenCanvas,\n} from '../../types/webAuthor';\n\n/**\n * Which route carries each message the browser sends.\n *\n * The paths come from the package's one route table, so the hub cannot address\n * a bridge route the session no longer serves. `release` is absent because it\n * is answered by the disconnect route rather than one of its own.\n */\nconst BRIDGE_ROUTE: Readonly<Record<Exclude<AuthorBrowserMessage['kind'], 'release'>, string>> = {\n register: routes.bridgeRegister.path,\n catalog: routes.bridgeCatalog.path,\n result: routes.bridgeResult.path,\n cancelled: routes.bridgeCancelled.path,\n};\n\ninterface Binding {\n alias: string;\n scope: PoHubSessionScope;\n connectionId: string;\n generation: number;\n ownerToken: string;\n poll?: AbortController;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction browserMessage(value: unknown): AuthorBrowserMessage | undefined {\n if (\n !isRecord(value) ||\n typeof value.kind !== 'string' ||\n typeof value.alias !== 'string' ||\n !AUTHOR_ALIAS_PATTERN.test(value.alias)\n )\n return undefined;\n if (!['register', 'release', 'catalog', 'result', 'cancelled'].includes(value.kind)) return undefined;\n return value as unknown as AuthorBrowserMessage;\n}\n\n/** The session's open canvases, or undefined when the frame is not a bounded list of valid aliases and paths. */\nfunction openCanvases(value: unknown): AuthorOpenCanvas[] | undefined {\n if (!isRecord(value) || !Array.isArray(value.canvases) || value.canvases.length > AUTHOR_MAX_CANVASES)\n return undefined;\n const canvases: AuthorOpenCanvas[] = [];\n for (const entry of value.canvases as unknown[]) {\n if (\n !isRecord(entry) ||\n typeof entry.alias !== 'string' ||\n !AUTHOR_ALIAS_PATTERN.test(entry.alias) ||\n typeof entry.path !== 'string' ||\n entry.path === ''\n )\n return undefined;\n canvases.push({ alias: entry.alias, path: entry.path });\n }\n return canvases;\n}\n\nasync function responsePayload(response: Response): Promise<AuthorHubMessage> {\n const value = (await response.json()) as unknown;\n if (response.ok) return value as AuthorHubMessage;\n const reason =\n isRecord(value) && typeof value.error === 'string' ? value.error : `Author bridge HTTP ${response.status}`;\n return { kind: 'rejected', reason };\n}\n\nexport function createAuthorChannel(): PoHubChannel {\n const bindings = new Map<string, Binding>();\n let host: PoHubChannelHost | undefined;\n let closed = false;\n const keyOf = (sessionId: string, connectionId: string, alias: string): string =>\n `${sessionId}\\0${connectionId}\\0${alias}`;\n const send = async (scope: PoHubSessionScope, path: string, value: Record<string, unknown>, signal?: AbortSignal) =>\n await host!.requestSessionApi(scope, {\n basePath: API_BASE_PATH,\n path,\n method: 'POST',\n body: JSON.stringify(value),\n ...(signal === undefined ? {} : { signal }),\n });\n // po.channels keeps only the latest payload and drops an unchanged one, so an identical lease renewal\n // would never reach the browser and its lease would lapse. The sequence makes every frame distinct.\n let sequence = 0;\n const publish = (binding: Binding, payload: AuthorHubMessage): boolean =>\n host?.publishToConnection?.(binding.connectionId, binding.scope.sessionId, {\n ...payload,\n alias: binding.alias,\n seq: ++sequence,\n }) ?? false;\n\n const poll = async (binding: Binding): Promise<void> => {\n binding.poll?.abort();\n const controller = new AbortController();\n binding.poll = controller;\n while (!closed && bindings.get(keyOf(binding.scope.sessionId, binding.connectionId, binding.alias)) === binding) {\n try {\n const response = await send(\n binding.scope,\n routes.bridgeNext.path,\n {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n ownerToken: binding.ownerToken,\n },\n controller.signal,\n );\n const payload = await responsePayload(response);\n if (controller.signal.aborted) break;\n if (!publish(binding, payload) || payload.kind === 'rejected') break;\n } catch (error) {\n if (!controller.signal.aborted) host?.onNotice(error instanceof Error ? error.message : String(error));\n break;\n }\n }\n if (binding.poll === controller) binding.poll = undefined;\n };\n\n const channel: PoHubChannel = {\n frameType: authorChannelType,\n lifecycle: 'hub',\n receiveWithoutSubscription: true,\n start(channelHost) {\n host = channelHost;\n // The session server publishes its open canvases; every browser of the session gets the latest on subscribe.\n const latest = new Map<string, AuthorCanvasesMessage>();\n const subscriptions = new Map<string, () => void>();\n const source: PoHubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n latest.delete(scope.sessionId);\n const unsubscribe = channelHost.directEvents.subscribe(\n authorCanvasesFrame,\n scope.sessionId,\n (payload) => {\n const canvases = openCanvases(payload);\n if (canvases === undefined) return;\n const message: AuthorCanvasesMessage = { kind: 'canvases', canvases };\n latest.set(scope.sessionId, message);\n channelHost.publish(scope.sessionId, message);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n latest.delete(sessionId);\n for (const [key, binding] of bindings) {\n if (binding.scope.sessionId !== sessionId) continue;\n binding.poll?.abort();\n bindings.delete(key);\n void send(binding.scope, routes.bridgeDisconnect.path, {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n }).catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n }\n },\n close() {\n closed = true;\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n latest.clear();\n for (const binding of bindings.values()) {\n binding.poll?.abort();\n void send(binding.scope, routes.bridgeDisconnect.path, {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n }).catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n }\n bindings.clear();\n },\n };\n return source;\n },\n receive(scope, payload, connection) {\n const message = browserMessage(payload);\n if (message === undefined || host === undefined || closed) return;\n void (async () => {\n const key = keyOf(scope.sessionId, connection.connectionId, message.alias);\n const previous = bindings.get(key);\n if (message.kind === 'release') {\n if (previous === undefined || previous.generation !== message.generation) return;\n previous.poll?.abort();\n bindings.delete(key);\n await send(scope, routes.bridgeDisconnect.path, {\n alias: message.alias,\n bindingId: connection.connectionId,\n generation: message.generation,\n });\n return;\n }\n const route = BRIDGE_ROUTE[message.kind];\n const response = await send(scope, route, { ...message, bindingId: connection.connectionId });\n const reply = await responsePayload(response);\n if (reply.kind === 'accepted') {\n const current = bindings.get(key);\n if (current?.generation === reply.generation && current.ownerToken === reply.ownerToken) {\n publish(current, reply);\n if (current.poll === undefined) void poll(current);\n return;\n }\n const binding: Binding = {\n alias: message.alias,\n scope,\n connectionId: connection.connectionId,\n generation: reply.generation,\n ownerToken: reply.ownerToken,\n };\n current?.poll?.abort();\n bindings.set(key, binding);\n publish(binding, reply);\n void poll(binding);\n } else if (reply.kind === 'rejected') {\n if (previous !== undefined) publish(previous, reply);\n else\n host?.publishToConnection?.(connection.connectionId, scope.sessionId, {\n ...reply,\n alias: message.alias,\n seq: ++sequence,\n });\n }\n })().catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n },\n disconnected(connection: PoHubChannelConnection) {\n for (const [key, binding] of bindings) {\n if (binding.connectionId !== connection.connectionId) continue;\n binding.poll?.abort();\n bindings.delete(key);\n void send(binding.scope, routes.bridgeDisconnect.path, {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n }).catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n }\n },\n };\n return channel;\n}\n","import { defineChannel } from '@agimon-ai/po-core/extensionFile';\n\nimport { createAuthorChannel } from '../../../services/webAuthorChannel';\n\nexport default defineChannel(createAuthorChannel);\n","import { defineServerMethod, type PoServerHostService } from '@agimon-ai/po-core/serverPlugin';\n\nimport { authorBridgeMethod } from '../../schemas/authorFacade';\nimport { authorChannelType } from '../../types/webAuthor';\n\nexport function createAuthorBridgeMethod(scope: 'global' | 'workspace', host: PoServerHostService) {\n return defineServerMethod(authorBridgeMethod(scope), ({ sessionId, message }, caller) => {\n if (!caller.connectionId) throw new Error('Author bridge requires an authenticated browser connection.');\n if (!host.context.receiveChannel?.(sessionId, authorChannelType, message, caller.connectionId))\n throw new Error('Author bridge session is outside this mount.');\n return {};\n });\n}\n","import { defineMethod } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createAuthorBridgeMethod } from '../../../services/authorBridgeMethod';\n\nexport default defineMethod(({ host }: PoServerPluginContext) =>\n host.scope === 'session'\n ? { register: () => ({ dispose: () => undefined }) }\n : createAuthorBridgeMethod(host.scope, host),\n);\n","import { defineRoute, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype AuthorServerScope = Awaited<ReturnType<typeof import('../../root.server').default>>['value'];\n\nexport default defineRoute((context: WithRoot<PoServerPluginContext, AuthorServerScope>) => context.root.api);\n","import { defineCommand as defineRoutedCommand, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { createAuthorCommand } from '../../../../../services/authorCommand';\nimport type { AuthorExtensionService } from '../../../../../types/extension';\n\nexport default defineRoutedCommand((context: WithRoot<unknown, { readonly service?: AuthorExtensionService }>) =>\n createAuthorCommand(context.root.service),\n);\n","import { defineHook } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_GUIDANCE } from '../../../../../constants/author';\n\nexport default defineHook<'before_agent_start'>({\n when: { state: { 'minor-mode': 'author' }, attribution: { kind: 'minor', mode: 'author' } },\n event: 'before_agent_start',\n handle(event) {\n const systemPrompt = typeof event.systemPrompt === 'string' ? event.systemPrompt : '';\n return { systemPrompt: `${systemPrompt}\\n\\n${AUTHOR_GUIDANCE}`.trim() };\n },\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nconst skillFile = 'src/prompts/codemode-how-to-author/SKILL.md';\n\nexport default defineResource({\n name: 'codemode-how-to-author',\n description:\n 'Open a file as a canvas the person sees, then read and change it through the tools that canvas offers. Use to review or edit a document, image or sheet together with the person; works without Author mode.',\n kind: 'skill' as const,\n pinned: true,\n path: packageResourcePath(import.meta.url, skillFile),\n read: () => readPackageResource(import.meta.url, skillFile),\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n when: { state: { 'minor-mode': 'author' }, attribution: { kind: 'minor' as const, mode: 'author' } },\n name: 'po-use-author',\n description: 'Use the Author workflow for focused document review, canvas steering, and bounded authoring.',\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-use-author/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-author/SKILL.md'),\n});\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_TOOL_WHEN, createAuthorTools, type AuthorToolRoot } from '../../../../../services/authorTools';\n\nexport default defineTool((context: WithRoot<unknown, AuthorToolRoot>) => ({\n ...createAuthorTools(context.root.catalog, context.root.assertAvailable)[1]!,\n when: AUTHOR_TOOL_WHEN,\n}));\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_TOOL_WHEN, createAuthorTools, type AuthorToolRoot } from '../../../../../services/authorTools';\n\nexport default defineTool((context: WithRoot<unknown, AuthorToolRoot>) => ({\n ...createAuthorTools(context.root.catalog, context.root.assertAvailable)[0]!,\n when: AUTHOR_TOOL_WHEN,\n}));\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_TOOL_WHEN, createAuthorTools, type AuthorToolRoot } from '../../../../../services/authorTools';\n\nexport default defineTool((context: WithRoot<unknown, AuthorToolRoot>) => ({\n ...createAuthorTools(context.root.catalog, context.root.assertAvailable)[2]!,\n when: AUTHOR_TOOL_WHEN,\n}));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelAuthorWebmcp from '../src/extensions/(backend)/channel/author-webmcp.server';\nimport methodBridge from '../src/extensions/(backend)/method/bridge.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/author/route.server';\nimport commandAuthor from '../src/extensions/workspaces/sessions/(backend)/command/author.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport resourceCodemodeHowToAuthor from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-author.server';\nimport resourcePoUseAuthor from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-author.server';\nimport toolDescribeAuthorTools from '../src/extensions/workspaces/sessions/(backend)/tool/describe-author-tools.server';\nimport toolOpenAuthoringFile from '../src/extensions/workspaces/sessions/(backend)/tool/open-authoring-file.server';\nimport toolUseAuthorTools from '../src/extensions/workspaces/sessions/(backend)/tool/use-author-tools.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-author',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]); },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]); },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'author' }, at(commandAuthor, contextSession))]; },\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession))]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToAuthor, contextSession), at(resourcePoUseAuthor, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'describe_author_tools' }, at(toolDescribeAuthorTools, contextSession)), via({ name: 'open_authoring_file' }, at(toolOpenAuthoringFile, contextSession)), via({ name: 'use_author_tools' }, at(toolUseAuthorTools, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAUA,MAAM,eAAe;;;;;;;;;;;;;;;;;AAkBrB,SAAS,KAAQ,OAAa;CAC5B,OAAO,UAAU,KAAA,IAAY,QAAQ,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACvE;AAEA,SAAgB,sBACd,SACA,WACA,iBACqB;CACrB,OAAO;EACL,MAAM;EACN,SACE;EACF,cAAc;EACd,KAAK,KAAK;GACR,IAAI,IAAI,cAAc,WAAW,MAAM,IAAI,MAAM,qDAAqD;GACtG,IAAI,WAAW;GACf,IAAI,gBAAgB;IAClB,WAAW;GACb,CAAC;GACD,MAAM,cAAc;IAClB,IAAI,OAAO,eAAe;IAC1B,IAAI,UAAU,MAAM,IAAI,MAAM,gCAAgC;IAC9D,gBAAgB;GAClB;GACA,MAAM,UAAmC,OAAO,OAAO,IAAI;GAC3D,QAAQ,OAAO,OAAO,UAAmB;IACvC,MAAM;IACN,MAAM,EAAE,MAAM,UAAUA,4BAAAA,4BAA4B,KAAK,KAAK,CAAC;IAC/D,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK;IACzD,MAAM;IACN,OAAO,KAAK,MAAM;GACpB;GACA,QAAQ,WAAW,OAAO,UAAoB;IAC5C,MAAM;IACN,MAAM,EAAE,UAAUC,4BAAAA,8BAA8B,KAAK,UAAU,KAAA,IAAY,CAAC,IAAI,KAAK,CAAC;IACtF,MAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,QAAQ,KAAK;IACvD,MAAM;IACN,OAAO,KAAK,MAAM;GACpB;GACA,QAAQ,OAAO,OAAO,UAAmB;IACvC,MAAM;IACN,MAAM,SAASC,4BAAAA,wBAAwB,KAAK,KAAK,CAAC;IAClD,MAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,IAAI,MAAM;IACvD,MAAM;IACN,OAAO,KAAK,OAAO,MAAM;GAC3B;GACA,OAAO;EACT;CACF;AACF;;;AC5EA,MAAa,oBAAoB;;AAmFjC,MAAa,sBAAsB;;;ACtEnC,MAAa,4BAA4B;AAUzC,SAAS,OAAO,MAAc,WAA4B;CACxD,MAAM,WAAWC,UAAAA,QAAK,SAAS,MAAM,SAAS;CAC9C,OAAO,aAAa,MAAM,aAAa,QAAQ,CAAC,SAAS,WAAW,KAAKA,UAAAA,QAAK,KAAK,KAAK,CAACA,UAAAA,QAAK,WAAW,QAAQ;AACnH;;;;;;AAOA,eAAe,gBACb,eACA,WACA,aACA;CACA,MAAM,WAAW,cAAc,WAAWC,4BAAAA,sBAAsB;CAChE,IAAI,cAAc,KAAA,KAAa,gBAAgB,KAAA,GAAW;EACxD,IAAI,UAAU,MAAM,IAAIC,4BAAAA,qBAAqB,6BAA6B,GAAG;EAC7E;CACF;CACA,MAAM,QAAA,GAAOC,qCAAAA,aAAAA,CAAa,WAAW,WAAW;CAChD,IAAI,UAAU,OAAO;EAAE;EAAM,UAAU,cAAc,MAAMF,4BAAAA,uBAAuB,MAAM;CAAE;CAC1F,IAAI,CAACD,UAAAA,QAAK,WAAW,aAAa,GAAG,OAAO,KAAA;CAE5C,MAAM,OAAO,CAAC,MAAM,MADGI,iBAAAA,QAAG,SAAS,IAAI,CAAC,CAAC,YAAY,IAAI,CAC7B,CAAC,CAAC,MAAM,cAAc,OAAO,WAAW,aAAa,CAAC;CAClF,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA;CAC/B,OAAO;EAAE;EAAM,UAAUJ,UAAAA,QAAK,SAAS,MAAM,aAAa,CAAC,CAAC,MAAMA,UAAAA,QAAK,GAAG,CAAC,CAAC,KAAK,GAAG;CAAE;AACxF;AAEA,eAAsB,gBACpB,KACA,eACA,WACA,aAC+B;CAC/B,IAAI,OAAO,kBAAkB,YAAY,cAAc,WAAW,KAAK,cAAc,SAAS,IAAI,GAChG,MAAM,IAAI,MAAM,uCAAuC;CACzD,MAAM,WAAW,MAAM,gBAAgB,eAAe,WAAW,WAAW;CAC5E,IAAI,aAAa,KAAA,GAAW;EAC1B,MAAM,WAAW,MAAMI,iBAAAA,QAAG,SAAS,SAAS,IAAI,CAAC,CAAC,YAAY,SAAS,IAAI;EAC3E,OAAO;GACL,MAAM;GACN,MAAM,GAAGH,4BAAAA,yBAAyB,SAAS;GAC3C,UAAUD,UAAAA,QAAK,KAAK,UAAU,SAAS,QAAQ;GAC/C,GAAG;EACL;CACF;CACA,IAAIA,UAAAA,QAAK,WAAW,aAAa,GAC/B,MAAM,IAAI,MAAM,kFAAkF;CACpG,MAAM,OAAO,MAAMI,iBAAAA,QAAG,SAAS,GAAG;CAClC,MAAM,YAAYJ,UAAAA,QAAK,QAAQ,MAAM,aAAa;CAClD,IAAI,cAAc,QAAQ,CAAC,UAAU,WAAW,GAAG,OAAOA,UAAAA,QAAK,KAAK,GAClE,MAAM,IAAIE,4BAAAA,qBAAqB,mDAAmD,GAAG;CACvF,MAAM,gBAAgB,MAAME,iBAAAA,QAAG,SAAS,SAAS;CACjD,IAAI,kBAAkB,QAAQ,CAAC,cAAc,WAAW,GAAG,OAAOJ,UAAAA,QAAK,KAAK,GAC1E,MAAM,IAAIE,4BAAAA,qBAAqB,mDAAmD,GAAG;CAGvF,MAAM,oBAAoB,MAAM,gBAAgB,eAAe,WAAW,WAAW;CACrF,IAAI,sBAAsB,KAAA,GACxB,OAAO;EACL,MAAM;EACN,MAAM,GAAGD,4BAAAA,yBAAyB,kBAAkB;EACpD,UAAU;EACV,GAAG;CACL;CAEF,OAAO;EACL,MAAM;EACN;EACA,MAAMD,UAAAA,QAAK,SAAS,MAAM,aAAa,CAAC,CAAC,MAAMA,UAAAA,QAAK,GAAG,CAAC,CAAC,KAAK,GAAG;EACjE,UAAU;CACZ;AACF;AAEA,eAAe,aACb,MACA,UACA,iBACqB;CACrB,IAAI;CACJ,IAAI;EACF,OAAO,OAAA,GAAMK,qCAAAA,aAAAA,CAAa,MAAM,UAAU,eAAe;CAC3D,SAAS,OAAO;EACd,IAAI,iBAAiBC,qCAAAA,qBAAqB,MAAM,IAAIJ,4BAAAA,qBAAqB,MAAM,SAAS,MAAM,MAAM;EACpG,MAAM;CACR;CACA,IAAI;EACF,IAAI,KAAK,KAAK,OAAA,UACZ,MAAMK,4BAAAA,iBAAiB,wBAAwB,0BAA0B,qBAAqB;EAChG,OAAO,OAAA,GAAMC,qCAAAA,kBAAAA,CAAkB,KAAK,QAAQ,KAAK,KAAK,IAAI;CAC5D,UAAU;EACR,MAAM,KAAK,OAAO,MAAM;CAC1B;AACF;AAEA,eAAsB,WACpB,QACA,iBACqB;CACrB,IAAI,OAAO,SAAS,YAAY,OAAO,MAAM,aAAa,OAAO,MAAM,OAAO,UAAU,eAAe;CACvG,IAAI,QAAQ,aAAa,YAAY,QAAQ,aAAa,SACxD,MAAM,IAAIN,4BAAAA,qBAAqB,iDAAiD,GAAG;CAGrF,MAAM,WAAW,QAAQ,aAAa,WAAW,YAAaO,QAAAA,UAAU;CACxE,MAAM,SAAS,MAAML,iBAAAA,QAAG,KAAK,OAAO,UAAUK,QAAAA,UAAU,WAAWA,QAAAA,UAAU,aAAa,QAAQ;CAClG,IAAI;EACF,MAAM,OAAO,MAAM,OAAO,KAAK;EAC/B,MAAM,UAAU,MAAML,iBAAAA,QAAG,MAAM,OAAO,QAAQ;EAC9C,MAAM,WAAW,MAAMA,iBAAAA,QAAG,SAAS,QAAQ,aAAa,UAAU,iBAAiB,OAAO,OAAO,OAAO,QAAQ;EAChH,IACE,CAAC,KAAK,OAAO,KACb,CAAC,QAAQ,OAAO,KAChB,KAAK,QAAQ,QAAQ,OACrB,KAAK,QAAQ,QAAQ,OACrB,CAAC,OAAO,OAAO,MAAM,QAAQ,GAE7B,MAAM,IAAIF,4BAAAA,qBAAqB,6DAA6D,GAAG;EACjG,IAAI,KAAK,OAAA,UACP,MAAMK,4BAAAA,iBAAiB,wBAAwB,0BAA0B,qBAAqB;EAChG,OAAO,OAAA,GAAMC,qCAAAA,kBAAAA,CAAkB,QAAQ,KAAK,IAAI;CAClD,UAAU;EACR,MAAM,OAAO,MAAM;CACrB;AACF;AAEA,eAAsB,aACpB,KACA,eACA,WACA,aACA,iBACqB;CACrB,OAAO,MAAM,WAAW,MAAM,gBAAgB,KAAK,eAAe,WAAW,WAAW,GAAG,eAAe;AAC5G;;;ACxIA,SAAgB,2BACd,KACA,cAEA,WACA,aACA,iBACA;CAEA,MAAM,0BAAU,IAAI,IAAoB;CACxC,MAAM,yBAAS,IAAI,IAAoB;CAEvC,MAAM,0BAAU,IAAI,IAAoB;CACxC,MAAM,4BAAY,IAAI,IAAgB;CACtC,MAAM,gBAAgB;EACpB,KAAK,MAAM,YAAY,WAAW,SAAS;CAC7C;CAEA,MAAM,UAAU,UAA2B;EACzC,IAAI,UAAU,KAAA,GAAW;GACvB,IAAI,CAACE,4BAAAA,qBAAqB,KAAK,KAAK,GAAG,MAAM,IAAIC,4BAAAA,kBAAkB,gCAAgC,GAAG;GACtG,MAAM,SAAS,QAAQ,IAAI,KAAK;GAChC,MAAM,cAAc,QAAQ,IAAI,KAAK;GACrC,IAAI,WAAW,KAAA,KAAa,gBAAgB,KAAA,GAC1C,MAAM,IAAIA,4BAAAA,kBACR,kBAAkB,MAAM,uDAAuD,YAAY,6BAC3F,GACF;GACF,IAAI,WAAW,KAAA,GACb,MAAM,IAAIA,4BAAAA,kBACR,0BAA0B,MAAM,2DAChC,GACF;GACF,OAAO;EACT;EACA,MAAM,WAAW,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,QAAQ,WAAW,CAAC,OAAO,MAAM;EACxE,IAAI,SAAS,WAAW,GACtB,MAAM,IAAIA,4BAAAA,kBAAkB,4EAA4E,GAAG;EAC7G,OAAO,SAAS;CAClB;CAEA,MAAM,QAAQ,WAAqC;EACjD,IAAI,OAAO,QAAQ,OAAO;GAAE,OAAO,OAAO;GAAO,MAAM,OAAO;GAAM,QAAQ;EAAc;EAC1F,IAAI;GACF,OAAO,OAAO,SAAS;GACvB,OAAO,YAAY;GACnB,OAAO;IAAE,OAAO,OAAO;IAAO,MAAM,OAAO;IAAM,QAAQ;GAAQ;EACnE,QAAQ;GACN,OAAO;IAAE,OAAO,OAAO;IAAO,MAAM,OAAO;IAAM,QAAQ,OAAO,YAAY,gBAAgB;GAAU;EACxG;CACF;CAEA,OAAO;EACL,MAAM,KAAK,eAAuB,QAAsB,gBAAwD;GAC9G,QAAQ,eAAe;GACvB,IAAI,mBAAmB,KAAA,KAAa,CAACD,4BAAAA,qBAAqB,KAAK,cAAc,GAC3E,MAAM,IAAIC,4BAAAA,kBAAkB,gCAAgC,GAAG;GACjE,MAAM,SAAS,MAAM,gBAAgB,KAAK,eAAe,WAAW,WAAW;GAC/E,MAAM,QAAQ,MAAM,WAAW,QAAQ,eAAe;GACtD,QAAQ,eAAe;GACvB,MAAM,EAAE,UAAU,MAAM,kBAAkB;GAC1C,MAAM,WAAW,mBAAmB,KAAA,IAAY,KAAA,IAAY,QAAQ,IAAI,cAAc;GACtF,IAAI,aAAa,KAAA,KAAa,SAAS,aAAa,UAClD,MAAM,IAAIA,4BAAAA,kBAAkB,wBAAwB,eAAe,kBAAkB,SAAS,KAAK,IAAI,GAAG;GAC5G,MAAM,WAAW,OAAO,IAAI,QAAQ;GACpC,IAAI,aAAa,KAAA,GAAW;IAC1B,IAAI,SAAS,QAAQ,SAAS,YAAY;IAC1C,SAAS,SAAS;IAClB,QAAQ,OAAO,SAAS,KAAK;IAC7B,QAAQ,IAAI,SAAS,OAAO,QAAQ;IACpC,QAAQ;IACR,OAAO;KACL,MAAM,SAAS;KACf,YAAY,MAAM;KAClB,OAAO,SAAS;KAChB,QAAQ,KAAK,QAAQ,CAAC,CAAC;KACvB,QAAQ;IACV;GACF;GACA,IAAI,QAAQ,QAAA,IAA6B;IACvC,MAAM,SAAS,CAAC,GAAG,QAAQ,OAAO,CAAC;IACnC,MAAM,YAAY,OAAO,MAAM,WAAW,OAAO,MAAM;IACvD,MAAM,UAAU,aAAa,OAAO;IACpC,QAAQ,OAAO,MAAM;IACrB,QAAQ,OAAO,QAAQ,KAAK;IAC5B,OAAO,OAAO,QAAQ,QAAQ;IAC9B,IAAI,cAAc,KAAA,GAAW,QAAQ,IAAI,QAAQ,OAAO,QAAQ,IAAI;GACtE;GACA,MAAM,OACJC,UAAAA,QACG,SAAS,QAAQ,CAAC,CAClB,QAAQ,aAAa,EAAE,CAAC,CACxB,YAAY,CAAC,CACb,QAAQ,kBAAkB,GAAG,CAAC,CAC9B,QAAQ,aAAa,SAAS,CAAC,CAC/B,MAAM,GAAG,EAAE,KAAK;GAErB,MAAM,UAAU,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,iBAAiB,gBAAgB,aAAa,CAAC,GAAG;GACxF,IAAI,YAAY,KAAA,GAAW,QAAQ,OAAO,OAAO;GACjD,IAAI,mBAAmB,KAAA,GAAW,QAAQ,OAAO,cAAc;GAC/D,IAAI,QAAQ,kBAAkB,WAAW;GACzC,KAAK,IAAI,SAAS,GAAG,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,UAAU,QAAQ,GAAG,KAAK,MAAM,GAAG,EAAE,EAAE,GAAG;GACzG,MAAM,SAAiB;IACrB;IACA,MAAM;IACN;IACA,QAAQ,aAAa;IACrB,QAAQ;IACR,WAAW;GACb;GACA,QAAQ,IAAI,OAAO,MAAM;GACzB,OAAO,IAAI,UAAU,MAAM;GAC3B,QAAQ;GACR,OAAO;IAAE,MAAM;IAAe,YAAY,MAAM;IAAY;IAAO,QAAQ;IAAW,QAAQ;GAAM;EACtG;EACA,SAAS,OAA+C;GACtD,MAAM,WAAW,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;GAC/C,MAAM,SACJ,UAAU,KAAA,KAAa,SAAS,QAAQ,WAAW,OAAO,WAAW,aAAa,CAAC,CAAC,WAAW,IAC3F,KAAA,IACA,OAAO,KAAK;GAClB,IAAI,WAAW,KAAA,GACb,OAAO;IACL,cAAc;IACd,OAAO,CAAC;IACR;IACA,UAAU;GACZ;GAEF,MAAM,SAAS,KAAK,MAAM,CAAC,CAAC;GAC5B,MAAM,OAAO;IAAE,OAAO,OAAO;IAAO,MAAM,OAAO;IAAM;IAAQ;GAAS;GACxE,IAAI,WAAW,SACb,OAAO;IACL,GAAG;IACH,cAAc;IACd,OAAO,CAAC;IACR,UACE,WAAW,YACP,YAAY,OAAO,MAAM,0DAA0D,OAAO,MAAM,QAChG,UAAU,OAAO,KAAK,qCAAqC,OAAO,KAAK,aAAa,OAAO,MAAM;GACzG;GAEF,OAAO;IAAE,GAAG;IAAM,GAAG,OAAO,OAAO,SAAS;GAAE;EAChD;EACA,OAAO,OAA2B,QAAsB;GACtD,MAAM,SAAS,OAAO,MAAM,KAAK;GACjC,IAAI,OAAO,QAAQ,MAAM,IAAID,4BAAAA,kBAAkB,WAAW,OAAO,MAAM,gCAAgC,GAAG;GAC1G,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,MAAM,YAAY;IAAE,GAAG;IAAQ,OAAO,OAAO;GAAM,EAAE;EAClG;EACA,OAAO,OAAkC;GACvC,MAAM,SAAS,OAAO,KAAK;GAC3B,IAAI,OAAO,QAAQ,MAAM,IAAIA,4BAAAA,kBAAkB,WAAW,MAAM,gCAAgC,GAAG;GACnG,OAAO,OAAO;EAChB;EACA,MAAM,OAAqB;GACzB,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG;GAC/C,MAAM,SAAS,OAAO,KAAK;GAC3B,OAAO,SAAS;GAChB,OAAO,OAAO,MAAM;GACpB,OAAO,SAAS,aAAa;GAC7B,QAAQ;EACV;;EAEA,eAAmC;GACjC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CACzB,QAAQ,WAAW,CAAC,OAAO,MAAM,CAAC,CAClC,KAAK,YAAY;IAAE,OAAO,OAAO;IAAO,MAAM,OAAO;GAAK,EAAE;EACjE;EACA,SAAS,UAAkC;GACzC,UAAU,IAAI,QAAQ;GACtB,aAAa,UAAU,OAAO,QAAQ;EACxC;EACA,UAAgB;GACd,KAAK,MAAM,UAAU,QAAQ,OAAO,GAAG,OAAO,OAAO,MAAM;GAC3D,QAAQ,MAAM;GACd,OAAO,MAAM;EACf;CACF;AACF;;;;;;;;;;;;;;;;;;;;;AClLA,IAAA,qBAAA,GAAeE,uBAAAA,gBAAAA,CAAgB;CAC7B,OAAO;EACL,QAAQ;EACR,MAAM;EACN,WAAA,GAAUC,uBAAAA,YAAAA,CAA+B;CAC3C;CACA,gBAAgB;EACd,QAAQ;EACR,MAAM;CACR;CACA,eAAe;EACb,QAAQ;EACR,MAAM;CACR;;CAEA,YAAY;EACV,QAAQ;EACR,MAAM;CACR;CACA,cAAc;EACZ,QAAQ;EACR,MAAM;CACR;CACA,iBAAiB;EACf,QAAQ;EACR,MAAM;CACR;CACA,kBAAkB;EAChB,QAAQ;EACR,MAAM;CACR;CACA,aAAa;EACX,QAAQ;EACR,MAAM;CACR;CACA,gBAAgB;EACd,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,OAAO;CACjB;CACA,cAAc;EACZ,QAAQ;EACR,MAAM;CACR;;;;;;;CAOA,eAAe;EACb,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,SAAS;EACjB,WAAA,GAAUA,uBAAAA,YAAAA,CAA6D;CACzE;CACA,oBAAoB;EAClB,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,SAAS;EACjB,WAAA,GAAUA,uBAAAA,YAAAA,CAAqC;CACjD;CACA,oBAAoB;EAClB,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,SAAS;EACjB,WAAA,GAAUA,uBAAAA,YAAAA,CAAiD;CAC7D;;CAEA,MAAM;EACJ,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,MAAM;EACd,KAAK;CACP;CACA,WAAW;EACT,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,MAAM;EACd,KAAK;CACP;AACF,CAAC;;;;;;;;;;;;AC7FD,MAAa,gBAAgB;;;ACJ7B,SAAS,OAAO,OAAyC;CACvD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAIC,4BAAAA,kBAAkB,oBAAoB,GAAG;CACrD,OAAO;AACT;AAEA,SAAS,KAAK,OAAgB,KAAqB;CACjD,MAAM,SAAS,OAAO,KAAK,CAAC,CAAC;CAC7B,IAAI,OAAO,WAAW,YAAY,WAAW,IAAI,MAAM,IAAIA,4BAAAA,kBAAkB,WAAW,IAAI,IAAI,GAAG;CACnG,OAAO;AACT;AAEA,SAAS,WAAW,OAAwB;CAC1C,MAAM,SAAS,OAAO,KAAK,CAAC,CAAC;CAC7B,IAAI,CAAC,OAAO,cAAc,MAAM,KAAM,SAAoB,GAAG,MAAM,IAAIA,4BAAAA,kBAAkB,uBAAuB,GAAG;CACnH,OAAO;AACT;AAEA,eAAe,KAAK,SAAoD;CACtE,OAAO,OAAO,MAAM,QAAQ,KAAK,CAAC;AACpC;AAEA,SAAgB,sBAAsB,UAAsC;CAC1E,MAAM,MAAM,IAAIC,KAAAA,KAAK;CACrB,IAAI,SAAS,OAAO,YAClB,QAAQ,KACN,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAChE,iBAAiBD,4BAAAA,oBAAoB,MAAM,SAAS,GACtD,CACF;CACA,IAAI,KAAKE,kBAAO,eAAe,MAAM,OAAO,YAAY;EACtD,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;EACxC,MAAM,QAAQ,KAAK,OAAO,OAAO;EACjC,OAAO,QAAQ,KAAK;GAAE,GAAG,SAAS,OAAO,KAAK,CAAC,CAAC,SAAS,KAAK,OAAO,WAAW,GAAG,WAAW,KAAK,CAAC;GAAG;EAAM,CAAC;CAChH,CAAC;CACD,IAAI,KAAKA,kBAAO,cAAc,MAAM,OAAO,YAAY;EACrD,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;EACxC,MAAM,QAAQ,MAAM;EACpB,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAIF,4BAAAA,kBAAkB,2BAA2B,GAAG;EACrF,MAAM,QAAQ,KAAK,OAAO,OAAO;EACjC,OAAO,QAAQ,KAAK;GAClB,GAAG,SACA,OAAO,KAAK,CAAC,CACb,QACC,KAAK,OAAO,WAAW,GACvB,WAAW,KAAK,GAChB,KAAK,OAAO,YAAY,GACxB,KACF;GACF;EACF,CAAC;CACH,CAAC;CACD,IAAI,KAAKE,kBAAO,WAAW,MAAM,OAAO,YAAY;EAClD,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;EACxC,MAAM,QAAQ,KAAK,OAAO,OAAO;EACjC,OAAO,QAAQ,KAAK;GAClB,GAAI,MAAM,SACP,OAAO,KAAK,CAAC,CACb,KAAK,KAAK,OAAO,WAAW,GAAG,WAAW,KAAK,GAAG,KAAK,OAAO,YAAY,GAAG,QAAQ,IAAI,IAAI,MAAM;GACtG;EACF,CAAC;CACH,CAAC;CACD,IAAI,KAAKA,kBAAO,aAAa,MAAM,OAAO,YAAY;EACpD,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;EACxC,SACG,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,CAC5B,OACC,KAAK,OAAO,WAAW,GACvB,WAAW,KAAK,GAChB,KAAK,OAAO,YAAY,GACxB,KAAK,OAAO,cAAc,GAC1B,KAAK,OAAO,WAAW,GACvB,MAAM,MACR;EACF,OAAO,QAAQ,KAAK,EAAE,UAAU,KAAK,CAAC;CACxC,CAAC;CACD,IAAI,KAAKA,kBAAO,gBAAgB,MAAM,OAAO,YAAY;EACvD,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;EACxC,SACG,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,CAC5B,UACC,KAAK,OAAO,WAAW,GACvB,WAAW,KAAK,GAChB,KAAK,OAAO,YAAY,GACxB,KAAK,OAAO,cAAc,GAC1B,KAAK,OAAO,WAAW,CACzB;EACF,OAAO,QAAQ,KAAK,EAAE,UAAU,KAAK,CAAC;CACxC,CAAC;CACD,IAAI,KAAKA,kBAAO,iBAAiB,MAAM,OAAO,YAAY;EACxD,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;EACxC,SAAS,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,WAAW,GAAG,WAAW,KAAK,CAAC;EAC5F,OAAO,QAAQ,KAAK,EAAE,UAAU,KAAK,CAAC;CACxC,CAAC;CACD,IAAI,KAAKA,kBAAO,YAAY,MAAM,OAAO,YAAY;EACnD,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;EACxC,SAAS,MAAM,KAAK,OAAO,OAAO,CAAC;EACnC,OAAO,QAAQ,KAAK,EAAE,UAAU,KAAK,CAAC;CACxC,CAAC;CACD,IAAI,IAAIA,kBAAO,eAAe,OAAO,YAAY,QAAQ,KAAK,SAAS,SAAS,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;CAC5G,IAAI,KAAKA,kBAAO,aAAa,MAAM,OAAO,YAAY;EACpD,MAAM,QAAQC,4BAAAA,wBAAwB,MAAM,QAAQ,IAAI,IAAI,KAAK,CAAC;EAClE,OAAO,QAAQ,KAAK,MAAM,SAAS,OAAO,OAAO,QAAQ,IAAI,IAAI,MAAM,CAAC;CAC1E,CAAC;CACD,OAAO;AACT;;;ACpEA,MAAM,0BAAU,IAAI,IAA8B;CAAC;CAAmB;CAAO;CAAQ;AAAM,CAAC;AAE5F,SAAS,cACP,SACA,OACU;CACV,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;CAEzD,OAAO,QAAQ,KACb,EAAE,OAAO,QAAQ,GACjB,iBAAiBC,4BAAAA,wBAAwB,iBAAiBC,4BAAAA,wBAAwB,MAAM,SAAS,GACnG;AACF;AAEA,SAAS,cAAc,OAA0C;CAC/D,IAAI,OAAO,UAAU,YAAY,CAAC,QAAQ,IAAI,KAAiC,GAC7E,MAAM,IAAI,MAAM,iCAAiC;CACnD,OAAO;AACT;AAEA,SAAS,kBAAkB,OAAqC;CAC9D,IAAI,UAAU,KAAA,GAAW,OAAO,CAAC;CACjC,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAS,MAAM,IAAI,MAAM,yCAAyC;CAC9G,OAAO,MAAM,KAAK,cAAc;EAC9B,IACE,OAAO,cAAc,YACrB,cAAc,QACd,OAAQ,UAAsC,eAAe,YAC7D,OAAQ,UAAsC,gBAAgB,UAE9D,MAAM,IAAI,MAAM,mEAAmE;EAErF,OAAO;CACT,CAAC;AACH;AAEA,eAAe,OAAO,SAA4C;CAChE,MAAM,OAAQ,MAAM,QAAQ,KAAK;CACjC,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,IAAI,MAAM,4BAA4B;CAClH,OAAO;AACT;AAEA,SAAgB,wBAAwB,UAAoC,CAAC,GAAS;CACpF,MAAM,MAAM,IAAIC,KAAAA,KAAK;CACrB,MAAM,oBAA4B;EAChC,IAAI,QAAQ,QAAQ,KAAA,GAClB,MAAM,IAAIF,4BAAAA,qBAAqB,kDAAkD,GAAG;EACtF,OAAO,QAAQ;CACjB;CAEA,IAAI,IAAIG,kBAAO,KAAK,MAAM,OAAO,YAAY;EAC3C,IAAI;GACF,MAAM,SAAS,MAAM,gBACnB,YAAY,GACZ,QAAQ,IAAI,MAAM,MAAM,GACxB,QAAQ,WACR,QAAQ,WACV;GACA,MAAM,QAAQ,MAAM,WAAW,QAAQ,QAAQ,eAAe;GAC9D,OAAO,IAAI,SAAS,OAAkC,EACpD,SAAS;IACP,iBAAA,GAAgBC,gBAAAA,YAAAA,CAAY,OAAO,IAAI,KAAK;IAC5C,kBAAkB,OAAO,MAAM,UAAU;IACzC,iBAAiBC,4BAAAA,SAAS,KAAK;IAC/B,iBAAiB;GACnB,EACF,CAAC;EACH,SAAS,OAAO;GACd,OAAO,cAAc,SAAS,KAAK;EACrC;CACF,CAAC;CAED,IAAI,IAAIF,kBAAO,UAAU,MAAM,OAAO,YAAY;EAChD,IAAI;GACF,MAAM,YAAY,QAAQ,IAAI,MAAM,MAAM;GAC1C,MAAM,SAAS,MAAM,gBAAgB,YAAY,GAAG,WAAW,QAAQ,WAAW,QAAQ,WAAW;GACrG,IAAI,OAAO,SAAS,YAAY,MAAM,IAAIH,4BAAAA,qBAAqB,4BAA4B,GAAG;GAC9F,MAAM,iBAAiB,QAAQ,IAAI,OAAO,mBAAmB;GAC7D,IAAI,mBAAmB,KAAA,KAAa,CAAC,iBAAiB,KAAK,cAAc,GACvE,MAAM,IAAIA,4BAAAA,qBAAqB,kCAAkC,GAAG;GACtE,MAAM,SAAuB,CAAC;GAC9B,IAAI,SAAS;GACb,MAAM,SAAS,QAAQ,IAAI,IAAI,MAAM,UAAU;GAC/C,IAAI,WAAW,KAAA,GACb,IAAI;IACF,OAAO,MAAM;KACX,MAAM,OAAO,MAAM,OAAO,KAAK;KAC/B,IAAI,KAAK,MAAM;KACf,UAAU,KAAK,MAAM;KACrB,IAAI,SAAA,UAAoC;MACtC,MAAM,OAAO,OAAO;MACpB,MAAM,IAAIA,4BAAAA,qBAAqB,gCAAgC,GAAG;KACpE;KACA,OAAO,KAAK,KAAK,KAAK;IACxB;GACF,UAAU;IACR,OAAO,YAAY;GACrB;GAEF,MAAM,QAAQ,IAAI,WAAW,MAAM;GACnC,IAAI,SAAS;GACb,KAAK,MAAM,SAAS,QAAQ;IAC1B,MAAM,IAAI,OAAO,MAAM;IACvB,UAAU,MAAM;GAClB;GACA,MAAM,SAAS,OAAA,GAAMM,4BAAAA,qBAAAA,CAAqB;IACxC,MAAM,OAAO;IACb,cAAc;IACd;IACA;IACA,UAAU;IACV,QAAQ,QAAQ,IAAI,IAAI;GAC1B,CAAC;GACD,OAAO,IAAI,SAAS,MAAM;IAAE,QAAQ;IAAK,SAAS,EAAE,iBAAiB,OAAO;GAAE,CAAC;EACjF,SAAS,OAAO;GACd,OAAO,cAAc,SAAS,KAAK;EACrC;CACF,CAAC;CAED,IAAI,KAAKH,kBAAO,cAAc,MAAM,OAAO,YAAY;EACrD,IAAI;GACF,MAAM,OAAO,MAAM,OAAO,QAAQ,IAAI,GAAG;GACzC,IAAI,KAAK,WAAW,KAAA,KAAa,QAAQ,SAAS,KAAA,GAChD,OAAO,QAAQ,KACb,MAAM,QAAQ,KAAK,KAAK,MAAgB,QAAQ,IAAI,IAAI,QAAQ,KAAK,KAA2B,CAClG;GAEF,MAAM,QAAQ,MAAM,aAClB,YAAY,GACZ,KAAK,MACL,QAAQ,WACR,QAAQ,aACR,QAAQ,eACV;GACA,IAAI,KAAK,WAAW,KAAA,GAClB,OAAO,QAAQ,KAAK;IAAE,MAAM,KAAK;IAAgB,YAAY,MAAM;GAAW,CAAgC;GAEhH,OAAO,QAAQ,KACb,MAAMI,4BAAAA,wBAAwB,cAAc,KAAK,MAAM,GAAG,OAAO,KAAK,UAAiC,CACzG;EACF,SAAS,OAAO;GACd,OAAO,cAAc,SAAS,KAAK;EACrC;CACF,CAAC;CAED,IAAI,KAAKJ,kBAAO,mBAAmB,MAAM,OAAO,YAAY;EAC1D,IAAI;GACF,MAAM,OAAO,MAAM,OAAO,QAAQ,IAAI,GAAG;GACzC,MAAM,QAAQ,MAAM,aAClB,YAAY,GACZ,KAAK,MACL,QAAQ,WACR,QAAQ,aACR,QAAQ,eACV;GACA,OAAO,QAAQ,KACb,MAAMK,4BAAAA,4BACJ,cAAc,KAAK,MAAM,GACzB,OACA,kBAAkB,KAAK,UAAU,GACjC,KAAK,UACP,CACF;EACF,SAAS,OAAO;GACd,OAAO,cAAc,SAAS,KAAK;EACrC;CACF,CAAC;CAED,IAAI,KAAKL,kBAAO,mBAAmB,MAAM,OAAO,YAAY;EAC1D,IAAI;GACF,MAAM,OAAO,MAAM,OAAO,QAAQ,IAAI,GAAG;GACzC,IAAI,OAAO,KAAK,oBAAoB,UAAU,MAAM,IAAI,MAAM,wCAAwC;GACtG,MAAM,QAAQ,MAAM,aAClB,YAAY,GACZ,KAAK,MACL,QAAQ,WACR,QAAQ,aACR,QAAQ,eACV;GACA,MAAM,aAAa,MAAMM,4BAAAA,4BACvB,cAAc,KAAK,MAAM,GACzB,OACA,kBAAkB,KAAK,UAAU,GACjC,KAAK,iBACL,KAAK,UACP;GACA,OAAO,QAAQ,KAAK;IAClB,OAAO,OAAO,KAAK,WAAW,KAAK,CAAC,CAAC,SAAS,QAAQ;IACtD,UAAU;IACV,UAAU,WAAW;IACrB,cAAc,WAAW;GAC3B,CAAC;EACH,SAAS,OAAO;GACd,OAAO,cAAc,SAAS,KAAK;EACrC;CACF,CAAC;CACD,OAAO;AACT;;;ACvNA,MAAM,uBAA6D;CAAE,YAAY;CAAY,iBAAiB;AAAE;AAChH,MAAM,qBACJC,4BAAAA,wBAAwB;CACtB,KAAK,KAAK;CACV,YAAYC,YAAAA;CACZ,gBAAgB,UAAU,SAAS;EACjC,MAAM,QAAQ,WAAW,UAAU,OAAO;EAC1C,MAAM,QAAQ;EACd,aAAa,aAAa,KAAK;CACjC;AACF,CAAC;AAEH,SAAgB,gBAAgB,UAA4B,CAAC,GAAS;CACpE,IAAI,QAAQ,QAAQ,KAAA,GAAW,MAAM,IAAI,MAAM,gDAAgD;CAC/F,MAAM,MAAM,IAAIC,KAAAA,KAAK;CACrB,MAAM,WACJ,QAAQ,YACR,2BACE,QAAQ,KACR,cACA,QAAQ,WACR,QAAQ,aACR,QAAQ,eACV;CACF,IAAI,IAAIC,kBAAO,MAAM,OAAO,YAC1B,QAAQ,KAAK;EACX,WAAW,QAAQ,aAAa;EAChC,IAAI,QAAQ,aAAa,cAAA,CAAe;CAC1C,CAA6B,CAC/B;CACA,IAAI,MAAM,KAAK,sBAAsB,QAAQ,CAAC;CAC9C,IAAI,MACF,KACA,wBAAwB;EACtB,GAAI,QAAQ,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI;EACxD,GAAI,QAAQ,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;EAC1E,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;EAChF,iBAAiB,QAAQ;EACzB,OAAO,MAAM,QAAQ,UAAU,SAAS,KAAK,MAAM,QAAQ,KAAK;CAClE,CAAC,CACH;CACA,OAAO;AACT;AAEA,MAAa,MAAa;CACxB,UAAU;CACV,MAAM,SAAqC;EAEzC,IAAI,QAAQ,QAAQ,KAAA,GAAW,MAAM,IAAI,MAAM,gDAAgD;EAC/F,MAAM,WAAW,2BAA2B,QAAQ,KAAK,cAAc,QAAQ,WAAW,QAAQ,WAAW;EAC7G,MAAM,MAAM,gBAAgB;GAC1B,GAAI,QAAQ,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;GAC1E,KAAK,QAAQ;GACb,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;GAChF;EACF,CAAC;EACD,OAAO;GAAE,QAAQ,YAAY,IAAI,MAAM,OAAO;GAAG,aAAa,SAAS,QAAQ;EAAE;CACnF;AACF;;AAGA,SAAgB,uBACd,KACA,WACA,aAEA,iBACA,iBACwC;CACxC,MAAM,WAAW,2BAA2B,KAAK,cAAc,WAAW,aAAa,eAAe;CACtG,IAAI,oBAAoB,KAAA,GAAW;EACjC,SAAS,eAAe,gBAAgB,SAAS,aAAa,CAAC,CAAC;EAChE,gBAAgB,CAAC,CAAC;CACpB;CACA,OAAO;EACL,SAAS;GACP,OAAO,MAAM,QAAQ,UAAU,SAAS,KAAK,MAAM,QAAQ,KAAK;GAChE,MAAM,SAAS,QAAQ,OAAO;IAC5B,QAAQ,eAAe;IACvB,OAAO,SAAS,SAAS,KAAK;GAChC;GACA,UAAU,OAAO,WAAW,SAAS,OAAO,OAAO,MAAM;EAC3D;EACA,KAAK;GACH,UAAU;GACV,QAAQ;IACN,MAAM,MAAM,gBAAgB;KAAE;KAAK;KAAW;KAAa;KAAU;IAAgB,CAAC;IACtF,OAAO;KAAE,QAAQ,YAAY,IAAI,MAAM,OAAO;KAAG,aAAa,SAAS,QAAQ;IAAE;GACnF;EACF;CACF;AACF;;;ACzGA,IAAA,uBAAA,GAAeC,iCAAAA,WAAAA,EAAY,EAAE,OAAO,MAAM,SAAS,aAAoC;CACrF,MAAM,EAAE,aAAa,iBAAiB,KAAK;CAC3C,IAAI,SAAS,gBAAgB,KAAA,GAAW,MAAM,IAAI,MAAM,kDAAkD;CAC1G,MAAM,mBAA+C,cAAc,SACjE,CAAC,OAAO,WAAW,QAAQ,IAAIC,uBAAAA,iBAAiB,CAAC,EAAE,gBAAgB,cAAc,IAAI,MAAM;CAC7F,MAAM,MAAM,OAAO,QAAQ,OAAO,KAAK,QAAQ;CAC/C,MAAM,YAAY,OAAO,QAAQ,aAAa,KAAK,QAAQ;CAC3D,MAAM,UACJ,OAAO,aAAa,cAChB,uBACE,KACA,WACA,cACC,aAAa,cAAc,QAAQ,qBAAqB,WAAW,EAAE,SAAS,CAAC,GAChF,eACF,IACA,KAAA;CACN,MAAM,kBAAkB,OAAO,QAAQ,UAAU,QAAQ,iBAAiB,CAAC,EAAA,CAAG,SAASC,4BAAAA,gBAAgB,WAAW,EAAE;CACpH,MAAM,OAAO,QACTA,4BAAAA,gBAAgB,YAAY;EAC1B;EACA,cAAc;EACd,MAAM,UAAU,SAAS;GACvB,MAAM,SAAS,MAAM,QAAQ,UAAU,QAAQ,iBAAiB,CAAC,EAAA,CAAG,QACjE,OAAO,OAAOA,4BAAAA,gBAAgB,WAAW,EAC5C;GACA,MAAM,MAAM,gBAAgB;IAC1B,MAAM;IACN,KAAK;IACL,QAAQ,UAAU,CAAC,GAAG,OAAOA,4BAAAA,gBAAgB,WAAW,EAAE,IAAI;GAChE,CAAC;EACH;CACF,CAAC,IACD,KAAA;CACJ,IAAI,WAAW;CACf,MAAM,UAAUC,4BAAAA,oBAAoB,SAAS,OAAO;CACpD,MAAM,oBAAoB;EACxB,OAAO,eAAe;EACtB,IAAI,UAAU,MAAM,IAAI,MAAM,6BAA6B;CAC7D;CACA,MAAM,wBAAwB;EAC5B,YAAY;EACZ,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,4BAA4B;CAC/D;CACA,MAAM,kBAAkB,YAAqB;EAC3C,IAAI,CAAC,OAAO;EAEZ,MAAM,YAAY,sBAAsB,SAAS,MAAM,QAAQ,WAAW,WAAW;EACrF,QAAQ,OAAO,CAACC,4BAAAA,mBAAmB,IAAI,WAAW;GAChD,MAAM,gBAAA,GAAeC,4BAAAA,eAAAA,CAAe,MAAM,CAAC,EAAE,SAAS,wBAAwB,SAAS;GACvF,aAAa,cAAc,QAAQ;EACrC,CAAC;CACH;CACA,OAAO;EACL,iBAAiB;GACf,WAAW;EACb;EACA,OAAO;GACL,KAAK,SAAS,OAAO;GACrB;GAEA;GACA,SAAS,KAAA;EACX;EACA,UAAU,CAAC,GAAI,OAAO,EAAA,GAACC,yBAAAA,iBAAAA,CAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAI,cAAc;CACxE;AACF,CAAC;;;;;;;;;;ACnDD,MAAM,eAA2F;CAC/F,UAAUC,kBAAO,eAAe;CAChC,SAASA,kBAAO,cAAc;CAC9B,QAAQA,kBAAO,aAAa;CAC5B,WAAWA,kBAAO,gBAAgB;AACpC;AAWA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,eAAe,OAAkD;CACxE,IACE,CAAC,SAAS,KAAK,KACf,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,UAAU,YACvB,CAACC,4BAAAA,qBAAqB,KAAK,MAAM,KAAK,GAEtC,OAAO,KAAA;CACT,IAAI,CAAC;EAAC;EAAY;EAAW;EAAW;EAAU;CAAW,CAAC,CAAC,SAAS,MAAM,IAAI,GAAG,OAAO,KAAA;CAC5F,OAAO;AACT;;AAGA,SAAS,aAAa,OAAgD;CACpE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,SAAS,SAAA,IACvE,OAAO,KAAA;CACT,MAAM,WAA+B,CAAC;CACtC,KAAK,MAAM,SAAS,MAAM,UAAuB;EAC/C,IACE,CAAC,SAAS,KAAK,KACf,OAAO,MAAM,UAAU,YACvB,CAACA,4BAAAA,qBAAqB,KAAK,MAAM,KAAK,KACtC,OAAO,MAAM,SAAS,YACtB,MAAM,SAAS,IAEf,OAAO,KAAA;EACT,SAAS,KAAK;GAAE,OAAO,MAAM;GAAO,MAAM,MAAM;EAAK,CAAC;CACxD;CACA,OAAO;AACT;AAEA,eAAe,gBAAgB,UAA+C;CAC5E,MAAM,QAAS,MAAM,SAAS,KAAK;CACnC,IAAI,SAAS,IAAI,OAAO;CAGxB,OAAO;EAAE,MAAM;EAAY,QADzB,SAAS,KAAK,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,sBAAsB,SAAS;CAClE;AACpC;AAEA,SAAgB,sBAAoC;CAClD,MAAM,2BAAW,IAAI,IAAqB;CAC1C,IAAI;CACJ,IAAI,SAAS;CACb,MAAM,SAAS,WAAmB,cAAsB,UACtD,GAAG,UAAU,IAAI,aAAa,IAAI;CACpC,MAAM,OAAO,OAAO,OAA0B,MAAc,OAAgC,WAC1F,MAAM,KAAM,kBAAkB,OAAO;EACnC,UAAU;EACV;EACA,QAAQ;EACR,MAAM,KAAK,UAAU,KAAK;EAC1B,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;CAC3C,CAAC;CAGH,IAAI,WAAW;CACf,MAAM,WAAW,SAAkB,YACjC,MAAM,sBAAsB,QAAQ,cAAc,QAAQ,MAAM,WAAW;EACzE,GAAG;EACH,OAAO,QAAQ;EACf,KAAK,EAAE;CACT,CAAC,KAAK;CAER,MAAM,OAAO,OAAO,YAAoC;EACtD,QAAQ,MAAM,MAAM;EACpB,MAAM,aAAa,IAAI,gBAAgB;EACvC,QAAQ,OAAO;EACf,OAAO,CAAC,UAAU,SAAS,IAAI,MAAM,QAAQ,MAAM,WAAW,QAAQ,cAAc,QAAQ,KAAK,CAAC,MAAM,SACtG,IAAI;GAYF,MAAM,UAAU,MAAM,gBAAgB,MAXf,KACrB,QAAQ,OACRD,kBAAO,WAAW,MAClB;IACE,OAAO,QAAQ;IACf,WAAW,QAAQ;IACnB,YAAY,QAAQ;IACpB,YAAY,QAAQ;GACtB,GACA,WAAW,MACb,CAC8C;GAC9C,IAAI,WAAW,OAAO,SAAS;GAC/B,IAAI,CAAC,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,YAAY;EACjE,SAAS,OAAO;GACd,IAAI,CAAC,WAAW,OAAO,SAAS,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;GACrG;EACF;EAEF,IAAI,QAAQ,SAAS,YAAY,QAAQ,OAAO,KAAA;CAClD;CA6HA,OAAO;EA1HL,WAAW;EACX,WAAW;EACX,4BAA4B;EAC5B,MAAM,aAAa;GACjB,OAAO;GAEP,MAAM,yBAAS,IAAI,IAAmC;GACtD,MAAM,gCAAgB,IAAI,IAAwB;GAmDlD,OAAO;IAjDL,aAAa,UAAU,OAAO,IAAI,MAAM,SAAS;IACjD,aAAa,OAAO;KAClB,cAAc,IAAI,MAAM,SAAS,CAAC,GAAG;KACrC,OAAO,OAAO,MAAM,SAAS;KAC7B,MAAM,cAAc,YAAY,aAAa,UAC3C,qBACA,MAAM,YACL,YAAY;MACX,MAAM,WAAW,aAAa,OAAO;MACrC,IAAI,aAAa,KAAA,GAAW;MAC5B,MAAM,UAAiC;OAAE,MAAM;OAAY;MAAS;MACpE,OAAO,IAAI,MAAM,WAAW,OAAO;MACnC,YAAY,QAAQ,MAAM,WAAW,OAAO;KAC9C,GACA,EAAE,cAAc,KAAK,CACvB;KACA,cAAc,IAAI,MAAM,WAAW,WAAW;IAChD;IACA,eAAe,WAAW;KACxB,cAAc,IAAI,SAAS,CAAC,GAAG;KAC/B,cAAc,OAAO,SAAS;KAC9B,OAAO,OAAO,SAAS;KACvB,KAAK,MAAM,CAAC,KAAK,YAAY,UAAU;MACrC,IAAI,QAAQ,MAAM,cAAc,WAAW;MAC3C,QAAQ,MAAM,MAAM;MACpB,SAAS,OAAO,GAAG;MACnB,KAAU,QAAQ,OAAOA,kBAAO,iBAAiB,MAAM;OACrD,OAAO,QAAQ;OACf,WAAW,QAAQ;OACnB,YAAY,QAAQ;MACtB,CAAC,CAAC,CAAC,OAAO,UAAmB,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;KACrG;IACF;IACA,QAAQ;KACN,SAAS;KACT,KAAK,MAAM,eAAe,cAAc,OAAO,GAAG,YAAY;KAC9D,cAAc,MAAM;KACpB,OAAO,MAAM;KACb,KAAK,MAAM,WAAW,SAAS,OAAO,GAAG;MACvC,QAAQ,MAAM,MAAM;MACpB,KAAU,QAAQ,OAAOA,kBAAO,iBAAiB,MAAM;OACrD,OAAO,QAAQ;OACf,WAAW,QAAQ;OACnB,YAAY,QAAQ;MACtB,CAAC,CAAC,CAAC,OAAO,UAAmB,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;KACrG;KACA,SAAS,MAAM;IACjB;GAEU;EACd;EACA,QAAQ,OAAO,SAAS,YAAY;GAClC,MAAM,UAAU,eAAe,OAAO;GACtC,IAAI,YAAY,KAAA,KAAa,SAAS,KAAA,KAAa,QAAQ;GAC3D,CAAM,YAAY;IAChB,MAAM,MAAM,MAAM,MAAM,WAAW,WAAW,cAAc,QAAQ,KAAK;IACzE,MAAM,WAAW,SAAS,IAAI,GAAG;IACjC,IAAI,QAAQ,SAAS,WAAW;KAC9B,IAAI,aAAa,KAAA,KAAa,SAAS,eAAe,QAAQ,YAAY;KAC1E,SAAS,MAAM,MAAM;KACrB,SAAS,OAAO,GAAG;KACnB,MAAM,KAAK,OAAOA,kBAAO,iBAAiB,MAAM;MAC9C,OAAO,QAAQ;MACf,WAAW,WAAW;MACtB,YAAY,QAAQ;KACtB,CAAC;KACD;IACF;IACA,MAAM,QAAQ,aAAa,QAAQ;IAEnC,MAAM,QAAQ,MAAM,gBAAgB,MADb,KAAK,OAAO,OAAO;KAAE,GAAG;KAAS,WAAW,WAAW;IAAa,CAAC,CAChD;IAC5C,IAAI,MAAM,SAAS,YAAY;KAC7B,MAAM,UAAU,SAAS,IAAI,GAAG;KAChC,IAAI,SAAS,eAAe,MAAM,cAAc,QAAQ,eAAe,MAAM,YAAY;MACvF,QAAQ,SAAS,KAAK;MACtB,IAAI,QAAQ,SAAS,KAAA,GAAW,KAAU,OAAO;MACjD;KACF;KACA,MAAM,UAAmB;MACvB,OAAO,QAAQ;MACf;MACA,cAAc,WAAW;MACzB,YAAY,MAAM;MAClB,YAAY,MAAM;KACpB;KACA,SAAS,MAAM,MAAM;KACrB,SAAS,IAAI,KAAK,OAAO;KACzB,QAAQ,SAAS,KAAK;KACtB,KAAU,OAAO;IACnB,OAAO,IAAI,MAAM,SAAS,YAAY;KACpC,IAAI,aAAa,KAAA,GAAW,QAAQ,UAAU,KAAK;UAEjD,MAAM,sBAAsB,WAAW,cAAc,MAAM,WAAW;MACpE,GAAG;MACH,OAAO,QAAQ;MACf,KAAK,EAAE;KACT,CAAC;IACL;GACF,EAAA,CAAG,CAAC,CAAC,OAAO,UAAmB,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;EACvG;EACA,aAAa,YAAoC;GAC/C,KAAK,MAAM,CAAC,KAAK,YAAY,UAAU;IACrC,IAAI,QAAQ,iBAAiB,WAAW,cAAc;IACtD,QAAQ,MAAM,MAAM;IACpB,SAAS,OAAO,GAAG;IACnB,KAAU,QAAQ,OAAOA,kBAAO,iBAAiB,MAAM;KACrD,OAAO,QAAQ;KACf,WAAW,QAAQ;KACnB,YAAY,QAAQ;IACtB,CAAC,CAAC,CAAC,OAAO,UAAmB,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;GACrG;EACF;CAEW;AACf;;;ACnQA,IAAA,gCAAA,GAAeE,iCAAAA,cAAAA,CAAc,mBAAmB;;;ACChD,SAAgB,yBAAyB,OAA+B,MAA2B;CACjG,QAAA,GAAOC,gCAAAA,mBAAAA,CAAmBC,qBAAAA,mBAAmB,KAAK,IAAI,EAAE,WAAW,WAAW,WAAW;EACvF,IAAI,CAAC,OAAO,cAAc,MAAM,IAAI,MAAM,6DAA6D;EACvG,IAAI,CAAC,KAAK,QAAQ,iBAAiB,WAAA,iBAA8B,SAAS,OAAO,YAAY,GAC3F,MAAM,IAAI,MAAM,8CAA8C;EAChE,OAAO,CAAC;CACV,CAAC;AACH;;;ACPA,IAAA,yBAAA,GAAeC,iCAAAA,aAAAA,EAAc,EAAE,WAC7B,KAAK,UAAU,YACX,EAAE,iBAAiB,EAAE,eAAe,KAAA,EAAU,GAAG,IACjD,yBAAyB,KAAK,OAAO,IAAI,CAC/C;;;ACJA,IAAA,wBAAA,GAAeC,iCAAAA,YAAAA,EAAa,YAAgE,QAAQ,KAAK,GAAG;;;ACA5G,IAAA,yBAAA,GAAeC,iCAAAA,cAAAA,EAAqB,YAClCC,4BAAAA,oBAAoB,QAAQ,KAAK,OAAO,CAC1C;;;ACHA,IAAA,qCAAA,GAAeC,iCAAAA,WAAAA,CAAiC;CAC9C,MAAM;EAAE,OAAO,EAAE,cAAc,SAAS;EAAG,aAAa;GAAE,MAAM;GAAS,MAAM;EAAS;CAAE;CAC1F,OAAO;CACP,OAAO,OAAO;EAEZ,OAAO,EAAE,cAAc,GADF,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe,GAC5C,MAAMC,4BAAAA,kBAAkB,KAAK,EAAE;CACxE;AACF,CAAC;;;ACRD,MAAM,YAAY;AAElB,IAAA,yCAAA,GAAeC,iCAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aACE;CACF,MAAM;CACN,QAAQ;CACR,OAAA,GAAMC,gCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,SAAS;CACpD,aAAA,GAAYC,gCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,SAAS;AAC5D,CAAC;;;ACVD,IAAA,gCAAA,GAAeC,iCAAAA,eAAAA,CAAe;CAC5B,MAAM;EAAE,OAAO,EAAE,cAAc,SAAS;EAAG,aAAa;GAAE,MAAM;GAAkB,MAAM;EAAS;CAAE;CACnG,MAAM;CACN,aAAa;CACb,MAAM;CACN,OAAA,GAAMC,gCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,oCAAoC;CAC/E,aAAA,GAAYC,gCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,oCAAoC;AACvF,CAAC;;;ACND,IAAA,wCAAA,GAAeC,iCAAAA,WAAAA,EAAY,aAAgD;CACzE,GAAGC,4BAAAA,kBAAkB,QAAQ,KAAK,SAAS,QAAQ,KAAK,eAAe,CAAC,CAAC;CACzE,MAAMC,4BAAAA;AACR,EAAE;;;ACHF,IAAA,sCAAA,GAAeC,iCAAAA,WAAAA,EAAY,aAAgD;CACzE,GAAGC,4BAAAA,kBAAkB,QAAQ,KAAK,SAAS,QAAQ,KAAK,eAAe,CAAC,CAAC;CACzE,MAAMC,4BAAAA;AACR,EAAE;;;ACHF,IAAA,mCAAA,GAAeC,iCAAAA,WAAAA,EAAY,aAAgD;CACzE,GAAGC,4BAAAA,kBAAkB,QAAQ,KAAK,SAAS,QAAQ,KAAK,eAAe,CAAC,CAAC;CACzE,MAAMC,4BAAAA;AACR,EAAE;;;ACWF,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;;AAEpE,MAAM,WAAc,WAClB,OAAO,QAAQ,UAAsB,UAAU,KAAA,CAAS;AAC1D,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,gBAAA,GAAeC,gCAAAA,mBAAAA,CAAmB;CAC7C,MAAM;CACN,oBAAA,GAAmBC,gCAAAA,+BAAAA,CAA+BC,mBAAW;CAC7D,UAAA,GAASC,iCAAAA,mBAAAA,CAAmB,EAAE,SAAS,CAACD,mBAAW,EAAE,CAAC;CACtD,SAAS,aAAa;EACpB,IAAI,WAA8C;GAAE,OAAO,OAAO,IAAI,EAAE,WAAW,gBAAgB,GAAG,GAAGE,8BAAqB,OAAO,CAAC,CAAC;EAAG;EAC1I,IAAI,UAA4C;GAAE,OAAO,CAAC,GAAGC,uBAAc,OAAO,CAAC;EAAG;CACxF;CACA,YAAY,aAAa;EACvB,IAAI,WAA8C;GAAE,OAAO,QAAQ,CAAC,QAAQ,OAAO,QAAQ,IAAI,KAAA,UAAkB,IAAI,EAAE,WAAW,gBAAgB,GAAG,GAAGD,8BAAqB,OAAO,CAAC,CAAC,CAAC;EAAG;EAC1L,IAAI,UAA4C;GAAE,OAAO,CAAC,GAAGC,uBAAc,OAAO,CAAC;EAAG;CACxF;CACA,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAM,QAAQ,UAAU,WAAWH,qBAAa,OAAO;EAC5E,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,IAAA,GAAGI,iCAAAA,iBAAAA,CAAiB,YAAY;GAChC,IAAI,MAAoC;IAAE,OAAO,CAAC,GAAGC,sBAAU,cAAc,CAAC;GAAG;GACjF,IAAI,WAA8C;IAAE,OAAO,QAAQ,CAAC,QAAQ,OAAO,QAAQ,IAAI,KAAA,UAAkB,IAAI,EAAE,WAAW,gBAAgB,GAAG,GAAGH,8BAAqB,OAAO,CAAC,CAAC,CAAC;GAAG;GAC1L,IAAI,WAA8C;IAAE,OAAO,CAAC,IAAI,EAAE,MAAM,SAAS,GAAG,GAAGI,uBAAe,cAAc,CAAC,CAAC;GAAG;GACzH,IAAI,QAAwC;IAAE,OAAO,CAAC,IAAI,EAAE,OAAO,qBAAqB,GAAG,GAAGC,mCAAsB,cAAc,CAAC,CAAC;GAAG;GACvI,IAAI,UAA4C;IAAE,OAAO,CAAC,GAAGJ,uBAAc,OAAO,CAAC;GAAG;GACtF,IAAI,YAAgD;IAAE,OAAO,CAAC,GAAGK,uCAA6B,cAAc,GAAG,GAAGC,8BAAqB,cAAc,CAAC;GAAG;GACzJ,IAAI,QAAwC;IAAE,OAAO;KAAC,IAAI,EAAE,MAAM,wBAAwB,GAAG,GAAGC,sCAAyB,cAAc,CAAC;KAAG,IAAI,EAAE,MAAM,sBAAsB,GAAG,GAAGC,oCAAuB,cAAc,CAAC;KAAG,IAAI,EAAE,MAAM,mBAAmB,GAAG,GAAGC,iCAAoB,cAAc,CAAC;IAAC;GAAG;GACxS,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;GAC3C,IAAI,aAAkD;IAAE,OAAO,CAAC,GAAI,aAAa,cAAc,CAAC,CAAE;GAAG;EACvG;CACF;AACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["OPEN_AUTHORING_FILE_TOOL_NAME","parseOpenAuthoringFileInput","AUTHOR_DESCRIBE_TOOL_NAME","parseDescribeAuthorToolsInput","AUTHOR_USE_TOOL_NAME","parseUseAuthorToolInput","path","AUTHOR_ARTIFACT_PREFIX","DocumentRequestError","artifactRoot","fs","openArtifact","ArtifactAccessError","documentTooLarge","readArtifactBytes","constants","AUTHOR_ALIAS_PATTERN","AuthorBridgeError","path","defineApiRoutes","apiResponse","AuthorBridgeError","Hono","routes","parseUseAuthorToolInput","DocumentRequestError","RootBoundReplaceError","Hono","routes","getMimeType","digestOf","replaceRootBoundFile","parseStructuredDocument","preflightStructuredDocument","serializeStructuredDocument","createAuthorBridgeState","randomUUID","Hono","routes","defineRoot","ARTIFACTS_SERVICE","authorMinorMode","createAuthorCatalog","PO_CODEMODE_SERVICE","readPoCodemode","serverMinorModes","routes","AUTHOR_ALIAS_PATTERN","defineChannel","defineServerMethod","authorBridgeMethod","defineMethod","defineRoute","defineRoutedCommand","createAuthorCommand","defineHook","AUTHOR_GUIDANCE","defineResource","packageResourcePath","readPackageResource","defineResource","packageResourcePath","readPackageResource","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","channelAuthorWebmcp","methodBridge","composeRootHooks","apiRoute","commandAuthor","hookBeforeAgentStart","resourceCodemodeHowToAuthor","resourcePoUseAuthor","toolDescribeAuthorTools","toolOpenAuthoringFile","toolUseAuthorTools"],"sources":["../../src/services/webmcpNamespace/index.ts","../../src/types/webAuthor.ts","../../src/services/structuredDocuments/document.ts","../../src/services/authorCanvasRegistry/index.ts","../../src/types/apiRoutes.ts","../../src/types/authorApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorBridgeApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorDocumentApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorApi.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/services/webAuthorChannel/index.ts","../../src/extensions/(backend)/channel/author-webmcp.server.ts","../../src/services/authorBridgeMethod/index.ts","../../src/extensions/(backend)/method/bridge.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/author.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-author.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-use-author.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/describe-author-tools.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/open-authoring-file.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/use-author-tools.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\n\nimport { AUTHOR_DESCRIBE_TOOL_NAME, AUTHOR_USE_TOOL_NAME } from '../../constants/author';\nimport {\n parseDescribeAuthorToolsInput,\n parseOpenAuthoringFileInput,\n parseUseAuthorToolInput,\n} from '../../schemas/authorTools';\nimport { OPEN_AUTHORING_FILE_TOOL_NAME } from '../../types/author';\nimport type { AuthorCatalog } from '../authorCatalog/type';\n\n// ponytail: typed per-canvas members need a synchronous catalog reader and a shared schema converter in po-core.\nconst DECLARATIONS = `interface AuthorViewportCatalogSnapshot {\n catalogToken: string;\n tools: { name: string; label: string; description: string; inputSchema: Readonly<Record<string, unknown>> }[];\n canvases?: { alias: string; path: string; status: 'opening' | 'ready' | 'unavailable' }[];\n alias?: string;\n path?: string;\n status?: 'opening' | 'ready' | 'unavailable';\n nextStep?: string;\n}\ndeclare const webmcp: {\n /** Open or reuse a canvas for a relative repository file or a session artifact. The returned alias is canonical; its catalog may still be opening. */\n open(input: { path: string; alias?: string }): Promise<{ path: string; byteLength: number; alias?: string; status?: 'opening' | 'ready' | 'unavailable'; reused?: boolean }>;\n /** Ready canvases, or one canvas's tools and its catalog token. */\n describe(input?: { alias?: string }): Promise<AuthorViewportCatalogSnapshot>;\n /** Call one tool with an explicit current token. Await same-canvas calls sequentially. */\n call(input: { alias?: string; catalogToken: string; name: string; arguments: Record<string, unknown> }): Promise<unknown>;\n};`;\n\nfunction copy<T>(value: T): T {\n return value === undefined ? value : JSON.parse(JSON.stringify(value));\n}\n\nexport function createWebmcpNamespace(\n catalog: AuthorCatalog,\n sessionId: string,\n assertAvailable: () => void,\n): PoCodemodeNamespace {\n return {\n name: 'webmcp',\n summary:\n 'Author canvas WebMCP: open a file as a canvas, describe its catalog, then call one tool with its explicit token. Await same-canvas calls sequentially; structured errors remain data.',\n declarations: DECLARATIONS,\n bind(run) {\n if (run.sessionId !== sessionId) throw new Error('Author WebMCP namespace belongs to another session.');\n let disposed = false;\n run.onDispose(() => {\n disposed = true;\n });\n const check = () => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('Author WebMCP run is disposed.');\n assertAvailable();\n };\n // Every call is reported to exec, which draws it with the matching Author tool card.\n const recorded = async <T>(\n member: string,\n tool: string,\n input: unknown,\n work: () => Promise<{ details: unknown; value: T }>,\n ): Promise<T> => {\n const started = Date.now();\n let args: Record<string, unknown> = {};\n try {\n if (typeof input === 'object' && input !== null && !Array.isArray(input))\n args = copy(input as Record<string, unknown>);\n } catch {\n // Arguments that are not JSON stay out of the record; the call still validates them.\n }\n const base = { name: `webmcp.${member}`, tool, args };\n let outcome: { details: unknown; value: T };\n try {\n outcome = await work();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n run.record?.({\n ...base,\n ok: false,\n ms: Date.now() - started,\n error: message,\n result: { content: [{ type: 'text', text: message }] },\n });\n throw error;\n }\n run.record?.({\n ...base,\n ok: true,\n ms: Date.now() - started,\n result: {\n content: [{ type: 'text', text: JSON.stringify(outcome.details ?? null, null, 2) }],\n details: outcome.details,\n },\n });\n return outcome.value;\n };\n const members: Record<string, unknown> = Object.create(null);\n members.open = (input: unknown) =>\n recorded('open', OPEN_AUTHORING_FILE_TOOL_NAME, input, async () => {\n check();\n const { path, alias } = parseOpenAuthoringFileInput(copy(input));\n const result = copy(await catalog.open(path, run.signal, alias));\n check();\n return { details: result, value: result };\n });\n members.describe = (input?: unknown) =>\n recorded('describe', AUTHOR_DESCRIBE_TOOL_NAME, input, async () => {\n check();\n const { alias } = parseDescribeAuthorToolsInput(copy(input === undefined ? {} : input));\n const result = copy(await catalog.describe(run.signal, alias));\n check();\n return { details: result, value: result };\n });\n members.call = (input: unknown) =>\n recorded('call', AUTHOR_USE_TOOL_NAME, input, async () => {\n check();\n const parsed = parseUseAuthorToolInput(copy(input));\n const result = copy(await catalog.execute(parsed, run.signal));\n check();\n // The direct tool shows the whole execution; the script gets only the canvas tool's answer.\n return { details: result, value: result.result };\n });\n return members;\n },\n };\n}\n","import type { AuthorViewportCapabilityDescriptor } from './author';\n\nexport const authorChannelType = 'author_webmcp';\n\nexport interface AuthorRegisterMessage {\n alias: string;\n kind: 'register';\n generation: number;\n}\n\nexport interface AuthorReleaseMessage {\n alias: string;\n kind: 'release';\n generation: number;\n}\nexport interface AuthorCatalogMessage {\n alias: string;\n kind: 'catalog';\n generation: number;\n ownerToken: string;\n tools: AuthorViewportCapabilityDescriptor[];\n}\n\nexport interface AuthorResultMessage {\n alias: string;\n kind: 'result';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n result: unknown;\n}\n\nexport interface AuthorCancelledMessage {\n alias: string;\n kind: 'cancelled';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport type AuthorBrowserMessage =\n | AuthorRegisterMessage\n | AuthorReleaseMessage\n | AuthorCatalogMessage\n | AuthorResultMessage\n | AuthorCancelledMessage;\n\nexport interface AuthorAcceptedMessage {\n alias?: string;\n kind: 'accepted';\n generation: number;\n ownerToken: string;\n catalogToken?: string;\n leaseMs: number;\n}\n\nexport interface AuthorRequestMessage {\n alias?: string;\n kind: 'request';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface AuthorCancelMessage {\n alias?: string;\n kind: 'cancel';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport interface AuthorRejectedMessage {\n alias?: string;\n kind: 'rejected';\n reason: string;\n}\n\n/** Direct-event frame carrying a session's open canvases from the API to the channel. */\nexport const authorCanvasesFrame = 'author_canvases';\n\n/** Open canvases a conversation keeps; opening one more closes the least recently opened. */\nexport const AUTHOR_MAX_CANVASES = 32;\n\nexport interface AuthorOpenCanvas {\n alias: string;\n path: string;\n}\n\n/** Every canvas the server still has open, oldest first. Browsers keep one tab per entry. */\nexport interface AuthorCanvasesMessage {\n kind: 'canvases';\n canvases: AuthorOpenCanvas[];\n}\n\nexport type AuthorHubMessage =\n | AuthorAcceptedMessage\n | AuthorRequestMessage\n | AuthorCancelMessage\n | AuthorRejectedMessage\n | AuthorCanvasesMessage;\n\nexport interface AuthorWebView {\n activation: 'inactive' | 'active';\n capabilityCount: number;\n}\n","import { constants } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport {\n ArtifactAccessError,\n artifactRoot,\n openArtifact,\n readArtifactBytes,\n} from '@agimon-ai/po-artifact/artifactFiles';\n\nimport { AUTHOR_ARTIFACT_PREFIX } from '../../constants/author';\nimport { DocumentRequestError, documentTooLarge } from './common';\n\nexport const AUTHOR_DOCUMENT_MAX_BYTES = 25 * 1024 * 1024;\n\n/**\n * Where a requested document lives. `path` is the canonical form clients use;\n * `realPath` identifies the file so two spellings share one canvas.\n */\nexport type AuthorDocumentSource =\n | { kind: 'workspace'; path: string; realPath: string; root: string }\n | { kind: 'artifact'; path: string; realPath: string; root: string; relative: string };\n\nfunction inside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);\n}\n\n/**\n * The session artifact folder is the one place outside the working tree Author\n * may read. It is named either `artifact:<relative>` or by the absolute path the\n * agent's prompt gives; po-artifact's guarded open does the containment checks.\n */\nasync function resolveArtifact(\n requestedPath: string,\n sessionId: string | undefined,\n environment: Readonly<Record<string, string | undefined>> | undefined,\n) {\n const prefixed = requestedPath.startsWith(AUTHOR_ARTIFACT_PREFIX);\n if (sessionId === undefined || environment === undefined) {\n if (prefixed) throw new DocumentRequestError('Artifacts need a session.', 400);\n return undefined;\n }\n const root = artifactRoot(sessionId, environment);\n if (prefixed) return { root, relative: requestedPath.slice(AUTHOR_ARTIFACT_PREFIX.length) };\n if (!path.isAbsolute(requestedPath)) return undefined;\n const realRoot = await fs.realpath(root).catch(() => root);\n const base = [root, realRoot].find((candidate) => inside(candidate, requestedPath));\n if (base === undefined) return undefined;\n return { root, relative: path.relative(base, requestedPath).split(path.sep).join('/') };\n}\n\nexport async function resolveDocument(\n cwd: string,\n requestedPath: unknown,\n sessionId?: string,\n environment?: Readonly<Record<string, string | undefined>>,\n): Promise<AuthorDocumentSource> {\n if (typeof requestedPath !== 'string' || requestedPath.length === 0 || requestedPath.includes('\\0'))\n throw new Error('A relative document path is required.');\n const artifact = await resolveArtifact(requestedPath, sessionId, environment);\n if (artifact !== undefined) {\n const realRoot = await fs.realpath(artifact.root).catch(() => artifact.root);\n return {\n kind: 'artifact',\n path: `${AUTHOR_ARTIFACT_PREFIX}${artifact.relative}`,\n realPath: path.join(realRoot, artifact.relative),\n ...artifact,\n };\n }\n if (path.isAbsolute(requestedPath))\n throw new Error('A relative document path, or a file in the session artifact folder, is required.');\n const root = await fs.realpath(cwd);\n const candidate = path.resolve(root, requestedPath);\n if (candidate !== root && !candidate.startsWith(`${root}${path.sep}`))\n throw new DocumentRequestError('Document path is outside the working directory.', 403);\n const realCandidate = await fs.realpath(candidate);\n if (realCandidate !== root && !realCandidate.startsWith(`${root}${path.sep}`)) {\n throw new DocumentRequestError('Document path is outside the working directory.', 403);\n }\n // A session may store artifacts inside its cwd. Relative spellings must not turn them into writable workspace files.\n const containedArtifact = await resolveArtifact(realCandidate, sessionId, environment);\n if (containedArtifact !== undefined) {\n return {\n kind: 'artifact',\n path: `${AUTHOR_ARTIFACT_PREFIX}${containedArtifact.relative}`,\n realPath: realCandidate,\n ...containedArtifact,\n };\n }\n return {\n kind: 'workspace',\n root,\n path: path.relative(root, realCandidate).split(path.sep).join('/'),\n realPath: realCandidate,\n };\n}\n\nasync function readArtifact(\n root: string,\n relative: string,\n workflowVisible?: ArtifactWorkflowVisibility,\n): Promise<Uint8Array> {\n let file: Awaited<ReturnType<typeof openArtifact>>;\n try {\n file = await openArtifact(root, relative, workflowVisible);\n } catch (error) {\n if (error instanceof ArtifactAccessError) throw new DocumentRequestError(error.message, error.status);\n throw error;\n }\n try {\n if (file.stat.size > AUTHOR_DOCUMENT_MAX_BYTES)\n throw documentTooLarge(`Document exceeds the ${AUTHOR_DOCUMENT_MAX_BYTES} byte preview limit.`);\n return await readArtifactBytes(file.handle, file.stat.size);\n } finally {\n await file.handle.close();\n }\n}\n\nexport async function readSource(\n source: AuthorDocumentSource,\n workflowVisible?: ArtifactWorkflowVisibility,\n): Promise<Uint8Array> {\n if (source.kind === 'artifact') return await readArtifact(source.root, source.relative, workflowVisible);\n if (process.platform !== 'darwin' && process.platform !== 'linux')\n throw new DocumentRequestError('Secure document reads require macOS or Linux.', 403);\n // Darwin O_NOFOLLOW_ANY atomically rejects symlinks in every component.\n // Linux validates the opened descriptor's actual path, not a mutable path lookup.\n const noFollow = process.platform === 'darwin' ? 0x20000000 : constants.O_NOFOLLOW;\n const handle = await fs.open(source.realPath, constants.O_RDONLY | constants.O_NONBLOCK | noFollow);\n try {\n const stat = await handle.stat();\n const current = await fs.lstat(source.realPath);\n const realPath = await fs.realpath(process.platform === 'linux' ? `/proc/self/fd/${handle.fd}` : source.realPath);\n if (\n !stat.isFile() ||\n !current.isFile() ||\n stat.dev !== current.dev ||\n stat.ino !== current.ino ||\n !inside(source.root, realPath)\n )\n throw new DocumentRequestError('The document changed or is outside the working directory.', 403);\n if (stat.size > AUTHOR_DOCUMENT_MAX_BYTES)\n throw documentTooLarge(`Document exceeds the ${AUTHOR_DOCUMENT_MAX_BYTES} byte preview limit.`);\n return await readArtifactBytes(handle, stat.size);\n } finally {\n await handle.close();\n }\n}\n\nexport async function readDocument(\n cwd: string,\n requestedPath: unknown,\n sessionId?: string,\n environment?: Readonly<Record<string, string | undefined>>,\n workflowVisible?: ArtifactWorkflowVisibility,\n): Promise<Uint8Array> {\n return await readSource(await resolveDocument(cwd, requestedPath, sessionId, environment), workflowVisible);\n}\n","import path from 'node:path';\n\nimport type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\n\nimport { AuthorBridgeError, type AuthorBridgeState } from '../../models/authorBridgeState';\nimport { AUTHOR_ALIAS_PATTERN } from '../../schemas/authorTools';\nimport type {\n AuthorCanvasView,\n AuthorOpenFileResult,\n AuthorViewportCatalogSnapshot,\n UseAuthorToolInput,\n} from '../../types/author';\nimport { AUTHOR_MAX_CANVASES, type AuthorOpenCanvas } from '../../types/webAuthor';\nimport { readSource, resolveDocument } from '../structuredDocuments/document';\n\ninterface Canvas {\n alias: string;\n path: string;\n realPath: string;\n bridge: AuthorBridgeState;\n closed: boolean;\n readyOnce: boolean;\n}\n\nexport function createAuthorCanvasRegistry(\n cwd: string,\n createBridge: () => AuthorBridgeState,\n /** Admits the session's artifact folder beside the working tree. */\n sessionId?: string,\n environment?: Readonly<Record<string, string | undefined>>,\n workflowVisible?: ArtifactWorkflowVisibility,\n) {\n // Insertion order is recency order: a successful open moves its canvas to the end.\n const byAlias = new Map<string, Canvas>();\n const byPath = new Map<string, Canvas>();\n // ponytail: grows by one alias per eviction for the session's lifetime; cap it if sessions churn thousands of files.\n const retired = new Map<string, string>();\n const listeners = new Set<() => void>();\n const changed = () => {\n for (const listener of listeners) listener();\n };\n\n const select = (alias?: string): Canvas => {\n if (alias !== undefined) {\n if (!AUTHOR_ALIAS_PATTERN.test(alias)) throw new AuthorBridgeError('Invalid Author canvas alias.', 400);\n const canvas = byAlias.get(alias);\n const retiredPath = retired.get(alias);\n if (canvas === undefined && retiredPath !== undefined)\n throw new AuthorBridgeError(\n `Author canvas '${alias}' was closed to make room for newer canvases. Reopen ${retiredPath} with open_authoring_file.`,\n 404,\n );\n if (canvas === undefined)\n throw new AuthorBridgeError(\n `Unknown Author canvas '${alias}'. Call describe_author_tools({}) for available aliases.`,\n 404,\n );\n return canvas;\n }\n const canvases = [...byAlias.values()].filter((canvas) => !canvas.closed);\n if (canvases.length !== 1)\n throw new AuthorBridgeError('Specify a canvas alias. Call describe_author_tools({}) to list canvases.', 409);\n return canvases[0]!;\n };\n\n const view = (canvas: Canvas): AuthorCanvasView => {\n if (canvas.closed) return { alias: canvas.alias, path: canvas.path, status: 'unavailable' };\n try {\n canvas.bridge.describe();\n canvas.readyOnce = true;\n return { alias: canvas.alias, path: canvas.path, status: 'ready' };\n } catch {\n return { alias: canvas.alias, path: canvas.path, status: canvas.readyOnce ? 'unavailable' : 'opening' };\n }\n };\n\n return {\n async open(requestedPath: string, signal?: AbortSignal, requestedAlias?: string): Promise<AuthorOpenFileResult> {\n signal?.throwIfAborted();\n if (requestedAlias !== undefined && !AUTHOR_ALIAS_PATTERN.test(requestedAlias))\n throw new AuthorBridgeError('Invalid Author canvas alias.', 400);\n const source = await resolveDocument(cwd, requestedPath, sessionId, environment);\n const bytes = await readSource(source, workflowVisible);\n signal?.throwIfAborted();\n const { realPath, path: canonicalPath } = source;\n const occupied = requestedAlias === undefined ? undefined : byAlias.get(requestedAlias);\n if (occupied !== undefined && occupied.realPath !== realPath)\n throw new AuthorBridgeError(`Author canvas alias '${requestedAlias}' already names ${occupied.path}.`, 409);\n const existing = byPath.get(realPath);\n if (existing !== undefined) {\n if (existing.closed) existing.readyOnce = false;\n existing.closed = false;\n byAlias.delete(existing.alias);\n byAlias.set(existing.alias, existing);\n changed();\n return {\n path: existing.path,\n byteLength: bytes.byteLength,\n alias: existing.alias,\n status: view(existing).status,\n reused: true,\n };\n }\n if (byAlias.size >= AUTHOR_MAX_CANVASES) {\n const values = [...byAlias.values()];\n const reclaimed = values.find((canvas) => canvas.closed);\n const evicted = reclaimed ?? values[0]!;\n evicted.bridge.close();\n byAlias.delete(evicted.alias);\n byPath.delete(evicted.realPath);\n if (reclaimed === undefined) retired.set(evicted.alias, evicted.path);\n }\n const base =\n path\n .basename(realPath)\n .replace(/\\.[^.]*$/u, '')\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/gu, '-')\n .replace(/^[^a-z]+/u, 'canvas-')\n .slice(0, 48) || 'canvas';\n // An evicted file gets its old name back so the agent's alias keeps working.\n const revived = [...retired].find(([, retiredPath]) => retiredPath === canonicalPath)?.[0];\n if (revived !== undefined) retired.delete(revived);\n if (requestedAlias !== undefined) retired.delete(requestedAlias);\n let alias = requestedAlias ?? revived ?? base;\n for (let suffix = 2; byAlias.has(alias) || retired.has(alias); suffix++) alias = `${base.slice(0, 56)}-${suffix}`;\n const canvas: Canvas = {\n alias,\n path: canonicalPath,\n realPath,\n bridge: createBridge(),\n closed: false,\n readyOnce: false,\n };\n byAlias.set(alias, canvas);\n byPath.set(realPath, canvas);\n changed();\n return { path: canonicalPath, byteLength: bytes.byteLength, alias, status: 'opening', reused: false };\n },\n describe(alias?: string): AuthorViewportCatalogSnapshot {\n const canvases = [...byAlias.values()].map(view);\n const target =\n alias === undefined && canvases.filter((canvas) => canvas.status !== 'unavailable').length !== 1\n ? undefined\n : select(alias);\n if (target === undefined) {\n return {\n catalogToken: '',\n tools: [],\n canvases,\n nextStep: 'Open a file with open_authoring_file, then describe_author_tools({\"alias\":\"canvas-name\"}).',\n };\n }\n const status = view(target).status;\n const base = { alias: target.alias, path: target.path, status, canvases };\n if (status !== 'ready') {\n return {\n ...base,\n catalogToken: '',\n tools: [],\n nextStep:\n status === 'opening'\n ? `Wait for ${target.alias} to be ready, then call describe_author_tools({\"alias\":\"${target.alias}\"}).`\n : `Reopen ${target.path} with open_authoring_file({\"path\":\"${target.path}\",\"alias\":\"${target.alias}\"}).`,\n };\n }\n return { ...base, ...target.bridge.describe() };\n },\n invoke(input: UseAuthorToolInput, signal?: AbortSignal) {\n const target = select(input.alias);\n if (target.closed) throw new AuthorBridgeError(`Canvas '${target.alias}' is closed. Reopen its file.`, 503);\n return target.bridge.invoke(input, signal).then((result) => ({ ...result, alias: target.alias }));\n },\n bridge(alias: string): AuthorBridgeState {\n const canvas = select(alias);\n if (canvas.closed) throw new AuthorBridgeError(`Canvas '${alias}' is closed. Reopen its file.`, 503);\n return canvas.bridge;\n },\n close(alias: string): void {\n if (!byAlias.has(alias) && retired.has(alias)) return;\n const canvas = select(alias);\n canvas.closed = true;\n canvas.bridge.close();\n canvas.bridge = createBridge();\n changed();\n },\n /** Canvases still open, oldest first; a canvas whose browser disconnected still counts. */\n openCanvases(): AuthorOpenCanvas[] {\n return [...byAlias.values()]\n .filter((canvas) => !canvas.closed)\n .map((canvas) => ({ alias: canvas.alias, path: canvas.path }));\n },\n onChange(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n dispose(): void {\n for (const canvas of byAlias.values()) canvas.bridge.close();\n byAlias.clear();\n byPath.clear();\n },\n };\n}\n\nexport type AuthorCanvasRegistry = ReturnType<typeof createAuthorCanvasRegistry>;\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { AuthorOpenFileResult } from './author';\nimport type { AuthorSessionView } from './authorApi';\nimport type { DocumentPreflightReport, ParsedStructuredDocument } from './structuredDocuments';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/author/`, so the mount is\n * stated once, by the folder that creates it. The browser used to restate it:\n * `authorStateUrl` built one URL from `API_BASE_PATH` and the document helper\n * two files away spelled `author` out again as a literal, so the two could\n * disagree and nothing would say so.\n *\n * The order below is the order the three Hono apps register in: `/state` in\n * `authorApi`, the eight bridge routes in `authorBridgeApi`, the three document\n * routes in `authorDocumentApi`. A reviewer can read the two side by side.\n *\n * Response types are named only where a caller reads the body. The bridge\n * routes are called by the hub's author channel over `requestSessionApi`, which\n * has its own message vocabulary and never sees this client.\n */\nexport default defineApiRoutes({\n state: {\n method: 'GET',\n path: '/state',\n response: apiResponse<AuthorSessionView>(),\n },\n bridgeRegister: {\n method: 'POST',\n path: '/bridge/register',\n },\n bridgeCatalog: {\n method: 'POST',\n path: '/bridge/catalog',\n },\n /** Long-polls for the next capability request, so it settles when one arrives. */\n bridgeNext: {\n method: 'POST',\n path: '/bridge/next',\n },\n bridgeResult: {\n method: 'POST',\n path: '/bridge/result',\n },\n bridgeCancelled: {\n method: 'POST',\n path: '/bridge/cancelled',\n },\n bridgeDisconnect: {\n method: 'POST',\n path: '/bridge/disconnect',\n },\n bridgeClose: {\n method: 'POST',\n path: '/bridge/close',\n },\n bridgeDescribe: {\n method: 'GET',\n path: '/bridge/describe',\n query: ['alias'],\n },\n bridgeInvoke: {\n method: 'POST',\n path: '/bridge/invoke',\n },\n /**\n * Parses one structured document.\n *\n * Answers a byte-length summary instead when the request names no format,\n * which is the agent-side tool path; the page always names one.\n */\n documentsOpen: {\n method: 'POST',\n path: '/documents/open',\n query: ['session'],\n response: apiResponse<ParsedStructuredDocument | AuthorOpenFileResult>(),\n },\n documentsPreflight: {\n method: 'POST',\n path: '/documents/preflight',\n query: ['session'],\n response: apiResponse<DocumentPreflightReport>(),\n },\n documentsSerialize: {\n method: 'POST',\n path: '/documents/serialize',\n query: ['session'],\n response: apiResponse<{ bytes: string; encoding: string }>(),\n },\n /** Exact source bytes and conditional replacement, scoped to this Author session. */\n file: {\n method: 'GET',\n path: '/file',\n query: ['path'],\n raw: true,\n },\n fileWrite: {\n method: 'PUT',\n path: '/file',\n query: ['path'],\n raw: true,\n },\n});\n","import type { AuthorModeActivation } from './author';\n\n/**\n * The wire vocabulary this package's API shares with whatever calls it.\n *\n * Paths live in `./apiRoutes`, which the Hono apps register from and the\n * generated client addresses, so neither half can move alone. What stays here\n * is the mount segment the server registers under and the shape the state\n * route answers with.\n */\n\n/** Where a host mounts this package's API; the segment after /api/plugins/. */\nexport const API_BASE_PATH = 'author';\n\n/** Query parameter naming the session a document request belongs to. */\nexport const SESSION_QUERY_PARAM = 'session';\n\nexport interface AuthorSessionView {\n sessionId: string | null;\n activation: AuthorModeActivation;\n capabilityCount: number;\n}\n","import { Hono } from 'hono';\n\nimport { AuthorBridgeError } from '../../../../../../../models/authorBridgeState';\nimport { parseUseAuthorToolInput } from '../../../../../../../schemas/authorTools';\nimport type { AuthorCanvasRegistry } from '../../../../../../../services/authorCanvasRegistry';\nimport routes from '../../../../../../../types/apiRoutes';\nimport type { AuthorViewportCapabilityDescriptor } from '../../../../../../../types/author';\n\nfunction record(value: unknown): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n throw new AuthorBridgeError('Invalid request.', 400);\n return value as Record<string, unknown>;\n}\n\nfunction text(value: unknown, key: string): string {\n const result = record(value)[key];\n if (typeof result !== 'string' || result === '') throw new AuthorBridgeError(`Invalid ${key}.`, 400);\n return result;\n}\n\nfunction generation(value: unknown): number {\n const result = record(value).generation;\n if (!Number.isSafeInteger(result) || (result as number) < 0) throw new AuthorBridgeError('Invalid generation.', 400);\n return result as number;\n}\n\nasync function body(request: Request): Promise<Record<string, unknown>> {\n return record(await request.json());\n}\n\nexport function createAuthorBridgeApi(registry: AuthorCanvasRegistry): Hono {\n const app = new Hono();\n app.onError((error, context) =>\n context.json(\n { error: error instanceof Error ? error.message : String(error) },\n error instanceof AuthorBridgeError ? error.status : 500,\n ),\n );\n app.post(routes.bridgeRegister.path, async (context) => {\n const value = await body(context.req.raw);\n const alias = text(value, 'alias');\n return context.json({ ...registry.bridge(alias).register(text(value, 'bindingId'), generation(value)), alias });\n });\n app.post(routes.bridgeCatalog.path, async (context) => {\n const value = await body(context.req.raw);\n const tools = value.tools;\n if (!Array.isArray(tools)) throw new AuthorBridgeError('Invalid Author catalog.', 400);\n const alias = text(value, 'alias');\n return context.json({\n ...registry\n .bridge(alias)\n .catalog(\n text(value, 'bindingId'),\n generation(value),\n text(value, 'ownerToken'),\n tools as AuthorViewportCapabilityDescriptor[],\n ),\n alias,\n });\n });\n app.post(routes.bridgeNext.path, async (context) => {\n const value = await body(context.req.raw);\n const alias = text(value, 'alias');\n return context.json({\n ...(await registry\n .bridge(alias)\n .next(text(value, 'bindingId'), generation(value), text(value, 'ownerToken'), context.req.raw.signal)),\n alias,\n });\n });\n app.post(routes.bridgeResult.path, async (context) => {\n const value = await body(context.req.raw);\n registry\n .bridge(text(value, 'alias'))\n .result(\n text(value, 'bindingId'),\n generation(value),\n text(value, 'ownerToken'),\n text(value, 'catalogToken'),\n text(value, 'requestId'),\n value.result,\n );\n return context.json({ accepted: true });\n });\n app.post(routes.bridgeCancelled.path, async (context) => {\n const value = await body(context.req.raw);\n registry\n .bridge(text(value, 'alias'))\n .cancelled(\n text(value, 'bindingId'),\n generation(value),\n text(value, 'ownerToken'),\n text(value, 'catalogToken'),\n text(value, 'requestId'),\n );\n return context.json({ accepted: true });\n });\n app.post(routes.bridgeDisconnect.path, async (context) => {\n const value = await body(context.req.raw);\n registry.bridge(text(value, 'alias')).disconnect(text(value, 'bindingId'), generation(value));\n return context.json({ accepted: true });\n });\n app.post(routes.bridgeClose.path, async (context) => {\n const value = await body(context.req.raw);\n registry.close(text(value, 'alias'));\n return context.json({ accepted: true });\n });\n app.get(routes.bridgeDescribe.path, (context) => context.json(registry.describe(context.req.query('alias'))));\n app.post(routes.bridgeInvoke.path, async (context) => {\n const value = parseUseAuthorToolInput(await context.req.raw.json());\n return context.json(await registry.invoke(value, context.req.raw.signal));\n });\n return app;\n}\n","import type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport { replaceRootBoundFile, RootBoundReplaceError } from '@agimon-ai/po-core/platform';\nimport { Hono } from 'hono';\nimport { getMimeType } from 'hono/utils/mime';\n\nimport {\n parseStructuredDocument,\n preflightStructuredDocument,\n serializeStructuredDocument,\n} from '../../../../../../../services/structuredDocuments';\nimport { digestOf, DocumentRequestError } from '../../../../../../../services/structuredDocuments/common';\nimport {\n AUTHOR_DOCUMENT_MAX_BYTES,\n readDocument,\n readSource,\n resolveDocument,\n} from '../../../../../../../services/structuredDocuments/document';\nimport routes from '../../../../../../../types/apiRoutes';\nimport type { AuthorOpenFileResult } from '../../../../../../../types/author';\nimport type {\n CsvDialect,\n DocumentOperation,\n StructuredDocumentFormat,\n} from '../../../../../../../types/structuredDocuments';\n\nexport { AUTHOR_DOCUMENT_MAX_BYTES } from '../../../../../../../services/structuredDocuments/document';\n\ninterface DocumentRequest {\n path?: unknown;\n alias?: unknown;\n format?: unknown;\n operations?: unknown;\n preflightDigest?: unknown;\n csvDialect?: unknown;\n}\n\nexport interface AuthorDocumentApiOptions {\n cwd?: string;\n /** Admits the session's artifact folder beside the working tree. */\n sessionId?: string;\n environment?: Readonly<Record<string, string | undefined>>;\n workflowVisible?: ArtifactWorkflowVisibility;\n open?: (path: string, signal?: AbortSignal, alias?: string) => Promise<AuthorOpenFileResult>;\n}\n\nconst FORMATS = new Set<StructuredDocumentFormat>(['markdown-slides', 'csv', 'pptx', 'xlsx']);\n\nfunction errorResponse(\n context: { json: (value: unknown, status: 400 | 403 | 404 | 409 | 413 | 422 | 500) => Response },\n error: unknown,\n): Response {\n const message = error instanceof Error ? error.message : 'Document operation failed.';\n // A refusal names its own status; anything else is a request the document cannot satisfy.\n return context.json(\n { error: message },\n error instanceof DocumentRequestError || error instanceof RootBoundReplaceError ? error.status : 422,\n );\n}\n\nfunction requestFormat(value: unknown): StructuredDocumentFormat {\n if (typeof value !== 'string' || !FORMATS.has(value as StructuredDocumentFormat))\n throw new Error('A supported format is required.');\n return value as StructuredDocumentFormat;\n}\n\nfunction requestOperations(value: unknown): DocumentOperation[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.length > 100_000) throw new Error('A bounded operations array is required.');\n return value.map((operation) => {\n if (\n typeof operation !== 'object' ||\n operation === null ||\n typeof (operation as Record<string, unknown>).fragmentId !== 'string' ||\n typeof (operation as Record<string, unknown>).replacement !== 'string'\n ) {\n throw new Error('Each operation requires string fragmentId and replacement fields.');\n }\n return operation as DocumentOperation;\n });\n}\n\nasync function bodyOf(request: Request): Promise<DocumentRequest> {\n const body = (await request.json()) as unknown;\n if (typeof body !== 'object' || body === null || Array.isArray(body)) throw new Error('A JSON object is required.');\n return body as DocumentRequest;\n}\n\nexport function createAuthorDocumentApi(options: AuthorDocumentApiOptions = {}): Hono {\n const app = new Hono();\n const admittedCwd = (): string => {\n if (options.cwd === undefined)\n throw new DocumentRequestError('Author requires the session working directory.', 403);\n return options.cwd;\n };\n\n app.get(routes.file.path, async (context) => {\n try {\n const source = await resolveDocument(\n admittedCwd(),\n context.req.query('path'),\n options.sessionId,\n options.environment,\n );\n const bytes = await readSource(source, options.workflowVisible);\n return new Response(bytes as Uint8Array<ArrayBuffer>, {\n headers: {\n 'Content-Type': getMimeType(source.path) ?? 'application/octet-stream',\n 'Content-Length': String(bytes.byteLength),\n 'X-File-SHA256': digestOf(bytes),\n 'Cache-Control': 'no-store',\n },\n });\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.put(routes.fileWrite.path, async (context) => {\n try {\n const requested = context.req.query('path');\n const source = await resolveDocument(admittedCwd(), requested, options.sessionId, options.environment);\n if (source.kind === 'artifact') throw new DocumentRequestError('Artifacts are read-only.', 403);\n const expectedSha256 = context.req.header('X-Expected-SHA256');\n if (expectedSha256 === undefined || !/^[a-f0-9]{64}$/.test(expectedSha256))\n throw new DocumentRequestError('X-Expected-SHA256 is required.', 400);\n const chunks: Uint8Array[] = [];\n let length = 0;\n const reader = context.req.raw.body?.getReader();\n if (reader !== undefined) {\n try {\n while (true) {\n const part = await reader.read();\n if (part.done) break;\n length += part.value.byteLength;\n if (length > AUTHOR_DOCUMENT_MAX_BYTES) {\n await reader.cancel();\n throw new DocumentRequestError('File exceeds the save limit.', 413);\n }\n chunks.push(part.value);\n }\n } finally {\n reader.releaseLock();\n }\n }\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n const sha256 = await replaceRootBoundFile({\n root: source.root,\n relativePath: requested!,\n expectedSha256,\n bytes,\n maxBytes: AUTHOR_DOCUMENT_MAX_BYTES,\n signal: context.req.raw.signal,\n });\n return new Response(null, { status: 204, headers: { 'X-File-SHA256': sha256 } });\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.post(routes.documentsOpen.path, async (context) => {\n try {\n const body = await bodyOf(context.req.raw);\n if (body.format === undefined && options.open !== undefined) {\n return context.json(\n await options.open(body.path as string, context.req.raw.signal, body.alias as string | undefined),\n );\n }\n const bytes = await readDocument(\n admittedCwd(),\n body.path,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n if (body.format === undefined) {\n return context.json({ path: body.path as string, byteLength: bytes.byteLength } satisfies AuthorOpenFileResult);\n }\n return context.json(\n await parseStructuredDocument(requestFormat(body.format), bytes, body.csvDialect as Partial<CsvDialect>),\n );\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.post(routes.documentsPreflight.path, async (context) => {\n try {\n const body = await bodyOf(context.req.raw);\n const bytes = await readDocument(\n admittedCwd(),\n body.path,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n return context.json(\n await preflightStructuredDocument(\n requestFormat(body.format),\n bytes,\n requestOperations(body.operations),\n body.csvDialect as Partial<CsvDialect>,\n ),\n );\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n\n app.post(routes.documentsSerialize.path, async (context) => {\n try {\n const body = await bodyOf(context.req.raw);\n if (typeof body.preflightDigest !== 'string') throw new Error('A preflight report digest is required.');\n const bytes = await readDocument(\n admittedCwd(),\n body.path,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n const serialized = await serializeStructuredDocument(\n requestFormat(body.format),\n bytes,\n requestOperations(body.operations),\n body.preflightDigest,\n body.csvDialect as Partial<CsvDialect>,\n );\n return context.json({\n bytes: Buffer.from(serialized.bytes).toString('base64'),\n encoding: 'base64',\n manifest: serialized.manifest,\n operationLog: serialized.operationLog,\n });\n } catch (error) {\n return errorResponse(context, error);\n }\n });\n return app;\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport type { PoApi, PoApiContext, PoApiHandler } from '@agimon-ai/po-core/packageApi';\nimport { Hono } from 'hono';\n\nimport { createAuthorBridgeState, type AuthorBridgeState } from '../../../../../../../models/authorBridgeState';\nimport {\n createAuthorCanvasRegistry,\n type AuthorCanvasRegistry,\n} from '../../../../../../../services/authorCanvasRegistry';\nimport type { AuthorCatalog } from '../../../../../../../services/authorCatalog/type';\nimport routes from '../../../../../../../types/apiRoutes';\nimport { API_BASE_PATH, type AuthorSessionView } from '../../../../../../../types/authorApi';\nimport type { AuthorOpenCanvas } from '../../../../../../../types/webAuthor';\nimport { createAuthorBridgeApi } from './authorBridgeApi';\nimport { createAuthorDocumentApi } from './authorDocumentApi';\n\nexport interface AuthorApiOptions {\n sessionId?: string;\n cwd?: string;\n environment?: Readonly<Record<string, string | undefined>>;\n workflowVisible?: ArtifactWorkflowVisibility;\n readState?: () => Omit<AuthorSessionView, 'sessionId'>;\n registry?: AuthorCanvasRegistry;\n}\n\nconst inactiveState = (): Omit<AuthorSessionView, 'sessionId'> => ({ activation: 'inactive', capabilityCount: 0 });\nconst createBridge = (): AuthorBridgeState =>\n createAuthorBridgeState({\n now: Date.now,\n issueToken: randomUUID,\n scheduleTimeout(callback, delayMs) {\n const timer = setTimeout(callback, delayMs);\n timer.unref?.();\n return () => clearTimeout(timer);\n },\n });\n\nexport function createAuthorApi(options: AuthorApiOptions = {}): Hono {\n if (options.cwd === undefined) throw new Error('Author requires the session working directory.');\n const app = new Hono();\n const registry =\n options.registry ??\n createAuthorCanvasRegistry(\n options.cwd,\n createBridge,\n options.sessionId,\n options.environment,\n options.workflowVisible,\n );\n app.get(routes.state.path, (context) =>\n context.json({\n sessionId: options.sessionId ?? null,\n ...(options.readState ?? inactiveState)(),\n } satisfies AuthorSessionView),\n );\n app.route('/', createAuthorBridgeApi(registry));\n app.route(\n '/',\n createAuthorDocumentApi({\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n ...(options.sessionId === undefined ? {} : { sessionId: options.sessionId }),\n ...(options.environment === undefined ? {} : { environment: options.environment }),\n workflowVisible: options.workflowVisible,\n open: (path, signal, alias) => registry.open(path, signal, alias),\n }),\n );\n return app;\n}\n\nexport const api: PoApi = {\n basePath: API_BASE_PATH,\n start(context: PoApiContext): PoApiHandler {\n // One server hosts many sessions, so its own directory is never a session's project.\n if (context.cwd === undefined) throw new Error('Author requires the session working directory.');\n const registry = createAuthorCanvasRegistry(context.cwd, createBridge, context.sessionId, context.environment);\n const app = createAuthorApi({\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n cwd: context.cwd,\n ...(context.environment === undefined ? {} : { environment: context.environment }),\n registry,\n });\n return { fetch: (request) => app.fetch(request), close: () => registry.dispose() };\n },\n};\n\n/** The session API and tools share the same browser ownership and pending requests. */\nexport function createAuthorSessionApi(\n cwd: string,\n sessionId: string,\n environment: Readonly<Record<string, string | undefined>>,\n /** Receives every change to the open canvases, and the empty list at start. */\n publishCanvases?: (canvases: AuthorOpenCanvas[]) => void,\n workflowVisible?: ArtifactWorkflowVisibility,\n): { api: PoApi; catalog: AuthorCatalog } {\n const registry = createAuthorCanvasRegistry(cwd, createBridge, sessionId, environment, workflowVisible);\n if (publishCanvases !== undefined) {\n registry.onChange(() => publishCanvases(registry.openCanvases()));\n publishCanvases([]);\n }\n return {\n catalog: {\n open: (path, signal, alias) => registry.open(path, signal, alias),\n async describe(signal, alias) {\n signal?.throwIfAborted();\n return registry.describe(alias);\n },\n execute: (input, signal) => registry.invoke(input, signal),\n },\n api: {\n basePath: API_BASE_PATH,\n start() {\n const app = createAuthorApi({ cwd, sessionId, environment, registry, workflowVisible });\n return { fetch: (request) => app.fetch(request), close: () => registry.dispose() };\n },\n },\n };\n}\n","import { ARTIFACTS_SERVICE, type ArtifactWorkflowVisibility } from '@agimon-ai/po-artifact';\nimport { PO_CODEMODE_SERVICE, readPoCodemode } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport { serverMinorModes } from '@agimon-ai/po-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { authorMinorMode } from '../../../../models/authorMode';\nimport { createAuthorCatalog } from '../../../../services/authorCatalog';\nimport { createWebmcpNamespace } from '../../../../services/webmcpNamespace';\nimport { authorCanvasesFrame } from '../../../../types/webAuthor';\nimport { api, createAuthorSessionApi } from './api/author/_lib/authorApi';\n\nexport default defineRoot(({ agent, host, context, signal }: PoServerPluginContext) => {\n const { environment, directEvents } = host.context;\n if (agent && environment === undefined) throw new Error('Author requires an admitted session environment.');\n const workflowVisible: ArtifactWorkflowVisibility = (relativePath, kind) =>\n !signal.aborted && context.get(ARTIFACTS_SERVICE)?.workflowVisible(relativePath, kind) === true;\n const cwd = agent?.context.cwd ?? host.context.cwd;\n const sessionId = agent?.context.sessionId ?? host.context.sessionId;\n const session =\n cwd && sessionId && environment\n ? createAuthorSessionApi(\n cwd,\n sessionId,\n environment,\n (canvases) => directEvents?.publish(authorCanvasesFrame, sessionId, { canvases }),\n workflowVisible,\n )\n : undefined;\n const isActive = () => (agent?.context.selection.state?.['minor-mode'] ?? []).includes(authorMinorMode.descriptor.id);\n const mode = agent\n ? authorMinorMode.createOwner({\n isActive,\n detail: () => 'document authoring available',\n async setActive(enabled) {\n const modes = (agent.context.selection.state?.['minor-mode'] ?? []).filter(\n (id) => id !== authorMinorMode.descriptor.id,\n );\n await agent.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: enabled ? [...modes, authorMinorMode.descriptor.id] : modes,\n });\n },\n })\n : undefined;\n let disposed = false;\n const catalog = createAuthorCatalog(session?.catalog);\n const assertAlive = () => {\n signal.throwIfAborted();\n if (disposed) throw new Error('Author session is disposed.');\n };\n const assertAvailable = () => {\n assertAlive();\n if (!isActive()) throw new Error('Author mode is not active.');\n };\n const mountNamespace = (context: Context) => {\n if (!agent) return;\n // The webmcp namespace and its pinned skill stay available without Author mode; only the direct tools are mode-gated.\n const namespace = createWebmcpNamespace(catalog, agent.context.sessionId, assertAlive);\n context.inject([PO_CODEMODE_SERVICE], (scoped) => {\n const registration = readPoCodemode(scoped)?.register('@agimon-ai/po-author', namespace);\n return () => registration?.dispose();\n });\n };\n return {\n onDispose: () => {\n disposed = true;\n },\n value: {\n api: session?.api ?? api,\n catalog,\n // Registration is gated by AUTHOR_TOOL_WHEN; this re-checks a call already in flight when the mode turns off.\n assertAvailable,\n service: undefined,\n },\n services: [...(mode ? [serverMinorModes([mode])] : []), mountNamespace],\n };\n});\n","import type {\n PoHubChannelConnection,\n PoHubChannelHost,\n PoHubChannelSource,\n PoHubSessionScope,\n PoHubChannel,\n} from '@agimon-ai/po-core/hubChannel';\n\nimport { AUTHOR_ALIAS_PATTERN } from '../../schemas/authorTools';\nimport routes from '../../types/apiRoutes';\nimport { API_BASE_PATH } from '../../types/authorApi';\nimport {\n AUTHOR_MAX_CANVASES,\n authorCanvasesFrame,\n authorChannelType,\n type AuthorBrowserMessage,\n type AuthorCanvasesMessage,\n type AuthorHubMessage,\n type AuthorOpenCanvas,\n} from '../../types/webAuthor';\n\n/**\n * Which route carries each message the browser sends.\n *\n * The paths come from the package's one route table, so the hub cannot address\n * a bridge route the session no longer serves. `release` is absent because it\n * is answered by the disconnect route rather than one of its own.\n */\nconst BRIDGE_ROUTE: Readonly<Record<Exclude<AuthorBrowserMessage['kind'], 'release'>, string>> = {\n register: routes.bridgeRegister.path,\n catalog: routes.bridgeCatalog.path,\n result: routes.bridgeResult.path,\n cancelled: routes.bridgeCancelled.path,\n};\n\ninterface Binding {\n alias: string;\n scope: PoHubSessionScope;\n connectionId: string;\n generation: number;\n ownerToken: string;\n poll?: AbortController;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction browserMessage(value: unknown): AuthorBrowserMessage | undefined {\n if (\n !isRecord(value) ||\n typeof value.kind !== 'string' ||\n typeof value.alias !== 'string' ||\n !AUTHOR_ALIAS_PATTERN.test(value.alias)\n )\n return undefined;\n if (!['register', 'release', 'catalog', 'result', 'cancelled'].includes(value.kind)) return undefined;\n return value as unknown as AuthorBrowserMessage;\n}\n\n/** The session's open canvases, or undefined when the frame is not a bounded list of valid aliases and paths. */\nfunction openCanvases(value: unknown): AuthorOpenCanvas[] | undefined {\n if (!isRecord(value) || !Array.isArray(value.canvases) || value.canvases.length > AUTHOR_MAX_CANVASES)\n return undefined;\n const canvases: AuthorOpenCanvas[] = [];\n for (const entry of value.canvases as unknown[]) {\n if (\n !isRecord(entry) ||\n typeof entry.alias !== 'string' ||\n !AUTHOR_ALIAS_PATTERN.test(entry.alias) ||\n typeof entry.path !== 'string' ||\n entry.path === ''\n )\n return undefined;\n canvases.push({ alias: entry.alias, path: entry.path });\n }\n return canvases;\n}\n\nasync function responsePayload(response: Response): Promise<AuthorHubMessage> {\n const value = (await response.json()) as unknown;\n if (response.ok) return value as AuthorHubMessage;\n const reason =\n isRecord(value) && typeof value.error === 'string' ? value.error : `Author bridge HTTP ${response.status}`;\n return { kind: 'rejected', reason };\n}\n\nexport function createAuthorChannel(): PoHubChannel {\n const bindings = new Map<string, Binding>();\n let host: PoHubChannelHost | undefined;\n let closed = false;\n const keyOf = (sessionId: string, connectionId: string, alias: string): string =>\n `${sessionId}\\0${connectionId}\\0${alias}`;\n const send = async (scope: PoHubSessionScope, path: string, value: Record<string, unknown>, signal?: AbortSignal) =>\n await host!.requestSessionApi(scope, {\n basePath: API_BASE_PATH,\n path,\n method: 'POST',\n body: JSON.stringify(value),\n ...(signal === undefined ? {} : { signal }),\n });\n // po.channels keeps only the latest payload and drops an unchanged one, so an identical lease renewal\n // would never reach the browser and its lease would lapse. The sequence makes every frame distinct.\n let sequence = 0;\n const publish = (binding: Binding, payload: AuthorHubMessage): boolean =>\n host?.publishToConnection?.(binding.connectionId, binding.scope.sessionId, {\n ...payload,\n alias: binding.alias,\n seq: ++sequence,\n }) ?? false;\n\n const poll = async (binding: Binding): Promise<void> => {\n binding.poll?.abort();\n const controller = new AbortController();\n binding.poll = controller;\n while (!closed && bindings.get(keyOf(binding.scope.sessionId, binding.connectionId, binding.alias)) === binding) {\n try {\n const response = await send(\n binding.scope,\n routes.bridgeNext.path,\n {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n ownerToken: binding.ownerToken,\n },\n controller.signal,\n );\n const payload = await responsePayload(response);\n if (controller.signal.aborted) break;\n if (!publish(binding, payload) || payload.kind === 'rejected') break;\n } catch (error) {\n if (!controller.signal.aborted) host?.onNotice(error instanceof Error ? error.message : String(error));\n break;\n }\n }\n if (binding.poll === controller) binding.poll = undefined;\n };\n\n const channel: PoHubChannel = {\n frameType: authorChannelType,\n lifecycle: 'hub',\n receiveWithoutSubscription: true,\n start(channelHost) {\n host = channelHost;\n // The session server publishes its open canvases; every browser of the session gets the latest on subscribe.\n const latest = new Map<string, AuthorCanvasesMessage>();\n const subscriptions = new Map<string, () => void>();\n const source: PoHubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n latest.delete(scope.sessionId);\n const unsubscribe = channelHost.directEvents.subscribe(\n authorCanvasesFrame,\n scope.sessionId,\n (payload) => {\n const canvases = openCanvases(payload);\n if (canvases === undefined) return;\n const message: AuthorCanvasesMessage = { kind: 'canvases', canvases };\n latest.set(scope.sessionId, message);\n channelHost.publish(scope.sessionId, message);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n latest.delete(sessionId);\n for (const [key, binding] of bindings) {\n if (binding.scope.sessionId !== sessionId) continue;\n binding.poll?.abort();\n bindings.delete(key);\n void send(binding.scope, routes.bridgeDisconnect.path, {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n }).catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n }\n },\n close() {\n closed = true;\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n latest.clear();\n for (const binding of bindings.values()) {\n binding.poll?.abort();\n void send(binding.scope, routes.bridgeDisconnect.path, {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n }).catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n }\n bindings.clear();\n },\n };\n return source;\n },\n receive(scope, payload, connection) {\n const message = browserMessage(payload);\n if (message === undefined || host === undefined || closed) return;\n void (async () => {\n const key = keyOf(scope.sessionId, connection.connectionId, message.alias);\n const previous = bindings.get(key);\n if (message.kind === 'release') {\n if (previous === undefined || previous.generation !== message.generation) return;\n previous.poll?.abort();\n bindings.delete(key);\n await send(scope, routes.bridgeDisconnect.path, {\n alias: message.alias,\n bindingId: connection.connectionId,\n generation: message.generation,\n });\n return;\n }\n const route = BRIDGE_ROUTE[message.kind];\n const response = await send(scope, route, { ...message, bindingId: connection.connectionId });\n const reply = await responsePayload(response);\n if (reply.kind === 'accepted') {\n const current = bindings.get(key);\n if (current?.generation === reply.generation && current.ownerToken === reply.ownerToken) {\n publish(current, reply);\n if (current.poll === undefined) void poll(current);\n return;\n }\n const binding: Binding = {\n alias: message.alias,\n scope,\n connectionId: connection.connectionId,\n generation: reply.generation,\n ownerToken: reply.ownerToken,\n };\n current?.poll?.abort();\n bindings.set(key, binding);\n publish(binding, reply);\n void poll(binding);\n } else if (reply.kind === 'rejected') {\n if (previous !== undefined) publish(previous, reply);\n else\n host?.publishToConnection?.(connection.connectionId, scope.sessionId, {\n ...reply,\n alias: message.alias,\n seq: ++sequence,\n });\n }\n })().catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n },\n disconnected(connection: PoHubChannelConnection) {\n for (const [key, binding] of bindings) {\n if (binding.connectionId !== connection.connectionId) continue;\n binding.poll?.abort();\n bindings.delete(key);\n void send(binding.scope, routes.bridgeDisconnect.path, {\n alias: binding.alias,\n bindingId: binding.connectionId,\n generation: binding.generation,\n }).catch((error: unknown) => host?.onNotice(error instanceof Error ? error.message : String(error)));\n }\n },\n };\n return channel;\n}\n","import { defineChannel } from '@agimon-ai/po-core/extensionFile';\n\nimport { createAuthorChannel } from '../../../services/webAuthorChannel';\n\nexport default defineChannel(createAuthorChannel);\n","import { defineServerMethod, type PoServerHostService } from '@agimon-ai/po-core/serverPlugin';\n\nimport { authorBridgeMethod } from '../../schemas/authorFacade';\nimport { authorChannelType } from '../../types/webAuthor';\n\nexport function createAuthorBridgeMethod(scope: 'global' | 'workspace', host: PoServerHostService) {\n return defineServerMethod(authorBridgeMethod(scope), ({ sessionId, message }, caller) => {\n if (!caller.connectionId) throw new Error('Author bridge requires an authenticated browser connection.');\n if (!host.context.receiveChannel?.(sessionId, authorChannelType, message, caller.connectionId))\n throw new Error('Author bridge session is outside this mount.');\n return {};\n });\n}\n","import { defineMethod } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createAuthorBridgeMethod } from '../../../services/authorBridgeMethod';\n\nexport default defineMethod(({ host }: PoServerPluginContext) =>\n host.scope === 'session'\n ? { register: () => ({ dispose: () => undefined }) }\n : createAuthorBridgeMethod(host.scope, host),\n);\n","import { defineRoute, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype AuthorServerScope = Awaited<ReturnType<typeof import('../../root.server').default>>['value'];\n\nexport default defineRoute((context: WithRoot<PoServerPluginContext, AuthorServerScope>) => context.root.api);\n","import { defineCommand as defineRoutedCommand, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { createAuthorCommand } from '../../../../../services/authorCommand';\nimport type { AuthorExtensionService } from '../../../../../types/extension';\n\nexport default defineRoutedCommand((context: WithRoot<unknown, { readonly service?: AuthorExtensionService }>) =>\n createAuthorCommand(context.root.service),\n);\n","import { defineHook } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_GUIDANCE } from '../../../../../constants/author';\n\nexport default defineHook<'before_agent_start'>({\n when: { state: { 'minor-mode': 'author' }, attribution: { kind: 'minor', mode: 'author' } },\n event: 'before_agent_start',\n handle(event) {\n const systemPrompt = typeof event.systemPrompt === 'string' ? event.systemPrompt : '';\n return { systemPrompt: `${systemPrompt}\\n\\n${AUTHOR_GUIDANCE}`.trim() };\n },\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nconst skillFile = 'src/prompts/codemode-how-to-author/SKILL.md';\n\nexport default defineResource({\n name: 'codemode-how-to-author',\n description:\n 'Open a file as a canvas the person sees, then read and change it through the tools that canvas offers. Use to review or edit a document, image or sheet together with the person; works without Author mode.',\n kind: 'skill' as const,\n pinned: true,\n path: packageResourcePath(import.meta.url, skillFile),\n read: () => readPackageResource(import.meta.url, skillFile),\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n when: { state: { 'minor-mode': 'author' }, attribution: { kind: 'minor' as const, mode: 'author' } },\n name: 'po-use-author',\n description: 'Use the Author workflow for focused document review, canvas steering, and bounded authoring.',\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-use-author/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-author/SKILL.md'),\n});\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_TOOL_WHEN, createAuthorTools, type AuthorToolRoot } from '../../../../../services/authorTools';\n\nexport default defineTool((context: WithRoot<unknown, AuthorToolRoot>) => ({\n ...createAuthorTools(context.root.catalog, context.root.assertAvailable)[1]!,\n when: AUTHOR_TOOL_WHEN,\n}));\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_TOOL_WHEN, createAuthorTools, type AuthorToolRoot } from '../../../../../services/authorTools';\n\nexport default defineTool((context: WithRoot<unknown, AuthorToolRoot>) => ({\n ...createAuthorTools(context.root.catalog, context.root.assertAvailable)[0]!,\n when: AUTHOR_TOOL_WHEN,\n}));\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { AUTHOR_TOOL_WHEN, createAuthorTools, type AuthorToolRoot } from '../../../../../services/authorTools';\n\nexport default defineTool((context: WithRoot<unknown, AuthorToolRoot>) => ({\n ...createAuthorTools(context.root.catalog, context.root.assertAvailable)[2]!,\n when: AUTHOR_TOOL_WHEN,\n}));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelAuthorWebmcp from '../src/extensions/(backend)/channel/author-webmcp.server';\nimport methodBridge from '../src/extensions/(backend)/method/bridge.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/author/route.server';\nimport commandAuthor from '../src/extensions/workspaces/sessions/(backend)/command/author.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport resourceCodemodeHowToAuthor from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-author.server';\nimport resourcePoUseAuthor from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-author.server';\nimport toolDescribeAuthorTools from '../src/extensions/workspaces/sessions/(backend)/tool/describe-author-tools.server';\nimport toolOpenAuthoringFile from '../src/extensions/workspaces/sessions/(backend)/tool/open-authoring-file.server';\nimport toolUseAuthorTools from '../src/extensions/workspaces/sessions/(backend)/tool/use-author-tools.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-author',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]); },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]); },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'author' }, at(commandAuthor, contextSession))]; },\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession))]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToAuthor, contextSession), at(resourcePoUseAuthor, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'describe_author_tools' }, at(toolDescribeAuthorTools, contextSession)), via({ name: 'open_authoring_file' }, at(toolOpenAuthoringFile, contextSession)), via({ name: 'use_author_tools' }, at(toolUseAuthorTools, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
|