@agimon-ai/po-author 0.0.0-alpha.13 → 0.0.0-alpha.14

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.
@@ -2,9 +2,9 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_structuredDocuments = require("../structuredDocuments-CzQCG6w3.cjs");
5
+ const require_structuredDocuments = require("../structuredDocuments-OYXnnCrZ.cjs");
6
6
  const require_authorFacade = require("../authorFacade-BkIMF1lR.cjs");
7
- let _agimon_ai_po_core_serverFacet = require("@agimon-ai/po-core/serverFacet");
7
+ let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
8
8
  let _agimon_ai_po_minor_mode = require("@agimon-ai/po-minor-mode");
9
9
  let node_crypto = require("node:crypto");
10
10
  let node_path = require("node:path");
@@ -775,7 +775,7 @@ var author_webmcp_server_default = (0, _agimon_ai_po_core_extensionFile.defineCh
775
775
  //#endregion
776
776
  //#region src/services/authorBridgeMethod/index.ts
777
777
  function createAuthorBridgeMethod(scope, host) {
778
- return (0, _agimon_ai_po_core_serverFacet.defineServerMethod)(require_authorFacade.authorBridgeMethod(scope), ({ sessionId, message }, caller) => {
778
+ return (0, _agimon_ai_po_core_serverPlugin.defineServerMethod)(require_authorFacade.authorBridgeMethod(scope), ({ sessionId, message }, caller) => {
779
779
  if (!caller.connectionId) throw new Error("Author bridge requires an authenticated browser connection.");
780
780
  if (!host.context.receiveChannel?.(sessionId, "author_webmcp", message, caller.connectionId)) throw new Error("Author bridge session is outside this mount.");
781
781
  return {};
@@ -817,7 +817,7 @@ var po_use_author_server_default = (0, _agimon_ai_po_core_extensionFile.defineRe
817
817
  },
818
818
  name: "po-use-author",
819
819
  kind: "skill",
820
- read: () => (0, _agimon_ai_po_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-author/SKILL.md")
820
+ read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-author/SKILL.md")
821
821
  });
822
822
  //#endregion
823
823
  //#region src/extensions/workspaces/sessions/(backend)/tool/describe-author-tools.server.ts
@@ -840,13 +840,16 @@ var use_author_tools_server_default = (0, _agimon_ai_po_core_extensionFile.defin
840
840
  //#endregion
841
841
  //#region generated/server.ts
842
842
  const at = (value, context) => typeof value === "function" ? value(context) : value;
843
+ /* v8 ignore next -- generated normalization branch */
844
+ const defined = (values) => values.filter((value) => value !== void 0);
843
845
  const via = (identity, value) => value === void 0 ? void 0 : {
844
846
  ...identity,
845
847
  ...value
846
848
  };
847
- const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
849
+ const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
848
850
  name: "@agimon-ai/po-author",
849
- providerOverrides: (0, _agimon_ai_po_core_serverFacet.composeServerProviderOverrides)(root_server_default),
851
+ providerOverrides: (0, _agimon_ai_po_core_serverPlugin.composeServerProviderOverrides)(root_server_default),
852
+ injects: (0, _agimon_ai_po_core_extensionFile.composeRootInjects)({ session: [root_server_default] }),
850
853
  global: (context) => ({
851
854
  get channels() {
852
855
  return [() => via({ frameType: "author_webmcp" }, author_webmcp_server_default())];
@@ -857,14 +860,14 @@ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
857
860
  }),
858
861
  workspace: (context) => ({
859
862
  get channels() {
860
- return [() => via({ frameType: "author_webmcp" }, author_webmcp_server_default())];
863
+ return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, author_webmcp_server_default())]);
861
864
  },
862
865
  get methods() {
863
866
  return [at(bridge_server_default, context)];
864
867
  }
865
868
  }),
866
869
  session: async (context) => {
867
- const scopeSession = await root_server_default(context);
870
+ const scopeSession = await context.scopeRoot("session", root_server_default, context);
868
871
  const contextSession = {
869
872
  ...context,
870
873
  root: scopeSession.value
@@ -875,7 +878,7 @@ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
875
878
  return [at(route_server_default, contextSession)];
876
879
  },
877
880
  get channels() {
878
- return [() => via({ frameType: "author_webmcp" }, author_webmcp_server_default())];
881
+ return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, author_webmcp_server_default())]);
879
882
  },
880
883
  get commands() {
881
884
  return [via({ name: "author" }, at(author_server_default, contextSession))];
@@ -904,7 +907,7 @@ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
904
907
  }
905
908
  });
