@agimon-ai/po-author 0.0.0-alpha.28 → 0.0.0-alpha.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/extensions/server.cjs +90 -10
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.mjs +91 -11
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +24 -22
- package/dist/extensions/web.mjs.map +1 -1
- package/package.json +8 -8
- package/src/prompts/po-use-author/SKILL.md +1 -0
package/README.md
CHANGED
|
@@ -17,6 +17,22 @@ Catalog tokens rotate whenever capabilities change. Document-backed tools remain
|
|
|
17
17
|
Unsent annotations belong to their document and leave the canvas once a send is accepted; the dock's request log keeps the request for the open document. Messages typed in an Author file tab carry `Author document: <path> (canvas <alias>)` as referenced context. Slash commands are sent unchanged.
|
|
18
18
|
The package declares session API, cockpit client, and web hub entries. Each canvas has an isolated ownership lease and catalog token; stale bindings and cross-canvas tokens are rejected. Without the host session API socket and token, catalog operations fail as unavailable.
|
|
19
19
|
|
|
20
|
+
## Code mode
|
|
21
|
+
|
|
22
|
+
When code mode is installed, the session also exposes generic Author-only `webmcp.describe(input?)` and `webmcp.call(input)`. Direct Author tools stay unchanged. Author mode must be active when either method is called.
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
const catalog = await webmcp.describe({ alias: 'review' });
|
|
26
|
+
const result = await webmcp.call({
|
|
27
|
+
alias: 'review',
|
|
28
|
+
catalogToken: catalog.catalogToken,
|
|
29
|
+
name: 'advertised_tool',
|
|
30
|
+
arguments: {},
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Use `webmcp.describe()` to list canvases. Build arguments from the advertised schema and copy the token exactly. Inputs and results are detached JSON. Await calls to the same canvas one at a time; no queue or automatic stale-token refresh is added. Structured browser `{error}` results remain data. This namespace does not expose general MCP servers or browser tools.
|
|
35
|
+
|
|
20
36
|
## Public API
|
|
21
37
|
|
|
22
38
|
```ts
|
|
@@ -10,11 +10,67 @@ let node_crypto = require("node:crypto");
|
|
|
10
10
|
let node_path = require("node:path");
|
|
11
11
|
node_path = require_structuredDocuments.__toESM(node_path, 1);
|
|
12
12
|
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
13
|
+
let _agimon_ai_po_core_codemode = require("@agimon-ai/po-core/codemode");
|
|
13
14
|
let hono = require("hono");
|
|
14
15
|
let node_fs_promises = require("node:fs/promises");
|
|
15
16
|
node_fs_promises = require_structuredDocuments.__toESM(node_fs_promises, 1);
|
|
16
17
|
let _agimon_ai_po_artifact_artifactFiles = require("@agimon-ai/po-artifact/artifactFiles");
|
|
17
18
|
let _agimon_ai_po_core_web = require("@agimon-ai/po-core/web");
|
|
19
|
+
//#region src/services/webmcpNamespace/index.ts
|
|
20
|
+
const DECLARATIONS = `interface AuthorViewportCatalogSnapshot {
|
|
21
|
+
catalogToken: string;
|
|
22
|
+
tools: { name: string; label: string; description: string; inputSchema: Readonly<Record<string, unknown>> }[];
|
|
23
|
+
canvases?: { alias: string; path: string; status: 'opening' | 'ready' | 'unavailable' }[];
|
|
24
|
+
alias?: string;
|
|
25
|
+
path?: string;
|
|
26
|
+
status?: 'opening' | 'ready' | 'unavailable';
|
|
27
|
+
nextStep?: string;
|
|
28
|
+
}
|
|
29
|
+
declare const webmcp: {
|
|
30
|
+
/** Ready canvases, or one canvas's tools and its catalog token. */
|
|
31
|
+
describe(input?: { alias?: string }): Promise<AuthorViewportCatalogSnapshot>;
|
|
32
|
+
/** Call one tool with an explicit current token. Await same-canvas calls sequentially. */
|
|
33
|
+
call(input: { alias?: string; catalogToken: string; name: string; arguments: Record<string, unknown> }): Promise<unknown>;
|
|
34
|
+
};`;
|
|
35
|
+
function copy(value) {
|
|
36
|
+
return value === void 0 ? value : JSON.parse(JSON.stringify(value));
|
|
37
|
+
}
|
|
38
|
+
function createWebmcpNamespace(catalog, sessionId, assertAvailable) {
|
|
39
|
+
return {
|
|
40
|
+
name: "webmcp",
|
|
41
|
+
summary: "Author canvas WebMCP: describe catalogs, then call one tool with its explicit token. Await same-canvas calls sequentially; structured errors remain data.",
|
|
42
|
+
declarations: DECLARATIONS,
|
|
43
|
+
bind(run) {
|
|
44
|
+
if (run.sessionId !== sessionId) throw new Error("Author WebMCP namespace belongs to another session.");
|
|
45
|
+
let disposed = false;
|
|
46
|
+
run.onDispose(() => {
|
|
47
|
+
disposed = true;
|
|
48
|
+
});
|
|
49
|
+
const check = () => {
|
|
50
|
+
run.signal.throwIfAborted();
|
|
51
|
+
if (disposed) throw new Error("Author WebMCP run is disposed.");
|
|
52
|
+
assertAvailable();
|
|
53
|
+
};
|
|
54
|
+
const members = Object.create(null);
|
|
55
|
+
members.describe = async (input) => {
|
|
56
|
+
check();
|
|
57
|
+
const { alias } = require_structuredDocuments.parseDescribeAuthorToolsInput(copy(input === void 0 ? {} : input));
|
|
58
|
+
const result = await catalog.describe(run.signal, alias);
|
|
59
|
+
check();
|
|
60
|
+
return copy(result);
|
|
61
|
+
};
|
|
62
|
+
members.call = async (input) => {
|
|
63
|
+
check();
|
|
64
|
+
const parsed = require_structuredDocuments.parseUseAuthorToolInput(copy(input));
|
|
65
|
+
const result = await catalog.execute(parsed, run.signal);
|
|
66
|
+
check();
|
|
67
|
+
return copy(result.result);
|
|
68
|
+
};
|
|
69
|
+
return members;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
18
74
|
//#region src/services/structuredDocuments/document.ts
|
|
19
75
|
const AUTHOR_DOCUMENT_MAX_BYTES = 26214400;
|
|
20
76
|
function inside(root, candidate) {
|
|
@@ -574,7 +630,7 @@ function createAuthorSessionApi(cwd, sessionId) {
|
|
|
574
630
|
}
|
|
575
631
|
//#endregion
|
|
576
632
|
//#region src/extensions/workspaces/sessions/(backend)/root.server.ts
|
|
577
|
-
var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(({ agent }) => {
|
|
633
|
+
var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(({ agent, signal }) => {
|
|
578
634
|
const session = agent ? createAuthorSessionApi(agent.context.cwd, agent.context.sessionId) : void 0;
|
|
579
635
|
const isActive = () => (agent?.context.selection.state?.["minor-mode"] ?? []).includes(require_structuredDocuments.authorMinorMode.descriptor.id);
|
|
580
636
|
const mode = agent ? require_structuredDocuments.authorMinorMode.createOwner({
|
|
@@ -589,16 +645,32 @@ var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(({ ag
|
|
|
589
645
|
});
|
|
590
646
|
}
|
|
591
647
|
}) : void 0;
|
|
648
|
+
let disposed = false;
|
|
649
|
+
const catalog = require_structuredDocuments.createAuthorCatalog(session?.catalog);
|
|
650
|
+
const assertAvailable = () => {
|
|
651
|
+
signal.throwIfAborted();
|
|
652
|
+
if (disposed) throw new Error("Author session is disposed.");
|
|
653
|
+
if (!isActive()) throw new Error("Author mode is not active.");
|
|
654
|
+
};
|
|
655
|
+
const mountNamespace = (context) => {
|
|
656
|
+
if (!agent) return;
|
|
657
|
+
const namespace = createWebmcpNamespace(catalog, agent.context.sessionId, assertAvailable);
|
|
658
|
+
context.inject([_agimon_ai_po_core_codemode.PO_CODEMODE_SERVICE], (scoped) => {
|
|
659
|
+
const registration = (0, _agimon_ai_po_core_codemode.readPoCodemode)(scoped)?.register("@agimon-ai/po-author", namespace);
|
|
660
|
+
return () => registration?.dispose();
|
|
661
|
+
});
|
|
662
|
+
};
|
|
592
663
|
return {
|
|
664
|
+
onDispose: () => {
|
|
665
|
+
disposed = true;
|
|
666
|
+
},
|
|
593
667
|
value: {
|
|
594
668
|
api: session?.api ?? api,
|
|
595
|
-
catalog
|
|
596
|
-
assertAvailable
|
|
597
|
-
if (!isActive()) throw new Error("Author mode is not active.");
|
|
598
|
-
},
|
|
669
|
+
catalog,
|
|
670
|
+
assertAvailable,
|
|
599
671
|
service: void 0
|
|
600
672
|
},
|
|
601
|
-
services: mode ? [(0, _agimon_ai_po_minor_mode.serverMinorModes)([mode])] : []
|
|
673
|
+
services: [...mode ? [(0, _agimon_ai_po_minor_mode.serverMinorModes)([mode])] : [], mountNamespace]
|
|
602
674
|
};
|
|
603
675
|
});
|
|
604
676
|
//#endregion
|
|
@@ -668,11 +740,13 @@ function createAuthorChannel() {
|
|
|
668
740
|
generation: binding.generation,
|
|
669
741
|
ownerToken: binding.ownerToken
|
|
670
742
|
}, controller.signal));
|
|
743
|
+
if (controller.signal.aborted) break;
|
|
671
744
|
if (!publish(binding, payload) || payload.kind === "rejected") break;
|
|
672
745
|
} catch (error) {
|
|
673
746
|
if (!controller.signal.aborted) host?.onNotice(error instanceof Error ? error.message : String(error));
|
|
674
747
|
break;
|
|
675
748
|
}
|
|
749
|
+
if (binding.poll === controller) binding.poll = void 0;
|
|
676
750
|
};
|
|
677
751
|
return {
|
|
678
752
|
frameType: authorChannelType,
|
|
@@ -731,6 +805,12 @@ function createAuthorChannel() {
|
|
|
731
805
|
bindingId: connection.connectionId
|
|
732
806
|
}));
|
|
733
807
|
if (reply.kind === "accepted") {
|
|
808
|
+
const current = bindings.get(key);
|
|
809
|
+
if (current?.generation === reply.generation && current.ownerToken === reply.ownerToken) {
|
|
810
|
+
publish(current, reply);
|
|
811
|
+
if (current.poll === void 0) poll(current);
|
|
812
|
+
return;
|
|
813
|
+
}
|
|
734
814
|
const binding = {
|
|
735
815
|
alias: message.alias,
|
|
736
816
|
scope,
|
|
@@ -738,7 +818,7 @@ function createAuthorChannel() {
|
|
|
738
818
|
generation: reply.generation,
|
|
739
819
|
ownerToken: reply.ownerToken
|
|
740
820
|
};
|
|
741
|
-
|
|
821
|
+
current?.poll?.abort();
|
|
742
822
|
bindings.set(key, binding);
|
|
743
823
|
publish(binding, reply);
|
|
744
824
|
poll(binding);
|
|
@@ -848,7 +928,7 @@ const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
|
|
|
848
928
|
injects: (0, _agimon_ai_po_core_extensionFile.composeRootInjects)({ session: [root_server_default] }),
|
|
849
929
|
global: (context) => ({
|
|
850
930
|
get channels() {
|
|
851
|
-
return [() => via({ frameType: "author_webmcp" }, author_webmcp_server_default
|
|
931
|
+
return [() => via({ frameType: "author_webmcp" }, at(author_webmcp_server_default, context))];
|
|
852
932
|
},
|
|
853
933
|
get methods() {
|
|
854
934
|
return [at(bridge_server_default, context)];
|
|
@@ -856,7 +936,7 @@ const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
|
|
|
856
936
|
}),
|
|
857
937
|
workspace: (context) => ({
|
|
858
938
|
get channels() {
|
|
859
|
-
return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, author_webmcp_server_default
|
|
939
|
+
return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, at(author_webmcp_server_default, context))]);
|
|
860
940
|
},
|
|
861
941
|
get methods() {
|
|
862
942
|
return [at(bridge_server_default, context)];
|
|
@@ -874,7 +954,7 @@ const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
|
|
|
874
954
|
return [at(route_server_default, contextSession)];
|
|
875
955
|
},
|
|
876
956
|
get channels() {
|
|
877
|
-
return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, author_webmcp_server_default
|
|
957
|
+
return defined([context.hosted("global") ? void 0 : () => via({ frameType: "author_webmcp" }, at(author_webmcp_server_default, context))]);
|
|
878
958
|
},
|
|
879
959
|
get commands() {
|
|
880
960
|
return [via({ name: "author" }, at(author_server_default, contextSession))];
|
|
@@ -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","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 const reusable = [...byAlias.values()].find((canvas) => canvas.closed);\n if (reusable === undefined) throw new AuthorBridgeError('Too many Author canvases in this conversation.', 409);\n reusable.bridge.close();\n byAlias.delete(reusable.alias);\n byPath.delete(reusable.realPath);\n }\n const base =\n path\n .basename(realPath)\n .replace(/\\.[^.]*$/u, '')\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/gu, '-')\n .replace(/^[^a-z]+/u, 'canvas-')\n .slice(0, 48) || 'canvas';\n 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 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(cwd: string, sessionId: string): { api: PoApi; catalog: AuthorCatalog } {\n const registry = createAuthorCanvasRegistry(cwd, createBridge, sessionId);\n return {\n catalog: {\n open: (path, signal, alias) => registry.open(path, signal, alias),\n async describe(signal, alias) {\n signal?.throwIfAborted();\n return registry.describe(alias);\n },\n execute: (input, signal) => registry.invoke(input, signal),\n },\n api: {\n basePath: API_BASE_PATH,\n start() {\n const app = createAuthorApi({ cwd, sessionId, 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 },\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
|
+
{"version":3,"file":"server.cjs","names":["parseDescribeAuthorToolsInput","parseUseAuthorToolInput","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","PO_CODEMODE_SERVICE","readPoCodemode","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/webmcpNamespace/index.ts","../../src/services/structuredDocuments/document.ts","../../src/services/authorCanvasRegistry/index.ts","../../src/types/apiRoutes.ts","../../src/types/authorApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorBridgeApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorDocumentApi.ts","../../src/extensions/workspaces/sessions/(backend)/api/author/_lib/authorApi.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/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 type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\n\nimport { parseDescribeAuthorToolsInput, parseUseAuthorToolInput } from '../../schemas/authorTools';\nimport type { AuthorCatalog } from '../authorCatalog/type';\n\n// ponytail: typed per-canvas members need a synchronous catalog reader and a shared schema converter in po-core.\nconst DECLARATIONS = `interface AuthorViewportCatalogSnapshot {\n catalogToken: string;\n tools: { name: string; label: string; description: string; inputSchema: Readonly<Record<string, unknown>> }[];\n canvases?: { alias: string; path: string; status: 'opening' | 'ready' | 'unavailable' }[];\n alias?: string;\n path?: string;\n status?: 'opening' | 'ready' | 'unavailable';\n nextStep?: string;\n}\ndeclare const webmcp: {\n /** Ready canvases, or one canvas's tools and its catalog token. */\n describe(input?: { alias?: string }): Promise<AuthorViewportCatalogSnapshot>;\n /** Call one tool with an explicit current token. Await same-canvas calls sequentially. */\n call(input: { alias?: string; catalogToken: string; name: string; arguments: Record<string, unknown> }): Promise<unknown>;\n};`;\n\nfunction copy<T>(value: T): T {\n return value === undefined ? value : JSON.parse(JSON.stringify(value));\n}\n\nexport function createWebmcpNamespace(\n catalog: AuthorCatalog,\n sessionId: string,\n assertAvailable: () => void,\n): PoCodemodeNamespace {\n return {\n name: 'webmcp',\n summary:\n 'Author canvas WebMCP: describe catalogs, then call one tool with its explicit token. Await same-canvas calls sequentially; structured errors remain data.',\n declarations: DECLARATIONS,\n bind(run) {\n if (run.sessionId !== sessionId) throw new Error('Author WebMCP namespace belongs to another session.');\n let disposed = false;\n run.onDispose(() => {\n disposed = true;\n });\n const check = () => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('Author WebMCP run is disposed.');\n assertAvailable();\n };\n const members: Record<string, unknown> = Object.create(null);\n members.describe = async (input?: unknown) => {\n check();\n const { alias } = parseDescribeAuthorToolsInput(copy(input === undefined ? {} : input));\n const result = await catalog.describe(run.signal, alias);\n check();\n return copy(result);\n };\n members.call = async (input: unknown) => {\n check();\n const parsed = parseUseAuthorToolInput(copy(input));\n const result = await catalog.execute(parsed, run.signal);\n check();\n return copy(result.result);\n };\n return members;\n },\n };\n}\n","import 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 const reusable = [...byAlias.values()].find((canvas) => canvas.closed);\n if (reusable === undefined) throw new AuthorBridgeError('Too many Author canvases in this conversation.', 409);\n reusable.bridge.close();\n byAlias.delete(reusable.alias);\n byPath.delete(reusable.realPath);\n }\n const base =\n path\n .basename(realPath)\n .replace(/\\.[^.]*$/u, '')\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/gu, '-')\n .replace(/^[^a-z]+/u, 'canvas-')\n .slice(0, 48) || 'canvas';\n 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 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(cwd: string, sessionId: string): { api: PoApi; catalog: AuthorCatalog } {\n const registry = createAuthorCanvasRegistry(cwd, createBridge, sessionId);\n return {\n catalog: {\n open: (path, signal, alias) => registry.open(path, signal, alias),\n async describe(signal, alias) {\n signal?.throwIfAborted();\n return registry.describe(alias);\n },\n execute: (input, signal) => registry.invoke(input, signal),\n },\n api: {\n basePath: API_BASE_PATH,\n start() {\n const app = createAuthorApi({ cwd, sessionId, registry });\n return { fetch: (request) => app.fetch(request), close: () => registry.dispose() };\n },\n },\n };\n}\n","import { PO_CODEMODE_SERVICE, readPoCodemode } from '@agimon-ai/po-core/codemode';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport { serverMinorModes } from '@agimon-ai/po-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { authorMinorMode } from '../../../../models/authorMode';\nimport { createAuthorCatalog } from '../../../../services/authorCatalog';\nimport { createWebmcpNamespace } from '../../../../services/webmcpNamespace';\nimport { api, createAuthorSessionApi } from './api/author/_lib/authorApi';\n\nexport default defineRoot(({ agent, signal }: 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 },\n })\n : undefined;\n let disposed = false;\n const catalog = createAuthorCatalog(session?.catalog);\n const assertAvailable = () => {\n signal.throwIfAborted();\n if (disposed) throw new Error('Author session is disposed.');\n if (!isActive()) throw new Error('Author mode is not active.');\n };\n const mountNamespace = (context: Context) => {\n if (!agent) return;\n const namespace = createWebmcpNamespace(catalog, agent.context.sessionId, assertAvailable);\n context.inject([PO_CODEMODE_SERVICE], (scoped) => {\n const registration = readPoCodemode(scoped)?.register('@agimon-ai/po-author', namespace);\n return () => registration?.dispose();\n });\n };\n return {\n onDispose: () => {\n disposed = true;\n },\n value: {\n api: session?.api ?? api,\n catalog,\n // Registration is gated by AUTHOR_TOOL_WHEN; this re-checks a call already in flight when the mode turns off.\n assertAvailable,\n service: undefined,\n },\n services: [...(mode ? [serverMinorModes([mode])] : []), mountNamespace],\n };\n});\n","import type { 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 (controller.signal.aborted) break;\n if (!publish(binding, payload) || payload.kind === 'rejected') break;\n } catch (error) {\n if (!controller.signal.aborted) host?.onNotice(error instanceof Error ? error.message : String(error));\n break;\n }\n }\n if (binding.poll === controller) binding.poll = undefined;\n };\n\n const channel: PoHubChannel = {\n frameType: authorChannelType,\n lifecycle: 'hub',\n receiveWithoutSubscription: true,\n start(channelHost) {\n host = channelHost;\n 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 current = bindings.get(key);\n if (current?.generation === reply.generation && current.ownerToken === reply.ownerToken) {\n publish(current, reply);\n if (current.poll === undefined) void poll(current);\n return;\n }\n const binding: Binding = {\n alias: message.alias,\n scope,\n connectionId: connection.connectionId,\n generation: reply.generation,\n ownerToken: reply.ownerToken,\n };\n current?.poll?.abort();\n bindings.set(key, binding);\n publish(binding, reply);\n void poll(binding);\n } else if (reply.kind === 'rejected') {\n if (previous !== undefined) publish(previous, reply);\n else\n host?.publishToConnection?.(connection.connectionId, scope.sessionId, { ...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' }, at(channelAuthorWebmcp, context))]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]); },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'author_webmcp' }, at(channelAuthorWebmcp, context))]); },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'author' }, at(commandAuthor, contextSession))]; },\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession))]; },\n get methods(): PoServerSessionPlugin['methods'] { return [at(methodBridge, context)]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(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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"}
|