@agimon-ai/po-config 0.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +170 -0
- package/dist/agentPluginMcp.cjs +322 -0
- package/dist/agentPluginMcp.cjs.map +1 -0
- package/dist/agentPluginMcp.d.mts +38 -0
- package/dist/agentPluginMcp.d.mts.map +1 -0
- package/dist/agentPluginMcp.mjs +318 -0
- package/dist/agentPluginMcp.mjs.map +1 -0
- package/dist/apiContracts.cjs +203 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +198 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/atomicJson-1W0WhuFF.mjs +44 -0
- package/dist/atomicJson-1W0WhuFF.mjs.map +1 -0
- package/dist/atomicJson-Dt2z_DXl.cjs +52 -0
- package/dist/atomicJson-Dt2z_DXl.cjs.map +1 -0
- package/dist/atomicJson.cjs +3 -0
- package/dist/atomicJson.d.mts +2 -0
- package/dist/atomicJson.mjs +2 -0
- package/dist/config-BUw5kHsx.cjs +219 -0
- package/dist/config-BUw5kHsx.cjs.map +1 -0
- package/dist/config-CKA07FxG.mjs +162 -0
- package/dist/config-CKA07FxG.mjs.map +1 -0
- package/dist/config-Cm3EV1jp.d.mts +320 -0
- package/dist/config-Cm3EV1jp.d.mts.map +1 -0
- package/dist/config-NSHRd6na.mjs +2 -0
- package/dist/config-zZz80Mh5.cjs +1 -0
- package/dist/config.cjs +24 -0
- package/dist/config.d.mts +3 -0
- package/dist/config.mjs +3 -0
- package/dist/configPolicy--TNX7feH.mjs +718 -0
- package/dist/configPolicy--TNX7feH.mjs.map +1 -0
- package/dist/configPolicy-DmsZEp0t.cjs +795 -0
- package/dist/configPolicy-DmsZEp0t.cjs.map +1 -0
- package/dist/configSchema.cjs +0 -0
- package/dist/configSchema.d.mts +2 -0
- package/dist/configSchema.mjs +1 -0
- package/dist/configWriter-BTuinLjs.cjs +150 -0
- package/dist/configWriter-BTuinLjs.cjs.map +1 -0
- package/dist/configWriter-BgkGaLrf.mjs +130 -0
- package/dist/configWriter-BgkGaLrf.mjs.map +1 -0
- package/dist/configWriter.cjs +5 -0
- package/dist/configWriter.d.mts +2 -0
- package/dist/configWriter.mjs +2 -0
- package/dist/domains-CBYkuxs5.cjs +727 -0
- package/dist/domains-CBYkuxs5.cjs.map +1 -0
- package/dist/domains-DZOu9vYM.mjs +633 -0
- package/dist/domains-DZOu9vYM.mjs.map +1 -0
- package/dist/domains.cjs +19 -0
- package/dist/domains.d.mts +3 -0
- package/dist/domains.mjs +3 -0
- package/dist/extensions/mcp-ui.mjs +101 -0
- package/dist/extensions/mcp-ui.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +171 -0
- package/dist/extensions/mcp.cjs.map +1 -0
- package/dist/extensions/mcp.d.mts +5 -0
- package/dist/extensions/mcp.d.mts.map +1 -0
- package/dist/extensions/mcp.mjs +166 -0
- package/dist/extensions/mcp.mjs.map +1 -0
- package/dist/extensions/server.cjs +504 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +499 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/harnessState-CCyBeutB.cjs +188 -0
- package/dist/harnessState-CCyBeutB.cjs.map +1 -0
- package/dist/harnessState-Dn_S7fB9.mjs +163 -0
- package/dist/harnessState-Dn_S7fB9.mjs.map +1 -0
- package/dist/harnessState.cjs +6 -0
- package/dist/harnessState.d.mts +2 -0
- package/dist/harnessState.mjs +2 -0
- package/dist/harnessStore-CJSxdSkV.cjs +343 -0
- package/dist/harnessStore-CJSxdSkV.cjs.map +1 -0
- package/dist/harnessStore-CltwLB7M.mjs +262 -0
- package/dist/harnessStore-CltwLB7M.mjs.map +1 -0
- package/dist/harnessStore.cjs +15 -0
- package/dist/harnessStore.d.mts +2 -0
- package/dist/harnessStore.mjs +2 -0
- package/dist/index-BAaTySaM.d.mts +35 -0
- package/dist/index-BAaTySaM.d.mts.map +1 -0
- package/dist/index-BT29GZx5.d.mts +142 -0
- package/dist/index-BT29GZx5.d.mts.map +1 -0
- package/dist/index-B_lp0W3U.d.mts +114 -0
- package/dist/index-B_lp0W3U.d.mts.map +1 -0
- package/dist/index-C6GaYjq-.d.mts +6 -0
- package/dist/index-C6GaYjq-.d.mts.map +1 -0
- package/dist/index-CIQrKS1A.d.mts +50 -0
- package/dist/index-CIQrKS1A.d.mts.map +1 -0
- package/dist/index-CRcoVYXz.d.mts +39 -0
- package/dist/index-CRcoVYXz.d.mts.map +1 -0
- package/dist/index-CVlciCJF.d.mts +40 -0
- package/dist/index-CVlciCJF.d.mts.map +1 -0
- package/dist/index-CeOk2kqs.d.mts +118 -0
- package/dist/index-CeOk2kqs.d.mts.map +1 -0
- package/dist/index-Ch7ptOkW.d.mts +54 -0
- package/dist/index-Ch7ptOkW.d.mts.map +1 -0
- package/dist/index-Cvdt-Y-i.d.mts +66 -0
- package/dist/index-Cvdt-Y-i.d.mts.map +1 -0
- package/dist/index-DJpG-I9K.d.mts +122 -0
- package/dist/index-DJpG-I9K.d.mts.map +1 -0
- package/dist/index-DNk4q0Qm.d.mts +81 -0
- package/dist/index-DNk4q0Qm.d.mts.map +1 -0
- package/dist/index.cjs +121 -0
- package/dist/index.d.mts +15 -0
- package/dist/index.mjs +15 -0
- package/dist/init-C_9nyp3-.cjs +448 -0
- package/dist/init-C_9nyp3-.cjs.map +1 -0
- package/dist/init-DJ6wm-dr.mjs +415 -0
- package/dist/init-DJ6wm-dr.mjs.map +1 -0
- package/dist/init.cjs +7 -0
- package/dist/init.d.mts +2 -0
- package/dist/init.mjs +2 -0
- package/dist/layeredConfig-B922ibgn.mjs +67 -0
- package/dist/layeredConfig-B922ibgn.mjs.map +1 -0
- package/dist/layeredConfig-DdI5ysUf.cjs +94 -0
- package/dist/layeredConfig-DdI5ysUf.cjs.map +1 -0
- package/dist/layeredConfig.cjs +6 -0
- package/dist/layeredConfig.d.mts +2 -0
- package/dist/layeredConfig.mjs +2 -0
- package/dist/majorModes-CmPLEpMT.mjs +333 -0
- package/dist/majorModes-CmPLEpMT.mjs.map +1 -0
- package/dist/majorModes-DPhVMuhT.cjs +383 -0
- package/dist/majorModes-DPhVMuhT.cjs.map +1 -0
- package/dist/majorModes.cjs +10 -0
- package/dist/majorModes.d.mts +2 -0
- package/dist/majorModes.mjs +2 -0
- package/dist/piConfig-Bx26HMb_.d.mts +33 -0
- package/dist/piConfig-Bx26HMb_.d.mts.map +1 -0
- package/dist/piConfig-CCBdZXQr.cjs +260 -0
- package/dist/piConfig-CCBdZXQr.cjs.map +1 -0
- package/dist/piConfig-qGyCbcVj.mjs +197 -0
- package/dist/piConfig-qGyCbcVj.mjs.map +1 -0
- package/dist/piConfig.cjs +12 -0
- package/dist/piConfig.d.mts +2 -0
- package/dist/piConfig.mjs +2 -0
- package/dist/piContext.cjs +18 -0
- package/dist/piContext.d.mts +3 -0
- package/dist/piContext.mjs +2 -0
- package/dist/profiles-CTrUCmIh.d.mts +27 -0
- package/dist/profiles-CTrUCmIh.d.mts.map +1 -0
- package/dist/profiles-DnF9DBpd.cjs +552 -0
- package/dist/profiles-DnF9DBpd.cjs.map +1 -0
- package/dist/profiles-fujQKrS0.mjs +483 -0
- package/dist/profiles-fujQKrS0.mjs.map +1 -0
- package/dist/profiles.cjs +13 -0
- package/dist/profiles.d.mts +25 -0
- package/dist/profiles.d.mts.map +1 -0
- package/dist/profiles.mjs +2 -0
- package/dist/rolldown-runtime-VH7oDXx4.cjs +28 -0
- package/dist/selectionSwitch.cjs +70 -0
- package/dist/selectionSwitch.cjs.map +1 -0
- package/dist/selectionSwitch.d.mts +30 -0
- package/dist/selectionSwitch.d.mts.map +1 -0
- package/dist/selectionSwitch.mjs +64 -0
- package/dist/selectionSwitch.mjs.map +1 -0
- package/dist/sessionConfig-Boh4Fdje.cjs +342 -0
- package/dist/sessionConfig-Boh4Fdje.cjs.map +1 -0
- package/dist/sessionConfig-CtLoc-lO.mjs +240 -0
- package/dist/sessionConfig-CtLoc-lO.mjs.map +1 -0
- package/dist/types.cjs +9 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.mjs +2 -0
- package/llms.txt +12 -0
- package/package.json +206 -0
- package/src/prompts/po-author-config/SKILL.md +26 -0
- package/src/prompts/po-author-config/agents/openai.yaml +4 -0
- package/src/prompts/po-author-config/references/config-contract.md +201 -0
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
const require_configPolicy = require("../configPolicy-DmsZEp0t.cjs");
|
|
6
|
+
const require_config = require("../config-BUw5kHsx.cjs");
|
|
7
|
+
const require_configWriter = require("../configWriter-BTuinLjs.cjs");
|
|
8
|
+
const require_domains = require("../domains-CBYkuxs5.cjs");
|
|
9
|
+
const require_piConfig = require("../piConfig-CCBdZXQr.cjs");
|
|
10
|
+
const require_majorModes = require("../majorModes-DPhVMuhT.cjs");
|
|
11
|
+
const require_profiles = require("../profiles-DnF9DBpd.cjs");
|
|
12
|
+
const require_sessionConfig = require("../sessionConfig-Boh4Fdje.cjs");
|
|
13
|
+
let _agimon_ai_po_core_mcpProjection = require("@agimon-ai/po-core/mcpProjection");
|
|
14
|
+
let _agimon_ai_po_core_serverFacet = require("@agimon-ai/po-core/serverFacet");
|
|
15
|
+
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
16
|
+
let _agimon_ai_po_core_notification = require("@agimon-ai/po-core/notification");
|
|
17
|
+
let _agimon_ai_po_core_readiness = require("@agimon-ai/po-core/readiness");
|
|
18
|
+
let _agimon_ai_po_telemetry = require("@agimon-ai/po-telemetry");
|
|
19
|
+
let _agimon_ai_po_core_web = require("@agimon-ai/po-core/web");
|
|
20
|
+
//#region src/constants/config.ts
|
|
21
|
+
const PACKAGE_SOURCE = "@agimon-ai/po-config";
|
|
22
|
+
const CONFIG_HELP_SKILL = {
|
|
23
|
+
name: "po-author-config",
|
|
24
|
+
description: "Configure Po runtime settings, source precedence, and typed session configuration. Use for config.yaml, the doom/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml."
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/services/configRuntime/index.ts
|
|
28
|
+
/** One native session fiber owns initialization and all of its services. */
|
|
29
|
+
function createConfigRuntime(cordis, execution, lifetime) {
|
|
30
|
+
const generation = `${execution.sessionId}:${crypto.randomUUID()}`;
|
|
31
|
+
let active = true;
|
|
32
|
+
const readiness = (0, _agimon_ai_po_core_readiness.createDoomReadinessCoordinator)({ notify(notification) {
|
|
33
|
+
const diagnostics = notification.diagnostics.join("; ");
|
|
34
|
+
const detail = (notification.error?.message ?? diagnostics) || "Initialization did not complete.";
|
|
35
|
+
const body = `${notification.packageId} initialization ${notification.state}: ${detail}`;
|
|
36
|
+
const service = (0, _agimon_ai_po_core_notification.readDoomNotificationService)(cordis);
|
|
37
|
+
try {
|
|
38
|
+
Promise.allSettled([Promise.resolve(service ? service.request({
|
|
39
|
+
body,
|
|
40
|
+
level: "warning"
|
|
41
|
+
}) : execution.client.notify({
|
|
42
|
+
body,
|
|
43
|
+
level: "warning"
|
|
44
|
+
}))]);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
process.emitWarning(`Config warning delivery failed: ${String(error)}`);
|
|
47
|
+
}
|
|
48
|
+
} });
|
|
49
|
+
cordis.provide(_agimon_ai_po_core_readiness.DOOM_READINESS_SERVICE, readiness);
|
|
50
|
+
const telemetry = (0, _agimon_ai_po_telemetry.createDoomTelemetry)({
|
|
51
|
+
serviceName: "doom-config",
|
|
52
|
+
packageName: PACKAGE_SOURCE,
|
|
53
|
+
cwd: execution.cwd,
|
|
54
|
+
env: execution.environment,
|
|
55
|
+
enableLogs: true,
|
|
56
|
+
enableTraces: true
|
|
57
|
+
});
|
|
58
|
+
let initializationTask = Promise.resolve();
|
|
59
|
+
const cancel = () => {
|
|
60
|
+
active = false;
|
|
61
|
+
Promise.allSettled([readiness.dispose()]);
|
|
62
|
+
};
|
|
63
|
+
lifetime?.addEventListener("abort", cancel, { once: true });
|
|
64
|
+
cordis.effect(() => async () => {
|
|
65
|
+
active = false;
|
|
66
|
+
lifetime?.removeEventListener("abort", cancel);
|
|
67
|
+
await Promise.allSettled([readiness.dispose(), initializationTask]);
|
|
68
|
+
await telemetry.shutdown();
|
|
69
|
+
}, `${PACKAGE_SOURCE}/session`);
|
|
70
|
+
initializationTask = readiness.start(PACKAGE_SOURCE, generation, async (signal) => {
|
|
71
|
+
const config = await require_sessionConfig.createNativeDoomConfigContext(execution);
|
|
72
|
+
signal.throwIfAborted();
|
|
73
|
+
if (!active) throw new Error(`Doom Config initialization was superseded: ${generation}.`);
|
|
74
|
+
require_sessionConfig.provideDoomConfigContext(cordis, config, `${generation}:config`);
|
|
75
|
+
const repoRoot = config.harness.root ?? execution.cwd;
|
|
76
|
+
const stagingDirectory = config.harness.temporaryDirectory ?? execution.cwd;
|
|
77
|
+
const projection = config.harness.mcp && (0, _agimon_ai_po_core_mcpProjection.isDoomMcpProjection)(config.harness.mcpProjection) && config.harness.mcpProjection.repoRoot === repoRoot ? config.harness.mcpProjection : (0, _agimon_ai_po_core_mcpProjection.createDisabledDoomMcpProjection)({
|
|
78
|
+
repoRoot,
|
|
79
|
+
stagingDirectory
|
|
80
|
+
});
|
|
81
|
+
cordis.provide(_agimon_ai_po_core_mcpProjection.DOOM_MCP_PROJECTION_SERVICE, (0, _agimon_ai_po_core_mcpProjection.createDoomMcpProjectionService)({
|
|
82
|
+
sessionId: execution.sessionId,
|
|
83
|
+
generation: `${generation}:mcp-projection`,
|
|
84
|
+
projection
|
|
85
|
+
}));
|
|
86
|
+
Promise.allSettled([telemetry.recordEvent("doom_config.context_bound", {
|
|
87
|
+
"config.major_mode": config.harness.majorMode,
|
|
88
|
+
"config.domain_count": config.harness.domains.length,
|
|
89
|
+
"config.has_profile": config.harness.profile !== void 0,
|
|
90
|
+
"config.requires_relaunch": config.requiresRelaunch
|
|
91
|
+
})]);
|
|
92
|
+
return { value: void 0 };
|
|
93
|
+
}).wait();
|
|
94
|
+
if (lifetime?.aborted) cancel();
|
|
95
|
+
Promise.allSettled([initializationTask]);
|
|
96
|
+
return { ready: initializationTask };
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/extensions/workspaces/sessions/(backend)/root.server.ts
|
|
100
|
+
var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(({ agent, signal }) => {
|
|
101
|
+
if (!agent) throw new Error("Config initialization requires the native session host.");
|
|
102
|
+
let runtime;
|
|
103
|
+
return {
|
|
104
|
+
value: void 0,
|
|
105
|
+
services: [(context) => {
|
|
106
|
+
runtime = createConfigRuntime(context, agent.context, signal);
|
|
107
|
+
}],
|
|
108
|
+
async onStart() {
|
|
109
|
+
if (!runtime) throw new Error("Native config initializer was not installed.");
|
|
110
|
+
await Promise.allSettled([runtime.ready]);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/constants/settings.ts
|
|
116
|
+
const SELECTION_KEYS = {
|
|
117
|
+
majorMode: ["selection", "majorMode"],
|
|
118
|
+
domains: ["selection", "domains"],
|
|
119
|
+
profile: ["selection", "profile"]
|
|
120
|
+
};
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/types/apiRoutes.ts
|
|
123
|
+
/**
|
|
124
|
+
* This package's routes, as data.
|
|
125
|
+
*
|
|
126
|
+
* No scope and no base path. The build reads both off
|
|
127
|
+
* `src/extensions/(backend)/api/settings/`, so the mount is stated once, by the
|
|
128
|
+
* folder that creates it. `settings` is the host's own API: it answers at
|
|
129
|
+
* `/api/settings` and `/api/workspaces/<id>/settings`, beside `/plugins` rather
|
|
130
|
+
* than under it, and the client knows that from the base path alone.
|
|
131
|
+
*
|
|
132
|
+
* This is the one file the mount's dispatcher and, once the client crosses the
|
|
133
|
+
* package boundary, the cockpit both read, so a path cannot move on one side
|
|
134
|
+
* alone.
|
|
135
|
+
*/
|
|
136
|
+
var apiRoutes_default = (0, _agimon_ai_po_core_web.defineApiRoutes)({
|
|
137
|
+
/** The mount itself: the selected keys and the hash of each file they came from. */
|
|
138
|
+
config: {
|
|
139
|
+
method: "GET",
|
|
140
|
+
path: "/",
|
|
141
|
+
/** Repeatable. The page also sends `repoRoot`, which the mount ignores: it serves one repository. */
|
|
142
|
+
query: ["key"],
|
|
143
|
+
response: (0, _agimon_ai_po_core_web.apiResponse)()
|
|
144
|
+
},
|
|
145
|
+
value: {
|
|
146
|
+
method: "PUT",
|
|
147
|
+
path: "/value",
|
|
148
|
+
response: (0, _agimon_ai_po_core_web.apiResponse)()
|
|
149
|
+
},
|
|
150
|
+
repositories: {
|
|
151
|
+
method: "GET",
|
|
152
|
+
path: "/repositories",
|
|
153
|
+
response: (0, _agimon_ai_po_core_web.apiResponse)()
|
|
154
|
+
},
|
|
155
|
+
/** The workspace this mount was bound to; a global mount has none and answers 404. */
|
|
156
|
+
repository: {
|
|
157
|
+
method: "GET",
|
|
158
|
+
path: "/repository",
|
|
159
|
+
response: (0, _agimon_ai_po_core_web.apiResponse)()
|
|
160
|
+
},
|
|
161
|
+
selection: {
|
|
162
|
+
method: "PUT",
|
|
163
|
+
path: "/repository/selection",
|
|
164
|
+
response: (0, _agimon_ai_po_core_web.apiResponse)()
|
|
165
|
+
},
|
|
166
|
+
/** Pi's own image limits, served by the global mount only. */
|
|
167
|
+
images: {
|
|
168
|
+
method: "GET",
|
|
169
|
+
path: "/images",
|
|
170
|
+
response: (0, _agimon_ai_po_core_web.apiResponse)()
|
|
171
|
+
},
|
|
172
|
+
/** The same path as `images`; the method is the whole of the difference. */
|
|
173
|
+
saveImages: {
|
|
174
|
+
method: "PUT",
|
|
175
|
+
path: "/images",
|
|
176
|
+
response: (0, _agimon_ai_po_core_web.apiResponse)()
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/services/settings/index.ts
|
|
181
|
+
function isRecord(value) {
|
|
182
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
183
|
+
}
|
|
184
|
+
function describe(error) {
|
|
185
|
+
return error instanceof Error ? error.message : String(error);
|
|
186
|
+
}
|
|
187
|
+
/** The display form of a config value; a record has no single-line form, so it has none. */
|
|
188
|
+
function displayValue(value) {
|
|
189
|
+
if (typeof value === "string") return value;
|
|
190
|
+
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
191
|
+
if (Array.isArray(value)) return value.map((entry) => displayValue(entry) ?? "").join(", ");
|
|
192
|
+
}
|
|
193
|
+
function pathFor(scope, repoRoot, homeDirectory) {
|
|
194
|
+
return scope === "repository" ? require_config.repositoryDoomConfigPath(repoRoot) : require_config.globalDoomConfigPath(homeDirectory);
|
|
195
|
+
}
|
|
196
|
+
function parseWrite(body) {
|
|
197
|
+
if (!isRecord(body)) return void 0;
|
|
198
|
+
const { repoRoot, scope, expectedHash } = body;
|
|
199
|
+
if (typeof repoRoot !== "string" || scope !== "global" && scope !== "repository") return void 0;
|
|
200
|
+
if (scope === "repository" && repoRoot === "") return void 0;
|
|
201
|
+
if (typeof expectedHash !== "string") return void 0;
|
|
202
|
+
const edits = body.edits === void 0 ? [{
|
|
203
|
+
keyPath: body.keyPath,
|
|
204
|
+
value: body.value
|
|
205
|
+
}] : body.edits;
|
|
206
|
+
if (!Array.isArray(edits) || edits.length === 0 || edits.length > 100) return void 0;
|
|
207
|
+
const validated = [];
|
|
208
|
+
for (const edit of edits) {
|
|
209
|
+
if (!isRecord(edit)) return void 0;
|
|
210
|
+
const { keyPath, value } = edit;
|
|
211
|
+
if (!Array.isArray(keyPath) || keyPath.length === 0 || keyPath.some((part) => typeof part !== "string")) return void 0;
|
|
212
|
+
if (value !== null && typeof value !== "string" && (typeof value !== "number" || !Number.isFinite(value))) return void 0;
|
|
213
|
+
validated.push({
|
|
214
|
+
keyPath,
|
|
215
|
+
value
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
repoRoot,
|
|
220
|
+
scope,
|
|
221
|
+
expectedHash,
|
|
222
|
+
edits: validated
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function configuredSelectionValue(layers, key, effective) {
|
|
226
|
+
const origin = layers.originOf(SELECTION_KEYS[key]);
|
|
227
|
+
return {
|
|
228
|
+
...effective === void 0 ? {} : { effective },
|
|
229
|
+
...origin === "repository" && effective !== void 0 ? { repository: effective } : {},
|
|
230
|
+
origin
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function repositorySettingsView(repository, homeDirectory, environment = process.env) {
|
|
234
|
+
const repoRoot = repository.path;
|
|
235
|
+
const layers = require_config.loadDoomConfigLayers(repoRoot, homeDirectory, environment);
|
|
236
|
+
const modes = require_majorModes.loadMajorModesConfig(repoRoot, homeDirectory, environment);
|
|
237
|
+
const domains = require_domains.loadDomains(repoRoot, homeDirectory);
|
|
238
|
+
const profiles = require_profiles.loadProfiles(repoRoot, homeDirectory);
|
|
239
|
+
const configured = layers.effective.selection;
|
|
240
|
+
const effectiveMajorMode = configured?.majorMode ?? modes.defaultMajorMode;
|
|
241
|
+
const effectiveDomains = configured?.domains ?? require_domains.defaultDomainsForMajorMode(effectiveMajorMode, {}, domains.defaultDomains);
|
|
242
|
+
const majorModes = Object.entries(modes.majorMode).map(([name, definition]) => ({
|
|
243
|
+
name,
|
|
244
|
+
description: definition.description,
|
|
245
|
+
layers: definition.layers
|
|
246
|
+
})).sort((left, right) => left.name.localeCompare(right.name));
|
|
247
|
+
const domainOptions = [...Object.entries(domains.domains).map(([name, definition]) => ({
|
|
248
|
+
name,
|
|
249
|
+
...definition.description ? { description: definition.description } : {}
|
|
250
|
+
})), ...Object.entries(domains.aliases).map(([name, expandsTo]) => ({
|
|
251
|
+
name,
|
|
252
|
+
description: `Alias for ${expandsTo.join(", ") || "no domains"}.`,
|
|
253
|
+
expandsTo
|
|
254
|
+
}))].sort((left, right) => left.name.localeCompare(right.name));
|
|
255
|
+
return {
|
|
256
|
+
repository,
|
|
257
|
+
hash: layers.repositoryFile.hash,
|
|
258
|
+
catalogs: {
|
|
259
|
+
majorModes,
|
|
260
|
+
domains: domainOptions,
|
|
261
|
+
profiles: profiles.map((profile) => ({ name: profile.name }))
|
|
262
|
+
},
|
|
263
|
+
selection: {
|
|
264
|
+
majorMode: configuredSelectionValue(layers, "majorMode", effectiveMajorMode),
|
|
265
|
+
domains: configuredSelectionValue(layers, "domains", effectiveDomains),
|
|
266
|
+
profile: configuredSelectionValue(layers, "profile", configured?.profile)
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function parseSelectionChanges(value) {
|
|
271
|
+
if (!isRecord(value)) return void 0;
|
|
272
|
+
const keys = Object.keys(value);
|
|
273
|
+
if (keys.length === 0 || keys.some((key) => !Object.hasOwn(SELECTION_KEYS, key))) return void 0;
|
|
274
|
+
const changes = {};
|
|
275
|
+
if (Object.hasOwn(value, "majorMode")) {
|
|
276
|
+
if (value.majorMode !== null && (typeof value.majorMode !== "string" || value.majorMode.trim() === "")) return void 0;
|
|
277
|
+
changes.majorMode = value.majorMode === null ? null : value.majorMode.trim();
|
|
278
|
+
}
|
|
279
|
+
if (Object.hasOwn(value, "domains")) {
|
|
280
|
+
if (value.domains !== null && (!Array.isArray(value.domains) || value.domains.some((name) => typeof name !== "string" || name.trim() === ""))) return;
|
|
281
|
+
changes.domains = value.domains === null ? null : [...new Set(value.domains.map((name) => name.trim()))];
|
|
282
|
+
}
|
|
283
|
+
if (Object.hasOwn(value, "profile")) {
|
|
284
|
+
if (value.profile !== null && (typeof value.profile !== "string" || value.profile.trim() === "")) return void 0;
|
|
285
|
+
changes.profile = value.profile === null ? null : value.profile.trim();
|
|
286
|
+
}
|
|
287
|
+
return changes;
|
|
288
|
+
}
|
|
289
|
+
function parseSelectionWrite(value) {
|
|
290
|
+
if (!isRecord(value) || typeof value.repositoryId !== "string" || typeof value.expectedHash !== "string") return void 0;
|
|
291
|
+
const changes = parseSelectionChanges(value.changes);
|
|
292
|
+
return changes === void 0 ? void 0 : {
|
|
293
|
+
repositoryId: value.repositoryId,
|
|
294
|
+
expectedHash: value.expectedHash,
|
|
295
|
+
changes
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
function validateSelectionChanges(view, changes) {
|
|
299
|
+
if (changes.majorMode !== void 0 && changes.majorMode !== null) {
|
|
300
|
+
if (!view.catalogs.majorModes.some((mode) => mode.name === changes.majorMode)) return `Unknown major mode '${changes.majorMode}'.`;
|
|
301
|
+
}
|
|
302
|
+
if (changes.domains !== void 0 && changes.domains !== null) {
|
|
303
|
+
const known = new Set(view.catalogs.domains.map((domain) => domain.name));
|
|
304
|
+
const unknown = changes.domains.find((domain) => !known.has(domain));
|
|
305
|
+
if (unknown !== void 0) return `Unknown domain '${unknown}'.`;
|
|
306
|
+
}
|
|
307
|
+
if (changes.profile !== void 0 && changes.profile !== null) {
|
|
308
|
+
if (!view.catalogs.profiles.some((profile) => profile.name === changes.profile)) return `Unknown profile '${changes.profile}'.`;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function selectionEdits(changes) {
|
|
312
|
+
return Object.entries(changes).map(([key, value]) => ({
|
|
313
|
+
keyPath: SELECTION_KEYS[key],
|
|
314
|
+
...value === null ? {} : { value }
|
|
315
|
+
}));
|
|
316
|
+
}
|
|
317
|
+
function configView(context, keys) {
|
|
318
|
+
const root = context.scope === "workspace" ? context.workspaceRoot : void 0;
|
|
319
|
+
const layers = require_config.loadDoomConfigLayers(root, context.homeDirectory, context.environment);
|
|
320
|
+
const values = {};
|
|
321
|
+
for (const key of keys) {
|
|
322
|
+
const keyPath = key.split(".");
|
|
323
|
+
const value = displayValue(layers.valueAt(keyPath));
|
|
324
|
+
values[key] = {
|
|
325
|
+
...value === void 0 ? {} : { value },
|
|
326
|
+
origin: layers.originOf(keyPath),
|
|
327
|
+
scope: require_configPolicy.configScopeOf(keyPath)
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
repoRoot: root ?? "",
|
|
332
|
+
values,
|
|
333
|
+
hashes: {
|
|
334
|
+
global: layers.globalFile.hash,
|
|
335
|
+
repository: layers.repositoryFile.hash
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
//#endregion
|
|
340
|
+
//#region src/services/settingsApi/index.ts
|
|
341
|
+
/** Config handlers are bound to their mount. Request paths cannot choose a different repository. */
|
|
342
|
+
const settingsApi = {
|
|
343
|
+
basePath: "settings",
|
|
344
|
+
start(context) {
|
|
345
|
+
if (context.scope === "session") throw new Error("Configuration settings require a global or workspace mount.");
|
|
346
|
+
const { homeDirectory } = context;
|
|
347
|
+
const repository = () => context.scope === "workspace" && context.workspaceId && context.workspaceRoot ? {
|
|
348
|
+
id: context.workspaceId,
|
|
349
|
+
name: context.workspaceRoot.split("/").at(-1) ?? context.workspaceId,
|
|
350
|
+
path: context.workspaceRoot,
|
|
351
|
+
active: context.repositories?.().find((entry) => entry.id === context.workspaceId)?.active ?? false
|
|
352
|
+
} : void 0;
|
|
353
|
+
const imageView = () => ({
|
|
354
|
+
...require_piConfig.loadPiImageSettings(homeDirectory),
|
|
355
|
+
minDimension: 256,
|
|
356
|
+
maxAllowedDimension: require_piConfig.DEFAULT_IMAGE_MAX_DIMENSION
|
|
357
|
+
});
|
|
358
|
+
let writes = Promise.resolve();
|
|
359
|
+
let closed = false;
|
|
360
|
+
const dispatch = async (request) => {
|
|
361
|
+
if (closed) return Response.json({ error: "Configuration mount is closed." }, { status: 503 });
|
|
362
|
+
const url = new URL(request.url);
|
|
363
|
+
/**
|
|
364
|
+
* Whether this request addresses one declared route.
|
|
365
|
+
*
|
|
366
|
+
* The table owns both halves of the comparison, so the path this mount
|
|
367
|
+
* answers and the path the client asks for cannot drift apart: there is
|
|
368
|
+
* one spelling of each, in `src/types/apiRoutes`.
|
|
369
|
+
*/
|
|
370
|
+
const addresses = (route) => url.pathname === route.path && request.method === route.method;
|
|
371
|
+
const currentRepository = repository();
|
|
372
|
+
if (addresses(apiRoutes_default.config)) return Response.json(configView(context, url.searchParams.getAll("key")));
|
|
373
|
+
if (addresses(apiRoutes_default.repositories)) return Response.json({ repositories: context.repositories?.() ?? [] });
|
|
374
|
+
if (addresses(apiRoutes_default.repository)) return currentRepository ? Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment)) : Response.json({ error: "Choose a workspace." }, { status: 404 });
|
|
375
|
+
if (url.pathname === apiRoutes_default.images.path && context.scope === "global") {
|
|
376
|
+
if (request.method === apiRoutes_default.images.method) return Response.json(imageView());
|
|
377
|
+
if (request.method === apiRoutes_default.saveImages.method) {
|
|
378
|
+
const body = await request.json();
|
|
379
|
+
if (!isRecord(body) || body.autoResize !== void 0 && typeof body.autoResize !== "boolean" || body.maxDimension !== void 0 && (typeof body.maxDimension !== "number" || !Number.isFinite(body.maxDimension))) return Response.json({ error: "Invalid image settings." }, { status: 400 });
|
|
380
|
+
require_piConfig.savePiImageSettings({
|
|
381
|
+
...typeof body.autoResize === "boolean" ? { autoResize: body.autoResize } : {},
|
|
382
|
+
...typeof body.maxDimension === "number" ? { maxDimension: body.maxDimension } : {}
|
|
383
|
+
}, homeDirectory);
|
|
384
|
+
context.configurationChanged?.();
|
|
385
|
+
return Response.json(imageView());
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (addresses(apiRoutes_default.selection)) {
|
|
389
|
+
const body = parseSelectionWrite(await request.json());
|
|
390
|
+
if (!body) return Response.json({ error: "A selection write needs typed changes and a file hash." }, { status: 400 });
|
|
391
|
+
if (!currentRepository || body.repositoryId !== currentRepository.id) return Response.json({ error: "Workspace not found in this mount." }, { status: 404 });
|
|
392
|
+
const before = repositorySettingsView(currentRepository, homeDirectory, context.environment);
|
|
393
|
+
if (before.hash !== body.expectedHash) return Response.json({
|
|
394
|
+
error: "The repository config changed since it was read.",
|
|
395
|
+
hash: before.hash
|
|
396
|
+
}, { status: 409 });
|
|
397
|
+
const invalid = validateSelectionChanges(before, body.changes);
|
|
398
|
+
if (invalid) return Response.json({ error: invalid }, { status: 422 });
|
|
399
|
+
await require_configWriter.writeDoomConfigValues(require_config.repositoryDoomConfigPath(currentRepository.path), selectionEdits(body.changes), { scope: "repository" });
|
|
400
|
+
context.configurationChanged?.();
|
|
401
|
+
return Response.json(repositorySettingsView(currentRepository, homeDirectory, context.environment));
|
|
402
|
+
}
|
|
403
|
+
if (addresses(apiRoutes_default.value)) {
|
|
404
|
+
const body = parseWrite(await request.json());
|
|
405
|
+
if (!body) return Response.json({ error: "A save requires a scope, key, value and file hash." }, { status: 400 });
|
|
406
|
+
const scope = context.scope === "global" ? "global" : "repository";
|
|
407
|
+
if (body.scope !== scope || scope === "repository" && body.repoRoot !== currentRepository?.path) return Response.json({ error: "The write targets a different mount." }, { status: 403 });
|
|
408
|
+
if (body.edits.some((edit) => {
|
|
409
|
+
const allowed = require_configPolicy.configScopeOf(edit.keyPath);
|
|
410
|
+
return allowed !== "both" && allowed !== scope;
|
|
411
|
+
})) return Response.json({ error: "This key cannot be set at this scope." }, { status: 409 });
|
|
412
|
+
const before = configView(context, []);
|
|
413
|
+
if (before.hashes[scope] !== body.expectedHash) return Response.json({
|
|
414
|
+
error: "The config changed since it was read.",
|
|
415
|
+
hash: before.hashes[scope]
|
|
416
|
+
}, { status: 409 });
|
|
417
|
+
const target = pathFor(scope, currentRepository?.path ?? "", homeDirectory);
|
|
418
|
+
await require_configWriter.writeDoomConfigValues(target, body.edits.map(({ keyPath, value }) => ({
|
|
419
|
+
keyPath,
|
|
420
|
+
...value === null ? {} : { value }
|
|
421
|
+
})), { scope });
|
|
422
|
+
context.configurationChanged?.();
|
|
423
|
+
return Response.json(configView(context, body.edits.map((edit) => edit.keyPath.join("."))));
|
|
424
|
+
}
|
|
425
|
+
return Response.json({ error: "Configuration route not found." }, { status: 404 });
|
|
426
|
+
};
|
|
427
|
+
const guarded = async (request) => {
|
|
428
|
+
try {
|
|
429
|
+
return await dispatch(request);
|
|
430
|
+
} catch (error) {
|
|
431
|
+
return Response.json({ error: describe(error) }, { status: error instanceof SyntaxError ? 400 : 422 });
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
return {
|
|
435
|
+
fetch(request) {
|
|
436
|
+
if (request.method === "GET" || request.method === "HEAD") return guarded(request);
|
|
437
|
+
const result = writes.then(() => guarded(request));
|
|
438
|
+
writes = result.catch(() => void 0);
|
|
439
|
+
return result;
|
|
440
|
+
},
|
|
441
|
+
close() {
|
|
442
|
+
closed = true;
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
//#endregion
|
|
448
|
+
//#region src/extensions/(backend)/api/settings/route.server.ts
|
|
449
|
+
var route_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoutedContribution)(({ host }) => host.scope === "session" ? void 0 : settingsApi, { cardinality: "optional" });
|
|
450
|
+
//#endregion
|
|
451
|
+
//#region src/extensions/workspaces/sessions/(backend)/resource/po-author-config.server.ts
|
|
452
|
+
var po_author_config_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
|
|
453
|
+
...CONFIG_HELP_SKILL,
|
|
454
|
+
when: {
|
|
455
|
+
state: { "minor-mode": "help" },
|
|
456
|
+
attribution: {
|
|
457
|
+
kind: "minor",
|
|
458
|
+
mode: "help"
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
kind: "skill",
|
|
462
|
+
path: (0, _agimon_ai_po_core_serverFacet.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-config/SKILL.md"),
|
|
463
|
+
read: () => (0, _agimon_ai_po_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-config/SKILL.md")
|
|
464
|
+
});
|
|
465
|
+
//#endregion
|
|
466
|
+
//#region generated/server.ts
|
|
467
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
468
|
+
/* v8 ignore next -- generated normalization branch */
|
|
469
|
+
const defined = (values) => values.filter((value) => value !== void 0);
|
|
470
|
+
const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
|
|
471
|
+
name: "@agimon-ai/po-config",
|
|
472
|
+
providerOverrides: (0, _agimon_ai_po_core_serverFacet.composeServerProviderOverrides)(root_server_default),
|
|
473
|
+
global: (context) => ({ get api() {
|
|
474
|
+
return defined([at(route_server_default, context)]);
|
|
475
|
+
} }),
|
|
476
|
+
workspace: (context) => ({ get api() {
|
|
477
|
+
return defined([at(route_server_default, context)]);
|
|
478
|
+
} }),
|
|
479
|
+
session: async (context) => {
|
|
480
|
+
const scopeSession = await root_server_default(context);
|
|
481
|
+
const contextSession = {
|
|
482
|
+
...context,
|
|
483
|
+
root: scopeSession.value
|
|
484
|
+
};
|
|
485
|
+
return {
|
|
486
|
+
...(0, _agimon_ai_po_core_extensionFile.composeRootHooks)(scopeSession),
|
|
487
|
+
get api() {
|
|
488
|
+
return defined([at(route_server_default, context)]);
|
|
489
|
+
},
|
|
490
|
+
get resources() {
|
|
491
|
+
return [at(po_author_config_server_default, contextSession)];
|
|
492
|
+
},
|
|
493
|
+
services: [...scopeSession.services ?? []],
|
|
494
|
+
get activities() {
|
|
495
|
+
return [...scopeSession.activities ?? []];
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
//#endregion
|
|
501
|
+
exports.default = facet;
|
|
502
|
+
exports.facet = facet;
|
|
503
|
+
|
|
504
|
+
//# sourceMappingURL=server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["createDoomReadinessCoordinator","readDoomNotificationService","DOOM_READINESS_SERVICE","createDoomTelemetry","createNativeDoomConfigContext","isDoomMcpProjection","createDisabledDoomMcpProjection","DOOM_MCP_PROJECTION_SERVICE","createDoomMcpProjectionService","defineRoot","defineApiRoutes","apiResponse","repositoryDoomConfigPath","globalDoomConfigPath","loadDoomConfigLayers","loadMajorModesConfig","loadDomains","loadProfiles","defaultDomainsForMajorMode","configScopeOf","loadPiImageSettings","DEFAULT_IMAGE_MAX_DIMENSION","routes","writeDoomConfigValues","repositoryDoomConfigPath","configScopeOf","defineRoutedContribution","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 doom/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 { DoomHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport {\n createDisabledDoomMcpProjection,\n createDoomMcpProjectionService,\n DOOM_MCP_PROJECTION_SERVICE,\n isDoomMcpProjection,\n} from '@agimon-ai/po-core/mcpProjection';\nimport { readDoomNotificationService } from '@agimon-ai/po-core/notification';\nimport {\n createDoomReadinessCoordinator,\n DOOM_READINESS_SERVICE,\n type DoomReadinessNotification,\n} from '@agimon-ai/po-core/readiness';\nimport { createDoomTelemetry } from '@agimon-ai/po-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { PACKAGE_SOURCE } from '../../constants/config';\nimport { createNativeDoomConfigContext, provideDoomConfigContext } 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: DoomHeadlessExecutionContext,\n lifetime?: AbortSignal,\n): ConfigRuntime {\n const generation = `${execution.sessionId}:${crypto.randomUUID()}`;\n let active = true;\n const readiness = createDoomReadinessCoordinator({\n notify(notification: DoomReadinessNotification) {\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 = readDoomNotificationService(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(DOOM_READINESS_SERVICE, readiness);\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-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 createNativeDoomConfigContext(execution);\n signal.throwIfAborted();\n if (!active) throw new Error(`Doom Config initialization was superseded: ${generation}.`);\n provideDoomConfigContext(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 isDoomMcpProjection(config.harness.mcpProjection) &&\n config.harness.mcpProjection.repoRoot === repoRoot\n ? config.harness.mcpProjection\n : createDisabledDoomMcpProjection({ repoRoot, stagingDirectory });\n cordis.provide(\n DOOM_MCP_PROJECTION_SERVICE,\n createDoomMcpProjectionService({\n sessionId: execution.sessionId,\n generation: `${generation}:mcp-projection`,\n projection,\n }),\n );\n void Promise.allSettled([\n telemetry.recordEvent('doom_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 type { DoomServerPluginContext } 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, signal }: DoomServerPluginContext) => {\n if (!agent) throw new Error('Config initialization requires the native session host.');\n let runtime: ConfigRuntime | undefined;\n return {\n value: undefined,\n services: [\n (context: Context) => {\n runtime = createConfigRuntime(context, agent.context, 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 { DoomApiContext } 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 { globalDoomConfigPath, loadDoomConfigLayers, repositoryDoomConfigPath } 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' ? repositoryDoomConfigPath(repoRoot) : globalDoomConfigPath(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 loadDoomConfigLayers>,\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 = loadDoomConfigLayers(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: DoomApiContext, keys: readonly string[]): SettingsConfigView {\n const root = context.scope === 'workspace' ? context.workspaceRoot : undefined;\n const layers = loadDoomConfigLayers(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 { DoomApi } from '@agimon-ai/po-core/packageApi';\n\nimport { KEY_QUERY_PARAM, KEY_SEPARATOR } from '../../constants/settings';\nimport routes from '../../types/apiRoutes';\nimport type { SettingsRepository } from '../../types/settings';\nimport { repositoryDoomConfigPath } from '../config';\nimport { configScopeOf } from '../configPolicy';\nimport { writeDoomConfigValues } from '../configWriter';\nimport { DEFAULT_IMAGE_MAX_DIMENSION, MIN_IMAGE_MAX_DIMENSION } from '../imageSettings';\nimport { loadPiImageSettings, savePiImageSettings } 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/** Config handlers are bound to their mount. Request paths cannot choose a different repository. */\nexport const settingsApi: DoomApi = {\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 imageView = () => ({\n ...loadPiImageSettings(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(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 savePiImageSettings(\n {\n ...(typeof body.autoResize === 'boolean' ? { autoResize: body.autoResize } : {}),\n ...(typeof body.maxDimension === 'number' ? { maxDimension: body.maxDimension } : {}),\n },\n homeDirectory,\n );\n context.configurationChanged?.();\n return Response.json(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 writeDoomConfigValues(repositoryDoomConfigPath(currentRepository.path), selectionEdits(body.changes), {\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 writeDoomConfigValues(\n target,\n body.edits.map(({ keyPath, value }) => ({ keyPath, ...(value === null ? {} : { value }) })),\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 type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { settingsApi } from '../../../../services/settingsApi';\n\nexport default defineRoutedContribution(\n ({ host }: DoomServerPluginContext) => (host.scope === 'session' ? undefined : settingsApi),\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 DoomServerSessionPlugin } 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(): DoomServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n }),\n workspace: (context) => ({\n get api(): DoomServerSessionPlugin['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(): DoomServerSessionPlugin['api'] { return defined([at(apiRoute, context)]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourcePoAuthorConfig, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAgBa,gDAAK"}
|