906
909
  //#endregion
907
- exports.default = facet;
908
- exports.facet = facet;
910
+ exports.default = serverPlugin;
911
+ exports.serverPlugin = serverPlugin;
909
912
 
910
913
  //# sourceMappingURL=server.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["path","AUTHOR_ARTIFACT_PREFIX","DocumentRequestError","artifactRoot","fs","openArtifact","ArtifactAccessError","documentTooLarge","readArtifactBytes","AUTHOR_ALIAS_PATTERN","AuthorBridgeError","path","defineApiRoutes","apiResponse","AuthorBridgeError","Hono","routes","parseUseAuthorToolInput","DocumentRequestError","Hono","routes","parseStructuredDocument","preflightStructuredDocument","serializeStructuredDocument","createAuthorBridgeState","randomUUID","Hono","routes","defineRoot","authorMinorMode","createAuthorCatalog","serverMinorModes","routes","AUTHOR_ALIAS_PATTERN","defineChannel","defineServerMethod","authorBridgeMethod","defineMethod","defineRoute","defineRoutedCommand","createAuthorCommand","defineHook","AUTHOR_GUIDANCE","defineResource","readPackageResource","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineTool","createAuthorTools","AUTHOR_TOOL_WHEN","defineServerPlugin","composeServerProviderOverrides","rootSession","channelAuthorWebmcp","methodBridge","composeRootHooks","apiRoute","commandAuthor","hookBeforeAgentStart","resourcePoUseAuthor","toolDescribeAuthorTools","toolOpenAuthoringFile","toolUseAuthorTools"],"sources":["../../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/types/webAuthor.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/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 fs from 'node:fs/promises';\nimport path from 'node:path';\n\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 }\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(requestedPath: string, sessionId: string | undefined) {\n const prefixed = requestedPath.startsWith(AUTHOR_ARTIFACT_PREFIX);\n if (sessionId === undefined) {\n if (prefixed) throw new DocumentRequestError('Artifacts need a session.', 400);\n return undefined;\n }\n const root = artifactRoot(sessionId, process.env);\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): 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);\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 return {\n kind: 'workspace',\n path: path.relative(root, realCandidate).split(path.sep).join('/'),\n realPath: realCandidate,\n };\n}\n\nasync function readArtifact(root: string, relative: string): Promise<Uint8Array> {\n let file: Awaited<ReturnType<typeof openArtifact>>;\n try {\n file = await openArtifact(root, relative);\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(source: AuthorDocumentSource): Promise<Uint8Array> {\n if (source.kind === 'artifact') return await readArtifact(source.root, source.relative);\n const stat = await fs.stat(source.realPath);\n if (stat.size > AUTHOR_DOCUMENT_MAX_BYTES) {\n throw documentTooLarge(`Document exceeds the ${AUTHOR_DOCUMENT_MAX_BYTES} byte preview limit.`);\n }\n return await fs.readFile(source.realPath);\n}\n\nexport async function readDocument(cwd: string, requestedPath: unknown, sessionId?: string): Promise<Uint8Array> {\n return await readSource(await resolveDocument(cwd, requestedPath, sessionId));\n}\n","import path from 'node:path';\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 { 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\nconst MAX_CANVASES = 32;\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) {\n const byAlias = new Map<string, Canvas>();\n const byPath = new Map<string, Canvas>();\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 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);\n const bytes = await readSource(source);\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 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 >= MAX_CANVASES)\n throw new AuthorBridgeError('Too many Author canvases in this conversation.', 409);\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 let alias = requestedAlias ?? base;\n for (let suffix = 2; byAlias.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 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 const canvas = select(alias);\n canvas.closed = true;\n canvas.bridge.close();\n canvas.bridge = createBridge();\n },\n closeAll(): void {\n for (const canvas of byAlias.values()) {\n if (canvas.closed) continue;\n canvas.closed = true;\n canvas.bridge.close();\n canvas.bridge = createBridge();\n }\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 /**\n * The host's own bytes route, not this package's.\n *\n * `host: true` hangs it off the session root rather than under `/plugins`,\n * which is how the cockpit already serves it. Author reads a document's\n * bytes and its digest through it, and writes the edited bytes back to the\n * same path, so both stay raw transfers rather than calls: the body is the\n * file and the digest travels in a header.\n */\n file: {\n method: 'GET',\n path: '/file',\n query: ['path'],\n host: 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 { Hono } from 'hono';\n\nimport {\n parseStructuredDocument,\n preflightStructuredDocument,\n serializeStructuredDocument,\n} from '../../../../../../../services/structuredDocuments';\nimport { DocumentRequestError } from '../../../../../../../services/structuredDocuments/common';\nimport { readDocument } 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 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 | 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({ error: message }, error instanceof DocumentRequestError ? error.status : 422);\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 cwd = options.cwd ?? process.cwd();\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(cwd, body.path, options.sessionId);\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(cwd, body.path, options.sessionId);\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(cwd, body.path, options.sessionId);\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 { 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 { createAuthorBridgeApi } from './authorBridgeApi';\nimport { createAuthorDocumentApi } from './authorDocumentApi';\n\nexport interface AuthorApiOptions {\n sessionId?: string;\n cwd?: string;\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 const app = new Hono();\n const registry =\n options.registry ?? createAuthorCanvasRegistry(options.cwd ?? process.cwd(), createBridge, options.sessionId);\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 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);\n const app = createAuthorApi({\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n cwd: context.cwd,\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): { api: PoApi; catalog: AuthorCatalog; closeCanvases: () => void } {\n const registry = createAuthorCanvasRegistry(cwd, createBridge, sessionId);\n return {\n closeCanvases: () => registry.closeAll(),\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, registry });\n return { fetch: (request) => app.fetch(request), close: () => registry.dispose() };\n },\n },\n };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\nimport { serverMinorModes } from '@agimon-ai/po-minor-mode';\n\nimport { authorMinorMode } from '../../../../models/authorMode';\nimport { createAuthorCatalog } from '../../../../services/authorCatalog';\nimport { api, createAuthorSessionApi } from './api/author/_lib/authorApi';\n\nexport default defineRoot(({ agent }: PoServerPluginContext) => {\n const session = agent ? createAuthorSessionApi(agent.context.cwd, agent.context.sessionId) : 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 if (!enabled) session?.closeCanvases();\n },\n })\n : undefined;\n return {\n value: {\n api: session?.api ?? api,\n catalog: createAuthorCatalog(session?.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 if (!isActive()) throw new Error('Author mode is not active.');\n },\n service: undefined,\n },\n services: mode ? [serverMinorModes([mode])] : [],\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\nexport type AuthorHubMessage =\n | AuthorAcceptedMessage\n | AuthorRequestMessage\n | AuthorCancelMessage\n | AuthorRejectedMessage;\n\nexport interface AuthorWebView {\n activation: 'inactive' | 'active';\n capabilityCount: number;\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 { authorChannelType, type AuthorBrowserMessage, type AuthorHubMessage } 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\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 const publish = (binding: Binding, payload: AuthorHubMessage): boolean =>\n host?.publishToConnection?.(binding.connectionId, binding.scope.sessionId, { ...payload, alias: binding.alias }) ??\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 (!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 };\n\n const channel: PoHubChannel = {\n frameType: authorChannelType,\n lifecycle: 'hub',\n receiveWithoutSubscription: true,\n start(channelHost) {\n host = channelHost;\n const source: PoHubChannelSource = {\n payloadFor: () => undefined,\n sessionRemoved(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 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 binding: Binding = {\n alias: message.alias,\n scope,\n connectionId: connection.connectionId,\n generation: reply.generation,\n ownerToken: reply.ownerToken,\n };\n previous?.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, { ...reply, alias: message.alias });\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/serverFacet';\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/serverFacet';\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/serverFacet';\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 { readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineResource({\n when: { state: { 'minor-mode': 'author' }, attribution: { kind: 'minor' as const, mode: 'author' } },\n name: 'po-use-author',\n kind: 'skill' as const,\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/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } 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 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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-author',\n providerOverrides: composeServerProviderOverrides(rootSession),\n global: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'author_webmcp' }, channelAuthorWebmcp())]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'author_webmcp' }, channelAuthorWebmcp())]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n session: async (context) => {\n const scopeSession = await 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 [() => via({ frameType: 'author_webmcp' }, channelAuthorWebmcp())]; },\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(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 facet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs","names":["path","AUTHOR_ARTIFACT_PREFIX","DocumentRequestError","artifactRoot","fs","openArtifact","ArtifactAccessError","documentTooLarge","readArtifactBytes","AUTHOR_ALIAS_PATTERN","AuthorBridgeError","path","defineApiRoutes","apiResponse","AuthorBridgeError","Hono","routes","parseUseAuthorToolInput","DocumentRequestError","Hono","routes","parseStructuredDocument","preflightStructuredDocument","serializeStructuredDocument","createAuthorBridgeState","randomUUID","Hono","routes","defineRoot","authorMinorMode","createAuthorCatalog","serverMinorModes","routes","AUTHOR_ALIAS_PATTERN","defineChannel","defineServerMethod","authorBridgeMethod","defineMethod","defineRoute","defineRoutedCommand","createAuthorCommand","defineHook","AUTHOR_GUIDANCE","defineResource","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","resourcePoUseAuthor","toolDescribeAuthorTools","toolOpenAuthoringFile","toolUseAuthorTools"],"sources":["../../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/types/webAuthor.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/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 fs from 'node:fs/promises';\nimport path from 'node:path';\n\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 }\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(requestedPath: string, sessionId: string | undefined) {\n const prefixed = requestedPath.startsWith(AUTHOR_ARTIFACT_PREFIX);\n if (sessionId === undefined) {\n if (prefixed) throw new DocumentRequestError('Artifacts need a session.', 400);\n return undefined;\n }\n const root = artifactRoot(sessionId, process.env);\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): 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);\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 return {\n kind: 'workspace',\n path: path.relative(root, realCandidate).split(path.sep).join('/'),\n realPath: realCandidate,\n };\n}\n\nasync function readArtifact(root: string, relative: string): Promise<Uint8Array> {\n let file: Awaited<ReturnType<typeof openArtifact>>;\n try {\n file = await openArtifact(root, relative);\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(source: AuthorDocumentSource): Promise<Uint8Array> {\n if (source.kind === 'artifact') return await readArtifact(source.root, source.relative);\n const stat = await fs.stat(source.realPath);\n if (stat.size > AUTHOR_DOCUMENT_MAX_BYTES) {\n throw documentTooLarge(`Document exceeds the ${AUTHOR_DOCUMENT_MAX_BYTES} byte preview limit.`);\n }\n return await fs.readFile(source.realPath);\n}\n\nexport async function readDocument(cwd: string, requestedPath: unknown, sessionId?: string): Promise<Uint8Array> {\n return await readSource(await resolveDocument(cwd, requestedPath, sessionId));\n}\n","import path from 'node:path';\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 { 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\nconst MAX_CANVASES = 32;\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) {\n const byAlias = new Map<string, Canvas>();\n const byPath = new Map<string, Canvas>();\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 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);\n const bytes = await readSource(source);\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 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 >= MAX_CANVASES)\n throw new AuthorBridgeError('Too many Author canvases in this conversation.', 409);\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 let alias = requestedAlias ?? base;\n for (let suffix = 2; byAlias.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 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 const canvas = select(alias);\n canvas.closed = true;\n canvas.bridge.close();\n canvas.bridge = createBridge();\n },\n closeAll(): void {\n for (const canvas of byAlias.values()) {\n if (canvas.closed) continue;\n canvas.closed = true;\n canvas.bridge.close();\n canvas.bridge = createBridge();\n }\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 /**\n * The host's own bytes route, not this package's.\n *\n * `host: true` hangs it off the session root rather than under `/plugins`,\n * which is how the cockpit already serves it. Author reads a document's\n * bytes and its digest through it, and writes the edited bytes back to the\n * same path, so both stay raw transfers rather than calls: the body is the\n * file and the digest travels in a header.\n */\n file: {\n method: 'GET',\n path: '/file',\n query: ['path'],\n host: 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 { Hono } from 'hono';\n\nimport {\n parseStructuredDocument,\n preflightStructuredDocument,\n serializeStructuredDocument,\n} from '../../../../../../../services/structuredDocuments';\nimport { DocumentRequestError } from '../../../../../../../services/structuredDocuments/common';\nimport { readDocument } 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 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 | 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({ error: message }, error instanceof DocumentRequestError ? error.status : 422);\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 cwd = options.cwd ?? process.cwd();\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(cwd, body.path, options.sessionId);\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(cwd, body.path, options.sessionId);\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(cwd, body.path, options.sessionId);\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 { 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 { createAuthorBridgeApi } from './authorBridgeApi';\nimport { createAuthorDocumentApi } from './authorDocumentApi';\n\nexport interface AuthorApiOptions {\n sessionId?: string;\n cwd?: string;\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 const app = new Hono();\n const registry =\n options.registry ?? createAuthorCanvasRegistry(options.cwd ?? process.cwd(), createBridge, options.sessionId);\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 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);\n const app = createAuthorApi({\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n cwd: context.cwd,\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): { api: PoApi; catalog: AuthorCatalog; closeCanvases: () => void } {\n const registry = createAuthorCanvasRegistry(cwd, createBridge, sessionId);\n return {\n closeCanvases: () => registry.closeAll(),\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, registry });\n return { fetch: (request) => app.fetch(request), close: () => registry.dispose() };\n },\n },\n };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport { serverMinorModes } from '@agimon-ai/po-minor-mode';\n\nimport { authorMinorMode } from '../../../../models/authorMode';\nimport { createAuthorCatalog } from '../../../../services/authorCatalog';\nimport { api, createAuthorSessionApi } from './api/author/_lib/authorApi';\n\nexport default defineRoot(({ agent }: PoServerPluginContext) => {\n const session = agent ? createAuthorSessionApi(agent.context.cwd, agent.context.sessionId) : 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 if (!enabled) session?.closeCanvases();\n },\n })\n : undefined;\n return {\n value: {\n api: session?.api ?? api,\n catalog: createAuthorCatalog(session?.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 if (!isActive()) throw new Error('Author mode is not active.');\n },\n service: undefined,\n },\n services: mode ? [serverMinorModes([mode])] : [],\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\nexport type AuthorHubMessage =\n | AuthorAcceptedMessage\n | AuthorRequestMessage\n | AuthorCancelMessage\n | AuthorRejectedMessage;\n\nexport interface AuthorWebView {\n activation: 'inactive' | 'active';\n capabilityCount: number;\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 { authorChannelType, type AuthorBrowserMessage, type AuthorHubMessage } 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\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 const publish = (binding: Binding, payload: AuthorHubMessage): boolean =>\n host?.publishToConnection?.(binding.connectionId, binding.scope.sessionId, { ...payload, alias: binding.alias }) ??\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 (!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 };\n\n const channel: PoHubChannel = {\n frameType: authorChannelType,\n lifecycle: 'hub',\n receiveWithoutSubscription: true,\n start(channelHost) {\n host = channelHost;\n const source: PoHubChannelSource = {\n payloadFor: () => undefined,\n sessionRemoved(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 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 binding: Binding = {\n alias: message.alias,\n scope,\n connectionId: connection.connectionId,\n generation: reply.generation,\n ownerToken: reply.ownerToken,\n };\n previous?.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, { ...reply, alias: message.alias });\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 { 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 kind: 'skill' as const,\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 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' }, channelAuthorWebmcp())]; },\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' }, channelAuthorWebmcp())]); },\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' }, channelAuthorWebmcp())]); },\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(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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"}
