@agimon-ai/po-config 0.0.0-alpha.13 → 0.0.0-alpha.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/extensions/mcp.cjs +2 -2
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.mjs +1 -1
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/server.cjs +9 -8
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +2 -2
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +6 -5
- package/dist/extensions/server.mjs.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -97,7 +97,7 @@ Major-mode, domain, and profile packages resolve their own requested changes, th
|
|
|
97
97
|
transition coordinator. Config owns the persisted selection and transition journal records used to
|
|
98
98
|
distinguish active state from pending intent.
|
|
99
99
|
|
|
100
|
-
Native session selection is serialized by the kernel and applied to retained
|
|
100
|
+
Native session selection is serialized by the kernel and applied to retained server package candidates. Config owns persisted selection and pending transition records; Po factory reload and terminal relaunch are not native authoring mechanisms.
|
|
101
101
|
|
|
102
102
|
Consumers must not edit `snapshot.harness`, bypass the coordinator, or cache launcher environment
|
|
103
103
|
state at module scope.
|
package/dist/extensions/mcp.cjs
CHANGED
|
@@ -3,13 +3,13 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
let _agimon_ai_po_core_mcpFacet = require("@agimon-ai/po-core/mcpFacet");
|
|
6
|
-
let
|
|
6
|
+
let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
|
|
7
7
|
let typebox = require("typebox");
|
|
8
8
|
//#region src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp.ts
|
|
9
9
|
var po_author_config_mcp_default = (0, _agimon_ai_po_core_mcpFacet.defineMcpSkill)({
|
|
10
10
|
name: "po-author-config",
|
|
11
11
|
description: "Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.",
|
|
12
|
-
read: () => (0,
|
|
12
|
+
read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-config/SKILL.md")
|
|
13
13
|
});
|
|
14
14
|
//#endregion
|
|
15
15
|
//#region src/schemas/mcpContextTools.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","Type","Type","defineMcpTool","defineMcpTool","defineMcpTool","defineMcpPlugin","skillPoAuthorConfig","toolLoadContext","toolRenameThread","toolShowSession"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp.ts","../../src/schemas/mcpContextTools.ts","../../src/schemas/mcpSessionView.ts","../../src/services/mcpContextTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n});\n","import { Type } from 'typebox';\n\nexport const loadContextParameters = Type.Object({}, { additionalProperties: false });\nexport const renameThreadParameters = Type.Object(\n { title: Type.String({ minLength: 1, maxLength: 256 }) },\n { additionalProperties: false },\n);\n","import { Type } from 'typebox';\n\nexport const sessionViewSchema = Type.Object(\n {\n sessionId: Type.String(),\n revision: Type.Integer({ minimum: 0 }),\n repositoryName: Type.String(),\n profile: Type.Union([Type.String(), Type.Null()]),\n majorMode: Type.String(),\n domains: Type.Array(Type.String()),\n layers: Type.Array(Type.String()),\n minorModes: Type.Array(Type.String()),\n },\n { additionalProperties: false },\n);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { loadContextParameters, renameThreadParameters } from '../../schemas/mcpContextTools';\nimport { sessionViewSchema } from '../../schemas/mcpSessionView';\nimport type { SessionView } from '../../types/sessionView';\n\nexport function createLoadContextTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_context (remote MCP only)\n name: 'load_context',\n label: 'Load context',\n description:\n 'Call at the beginning of a session, and after changing profile or modes, to load repository instructions and current session context.',\n parameters: loadContextParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute() {\n const snapshot = context.loadContext();\n return { content: [{ type: 'text', text: JSON.stringify(snapshot) }], structuredContent: { ...snapshot } };\n },\n };\n}\n\nexport function createRenameThreadTool(context: PoMcpPluginContext): PoHeadlessTool<typeof renameThreadParameters> {\n return {\n // web-plugin-tool-renderers: ignore rename_thread (remote MCP only)\n name: 'rename_thread',\n label: 'Rename thread',\n description: 'Rename the current Po conversation so its purpose is clear in the workspace session list.',\n parameters: renameThreadParameters,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { title }) {\n const next = title.trim();\n if (!next) throw new Error('Thread title cannot be empty.');\n if (context.execution.session.setName === undefined) throw new Error('Session rename is unavailable.');\n await context.execution.session.setName(next);\n return { content: [{ type: 'text', text: `Renamed thread to \"${next}\".` }] };\n },\n };\n}\n\nexport function createShowSessionTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore show_session (remote MCP only)\n name: 'show_session',\n label: 'Show session',\n description:\n 'Show or refresh a read-only summary of the current Po session. Does not load repository instructions.',\n parameters: loadContextParameters,\n outputSchema: { ...sessionViewSchema },\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n _meta: {\n ui: { visibility: ['model', 'app'] },\n 'openai/toolInvocation/invoking': 'Loading session',\n 'openai/toolInvocation/invoked': 'Session ready',\n },\n async execute() {\n const snapshot = context.loadContext();\n const view: SessionView = {\n sessionId: snapshot.session.id,\n revision: snapshot.session.revision,\n repositoryName:\n snapshot.repository.root.replaceAll('\\\\', '/').split('/').filter(Boolean).at(-1) ?? 'Repository',\n profile: snapshot.selection.profile,\n majorMode: snapshot.selection.majorMode,\n domains: [...snapshot.selection.domains],\n layers: [...snapshot.selection.activeLayers],\n minorModes: [...(snapshot.selection.minorModes ?? [])],\n };\n const text = [\n `Po session: ${view.sessionId} (revision ${view.revision})`,\n `Repository: ${view.repositoryName}`,\n `Profile: ${view.profile ?? 'Default'}`,\n `Major mode: ${view.majorMode}`,\n `Domains: ${view.domains.join(', ') || 'None'}`,\n `Layers: ${view.layers.join(', ') || 'None'}`,\n `Minor modes: ${view.minorModes.join(', ') || 'None'}`,\n ].join('\\n');\n return { content: [{ type: 'text', text }], structuredContent: { ...view }, _meta: { widgetType: 'session' } };\n },\n };\n}\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createLoadContextTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createLoadContextTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createRenameThreadTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createRenameThreadTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createShowSessionTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createShowSessionTool(context));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp';\nimport toolLoadContext from '../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp';\nimport toolRenameThread from '../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp';\nimport toolShowSession from '../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-config',\n session: (context) => ({\n get skills(): PoMcpSessionPlugin['skills'] { return [at(skillPoAuthorConfig, context)]; },\n get tools(): PoMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-config/load_context\", via({ name: 'load_context' }, at(toolLoadContext, context))), withWidget(\"@agimon-ai/po-config/rename_thread\", via({ name: 'rename_thread' }, at(toolRenameThread, context))), withWidget(\"@agimon-ai/po-config/show_session\", via({ name: 'show_session' }, at(toolShowSession, context)))]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","Type","Type","defineMcpTool","defineMcpTool","defineMcpTool","defineMcpPlugin","skillPoAuthorConfig","toolLoadContext","toolRenameThread","toolShowSession"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp.ts","../../src/schemas/mcpContextTools.ts","../../src/schemas/mcpSessionView.ts","../../src/services/mcpContextTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineMcpSkill({\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n});\n","import { Type } from 'typebox';\n\nexport const loadContextParameters = Type.Object({}, { additionalProperties: false });\nexport const renameThreadParameters = Type.Object(\n { title: Type.String({ minLength: 1, maxLength: 256 }) },\n { additionalProperties: false },\n);\n","import { Type } from 'typebox';\n\nexport const sessionViewSchema = Type.Object(\n {\n sessionId: Type.String(),\n revision: Type.Integer({ minimum: 0 }),\n repositoryName: Type.String(),\n profile: Type.Union([Type.String(), Type.Null()]),\n majorMode: Type.String(),\n domains: Type.Array(Type.String()),\n layers: Type.Array(Type.String()),\n minorModes: Type.Array(Type.String()),\n },\n { additionalProperties: false },\n);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { loadContextParameters, renameThreadParameters } from '../../schemas/mcpContextTools';\nimport { sessionViewSchema } from '../../schemas/mcpSessionView';\nimport type { SessionView } from '../../types/sessionView';\n\nexport function createLoadContextTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_context (remote MCP only)\n name: 'load_context',\n label: 'Load context',\n description:\n 'Call at the beginning of a session, and after changing profile or modes, to load repository instructions and current session context.',\n parameters: loadContextParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute() {\n const snapshot = context.loadContext();\n return { content: [{ type: 'text', text: JSON.stringify(snapshot) }], structuredContent: { ...snapshot } };\n },\n };\n}\n\nexport function createRenameThreadTool(context: PoMcpPluginContext): PoHeadlessTool<typeof renameThreadParameters> {\n return {\n // web-plugin-tool-renderers: ignore rename_thread (remote MCP only)\n name: 'rename_thread',\n label: 'Rename thread',\n description: 'Rename the current Po conversation so its purpose is clear in the workspace session list.',\n parameters: renameThreadParameters,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { title }) {\n const next = title.trim();\n if (!next) throw new Error('Thread title cannot be empty.');\n if (context.execution.session.setName === undefined) throw new Error('Session rename is unavailable.');\n await context.execution.session.setName(next);\n return { content: [{ type: 'text', text: `Renamed thread to \"${next}\".` }] };\n },\n };\n}\n\nexport function createShowSessionTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore show_session (remote MCP only)\n name: 'show_session',\n label: 'Show session',\n description:\n 'Show or refresh a read-only summary of the current Po session. Does not load repository instructions.',\n parameters: loadContextParameters,\n outputSchema: { ...sessionViewSchema },\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n _meta: {\n ui: { visibility: ['model', 'app'] },\n 'openai/toolInvocation/invoking': 'Loading session',\n 'openai/toolInvocation/invoked': 'Session ready',\n },\n async execute() {\n const snapshot = context.loadContext();\n const view: SessionView = {\n sessionId: snapshot.session.id,\n revision: snapshot.session.revision,\n repositoryName:\n snapshot.repository.root.replaceAll('\\\\', '/').split('/').filter(Boolean).at(-1) ?? 'Repository',\n profile: snapshot.selection.profile,\n majorMode: snapshot.selection.majorMode,\n domains: [...snapshot.selection.domains],\n layers: [...snapshot.selection.activeLayers],\n minorModes: [...(snapshot.selection.minorModes ?? [])],\n };\n const text = [\n `Po session: ${view.sessionId} (revision ${view.revision})`,\n `Repository: ${view.repositoryName}`,\n `Profile: ${view.profile ?? 'Default'}`,\n `Major mode: ${view.majorMode}`,\n `Domains: ${view.domains.join(', ') || 'None'}`,\n `Layers: ${view.layers.join(', ') || 'None'}`,\n `Minor modes: ${view.minorModes.join(', ') || 'None'}`,\n ].join('\\n');\n return { content: [{ type: 'text', text }], structuredContent: { ...view }, _meta: { widgetType: 'session' } };\n },\n };\n}\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createLoadContextTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createLoadContextTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createRenameThreadTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createRenameThreadTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createShowSessionTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createShowSessionTool(context));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp';\nimport toolLoadContext from '../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp';\nimport toolRenameThread from '../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp';\nimport toolShowSession from '../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-config',\n session: (context) => ({\n get skills(): PoMcpSessionPlugin['skills'] { return [at(skillPoAuthorConfig, context)]; },\n get tools(): PoMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-config/load_context\", via({ name: 'load_context' }, at(toolLoadContext, context))), withWidget(\"@agimon-ai/po-config/rename_thread\", via({ name: 'rename_thread' }, at(toolRenameThread, context))), withWidget(\"@agimon-ai/po-config/show_session\", via({ name: 'show_session' }, at(toolShowSession, context)))]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|
package/dist/extensions/mcp.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineMcpPlugin, defineMcpSkill, defineMcpTool } from "@agimon-ai/po-core/mcpFacet";
|
|
2
|
-
import { readPackageResource } from "@agimon-ai/po-core/
|
|
2
|
+
import { readPackageResource } from "@agimon-ai/po-core/serverPlugin";
|
|
3
3
|
import { Type } from "typebox";
|
|
4
4
|
//#region src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp.ts
|
|
5
5
|
var po_author_config_mcp_default = defineMcpSkill({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.mjs","names":["skillPoAuthorConfig","toolLoadContext","toolRenameThread","toolShowSession"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp.ts","../../src/schemas/mcpContextTools.ts","../../src/schemas/mcpSessionView.ts","../../src/services/mcpContextTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n});\n","import { Type } from 'typebox';\n\nexport const loadContextParameters = Type.Object({}, { additionalProperties: false });\nexport const renameThreadParameters = Type.Object(\n { title: Type.String({ minLength: 1, maxLength: 256 }) },\n { additionalProperties: false },\n);\n","import { Type } from 'typebox';\n\nexport const sessionViewSchema = Type.Object(\n {\n sessionId: Type.String(),\n revision: Type.Integer({ minimum: 0 }),\n repositoryName: Type.String(),\n profile: Type.Union([Type.String(), Type.Null()]),\n majorMode: Type.String(),\n domains: Type.Array(Type.String()),\n layers: Type.Array(Type.String()),\n minorModes: Type.Array(Type.String()),\n },\n { additionalProperties: false },\n);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { loadContextParameters, renameThreadParameters } from '../../schemas/mcpContextTools';\nimport { sessionViewSchema } from '../../schemas/mcpSessionView';\nimport type { SessionView } from '../../types/sessionView';\n\nexport function createLoadContextTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_context (remote MCP only)\n name: 'load_context',\n label: 'Load context',\n description:\n 'Call at the beginning of a session, and after changing profile or modes, to load repository instructions and current session context.',\n parameters: loadContextParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute() {\n const snapshot = context.loadContext();\n return { content: [{ type: 'text', text: JSON.stringify(snapshot) }], structuredContent: { ...snapshot } };\n },\n };\n}\n\nexport function createRenameThreadTool(context: PoMcpPluginContext): PoHeadlessTool<typeof renameThreadParameters> {\n return {\n // web-plugin-tool-renderers: ignore rename_thread (remote MCP only)\n name: 'rename_thread',\n label: 'Rename thread',\n description: 'Rename the current Po conversation so its purpose is clear in the workspace session list.',\n parameters: renameThreadParameters,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { title }) {\n const next = title.trim();\n if (!next) throw new Error('Thread title cannot be empty.');\n if (context.execution.session.setName === undefined) throw new Error('Session rename is unavailable.');\n await context.execution.session.setName(next);\n return { content: [{ type: 'text', text: `Renamed thread to \"${next}\".` }] };\n },\n };\n}\n\nexport function createShowSessionTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore show_session (remote MCP only)\n name: 'show_session',\n label: 'Show session',\n description:\n 'Show or refresh a read-only summary of the current Po session. Does not load repository instructions.',\n parameters: loadContextParameters,\n outputSchema: { ...sessionViewSchema },\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n _meta: {\n ui: { visibility: ['model', 'app'] },\n 'openai/toolInvocation/invoking': 'Loading session',\n 'openai/toolInvocation/invoked': 'Session ready',\n },\n async execute() {\n const snapshot = context.loadContext();\n const view: SessionView = {\n sessionId: snapshot.session.id,\n revision: snapshot.session.revision,\n repositoryName:\n snapshot.repository.root.replaceAll('\\\\', '/').split('/').filter(Boolean).at(-1) ?? 'Repository',\n profile: snapshot.selection.profile,\n majorMode: snapshot.selection.majorMode,\n domains: [...snapshot.selection.domains],\n layers: [...snapshot.selection.activeLayers],\n minorModes: [...(snapshot.selection.minorModes ?? [])],\n };\n const text = [\n `Po session: ${view.sessionId} (revision ${view.revision})`,\n `Repository: ${view.repositoryName}`,\n `Profile: ${view.profile ?? 'Default'}`,\n `Major mode: ${view.majorMode}`,\n `Domains: ${view.domains.join(', ') || 'None'}`,\n `Layers: ${view.layers.join(', ') || 'None'}`,\n `Minor modes: ${view.minorModes.join(', ') || 'None'}`,\n ].join('\\n');\n return { content: [{ type: 'text', text }], structuredContent: { ...view }, _meta: { widgetType: 'session' } };\n },\n };\n}\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createLoadContextTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createLoadContextTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createRenameThreadTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createRenameThreadTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createShowSessionTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createShowSessionTool(context));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp';\nimport toolLoadContext from '../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp';\nimport toolRenameThread from '../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp';\nimport toolShowSession from '../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-config',\n session: (context) => ({\n get skills(): PoMcpSessionPlugin['skills'] { return [at(skillPoAuthorConfig, context)]; },\n get tools(): PoMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-config/load_context\", via({ name: 'load_context' }, at(toolLoadContext, context))), withWidget(\"@agimon-ai/po-config/rename_thread\", via({ name: 'rename_thread' }, at(toolRenameThread, context))), withWidget(\"@agimon-ai/po-config/show_session\", via({ name: 'show_session' }, at(toolShowSession, context)))]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp.mjs","names":["skillPoAuthorConfig","toolLoadContext","toolRenameThread","toolShowSession"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp.ts","../../src/schemas/mcpContextTools.ts","../../src/schemas/mcpSessionView.ts","../../src/services/mcpContextTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineMcpSkill({\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n});\n","import { Type } from 'typebox';\n\nexport const loadContextParameters = Type.Object({}, { additionalProperties: false });\nexport const renameThreadParameters = Type.Object(\n { title: Type.String({ minLength: 1, maxLength: 256 }) },\n { additionalProperties: false },\n);\n","import { Type } from 'typebox';\n\nexport const sessionViewSchema = Type.Object(\n {\n sessionId: Type.String(),\n revision: Type.Integer({ minimum: 0 }),\n repositoryName: Type.String(),\n profile: Type.Union([Type.String(), Type.Null()]),\n majorMode: Type.String(),\n domains: Type.Array(Type.String()),\n layers: Type.Array(Type.String()),\n minorModes: Type.Array(Type.String()),\n },\n { additionalProperties: false },\n);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { loadContextParameters, renameThreadParameters } from '../../schemas/mcpContextTools';\nimport { sessionViewSchema } from '../../schemas/mcpSessionView';\nimport type { SessionView } from '../../types/sessionView';\n\nexport function createLoadContextTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_context (remote MCP only)\n name: 'load_context',\n label: 'Load context',\n description:\n 'Call at the beginning of a session, and after changing profile or modes, to load repository instructions and current session context.',\n parameters: loadContextParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute() {\n const snapshot = context.loadContext();\n return { content: [{ type: 'text', text: JSON.stringify(snapshot) }], structuredContent: { ...snapshot } };\n },\n };\n}\n\nexport function createRenameThreadTool(context: PoMcpPluginContext): PoHeadlessTool<typeof renameThreadParameters> {\n return {\n // web-plugin-tool-renderers: ignore rename_thread (remote MCP only)\n name: 'rename_thread',\n label: 'Rename thread',\n description: 'Rename the current Po conversation so its purpose is clear in the workspace session list.',\n parameters: renameThreadParameters,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { title }) {\n const next = title.trim();\n if (!next) throw new Error('Thread title cannot be empty.');\n if (context.execution.session.setName === undefined) throw new Error('Session rename is unavailable.');\n await context.execution.session.setName(next);\n return { content: [{ type: 'text', text: `Renamed thread to \"${next}\".` }] };\n },\n };\n}\n\nexport function createShowSessionTool(context: PoMcpPluginContext): PoHeadlessTool<typeof loadContextParameters> {\n return {\n // web-plugin-tool-renderers: ignore show_session (remote MCP only)\n name: 'show_session',\n label: 'Show session',\n description:\n 'Show or refresh a read-only summary of the current Po session. Does not load repository instructions.',\n parameters: loadContextParameters,\n outputSchema: { ...sessionViewSchema },\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n _meta: {\n ui: { visibility: ['model', 'app'] },\n 'openai/toolInvocation/invoking': 'Loading session',\n 'openai/toolInvocation/invoked': 'Session ready',\n },\n async execute() {\n const snapshot = context.loadContext();\n const view: SessionView = {\n sessionId: snapshot.session.id,\n revision: snapshot.session.revision,\n repositoryName:\n snapshot.repository.root.replaceAll('\\\\', '/').split('/').filter(Boolean).at(-1) ?? 'Repository',\n profile: snapshot.selection.profile,\n majorMode: snapshot.selection.majorMode,\n domains: [...snapshot.selection.domains],\n layers: [...snapshot.selection.activeLayers],\n minorModes: [...(snapshot.selection.minorModes ?? [])],\n };\n const text = [\n `Po session: ${view.sessionId} (revision ${view.revision})`,\n `Repository: ${view.repositoryName}`,\n `Profile: ${view.profile ?? 'Default'}`,\n `Major mode: ${view.majorMode}`,\n `Domains: ${view.domains.join(', ') || 'None'}`,\n `Layers: ${view.layers.join(', ') || 'None'}`,\n `Minor modes: ${view.minorModes.join(', ') || 'None'}`,\n ].join('\\n');\n return { content: [{ type: 'text', text }], structuredContent: { ...view }, _meta: { widgetType: 'session' } };\n },\n };\n}\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createLoadContextTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createLoadContextTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createRenameThreadTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createRenameThreadTool(context));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createShowSessionTool } from '../../../../../services/mcpContextTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => createShowSessionTool(context));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/skill/po-author-config.mcp';\nimport toolLoadContext from '../src/extensions/workspaces/sessions/(backend)/tool/load_context.mcp';\nimport toolRenameThread from '../src/extensions/workspaces/sessions/(backend)/tool/rename_thread.mcp';\nimport toolShowSession from '../src/extensions/workspaces/sessions/(backend)/tool/show_session.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-config',\n session: (context) => ({\n get skills(): PoMcpSessionPlugin['skills'] { return [at(skillPoAuthorConfig, context)]; },\n get tools(): PoMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-config/load_context\", via({ name: 'load_context' }, at(toolLoadContext, context))), withWidget(\"@agimon-ai/po-config/rename_thread\", via({ name: 'rename_thread' }, at(toolRenameThread, context))), withWidget(\"@agimon-ai/po-config/show_session\", via({ name: 'show_session' }, at(toolShowSession, context)))]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ const require_profiles = require("../profiles-t2EUj0aB.cjs");
|
|
|
13
13
|
const require_sessionConfig = require("../sessionConfig-DeP6pplT.cjs");
|
|
14
14
|
let _agimon_ai_po_core_platform = require("@agimon-ai/po-core/platform");
|
|
15
15
|
let _agimon_ai_po_core_mcpProjection = require("@agimon-ai/po-core/mcpProjection");
|
|
16
|
-
let
|
|
16
|
+
let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
|
|
17
17
|
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
18
18
|
let _agimon_ai_po_core_notification = require("@agimon-ai/po-core/notification");
|
|
19
19
|
let _agimon_ai_po_core_readiness = require("@agimon-ai/po-core/readiness");
|
|
@@ -466,17 +466,18 @@ var po_author_config_server_default = (0, _agimon_ai_po_core_extensionFile.defin
|
|
|
466
466
|
}
|
|
467
467
|
},
|
|
468
468
|
kind: "skill",
|
|
469
|
-
path: (0,
|
|
470
|
-
read: () => (0,
|
|
469
|
+
path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-config/SKILL.md"),
|
|
470
|
+
read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-config/SKILL.md")
|
|
471
471
|
});
|
|
472
472
|
//#endregion
|
|
473
473
|
//#region generated/server.ts
|
|
474
474
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
475
475
|
/* v8 ignore next -- generated normalization branch */
|
|
476
476
|
const defined = (values) => values.filter((value) => value !== void 0);
|
|
477
|
-
const
|
|
477
|
+
const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
|
|
478
478
|
name: "@agimon-ai/po-config",
|
|
479
|
-
providerOverrides: (0,
|
|
479
|
+
providerOverrides: (0, _agimon_ai_po_core_serverPlugin.composeServerProviderOverrides)(root_server_default),
|
|
480
|
+
injects: (0, _agimon_ai_po_core_extensionFile.composeRootInjects)({ session: [root_server_default] }),
|
|
480
481
|
global: (context) => ({ get api() {
|
|
481
482
|
return defined([at(route_server_default, context)]);
|
|
482
483
|
} }),
|
|
@@ -484,7 +485,7 @@ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
|
|
|
484
485
|
return defined([at(route_server_default, context)]);
|
|
485
486
|
} }),
|
|
486
487
|
session: async (context) => {
|
|
487
|
-
const scopeSession = await root_server_default
|
|
488
|
+
const scopeSession = await context.scopeRoot("session", root_server_default, context);
|
|
488
489
|
const contextSession = {
|
|
489
490
|
...context,
|
|
490
491
|
root: scopeSession.value
|
|
@@ -505,7 +506,7 @@ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
|
|
|
505
506
|
}
|
|
506
507
|
});
|
|
507
508
|
//#endregion
|
|
508
|
-
exports.default =
|
|
509
|
-
exports.
|
|
509
|
+
exports.default = serverPlugin;
|
|
510
|
+
exports.serverPlugin = serverPlugin;
|
|
510
511
|
|
|
511
512
|
//# sourceMappingURL=server.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["createPoReadinessCoordinator","readPoNotificationService","PO_READINESS_SERVICE","createPoTelemetry","createNativePoConfigContext","withAbortSignal","BACKGROUND_CONTEXT","isPoMcpProjection","createDisabledPoMcpProjection","PO_MCP_PROJECTION_SERVICE","createPoMcpProjectionService","defineRoot","requirePoFs","defineApiRoutes","apiResponse","repositoryPoConfigPath","globalPoConfigPath","loadPoConfigLayers","loadMajorModesConfig","loadDomains","loadProfiles","defaultDomainsForMajorMode","configScopeOf","BACKGROUND_CONTEXT","readPiImageSettings","DEFAULT_IMAGE_MAX_DIMENSION","routes","savePiImageSettingsAsync","writePoConfigValuesAsync","repositoryPoConfigPath","configScopeOf","defineRoutedContribution","requirePoFs","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","composeServerProviderOverrides","rootSession","apiRoute","composeRootHooks","resourcePoAuthorConfig"],"sources":["../../src/constants/config.ts","../../src/services/configRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/constants/settings.ts","../../src/types/apiRoutes.ts","../../src/services/settings/index.ts","../../src/services/settingsApi/index.ts","../../src/extensions/(backend)/api/settings/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.server.ts","../../generated/server.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/po-config';\nexport const CONFIG_HELP_SKILL = {\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n};\n","import type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport {\n createDisabledPoMcpProjection,\n createPoMcpProjectionService,\n PO_MCP_PROJECTION_SERVICE,\n isPoMcpProjection,\n} from '@agimon-ai/po-core/mcpProjection';\nimport { readPoNotificationService } from '@agimon-ai/po-core/notification';\nimport { BACKGROUND_CONTEXT, withAbortSignal, type FileSystem } from '@agimon-ai/po-core/platform';\nimport {\n createPoReadinessCoordinator,\n PO_READINESS_SERVICE,\n type PoReadinessNotification,\n} from '@agimon-ai/po-core/readiness';\nimport { createPoTelemetry } from '@agimon-ai/po-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { PACKAGE_SOURCE } from '../../constants/config';\nimport { createNativePoConfigContext, providePoConfigContext } from '../sessionConfig';\nimport type { ConfigRuntime } from './type';\n\n/** One native session fiber owns initialization and all of its services. */\nexport function createConfigRuntime(\n cordis: Context,\n execution: PoHeadlessExecutionContext,\n fs: FileSystem,\n lifetime?: AbortSignal,\n): ConfigRuntime {\n const generation = `${execution.sessionId}:${crypto.randomUUID()}`;\n let active = true;\n const readiness = createPoReadinessCoordinator({\n notify(notification: PoReadinessNotification) {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n const body = `${notification.packageId} initialization ${notification.state}: ${detail}`;\n const service = readPoNotificationService(cordis);\n // Both routes are best effort. The coordinator retains the failed outcome.\n try {\n void Promise.allSettled([\n Promise.resolve(\n service ? service.request({ body, level: 'warning' }) : execution.client.notify({ body, level: 'warning' }),\n ),\n ]);\n } catch (error) {\n process.emitWarning(`Config warning delivery failed: ${String(error)}`);\n }\n },\n });\n cordis.provide(PO_READINESS_SERVICE, readiness);\n const telemetry = createPoTelemetry({\n serviceName: 'po-config',\n packageName: PACKAGE_SOURCE,\n cwd: execution.cwd,\n env: execution.environment,\n enableLogs: true,\n enableTraces: true,\n });\n let initializationTask: Promise<void> = Promise.resolve();\n const cancel = (): void => {\n active = false;\n void Promise.allSettled([readiness.dispose()]);\n };\n lifetime?.addEventListener('abort', cancel, { once: true });\n cordis.effect(\n () => async () => {\n active = false;\n lifetime?.removeEventListener('abort', cancel);\n await Promise.allSettled([readiness.dispose(), initializationTask]);\n await telemetry.shutdown();\n },\n `${PACKAGE_SOURCE}/session`,\n );\n const handle = readiness.start<void>(PACKAGE_SOURCE, generation, async (signal) => {\n const config = await createNativePoConfigContext(execution, fs, withAbortSignal(signal, BACKGROUND_CONTEXT));\n signal.throwIfAborted();\n if (!active) throw new Error(`Po Config initialization was superseded: ${generation}.`);\n providePoConfigContext(cordis, config, `${generation}:config`);\n const repoRoot = config.harness.root ?? execution.cwd;\n const stagingDirectory = config.harness.temporaryDirectory ?? execution.cwd;\n const projection =\n config.harness.mcp &&\n isPoMcpProjection(config.harness.mcpProjection) &&\n config.harness.mcpProjection.repoRoot === repoRoot\n ? config.harness.mcpProjection\n : createDisabledPoMcpProjection({ repoRoot, stagingDirectory });\n cordis.provide(\n PO_MCP_PROJECTION_SERVICE,\n createPoMcpProjectionService({\n sessionId: execution.sessionId,\n generation: `${generation}:mcp-projection`,\n projection,\n }),\n );\n void Promise.allSettled([\n telemetry.recordEvent('po_config.context_bound', {\n 'config.major_mode': config.harness.majorMode,\n 'config.domain_count': config.harness.domains.length,\n 'config.has_profile': config.harness.profile !== undefined,\n 'config.requires_relaunch': config.requiresRelaunch,\n }),\n ]);\n return { value: undefined };\n });\n initializationTask = handle.wait();\n if (lifetime?.aborted) cancel();\n void Promise.allSettled([initializationTask]);\n return { ready: initializationTask };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createConfigRuntime } from '../../../../services/configRuntime';\nimport type { ConfigRuntime } from '../../../../services/configRuntime/type';\n\nexport default defineRoot(({ agent, context: root, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Config initialization requires the native session host.');\n const fs = requirePoFs(root);\n let runtime: ConfigRuntime | undefined;\n return {\n value: undefined,\n services: [\n (context: Context) => {\n runtime = createConfigRuntime(context, agent.context, fs, signal);\n },\n ],\n async onStart() {\n if (!runtime) throw new Error('Native config initializer was not installed.');\n // Pi previously awaited the barrier, then reported handler errors and continued.\n // Keep that degraded outcome, observable through readiness and notification.\n await Promise.allSettled([runtime.ready]);\n },\n };\n});\n","export const KEY_SEPARATOR = '.';\n\n/** The repeatable query parameter naming which keys a read is about. */\nexport const KEY_QUERY_PARAM = 'key';\n\nexport const SELECTION_KEYS = {\n majorMode: ['selection', 'majorMode'],\n domains: ['selection', 'domains'],\n profile: ['selection', 'profile'],\n} as const;\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport { KEY_QUERY_PARAM } from '../constants/settings';\nimport type { RepositorySettingsView, SettingsConfigView, SettingsImagesView, SettingsRepository } from './settings';\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/(backend)/api/settings/`, so the mount is stated once, by the\n * folder that creates it. `settings` is the host's own API: it answers at\n * `/api/settings` and `/api/workspaces/<id>/settings`, beside `/plugins` rather\n * than under it, and the client knows that from the base path alone.\n *\n * This is the one file the mount's dispatcher and, once the client crosses the\n * package boundary, the cockpit both read, so a path cannot move on one side\n * alone.\n */\nexport default defineApiRoutes({\n /** The mount itself: the selected keys and the hash of each file they came from. */\n config: {\n method: 'GET',\n path: '/',\n /** Repeatable. The page also sends `repoRoot`, which the mount ignores: it serves one repository. */\n query: [KEY_QUERY_PARAM],\n response: apiResponse<SettingsConfigView>(),\n },\n value: {\n method: 'PUT',\n path: '/value',\n response: apiResponse<SettingsConfigView>(),\n },\n repositories: {\n method: 'GET',\n path: '/repositories',\n response: apiResponse<{ repositories: readonly SettingsRepository[] }>(),\n },\n /** The workspace this mount was bound to; a global mount has none and answers 404. */\n repository: {\n method: 'GET',\n path: '/repository',\n response: apiResponse<RepositorySettingsView>(),\n },\n selection: {\n method: 'PUT',\n path: '/repository/selection',\n response: apiResponse<RepositorySettingsView>(),\n },\n /** Pi's own image limits, served by the global mount only. */\n images: {\n method: 'GET',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n /** The same path as `images`; the method is the whole of the difference. */\n saveImages: {\n method: 'PUT',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n});\n","import type { PoApiContext } from '@agimon-ai/po-core/packageApi';\n\nimport { KEY_SEPARATOR, SELECTION_KEYS } from '../../constants/settings';\nimport type {\n RepositoryCatalogOption,\n RepositorySelectionChanges,\n RepositorySelectionWriteRequest,\n RepositorySettingsView,\n SettingsConfigView,\n SettingsRepository,\n SettingsScope,\n SettingsValueView,\n SettingsBatchWriteRequest,\n} from '../../types/settings';\nimport { globalPoConfigPath, loadPoConfigLayers, repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { defaultDomainsForMajorMode, loadDomains } from '../domains';\nimport { loadMajorModesConfig } from '../majorModes';\nimport { loadProfiles } from '../profiles';\n\ntype SelectionKey = keyof typeof SELECTION_KEYS;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** The display form of a config value; a record has no single-line form, so it has none. */\nexport function displayValue(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return value.map((entry) => displayValue(entry) ?? '').join(', ');\n return undefined;\n}\n\nexport function pathFor(scope: SettingsScope, repoRoot: string, homeDirectory: string | undefined): string {\n return scope === 'repository' ? repositoryPoConfigPath(repoRoot) : globalPoConfigPath(homeDirectory);\n}\n\nexport function parseWrite(body: unknown): SettingsBatchWriteRequest | undefined {\n if (!isRecord(body)) return undefined;\n const { repoRoot, scope, expectedHash } = body;\n if (typeof repoRoot !== 'string' || (scope !== 'global' && scope !== 'repository')) return undefined;\n if (scope === 'repository' && repoRoot === '') return undefined;\n if (typeof expectedHash !== 'string') return undefined;\n const edits = body.edits === undefined ? [{ keyPath: body.keyPath, value: body.value }] : body.edits;\n if (!Array.isArray(edits) || edits.length === 0 || edits.length > 100) return undefined;\n const validated: Array<SettingsBatchWriteRequest['edits'][number]> = [];\n for (const edit of edits) {\n if (!isRecord(edit)) return undefined;\n const { keyPath, value } = edit;\n if (!Array.isArray(keyPath) || keyPath.length === 0 || keyPath.some((part) => typeof part !== 'string'))\n return undefined;\n if (value !== null && typeof value !== 'string' && (typeof value !== 'number' || !Number.isFinite(value)))\n return undefined;\n validated.push({ keyPath: keyPath as string[], value });\n }\n return { repoRoot, scope, expectedHash, edits: validated };\n}\n\nexport function configuredSelectionValue<T>(\n layers: ReturnType<typeof loadPoConfigLayers>,\n key: SelectionKey,\n effective: T | undefined,\n): { effective?: T; repository?: T; origin: 'global' | 'repository' | 'default' } {\n const origin = layers.originOf(SELECTION_KEYS[key]);\n return {\n ...(effective === undefined ? {} : { effective }),\n ...(origin === 'repository' && effective !== undefined ? { repository: effective } : {}),\n origin,\n };\n}\n\nexport function repositorySettingsView(\n repository: SettingsRepository,\n homeDirectory: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): RepositorySettingsView {\n const repoRoot = repository.path;\n const layers = loadPoConfigLayers(repoRoot, homeDirectory, environment);\n const modes = loadMajorModesConfig(repoRoot, homeDirectory, environment);\n const domains = loadDomains(repoRoot, homeDirectory);\n const profiles = loadProfiles(repoRoot, homeDirectory);\n const configured = layers.effective.selection;\n const effectiveMajorMode = configured?.majorMode ?? modes.defaultMajorMode;\n const effectiveDomains =\n configured?.domains ?? defaultDomainsForMajorMode(effectiveMajorMode, {}, domains.defaultDomains);\n const majorModes: RepositoryCatalogOption[] = Object.entries(modes.majorMode)\n .map(([name, definition]) => ({ name, description: definition.description, layers: definition.layers }))\n .sort((left, right) => left.name.localeCompare(right.name));\n const domainOptions: RepositoryCatalogOption[] = [\n ...Object.entries(domains.domains).map(([name, definition]) => ({\n name,\n ...(definition.description ? { description: definition.description } : {}),\n })),\n ...Object.entries(domains.aliases).map(([name, expandsTo]) => ({\n name,\n description: `Alias for ${expandsTo.join(', ') || 'no domains'}.`,\n expandsTo,\n })),\n ].sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n repository,\n hash: layers.repositoryFile.hash,\n catalogs: {\n majorModes,\n domains: domainOptions,\n profiles: profiles.map((profile) => ({ name: profile.name })),\n },\n selection: {\n majorMode: configuredSelectionValue(layers, 'majorMode', effectiveMajorMode),\n domains: configuredSelectionValue(layers, 'domains', effectiveDomains),\n profile: configuredSelectionValue(layers, 'profile', configured?.profile),\n },\n };\n}\n\nexport function parseSelectionChanges(value: unknown): RepositorySelectionChanges | undefined {\n if (!isRecord(value)) return undefined;\n const keys = Object.keys(value);\n if (keys.length === 0 || keys.some((key) => !Object.hasOwn(SELECTION_KEYS, key))) return undefined;\n const changes: RepositorySelectionChanges = {};\n if (Object.hasOwn(value, 'majorMode')) {\n if (value.majorMode !== null && (typeof value.majorMode !== 'string' || value.majorMode.trim() === ''))\n return undefined;\n changes.majorMode = value.majorMode === null ? null : value.majorMode.trim();\n }\n if (Object.hasOwn(value, 'domains')) {\n if (\n value.domains !== null &&\n (!Array.isArray(value.domains) || value.domains.some((name) => typeof name !== 'string' || name.trim() === ''))\n ) {\n return undefined;\n }\n changes.domains =\n value.domains === null ? null : [...new Set((value.domains as string[]).map((name) => name.trim()))];\n }\n if (Object.hasOwn(value, 'profile')) {\n if (value.profile !== null && (typeof value.profile !== 'string' || value.profile.trim() === '')) return undefined;\n changes.profile = value.profile === null ? null : value.profile.trim();\n }\n return changes;\n}\n\nexport function parseSelectionWrite(value: unknown): RepositorySelectionWriteRequest | undefined {\n if (!isRecord(value) || typeof value.repositoryId !== 'string' || typeof value.expectedHash !== 'string')\n return undefined;\n const changes = parseSelectionChanges(value.changes);\n return changes === undefined\n ? undefined\n : { repositoryId: value.repositoryId, expectedHash: value.expectedHash, changes };\n}\n\nexport function validateSelectionChanges(\n view: RepositorySettingsView,\n changes: RepositorySelectionChanges,\n): string | undefined {\n if (changes.majorMode !== undefined && changes.majorMode !== null) {\n if (!view.catalogs.majorModes.some((mode) => mode.name === changes.majorMode)) {\n return `Unknown major mode '${changes.majorMode}'.`;\n }\n }\n if (changes.domains !== undefined && changes.domains !== null) {\n const known = new Set(view.catalogs.domains.map((domain) => domain.name));\n const unknown = changes.domains.find((domain) => !known.has(domain));\n if (unknown !== undefined) return `Unknown domain '${unknown}'.`;\n }\n if (changes.profile !== undefined && changes.profile !== null) {\n if (!view.catalogs.profiles.some((profile) => profile.name === changes.profile)) {\n return `Unknown profile '${changes.profile}'.`;\n }\n }\n return undefined;\n}\n\nexport function selectionEdits(changes: RepositorySelectionChanges) {\n return (Object.entries(changes) as Array<[SelectionKey, string | readonly string[] | null]>).map(([key, value]) => ({\n keyPath: SELECTION_KEYS[key],\n ...(value === null ? {} : { value }),\n }));\n}\n\nexport function configView(context: PoApiContext, keys: readonly string[]): SettingsConfigView {\n const root = context.scope === 'workspace' ? context.workspaceRoot : undefined;\n const layers = loadPoConfigLayers(root, context.homeDirectory, context.environment);\n const values: Record<string, SettingsValueView> = {};\n for (const key of keys) {\n const keyPath = key.split(KEY_SEPARATOR);\n const value = displayValue(layers.valueAt(keyPath));\n values[key] = {\n ...(value === undefined ? {} : { value }),\n origin: layers.originOf(keyPath),\n scope: configScopeOf(keyPath),\n };\n }\n return {\n repoRoot: root ?? '',\n values,\n hashes: { global: layers.globalFile.hash, repository: layers.repositoryFile.hash },\n };\n}\n","import type { PoApi } from '@agimon-ai/po-core/packageApi';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { KEY_QUERY_PARAM, KEY_SEPARATOR } from '../../constants/settings';\nimport routes from '../../types/apiRoutes';\nimport type { SettingsRepository } from '../../types/settings';\nimport { repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { writePoConfigValuesAsync } from '../configWriter';\nimport { DEFAULT_IMAGE_MAX_DIMENSION, MIN_IMAGE_MAX_DIMENSION } from '../imageSettings';\nimport { readPiImageSettings, savePiImageSettingsAsync } from '../piConfig';\nimport {\n configView,\n describe,\n isRecord,\n parseSelectionWrite,\n parseWrite,\n pathFor,\n repositorySettingsView,\n selectionEdits,\n validateSelectionChanges,\n} from '../settings';\n\n/** One declared route, as much of it as a comparison needs. */\ntype RouteSpec = { readonly method: string; readonly path: string };\n\n/**\n * Config handlers are bound to their mount. Request paths cannot choose a different repository.\n * Writes and image settings go through the host's FileSystem.\n */\nexport const createSettingsApi = (fs: FileSystem): PoApi => ({\n basePath: 'settings',\n start(context) {\n if (context.scope === 'session') throw new Error('Configuration settings require a global or workspace mount.');\n const { homeDirectory } = context;\n const repository = (): SettingsRepository | undefined =>\n context.scope === 'workspace' && context.workspaceId && context.workspaceRoot\n ? {\n id: context.workspaceId,\n name: context.workspaceRoot.split('/').at(-1) ?? context.workspaceId,\n path: context.workspaceRoot,\n active: context.repositories?.().find((entry) => entry.id === context.workspaceId)?.active ?? false,\n }\n : undefined;\n const io = BACKGROUND_CONTEXT;\n const imageView = async () => ({\n ...(await readPiImageSettings(fs, io, homeDirectory)),\n minDimension: MIN_IMAGE_MAX_DIMENSION,\n maxAllowedDimension: DEFAULT_IMAGE_MAX_DIMENSION,\n });\n let writes: Promise<unknown> = Promise.resolve();\n let closed = false;\n const dispatch = async (request: Request): Promise<Response> => {\n if (closed) return Response.json({ error: 'Configuration mount is closed.' }, { status: 503 });\n const url = new URL(request.url);\n /**\n * Whether this request addresses one declared route.\n *\n * The table owns both halves of the comparison, so the path this mount\n * answers and the path the client asks for cannot drift apart: there is\n * one spelling of each, in `src/types/apiRoutes`.\n */\n const addresses = (route: RouteSpec): boolean => url.pathname === route.path && request.method === route.method;\n const currentRepository = repository();\n if (addresses(routes.config)) return Response.json(configView(context, url.searchParams.getAll(KEY_QUERY_PARAM)));\n if (addresses(routes.repositories)) return Response.json({ repositories: context.repositories?.() ?? [] });\n if (addresses(routes.repository)) {\n return currentRepository\n ? Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment))\n : Response.json({ error: 'Choose a workspace.' }, { status: 404 });\n }\n // One path, two methods, so the branch is on the path the pair share.\n if (url.pathname === routes.images.path && context.scope === 'global') {\n if (request.method === routes.images.method) return Response.json(await imageView());\n if (request.method === routes.saveImages.method) {\n const body: unknown = await request.json();\n if (\n !isRecord(body) ||\n (body.autoResize !== undefined && typeof body.autoResize !== 'boolean') ||\n (body.maxDimension !== undefined &&\n (typeof body.maxDimension !== 'number' || !Number.isFinite(body.maxDimension)))\n )\n return Response.json({ error: 'Invalid image settings.' }, { status: 400 });\n await savePiImageSettingsAsync(\n fs,\n {\n ...(typeof body.autoResize === 'boolean' ? { autoResize: body.autoResize } : {}),\n ...(typeof body.maxDimension === 'number' ? { maxDimension: body.maxDimension } : {}),\n },\n io,\n homeDirectory,\n );\n context.configurationChanged?.();\n return Response.json(await imageView());\n }\n }\n if (addresses(routes.selection)) {\n const body = parseSelectionWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A selection write needs typed changes and a file hash.' }, { status: 400 });\n if (!currentRepository || body.repositoryId !== currentRepository.id)\n return Response.json({ error: 'Workspace not found in this mount.' }, { status: 404 });\n const before = repositorySettingsView(currentRepository, homeDirectory, context.environment);\n if (before.hash !== body.expectedHash)\n return Response.json(\n { error: 'The repository config changed since it was read.', hash: before.hash },\n { status: 409 },\n );\n const invalid = validateSelectionChanges(before, body.changes);\n if (invalid) return Response.json({ error: invalid }, { status: 422 });\n await writePoConfigValuesAsync(\n fs,\n repositoryPoConfigPath(currentRepository.path),\n selectionEdits(body.changes),\n io,\n { scope: 'repository' },\n );\n context.configurationChanged?.();\n return Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment));\n }\n if (addresses(routes.value)) {\n const body = parseWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A save requires a scope, key, value and file hash.' }, { status: 400 });\n const scope = context.scope === 'global' ? 'global' : 'repository';\n if (body.scope !== scope || (scope === 'repository' && body.repoRoot !== currentRepository?.path))\n return Response.json({ error: 'The write targets a different mount.' }, { status: 403 });\n if (\n body.edits.some((edit) => {\n const allowed = configScopeOf(edit.keyPath);\n return allowed !== 'both' && allowed !== scope;\n })\n )\n return Response.json({ error: 'This key cannot be set at this scope.' }, { status: 409 });\n const before = configView(context, []);\n if (before.hashes[scope] !== body.expectedHash)\n return Response.json(\n { error: 'The config changed since it was read.', hash: before.hashes[scope] },\n { status: 409 },\n );\n const target = pathFor(scope, currentRepository?.path ?? '', homeDirectory);\n await writePoConfigValuesAsync(\n fs,\n target,\n body.edits.map(({ keyPath, value }) => ({ keyPath, ...(value === null ? {} : { value }) })),\n io,\n { scope },\n );\n context.configurationChanged?.();\n return Response.json(\n configView(\n context,\n body.edits.map((edit) => edit.keyPath.join(KEY_SEPARATOR)),\n ),\n );\n }\n return Response.json({ error: 'Configuration route not found.' }, { status: 404 });\n };\n const guarded = async (request: Request): Promise<Response> => {\n try {\n return await dispatch(request);\n } catch (error) {\n return Response.json({ error: describe(error) }, { status: error instanceof SyntaxError ? 400 : 422 });\n }\n };\n return {\n fetch(request) {\n if (request.method === 'GET' || request.method === 'HEAD') return guarded(request);\n const result = writes.then(() => guarded(request));\n writes = result.catch(() => undefined);\n return result;\n },\n close() {\n closed = true;\n },\n };\n },\n});\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { createSettingsApi } from '../../../../services/settingsApi';\n\nexport default defineRoutedContribution(\n ({ context, host }: PoServerPluginContext) =>\n host.scope === 'session' ? undefined : createSettingsApi(requirePoFs(context)),\n { cardinality: 'optional' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nimport { CONFIG_HELP_SKILL } from '../../../../../constants/config';\n\nexport default defineResource({\n ...CONFIG_HELP_SKILL,\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport apiRoute from '../src/extensions/(backend)/api/settings/route.server';\nimport resourcePoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.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);\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-config',\n providerOverrides: composeServerProviderOverrides(rootSession),\n global: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n }),\n workspace: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorConfig, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["createPoReadinessCoordinator","readPoNotificationService","PO_READINESS_SERVICE","createPoTelemetry","createNativePoConfigContext","withAbortSignal","BACKGROUND_CONTEXT","isPoMcpProjection","createDisabledPoMcpProjection","PO_MCP_PROJECTION_SERVICE","createPoMcpProjectionService","defineRoot","requirePoFs","defineApiRoutes","apiResponse","repositoryPoConfigPath","globalPoConfigPath","loadPoConfigLayers","loadMajorModesConfig","loadDomains","loadProfiles","defaultDomainsForMajorMode","configScopeOf","BACKGROUND_CONTEXT","readPiImageSettings","DEFAULT_IMAGE_MAX_DIMENSION","routes","savePiImageSettingsAsync","writePoConfigValuesAsync","repositoryPoConfigPath","configScopeOf","defineRoutedContribution","requirePoFs","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","apiRoute","composeRootHooks","resourcePoAuthorConfig"],"sources":["../../src/constants/config.ts","../../src/services/configRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/constants/settings.ts","../../src/types/apiRoutes.ts","../../src/services/settings/index.ts","../../src/services/settingsApi/index.ts","../../src/extensions/(backend)/api/settings/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.server.ts","../../generated/server.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/po-config';\nexport const CONFIG_HELP_SKILL = {\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n};\n","import type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport {\n createDisabledPoMcpProjection,\n createPoMcpProjectionService,\n PO_MCP_PROJECTION_SERVICE,\n isPoMcpProjection,\n} from '@agimon-ai/po-core/mcpProjection';\nimport { readPoNotificationService } from '@agimon-ai/po-core/notification';\nimport { BACKGROUND_CONTEXT, withAbortSignal, type FileSystem } from '@agimon-ai/po-core/platform';\nimport {\n createPoReadinessCoordinator,\n PO_READINESS_SERVICE,\n type PoReadinessNotification,\n} from '@agimon-ai/po-core/readiness';\nimport { createPoTelemetry } from '@agimon-ai/po-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { PACKAGE_SOURCE } from '../../constants/config';\nimport { createNativePoConfigContext, providePoConfigContext } from '../sessionConfig';\nimport type { ConfigRuntime } from './type';\n\n/** One native session fiber owns initialization and all of its services. */\nexport function createConfigRuntime(\n cordis: Context,\n execution: PoHeadlessExecutionContext,\n fs: FileSystem,\n lifetime?: AbortSignal,\n): ConfigRuntime {\n const generation = `${execution.sessionId}:${crypto.randomUUID()}`;\n let active = true;\n const readiness = createPoReadinessCoordinator({\n notify(notification: PoReadinessNotification) {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n const body = `${notification.packageId} initialization ${notification.state}: ${detail}`;\n const service = readPoNotificationService(cordis);\n // Both routes are best effort. The coordinator retains the failed outcome.\n try {\n void Promise.allSettled([\n Promise.resolve(\n service ? service.request({ body, level: 'warning' }) : execution.client.notify({ body, level: 'warning' }),\n ),\n ]);\n } catch (error) {\n process.emitWarning(`Config warning delivery failed: ${String(error)}`);\n }\n },\n });\n cordis.provide(PO_READINESS_SERVICE, readiness);\n const telemetry = createPoTelemetry({\n serviceName: 'po-config',\n packageName: PACKAGE_SOURCE,\n cwd: execution.cwd,\n env: execution.environment,\n enableLogs: true,\n enableTraces: true,\n });\n let initializationTask: Promise<void> = Promise.resolve();\n const cancel = (): void => {\n active = false;\n void Promise.allSettled([readiness.dispose()]);\n };\n lifetime?.addEventListener('abort', cancel, { once: true });\n cordis.effect(\n () => async () => {\n active = false;\n lifetime?.removeEventListener('abort', cancel);\n await Promise.allSettled([readiness.dispose(), initializationTask]);\n await telemetry.shutdown();\n },\n `${PACKAGE_SOURCE}/session`,\n );\n const handle = readiness.start<void>(PACKAGE_SOURCE, generation, async (signal) => {\n const config = await createNativePoConfigContext(execution, fs, withAbortSignal(signal, BACKGROUND_CONTEXT));\n signal.throwIfAborted();\n if (!active) throw new Error(`Po Config initialization was superseded: ${generation}.`);\n providePoConfigContext(cordis, config, `${generation}:config`);\n const repoRoot = config.harness.root ?? execution.cwd;\n const stagingDirectory = config.harness.temporaryDirectory ?? execution.cwd;\n const projection =\n config.harness.mcp &&\n isPoMcpProjection(config.harness.mcpProjection) &&\n config.harness.mcpProjection.repoRoot === repoRoot\n ? config.harness.mcpProjection\n : createDisabledPoMcpProjection({ repoRoot, stagingDirectory });\n cordis.provide(\n PO_MCP_PROJECTION_SERVICE,\n createPoMcpProjectionService({\n sessionId: execution.sessionId,\n generation: `${generation}:mcp-projection`,\n projection,\n }),\n );\n void Promise.allSettled([\n telemetry.recordEvent('po_config.context_bound', {\n 'config.major_mode': config.harness.majorMode,\n 'config.domain_count': config.harness.domains.length,\n 'config.has_profile': config.harness.profile !== undefined,\n 'config.requires_relaunch': config.requiresRelaunch,\n }),\n ]);\n return { value: undefined };\n });\n initializationTask = handle.wait();\n if (lifetime?.aborted) cancel();\n void Promise.allSettled([initializationTask]);\n return { ready: initializationTask };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createConfigRuntime } from '../../../../services/configRuntime';\nimport type { ConfigRuntime } from '../../../../services/configRuntime/type';\n\nexport default defineRoot(({ agent, context: root, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Config initialization requires the native session host.');\n const fs = requirePoFs(root);\n let runtime: ConfigRuntime | undefined;\n return {\n value: undefined,\n services: [\n (context: Context) => {\n runtime = createConfigRuntime(context, agent.context, fs, signal);\n },\n ],\n async onStart() {\n if (!runtime) throw new Error('Native config initializer was not installed.');\n // Pi previously awaited the barrier, then reported handler errors and continued.\n // Keep that degraded outcome, observable through readiness and notification.\n await Promise.allSettled([runtime.ready]);\n },\n };\n});\n","export const KEY_SEPARATOR = '.';\n\n/** The repeatable query parameter naming which keys a read is about. */\nexport const KEY_QUERY_PARAM = 'key';\n\nexport const SELECTION_KEYS = {\n majorMode: ['selection', 'majorMode'],\n domains: ['selection', 'domains'],\n profile: ['selection', 'profile'],\n} as const;\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport { KEY_QUERY_PARAM } from '../constants/settings';\nimport type { RepositorySettingsView, SettingsConfigView, SettingsImagesView, SettingsRepository } from './settings';\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/(backend)/api/settings/`, so the mount is stated once, by the\n * folder that creates it. `settings` is the host's own API: it answers at\n * `/api/settings` and `/api/workspaces/<id>/settings`, beside `/plugins` rather\n * than under it, and the client knows that from the base path alone.\n *\n * This is the one file the mount's dispatcher and, once the client crosses the\n * package boundary, the cockpit both read, so a path cannot move on one side\n * alone.\n */\nexport default defineApiRoutes({\n /** The mount itself: the selected keys and the hash of each file they came from. */\n config: {\n method: 'GET',\n path: '/',\n /** Repeatable. The page also sends `repoRoot`, which the mount ignores: it serves one repository. */\n query: [KEY_QUERY_PARAM],\n response: apiResponse<SettingsConfigView>(),\n },\n value: {\n method: 'PUT',\n path: '/value',\n response: apiResponse<SettingsConfigView>(),\n },\n repositories: {\n method: 'GET',\n path: '/repositories',\n response: apiResponse<{ repositories: readonly SettingsRepository[] }>(),\n },\n /** The workspace this mount was bound to; a global mount has none and answers 404. */\n repository: {\n method: 'GET',\n path: '/repository',\n response: apiResponse<RepositorySettingsView>(),\n },\n selection: {\n method: 'PUT',\n path: '/repository/selection',\n response: apiResponse<RepositorySettingsView>(),\n },\n /** Pi's own image limits, served by the global mount only. */\n images: {\n method: 'GET',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n /** The same path as `images`; the method is the whole of the difference. */\n saveImages: {\n method: 'PUT',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n});\n","import type { PoApiContext } from '@agimon-ai/po-core/packageApi';\n\nimport { KEY_SEPARATOR, SELECTION_KEYS } from '../../constants/settings';\nimport type {\n RepositoryCatalogOption,\n RepositorySelectionChanges,\n RepositorySelectionWriteRequest,\n RepositorySettingsView,\n SettingsConfigView,\n SettingsRepository,\n SettingsScope,\n SettingsValueView,\n SettingsBatchWriteRequest,\n} from '../../types/settings';\nimport { globalPoConfigPath, loadPoConfigLayers, repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { defaultDomainsForMajorMode, loadDomains } from '../domains';\nimport { loadMajorModesConfig } from '../majorModes';\nimport { loadProfiles } from '../profiles';\n\ntype SelectionKey = keyof typeof SELECTION_KEYS;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** The display form of a config value; a record has no single-line form, so it has none. */\nexport function displayValue(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return value.map((entry) => displayValue(entry) ?? '').join(', ');\n return undefined;\n}\n\nexport function pathFor(scope: SettingsScope, repoRoot: string, homeDirectory: string | undefined): string {\n return scope === 'repository' ? repositoryPoConfigPath(repoRoot) : globalPoConfigPath(homeDirectory);\n}\n\nexport function parseWrite(body: unknown): SettingsBatchWriteRequest | undefined {\n if (!isRecord(body)) return undefined;\n const { repoRoot, scope, expectedHash } = body;\n if (typeof repoRoot !== 'string' || (scope !== 'global' && scope !== 'repository')) return undefined;\n if (scope === 'repository' && repoRoot === '') return undefined;\n if (typeof expectedHash !== 'string') return undefined;\n const edits = body.edits === undefined ? [{ keyPath: body.keyPath, value: body.value }] : body.edits;\n if (!Array.isArray(edits) || edits.length === 0 || edits.length > 100) return undefined;\n const validated: Array<SettingsBatchWriteRequest['edits'][number]> = [];\n for (const edit of edits) {\n if (!isRecord(edit)) return undefined;\n const { keyPath, value } = edit;\n if (!Array.isArray(keyPath) || keyPath.length === 0 || keyPath.some((part) => typeof part !== 'string'))\n return undefined;\n if (value !== null && typeof value !== 'string' && (typeof value !== 'number' || !Number.isFinite(value)))\n return undefined;\n validated.push({ keyPath: keyPath as string[], value });\n }\n return { repoRoot, scope, expectedHash, edits: validated };\n}\n\nexport function configuredSelectionValue<T>(\n layers: ReturnType<typeof loadPoConfigLayers>,\n key: SelectionKey,\n effective: T | undefined,\n): { effective?: T; repository?: T; origin: 'global' | 'repository' | 'default' } {\n const origin = layers.originOf(SELECTION_KEYS[key]);\n return {\n ...(effective === undefined ? {} : { effective }),\n ...(origin === 'repository' && effective !== undefined ? { repository: effective } : {}),\n origin,\n };\n}\n\nexport function repositorySettingsView(\n repository: SettingsRepository,\n homeDirectory: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): RepositorySettingsView {\n const repoRoot = repository.path;\n const layers = loadPoConfigLayers(repoRoot, homeDirectory, environment);\n const modes = loadMajorModesConfig(repoRoot, homeDirectory, environment);\n const domains = loadDomains(repoRoot, homeDirectory);\n const profiles = loadProfiles(repoRoot, homeDirectory);\n const configured = layers.effective.selection;\n const effectiveMajorMode = configured?.majorMode ?? modes.defaultMajorMode;\n const effectiveDomains =\n configured?.domains ?? defaultDomainsForMajorMode(effectiveMajorMode, {}, domains.defaultDomains);\n const majorModes: RepositoryCatalogOption[] = Object.entries(modes.majorMode)\n .map(([name, definition]) => ({ name, description: definition.description, layers: definition.layers }))\n .sort((left, right) => left.name.localeCompare(right.name));\n const domainOptions: RepositoryCatalogOption[] = [\n ...Object.entries(domains.domains).map(([name, definition]) => ({\n name,\n ...(definition.description ? { description: definition.description } : {}),\n })),\n ...Object.entries(domains.aliases).map(([name, expandsTo]) => ({\n name,\n description: `Alias for ${expandsTo.join(', ') || 'no domains'}.`,\n expandsTo,\n })),\n ].sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n repository,\n hash: layers.repositoryFile.hash,\n catalogs: {\n majorModes,\n domains: domainOptions,\n profiles: profiles.map((profile) => ({ name: profile.name })),\n },\n selection: {\n majorMode: configuredSelectionValue(layers, 'majorMode', effectiveMajorMode),\n domains: configuredSelectionValue(layers, 'domains', effectiveDomains),\n profile: configuredSelectionValue(layers, 'profile', configured?.profile),\n },\n };\n}\n\nexport function parseSelectionChanges(value: unknown): RepositorySelectionChanges | undefined {\n if (!isRecord(value)) return undefined;\n const keys = Object.keys(value);\n if (keys.length === 0 || keys.some((key) => !Object.hasOwn(SELECTION_KEYS, key))) return undefined;\n const changes: RepositorySelectionChanges = {};\n if (Object.hasOwn(value, 'majorMode')) {\n if (value.majorMode !== null && (typeof value.majorMode !== 'string' || value.majorMode.trim() === ''))\n return undefined;\n changes.majorMode = value.majorMode === null ? null : value.majorMode.trim();\n }\n if (Object.hasOwn(value, 'domains')) {\n if (\n value.domains !== null &&\n (!Array.isArray(value.domains) || value.domains.some((name) => typeof name !== 'string' || name.trim() === ''))\n ) {\n return undefined;\n }\n changes.domains =\n value.domains === null ? null : [...new Set((value.domains as string[]).map((name) => name.trim()))];\n }\n if (Object.hasOwn(value, 'profile')) {\n if (value.profile !== null && (typeof value.profile !== 'string' || value.profile.trim() === '')) return undefined;\n changes.profile = value.profile === null ? null : value.profile.trim();\n }\n return changes;\n}\n\nexport function parseSelectionWrite(value: unknown): RepositorySelectionWriteRequest | undefined {\n if (!isRecord(value) || typeof value.repositoryId !== 'string' || typeof value.expectedHash !== 'string')\n return undefined;\n const changes = parseSelectionChanges(value.changes);\n return changes === undefined\n ? undefined\n : { repositoryId: value.repositoryId, expectedHash: value.expectedHash, changes };\n}\n\nexport function validateSelectionChanges(\n view: RepositorySettingsView,\n changes: RepositorySelectionChanges,\n): string | undefined {\n if (changes.majorMode !== undefined && changes.majorMode !== null) {\n if (!view.catalogs.majorModes.some((mode) => mode.name === changes.majorMode)) {\n return `Unknown major mode '${changes.majorMode}'.`;\n }\n }\n if (changes.domains !== undefined && changes.domains !== null) {\n const known = new Set(view.catalogs.domains.map((domain) => domain.name));\n const unknown = changes.domains.find((domain) => !known.has(domain));\n if (unknown !== undefined) return `Unknown domain '${unknown}'.`;\n }\n if (changes.profile !== undefined && changes.profile !== null) {\n if (!view.catalogs.profiles.some((profile) => profile.name === changes.profile)) {\n return `Unknown profile '${changes.profile}'.`;\n }\n }\n return undefined;\n}\n\nexport function selectionEdits(changes: RepositorySelectionChanges) {\n return (Object.entries(changes) as Array<[SelectionKey, string | readonly string[] | null]>).map(([key, value]) => ({\n keyPath: SELECTION_KEYS[key],\n ...(value === null ? {} : { value }),\n }));\n}\n\nexport function configView(context: PoApiContext, keys: readonly string[]): SettingsConfigView {\n const root = context.scope === 'workspace' ? context.workspaceRoot : undefined;\n const layers = loadPoConfigLayers(root, context.homeDirectory, context.environment);\n const values: Record<string, SettingsValueView> = {};\n for (const key of keys) {\n const keyPath = key.split(KEY_SEPARATOR);\n const value = displayValue(layers.valueAt(keyPath));\n values[key] = {\n ...(value === undefined ? {} : { value }),\n origin: layers.originOf(keyPath),\n scope: configScopeOf(keyPath),\n };\n }\n return {\n repoRoot: root ?? '',\n values,\n hashes: { global: layers.globalFile.hash, repository: layers.repositoryFile.hash },\n };\n}\n","import type { PoApi } from '@agimon-ai/po-core/packageApi';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { KEY_QUERY_PARAM, KEY_SEPARATOR } from '../../constants/settings';\nimport routes from '../../types/apiRoutes';\nimport type { SettingsRepository } from '../../types/settings';\nimport { repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { writePoConfigValuesAsync } from '../configWriter';\nimport { DEFAULT_IMAGE_MAX_DIMENSION, MIN_IMAGE_MAX_DIMENSION } from '../imageSettings';\nimport { readPiImageSettings, savePiImageSettingsAsync } from '../piConfig';\nimport {\n configView,\n describe,\n isRecord,\n parseSelectionWrite,\n parseWrite,\n pathFor,\n repositorySettingsView,\n selectionEdits,\n validateSelectionChanges,\n} from '../settings';\n\n/** One declared route, as much of it as a comparison needs. */\ntype RouteSpec = { readonly method: string; readonly path: string };\n\n/**\n * Config handlers are bound to their mount. Request paths cannot choose a different repository.\n * Writes and image settings go through the host's FileSystem.\n */\nexport const createSettingsApi = (fs: FileSystem): PoApi => ({\n basePath: 'settings',\n start(context) {\n if (context.scope === 'session') throw new Error('Configuration settings require a global or workspace mount.');\n const { homeDirectory } = context;\n const repository = (): SettingsRepository | undefined =>\n context.scope === 'workspace' && context.workspaceId && context.workspaceRoot\n ? {\n id: context.workspaceId,\n name: context.workspaceRoot.split('/').at(-1) ?? context.workspaceId,\n path: context.workspaceRoot,\n active: context.repositories?.().find((entry) => entry.id === context.workspaceId)?.active ?? false,\n }\n : undefined;\n const io = BACKGROUND_CONTEXT;\n const imageView = async () => ({\n ...(await readPiImageSettings(fs, io, homeDirectory)),\n minDimension: MIN_IMAGE_MAX_DIMENSION,\n maxAllowedDimension: DEFAULT_IMAGE_MAX_DIMENSION,\n });\n let writes: Promise<unknown> = Promise.resolve();\n let closed = false;\n const dispatch = async (request: Request): Promise<Response> => {\n if (closed) return Response.json({ error: 'Configuration mount is closed.' }, { status: 503 });\n const url = new URL(request.url);\n /**\n * Whether this request addresses one declared route.\n *\n * The table owns both halves of the comparison, so the path this mount\n * answers and the path the client asks for cannot drift apart: there is\n * one spelling of each, in `src/types/apiRoutes`.\n */\n const addresses = (route: RouteSpec): boolean => url.pathname === route.path && request.method === route.method;\n const currentRepository = repository();\n if (addresses(routes.config)) return Response.json(configView(context, url.searchParams.getAll(KEY_QUERY_PARAM)));\n if (addresses(routes.repositories)) return Response.json({ repositories: context.repositories?.() ?? [] });\n if (addresses(routes.repository)) {\n return currentRepository\n ? Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment))\n : Response.json({ error: 'Choose a workspace.' }, { status: 404 });\n }\n // One path, two methods, so the branch is on the path the pair share.\n if (url.pathname === routes.images.path && context.scope === 'global') {\n if (request.method === routes.images.method) return Response.json(await imageView());\n if (request.method === routes.saveImages.method) {\n const body: unknown = await request.json();\n if (\n !isRecord(body) ||\n (body.autoResize !== undefined && typeof body.autoResize !== 'boolean') ||\n (body.maxDimension !== undefined &&\n (typeof body.maxDimension !== 'number' || !Number.isFinite(body.maxDimension)))\n )\n return Response.json({ error: 'Invalid image settings.' }, { status: 400 });\n await savePiImageSettingsAsync(\n fs,\n {\n ...(typeof body.autoResize === 'boolean' ? { autoResize: body.autoResize } : {}),\n ...(typeof body.maxDimension === 'number' ? { maxDimension: body.maxDimension } : {}),\n },\n io,\n homeDirectory,\n );\n context.configurationChanged?.();\n return Response.json(await imageView());\n }\n }\n if (addresses(routes.selection)) {\n const body = parseSelectionWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A selection write needs typed changes and a file hash.' }, { status: 400 });\n if (!currentRepository || body.repositoryId !== currentRepository.id)\n return Response.json({ error: 'Workspace not found in this mount.' }, { status: 404 });\n const before = repositorySettingsView(currentRepository, homeDirectory, context.environment);\n if (before.hash !== body.expectedHash)\n return Response.json(\n { error: 'The repository config changed since it was read.', hash: before.hash },\n { status: 409 },\n );\n const invalid = validateSelectionChanges(before, body.changes);\n if (invalid) return Response.json({ error: invalid }, { status: 422 });\n await writePoConfigValuesAsync(\n fs,\n repositoryPoConfigPath(currentRepository.path),\n selectionEdits(body.changes),\n io,\n { scope: 'repository' },\n );\n context.configurationChanged?.();\n return Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment));\n }\n if (addresses(routes.value)) {\n const body = parseWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A save requires a scope, key, value and file hash.' }, { status: 400 });\n const scope = context.scope === 'global' ? 'global' : 'repository';\n if (body.scope !== scope || (scope === 'repository' && body.repoRoot !== currentRepository?.path))\n return Response.json({ error: 'The write targets a different mount.' }, { status: 403 });\n if (\n body.edits.some((edit) => {\n const allowed = configScopeOf(edit.keyPath);\n return allowed !== 'both' && allowed !== scope;\n })\n )\n return Response.json({ error: 'This key cannot be set at this scope.' }, { status: 409 });\n const before = configView(context, []);\n if (before.hashes[scope] !== body.expectedHash)\n return Response.json(\n { error: 'The config changed since it was read.', hash: before.hashes[scope] },\n { status: 409 },\n );\n const target = pathFor(scope, currentRepository?.path ?? '', homeDirectory);\n await writePoConfigValuesAsync(\n fs,\n target,\n body.edits.map(({ keyPath, value }) => ({ keyPath, ...(value === null ? {} : { value }) })),\n io,\n { scope },\n );\n context.configurationChanged?.();\n return Response.json(\n configView(\n context,\n body.edits.map((edit) => edit.keyPath.join(KEY_SEPARATOR)),\n ),\n );\n }\n return Response.json({ error: 'Configuration route not found.' }, { status: 404 });\n };\n const guarded = async (request: Request): Promise<Response> => {\n try {\n return await dispatch(request);\n } catch (error) {\n return Response.json({ error: describe(error) }, { status: error instanceof SyntaxError ? 400 : 422 });\n }\n };\n return {\n fetch(request) {\n if (request.method === 'GET' || request.method === 'HEAD') return guarded(request);\n const result = writes.then(() => guarded(request));\n writes = result.catch(() => undefined);\n return result;\n },\n close() {\n closed = true;\n },\n };\n },\n});\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createSettingsApi } from '../../../../services/settingsApi';\n\nexport default defineRoutedContribution(\n ({ context, host }: PoServerPluginContext) =>\n host.scope === 'session' ? undefined : createSettingsApi(requirePoFs(context)),\n { cardinality: 'optional' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nimport { CONFIG_HELP_SKILL } from '../../../../../constants/config';\n\nexport default defineResource({\n ...CONFIG_HELP_SKILL,\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\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 apiRoute from '../src/extensions/(backend)/api/settings/route.server';\nimport resourcePoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.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);\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-config',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n }),\n workspace: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, 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 defined([at(apiRoute, context)]); },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorConfig, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region generated/server.d.ts
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const serverPlugin: import("@agimon-ai/po-core/serverPlugin").PoServerPlugin;
|
|
3
3
|
//#endregion
|
|
4
|
-
export {
|
|
4
|
+
export { serverPlugin as default };
|
|
5
5
|
//# sourceMappingURL=server.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAgBa,
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAgBa,wDAAY"}
|
|
@@ -9,8 +9,8 @@ import { l as loadProfiles } from "../profiles-CHict0x-.mjs";
|
|
|
9
9
|
import { d as providePoConfigContext, o as createNativePoConfigContext } from "../sessionConfig-DFQF618G.mjs";
|
|
10
10
|
import { BACKGROUND_CONTEXT, requirePoFs, withAbortSignal } from "@agimon-ai/po-core/platform";
|
|
11
11
|
import { PO_MCP_PROJECTION_SERVICE, createDisabledPoMcpProjection, createPoMcpProjectionService, isPoMcpProjection } from "@agimon-ai/po-core/mcpProjection";
|
|
12
|
-
import { composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/
|
|
13
|
-
import { composeRootHooks, defineResource, defineRoot, defineRoutedContribution } from "@agimon-ai/po-core/extensionFile";
|
|
12
|
+
import { composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/serverPlugin";
|
|
13
|
+
import { composeRootHooks, composeRootInjects, defineResource, defineRoot, defineRoutedContribution } from "@agimon-ai/po-core/extensionFile";
|
|
14
14
|
import { readPoNotificationService } from "@agimon-ai/po-core/notification";
|
|
15
15
|
import { PO_READINESS_SERVICE, createPoReadinessCoordinator } from "@agimon-ai/po-core/readiness";
|
|
16
16
|
import { createPoTelemetry } from "@agimon-ai/po-telemetry";
|
|
@@ -470,9 +470,10 @@ var po_author_config_server_default = defineResource({
|
|
|
470
470
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
471
471
|
/* v8 ignore next -- generated normalization branch */
|
|
472
472
|
const defined = (values) => values.filter((value) => value !== void 0);
|
|
473
|
-
const
|
|
473
|
+
const serverPlugin = defineServerPlugin({
|
|
474
474
|
name: "@agimon-ai/po-config",
|
|
475
475
|
providerOverrides: composeServerProviderOverrides(root_server_default),
|
|
476
|
+
injects: composeRootInjects({ session: [root_server_default] }),
|
|
476
477
|
global: (context) => ({ get api() {
|
|
477
478
|
return defined([at(route_server_default, context)]);
|
|
478
479
|
} }),
|
|
@@ -480,7 +481,7 @@ const facet = defineServerPlugin({
|
|
|
480
481
|
return defined([at(route_server_default, context)]);
|
|
481
482
|
} }),
|
|
482
483
|
session: async (context) => {
|
|
483
|
-
const scopeSession = await root_server_default
|
|
484
|
+
const scopeSession = await context.scopeRoot("session", root_server_default, context);
|
|
484
485
|
const contextSession = {
|
|
485
486
|
...context,
|
|
486
487
|
root: scopeSession.value
|
|
@@ -501,6 +502,6 @@ const facet = defineServerPlugin({
|
|
|
501
502
|
}
|
|
502
503
|
});
|
|
503
504
|
//#endregion
|
|
504
|
-
export {
|
|
505
|
+
export { serverPlugin as default, serverPlugin };
|
|
505
506
|
|
|
506
507
|
//# sourceMappingURL=server.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["routes","rootSession","apiRoute","resourcePoAuthorConfig"],"sources":["../../src/constants/config.ts","../../src/services/configRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/constants/settings.ts","../../src/types/apiRoutes.ts","../../src/services/settings/index.ts","../../src/services/settingsApi/index.ts","../../src/extensions/(backend)/api/settings/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.server.ts","../../generated/server.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/po-config';\nexport const CONFIG_HELP_SKILL = {\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n};\n","import type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport {\n createDisabledPoMcpProjection,\n createPoMcpProjectionService,\n PO_MCP_PROJECTION_SERVICE,\n isPoMcpProjection,\n} from '@agimon-ai/po-core/mcpProjection';\nimport { readPoNotificationService } from '@agimon-ai/po-core/notification';\nimport { BACKGROUND_CONTEXT, withAbortSignal, type FileSystem } from '@agimon-ai/po-core/platform';\nimport {\n createPoReadinessCoordinator,\n PO_READINESS_SERVICE,\n type PoReadinessNotification,\n} from '@agimon-ai/po-core/readiness';\nimport { createPoTelemetry } from '@agimon-ai/po-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { PACKAGE_SOURCE } from '../../constants/config';\nimport { createNativePoConfigContext, providePoConfigContext } from '../sessionConfig';\nimport type { ConfigRuntime } from './type';\n\n/** One native session fiber owns initialization and all of its services. */\nexport function createConfigRuntime(\n cordis: Context,\n execution: PoHeadlessExecutionContext,\n fs: FileSystem,\n lifetime?: AbortSignal,\n): ConfigRuntime {\n const generation = `${execution.sessionId}:${crypto.randomUUID()}`;\n let active = true;\n const readiness = createPoReadinessCoordinator({\n notify(notification: PoReadinessNotification) {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n const body = `${notification.packageId} initialization ${notification.state}: ${detail}`;\n const service = readPoNotificationService(cordis);\n // Both routes are best effort. The coordinator retains the failed outcome.\n try {\n void Promise.allSettled([\n Promise.resolve(\n service ? service.request({ body, level: 'warning' }) : execution.client.notify({ body, level: 'warning' }),\n ),\n ]);\n } catch (error) {\n process.emitWarning(`Config warning delivery failed: ${String(error)}`);\n }\n },\n });\n cordis.provide(PO_READINESS_SERVICE, readiness);\n const telemetry = createPoTelemetry({\n serviceName: 'po-config',\n packageName: PACKAGE_SOURCE,\n cwd: execution.cwd,\n env: execution.environment,\n enableLogs: true,\n enableTraces: true,\n });\n let initializationTask: Promise<void> = Promise.resolve();\n const cancel = (): void => {\n active = false;\n void Promise.allSettled([readiness.dispose()]);\n };\n lifetime?.addEventListener('abort', cancel, { once: true });\n cordis.effect(\n () => async () => {\n active = false;\n lifetime?.removeEventListener('abort', cancel);\n await Promise.allSettled([readiness.dispose(), initializationTask]);\n await telemetry.shutdown();\n },\n `${PACKAGE_SOURCE}/session`,\n );\n const handle = readiness.start<void>(PACKAGE_SOURCE, generation, async (signal) => {\n const config = await createNativePoConfigContext(execution, fs, withAbortSignal(signal, BACKGROUND_CONTEXT));\n signal.throwIfAborted();\n if (!active) throw new Error(`Po Config initialization was superseded: ${generation}.`);\n providePoConfigContext(cordis, config, `${generation}:config`);\n const repoRoot = config.harness.root ?? execution.cwd;\n const stagingDirectory = config.harness.temporaryDirectory ?? execution.cwd;\n const projection =\n config.harness.mcp &&\n isPoMcpProjection(config.harness.mcpProjection) &&\n config.harness.mcpProjection.repoRoot === repoRoot\n ? config.harness.mcpProjection\n : createDisabledPoMcpProjection({ repoRoot, stagingDirectory });\n cordis.provide(\n PO_MCP_PROJECTION_SERVICE,\n createPoMcpProjectionService({\n sessionId: execution.sessionId,\n generation: `${generation}:mcp-projection`,\n projection,\n }),\n );\n void Promise.allSettled([\n telemetry.recordEvent('po_config.context_bound', {\n 'config.major_mode': config.harness.majorMode,\n 'config.domain_count': config.harness.domains.length,\n 'config.has_profile': config.harness.profile !== undefined,\n 'config.requires_relaunch': config.requiresRelaunch,\n }),\n ]);\n return { value: undefined };\n });\n initializationTask = handle.wait();\n if (lifetime?.aborted) cancel();\n void Promise.allSettled([initializationTask]);\n return { ready: initializationTask };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createConfigRuntime } from '../../../../services/configRuntime';\nimport type { ConfigRuntime } from '../../../../services/configRuntime/type';\n\nexport default defineRoot(({ agent, context: root, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Config initialization requires the native session host.');\n const fs = requirePoFs(root);\n let runtime: ConfigRuntime | undefined;\n return {\n value: undefined,\n services: [\n (context: Context) => {\n runtime = createConfigRuntime(context, agent.context, fs, signal);\n },\n ],\n async onStart() {\n if (!runtime) throw new Error('Native config initializer was not installed.');\n // Pi previously awaited the barrier, then reported handler errors and continued.\n // Keep that degraded outcome, observable through readiness and notification.\n await Promise.allSettled([runtime.ready]);\n },\n };\n});\n","export const KEY_SEPARATOR = '.';\n\n/** The repeatable query parameter naming which keys a read is about. */\nexport const KEY_QUERY_PARAM = 'key';\n\nexport const SELECTION_KEYS = {\n majorMode: ['selection', 'majorMode'],\n domains: ['selection', 'domains'],\n profile: ['selection', 'profile'],\n} as const;\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport { KEY_QUERY_PARAM } from '../constants/settings';\nimport type { RepositorySettingsView, SettingsConfigView, SettingsImagesView, SettingsRepository } from './settings';\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/(backend)/api/settings/`, so the mount is stated once, by the\n * folder that creates it. `settings` is the host's own API: it answers at\n * `/api/settings` and `/api/workspaces/<id>/settings`, beside `/plugins` rather\n * than under it, and the client knows that from the base path alone.\n *\n * This is the one file the mount's dispatcher and, once the client crosses the\n * package boundary, the cockpit both read, so a path cannot move on one side\n * alone.\n */\nexport default defineApiRoutes({\n /** The mount itself: the selected keys and the hash of each file they came from. */\n config: {\n method: 'GET',\n path: '/',\n /** Repeatable. The page also sends `repoRoot`, which the mount ignores: it serves one repository. */\n query: [KEY_QUERY_PARAM],\n response: apiResponse<SettingsConfigView>(),\n },\n value: {\n method: 'PUT',\n path: '/value',\n response: apiResponse<SettingsConfigView>(),\n },\n repositories: {\n method: 'GET',\n path: '/repositories',\n response: apiResponse<{ repositories: readonly SettingsRepository[] }>(),\n },\n /** The workspace this mount was bound to; a global mount has none and answers 404. */\n repository: {\n method: 'GET',\n path: '/repository',\n response: apiResponse<RepositorySettingsView>(),\n },\n selection: {\n method: 'PUT',\n path: '/repository/selection',\n response: apiResponse<RepositorySettingsView>(),\n },\n /** Pi's own image limits, served by the global mount only. */\n images: {\n method: 'GET',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n /** The same path as `images`; the method is the whole of the difference. */\n saveImages: {\n method: 'PUT',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n});\n","import type { PoApiContext } from '@agimon-ai/po-core/packageApi';\n\nimport { KEY_SEPARATOR, SELECTION_KEYS } from '../../constants/settings';\nimport type {\n RepositoryCatalogOption,\n RepositorySelectionChanges,\n RepositorySelectionWriteRequest,\n RepositorySettingsView,\n SettingsConfigView,\n SettingsRepository,\n SettingsScope,\n SettingsValueView,\n SettingsBatchWriteRequest,\n} from '../../types/settings';\nimport { globalPoConfigPath, loadPoConfigLayers, repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { defaultDomainsForMajorMode, loadDomains } from '../domains';\nimport { loadMajorModesConfig } from '../majorModes';\nimport { loadProfiles } from '../profiles';\n\ntype SelectionKey = keyof typeof SELECTION_KEYS;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** The display form of a config value; a record has no single-line form, so it has none. */\nexport function displayValue(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return value.map((entry) => displayValue(entry) ?? '').join(', ');\n return undefined;\n}\n\nexport function pathFor(scope: SettingsScope, repoRoot: string, homeDirectory: string | undefined): string {\n return scope === 'repository' ? repositoryPoConfigPath(repoRoot) : globalPoConfigPath(homeDirectory);\n}\n\nexport function parseWrite(body: unknown): SettingsBatchWriteRequest | undefined {\n if (!isRecord(body)) return undefined;\n const { repoRoot, scope, expectedHash } = body;\n if (typeof repoRoot !== 'string' || (scope !== 'global' && scope !== 'repository')) return undefined;\n if (scope === 'repository' && repoRoot === '') return undefined;\n if (typeof expectedHash !== 'string') return undefined;\n const edits = body.edits === undefined ? [{ keyPath: body.keyPath, value: body.value }] : body.edits;\n if (!Array.isArray(edits) || edits.length === 0 || edits.length > 100) return undefined;\n const validated: Array<SettingsBatchWriteRequest['edits'][number]> = [];\n for (const edit of edits) {\n if (!isRecord(edit)) return undefined;\n const { keyPath, value } = edit;\n if (!Array.isArray(keyPath) || keyPath.length === 0 || keyPath.some((part) => typeof part !== 'string'))\n return undefined;\n if (value !== null && typeof value !== 'string' && (typeof value !== 'number' || !Number.isFinite(value)))\n return undefined;\n validated.push({ keyPath: keyPath as string[], value });\n }\n return { repoRoot, scope, expectedHash, edits: validated };\n}\n\nexport function configuredSelectionValue<T>(\n layers: ReturnType<typeof loadPoConfigLayers>,\n key: SelectionKey,\n effective: T | undefined,\n): { effective?: T; repository?: T; origin: 'global' | 'repository' | 'default' } {\n const origin = layers.originOf(SELECTION_KEYS[key]);\n return {\n ...(effective === undefined ? {} : { effective }),\n ...(origin === 'repository' && effective !== undefined ? { repository: effective } : {}),\n origin,\n };\n}\n\nexport function repositorySettingsView(\n repository: SettingsRepository,\n homeDirectory: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): RepositorySettingsView {\n const repoRoot = repository.path;\n const layers = loadPoConfigLayers(repoRoot, homeDirectory, environment);\n const modes = loadMajorModesConfig(repoRoot, homeDirectory, environment);\n const domains = loadDomains(repoRoot, homeDirectory);\n const profiles = loadProfiles(repoRoot, homeDirectory);\n const configured = layers.effective.selection;\n const effectiveMajorMode = configured?.majorMode ?? modes.defaultMajorMode;\n const effectiveDomains =\n configured?.domains ?? defaultDomainsForMajorMode(effectiveMajorMode, {}, domains.defaultDomains);\n const majorModes: RepositoryCatalogOption[] = Object.entries(modes.majorMode)\n .map(([name, definition]) => ({ name, description: definition.description, layers: definition.layers }))\n .sort((left, right) => left.name.localeCompare(right.name));\n const domainOptions: RepositoryCatalogOption[] = [\n ...Object.entries(domains.domains).map(([name, definition]) => ({\n name,\n ...(definition.description ? { description: definition.description } : {}),\n })),\n ...Object.entries(domains.aliases).map(([name, expandsTo]) => ({\n name,\n description: `Alias for ${expandsTo.join(', ') || 'no domains'}.`,\n expandsTo,\n })),\n ].sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n repository,\n hash: layers.repositoryFile.hash,\n catalogs: {\n majorModes,\n domains: domainOptions,\n profiles: profiles.map((profile) => ({ name: profile.name })),\n },\n selection: {\n majorMode: configuredSelectionValue(layers, 'majorMode', effectiveMajorMode),\n domains: configuredSelectionValue(layers, 'domains', effectiveDomains),\n profile: configuredSelectionValue(layers, 'profile', configured?.profile),\n },\n };\n}\n\nexport function parseSelectionChanges(value: unknown): RepositorySelectionChanges | undefined {\n if (!isRecord(value)) return undefined;\n const keys = Object.keys(value);\n if (keys.length === 0 || keys.some((key) => !Object.hasOwn(SELECTION_KEYS, key))) return undefined;\n const changes: RepositorySelectionChanges = {};\n if (Object.hasOwn(value, 'majorMode')) {\n if (value.majorMode !== null && (typeof value.majorMode !== 'string' || value.majorMode.trim() === ''))\n return undefined;\n changes.majorMode = value.majorMode === null ? null : value.majorMode.trim();\n }\n if (Object.hasOwn(value, 'domains')) {\n if (\n value.domains !== null &&\n (!Array.isArray(value.domains) || value.domains.some((name) => typeof name !== 'string' || name.trim() === ''))\n ) {\n return undefined;\n }\n changes.domains =\n value.domains === null ? null : [...new Set((value.domains as string[]).map((name) => name.trim()))];\n }\n if (Object.hasOwn(value, 'profile')) {\n if (value.profile !== null && (typeof value.profile !== 'string' || value.profile.trim() === '')) return undefined;\n changes.profile = value.profile === null ? null : value.profile.trim();\n }\n return changes;\n}\n\nexport function parseSelectionWrite(value: unknown): RepositorySelectionWriteRequest | undefined {\n if (!isRecord(value) || typeof value.repositoryId !== 'string' || typeof value.expectedHash !== 'string')\n return undefined;\n const changes = parseSelectionChanges(value.changes);\n return changes === undefined\n ? undefined\n : { repositoryId: value.repositoryId, expectedHash: value.expectedHash, changes };\n}\n\nexport function validateSelectionChanges(\n view: RepositorySettingsView,\n changes: RepositorySelectionChanges,\n): string | undefined {\n if (changes.majorMode !== undefined && changes.majorMode !== null) {\n if (!view.catalogs.majorModes.some((mode) => mode.name === changes.majorMode)) {\n return `Unknown major mode '${changes.majorMode}'.`;\n }\n }\n if (changes.domains !== undefined && changes.domains !== null) {\n const known = new Set(view.catalogs.domains.map((domain) => domain.name));\n const unknown = changes.domains.find((domain) => !known.has(domain));\n if (unknown !== undefined) return `Unknown domain '${unknown}'.`;\n }\n if (changes.profile !== undefined && changes.profile !== null) {\n if (!view.catalogs.profiles.some((profile) => profile.name === changes.profile)) {\n return `Unknown profile '${changes.profile}'.`;\n }\n }\n return undefined;\n}\n\nexport function selectionEdits(changes: RepositorySelectionChanges) {\n return (Object.entries(changes) as Array<[SelectionKey, string | readonly string[] | null]>).map(([key, value]) => ({\n keyPath: SELECTION_KEYS[key],\n ...(value === null ? {} : { value }),\n }));\n}\n\nexport function configView(context: PoApiContext, keys: readonly string[]): SettingsConfigView {\n const root = context.scope === 'workspace' ? context.workspaceRoot : undefined;\n const layers = loadPoConfigLayers(root, context.homeDirectory, context.environment);\n const values: Record<string, SettingsValueView> = {};\n for (const key of keys) {\n const keyPath = key.split(KEY_SEPARATOR);\n const value = displayValue(layers.valueAt(keyPath));\n values[key] = {\n ...(value === undefined ? {} : { value }),\n origin: layers.originOf(keyPath),\n scope: configScopeOf(keyPath),\n };\n }\n return {\n repoRoot: root ?? '',\n values,\n hashes: { global: layers.globalFile.hash, repository: layers.repositoryFile.hash },\n };\n}\n","import type { PoApi } from '@agimon-ai/po-core/packageApi';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { KEY_QUERY_PARAM, KEY_SEPARATOR } from '../../constants/settings';\nimport routes from '../../types/apiRoutes';\nimport type { SettingsRepository } from '../../types/settings';\nimport { repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { writePoConfigValuesAsync } from '../configWriter';\nimport { DEFAULT_IMAGE_MAX_DIMENSION, MIN_IMAGE_MAX_DIMENSION } from '../imageSettings';\nimport { readPiImageSettings, savePiImageSettingsAsync } from '../piConfig';\nimport {\n configView,\n describe,\n isRecord,\n parseSelectionWrite,\n parseWrite,\n pathFor,\n repositorySettingsView,\n selectionEdits,\n validateSelectionChanges,\n} from '../settings';\n\n/** One declared route, as much of it as a comparison needs. */\ntype RouteSpec = { readonly method: string; readonly path: string };\n\n/**\n * Config handlers are bound to their mount. Request paths cannot choose a different repository.\n * Writes and image settings go through the host's FileSystem.\n */\nexport const createSettingsApi = (fs: FileSystem): PoApi => ({\n basePath: 'settings',\n start(context) {\n if (context.scope === 'session') throw new Error('Configuration settings require a global or workspace mount.');\n const { homeDirectory } = context;\n const repository = (): SettingsRepository | undefined =>\n context.scope === 'workspace' && context.workspaceId && context.workspaceRoot\n ? {\n id: context.workspaceId,\n name: context.workspaceRoot.split('/').at(-1) ?? context.workspaceId,\n path: context.workspaceRoot,\n active: context.repositories?.().find((entry) => entry.id === context.workspaceId)?.active ?? false,\n }\n : undefined;\n const io = BACKGROUND_CONTEXT;\n const imageView = async () => ({\n ...(await readPiImageSettings(fs, io, homeDirectory)),\n minDimension: MIN_IMAGE_MAX_DIMENSION,\n maxAllowedDimension: DEFAULT_IMAGE_MAX_DIMENSION,\n });\n let writes: Promise<unknown> = Promise.resolve();\n let closed = false;\n const dispatch = async (request: Request): Promise<Response> => {\n if (closed) return Response.json({ error: 'Configuration mount is closed.' }, { status: 503 });\n const url = new URL(request.url);\n /**\n * Whether this request addresses one declared route.\n *\n * The table owns both halves of the comparison, so the path this mount\n * answers and the path the client asks for cannot drift apart: there is\n * one spelling of each, in `src/types/apiRoutes`.\n */\n const addresses = (route: RouteSpec): boolean => url.pathname === route.path && request.method === route.method;\n const currentRepository = repository();\n if (addresses(routes.config)) return Response.json(configView(context, url.searchParams.getAll(KEY_QUERY_PARAM)));\n if (addresses(routes.repositories)) return Response.json({ repositories: context.repositories?.() ?? [] });\n if (addresses(routes.repository)) {\n return currentRepository\n ? Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment))\n : Response.json({ error: 'Choose a workspace.' }, { status: 404 });\n }\n // One path, two methods, so the branch is on the path the pair share.\n if (url.pathname === routes.images.path && context.scope === 'global') {\n if (request.method === routes.images.method) return Response.json(await imageView());\n if (request.method === routes.saveImages.method) {\n const body: unknown = await request.json();\n if (\n !isRecord(body) ||\n (body.autoResize !== undefined && typeof body.autoResize !== 'boolean') ||\n (body.maxDimension !== undefined &&\n (typeof body.maxDimension !== 'number' || !Number.isFinite(body.maxDimension)))\n )\n return Response.json({ error: 'Invalid image settings.' }, { status: 400 });\n await savePiImageSettingsAsync(\n fs,\n {\n ...(typeof body.autoResize === 'boolean' ? { autoResize: body.autoResize } : {}),\n ...(typeof body.maxDimension === 'number' ? { maxDimension: body.maxDimension } : {}),\n },\n io,\n homeDirectory,\n );\n context.configurationChanged?.();\n return Response.json(await imageView());\n }\n }\n if (addresses(routes.selection)) {\n const body = parseSelectionWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A selection write needs typed changes and a file hash.' }, { status: 400 });\n if (!currentRepository || body.repositoryId !== currentRepository.id)\n return Response.json({ error: 'Workspace not found in this mount.' }, { status: 404 });\n const before = repositorySettingsView(currentRepository, homeDirectory, context.environment);\n if (before.hash !== body.expectedHash)\n return Response.json(\n { error: 'The repository config changed since it was read.', hash: before.hash },\n { status: 409 },\n );\n const invalid = validateSelectionChanges(before, body.changes);\n if (invalid) return Response.json({ error: invalid }, { status: 422 });\n await writePoConfigValuesAsync(\n fs,\n repositoryPoConfigPath(currentRepository.path),\n selectionEdits(body.changes),\n io,\n { scope: 'repository' },\n );\n context.configurationChanged?.();\n return Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment));\n }\n if (addresses(routes.value)) {\n const body = parseWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A save requires a scope, key, value and file hash.' }, { status: 400 });\n const scope = context.scope === 'global' ? 'global' : 'repository';\n if (body.scope !== scope || (scope === 'repository' && body.repoRoot !== currentRepository?.path))\n return Response.json({ error: 'The write targets a different mount.' }, { status: 403 });\n if (\n body.edits.some((edit) => {\n const allowed = configScopeOf(edit.keyPath);\n return allowed !== 'both' && allowed !== scope;\n })\n )\n return Response.json({ error: 'This key cannot be set at this scope.' }, { status: 409 });\n const before = configView(context, []);\n if (before.hashes[scope] !== body.expectedHash)\n return Response.json(\n { error: 'The config changed since it was read.', hash: before.hashes[scope] },\n { status: 409 },\n );\n const target = pathFor(scope, currentRepository?.path ?? '', homeDirectory);\n await writePoConfigValuesAsync(\n fs,\n target,\n body.edits.map(({ keyPath, value }) => ({ keyPath, ...(value === null ? {} : { value }) })),\n io,\n { scope },\n );\n context.configurationChanged?.();\n return Response.json(\n configView(\n context,\n body.edits.map((edit) => edit.keyPath.join(KEY_SEPARATOR)),\n ),\n );\n }\n return Response.json({ error: 'Configuration route not found.' }, { status: 404 });\n };\n const guarded = async (request: Request): Promise<Response> => {\n try {\n return await dispatch(request);\n } catch (error) {\n return Response.json({ error: describe(error) }, { status: error instanceof SyntaxError ? 400 : 422 });\n }\n };\n return {\n fetch(request) {\n if (request.method === 'GET' || request.method === 'HEAD') return guarded(request);\n const result = writes.then(() => guarded(request));\n writes = result.catch(() => undefined);\n return result;\n },\n close() {\n closed = true;\n },\n };\n },\n});\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { createSettingsApi } from '../../../../services/settingsApi';\n\nexport default defineRoutedContribution(\n ({ context, host }: PoServerPluginContext) =>\n host.scope === 'session' ? undefined : createSettingsApi(requirePoFs(context)),\n { cardinality: 'optional' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nimport { CONFIG_HELP_SKILL } from '../../../../../constants/config';\n\nexport default defineResource({\n ...CONFIG_HELP_SKILL,\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport apiRoute from '../src/extensions/(backend)/api/settings/route.server';\nimport resourcePoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.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);\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-config',\n providerOverrides: composeServerProviderOverrides(rootSession),\n global: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n }),\n workspace: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorConfig, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["routes","rootSession","apiRoute","resourcePoAuthorConfig"],"sources":["../../src/constants/config.ts","../../src/services/configRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/constants/settings.ts","../../src/types/apiRoutes.ts","../../src/services/settings/index.ts","../../src/services/settingsApi/index.ts","../../src/extensions/(backend)/api/settings/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.server.ts","../../generated/server.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/po-config';\nexport const CONFIG_HELP_SKILL = {\n name: 'po-author-config',\n description:\n 'Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the po/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n};\n","import type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport {\n createDisabledPoMcpProjection,\n createPoMcpProjectionService,\n PO_MCP_PROJECTION_SERVICE,\n isPoMcpProjection,\n} from '@agimon-ai/po-core/mcpProjection';\nimport { readPoNotificationService } from '@agimon-ai/po-core/notification';\nimport { BACKGROUND_CONTEXT, withAbortSignal, type FileSystem } from '@agimon-ai/po-core/platform';\nimport {\n createPoReadinessCoordinator,\n PO_READINESS_SERVICE,\n type PoReadinessNotification,\n} from '@agimon-ai/po-core/readiness';\nimport { createPoTelemetry } from '@agimon-ai/po-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { PACKAGE_SOURCE } from '../../constants/config';\nimport { createNativePoConfigContext, providePoConfigContext } from '../sessionConfig';\nimport type { ConfigRuntime } from './type';\n\n/** One native session fiber owns initialization and all of its services. */\nexport function createConfigRuntime(\n cordis: Context,\n execution: PoHeadlessExecutionContext,\n fs: FileSystem,\n lifetime?: AbortSignal,\n): ConfigRuntime {\n const generation = `${execution.sessionId}:${crypto.randomUUID()}`;\n let active = true;\n const readiness = createPoReadinessCoordinator({\n notify(notification: PoReadinessNotification) {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n const body = `${notification.packageId} initialization ${notification.state}: ${detail}`;\n const service = readPoNotificationService(cordis);\n // Both routes are best effort. The coordinator retains the failed outcome.\n try {\n void Promise.allSettled([\n Promise.resolve(\n service ? service.request({ body, level: 'warning' }) : execution.client.notify({ body, level: 'warning' }),\n ),\n ]);\n } catch (error) {\n process.emitWarning(`Config warning delivery failed: ${String(error)}`);\n }\n },\n });\n cordis.provide(PO_READINESS_SERVICE, readiness);\n const telemetry = createPoTelemetry({\n serviceName: 'po-config',\n packageName: PACKAGE_SOURCE,\n cwd: execution.cwd,\n env: execution.environment,\n enableLogs: true,\n enableTraces: true,\n });\n let initializationTask: Promise<void> = Promise.resolve();\n const cancel = (): void => {\n active = false;\n void Promise.allSettled([readiness.dispose()]);\n };\n lifetime?.addEventListener('abort', cancel, { once: true });\n cordis.effect(\n () => async () => {\n active = false;\n lifetime?.removeEventListener('abort', cancel);\n await Promise.allSettled([readiness.dispose(), initializationTask]);\n await telemetry.shutdown();\n },\n `${PACKAGE_SOURCE}/session`,\n );\n const handle = readiness.start<void>(PACKAGE_SOURCE, generation, async (signal) => {\n const config = await createNativePoConfigContext(execution, fs, withAbortSignal(signal, BACKGROUND_CONTEXT));\n signal.throwIfAborted();\n if (!active) throw new Error(`Po Config initialization was superseded: ${generation}.`);\n providePoConfigContext(cordis, config, `${generation}:config`);\n const repoRoot = config.harness.root ?? execution.cwd;\n const stagingDirectory = config.harness.temporaryDirectory ?? execution.cwd;\n const projection =\n config.harness.mcp &&\n isPoMcpProjection(config.harness.mcpProjection) &&\n config.harness.mcpProjection.repoRoot === repoRoot\n ? config.harness.mcpProjection\n : createDisabledPoMcpProjection({ repoRoot, stagingDirectory });\n cordis.provide(\n PO_MCP_PROJECTION_SERVICE,\n createPoMcpProjectionService({\n sessionId: execution.sessionId,\n generation: `${generation}:mcp-projection`,\n projection,\n }),\n );\n void Promise.allSettled([\n telemetry.recordEvent('po_config.context_bound', {\n 'config.major_mode': config.harness.majorMode,\n 'config.domain_count': config.harness.domains.length,\n 'config.has_profile': config.harness.profile !== undefined,\n 'config.requires_relaunch': config.requiresRelaunch,\n }),\n ]);\n return { value: undefined };\n });\n initializationTask = handle.wait();\n if (lifetime?.aborted) cancel();\n void Promise.allSettled([initializationTask]);\n return { ready: initializationTask };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createConfigRuntime } from '../../../../services/configRuntime';\nimport type { ConfigRuntime } from '../../../../services/configRuntime/type';\n\nexport default defineRoot(({ agent, context: root, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Config initialization requires the native session host.');\n const fs = requirePoFs(root);\n let runtime: ConfigRuntime | undefined;\n return {\n value: undefined,\n services: [\n (context: Context) => {\n runtime = createConfigRuntime(context, agent.context, fs, signal);\n },\n ],\n async onStart() {\n if (!runtime) throw new Error('Native config initializer was not installed.');\n // Pi previously awaited the barrier, then reported handler errors and continued.\n // Keep that degraded outcome, observable through readiness and notification.\n await Promise.allSettled([runtime.ready]);\n },\n };\n});\n","export const KEY_SEPARATOR = '.';\n\n/** The repeatable query parameter naming which keys a read is about. */\nexport const KEY_QUERY_PARAM = 'key';\n\nexport const SELECTION_KEYS = {\n majorMode: ['selection', 'majorMode'],\n domains: ['selection', 'domains'],\n profile: ['selection', 'profile'],\n} as const;\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport { KEY_QUERY_PARAM } from '../constants/settings';\nimport type { RepositorySettingsView, SettingsConfigView, SettingsImagesView, SettingsRepository } from './settings';\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/(backend)/api/settings/`, so the mount is stated once, by the\n * folder that creates it. `settings` is the host's own API: it answers at\n * `/api/settings` and `/api/workspaces/<id>/settings`, beside `/plugins` rather\n * than under it, and the client knows that from the base path alone.\n *\n * This is the one file the mount's dispatcher and, once the client crosses the\n * package boundary, the cockpit both read, so a path cannot move on one side\n * alone.\n */\nexport default defineApiRoutes({\n /** The mount itself: the selected keys and the hash of each file they came from. */\n config: {\n method: 'GET',\n path: '/',\n /** Repeatable. The page also sends `repoRoot`, which the mount ignores: it serves one repository. */\n query: [KEY_QUERY_PARAM],\n response: apiResponse<SettingsConfigView>(),\n },\n value: {\n method: 'PUT',\n path: '/value',\n response: apiResponse<SettingsConfigView>(),\n },\n repositories: {\n method: 'GET',\n path: '/repositories',\n response: apiResponse<{ repositories: readonly SettingsRepository[] }>(),\n },\n /** The workspace this mount was bound to; a global mount has none and answers 404. */\n repository: {\n method: 'GET',\n path: '/repository',\n response: apiResponse<RepositorySettingsView>(),\n },\n selection: {\n method: 'PUT',\n path: '/repository/selection',\n response: apiResponse<RepositorySettingsView>(),\n },\n /** Pi's own image limits, served by the global mount only. */\n images: {\n method: 'GET',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n /** The same path as `images`; the method is the whole of the difference. */\n saveImages: {\n method: 'PUT',\n path: '/images',\n response: apiResponse<SettingsImagesView>(),\n },\n});\n","import type { PoApiContext } from '@agimon-ai/po-core/packageApi';\n\nimport { KEY_SEPARATOR, SELECTION_KEYS } from '../../constants/settings';\nimport type {\n RepositoryCatalogOption,\n RepositorySelectionChanges,\n RepositorySelectionWriteRequest,\n RepositorySettingsView,\n SettingsConfigView,\n SettingsRepository,\n SettingsScope,\n SettingsValueView,\n SettingsBatchWriteRequest,\n} from '../../types/settings';\nimport { globalPoConfigPath, loadPoConfigLayers, repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { defaultDomainsForMajorMode, loadDomains } from '../domains';\nimport { loadMajorModesConfig } from '../majorModes';\nimport { loadProfiles } from '../profiles';\n\ntype SelectionKey = keyof typeof SELECTION_KEYS;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** The display form of a config value; a record has no single-line form, so it has none. */\nexport function displayValue(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return value.map((entry) => displayValue(entry) ?? '').join(', ');\n return undefined;\n}\n\nexport function pathFor(scope: SettingsScope, repoRoot: string, homeDirectory: string | undefined): string {\n return scope === 'repository' ? repositoryPoConfigPath(repoRoot) : globalPoConfigPath(homeDirectory);\n}\n\nexport function parseWrite(body: unknown): SettingsBatchWriteRequest | undefined {\n if (!isRecord(body)) return undefined;\n const { repoRoot, scope, expectedHash } = body;\n if (typeof repoRoot !== 'string' || (scope !== 'global' && scope !== 'repository')) return undefined;\n if (scope === 'repository' && repoRoot === '') return undefined;\n if (typeof expectedHash !== 'string') return undefined;\n const edits = body.edits === undefined ? [{ keyPath: body.keyPath, value: body.value }] : body.edits;\n if (!Array.isArray(edits) || edits.length === 0 || edits.length > 100) return undefined;\n const validated: Array<SettingsBatchWriteRequest['edits'][number]> = [];\n for (const edit of edits) {\n if (!isRecord(edit)) return undefined;\n const { keyPath, value } = edit;\n if (!Array.isArray(keyPath) || keyPath.length === 0 || keyPath.some((part) => typeof part !== 'string'))\n return undefined;\n if (value !== null && typeof value !== 'string' && (typeof value !== 'number' || !Number.isFinite(value)))\n return undefined;\n validated.push({ keyPath: keyPath as string[], value });\n }\n return { repoRoot, scope, expectedHash, edits: validated };\n}\n\nexport function configuredSelectionValue<T>(\n layers: ReturnType<typeof loadPoConfigLayers>,\n key: SelectionKey,\n effective: T | undefined,\n): { effective?: T; repository?: T; origin: 'global' | 'repository' | 'default' } {\n const origin = layers.originOf(SELECTION_KEYS[key]);\n return {\n ...(effective === undefined ? {} : { effective }),\n ...(origin === 'repository' && effective !== undefined ? { repository: effective } : {}),\n origin,\n };\n}\n\nexport function repositorySettingsView(\n repository: SettingsRepository,\n homeDirectory: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): RepositorySettingsView {\n const repoRoot = repository.path;\n const layers = loadPoConfigLayers(repoRoot, homeDirectory, environment);\n const modes = loadMajorModesConfig(repoRoot, homeDirectory, environment);\n const domains = loadDomains(repoRoot, homeDirectory);\n const profiles = loadProfiles(repoRoot, homeDirectory);\n const configured = layers.effective.selection;\n const effectiveMajorMode = configured?.majorMode ?? modes.defaultMajorMode;\n const effectiveDomains =\n configured?.domains ?? defaultDomainsForMajorMode(effectiveMajorMode, {}, domains.defaultDomains);\n const majorModes: RepositoryCatalogOption[] = Object.entries(modes.majorMode)\n .map(([name, definition]) => ({ name, description: definition.description, layers: definition.layers }))\n .sort((left, right) => left.name.localeCompare(right.name));\n const domainOptions: RepositoryCatalogOption[] = [\n ...Object.entries(domains.domains).map(([name, definition]) => ({\n name,\n ...(definition.description ? { description: definition.description } : {}),\n })),\n ...Object.entries(domains.aliases).map(([name, expandsTo]) => ({\n name,\n description: `Alias for ${expandsTo.join(', ') || 'no domains'}.`,\n expandsTo,\n })),\n ].sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n repository,\n hash: layers.repositoryFile.hash,\n catalogs: {\n majorModes,\n domains: domainOptions,\n profiles: profiles.map((profile) => ({ name: profile.name })),\n },\n selection: {\n majorMode: configuredSelectionValue(layers, 'majorMode', effectiveMajorMode),\n domains: configuredSelectionValue(layers, 'domains', effectiveDomains),\n profile: configuredSelectionValue(layers, 'profile', configured?.profile),\n },\n };\n}\n\nexport function parseSelectionChanges(value: unknown): RepositorySelectionChanges | undefined {\n if (!isRecord(value)) return undefined;\n const keys = Object.keys(value);\n if (keys.length === 0 || keys.some((key) => !Object.hasOwn(SELECTION_KEYS, key))) return undefined;\n const changes: RepositorySelectionChanges = {};\n if (Object.hasOwn(value, 'majorMode')) {\n if (value.majorMode !== null && (typeof value.majorMode !== 'string' || value.majorMode.trim() === ''))\n return undefined;\n changes.majorMode = value.majorMode === null ? null : value.majorMode.trim();\n }\n if (Object.hasOwn(value, 'domains')) {\n if (\n value.domains !== null &&\n (!Array.isArray(value.domains) || value.domains.some((name) => typeof name !== 'string' || name.trim() === ''))\n ) {\n return undefined;\n }\n changes.domains =\n value.domains === null ? null : [...new Set((value.domains as string[]).map((name) => name.trim()))];\n }\n if (Object.hasOwn(value, 'profile')) {\n if (value.profile !== null && (typeof value.profile !== 'string' || value.profile.trim() === '')) return undefined;\n changes.profile = value.profile === null ? null : value.profile.trim();\n }\n return changes;\n}\n\nexport function parseSelectionWrite(value: unknown): RepositorySelectionWriteRequest | undefined {\n if (!isRecord(value) || typeof value.repositoryId !== 'string' || typeof value.expectedHash !== 'string')\n return undefined;\n const changes = parseSelectionChanges(value.changes);\n return changes === undefined\n ? undefined\n : { repositoryId: value.repositoryId, expectedHash: value.expectedHash, changes };\n}\n\nexport function validateSelectionChanges(\n view: RepositorySettingsView,\n changes: RepositorySelectionChanges,\n): string | undefined {\n if (changes.majorMode !== undefined && changes.majorMode !== null) {\n if (!view.catalogs.majorModes.some((mode) => mode.name === changes.majorMode)) {\n return `Unknown major mode '${changes.majorMode}'.`;\n }\n }\n if (changes.domains !== undefined && changes.domains !== null) {\n const known = new Set(view.catalogs.domains.map((domain) => domain.name));\n const unknown = changes.domains.find((domain) => !known.has(domain));\n if (unknown !== undefined) return `Unknown domain '${unknown}'.`;\n }\n if (changes.profile !== undefined && changes.profile !== null) {\n if (!view.catalogs.profiles.some((profile) => profile.name === changes.profile)) {\n return `Unknown profile '${changes.profile}'.`;\n }\n }\n return undefined;\n}\n\nexport function selectionEdits(changes: RepositorySelectionChanges) {\n return (Object.entries(changes) as Array<[SelectionKey, string | readonly string[] | null]>).map(([key, value]) => ({\n keyPath: SELECTION_KEYS[key],\n ...(value === null ? {} : { value }),\n }));\n}\n\nexport function configView(context: PoApiContext, keys: readonly string[]): SettingsConfigView {\n const root = context.scope === 'workspace' ? context.workspaceRoot : undefined;\n const layers = loadPoConfigLayers(root, context.homeDirectory, context.environment);\n const values: Record<string, SettingsValueView> = {};\n for (const key of keys) {\n const keyPath = key.split(KEY_SEPARATOR);\n const value = displayValue(layers.valueAt(keyPath));\n values[key] = {\n ...(value === undefined ? {} : { value }),\n origin: layers.originOf(keyPath),\n scope: configScopeOf(keyPath),\n };\n }\n return {\n repoRoot: root ?? '',\n values,\n hashes: { global: layers.globalFile.hash, repository: layers.repositoryFile.hash },\n };\n}\n","import type { PoApi } from '@agimon-ai/po-core/packageApi';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { KEY_QUERY_PARAM, KEY_SEPARATOR } from '../../constants/settings';\nimport routes from '../../types/apiRoutes';\nimport type { SettingsRepository } from '../../types/settings';\nimport { repositoryPoConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { writePoConfigValuesAsync } from '../configWriter';\nimport { DEFAULT_IMAGE_MAX_DIMENSION, MIN_IMAGE_MAX_DIMENSION } from '../imageSettings';\nimport { readPiImageSettings, savePiImageSettingsAsync } from '../piConfig';\nimport {\n configView,\n describe,\n isRecord,\n parseSelectionWrite,\n parseWrite,\n pathFor,\n repositorySettingsView,\n selectionEdits,\n validateSelectionChanges,\n} from '../settings';\n\n/** One declared route, as much of it as a comparison needs. */\ntype RouteSpec = { readonly method: string; readonly path: string };\n\n/**\n * Config handlers are bound to their mount. Request paths cannot choose a different repository.\n * Writes and image settings go through the host's FileSystem.\n */\nexport const createSettingsApi = (fs: FileSystem): PoApi => ({\n basePath: 'settings',\n start(context) {\n if (context.scope === 'session') throw new Error('Configuration settings require a global or workspace mount.');\n const { homeDirectory } = context;\n const repository = (): SettingsRepository | undefined =>\n context.scope === 'workspace' && context.workspaceId && context.workspaceRoot\n ? {\n id: context.workspaceId,\n name: context.workspaceRoot.split('/').at(-1) ?? context.workspaceId,\n path: context.workspaceRoot,\n active: context.repositories?.().find((entry) => entry.id === context.workspaceId)?.active ?? false,\n }\n : undefined;\n const io = BACKGROUND_CONTEXT;\n const imageView = async () => ({\n ...(await readPiImageSettings(fs, io, homeDirectory)),\n minDimension: MIN_IMAGE_MAX_DIMENSION,\n maxAllowedDimension: DEFAULT_IMAGE_MAX_DIMENSION,\n });\n let writes: Promise<unknown> = Promise.resolve();\n let closed = false;\n const dispatch = async (request: Request): Promise<Response> => {\n if (closed) return Response.json({ error: 'Configuration mount is closed.' }, { status: 503 });\n const url = new URL(request.url);\n /**\n * Whether this request addresses one declared route.\n *\n * The table owns both halves of the comparison, so the path this mount\n * answers and the path the client asks for cannot drift apart: there is\n * one spelling of each, in `src/types/apiRoutes`.\n */\n const addresses = (route: RouteSpec): boolean => url.pathname === route.path && request.method === route.method;\n const currentRepository = repository();\n if (addresses(routes.config)) return Response.json(configView(context, url.searchParams.getAll(KEY_QUERY_PARAM)));\n if (addresses(routes.repositories)) return Response.json({ repositories: context.repositories?.() ?? [] });\n if (addresses(routes.repository)) {\n return currentRepository\n ? Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment))\n : Response.json({ error: 'Choose a workspace.' }, { status: 404 });\n }\n // One path, two methods, so the branch is on the path the pair share.\n if (url.pathname === routes.images.path && context.scope === 'global') {\n if (request.method === routes.images.method) return Response.json(await imageView());\n if (request.method === routes.saveImages.method) {\n const body: unknown = await request.json();\n if (\n !isRecord(body) ||\n (body.autoResize !== undefined && typeof body.autoResize !== 'boolean') ||\n (body.maxDimension !== undefined &&\n (typeof body.maxDimension !== 'number' || !Number.isFinite(body.maxDimension)))\n )\n return Response.json({ error: 'Invalid image settings.' }, { status: 400 });\n await savePiImageSettingsAsync(\n fs,\n {\n ...(typeof body.autoResize === 'boolean' ? { autoResize: body.autoResize } : {}),\n ...(typeof body.maxDimension === 'number' ? { maxDimension: body.maxDimension } : {}),\n },\n io,\n homeDirectory,\n );\n context.configurationChanged?.();\n return Response.json(await imageView());\n }\n }\n if (addresses(routes.selection)) {\n const body = parseSelectionWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A selection write needs typed changes and a file hash.' }, { status: 400 });\n if (!currentRepository || body.repositoryId !== currentRepository.id)\n return Response.json({ error: 'Workspace not found in this mount.' }, { status: 404 });\n const before = repositorySettingsView(currentRepository, homeDirectory, context.environment);\n if (before.hash !== body.expectedHash)\n return Response.json(\n { error: 'The repository config changed since it was read.', hash: before.hash },\n { status: 409 },\n );\n const invalid = validateSelectionChanges(before, body.changes);\n if (invalid) return Response.json({ error: invalid }, { status: 422 });\n await writePoConfigValuesAsync(\n fs,\n repositoryPoConfigPath(currentRepository.path),\n selectionEdits(body.changes),\n io,\n { scope: 'repository' },\n );\n context.configurationChanged?.();\n return Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment));\n }\n if (addresses(routes.value)) {\n const body = parseWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A save requires a scope, key, value and file hash.' }, { status: 400 });\n const scope = context.scope === 'global' ? 'global' : 'repository';\n if (body.scope !== scope || (scope === 'repository' && body.repoRoot !== currentRepository?.path))\n return Response.json({ error: 'The write targets a different mount.' }, { status: 403 });\n if (\n body.edits.some((edit) => {\n const allowed = configScopeOf(edit.keyPath);\n return allowed !== 'both' && allowed !== scope;\n })\n )\n return Response.json({ error: 'This key cannot be set at this scope.' }, { status: 409 });\n const before = configView(context, []);\n if (before.hashes[scope] !== body.expectedHash)\n return Response.json(\n { error: 'The config changed since it was read.', hash: before.hashes[scope] },\n { status: 409 },\n );\n const target = pathFor(scope, currentRepository?.path ?? '', homeDirectory);\n await writePoConfigValuesAsync(\n fs,\n target,\n body.edits.map(({ keyPath, value }) => ({ keyPath, ...(value === null ? {} : { value }) })),\n io,\n { scope },\n );\n context.configurationChanged?.();\n return Response.json(\n configView(\n context,\n body.edits.map((edit) => edit.keyPath.join(KEY_SEPARATOR)),\n ),\n );\n }\n return Response.json({ error: 'Configuration route not found.' }, { status: 404 });\n };\n const guarded = async (request: Request): Promise<Response> => {\n try {\n return await dispatch(request);\n } catch (error) {\n return Response.json({ error: describe(error) }, { status: error instanceof SyntaxError ? 400 : 422 });\n }\n };\n return {\n fetch(request) {\n if (request.method === 'GET' || request.method === 'HEAD') return guarded(request);\n const result = writes.then(() => guarded(request));\n writes = result.catch(() => undefined);\n return result;\n },\n close() {\n closed = true;\n },\n };\n },\n});\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createSettingsApi } from '../../../../services/settingsApi';\n\nexport default defineRoutedContribution(\n ({ context, host }: PoServerPluginContext) =>\n host.scope === 'session' ? undefined : createSettingsApi(requirePoFs(context)),\n { cardinality: 'optional' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nimport { CONFIG_HELP_SKILL } from '../../../../../constants/config';\n\nexport default defineResource({\n ...CONFIG_HELP_SKILL,\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-config/SKILL.md'),\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 apiRoute from '../src/extensions/(backend)/api/settings/route.server';\nimport resourcePoAuthorConfig from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-config.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);\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-config',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n }),\n workspace: (context) => ({\n get api(): PoServerSessionPlugin['api'] { return defined([at(apiRoute, 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 defined([at(apiRoute, context)]); },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorConfig, 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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/po-config",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.14",
|
|
4
4
|
"description": "Typed configuration loading, validation, and host services for composing Po sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-configuration",
|
|
@@ -139,15 +139,15 @@
|
|
|
139
139
|
"registry": "https://registry.npmjs.org/"
|
|
140
140
|
},
|
|
141
141
|
"dependencies": {
|
|
142
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
143
|
-
"@agimon-ai/po-telemetry": "0.0.0-alpha.
|
|
144
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
145
|
-
"@deepseek-ai/cordis": "4.0.
|
|
142
|
+
"@agimon-ai/po-core": "0.0.0-alpha.14",
|
|
143
|
+
"@agimon-ai/po-telemetry": "0.0.0-alpha.14",
|
|
144
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.14",
|
|
145
|
+
"@deepseek-ai/cordis": "4.0.5",
|
|
146
146
|
"typebox": "1.3.37",
|
|
147
147
|
"yaml": "2.9.1"
|
|
148
148
|
},
|
|
149
149
|
"devDependencies": {
|
|
150
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
150
|
+
"@agimon-ai/po-build": "0.0.0-alpha.14",
|
|
151
151
|
"@earendil-works/pi-coding-agent": "1.3.0",
|
|
152
152
|
"@modelcontextprotocol/ext-apps": "2.0.3",
|
|
153
153
|
"@modelcontextprotocol/server": "2.3.1",
|