@@ -1,5 +1,5 @@
1
1
  //#region generated/server.d.ts
2
- export declare const facet: import("@agimon-ai/po-core/serverFacet").PoServerFacet;
2
+ export declare const serverPlugin: import("@agimon-ai/po-core/serverPlugin").PoServerPlugin;
3
3
  //#endregion
4
- export { facet as default };
4
+ export { serverPlugin as default };
5
5
  //# sourceMappingURL=server.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAsBa,gDAAK"}
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAyBa,wDAAY"}
@@ -1,10 +1,10 @@
1
1
  import { o as authorBridgeMethod } from "../authorFacade-CpLG3duk.mjs";
2
- import { A as AUTHOR_ALIAS_PATTERN, C as AuthorBridgeError, D as createAuthorTools, E as AUTHOR_TOOL_WHEN, F as AUTHOR_ARTIFACT_PREFIX, L as AUTHOR_GUIDANCE, P as parseUseAuthorToolInput, T as createAuthorCatalog, _ as DocumentRequestError, b as authorMinorMode, n as preflightStructuredDocument, r as serializeStructuredDocument, t as parseStructuredDocument, v as documentTooLarge, w as createAuthorBridgeState, y as createAuthorCommand } from "../structuredDocuments-DNKyW1SN.mjs";
3
- import { composeServerProviderOverrides, defineServerMethod, defineServerPlugin, readPackageResource } from "@agimon-ai/po-core/serverFacet";
2
+ import { A as AUTHOR_ALIAS_PATTERN, C as AuthorBridgeError, D as createAuthorTools, E as AUTHOR_TOOL_WHEN, F as AUTHOR_ARTIFACT_PREFIX, L as AUTHOR_GUIDANCE, P as parseUseAuthorToolInput, T as createAuthorCatalog, _ as DocumentRequestError, b as authorMinorMode, n as preflightStructuredDocument, r as serializeStructuredDocument, t as parseStructuredDocument, v as documentTooLarge, w as createAuthorBridgeState, y as createAuthorCommand } from "../structuredDocuments-BAvFI8VH.mjs";
3
+ import { composeServerProviderOverrides, defineServerMethod, defineServerPlugin, readPackageResource } from "@agimon-ai/po-core/serverPlugin";
4
4
  import { serverMinorModes } from "@agimon-ai/po-minor-mode";
5
5
  import { randomUUID } from "node:crypto";
6
6
  import path from "node:path";
7
- import { composeRootHooks, defineChannel, defineCommand as defineCommand$1, defineHook, defineMethod, defineResource, defineRoot, defineRoute, defineTool as defineTool$1 } from "@agimon-ai/po-core/extensionFile";
7
+ import { composeRootHooks, composeRootInjects, defineChannel, defineCommand as defineCommand$1, defineHook, defineMethod, defineResource, defineRoot, defineRoute, defineTool as defineTool$1 } from "@agimon-ai/po-core/extensionFile";
8
8
  import { Hono } from "hono";
9
9
  import fs from "node:fs/promises";
10
10
  import { ArtifactAccessError, artifactRoot, openArtifact, readArtifactBytes } from "@agimon-ai/po-artifact/artifactFiles";
@@ -834,13 +834,16 @@ var use_author_tools_server_default = defineTool$1((context) => ({
834
834
  //#endregion
835
835
  //#region generated/server.ts
836
836
  const at = (value, context) => typeof value === "function" ? value(context) : value;
837
+ /* v8 ignore next -- generated normalization branch */
838
+ const defined = (values) => values.filter((value) => value !== void 0);
837
839
  const via = (identity, value) => value === void 0 ? void 0 : {
838
840
  ...identity,
839
841
  ...value
840
842
  };
841
- const facet = defineServerPlugin({
843
+ const serverPlugin = defineServerPlugin({
842
844
  name: "@agimon-ai/po-author",
843
845
  providerOverrides: composeServerProviderOverrides(root_server_default),
846
+ injects: composeRootInjects({ session: [root_server_default] }),
844
847
  global: (context) => ({
845
848
  get channels() {
846
849
  return [() => via({ frameType: "author_webmcp" }, author_webmcp_server_default())];
@@ -851,14 +854,14 @@ const facet = defineServerPlugin({
851
854
  }),
852
855
  workspace: (context) => ({
853
856
  get channels() {
854
- return [() => via({ frameType: "author_webmcp" }, author_webmcp_server_default())];
857
+ return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, author_webmcp_server_default())]);
855
858
  },
856
859
  get methods() {
857
860
  return [at(bridge_server_default, context)];
858
861
  }
859
862
  }),
860
863
  session: async (context) => {
861
- const scopeSession = await root_server_default(context);
864
+ const scopeSession = await context.scopeRoot("session", root_server_default, context);
862
865
  const contextSession = {
863
866
  ...context,
864
867
  root: scopeSession.value
@@ -869,7 +872,7 @@ const facet = defineServerPlugin({
869
872
  return [at(route_server_default, contextSession)];
870
873
  },
871
874
  get channels() {
872
- return [() => via({ frameType: "author_webmcp" }, author_webmcp_server_default())];
875
+ return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, author_webmcp_server_default())]);
873
876
  },
874
877
  get commands() {
875
878
  return [via({ name: "author" }, at(author_server_default, contextSession))];
@@ -898,6 +901,6 @@ const facet = defineServerPlugin({
898
901
  }
899
902
  });
900
903
  //#endregion
901
- export { facet as default, facet };
904
+ export { serverPlugin as default, serverPlugin };
902
905
 
903
906
  //# sourceMappingURL=server.mjs.map